Документация проекта

Проект «К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 через LOOKUP({shift_ref}, …)

stop

312

1714

Напоминание о смене за день

schedule 0 10 * * * Europe/Moscow, each_row: shift_date=$tomorrow И attendance=записан

send_message email (recipients: column email, dedupe 720м)

stop

314

1709 Движения

Движение проведено → квитанция и благодарность

status_transition → posted (runOnAutomation)

generate_document (шаблон 1715 → колонка receipts, onExisting skip) + send_message email (column donor_email, dedupe 60м)

stop

315

1710 Доноры

Квартальный отчёт recurring-донору

schedule 0 9 1 1,4,7,10 *, each_row: next_report_date≤$today И report_consent И recurring

set_fields (DATEADD next_report_date +3 мес; {{TODAY}} в report_sent_at) + generate_document (шаблон 1716 → report_docs) + send_message email (dedupe 720м)

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).

Открытые дефекты

1.

generate_document: токены резолвятся в имени, но НЕ в теле — подтверждено фактически на documentId 1723 (см. выше). Квитанции уходят донору с литеральными {{col.*}} в тексте.

2.

Публичный счётчик сборов включает черновики. Rollup collected в 1708 = Σincoming по ВСЕМ движениям без фильтра по статусу (rollup фильтра не поддерживает). Факт из API публичной таблицы: Приют «Тёплый дом» collected=9400 при posted-only 7200; Продуктовые наборы 5700 против 4700 (итого +3200 ₽ завышения). Частичный обход: приватный дашборд 1720 фильтрует status=posted на уровне панелей; для публичного контура нужно отдельное поле/таблица-витрина.

3.

Email-канал не настроен (channels: []) → send_message в правилах 312/314/315 падает (§62.8); благодарность/напоминания/отчёты не доставляются до конфигурации канала администратором.

4.

Таблица 1706 «Реестр (служ.)» — мёртвый остов (0 строк), кандидат в архив. Закрыто 05.09.2026 — архивирована (см. «Чистка (2026-09-05)»).

5.

Расхождение с журналом сборки: факт 17 активных dataTable в дереве + 5 архивных (видны только при includeArchived:true), 71 строка (не 69), 4 дашборда (не 3). Журнальная сводка «11 активных» не бьётся с фактом.

6.

Счётчик-метрик в дашборде 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) не изменился — ни одна публично задействованная таблица не архивирована.