Документация проекта
Проект «К6 Благотворительный фонд» — документация
Slug: space-k6 · Project ID: 48 · Имя на платформе: k6-oc
Настройки: базовая валюта RUB, таймзона Europe/Moscow, isPublished: true, channels: []
Источник данных: сбор живьём через codedocs MCP (scripts/mcp.py), 05.09.2026
Ожидалось из журнала сборки: 26 узлов, 11 активных таблиц (+5 архивных)/69 строк, 5 правил, 2 формы, 3 дашборда. Факт: 26 активных узлов ✓ (17 dataTable + 4 дашборда + 3 документа + 2 формы); 5 архивных таблиц найдены только с doc_tree({"includeArchived":true}) (1696 Template, 1698 Availability, 1699 Time off, 1700 Coverage, 1701 Swap) — в дереве без флага не видны; 17 активных таблиц вместо «11» и 71 строка вместо 69; правил 5 ✓, форм 2 ✓, дашбордов 4 (лишний приватный «Финансы фонда» 1720) — расхождения в «Открытых дефектах».
Дерево объектов (doc_tree, 26 узлов)
ID | Тип | Имя | Slug | Статус |
|---|---|---|---|---|
1692 | dataTable | Сотрудники фонда | directory-aux | — |
1693 | dataTable | Точки | location | — |
1694 | dataTable | Навыки | skill | — |
1695 | dataTable | Навыки сотрудника | person-skill | — |
1697 | dataTable | Смены | schedule | isPublished |
1702 | dataTable | Счета (юрлицам) | invoice | — |
1703 | dataTable | Строки счёта | invoice-line | — |
1704 | dataTable | Платежи по счетам | payment | — |
1705 | dataTable | Кредит-ноты | credit-note | — |
1706 | dataTable | Реестр (служ.) | ledger | — (0 строк, служебный остов) |
1707 | dashboard | Дебиторка | debitorka | приватный |
1708 | dataTable | Назначения | naznacheniya | isPublished |
1709 | dataTable | Движения | dvizheniya | — |
1710 | dataTable | Доноры | donory | — |
1711 | dataTable | Волонтёры | volontyory | — |
1712 | dataTable | Быстрый ввод | bystryy-vvod | — |
1713 | dataTable | Параметры фонда | parametry-fonda | — |
1714 | dataTable | Записи на смены | zapisi-na-smeny | — |
1715 | document | Квитанция (шаблон) | kvitantsiya-shablon | приватный |
1716 | document | Квартальный отчёт (шаблон) | kvartalnyy-otchyot-shablon | приватный |
1717 | form | Пожертвование | pozhertvovanie | публичная |
1718 | form | Запись на смену | zapis-na-smenu | публичная |
1719 | dashboard | Куда идут деньги | kuda-idut-dengi | публичный |
1720 | dashboard | Финансы фонда | finansy-fonda | приватный |
1721 | dashboard | Волонтёрские смены | volontyorskie-smeny | приватный |
1740 | document | Страница фонда | stranitsa-fonda | isPublished |
Все узлы плоские (parentId=null).
Таблицы (17, всего 71 строка)
ID | Таблица | Строк | Колонки (id:type) |
|---|---|---|---|
1692 | Сотрудники фонда | 4 | person:person, first/middle/last_name:text, full_name:formula, manager:reference(self), role_note:select, email_text:email, phone_text:phone |
1693 | Точки | 0 | code/name/address:text, timezone:select, lat/lng:number, parent_location:reference, geofence:geofence |
1694 | Навыки | 0 | code/name:text, requires_certification/expiry_tracked/default_break_rule:select |
1695 | Навыки сотрудника | 0 | person:person, skill:reference, certified_at/expires_at:date, proficiency:select, status:status |
1697 | Смены | 6 | assigned_person:person, location/role_skill/shift_template:reference, start/end:datetime, break_minutes:number, status:status, rate_override:currency, notes:multilineText, shift_name:text, direction:select, venue:text, seats_needed:number, coordinator_name:text, coordinator_phone:phone, signed_up/attended:rollup |
1702 | Счета (юрлицам) | 3 | number:sequence, customer/company:reference, issue/due/period_start dates, tax_jurisdiction:text, total/amount_paid/amount_credited/tax_total:rollup, total_gross/outstanding/aging:formula, status:status, notes:multilineText, counterparty:text, cp_email:email, purpose_text:text, amount_rub:number |
1703 | Строки счёта | 0 | invoice/product/subscription:reference, description:text, qty:number, unit_price:currency, line_total/tax_rate/tax_amount/line_total_gross:formula, period_start/end:date, tax_category:text |
1704 | Платежи по счетам | 2 | invoice:reference, amount:currency, kind/method:select, effect:formula, paid_at:date, reference:text |
1705 | Кредит-ноты | 0 | number:sequence, invoice:reference, amount:currency, effect:formula, reason:select, issued_at:date, notes:multilineText |
1706 | Реестр (служ.) | 0 | parent_ref:reference, delta:number, effective_date:date, status:status, reverses:reference, note:multilineText |
1708 | Назначения | 5 | name:text, goal_amount:number, description:multilineText, collected:rollup(sum incoming backlink 1709), remaining:rollup(sum delta backlink 1709), pct:formula |
1709 | Движения | 21 | purpose_ref:reference, amount:number, movement_type:select, incoming:number, delta:number, donor_name/surname:text, donor_email:email, donor_phone:phone, donor_ref:reference, occurred_at:date, comment:multilineText, status:status(draft/posted/void), receipts:documents |
1710 | Доноры | 7 | display_name:text, donor_kind:select, email:email, phone:phone, report_consent/recurring:boolean, next_report_date/report_sent_at:date, total_donated:rollup, report_docs:documents |
1711 | Волонтёры | 6 | full_name:text, email:email, phone:phone, directions:multiSelect |
1712 | Быстрый ввод | 3 | entry_type:select, raw_text:multilineText, amount:number, donor_name:text, donor_email:email, purpose_text:text, processed:boolean |
1713 | Параметры фонда | 2 | key:text, value:number, value_text:text, description:multilineText |
1714 | Записи на смены | 12 | shift_ref:reference, full_name:text, email:email, phone:phone, shift_date:date, attendance:select, attended_flag:number, shift_label:text, venue_snap:text |
Балансовый движок (обход дедлока платформенного леджера)
Собственный реестр движений — таблица 1709 «Движения» с custom-статусами draft → posted/void (своя status-колонка, без locksRow) и дублирующими суммовыми колонками incoming и delta (подписанная дельта). Назначения (1708) считают collected=Σincoming и remaining=Σdelta через backlink-rollup по purpose_ref. Это полная замена модульного core_ledger (обход §44-deadlock / §38-locksRow, dev-report §62.9: row_transition_status батчем эмитит status_transition, правило-приёмник отработал 17/17 переходов). Таблица 1706 «Реестр (служ.)» — остов предыдущей итерации, 0 строк, не участвует.
Автоматизации (5 правил)
ID | Таблица | Правило | Триггер | Действия | onError |
|---|---|---|---|---|---|
311 | 1714 Записи на смены | Запись на смену: зеркало даты | event:create, shift_ref isNotEmpty | set_fields: shift_date/shift_label/venue_snap через | stop |
312 | 1714 | Напоминание о смене за день | schedule | send_message email (recipients: column | stop |
314 | 1709 Движения | Движение проведено → квитанция и благодарность | status_transition → | generate_document (шаблон 1715 → колонка | stop |
315 | 1710 Доноры | Квартальный отчёт recurring-донору | schedule | set_fields (DATEADD next_report_date +3 мес; {{TODAY}} в report_sent_at) + generate_document (шаблон 1716 → | stop |
316 | 1712 Быстрый ввод | Быстрый ввод → движение | event:create, entry_type=пожертвование И processed=false | create_row в 1709 (amount/incoming/delta, status=draft — явный, по §62.2) + set_fields processed=true | stop |
Все 5 enabled. Инцидент E100: дубль правила 313 создан при пересохранении без ruleId, удалён automation_delete — фактических дублей в дереве правил нет.
⚠️ send_message{channel:email} при channels: [] в настройках проекта не может доставляться (ошибка «No enabled email channel is configured for this project», §62.8). Правила живые; доставка — после включения канала администратором.
Формы (2)
ID | Форма | Целевая таблица | Поля (звёздочка — required) | Доступ |
|---|---|---|---|---|
1717 | Пожертвование | 1709 Движения | donor_surname*, donor_name*, purpose_ref*, amount*, donor_email, donor_phone, occurred_at, comment | submitAccess: everyone (публично) |
1718 | Запись на смену | 1714 Записи на смены | shift_ref*, full_name*, email*, phone, shift_date | submitAccess: everyone (публично) |
Дашборды (4)
ID | Дашборд | Панели | Публичность |
|---|---|---|---|
1707 | Дебиторка | metric «К оплате, всего»; bar «Просрочка»; horizontalBar «По статусу» (по 1702) | приватный |
1719 | Куда идут деньги | metric «Цели сборов, ₽»; bar «Цели по назначениям»; table «Назначения: цель/собрано/прогресс» (по 1708); слайсер «Назначение» | публичный |
1720 | Финансы фонда | metric «Поступления, ₽» (фильтр status=posted); metric «Расходы, ₽» (movement_type=расход целевой); pivot «По назначениям и типам»; слайсеры Статус/Период | приватный |
1721 | Волонтёрские смены | metric «Записей всего» (countNonEmpty); table «Смены и явка» (по 1697) | приватный |
Документы-шаблоны и фактический статус дефекта токенов
1715 «Квитанция (шаблон)», 1716 «Квартальный отчёт (шаблон)» — тела через doc_get_content ('markdown') проверены.
Имя документа: токены подставлены — Квитанция Иванова 2026-09-04 (из Квитанция {{col.donor_surname}} {{TODAY}}).
Тело: токены НЕ подставлены — литеральные {{col.donor_name}}, {{col.donor_surname}}, {{col.amount}}, {{col.occurred_at}}, {{col.purpose_ref}} (5 токенов, ровно как в шаблоне 1715).
Шаблон 1716 содержит в теле {{col.display_name}} и {{TODAY}} — тот же режим; сгенерированных экземпляров отчётов пока нет (next_report_date в будущем), дефект для тела 1716 унаследован по конструкции шаблона.
1740 «Страница фонда» — обычный документ, токенов не содержит.
Публичный контур (проверено curl + браузером, анонимно)
Адрес | Код |
|---|---|
/public/space-k6/kuda-idut-dengi | 200 |
/public/space-k6/pozhertvovanie | 200 |
/public/space-k6/stranitsa-fonda | 200 |
/public/space-k6/zapis-na-smenu | 200 |
/portal/space-k6 (корень портала) | 307 → /portal/space-k6/login ✓ |
API за страницами (измерено в браузере, повторено curl без авторизации):
GET /api/public/space-k6/dashboards/1719 — конфиг панелей, 200; POST …/query — агрегаты (Σgoal_amount=940 000), 200; POST …/table — строки Назначений, 200.
GET /api/public/space-k6/forms/1717|1718 — схема формы (columnId+required, без данных строк), 200.
GET /api/public/space-k6/documents/1740 — контент опубликованной страницы, 200.
Изоляция приватного: dashboards/1720 → 404; произвольные таблицы (tables/1710/rows) → 404. Приватные поля (email/phone доноров и волонтёров) анонимно не отдаются — наружу идут только колонки, связанные с панелями публичного дашборда (name, goal_amount, description, collected, pct).
Открытые дефекты
generate_document: токены резолвятся в имени, но НЕ в теле — подтверждено фактически на documentId 1723 (см. выше). Квитанции уходят донору с литеральными {{col.*}} в тексте.
Публичный счётчик сборов включает черновики. Rollup collected в 1708 = Σincoming по ВСЕМ движениям без фильтра по статусу (rollup фильтра не поддерживает). Факт из API публичной таблицы: Приют «Тёплый дом» collected=9400 при posted-only 7200; Продуктовые наборы 5700 против 4700 (итого +3200 ₽ завышения). Частичный обход: приватный дашборд 1720 фильтрует status=posted на уровне панелей; для публичного контура нужно отдельное поле/таблица-витрина.
Email-канал не настроен (channels: []) → send_message в правилах 312/314/315 падает (§62.8); благодарность/напоминания/отчёты не доставляются до конфигурации канала администратором.
Таблица 1706 «Реестр (служ.)» — мёртвый остов (0 строк), кандидат в архив. Закрыто 05.09.2026 — архивирована (см. «Чистка (2026-09-05)»).
Расхождение с журналом сборки: факт 17 активных dataTable в дереве + 5 архивных (видны только при includeArchived:true), 71 строка (не 69), 4 дашборда (не 3). Журнальная сводка «11 активных» не бьётся с фактом.
Счётчик-метрик в дашборде 1721 использует fn:countNonEmpty — для дашбордов это валидно (§62.1 ограничивает только rollup), наблюдение.
Грабли проекта (из dev-report §62 / error E100)
E100/§62.3: automation_set_meta без ruleId создаёт дубль правила (были 313/316); фикс — automation_delete + дисциплина get_meta→set_meta с ruleId. В текущем дереве дублей нет.
§62.2: create_row из действия не подставляет начальное состояние статус-колонки → в правиле 316 статус задан явно (draft) — так и сделано.
§62.4: automation_run (dry-run) НЕ side-effect-free для generate_document — не гонять preview на живой сборке.
§62.5: цепочка действий прерывается на первом failed; гейт-продвижение (set_fields next_report_date) в правиле 315 стоит ПЕРВЫМ действием — соответствует.
§62.6: LOOKUP({refCol},"col") в формуле действия работает (правило 311 использует).
§62.7: generate_document пишет только в колонки типа documents (receipts/report_docs — документы).
§62.10: data_table_set_meta columns:[...] создаёт начальный набор колонок пустой таблицы.
§45 (error.md): person-колонка не адресует внешних волонтёров/координаторов → в 1697/1714 контактные поля — text/email/phone-дубли.
§11/E50: нет автопоиска контрагента по email → donor_ref в 1709 заполняется вручную/интентом.
Публичный доступ
Документация опубликована на платформе: documentId 1755, «Документация проекта», isPublished=true.
publicUrl: https://smb.farhome.ru/public/space-k6/dokumentatsiya-proekta — curl 200 ✓ (publicUrlBlocked=null).
Проект опубликован: project_settings_get → isPublished=true (публикация не требовалась).
Тело на платформе прошло серверную нормализацию markdown (выравнивание разделителей таблиц |----| → | --- |); содержимое сохранено полностью (проверка head-совпадения + diff по характеру изменений).
Проверено doc_get_content (ключ 'markdown'), len=13406 (локально 13691 — разница только за счёт нормализации таблиц).
Обновлено 05.09.2026 (чистка): документ 1755 архивирован (известное ограничение: doc_upsert НЕ обновляет тело существующего документа), документация создана заново с этим же телом, isPublished=true, slug сохранён: dokumentatsiya-proekta (новый documentId зафиксирован в локальной документации и артефакте чистки).
Чистка (2026-09-05)
Указание владельца платформы: архивация всех пустых и неиспользуемых таблиц. Метод: живая проверка пустоты datatable_get_rows(limit:1) (без id-агрегации — грабля К5), затем проверка использования по всем векторам: схемы всех 17 таблиц (referenceDocumentId, rollup childDocumentId), меты форм 1717/1718 (targetDocumentId), меты 4 дашбордов (панели/слайсеры), automation_get_meta по documentId всех таблиц (привязки правил + documentId в действиях + LOOKUP-формулы), тела документов 1715/1716/1740 (embed/ссылок на таблицы нет), публичный контур (все таблицы приватны), агентов в проекте нет.
Архивировано 5 таблиц (doc_archive, каскада не было — archivedIds по одному id):
ID | Таблица | Строк | Причина |
|---|---|---|---|
1695 | Навыки сотрудника | 0 (пустая) | пусто + входящих ссылок/форм/правил/дашбордов нет |
1706 | Реестр (служ.) | 0 (пустая) | мёртвый остов предыдущей итерации (дефект №4 закрыт) |
1692 | Сотрудники фонда | 4 (архив с данными) | не используется ни одним объектом (person-колонки 1697/1695 адресуют платформу, не эту таблицу; self-ref manager — не входящее использование) |
1711 | Волонтёры | 6 (архив с данными) | не используется: форма 1718 пишет в 1714 text-копиями (§45), ссылок нет |
1713 | Параметры фонда | 2 (архив с данными) | не используется: LOOKUP в правилах только к 1697, rollups/дашборды/формы — мимо |
Сохранены (пустые, но используются):
ID | Таблица | Держатель |
|---|---|---|
1693 | Точки | reference-колонка 1697.location (живая таблица, 6 строк) |
1694 | Навыки | reference-колонки 1697.role_skill (и 1695.skill — уже в архиве) |
1703 | Строки счёта | rollup-и 1702 (total, tax_total) — рабочий контур счетов |
1705 | Кредит-ноты | rollup 1702.amount_credited — рабочий контур счетов |
Сохранены как использующиеся (не пустые): 1697 (дашборд 1721 + ссылки 1714 + rollups), 1702 (дашборд 1707 + ссылки 1703/1704/1705), 1704 (rollup 1702.amount_paid), 1708 (дашборд 1719 публичный + reference 1709.purpose_ref), 1709 (балансовый движок: форма 1717, правило 314, create_row правила 316, rollups 1708/1710, дашборд 1720), 1710 (правило 315, reference 1709.donor_ref), 1712 (правило 316), 1714 (форма 1718, правила 311/312, rollups 1697, дашборд 1721).
Счётчики узлов (doc_tree includeArchived): было 27 активных / 5 архивных таблиц → стало 22 активных / 10 архивных (12 dataTable + 4 дашборда + 4 документа + 2 формы; архивные таблицы: 1692, 1695, 1696, 1698, 1699, 1700, 1701, 1706, 1711, 1713). Формы, правила, дашборды, документы — не тронуты (кроме пересоздания документации 1755→1757). Соседние проекты не затронуты. Публичный контур (4 адреса + API) не изменился — ни одна публично задействованная таблица не архивирована.