Документация проекта
Проект «К5 СНТ/ТСЖ/ЖСК» — детальная документация
Slug: k5-hoa · Project id: 35 · Название на платформе: K5-hoa-oc
Дата снятия: 2026-09-05, прогон oc2 (задача doc-k5), канал scripts/mcp.py
Источник ожиданий: журнал сборки (dev-report §61, error.md E99) — сверка фактов живьём, доверие фактам платформы
Итог сверки с журналом сборки
Параметр | Ожидание | Факт живьём | Статус |
|---|---|---|---|
Узлы дерева | 28 | 28 | ✅ |
Таблицы | 14 (7 модульных + 7 своих) | 14 (7 + 7) | ✅ |
Строки суммарно | 87 | 84 | ⚠️ расхождение −3 (см. «Открытые вопросы» п.5) |
Правила | 5 | 5 (id 306–310), все | ⚠️ приёмка ожидала «4 активно / 5-е не подтверждено» — факт: подтверждены запусками все 5 |
Документы-шаблоны | 4 | 4 (1678–1681) | ✅ |
Формы | 5 | 5 (1685–1689), все опубликованы | ✅ |
Дашборды | 3 | 5 (1669, 1670, 1682, 1683, 1684) | ⚠️ расхождение +2 (модульные 1669/1670 не учтены журналом) |
Сквозной цикл | тик → счёт → платёж → авто-paid + квитанция + письмо | подтверждён частично: платёж a25c3a2c (уч. 45, 144 ₽, run 876 правила 310) → авто-статус | ✅ с оговоркой |
1. Дерево объектов (28 узлов)
id | Тип | Название | Slug | Публичный |
|---|---|---|---|---|
1669 | dashboard | Выездное обслуживание |
| — |
1670 | dashboard | Дебиторка |
| — |
1682 | dashboard | Финансы (публичный) |
| ✅ |
1683 | dashboard | Заявки |
| — |
1684 | dashboard | Кворум ОСС |
| — |
1662 | dataTable | Заявки на работы |
| — |
1663 | dataTable | Строки сметы |
| — |
1664 | dataTable | Счета |
| ✅ |
1665 | dataTable | Строки счёта |
| — |
1666 | dataTable | Платежи |
| — |
1667 | dataTable | Кредит-ноты |
| — |
1668 | dataTable | Собственники |
| — |
1671 | dataTable | Параметры СНТ |
| — |
1672 | dataTable | Подрядчики |
| — |
1673 | dataTable | Собрания |
| — |
1674 | dataTable | Показания |
| — |
1675 | dataTable | Уведомления об оплате |
| — |
1676 | dataTable | Запросы долга |
| — |
1677 | dataTable | Бюллетени |
| — |
1678 | document | Квитанция (шаблон) |
| — |
1679 | document | Протокол ОСС (шаблон) |
| — |
1680 | document | Страница СНТ |
| ✅ |
1681 | document | Уведомление о собрании |
| ✅ |
1685 | form | Запросить сумму долга |
| ✅ |
1686 | form | Подать заявку на работы |
| ✅ |
1687 | form | Отправить показания |
| ✅ |
1688 | form | Сообщить об оплате |
| ✅ |
1689 | form | Бюллетень общего собрания |
| ✅ |
2. Таблицы (14): схема + счётчики
Счётчики — серверная агрегация (
datatable_aggregate, countNonEmpty+countEmpty по первой колонке), без выгрузки строк. Первый счётчик в таблице строк = полное число строк (пустых ячеек в probe-колонке нет нигде).
id | Таблица | Модульная? | Колонок | Строк |
|---|---|---|---|---|
1662 | Заявки на работы | да | 19 | 6 |
1663 | Строки сметы | да | 7 | 14 |
1664 | Счета | да | 25 | 15 |
1665 | Строки счёта | да | 13 | 3 |
1666 | Платежи | да | 10 | 9 |
1667 | Кредит-ноты | да | 7 | 0 |
1668 | Собственники | да | 20 | 6 |
1671 | Параметры СНТ | нет | 3 | 6 |
1672 | Подрядчики | нет | 4 | 4 |
1673 | Собрания | нет | 8 | 2 |
1674 | Показания | нет | 8 | 12 |
1675 | Уведомления об оплате | нет | 6 | 2 |
1676 | Запросы долга | нет | 5 | 2 |
1677 | Бюллетени | нет | 11 | 3 |
Схемы колонок
1662 · Заявки на работы (19): number:sequence, customer:reference, company:reference, site_address:multilineText, location:reference, assigned_tech:person, scheduled_start:datetime, scheduled_end:datetime, total:rollup, status:status, notes:multilineText, description:multilineText, category:select, applicant_name:text, applicant_email:email, applicant_phone:phone, plot_code:text, contractor:reference, estimate_gate:boolean
1663 · Строки сметы (7): work_order:reference, kind:select, description:text, product:reference, qty:number, unit_price:currency, line_total:formula
1664 · Счета (25): number:sequence, customer:reference, company:reference, issue_date:date, due_date:date, period_start:date, tax_jurisdiction:text, total:rollup, amount_paid:rollup, amount_credited:rollup, tax_total:rollup, total_gross:formula, outstanding:formula, aging:formula, status:status, notes:multilineText, period_label:text, plot_code:text, owner_email:email, owner_phone:phone, amount_due:number, is_issued:boolean, reminder14:formula, reminder3:formula, aging_ru:formula
1665 · Строки счёта (13): invoice:reference, product:reference, description:text, qty:number, unit_price:currency, line_total:formula, subscription:reference, period_start:date, period_end:date, tax_category:text, tax_rate:formula, tax_amount:formula, line_total_gross:formula
1666 · Платежи (10): invoice:reference, amount:currency, kind:select, effect:formula, method:select, paid_at:date, reference:text, payer_email:email, plot_code:text, documents:documents
1667 · Кредит-ноты (7): number:sequence, invoice:reference, amount:currency, effect:formula, reason:select, issued_at:date, notes:multilineText
1668 · Собственники (20): name:text, email:email, phone:phone, address:multilineText, externalUser:externalPerson, source:select, loyalty_points:number, marketing_opt_in:boolean, owner:person, notes:multilineText, ar_balance:rollup, plot_code:text, object_type:select, area:number, dues_rate:number, next_due_date:date, last_dues_run:date, voting_right:select, last_meter_value:number, last_meter_date:date
1671 · Параметры СНТ (3): param_key:text, value_num:number, description:text
1672 · Подрядчики (4): name:text, specialization:select, email:email, phone:phone
1673 · Собрания (8): title:text, meeting_date:date, meeting_type:select, agenda:multilineText, status:select, ballots_issued:number, ballots_submitted:number, documents:files
1674 · Показания (8): object_ref:reference, plot_code:text, meter_type:select, value:number, period_label:text, status:select, prev_value:number, submitted_at:date
1675 · Уведомления об оплате (6): payer_name:text, payer_email:email, plot_code:text, amount:number, comment:multilineText, processed:boolean
1676 · Запросы долга (5): plot_code:text, requester_email:email, requester_name:text, answer_status:select, submitted_at:date
1677 · Бюллетени (11): meeting_ref:reference, owner_name:text, plot_code:text, q1_budget:select, q2_dues_rate:select, q3_contract:select, comment:multilineText, submitted_at:date, 4c9bff13-1217-42ab-8750-caa2e0d0d15a:date, 1398eee4-0c34-455c-9db9-a68d0f016f50:status, 47b47e79-6f0c-420f-8b9f-041f911c8c1e:person
3. Автоматизации (5 правил, id 306–310)
Меты читались по
documentIdтаблицы (automation_get_meta); история —automation_list_runs {documentId, ruleId}.
Правило | Название | Таблица | Триггер | enabled | Runs (ok/skipped) |
|---|---|---|---|---|---|
306 | Начисление взносов → черновики счетов | 1668 Собственники | event: schedule 0 9 * * * (each_row) | True | 1 (1/0) |
307 | Напоминание о сроке оплаты → email собственнику | 1664 Счета | schedule 0 10 * * * (each_row, conditions: status=sent + reminder14/3 = $tomorrow) | True | 5 (5/0) |
308 | Новая заявка → подрядчик по категории | 1662 Заявки на работы | event create → stages-branch маршрутизация подрядчика по категории | True | 1 (1/0) |
309 | Заявка закрыта → уведомление заявителю | 1662 Заявки на работы | status_transition → done (runOnAutomation:true) | True | 1 (1/0) |
310 | Поступил платёж → квитанция и email | 1666 Платежи | event create → generate_document (шаблон 1678) + send_email | True | 2 (2/0) |
Расхождение с журналом приёмки: журнал ожидал «4 из 5 активны, пятое не подтверждено». Факт на 2026-09-05: все 5 правил enabled:true, у каждого — успешные запуски (12 runs, 0 skipped). Пятое правило подтверждено живой историей)
4. Формы (5)
id | Название | Slug / публичный URL | Цель (targetDocumentId) | Полей | Назначение (assign) |
|---|---|---|---|---|---|
1685 | Запросить сумму долга |
| 1676 (Запросы долга) | 3 | — (не прогонялось) |
1686 | Подать заявку на работы |
| 1662 (Заявки на работы) | 6 | — (не прогонялось) |
1687 | Отправить показания |
| 1674 (Показания) | 4 | — (не прогонялось) |
1688 | Сообщить об оплате |
| 1675 (Уведомления об оплате) | 5 | — (не прогонялось) |
1689 | Бюллетень общего собрания |
| 1677 (Бюллетени) | 6 | — (не прогонялось) |
Все формы isPublished:true, portalExposed:false (портальные виджеты не подключены).
Назначение форм (form_assign) не прогонялось в этом прогоне — пункт приёмки остаётся недоигранным.
1685 носит след тестового прошлого: slug proba-forma (формально рабочий адрес, но имя-в-URL не соответствует названию «Запросить сумму долга»).
5. Дашборды (факт 5, журнал ожидал 3)
id | Название | Публичный | Панелей | Привязки |
|---|---|---|---|---|
1669 | Выездное обслуживание | — (private) | 3 | 1662 |
1670 | Дебиторка | — (private) | 3 | 1664 |
1682 | Финансы (публичный) | 5 | 1662, 1664, 1666 | |
1683 | Заявки | — (private) | 2 | 1662 |
1684 | Кворум ОСС | — (private) | 4 | 1673, 1677 |
Лишние против журнала 2 — модульные Выездное обслуживание (1669) и Дебиторка (1670): приватные, созданы модулями field_service/billing_ar.
6. Документы-шаблоны и проверка токенов (ключевой вопрос волны)
id | Название | Токены | Токены | Публичный |
|---|---|---|---|---|
1678 | Квитанция (шаблон) | НЕТ | 5 шт. | — |
1679 | Протокол ОСС (шаблон) | НЕТ | 6 шт. | — |
1680 | Страница СНТ | НЕТ | 0 шт. | ✅ |
1681 | Уведомление о собрании | НЕТ | 0 шт. | ✅ |
Вывод по ключевому вопросу: в телах шаблонов литеральных токенов {{col.*}} НЕТ. Шаблоны (1678 квитанция, 1679 протокол ОСС) используют {{parent.*}}; живая проверка на реально сгенерированной квитанции (doc 1690, «Квитанция 45 2026-09-04», прикреплена к платежу уч.45): все 5 {{parent.*}} остались литералами в теле (Участок/кв: {{parent.plot_code}} и т.д.). Это точно воспроизводит §61.4: чипы шаблонов — UI-сущность редактора, из MCP не резолвятся; nameTemplate правила при этом резолвится корректно. Следствие: авто-квитанции содержимое не несут — нужен UI-чип или фиксация данных в columns-полях.
Документы 1680 «Страница СНТ» и 1681 «Уведомление о собрании» — фиксированная проза, токенов нет, опубликованы.
7. Публичный контур (анонимный curl)
URL | Код | Комментарий |
|---|---|---|
| 200 | док 1680 |
| 200 | док 1681 |
| 200 | дашборд 1682 |
| 200 | форма 1685 |
| 200 | форма 1686 |
| 200 | форма 1687 |
| 200 | форма 1688 |
| 200 | форма 1689 |
| 200 | таблица 1664 «Счета» (публикация осмысленна приёмкой: visibility-утечка owner_email исправлена обёрткой columnVisibility — §61.8/E99) |
| 404 | неопубликованный шаблон 1678 — приватность ✅ |
| 404 | неопубликованный дашборд 1670 — приватность ✅ |
| 404 | несуществующий слаг — приватность ✅ |
Все ответы 200 — SPA-шелл (данные рендерятся клиентски); вердикт приватности по §61.8 — анонимный curl, получены: опубликованное → 200, непубликованное → 404. Проект isPublished:true, baseCurrency RUB, timezone Europe/Moscow, channels [] (важно: §62.8 — при пустых channels доставка send_message падает; send_email на этой сборке работает — письма правил 307/309/310 имеют успех в runs, но см. открытый контроль §61.5).
8. Грабли проекта (из dev-report/error)
§61.4 — чипы шаблонов ({{parent.*}}) недоступны из MCP: сгенерированные квитанции — литеральные токены. Потверждено живьём (doc 1690).
§61.8 / E99(2) — columnVisibility без обёртки {"columns":{...}} возвращает ok и НЕ применяется → утечка ПД в публичную таблицу; единственный вердикт — анонимный curl.
E99(1) — лишняя скобка в IF-цепочке формулы даёт #ERROR (RU-литералы формул при этом работают — §61.11); проверка баланса скобок до отправки.
§61.2 — формы document-first: doc_upsert {type:'form'} → form_set_meta; ключ table валидатор молча принимает, но цель НЕ биндит.
§61.3 / §62.7 — generate_document требует целевую колонку типа documents, files отвергается.
§61.5 — send_email: {{col.X}} в subject резолвится, в теле после отправки видны одиночные {col.X} — доставка тела под открытым контролем (Resend).
§61.9 — автопереход sent→paid работает; sent→partial мёртв (amount_paid суммирует отрицательный effect). Живое подтверждение: INV-2026-0015 paid, но amount_paid:-144 — аномальное знаковое значение при корректном статусе.
§61.7 — schedule-правило тикает сразу после создания при истинных условиях (дата-гейт обязателен).
§61.12 — stages/branch в правилах валидируются и исполняются живьём (правило 308 работает ветками по 5 категориям).
стр.141 dev-report — exclusive_scheduling заявлен только для части purpose; для К5 окна работ — core_work_order (см. открытый вопрос п.1).
стр.140 — модуля голосования ОСС в каталоге нет; обход паттерном assigned_forms_task (назначение форм не прогонялось — п.2).
9. Открытые вопросы (недоигранные пункты приёмки и расхождения)
Эксклюзивный планировщик (exclusive_scheduling, запрет двойного бронирования окон работ, таблица 1662 purpose core_work_order) — не проверялся живьём (нужны два пересекающихся слота). Статус: гипотеза из допущения карты.
Назначение форм (form_assign / coverage) — не прогонялось; формы 5/5 опубликованы, но паттерн assigned_forms_task для бюллетеней ОСС (1689) не верифицирован.
Пятое правило — журнал приёмки: «4 из 5 активно, пятое не подтверждено». Факт: все 5 enabled и с успешными runs; если «пятым» названо 307 (напоминания, 5 runs) — пункт закрыт доказательством; в первоисточнике приёмки (карта) не уточнено, какое правило ставилось под сомнение → требует пометки в карте, не в платформе.
Сгенерированные квитанции с литеральными {parent.*} (doc 1690) — контент-дефект по §61.4; обход (фиксированная проза или ручные чипы в UI) не выбран.
Счётчик строк 84 ≠ 87 из журнала (−3). Агрегация consistent внутри таблиц (нет countEmpty), значит расхождение в журнале (возможно, счёт по удалённым/мягко удалённым строкам или устаревший снимок). Кандидат: Кредит-ноты 1667 = 0 строк при живых платёжных артефактах — возможно, 3 строки были удалены в ходе отладки знака amount_paid (§61.9).
Таблица «Счета» (1664) опубликована — намеренная публичность финансовых данных СНТ? columnVisibility верифицирована приёмкой (E99), но решение о публикации самой таблицы стоит подтвердить у владельца.
Доставка тела писем — открытый контроль §61.5 (Resend) не выполнен.
amount_paid = −144 при статусе paid (INV-2026-0015) —известный баг §61.9 (sent→partial мёртв); статус прав, знак в rollup нет; чинить или документировать как есть.
Публичный доступ (Фаза 2, публикация документации)
Документ «Документация проекта» был опубликован на платформе: documentId 1752, mode=create (без documentId), дублей в doc_tree не было. СТАТУС ПОСЛЕ ЧИСТКИ 2026-09-05: 1752 заархивирован, актуальная версия перепубликована новым документом (обход бага обновления тела — см. секцию «Чистка»).
publicUrl: https://smb.farhome.ru/public/k5-hoa/dokumentatsiya-proekta — doc_get: isPublished=true, publicUrlBlocked=null; анонимный curl: 200 (185767 б).
Тело верифицировано doc_get_content (ключ markdown): совпадает с локальным файлом (16980 символов), секции «Открытые вопросы» на месте.
Проект k5-hoa уже был isPublished=true (project_settings_get 2026-09-05) — project_settings_set (обход E32) НЕ потребовался.
stateId документа: draft (публикация не зависела от стадий flow).
Чистка (2026-09-05)
Указание владельца платформы: архивировать пустые и неиспользуемые таблицы проекта. Канал — scripts/mcp.py (codedocs MCP), проект k5-hoa (id 35) перезакреплялся project_use перед каждой записью.
Метод (живая сверка)
Пустота: datatable_aggregate (countNonEmpty+countEmpty по первой колонке каждой из 14 таблиц); нулевой результат дополнительно верифицирован datatable_get_rows {limit:1}. Живые счётчики совпали с разделом 2 (сумма 84); единственная пустая таблица — 1667 Кредит-ноты.
Использование каждой пустой/кандидатной таблицы: form_get_meta (targetDocumentId форм 1685–1689), automation_get_meta по documentId таблиц (правила 306–310, включая цели действий — rule 306 пишет в 1664), dashboard_get_meta (привязки панелей 1669/1670/1682/1683/1684), схемы всех 14 таблиц на межтабличные связи (referenceDocumentId, rollup childDocumentId), флаг публикации (doc_get), дополнительно: agent_list ([]), chat_widget_get_meta (отключён).
Инструментальная грабля: countNonEmpty по columnId "id" молча возвращает 0 для НЕпустых таблиц (служебный id — не колонка). Зонд обязан быть реальной первой колонкой схемы.
Итог
Действие | Таблицы |
|---|---|
Архивирована (1) | 1671 Параметры СНТ — не пустая (6 строк), но не используется НИ ОДНИМ объектом (ни форма, ни правило, ни дашборд, ни ref/rollup-колонка, не публична) → «архив с данными». |
Сохранена пустой (1) | 1667 Кредит-ноты — 0 строк, но используется: rollup |
Сохранены используемыми (12) | 1662 (формы/правила 308,309/дашборды/refs), 1663 (rollup 1662.total), 1664 (публична, дашборды, правила 306 action/307, refs 1665–1667, rollup 1668), 1665 (rollups 1664.total/tax_total), 1666 (dash 1682, rollup 1664.amount_paid, rule 310), 1668 (rule 306, refs 1662/1664/1674), 1672 (ref 1662.contractor), 1673 (dash 1684, ref 1677.meeting_ref), 1674 (form 1687), 1675 (form 1688), 1676 (form 1685), 1677 (form 1689, dash 1684) |
Формы, правила, дашборды, документы — не тронуты (граница задачи: только таблицы).
Дерево до/после
До: 29 узлов (14 dataTable, 5 dashboard, 5 form, 5 document — вкл. 1752).
После архива 1671: 28 узлов (13 dataTable, 5 dashboard, 5 form, 5 document).
Перепубликация документации (архив 1752 → создание нового) — счётчик не меняет: 28 → 28. Соседние проекты не затронуты.
Перепубликация документации (обход бага тела)
Известное ограничение: doc_upsert с существующим documentId возвращает ok, но тело НЕ обновляет. Обход по указанию: архив 1752 → doc_upsert без documentId с параметром body, isPublished:true.
Новый documentId: 1754 (предсказан пробным doc_upsert 1753, сразу заархивирован); название/слаг dokumentatsiya-proekta сохранены (конфликта с архивированным 1752 не возникло).
publicUrl: https://smb.farhome.ru/public/k5-hoa/dokumentatsiya-proekta — анонимный curl 200 (слаг не изменился, секция «Публичный доступ» выше актуальна).
Тело верифицировано doc_get_content (ключ markdown): совпадает с локальным файлом; внутренний stateId нового документа — draft (косметика, публикация работает).