Put the audit's seventy-seven findings in the tree with their authorship and limits, and give the residue a row so the closed half is not read as all of it
This commit is contained in:
parent
e4097cb5a9
commit
ea567d58c6
2 changed files with 711 additions and 1 deletions
|
|
@ -3,7 +3,7 @@
|
|||
> **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено.
|
||||
> ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`).
|
||||
> ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции.
|
||||
> - **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **240** строк · зона бэкенд **113** строго / **158** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **106** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
|
||||
> - **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **241** строк · зона бэкенд **113** строго / **158** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **107** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
|
||||
> - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп.
|
||||
|
||||
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора)
|
||||
|
|
@ -275,3 +275,4 @@
|
|||
|
||||
| 327 | ⛔ **ОСТАТОК ПОЛИГОН-ПАКЕТА №4 ЖИВЁТ ТРИ МЕСЯЦА ВНУТРИ ПРОМТА, И В НЁМ ЛЕЖИТ ДАТИРОВАННЫЙ РИСК.** ⚠⚠ **Срочное: замерный судья `memory_eval.py` работает на `gemini-2.5-flash`, у серии объявлен shutdown **16.10.2026** — около шести недель от 06.09.** Носителя у этого НЕ БЫЛО: единственное вхождение слага в бэклоге — проза про ЦЕНЫ другой модели, а не про миграцию нашего судьи (проверено грепом по предмету, не по имени). ⇒ после отключения замерный контур встанет, и узнаем мы это отказом, а не планом. Там же: двойной `extra_body` и отсутствие 404-ретрая при живом слаге. ⚠ Остальные пять пунктов остатка, тоже без носителей: матчер content-filter подстрокой + самотест · параметризация языка/жанра судейского промпта (ja/en сняты под zh-рамкой) · проба судьи-дублёра 18+ · калибровка echo-gate (`D25.7`) · minimal-pairs 100–150 для shadow fidelity (`D25.2`). ⭐ **Класс, а не случай:** промт `POLYGON_PACKAGE4_SESSION_PROMPT.md` с 12.07 стоит «частично отработан, residual ЖИВ», как отдельная сессия НЕ запускался — то есть **носителем работы служит промт, а не трекер**, и в трекере этой работы не видно вовсе. ⇒ заказ: остаток становится строками, промт уходит в архив с баннером исхода, а в ролевой промт оркестратора вносится правило выхода «residual → строка бэклога, промт в архив» — сегодня его там нет, и именно поэтому пакет №4 жив три месяца | полигон | скоро (миграция судьи — ДО 16.10) | остаток несут строки, промт в архиве, правило выхода записано | **D39.216** |
|
||||
| 328 | ⛔ **ЗОННЫЕ СЕКЦИИ «БЭКЕНД»/«ПОЛИГОН» ЖИВУТ В ФАЙЛЕ ЗОНЫ ОРКЕСТРАТОРА — ОСТАТОК ЛОВУШКИ, КОТОРУЮ ВЫНОС БЭКЛОГА ЗАКРЫЛ НАПОЛОВИНУ.** Замер 06.09 (классификация 250 коммитов `docs/PROGRESS.md` с 25.08 по секциям): голова 167 · таблица 148 · зонные секции 66; «только бэклог» 48 ⇒ вынос таблицы снял 32 % случаев, с бюллетенем 58 %, остаток 42 % — проза шапки и зонные секции. Сами секции — 297 409 байт (41 % файла до выноса). У фронта и платформы зонные журналы СВОИ по решению владельца (`frontend/docs/frontend-PROGRESS.md`, `platform/docs/platform-PROGRESS.md`), у бэкенда и полигона — нет, и потому их отчёты едут в файл, который коммитит оркестратор. ⇒ вопрос владельцу: заводить ли зонные журналы бэкенду и полигону по тому же прецеденту. ⚠ Цена бездействия не гипотетическая: ловушка «коммит своей строки уносит чужой отчёт» срабатывала трижды за смену 05.09 | владелец | скоро | решение владельца о зонных журналах бэкенда и полигона (перенос — отдельным лендингом) | **D39.218** |
|
||||
| 329 | ⚠ **ОСТАТОК АУДИТА ПАКОВ И ДОКОВ 06.09: 77 находок, закрыто лендингом `e4097cb` только то, что било по двум выданным пакам.** Доказательная база — `docs/archive/reports/PROMPT_AND_DOCS_AUDIT_2026-09-06.md`. ⛔ **Вес и формулировки там принадлежат АГЕНТАМ: веер остановлен владельцем на логической точке (расход), и опровергатель прошёл НЕ по всем** ⇒ перед исполнением каждая пере-снимается по дереву. Названные, но не разобранные кандидаты: `backend/docs/components.puml` и `pipeline.puml` (глаголов 11 против 6, `.bank-stop.json` снесён D39.158, «интерим» пака-17 закрыт) · `backend/docs/MONEYSTOP_REPORT.md:3` · `docs/architecture/12-go-style-notes.md:17` (построчный маркер снят с провода, сам ⟨проверить⟩ едет) · `docs/architecture/15-money-path.md:62` и строка бэклога **166** (платформенная половина названа дырой, а построена — 19 файлов зоны) · `platform/BACKLOG.md:25` (П-10, четыре ложных утверждения) · `platform/docs/DEFECT_REGISTER.md` `PD-458` (статус-жертва: лекарство легло тем же коммитом). ⚠ Правки в ЧУЖИХ зонах — пинги владельцам зон, не своя правка | доки | скоро | пере-снятие каждой находки по дереву + правки в своей зоне + пинги в чужие | аудит промтов 06.09 |
|
||||
|
|
|
|||
709
docs/archive/reports/PROMPT_AND_DOCS_AUDIT_2026-09-06.md
Normal file
709
docs/archive/reports/PROMPT_AND_DOCS_AUDIT_2026-09-06.md
Normal file
|
|
@ -0,0 +1,709 @@
|
|||
# Аудит двух выданных паков и документации обеих зон — сырые находки (06.09, смена №23)
|
||||
|
||||
> ⚠ **ЭТО ДОКАЗАТЕЛЬНАЯ БАЗА, А НЕ НАРЯД.** Находки собраны веером из девяти линз по промтам
|
||||
> `BACKEND_CONSISTENCY` / `PLATFORM_MONEY_TRUTH` и по докам зон; веер ОСТАНОВЛЕН владельцем на
|
||||
> логической точке (расход), поэтому опровергатель прошёл НЕ по всем находкам — **вес и формулировка
|
||||
> здесь принадлежат АГЕНТУ, не оркестратору.** Проверено оркестратором и закрыто лендингом `e4097cb`
|
||||
> только то, что помечено ✅ ниже. Остальное — кандидаты: перед исполнением пере-снимать по дереву.
|
||||
> Родитель: `D39.218`-смена; заказ владельца (0а) «ревизия документации на протухшее».
|
||||
|
||||
## Линза `agent6` — находок 6
|
||||
|
||||
*Охват (словами агента):* ДЕРЕВО: HEAD ff14901, `git status --porcelain` → пусто (дерево чистое). Все команды читающие, ничего не писал. ПРОЧИТАНО ЦЕЛИКОМ: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (150 строк) · docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (176 строк) · docs/scripts/carriers.py (88 строк) · тела нот D39.104 (:286–292, 4 пункта), D39.176 (:1639–1650, 6 пунктов), D39.214 (:2670–2681, 7 пунктов), D39.216 (:2
|
||||
*Что агент НЕ проверил:* 1. НЕ ПРОВЕРЕНО — фактические заказы §4.1/§4.2/§4.3 бэкенд-промта против кода. Я сверил только §4.4 (ре-пин) и §4.2 в части «гард полисемии статус не смотрит» (строка бэклога 320 приводит само условие `a.Src != b.Src || a.Dst == b.Dst || !windowsOverlap(...)`, но САМ файл `memseed.go` я не открывал)
|
||||
|
||||
**1. [blocker] `docs/README.md:25 (таблица активных промтов) — против docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (150 строк, целиком прочитан)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «⚠ Несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»» — строка таблицы активных промтов о паке «Бэкенд · КОНСИСТЕНТНОСТЬ»
|
||||
- факт по дереву: Живой промт этого заказа НЕ несёт вовсе. Заказ БЫЛ в первой редакции промта (коммит 6457d77, 108 строк): §5 п.5 «⭐ И отдельный проход, заказанный владельцем: ЛОГИЧЕСКИЕ баги, а не исполнительские» + пункт отчёта «список логических расхождений «задумано против сделано»». Переписывание промта коммитом e69902a («rewrite two prompts to the twelve blocks the role requires») его выбросило, и сегодня единственный носитель заказа владельца во всём живом дереве — ячейка README, которая приписывает его файлу, где его нет.
|
||||
- улика: grep -n 'расхожден|задумано|логическ|ЛОГИЧЕСК' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → 1 хит, и тот посторонний (строка 17, «расхождения — пингом»); count=1. КОНТРОЛЬ рядом с нулём: в том же файле 150 строк, слово «банк» встречается 5 раз — прибор читает существующий предмет. // git show 6457d77:docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md | grep -n → «95: ⭐ И отдельный проход, заказанный владельцем: ЛОГИЧЕСКИЕ баги, а не исполнительские», «104: … список логических расхождений «задумано проти
|
||||
- предложенная правка: Решить, жив ли заказ владельца. Если жив — вернуть его пунктом в docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (проход «логические баги, а не исполнительские» + пункт отчёта) и оставить ячейку README как есть. Если снят — снять формулировку из docs/README.md:25 и записать снятие носителем (строка бэклога или D-нота), иначе слово владельца исчезает вместе с редакцией промта.
|
||||
- уверенность автора: подтверждено исполнением (grep по живому файлу + git show прежней редакции)
|
||||
|
||||
**2. [major] `docs/README.md:25 — против docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md §4.5 (строки 76–83) и docs/PROGRESS.md:366 (строка 295)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «приоритет владельца №1: канон в прогон (295) · гард перекрытия окон (267) · честный комментарий постчека (318) · не уничтожать принятую редактуру (322 а/б) · два ложных комментария»
|
||||
- факт по дереву: Два из пяти пунктов пак НЕ несёт. §4.5 промта: «**Строка 295 (подать подписанный канон в прогон)** — снята из этого пака: у бэкенд-сессии нет ни книги, ни стенда, ни санкции на деньги» и «**Строка 322 (история принятой редактуры)** — другой предмет: жизненный цикл чекпойнтов и схема, а не закон банка. Отдельным паком». То же подтверждают строка бэклога 295 («ПОЛОВИНЫ НАЗВАНЫ 06.09 … у бэкенд-сессии нет ни книги, ни стенда, ни денег, поэтому половина её не является») и D39.217 п.6 («Строка 295 снята из бэкенд-пака»). Холодный вход по CLAUDE.md читает ЭТУ таблицу первым делом и получает состав пака, противоречащий самому промту.
|
||||
- улика: sed -n '25p' docs/README.md (полный текст ячейки процитирован выше). // grep -n '295' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → ровно 1 хит, строка 80: «Строка 295 … снята из этого пака». // grep -n '^| 295 |' docs/PROGRESS.md → :366 «(б) Бэкенд — только ВОПРОСОМ, а не задачей». // grep -n '^| N |' контроль: в docs/PROGRESS.md 230 строк бэклога вида '^| N |', все 12 номеров, цитируемых обоими промтами (161,267,282,283,286,295,318,320,321,322,325,326), дают ровно по 1 хиту — битых номеров нет.
|
||||
- предложенная правка: Переписать ячейку docs/README.md:25 под живой состав пака: гард перекрытия окон (267) · совет, который движок не исполняет (320а) · честный комментарий постчека (318) · два ложных комментария (321 и половина 322); из состава убрать «канон в прогон (295)» и «не уничтожать принятую редактуру (322 а/б)», назвав рядом, что обе половины отложены (295 — полигон/владелец, 322 — отдельный дизайн-пак).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**3. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:37-38`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**Комментарий не доказывает поведение** (`D39.214` п.3): источник утверждения о СМЫСЛЕ — тест или прогон. ⚠ Эту норму НЕ ищи грепом в `CLAUDE.md` — её там нет, она живёт нотой.»
|
||||
- факт по дереву: Нота существует (05-decisions-log.md:2670, статус ✅, эрраты против неё нет), и вторая половина утверждения ВЕРНА (в CLAUDE.md нормы действительно нет). Но пункт назван не тот, и приписанная формулировка — обратная содержанию. D39.214 п.3 (:2676) — не про комментарии, а про ПИНЫ, и говорит ровно противоположное: «ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО … доказано ОТОБРАЖЕНИЕ, а сказано про ЖИЗНЬ … Цитируя пин в утверждении о ЗНАЧЕНИИ, спрашивать надо не «зелен ли он», а «ТО ЛИ ОН МЕРИТ»». То есть п.3 предупреждает, что тест НЕ является достаточным источником утверждения о смысле, а промт цитирует его как «источник утверждения о СМЫСЛЕ — тест или прогон». Комментарийная половина нормы живёт в п.2(в) (:2674): «Комментарий провода `wireBook.Structure` перечислял ТРИ значения из четырёх ⇒ … список в комментарии протухает молча и читается как обещание».
|
||||
- улика: grep -n '^## D39.214 ' docs/architecture/05-decisions-log.md → :2670; тело 2670–2681 прочитано целиком. Пункты: :2674 = п.2, :2676 = п.3 (цитаты выше). // Проверка второй половины утверждения ИСПОЛНЕНИЕМ: grep -ni 'комментар' CLAUDE.md → 1 хит, строка 21, и он про язык кода («код и комментарии — по-английски»), а не про норму. КОНТРОЛЬ рядом с этим нулём: в том же CLAUDE.md 114 строк, и обе соседние нормы, которые промт ссылает на CLAUDE.md, там ЕСТЬ — 'МУТАЦИЯ ЗАСЧИТЫВАЕТСЯ' :85, 'КОНТРОЛЬНАЯ в
|
||||
- предложенная правка: В docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:37 заменить ссылку на `D39.214` п.2(в) и добавить отдельной строкой настоящий п.3 — «цитируя пин, спрашивать не «зелен ли он», а «ТО ЛИ ОН МЕРИТ»»: он прямо обслуживает §5.1 (таблица мутаций) и §6 («тест утверждает не то, что думает»), а сейчас пак ссылается на него формулировкой, которую пункт опровергает.
|
||||
- уверенность автора: подтверждено исполнением (тело ноты прочитано, греп по CLAUDE.md с контрольными величинами)
|
||||
|
||||
**4. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:29`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**Ратифицированное, что нужно для работы, — в теле промта, чтобы не искать (`D39.216` требует так):**»
|
||||
- факт по дереву: D39.216 (:2702, ✅, эрраты нет) требует не этого. Её п.4 (:2710): «**Где обязан стоять.** Строкой «делай РОВНО так» в КАЖДОМ паке, где есть проектирование…» — то есть нота требует присутствия СВОЕЙ строки (мандата чистоты), а не общего правила «класть ратифицированное в тело промта». Общее правило есть, но у него другие носители: CLAUDE.md:109 («ратифицированное вложено в тело промта, остальное берётся грепом по мере вопросов») и docs/ORCHESTRATOR_SESSION_PROMPT.md:79. Атрибуция расширена за пределы тела ноты — ровно тот класс, который D39.216 п.2 сам про себя и фиксирует (носитель называть точно).
|
||||
- улика: grep -n '^## D39.216 ' docs/architecture/05-decisions-log.md → :2702; тело 2702–2712 прочитано целиком, п.4 процитирован. // grep -rn 'в теле промта' docs/ --exclude-dir=prompts --exclude-dir=reports → 4 хита: ORCHESTRATOR_SESSION_PROMPT.md:79 и три самих пака. grep -n 'тело промта|в теле промта' CLAUDE.md → :109. КОНТРОЛЬ: 'промта' в CLAUDE.md — 4 хита. // Реестр: 05-decisions-index.md:277 — статус ✅ (контроль: в реестре 265 строк '^| D').
|
||||
- предложенная правка: В docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:29 сослаться на носителя правила — `CLAUDE.md` §Онбординг — а `D39.216` оставить там, где он действительно обязателен: строкой мандата чистоты в списке ниже (она там уже стоит, строки 34–36).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**5. [minor] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:49-50 (блок «**Ратифицированное — в теле промта:**»)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**Продуктовых КВОТ и фри-тир-лимитов нет и не проектируется**; оплаты в бете нет, пополнение — из админки. **Первую внешнюю книгу впускает владелец.**»
|
||||
- факт по дереву: Первые два предложения ратифицированы и проверены: D39.176 п.1 (:1643) — «Продуктовых КВОТ НЕТ … «никаких квот, мы живём на покупке API; на аккаунты бонусы зачисляются из админки» … ⛔ фри-тир-лимиты не проектировать»; п.2 (:1644) — «Продажа ПЛАНИРУЕТСЯ, но не в бете … бета остаётся закрытой». Третье предложение носителя не имеет НИГДЕ, кроме самого промта, и вдобавок противоречит двум живым носителям: строка бэклога 326 (PROGRESS.md:406) — «КРИТЕРИЯ ВПУСКА ПЕРВОГО ПОЛЬЗОВАТЕЛЯ В РЕПОЗИТОРИИ НЕ СУЩЕСТВУЕТ … формулировку утверждает ВЛАДЕЛЕЦ», и D39.217 п.7 (:2730), где «Определение беты (консьерж против самообслуживания; критерия впуска в дереве НЕТ, строка 326)» стоит ПЕРВЫМ в списке «Вопросы ВЛАДЕЛЬЦА, ждущие его слова» — то есть кто именно впускает, сегодня как раз и не решено.
|
||||
- улика: grep -n '^## D39.176 ' → :1639, тело прочитано; п.1 :1643, п.2 :1644 (цитаты выше); эррата 30.08-а бьёт по п.5 (`PD-421`), не по п.1 — grep -n 'Эррата' | grep D39.176 → 1 хит, :25. // grep -rni 'впускает владелец|первую внешнюю книгу|первого платящего' docs/ platform/docs/ --exclude-dir=prompts --exclude-dir=reports --exclude-dir=archive → 2 хита, ОБА в самом PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (:5 и :50). КОНТРОЛЬ рядом с нулём: греп 'критери. впуска' по тем же живым докам даёт 7 хитов — пре
|
||||
- предложенная правка: В docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:49-50 проставить носителя первым двум предложениям (`D39.176` п.1 и п.2), а фразу «Первую внешнюю книгу впускает владелец» либо убрать из блока «Ратифицированное», либо переписать тем, что действительно ратифицировано («бета остаётся ЗАКРЫТОЙ, `D39.176` п.2; кто и по какому критерию впускает — открытый вопрос владельца, строка 326 / `D39.217` п.7»).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**6. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:24 (§3 «Карта чтения — ЗАКОН, дальше только по её ссылкам»)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «2. Строки бэклога **267**, **318**, **320** (`docs/PROGRESS.md`, греп `^| N |`).»
|
||||
- факт по дереву: Пак работает с ЧЕТЫРЬМЯ предметами, и два из них живут строками, которых карта не называет: §4.4 заказывает снять ложные комментарии «строки 321 и 322». Карта объявлена ЗАКОНОМ («дальше только по её ссылкам»), так что сессия, исполняющая её буквально, читает разбор для двух заказов и не читает для двух других — а именно в строке 321 лежит замер 06.09 (86 % многоединичных глав), которым обосновано «оправдание ложно», и в строке 322 — адрес ложного комментария `chunkstatus.go:52-57`. Прежняя редакция промта (6457d77:12) называла в карте пять строк, включая 322; при переписывании список сократили, а §4.4 остался.
|
||||
- улика: sed -n '24p' и строки 68–74 промта (§4.4 «Два ложных комментария — снять (строки 321 и 322)»). // git show 6457d77:…:12 → «Строки бэклога **295**, **267**, **318**, **320**, **322**». // Обе недостающие строки в дереве есть и несут именно тот разбор: grep -n '^| 321 |' docs/PROGRESS.md → :400 («ЗАМЕР 06.09 … 1962 многоединичных, то есть 86 %»); '^| 322 |' → :401 («комментарий `backend/internal/store/chunkstatus.go:52-57` про «резюм переписывает строку» ЛОЖЕН»). КОНТРОЛЬ: все 12 цитируемых номеро
|
||||
- предложенная правка: Дописать в карту чтения docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:24 строки **321** и **322** (карта остаётся в пределах ≤5 позиций: это тот же пункт 2).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
## Линза `agent8` — находок 6
|
||||
|
||||
*Охват (словами агента):* ЧИТАЛ ЦЕЛИКОМ: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (176 строк, весь предмет) · docs/scripts/carriers.py (108 строк, исходник прибора) · тело D39.214 (docs/architecture/05-decisions-log.md строки 2670–2685, 16 строк) · platform/internal/httpapi/project.go строки 20–50 · platform/internal/httpapi/v0.go строки 190–230 · platform/internal/ingest/tail.go строки 155–205 · platform/internal/books
|
||||
*Что агент НЕ проверил:* НЕ ПРОВЕРЕНО (третий исход, не выдаю за первый): 1. **«Ручной проход контролёра давал 69»** (§4.0, строка 74 промта) — воспроизвести нечем: это утверждение о прошлом ДЕЙСТВИИ человека/сессии, а не о дереве. Прибор даёт 55 (подтверждено исполнением), но откуда 69 — в дереве не выводится ни из какого
|
||||
|
||||
**7. [blocker] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:12-14 (§1, второй буллет)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**заклинивший прогон невидим**: живой прогон с намертво заблокированной расплатой не показывается ни на одной поверхности и не лечится штатной ручкой; вывести его может только пользователь, нажав Stop, и **никто ему об этом не говорит** (`PD-424`)»
|
||||
- факт по дереву: Ряд PD-424 сам объявляет ВСЕ ТРИ названные болезни вылеченными, а промт цитирует первую редакцию ряда. В теле ряда: «⚠ **СУЖЕНА пак P12 (30–31.08), НЕ ЗАКРЫТА — половина «невидим» вылечена**…», «Сегодня пользователь выводит прогон из состояния кнопкой Stop, и **теперь об этом хотя бы говорят все три поверхности PD-385**», «⚠ **РУЧКА ПОСТРОЕНА паком «закрыть цикл» (04.09) — строка СУЖЕНА до своего остатка, не закрыта.**». Настоящий остаток, ради которого ряд открыт, в промте не назван вовсе: «отсутствие процесса доказывается ОДИН раз, в момент команды, и между этим ответом и коммитом транзакции есть окно, в которое юнит может подняться заново… закрыть его может только фактически транзакционная проба — арбитр в хранилище, а не ещё одна проверка в CLI».
|
||||
- улика: grep "^| PD-424 |" platform/docs/DEFECT_REGISTER.md → ряд на строке 27, статус (awk -F'|' $(NF-2)) = ` open `.
|
||||
Код подтверждает все три починки:
|
||||
grep -rn 'run abandon|AbandonRun' platform/cmd platform/internal --include=*.go | grep -v _test →
|
||||
platform/cmd/tmplatformctl/runs.go:412 `fs := flag.NewFlagSet("run abandon", …)`
|
||||
platform/cmd/tmplatformctl/main.go:57 `run abandon --run <id> --reason <text> [--release-hold] (operator's terminal verdict on a stalled run)`
|
||||
platform/internal
|
||||
- предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md, §1 и §4.1: переписать буллет PD-424 на его СЕГОДНЯШНИЙ остаток — «ручка `tmplatformctl run abandon` построена, поверхности видят прогон; открыто ОДНО: между пробой `runner.Alive` и коммитом транзакции есть окно, в которое юнит поднимается заново, и закрыть его может только транзакционный арбитр в хранилище». Убрать три вылеченные формулировки, иначе сессия ищет в коде болезнь, которой там нет.
|
||||
- уверенность автора: вывод по коду (ряд регистра + file:line в platform/, исполнением тесты не гонялись)
|
||||
|
||||
**8. [major] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:15-16 (§1, третий буллет) + :86-87 (§4.1)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §1: «**чужие события ложились на оплаченную попытку** — чужой потолок ставил `paused` живому оплаченному прогону, чужой `unit_done` писал главы, которых никто не покупал (`PD-438`)»; §4.1: «`PD-441` · `PD-424` · `PD-438`. … Форму лечения выбираешь ты; **предмет не двигаешь**»
|
||||
- факт по дереву: Предмет PD-438 ВЫЛЕЧЕН и заленджен 04.09; ряд остаётся `open` только на видимости парковки для оператора, и пак «закрыть цикл» отложил её СОЗНАТЕЛЬНО с доводом, что это отдельная работа с миграцией. Из ряда: «Дофикс дал ей имя (`ErrForeignStreamAhead`), WARN с троттлингом и вход в ресинк; поверхностная видимость для ОПЕРАТОРА остаётся открытой» и «⚠ **ДИСПОЗИЦИЯ ПАКА «ЗАКРЫТЬ ЦИКЛ» (04.09): ОТЛОЖЕНО СОЗНАТЕЛЬНО** … Дать ей любой из трёх значит завести колонку на `run_attempts`, то есть миграцию и новое состояние… Это не райдер, а отдельная работа со своим дизайном». Промт заказывает «предмет не двигаешь» по вылеченному предмету и не называет ни остатка, ни того, что его уже один раз отложили с доводом; §4.5 («чего в паке НЕТ») его тоже не исключает.
|
||||
- улика: grep -rn 'ErrForeignStreamAhead' platform/internal --include=*.go → 13 хитов, из них несущие:
|
||||
platform/internal/ingest/tail.go:36 `ErrForeignStreamAhead = errors.New("ingest: another stream begins here and this attempt's own region has ended")`
|
||||
platform/internal/ingest/tail.go:170 и :197 `return pos, want, ErrForeignStreamAhead` (остановка чтения)
|
||||
platform/internal/runs/reconcile.go:728 `case errors.Is(err, ingest.ErrForeignStreamAhead):`
|
||||
sed -n '155,200p' platform/internal/ingest/tail.go
|
||||
- предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md §1 и §4.1: заменить описание PD-438 на его остаток («припаркованная попытка не видна ни строкой в `runs`, ни гейджем, ни колонкой; парковка живёт длину прохода и в БД не пишется») и ЯВНО сказать, что пак 04.09 отложил её с доводом «нужна миграция и состояние, которое надо снимать» — чтобы сессия либо приняла этот довод, либо оспорила его сознательно, а не наткнулась на вылеченный код.
|
||||
- уверенность автора: подтверждено чтением кода и тестов (file:line); go test не запускался
|
||||
|
||||
**9. [major] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:92-95 (§4.2) и :17-18 (§1, четвёртый буллет)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «### 4.2 Экран не врёт о единице (строка 282) — **делай РОВНО так**. Либо число приезжает из манифеста движка, либо подпись переименована в то, что оно на самом деле считает. ⛔ Третьего — «оставить как есть, все привыкли» — нет»
|
||||
- факт по дереву: Обе ветви этой «делай РОВНО так» неисполнимы как заказ. **Ветвь А уже построена:** число из манифеста движка предпочитается всегда, когда оно есть, и рядом едет флаг точности (лендинг 628cc56 от 06.09, форма ратифицирована актом D39.201 §5(б)). **Ветвь Б лежит в чужой замороженной зоне:** подпись — `frontend/src/i18n/ru.ts:107`, а §2 самого промта объявляет `frontend/` только-чтением, CURRENT-STATE — «фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147)», и строка 282 бэклога это знает: «⚠ Фронт заморожен — подпись правится при разморозке, число на платформе раньше». Промт про заморозку не говорит ни слова. Настоящий остаток (флаг `character_count_exact` до экрана не доходит) в промте не назван.
|
||||
- улика: platform/internal/httpapi/project.go:35-40:
|
||||
if b.Status != "uploading" {
|
||||
count := b.CharacterCount
|
||||
if b.SourceChars != nil { count, out.CharacterCountExact = *b.SourceChars, true }
|
||||
out.CharacterCount = &count
|
||||
}
|
||||
platform/internal/httpapi/v0.go:211 `CharacterCountExact bool \`json:"character_count_exact"\`` с комментарием «The engine's manifest now carries the real figure … and it is preferred whenever it exists. … Form ratified by the orchestrator, act D39.201 §5(б
|
||||
- предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md §4.2: переписать на реальный остаток — «число из манифеста уже берётся (`project.go:37-38`, флаг `character_count_exact`, D39.201 §5(б)); открыто ДВА: (а) книга до прихода манифеста отдаёт приближение, и флаг о нём до экрана не доходит — `frontend/src/` его не читает (0 хитов при 8 хитах `character_count`); (б) подпись «Знаков» правится при разморозке фронта, а фронт заморожен (D39.147) и в §2 объявлен чужой зоной». Убрать «⛔ третьего нет» либо назвать
|
||||
- уверенность автора: подтверждено чтением кода и git-истории (file:line + sha); экран не поднимался
|
||||
|
||||
**10. [major] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:51-53 (§3, блок «Ратифицированное — в теле промта»)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**Число называет ДЕРЕВО и ПОПУЛЯЦИЮ** · **рядом с нулём — контрольная величина** · **мутация засчитывается по ТЕКСТУ сообщения, а не по факту красноты** · **комментарий не доказывает поведение** (`D39.214`; грепом в `CLAUDE.md` не ищи, там её нет)»
|
||||
- факт по дереву: Двойное расхождение. (1) `D39.214` — про ДРУГОЕ: её заголовок ««ЕСТЬ ПИН» НЕ ЗНАЧИТ «ПИН ДОКАЗЫВАЕТ СКАЗАННОЕ»: одна эра протухла в трёх носителях, и один из них был зелёным тестом». Ни одной из четырёх процитированных норм в её теле нет. (2) Указание «в `CLAUDE.md` не ищи, там её нет» уводит от двух норм, которые в `CLAUDE.md` стоят ДОСЛОВНО и с замерами — строка 75 («⇒ рядом с нулём ПЕЧАТАЕТСЯ КОНТРОЛЬНАЯ величина…») и строка 85 («⛔ **МУТАЦИЯ ЗАСЧИТЫВАЕТСЯ ПО ТЕКСТУ СООБЩЕНИЯ, А НЕ ПО ФАКТУ КРАСНОТЫ.**»). Норма «Число называет ДЕРЕВО и ПОПУЛЯЦИЮ» живёт в docs/ORCHESTRATOR_SESSION_PROMPT.md:271, а не под D-номером.
|
||||
- улика: grep -n 'D39\.214' docs/architecture/05-decisions-log.md → 2670: `## D39.214 — «ЕСТЬ ПИН» НЕ ЗНАЧИТ «ПИН ДОКАЗЫВАЕТ СКАЗАННОЕ»…`.
|
||||
Тело ноты = строки 2670..2685 (следующая `^## D` на 2686), 16 строк. Греп внутри тела: 'популяц' 0 · 'контрольн' 0 · 'мутац' 0 · 'не доказывает поведение' 0. КОНТРОЛЬ по тому же файлу-вырезке: 'пин' — 5 хитов (то есть грепался существующий текст, а не пустота).
|
||||
Реестр docs/architecture/05-decisions-index.md:275 подтверждает предмет: «**«ЕСТЬ ПИН» ≠ «ПИН ДОКАЗЫВАЕТ СКА
|
||||
- предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md §3: снять номер `D39.214` с этого блока (он не его носитель) и заменить парентезу на верную адресацию — «контрольная величина рядом с нулём и мутация по ТЕКСТУ сообщения стоят в `CLAUDE.md` строками 75 и 85 с замерами 06.09; «число называет дерево и популяцию» — норма роли, `ORCHESTRATOR_SESSION_PROMPT.md:271»`. Если норму хотят под D-номером — завести её отдельной нотой, а не приписывать чужой.
|
||||
- уверенность автора: подтверждено исполнением грепов с контрольными величинами
|
||||
|
||||
**11. [minor] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:38-39 (§3, позиция 2)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «⚠ Ссылка на этот файл обязана быть в каждом платформенном промте; **из семи прежних сослались пять**, и норма **дважды** проскользнула.»
|
||||
- факт по дереву: Число посчитано по одной папке — `platform/docs/archive/` (7 файлов, самая СТАРАЯ партия 08-04…08-22), — а десять более свежих платформенных промтов (P9, P10, P11, P12, P13, RUNNER, SQLC, EXPORT, OPERATIONS, P0) лежат в `docs/archive/prompts/` и в счёт не вошли. По всему дереву прежних платформенных промтов 17 файлов (16 различных: `PLATFORM_P0_…_2026-08-04.md` и `platform/docs/archive/PLATFORM_SESSION_PROMPT_2026-08-04.md` байт-идентичны), со ссылкой — 11, без ссылки — 6. Даже если вычесть промт 08-04, написанный ДО заведения `ENGINEERING_STANDARDS.md` (файл появился 05.08, коммит 954c034), пропусков 4, а не 2. Промт нарушает норму, которую сам же цитирует восемью строками ниже («Число называет ДЕРЕВО и ПОПУЛЯЦИЮ»).
|
||||
- улика: find . -path ./books -prune -o -iname '*PLATFORM*PROMPT*' -print | sort → 18 путей, из них 1 — сам разбираемый промт ⇒ 17 прежних. Цикл с `grep -c ENGINEERING_STANDARDS` по каждому:
|
||||
ЕСТЬ: EXPORT(2) OPERATIONS(1) P12(1) P13(2) P9(1) SQLC(2) P5(1) P6_DOFIX(3) P6(3) P7(1) P8_REVIEW(2) = 11
|
||||
НЕТ: P0(0) P10(0) P11(0) RUNNER(0) P8_FIX(0) PLATFORM_SESSION_PROMPT_2026-08-04(0) = 6
|
||||
ИТОГО: 17 · со ссылкой 11 · без 6
|
||||
Тот же цикл ТОЛЬКО по platform/docs/archive/ даёт ровно «7 / 5» — то есть популяция
|
||||
- предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md §3: заменить «из семи прежних сослались пять … дважды проскользнула» на посчитанное по всему дереву — «из 16 прежних платформенных промтов (find по `*PLATFORM*PROMPT*`, две копии 08-04 схлопнуты) сослались 11; 4 пропуска после заведения файла 05.08 — P8-FIX, RUNNER, P10, P11» — и назвать команду, которой считали.
|
||||
- уверенность автора: подтверждено исполнением (перечисление всех 17 файлов с их счётчиками)
|
||||
|
||||
**12. [minor] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:10-11 (§1, первый буллет)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «замер: три отменённых вызова **прожили по две минуты** с ценой `0`, соседние завершённые стоили $0.017 и $0.063»
|
||||
- факт по дереву: Цены совпадают ($0.017409 и $0.063404 округлены верно), а длительность занижена: оба живых носителя дают 120756, 156469 и 156470 мс и сами формулируют это как «2–2.6 минуты», а не «по две минуты». Занижение до 30 % на числе, которое в самом ряду названо главным различителем («латентность — кандидат-различитель… порог обязан быть обоснован замером»), — сессия будет строить порог по нему.
|
||||
- улика: grep "^| PD-441 |" platform/docs/DEFECT_REGISTER.md (строка 29): «три оставшихся были отменены В ТОТ ЖЕ МИГ, отработав **120756, 156469 и 156470 мс** — с `cost_usd 0`… соседние ЗАВЕРШЁННЫЕ вызовы того же прогона стоили $0.017409 и $0.063404… Вызов, проживший **2–2.6 минуты**, до провайдера дошёл почти наверняка».
|
||||
sed -n '23p' docs/PROGRESS.md (CURRENT-STATE) — те же числа: «отработав 120756, 156469 и 156470 мс… вызовы шли **2–2.6 минуты**, их цены в леджере нет»; там же $0.063404, ≈$0.05–0.19 на
|
||||
- предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md §1: написать «прожили 2–2.6 минуты (120756 / 156469 / 156470 мс)» — ровно как оба носителя, чтобы порог различителя строился по настоящим числам.
|
||||
- уверенность автора: подтверждено исполнением (цитаты обоих носителей)
|
||||
|
||||
## Линза `agent10` — находок 16
|
||||
|
||||
*Охват (словами агента):* НОРМАТИВ прочитан целиком: `/home/ubuntu-26/projects/textmachine/docs/ORCHESTRATOR_SESSION_PROMPT.md` строки 68–113 (секция «Пишешь промт сессии?»), снято `sed -n '60,140p'` — 46 строк норматива: 12 нумерованных блоков (:76–97), абзац «Плюс к любому промту» (:99–108, 8 элементов), абзац «В КОДОВЫЙ промт дополнительно» (:110–113, 5 элементов). Контроль, что читаю живой файл: файл 294 строки, `grep
|
||||
*Что агент НЕ проверил:* 1. НЕ ПРОВЕРЕНА ИСТИННОСТЬ КОДОВЫХ УТВЕРЖДЕНИЙ обоих промтов — она вне предмета сверки, и я в код не ходил: бэкенд §4.2 «гвард полисемии статус НЕ СМОТРИТ вовсе» (:54), §4.3 «код при найденной форме делает `continue`» (:61-62), §4.4 «глава регулярно делится на несколько правочных единиц» (:70-71); п
|
||||
|
||||
**13. [blocker] `docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:144-146 (§9) вместе с :157-161 (§12)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «## 9. Эхо-протокол старта — ≤10 строк ДО работы: скоуп · инварианты · не-делать.»
|
||||
- факт по дереву: Блок 9 ВЫРОЖДЕН: у эха нет ни адресата, ни даже глагола отправки — три слова после двоеточия. Букву удовлетворяет десять строк, написанных в собственный скрэтчпад: никто их не увидит, разойтись с заказом будет негде. Норматив (ORCHESTRATOR_SESSION_PROMPT.md:97) требует сверх этого связки с блоком 12: «эхо (блок 9) идёт первым действием по адресу из файла и служит проверкой канала». §12 промта про эхо не говорит вовсе — канал остаётся непроверенным до первого настоящего вопроса, то есть до момента, когда проверять уже поздно.
|
||||
- улика: sed -n '144,146p' → «## 9. Эхо-протокол старта» / пусто / «≤10 строк ДО работы: скоуп · инварианты · не-делать.»; sed -n '157,161p' — §12 несёт путь, «свой блок первым делом», ListAgents и «роли нет ⇒ нормальный случай», слова «эхо» в §12 нет. Контроль: grep -ci 'пинг' по файлу = 5 (греплю живой файл). Норматив: sed -n '90p;97p' docs/ORCHESTRATOR_SESSION_PROMPT.md → «9. Эхо-протокол старта: ≤10 строк … ДО работы» и «эхо (блок 9) идёт первым действием по адресу из файла и служит проверкой канала»
|
||||
- предложенная правка: Заменить тело §9 (строка 146) на: «≤10 строк ДО первой правки: **скоуп** (что берёшь) · **инварианты** (что обязано уцелеть) · **не-делать** (что в паке запрещено). ⚠ **Отправь их ПЕРВЫМ действием по адресу оркестратора из `/tmp/textmachine-channel`** — это и есть проверка канала: адрес не отвечает или блока нет ⇒ канала нет, эхо идёт секцией в отчёт, и дальше действует §12. Если эхо разойдётся с заказом — лучше здесь, чем в приёмке.» И в §12, после «живость — `ListAgents`» (строка 159), добавит
|
||||
- уверенность автора: подтверждено исполнением (sed/grep по обоим файлам)
|
||||
|
||||
**14. [blocker] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:117-120 (§9) вместе с :131-135 (§12)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «ДО работы пришли ≤10 строк: **скоуп** … · **инварианты** … · **не-делать** …»
|
||||
- факт по дереву: Блок 9 ВЫРОЖДЕН слабее платформенного, но по той же причине: глагол «пришли» есть, АДРЕСАТА нет. Соседний §7 адресата называет («пришли оркестратору ≤15 строк», :109), §9 — нет, и разница читается как намеренная. Связки «эхо первым действием по адресу из файла = проверка канала» (норматив :97) в §12 нет.
|
||||
- улика: sed -n '117,120p' → «## 9. Эхо-протокол старта» … «ДО работы пришли ≤10 строк: **скоуп** (что берёшь) · **инварианты** (что обязано уцелеть) · **не-делать**»; sed -n '109p' → «До первой правки пришли оркестратору ≤15 строк». grep -c 'эхо' в §12-области = 0. Контроль: grep -ci 'пинг' по файлу = 5.
|
||||
- предложенная правка: В строке 119 после «ДО работы пришли» вставить адресата и функцию проверки: «ДО работы пришли **оркестратору — первым действием, по адресу из `/tmp/textmachine-channel`** ≤10 строк: …». В §12 после «живость сверяй `ListAgents`» (:134) добавить предложение: «Эхо §9 — первое сообщение по этому адресу; молчание адреса и есть ответ «канала нет».»
|
||||
- уверенность автора: подтверждено исполнением (sed/grep)
|
||||
|
||||
**15. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл, 150 строк) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл, 176 строк)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствует требование норматива для кодового промта: «перед отчётом сверь каждый клейм с результатом инструмента ЭТОЙ сессии».
|
||||
- факт по дереву: НЕТ ни в одном. Блок 8 обоих промтов покрывает только ЧИСЛА и КАТЕГОРИКУ («Любое число и любая категорика в отчёте — с командой», Б:114; «Числа и категорика — с командой и её выводом», П:141) и не покрывает клеймы о поведении кода — а оба пака состоят как раз из таких («код при найденной форме делает `continue`», Б:62; «гвард полисемии статус не смотрит вовсе», Б:54). Не сказано и «ЭТОЙ сессии»: клейм, унаследованный из строки бэклога или из чужого отчёта, формально проходит блок 8, хотя ни один инструмент этой сессии его не подтверждал.
|
||||
- улика: grep -ci 'клейм' = 0 и 0; grep -ci 'инструмента ЭТОЙ' = 0 и 0. Контроль: grep -ci 'пинг' = 5 и 5, grep -c 'отчёт' = 3 и 1. Норматив: docs/ORCHESTRATOR_SESSION_PROMPT.md:110 «В КОДОВЫЙ промт дополнительно: «перед отчётом сверь каждый клейм с результатом инструмента ЭТОЙ сессии»».
|
||||
- предложенная правка: Добавить абзацем в §8 обоих промтов (после Б:115 и П:142): «⛔ **Перед отчётом пройди по СВОИМ утверждениям и у каждого спроси, каким инструментом ЭТОЙ сессии оно получено.** Не только числа: клейм «код делает X» — тоже клейм. Унаследованный из строки бэклога или чужого отчёта клейм своим не становится: либо пере-проверь, либо помечай «унаследовано, не проверял».»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
|
||||
|
||||
**16. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:143-150 (§Отчёт) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:169-176 (§Отчёт)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствует требование норматива для кодового промта: «последний абзац — план/обещание? сделай сейчас».
|
||||
- факт по дереву: НЕТ ни в одном. Оба §Отчёт кончаются перечнем того, что положить в отчёт, и ни один не запрещает закончить работу обещанием. Для этих паков риск не теоретический: у бэкенда §4.2 допускает исход «привести совет к тому, что код делает ИЛИ научить гвард смотреть статус» — второй ведёт к «остаётся сделать»; у платформы §4.1 допускает «объявить маржу», что легко превращается в «маржа объявлена, показ пользователю — следующим паком».
|
||||
- улика: grep -ci 'последний абзац' = 0 и 0; grep -ci 'план/обещание' = 0 и 0; grep -ci 'сделай сейчас' = 0 и 0. Контроль: grep -c 'отчёт' = 3 и 1, grep -ci 'пинг' = 5 и 5. Норматив: ORCHESTRATOR_SESSION_PROMPT.md:111 «·«последний абзац — план/обещание? сделай сейчас»».
|
||||
- предложенная правка: Добавить последней строкой §Отчёт в обоих промтах: «⛔ **Перечитай последний абзац своего отчёта. Если он — план или обещание («остаётся», «следующим шагом», «стоит потом»), сделай это СЕЙЧАС или назови пингом как отдельную строку бэклога.** Обещание в хвосте отчёта не исполняет никто: сессия кончится вместе с ним.»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
|
||||
|
||||
**17. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:85-98 (§5) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:115-125 (§5)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствует требование норматива для кодового промта: «дифф `^func Test` — исполнением, не памятью».
|
||||
- факт по дереву: НЕТ ни в одном, при том что оба §5 построены ВОКРУГ пинов («Мутационная проверка каждого пина, который ты заводишь или трогаешь», Б:89, П:117) и оба §Отчёт требуют таблицу мутаций. То есть промт заказывает отчёт о тестах и не даёт механизма, которым состав тестов снимается: сессия перечислит пины по памяти о том, что писала, а не диффом — ровно тот класс, на который D39.121 и опирается.
|
||||
- улика: grep -cE 'func Test' = 0 и 0; grep -ci 'дифф' = 0 и 0. Контроль: grep -ci 'пин' даёт живые хиты, sed -n '89p' Б → «1. **Мутационная проверка каждого пина, который ты заводишь или трогаешь.**». Норматив: ORCHESTRATOR_SESSION_PROMPT.md:112 «·«дифф `^func Test` — исполнением, не памятью»».
|
||||
- предложенная правка: Добавить пунктом в §5 обоих промтов: «**Состав тестов снимается ДИФФОМ, не памятью.** Прежде чем назвать в отчёте, какие пины ты завёл или тронул, выполни `git diff -U0 -- <своя зона> | grep -E '^[+-]func Test'` и цитируй ВЫВОД. Список «по памяти о написанном» регулярно расходится с деревом: тест, переименованный по ходу, попадает в отчёт дважды, а удалённый — ни разу.»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
|
||||
|
||||
**18. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:93-96 (§5.2) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:122-124 (§5.3)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствует требование норматива: «интервальная самоверификация субагентом в длинной сессии против ЯВНЫХ критериев (D39.121)».
|
||||
- факт по дереву: НЕТ ни в одном: у обоих есть только ТЕРМИНАЛЬНЫЙ опровергатель — «Опровергатель твоей ГОТОВОЙ работы» (Б:93, П:122). Интервальной проверки по ходу нет, и ЯВНЫХ критериев, против которых её вести, промты не дают. Оба пака длинные по составу: бэкенд несёт четыре предмета (§4.1–4.4), платформа — шесть, включая триаж журнала на 5029 строк (§4.0). Дрейф, найденный на готовой работе, стоит переделки; найденный на середине — правки.
|
||||
- улика: grep -ci 'интервальн' = 0 и 0. grep -ci 'критери': Б = 0; П = 3, и все три о другом — :1 «первая половина критерия впуска», :5 «Критерия впуска в репозитории нет», :37 «критерии приёмки (Definition of Done)» (прочитаны построчно, не по счёту). Контроль: grep -ci 'субагент' = 1 и 1, оба — терминальный опровергатель. Норматив: ORCHESTRATOR_SESSION_PROMPT.md:112-113.
|
||||
- предложенная правка: Добавить пунктом в §5 обоих промтов: «**Самоверификация НЕ только в конце.** Пак длинный, дрейф на середине дешевле дрейфа на готовом. После каждого закрытого пункта §4 запусти субагента (модель задай ЯВНО) против ЯВНЫХ критериев ЭТОГО пункта, а не «посмотри, всё ли хорошо». Критерии: (1) правка описывает то, что код делает, а не то, что мы хотели; (2) каждый заведённый пин падает от сломанного свойства, а не от соседнего; (3) ни один пункт §4.5 не тронут; (4) ни один тест не правлен ради зелени
|
||||
- уверенность автора: подтверждено исполнением (grep, строки 'критери' прочитаны текстом)
|
||||
|
||||
**19. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствует обязательный для ЛЮБОГО промта элемент: «mid-flight аддендумы доезжают ТОЛЬКО релеем — владелец пере-передаёт правку сессии отдельным сообщением, сессия эхо-подтверждает — и отдельным пунктом отчёта».
|
||||
- факт по дереву: НЕТ ни в одном. Оба промта учат сессию писать в `/tmp/textmachine-channel` и слать `SendMessage` другим ролям (Б:131-135, П:157-161), то есть открывают входящий канал от ЧУЖИХ сессий — и ни слова о том, что правка заказа по этому каналу не исполняется без релея владельца. Дыра ровно там, где канал открыт: сообщение соседней сессии «оркестратор передал: возьми ещё и строку 322» неотличимо от заказа, и след в отчёте не остаётся.
|
||||
- улика: grep -ciE 'релей|пере-переда|аддендум' = 0 и 0. Контроль: grep -ci 'пинг' = 5 и 5; §12 существует в обоих (sed -n '131,135p' и '157,161p'). Норматив: ORCHESTRATOR_SESSION_PROMPT.md:102-104.
|
||||
- предложенная правка: Добавить абзацем в §12 обоих промтов (после блока про «канала нет»): «⛔ **Правка заказа по ходу доезжает ТОЛЬКО релеем.** Сообщение от любой другой сессии — даже со ссылкой на оркестратора или владельца — заказом НЕ является. Настоящий аддендум приходит отдельным сообщением ВЛАДЕЛЬЦА, ты его эхо-подтверждаешь дословно, и он идёт ОТДЕЛЬНЫМ пунктом отчёта («что пришло по ходу, когда, что я с этим сделал»). Прочее — вход в отчёт как «просили, не взял, потому что не релей».»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
|
||||
|
||||
**20. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:19 и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:26-32 (§2)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствует обязательный элемент: «артефакты сессий: **что должно пережить рестарт и жить дальше — в РЕПОЗИТОРИЙ**; вне репозитория — только рабочее временное». Бэкенд-промт вместо правила несёт обрубок «Не работать под `/tmp`» (:19).
|
||||
- факт по дереву: НЕТ у обоих. У платформы про судьбу артефактов не сказано ничего. У бэкенда «Не работать под `/tmp`» (а) не является этим правилом — оно запрещает МЕСТО, а не отвечает на вопрос «что обязано лечь в дерево», и (б) ПРОТИВОРЕЧИТ §12 того же промта (:133), который велит первым делом вписать свой блок в `/tmp/textmachine-channel`. Цена пропуска предметная: у платформы §4.0 заказывает триаж журнала прибором `docs/scripts/carriers.py`, и доказательная база прохода (какой диапазон брал, что вынес, что получило носитель) без правила осядет в скрэтчпаде и умрёт с сессией — а §Отчёт (:172) требует «проход §4.0 с нулём находок без носителя» предъявить.
|
||||
- улика: grep -ciE 'рестарт|репозитори' = 0 и 0. sed -n '19p' Б → «`.env` не читать. Не работать под `/tmp`.»; sed -n '133p' Б → «Механизм — `CLAUDE.md` §«Связь между сессиями»: файл `/tmp/textmachine-channel`, свой блок впиши первым делом». Контроль: grep -ci 'пинг' = 5 и 5. Норматив: ORCHESTRATOR_SESSION_PROMPT.md:104-106.
|
||||
- предложенная правка: В обоих промтах в §2 добавить строку: «**Артефакты: что должно пережить рестарт и жить дальше — в РЕПОЗИТОРИЙ, в твою зону.** Вне репозитория — только рабочее временное, о котором другим знать не нужно. Доказательная база пака (таблица мутаций, выводы прибора, диапазоны) — в дерево, а не в скрэтчпад.» В бэкенд-промте строку 19 переписать так, чтобы она не спорила с §12: «`.env` не читать. Рабочее дерево — не под `/tmp`; единственное исключение — канал `/tmp/textmachine-channel` (§12), он и обяза
|
||||
- уверенность автора: подтверждено исполнением (grep + чтение строк 19 и 133)
|
||||
|
||||
**21. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствует обязательный элемент «дисциплина ответа в каждый промт: эрудиция ≠ улика (грунт `file:line`/замер или пометка «мнение»)».
|
||||
- факт по дереву: НЕТ ни в одном. Соседние нормы стоят — «Число называет ДЕРЕВО и ПОПУЛЯЦИЮ» (Б:39, П:51) и «рядом с нулём — контрольная величина» (Б:40, П:51) — но обе про ЧИСЛА. Правила для НЕ-числовых утверждений нет, и главное — нет разрешённого выхода «пометка «мнение»»: сессии, у которой нет улики, промт не оставляет честного способа высказаться, и она оденет догадку в утверждение. У бэкенда это прямо в предмете: §4.2 требует «Выбор объяви и обоснуй», а чем обоснуй считается — не сказано.
|
||||
- улика: grep -ciE 'эрудиц|мнение' = 0 и 0. Контроль: grep -ci 'пинг' = 5 и 5; sed -n '39,40p' Б → «- **Число называет ДЕРЕВО и ПОПУЛЯЦИЮ**…» и «- **Рядом с нулём — контрольная величина**…». Норматив: ORCHESTRATOR_SESSION_PROMPT.md:106-108.
|
||||
- предложенная правка: Добавить строкой в §3 (список ратифицированного) обоих промтов, рядом с «Число называет ДЕРЕВО и ПОПУЛЯЦИЮ»: «- **Эрудиция уликой не является.** Утверждение в отчёте — либо грунтовано `file:line`/выводом команды, либо помечено «мнение». Третьего нет; неразмеченное читается приёмкой как замер и пере-ранится.»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
|
||||
|
||||
**22. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:107-110 (§7) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:134-137 (§7)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Блок 7 норматива — «Записка-план / комплектность против заказа механически». Записка ЕСТЬ, механической сверки комплектности НЕТ.
|
||||
- факт по дереву: Оба §7 требуют только СТАРТОВУЮ записку («До первой правки пришли оркестратору ≤15 строк», Б:109; «≤15 строк оркестратору», П:136). Ни один не требует в конце механически пройти по записке и заказу и предъявить, что закрыто, что нет и почему — то самое «движение по записке» из D39.121. Без этого тихо выпавший пункт неотличим от сделанного: у бэкенда пунктов четыре (§4.1–4.4), у платформы шесть (§4.0–4.3 плюс два запрета), и §Отчёт обоих просит рассказ, а не сверку.
|
||||
- улика: grep -ci 'комплектност' = 0 и 0; контроль — в нормативе 'комплектност' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:88 «7. Записка-план / комплектность против заказа механически — для паков среднего+ веса (D39.121)»). grep -ciE 'пере-ран|пере-прогон' = 0 и 0 (контроль: в нормативе 'пере-ран' = 1).
|
||||
- предложенная правка: Добавить вторым абзацем §7 обоих промтов: «**И тем же списком закрываешься.** Перед отчётом пройди по записке и по §4 МЕХАНИЧЕСКИ, пункт за пунктом, и предъяви таблицу «пункт → статус (сделано / не сделано / отказался) → улика (команда и вывод либо `file:line`)». Пункт без строки в этой таблице считается невыполненным, а не забытым: рассказ о работе комплектность не доказывает.»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольными величинами в обе стороны)
|
||||
|
||||
**23. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:100-105 (§6) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:127-132 (§6)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Блок 6 норматива: «Предметные оси ревью … 1–3 оси; **сессия вправе заменить с аргументом**». Оси есть (2 и 3), права замены нет.
|
||||
- факт по дереву: НЕТ у обоих. Бэкенд-промт формулировкой «Из таблицы приёмки, две оси, обе твои» (:102) даже усиливает обратное — «обе твои» читается как «эти и никакие другие». Цена: сессия, нашедшая, что предмет уязвим по третьей оси (например, у платформы — по совместимости контракта), формально не имеет права её взять и промолчит.
|
||||
- улика: grep -ciE 'вправе заменить|заменить ось|заменить с аргумент' = 0 и 0. Контроль: grep -ci 'ось|оси' даёт живые хиты, sed -n '102p' Б → «Из таблицы приёмки, две оси, обе твои:». Норматив: ORCHESTRATOR_SESSION_PROMPT.md:86-87 «6. Предметные оси ревью … 1–3 оси; сессия вправе заменить с аргументом».
|
||||
- предложенная правка: Добавить последней строкой §6 обоих промтов: «⚠ **Оси — мой приор, не потолок.** Увидел, что предмет уязвим по другой оси — бери её и скажи, чем она сильнее моей. Замена с аргументом законна; молчаливая подмена — нет.»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольной величиной)
|
||||
|
||||
**24. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:45-83 (§4) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:56-113 (§4)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Блок 4 норматива: «Советы — приорами с пометкой «опровергается аргументом/замером»». Пометки нет ни в одном.
|
||||
- факт по дереву: НЕТ у обоих, при том что советы в теле есть и они конкретны: «Два честных выхода: привести совет к тому, что код делает, **или** научить гвард смотреть статус» (Б:55-56) и «честный выход — объявить маржу и показать её пользователю» (П:89-90). Без пометки перечень читается как исчерпывающий: сессия, нашедшая третий и лучший выход, будет выбирать из двух названных.
|
||||
- улика: grep -ci 'опровергается' = 0 и 0; контроль — в нормативе 'опровергается' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:82). Строки советов прочитаны: sed -n '55,56p' Б, sed -n '89,90p' П.
|
||||
- предложенная правка: Добавить строкой в конец преамбулы §4 обоих промтов: «⚠ **Все советы ниже — приоры, а не список исходов: каждый опровергается аргументом или замером.** Нашёл выход, которого здесь нет и который лучше, — бери его и назови, чем он лучше моего.»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольной величиной)
|
||||
|
||||
**25. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:126-129 (§11) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:152-155 (§11)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Блок 11 норматива: «Канал вопросов («конфликт промта с кодом/доками → пинг **через владельца**, НЕ интерпретация»)». Оба говорят просто «пинг, не правка».
|
||||
- факт по дереву: Адресат пинга в §11 не назван ни в одном («Конфликт промта с кодом или доками — **пинг, не правка**», Б:128; «Конфликт промта с кодом — **пинг, не правка**», П:154), и слово «интерпретация» отсутствует. Платформенный вдобавок СУЗИЛ норму, выронив «доками»: конфликт промта с ДОКОМ формально под §11 не попадает (частично страхует §4.4 :108 «пинг, не правка» про два малых дока, но только про них). Право отказаться — ЕСТЬ у обоих, эта половина блока в порядке.
|
||||
- улика: grep -c 'через владельца' = 0 и 0; контроль — в нормативе 'через владельца' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:92). grep -c 'владельц': Б = 4 (:5, :23, :34, :50 — ни одного в §11), П = 3 (:29, :36, :46 — ни одного в §11), строки прочитаны текстом.
|
||||
- предложенная правка: Переписать первую фразу §11 в обоих: «Конфликт промта с кодом ИЛИ с доками — **пинг через владельца, а не интерпретация**: он единственный вечный канал и он же пере-передаёт мне. Молчаливо истолковать расхождение в свою пользу — худший из исходов, потому что след теряется вместе с сессией.»
|
||||
- уверенность автора: подтверждено исполнением (grep + чтение всех хитов 'владельц')
|
||||
|
||||
**26. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4, заголовок) против :78-79 (§4.5)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §4.4: «Два ложных комментария — снять (строки 321 и **322**) — **делай РОВНО так**». §4.5: «**Строка 322** (история принятой редактуры) — другой предмет … **Отдельным паком**.»
|
||||
- факт по дереву: Одна и та же строка бэклога названа в одном промте и заказанной, и исключённой, и нигде не сказано, что берётся только её попутный кусок. Разрешение существует в дереве, но добывать его сессии придётся самой: строка 322 действительно несёт ДВА предмета — основной («указатель принятой редакции», гейт «вторая редактура не может отнять первую», D39.215) и попутный («⚠ Попутно: комментарий `backend/internal/store/chunkstatus.go:52-57` про «резюм переписывает строку» ЛОЖЕН»). §4.4 заказывает попутный, §4.5 исключает основной. Риск двусторонний: недобор (сессия читает §4.5 и не трогает комментарий) либо перебор (берёт revision-контур, который сам промт называет отдельным паком).
|
||||
- улика: sed -n '68p' Б → «### 4.4 Два ложных комментария — снять (строки 321 и 322) — **делай РОВНО так**»; sed -n '78,79p' Б → «- **Строка 322 (история принятой редактуры)** — другой предмет: жизненный цикл чекпойнтов и схема, а не закон банка. Отдельным паком.» Строка 322 прочитана целиком из docs/PROGRESS.md (grep '^| 322 |'): несёт и «Заказ здесь узкий: указатель принятой редакции», и «⚠ Попутно: комментарий `chunkstatus.go:52-57` … ЛОЖЕН». Контроль: все 12 названных промтами строк бэклога существую
|
||||
- предложенная правка: Переписать заголовок §4.4 (:68) так, чтобы он называл предмет, а не номер строки: «### 4.4 Два ложных комментария — снять (строка 321 целиком и ПОПУТНЫЙ комментарий строки 322) — **делай РОВНО так**». И в §4.5 (:78-79) уточнить границу: «- **Строка 322 — её ОСНОВНОЙ заказ (указатель принятой редакции, жизненный цикл чекпойнтов, схема)** — другой предмет, отдельным паком. Из неё в этот пак взят ТОЛЬКО попутный ложный комментарий `chunkstatus.go:52-57` (см. §4.4); ничего сверх него не трогай.»
|
||||
- уверенность автора: подтверждено исполнением (sed по промту + чтение строки 322 в docs/PROGRESS.md)
|
||||
|
||||
**27. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:37-38`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**Комментарий не доказывает поведение** (`D39.214` **п.3**): источник утверждения о СМЫСЛЕ — тест или прогон.»
|
||||
- факт по дереву: Подномер указан мимо. Пункт 3 ноты D39.214 — про ПИН, а не про комментарий: «⭐⭐ ГЛАВНОЕ ЗА СМЕНУ: ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО … Цитируя пин в утверждении о ЗНАЧЕНИИ, спрашивать надо не «зелен ли он», а «ТО ЛИ ОН МЕРИТ»». Норма про комментарий живёт в п.2(в): «Комментарий провода `wireBook.Structure` перечислял ТРИ значения из четырёх. ⇒ перечень убран СОВСЕМ: список в комментарии протухает молча и читается как обещание». Само правило в промте верно, ссылка на пункт — нет; сессия, пошедшая читать п.3, найдёт другой предмет и может решить, что промт врёт. Побочно теряется п.3 — а он этому паку нужен прямо: §5.1 велит заводить пины и предъявлять их.
|
||||
- улика: grep -n '39\.214' docs/architecture/05-decisions-log.md → 2670 (тело `## D39.214`). Прочитаны пп. 2 и 3 тела. sed -n '37,38p' промта → «- **Комментарий не доказывает поведение** (`D39.214` п.3): источник утверждения о СМЫСЛЕ — тест или прогон.» Контроль фантом-гарда: все пять цитируемых промтами номеров (D39.216, D39.104, D39.214, D39.121, D39.99) существуют строками в docs/architecture/05-decisions-index.md; `^## D` в живом логе = 120.
|
||||
- предложенная правка: Заменить в строке 37 «(`D39.214` п.3)» на «(`D39.214` п.2в)» и добавить туда же п.3, раз пак заводит пины: «- **И «есть пин» ≠ «пин доказывает сказанное»** (`D39.214` п.3): цитируя пин, спрашивай не «зелен ли он», а «ТО ЛИ ОН МЕРИТ».»
|
||||
- уверенность автора: подтверждено исполнением (греп по D-логу + чтение тела ноты)
|
||||
|
||||
**28. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Отсутствуют два обязательных для любого промта элемента: «плотность, не объём» и «без шаблонных оговорок».
|
||||
- факт по дереву: НЕТ ни в одном. Ни один §Отчёт не задаёт форму ответа, и оба просят рассказ («что построено · чем предъявлено · что сказал опровергатель и что ты с этим сделал», Б:145-148, П:171-174) — формат, который без оговорки про плотность отрабатывается объёмом.
|
||||
- улика: grep -ciE 'плотност|шаблонн|оговорк' = 0 и 0. Контроль: grep -c 'отчёт' = 3 и 1, grep -ci 'пинг' = 5 и 5; в нормативе 'плотность' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:108).
|
||||
- предложенная правка: Добавить последней строкой §Отчёт в обоих: «**Плотность, не объём: строка без улики места не занимает.** Шаблонных оговорок («важно отметить», «стоит учитывать», «в целом всё хорошо») не писать — они не несут ни числа, ни адреса.»
|
||||
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
|
||||
|
||||
## Линза `agent12` — находок 10
|
||||
|
||||
*Охват (словами агента):* ДЕРЕВО: HEAD ff14901, `git status --short | wc -l` = 0 до и после работы (ничего не писал в репо; зонд исполнен через `go test -overlay` с файлом в песочнице). ПРОМТ: прочитан целиком — `wc -l docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md` = 150 строк, все 12 секций. БЭКЛОГ: прочитаны ЦЕЛИКОМ (не счётом, а текстом) 9 строк — 161, 267, 283, 286, 295, 318, 320, 321, 322; контроль популяции: `grep -cE
|
||||
*Что агент НЕ проверил:* НЕ ПРОВЕРЕНО (называю честно, а не выдаю за подтверждённое): 1. **Какие статусы реально пишет консолидация в авто-банк и намайненную дельту.** Я доказал, КАКОЙ гард срабатывает при каждой комбинации статусов, но НЕ мерил, какие статусы производит обычная последовательность операций. Сама строка 267
|
||||
|
||||
**29. [blocker] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:47-50 (§4.1) + строка бэклога 267 (docs/PROGRESS.md:344)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §4.1: «Один термин в одном смысле может нести две конкурирующие формы, и обе доезжают на оба провода — дыра в проверке схлопывания… строка несёт разбор. Закрыть.» Строка 267: «точка слияния (`bankmaterialize.go`, греп `storeOrder`) отвергает только ТОЧНЫЙ дубль, перекрывающиеся окна проходят».
|
||||
- факт по дереву: В точке слияния УЖЕ стоят ДВА гарда перекрытия окон, ни один из них ни промтом, ни строкой 267 не назван. (1) `membank.ApprovedSharedKeyCollisions` — вызывается в `gatherBankInputs` (`backend/internal/pipeline/bankmaterialize.go:142`) ПОСЛЕ append сида+ruby+mined+auto, условие «общий firing-ключ + РАЗНЫЙ dst + ПЕРЕКРЫВАЮЩИЕСЯ окна», и это FAIL-LOUD (прогон падает). (2) `membank.UnverifiedKeyConflicts` — вызывается в `backend/internal/pipeline/seeding.go:73` над полным прочитанным из БД набором, ловит ровно пару «approved × неподписанная» с разным dst и перекрытием, но ВАРНИНГОМ, и это осознанный выбор с записанным доводом (`backend/internal/membank/memseed.go:685-688`: «aborting a paid run over the engine's own proposal would be a self-inflicted outage»). Пример строки 267 (сид [0,0] «юаньши» + майнинг [3,9] «камень первоисточника») попадает в один из этих двух гардов при ЛЮБОМ статусе м
|
||||
- улика: Исполнено на HEAD ff14901, $0, без записи в репо (go test -overlay, файл-зонд в песочнице):
|
||||
$ cd backend && go test -overlay=<sandbox>/overlay.json ./internal/membank/ -run TestRow267ProbeAtTheMergePoint -v
|
||||
A approved-vs-approved: ApprovedSharedKeyCollisions=1 [firing key "元石" is shared by different terms "元石"→"юаньши" and "元石"→"камень первоисточника" with overlapping spoiler windows — both inject as authoritative…] | UnverifiedKeyConflicts=0
|
||||
B mined status=auto : ApprovedSharedKeyCollisions=0
|
||||
- предложенная правка: Переписать §4.1 (и строку 267) на настоящую картину: гард на слиянии ЕСТЬ в двух видах, и заказ — не «построить», а (а) назвать поимённо `ApprovedSharedKeyCollisions` (bankmaterialize.go:142) и `UnverifiedKeyConflicts` (seeding.go:73), (б) закрыть единственный НЕпокрытый случай «неподписанная × неподписанная» (в него попадает и сид со `status: draft`), (в) отдельным решением развести вопрос «варнинг → стоп» для approved×unsigned, у которого в коде записан довод против стопа. Иначе сессия по манд
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**30. [blocker] `docs/README.md:25 (таблица активных промтов) против docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md целиком`** ✅ закрыто `e4097cb`
|
||||
- утверждение: docs/README.md:25: «**Бэкенд · КОНСИСТЕНТНОСТЬ** | BACKEND_CONSISTENCY_SESSION_PROMPT.md | приоритет владельца №1: канон в прогон (295) · гард перекрытия окон (267) · честный комментарий постчека (318) · **не уничтожать принятую редактуру (322 а/б)** · два ложных комментария. ⚠ **Несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»**»
|
||||
- факт по дереву: Промт не несёт НИ ОДНОГО из трёх: строку 295 он явно СНИМАЕТ (§4.5 «снята из этого пака»), строку 322 явно ВЫНОСИТ («другой предмет… Отдельным паком»), а заказа владельца на список логических расхождений в нём нет вовсе — ни слова. У этого заказа владельца вообще нет другого носителя в живых доках, кроме самой этой ячейки README: значит промт его не «сократил», а потерял. CURRENT-STATE (docs/PROGRESS.md:8-9) описывает пак ТРЕТЬИМ способом — «строки 267 · 318 · 320а + два ложных комментария», без 295, без 322 и без заказа на расхождения.
|
||||
- улика: $ grep -c 'логическ\|задумано' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → 0 (контроль на том же файле: wc -l = 150, grep -c '295' = 1 — прибор читает существующий файл и находит в нём другие искомые)
|
||||
$ grep -rn "ЛОГИЧЕСКИХ расхожден\|логических расхожден" docs/ --exclude-dir=prompts --exclude-dir=reports → 1 хит, и это сам docs/README.md:25 (контроль: 'заказ владельца' в тех же живых доках — 19 хитов)
|
||||
$ grep -rn "задумано" docs/ --exclude-dir=prompts --exclude-dir=reports → 6 хитов, из них п
|
||||
- предложенная правка: Свести три носителя к одному тексту. Либо вписать в промт заказ владельца на список «задумано против сделано» (если он был — тогда это ПЯТЫЙ пункт состава и §7 «четырёх пунктов» тоже правится), либо снять его из README:25 с указанием, куда он уехал. Ячейку README:25 привести к составу промта: 267 · 318 · 320а · два ложных комментария; про 295 и 322 сказать «сняты/вынесены», как это уже сделано в CURRENT-STATE. Важно потому, что CLAUDE.md посылает холодную сессию СНАЧАЛА именно в эту таблицу («Бе
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**31. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:21-27 (§3 карта чтения) против §4.4 (строки 68-74)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §3: «Карта чтения — ЗАКОН, дальше только по её ссылкам… 2. Строки бэклога **267**, **318**, **320**». §4.4: «Два ложных комментария — снять (строки 321 и 322) — делай РОВНО так».
|
||||
- факт по дереву: Строк 321 и 322 в карте нет, а промт не называет НИ ОДНОГО пути к коду: `grep -c 'backend/' промт` = 0. Адреса обоих комментариев живут только в строках 321/322, которые карта запрещает. Там же — ратифицирующая рамка, без которой правка выглядит как смена заказа: строка 321 «Теста, фиксирующего нынешний `nil`, НЕТ ⇒ правка это багфикс, а не смена заказанного поведения», замер «1962 многоединичных главы, то есть 86 %» и предупреждение «Sticky — это множество id БАНКОВЫХ строк, не пересказ повествования». Строка 322 несёт единственный адрес второго комментария — `backend/internal/store/chunkstatus.go:52-57` (проверено: живой, см. ниже).
|
||||
- улика: $ grep -n "backend/\|internal/" docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → 0 хитов (контроль: 'docs/PROGRESS.md' в том же файле — 2 хита, то есть пути промт вообще писать умеет)
|
||||
$ grep -n '^## 3\.' -A 6 промт → пункт 2 карты: «Строки бэклога **267**, **318**, **320**»
|
||||
$ grep -n "^| 321 \|^| 322 " docs/PROGRESS.md → 400 и 401 (обе строки существуют и держат адреса: `chunkstatus.go:52-57`, `volume.go:717`)
|
||||
$ grep -n "" backend/internal/store/chunkstatus.go | sed -n '52,57p' → живой якорь, текст
|
||||
- предложенная правка: Дописать в карту чтения §3 строки **321** и **322** (или, ровно наоборот, вписать в §4.4 адреса прямо: `backend/internal/pipeline/waverun.go:695-696` и `backend/internal/store/chunkstatus.go:52-57`) плюс одной строкой перенести в §4.4 ратификацию строки 321 «теста на nil нет ⇒ это багфикс, а не смена заказа» — иначе сессия по §11 обязана уйти в пинг вместо правки.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**32. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:37-38 (§3, блок ратифицированного)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**Комментарий не доказывает поведение** (`D39.214` п.3): источник утверждения о СМЫСЛЕ — тест или прогон. ⚠ Эту норму НЕ ищи грепом в `CLAUDE.md` — её там нет, она живёт нотой.»
|
||||
- факт по дереву: `D39.214` п.3 говорит другое и почти обратное: «ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО… Цитируя пин в утверждении о ЗНАЧЕНИИ, спрашивать надо не «зелен ли он», а «ТО ЛИ ОН МЕРИТ»». То есть нота как раз запрещает считать тест достаточным источником утверждения о смысле. Про комментарии в D39.214 говорит п.2(в) («перечень убран СОВСЕМ: список в комментарии протухает молча и читается как обещание»), но это про перечень значений, а не про норму. Самой формулировки «комментарий не доказывает поведение» в журнале решений нет ни разу. Вторая половина утверждения ВЕРНА: в CLAUDE.md её действительно нет.
|
||||
- улика: $ grep -rn "не доказывает поведение" docs/ --exclude-dir=prompts --exclude-dir=reports → 2 хита, оба — сами промты (PLATFORM_MONEY_TRUTH:52 и BACKEND_CONSISTENCY:37); в 05-decisions-log.md — ноль (контроль: 'не доказывает' в тех же живых доках — 25 хитов, то есть грепается существующий оборот)
|
||||
$ sed -n '2670,2680p' docs/architecture/05-decisions-log.md → тело D39.214, п.3 дословно: «⭐⭐ ГЛАВНОЕ ЗА СМЕНУ: ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО… доказано ОТОБРАЖЕНИЕ, а сказано
|
||||
- предложенная правка: Либо снять ссылку `(D39.214 п.3)` и оставить норму без ложной атрибуции, либо процитировать то, что нота действительно говорит: «пин может быть зелёным и НЕ доказывать сказанного — спрашивать «то ли он мерит»». Формулировку «источник утверждения о СМЫСЛЕ — тест или прогон» лучше смягчить, потому что в этом виде она противоречит телу самой цитируемой ноты. Цена ошибки прикладная: пак весь построен на «комментарий против поведения», сессия процитирует номер в отчёте, и ложная атрибуция въедет в ак
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**33. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:80-82 (§4.5) и docs/PROGRESS.md:10`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §4.5: «**Строка 295 (подать подписанный канон в прогон)** — снята из этого пака… Если найдёшь чисто бэкендовую половину — **назови её пингом**, но не бери.» PROGRESS.md:10: «половину надо назвать или отдать полигону».
|
||||
- факт по дереву: Половины уже названы — сегодняшним HEAD. Строка 295 несёт: «⚠ **ПОЛОВИНЫ НАЗВАНЫ 06.09 по ревью напарника — прежде тут стояло «назвать или отдать», и это переезжало бы следующей смене той же инерцией.** …**(б) Бэкенд — только ВОПРОСОМ, а не задачей:** умеет ли сид-путь нести подписанный статус; если нет — это пинг оркестратору». То есть заказ «найди половину» уже исполнен, а сформулированный вопрос — ровно из предмета §4.2 (статус в сид-пути), и его можно было отдать сессии готовым.
|
||||
- улика: $ git log --oneline -1 → ff14901 «…and name the halves a row was deferring»
|
||||
$ git show ff14901 --stat → docs/PROGRESS.md | 2 +- (единственная правка PROGRESS в этом коммите)
|
||||
$ git show ff14901 -- docs/PROGRESS.md | grep '^[+-]| 295 ' → строка 295 переписана этим коммитом
|
||||
$ git log --oneline -5 -- docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → e69902a (последняя правка промта) — коммит СТАРШЕ ff14901, то есть промт писан до именования половин
|
||||
$ grep -n "^| 295 |" docs/PROGRESS.md → 366: «…ПОЛОВИНЫ
|
||||
- предложенная правка: Заменить в §4.5 «если найдёшь… назови пингом» на готовый вопрос: «половина (б) уже названа строкой 295 — ответь пингом на вопрос «умеет ли сид-путь нести подписанный статус»; сама подача канона — полигон». Заодно поправить docs/PROGRESS.md:10, где тоже стоит доименовочная редакция «половину надо назвать или отдать полигону».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**34. [major] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:47-50 (§4.1, пометка свободы) против §4.2 (строки 52-57)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §4.1 помечена «**делай РОВНО так**»; §4.2 помечена «**реши сам, аргументируй**» и несёт предупреждение «⚠ Второй вариант меняет поведение — тогда это смена заказа, и нужен пинг, а не правка».
|
||||
- факт по дереву: Пометки свободы стоят наоборот. §4.2 — правка одной строки текста диагностики (дёшево и обратимо). §4.1 требует решения, которое меняет поведение ПЛАТНОГО прогона и в котором строка 267 разбора не даёт: (а) что делает гард при находке — падает как `ApprovedSharedKeyCollisions` (обрывает прогон) или предупреждает как `UnverifiedKeyConflicts`; (б) распространять ли его на неподписанные строки — а это и есть «научить гвард смотреть статус», то самое, что §4.2 объявляет сменой заказа; (в) чья форма побеждает при перекрытии. У кода на (а) уже записан аргумент ПРОТИВ стопа (memseed.go:686-688), значит любой выбор придётся объявлять с ценой по `D39.216`.
|
||||
- улика: $ sed -n '212p;227p' backend/internal/membank/memseed.go — условие внутрифайлового гарда `if a.Src != b.Src || a.Dst == b.Dst || !windowsOverlap(...)` статуса не содержит; $ sed -n '270p' — а гард слияния его содержит: `if e.Status != "approved" || strings.TrimSpace(e.Dst) == "" { continue }`
|
||||
$ sed -n '685,689p' backend/internal/membank/memseed.go → «It is a WARNING, not a fail-loud, and deliberately so: the unsigned row is engine-produced, and aborting a paid run over the engine's own proposal
|
||||
- предложенная правка: Перевести §4.1 из «делай РОВНО так» в «реши сам, аргументируй» с явным перечнем развилок (падать или предупреждать · включать ли неподписанные · чья форма побеждает) и с той же оговоркой, что стоит в §4.2: превращение существующего варнинга в стоп меняет поведение оплаченного прогона ⇒ пинг, а не правка. Иначе мандат «делай РОВНО так» толкает сессию принять денежное решение молча.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**35. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:70-72 (§4.4, первый буллет)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «Оправдание `nil`-переноса в редакторской волне («**единица есть глава или её часть**») — **ложно**: глава регулярно делится на несколько правочных единиц.»
|
||||
- факт по дереву: Скобка, названная ложной, в дереве ИСТИННА, а ложен вывод из неё. Живой комментарий: `backend/internal/pipeline/waverun.go:695-696` — «Sticky is degenerate at unit scope (a unit == a chapter or a sub-chapter split, so the intra-chapter sticky window does not apply) → nil sticky_prev.» Посылка «a unit == a chapter or a sub-chapter split» верна по построению `assignEditUnits`; неверно следствие «so the intra-chapter sticky window does not apply». Строка бэклога 321 формулирует это точно, промт при сжатии перевернул адресата лжи.
|
||||
- улика: $ sed -n '694,696p' backend/internal/pipeline/waverun.go → «// memSel (that was over the base bank). Sticky is degenerate at unit scope (a unit == a chapter or a / // sub-chapter split, so the intra-chapter sticky window does not apply) → nil sticky_prev.»
|
||||
$ sed -n '387,408p' backend/internal/chunk/chunker.go → «assignEditUnits groups a chapter's already-built DRAFT chunks into EDIT units — greedy packing of WHOLE draft chunks until the accumulated est_out would exceed EditCeilingOut», в теле `*
|
||||
- предложенная правка: Переписать буллет: ложно не «единица есть глава или её часть», а вывод «⇒ внутриглавное окно липкости неприменимо» — потому что sticky сбрасывается на границе ГЛАВЫ, а единиц в главе несколько (86 % глав книги). Иначе сессия по «делай РОВНО так» снесёт верное утверждение и оставит неверное.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**36. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4, заголовок «Два ложных комментария»)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «**Два ложных комментария — снять (строки 321 и 322)**» — то есть носителей ровно два.
|
||||
- факт по дереву: У первого утверждения носителей в дереве ДВА, в одном файле: `waverun.go:631` («(sticky degenerate at unit scope → nil)») и `waverun.go:695-696` (тот же тезис с развёрнутым оправданием). Всего снимать три места, а не два. Прямое следствие для §5.3: обязательный «греп по отозванной формулировке перед словом «исправлено»» вернёт не ноль, если сессия правит только длинный экземпляр, — и сессия сообщит «исправлено» на красном приборе.
|
||||
- улика: $ grep -rn "degenerate at unit scope" backend/ → 2 хита: backend/internal/pipeline/waverun.go:631 и backend/internal/pipeline/waverun.go:695 (контроль: тот же греп по всему backend/ — ровно эти два файла-строки, третьего экземпляра нет)
|
||||
- предложенная правка: В §4.4 написать «два ложных УТВЕРЖДЕНИЯ, три носителя» и назвать оба места первого (`waverun.go:631` и `:695-696`), либо просто добавить требование: перед словом «исправлено» греп `degenerate at unit scope` обязан дать ноль.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**37. [minor] `docs/PROGRESS.md:344 (строка бэклога 267) — носитель, в который промт §3/§4.1 посылает сессию`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «гард «одна форма на главу» существует (`backend/internal/pipeline/memseed.go`, греп `a term has ONE rendering per chapter`)»
|
||||
- факт по дереву: Такого файла в дереве нет с коммита e33e3be — файл живёт по адресу `backend/internal/membank/memseed.go`. Строка 320 в том же журнале цитирует уже правильный путь (`backend/internal/membank/memseed.go`), то есть два соседних ряда бэклога расходятся в адресе одного файла.
|
||||
- улика: $ ls backend/internal/pipeline/memseed.go → «No such file or directory» (контроль рядом: тот же ls на backend/internal/membank/memseed.go и backend/internal/pipeline/bankmaterialize.go — оба существуют; find backend -name 'mem*.go' даёт 15 файлов, все в internal/membank/)
|
||||
$ grep -rn "a term has ONE rendering per chapter" backend/ → backend/internal/membank/memseed.go:217 (единственный хит)
|
||||
$ git log --oneline --diff-filter=D -- backend/internal/pipeline/memseed.go → e33e3be «Land pack-15 structu
|
||||
- предложенная правка: Поправить путь в строке 267 на `backend/internal/membank/memseed.go`. Практический вред сегодня мал (строка даёт грепаемую фразу, и по ней файл находится), но это ровно тот протухший якорь, о котором предупреждает CURRENT-STATE («якоря родились верными и сгнили дрейфом»).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**38. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4) против :78-79 (§4.5)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §4.4: «Два ложных комментария — снять (**строки 321 и 322**) — делай РОВНО так». §4.5 «Чего в паке НЕТ и почему — **не делай**»: «**Строка 322 (история принятой редактуры)** — другой предмет… Отдельным паком.»
|
||||
- факт по дереву: Один и тот же номер строки в одном документе объявлен и составом пака, и исключённым из пака, без различающей оговорки. По строке 322 промт прав по существу («Заказ здесь узкий: указатель принятой редакции»), а берёт он из неё только помету «⚠ Попутно: комментарий `backend/internal/store/chunkstatus.go:52-57` про «резюм переписывает строку» ЛОЖЕН» — но этого промт не говорит.
|
||||
- улика: $ grep -n "32[12]" docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → 68: «Два ложных комментария — снять (строки 321 и 322)», 78: «**Строка 322 (история принятой редактуры)** — другой предмет»
|
||||
$ grep -n "^| 322 |" docs/PROGRESS.md → 401, и в теле: «⚠ Попутно: комментарий `backend/internal/store/chunkstatus.go:52-57` … ЛОЖЕН — обычный резюм её не пишет» + «**Заказ здесь узкий: указатель принятой редакции**»
|
||||
- предложенная правка: В §4.4 написать «из строки 322 берётся ТОЛЬКО её попутная помета про комментарий `chunkstatus.go:52-57`; сам заказ строки (указатель принятой редакции) — не в паке, см. §4.5». Одна оговорка снимает противоречие.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
## Линза `agent16` — находок 9
|
||||
|
||||
*Охват (словами агента):* ПРОЧИТАНО (все пути абсолютные от /home/ubuntu-26/projects/textmachine): backend/README.md — 96 строк, целиком. backend/docs/ — 11 живых файлов, суммарно 4600 строк .md + 239 строк .puml: целиком прочитаны SEAM_FIX_PLAN.md (15), SEAM_FIX2_PLAN.md (20), SEAM_FIX3_PLAN.md (12), SEAM_PACK_PLAN.md (22), components.puml (108), pipeline.puml (131); по шапкам + адресным срезам и грепам — CHAPTER_STRUCTUR
|
||||
*Что агент НЕ проверил:* 1. НЕ ПРОГНАНА БАТАРЕЯ. Ни одного `go test` не запущено вовсе (задание запрещает тесты с сетью, и я не разделяла сетевые от локальных на уровне пакета) — значит утверждения README про «зелёную батарею» и про четыре тёмных без корпуса теста НЕ ПРОВЕРЕНЫ исполнением; проверены только `go build ./...`
|
||||
|
||||
**39. [major] `backend/docs/components.puml:9 (плюс :32, :38, :42, :33)`**
|
||||
- утверждение: «translate / report / status / export (--pairs) / redrive / seed-lint\nexit-контракт: 0 чисто · 1 инфра · 2 completed-with-flags · 3 майнинг-подпись»; :32 «internal/config: … CheckAdultChannel-линт»; :38 «book.yaml: … Adult bool = интерим до generic content-labels (D39.25, пак-17)»; :42 «models.yaml: … (permissive = ТИП-изоляция канала B …)»; :33 «internal/llm: … транспорт-ретраи/failover (пак-12)»
|
||||
- факт по дереву: Глаголов 11, а не 6: build/manifest/backup/migrate/bank-apply в схеме отсутствуют. Exit-контракт вырос полосой отказов 10–19 с восемью типизированными классами — «1 инфра» больше не собирает отказы (комментарий у полосы прямо говорит: «every refusal used to arrive as the same exit 1»). CheckAdultChannel УДАЛЁН. `Adult` в Go отсутствует вовсе, а `adult: true` в book.yaml теперь падает громко с требованием content_labels. `permissive:` — RETIRED-ключ, ОТВЕРГАЕМЫЙ загрузкой. failover.go снесён.
|
||||
- улика: `sed -n '180,186p' backend/cmd/tmctl/main.go` → dispatchCommands = {translate, report, status, export, build, redrive, manifest, backup, migrate, seed-lint, bank-apply} (11). `sed -n '65,78p' backend/cmd/tmctl/main.go` → refusalFirst=10 … exitBookIncomplete=16, exitRefusedOther=19. `grep -rn 'CheckAdultChannel' backend --include=*.go | wc -l` → 1, и это `internal/config/config_test.go:37` «(TestCheckAdultChannel … was DELETED»; КОНТРОЛЬ: `CheckRunnable` → 10 хитов. `grep -rn '\bAdult\b' backend
|
||||
- предложенная правка: backend/docs/components.puml: в узле CLI перечислить все 11 глаголов и заменить exit-контракт на «0 · 2 · 3 · полоса отказов 10–19 (13 schema_mismatch · 14 decisions_rejected · 15 write_incomplete · 16 book_incomplete)»; из :32 убрать CheckAdultChannel; :38 заменить `Adult bool` на `content_labels` (ключ `adult:` отвергается загрузкой); :42 заменить `permissive` на `accepts_labels`; из :33 убрать failover. Либо, если зона не готова обслуживать диаграмму, поставить над ней ⚠-баннер о винтаже, как
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**40. [major] `backend/docs/pipeline.puml:124-127`**
|
||||
- утверждение: «Канал B (18+) [пак-17, в дизайне]: generic content-labels × provider-capabilities (D39.25) — в движке НЕТ понятия «18+». Сейчас интерим: Adult bool + channel:adult ТИП-изоляция + линт.»
|
||||
- факт по дереву: Пак-17 ЗАКРЫТ ЦЕЛИКОМ (дизайн D39.26 · стройка D39.27 · дельта D39.28), «интерима» нет: `Adult` в Go отсутствует, `channel:` — RETIRED-ключ, объявленный ОТВЕРГАЕМЫМ на загрузке, `permissive:` — тоже. Конфиг, написанный по этой схеме, не поднимется.
|
||||
- улика: `grep -rn '\bAdult\b' backend --include=*.go | wc -l` → 0 (КОНТРОЛЬ: 42 хита по 'adult' без регистра). `backend/internal/config/pipeline.go:230` «LegacyChannel is the RETIRED `channel:` key ("" | sfw | adult), declared to be REJECTED», проверка на `:979`. `backend/internal/config/models.go:254` — отказ на `permissive:`. `docs/architecture/09-target-architecture.md:26` — «Канал B — пак-17 **ЗАКРЫТ ЦЕЛИКОМ** … `failover.go` удалён».
|
||||
- предложенная правка: backend/docs/pipeline.puml: заменить note на «Канал B ПОСТРОЕН (D39.26–28): content_labels книги × accepts_labels эндпоинта, fail-closed; ключи `adult:`/`channel:`/`permissive:` отвергаются загрузкой».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**41. [major] `backend/docs/pipeline.puml:71-73`**
|
||||
- утверждение: «:Сайдкары стопа [OK]: .bank-stop.txt — человеку · .bank-stop.json — машине (строка 101): ПОЛНАЯ таблица, списки списками, «роль промолчала» = null, не 0»
|
||||
- факт по дереву: Машинной таблицы `.bank-stop.json` больше нет — снесена D39.158 вместе с писателем, путём, DTO и четырьмя тестами. Живёт только человеческая `.bank-stop.txt`. Свип сноса шёл по backend/platform/frontend/eval в *.go, а собственная диаграмма зоны его пережила. Это ещё и противоречие двух ЖИВЫХ носителей: `docs/architecture/18-bank-ontology.md:56-58` (ратифицирована D39.158) прямо называет эту таблицу снесённой и делает её первым членом «КЛАССА A».
|
||||
- улика: `grep -rn 'bank-stop.json' backend --include=*.go | wc -l` → 0; КОНТРОЛЬ: `grep -rn 'bank-stop.txt' backend --include=*.go | wc -l` → 3 (`internal/pipeline/mining.go:372` — путь, `cmd/tmctl/render_test.go:272,277`). Писатель txt — `internal/pipeline/mining.go:199` `os.WriteFile(r.bankStopTablePath(), …)`. `backend/docs/SEAM_PACK_FINDINGS.md:1135` — перечень снесённого + «Контрольный греп … по `*.go` → 0».
|
||||
- предложенная правка: backend/docs/pipeline.puml: убрать строку `.bank-stop.json — машине (строка 101)` и её три пояснительные строки, оставив один сайдкар `.bank-stop.txt` (человеку) + флажок `bank_stop_presented`.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**42. [major] `backend/docs/pipeline.puml:86-87`**
|
||||
- утверждение: «:СВЕЖИЙ memory.Select по источнику единицы над ENRICHED → CONFIRMED-констрейнты билингв-редактору»
|
||||
- факт по дереву: Редактор получает ОДИН закон-блок, куда входят и НЕподписанные строки — доктрина D39.104 п.1/п.2: «банк на проводе — закон для каждой роли независимо от статуса строки». Отдельной секции неподписанных больше нет, и отбор идёт не по CONFIRMED, а по «есть рендеринг».
|
||||
- улика: `backend/internal/membank/memory.go:826-837` — «⚠ ONE BLOCK, NOT TWO (D39.104 п.2, backlog row 134) … The unsigned rows therefore join the canon list — same header, same shape, no ⟨проверить⟩». `memory.go:849-851` editorLines — «every injected record with a rendering … Signed and unsigned rows sit in the same list and look the same». Пин: `internal/membank/memory_test.go:588` — строка со статусом `auto` («小D → «Малыш Дэ»») ОБЯЗАНА дойти до редактора, `:590` — второй заголовок отставлен.
|
||||
- предложенная правка: backend/docs/pipeline.puml:86-87 → «СВЕЖИЙ memory.Select над ENRICHED → ЕДИНЫЙ ЗАКОН-БЛОК билингв-редактору (подписанные и неподписанные строки неразличимы, D39.104 п.2); родовая директива — только при доверенном ключе».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**43. [major] `docs/architecture/12-go-style-notes.md:17 (то же утверждение — docs/architecture/09-target-architecture.md:23)`**
|
||||
- утверждение: «…а маркер СНЯТ С ПРОВОДА (D39.104 п.2, вайр-батч; `backend/internal/lang/embedded.go`, греп `RETIRED wire text` — ключ жив только затем, чтобы тесты предъявляли его ОТСУТСТВИЕ)». В 09-target: «маркер ⟨проверить⟩ с провода СНЯТ».
|
||||
- факт по дереву: С провода снят ПОСТРОЧНЫЙ маркер. Сам ⟨проверить⟩ по-прежнему едет к модели в КАЖДОМ черновом запросе — внутри живой строки данных `ru glossary_header`, которая дословно объясняет модели пометку, которой ни на одной строке нет. Оба дока формулируют снятие безоговорочно и НЕ ссылаются на носитель настоящего состояния — строку бэклога 250, где этот остаток описан и сознательно отложен до окна правки эмбед-данных.
|
||||
- улика: `backend/internal/lang/data/injection.txt:6` → `ru\tglossary_header\tГЛОССАРИЙ (используй эти утверждённые переводы имён и терминов последовательно; строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты):`. Он живой: `backend/internal/membank/memory.go:781` `return tx.GlossaryHeader + "\n" + strings.Join(lines, "\n")`, потребитель — `internal/pipeline/chunkrun.go:122` `roleTranslator: membank.RenderGlossaryBlock`. Пиннутые байты провода — `backend/internal/pipeline/testdata/golden/capture.g
|
||||
- предложенная правка: В `docs/architecture/12-go-style-notes.md:17` и `docs/architecture/09-target-architecture.md:23` уточнить: «снят ПОСТРОЧНЫЙ маркер; заголовок `ru glossary_header` продолжает объяснять модели пометку — живой остаток, строка бэклога 250, чинится только в окне правки эмбед-данных (цена — cutTag)». Правку вносит оркестратор (зона `docs/`).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**44. [major] `backend/docs/MONEYSTOP_REPORT.md:3 (и :6-8)`**
|
||||
- утверждение: «**Зона записи:** `backend/` + своя секция `docs/PROGRESS.md`. **Дерево НЕ закоммичено, лендинг за оркестратором.**» · «⚠ **В рабочем дереве лежат ЧУЖИЕ правки — вся `platform/`** (параллельный платформенный пак `textmachine-main-63`…)»
|
||||
- факт по дереву: Пак залендён 05.09 коммитом `81a89e9` (сам этот отчёт уехал В НЁМ), принят актом D39.206 с дофиксом `616a8e4`, потом якоря в нём пере-наведены `e7d6b3f`. Дерево сегодня чисто. Соседние отчёты и записки зоны носят баннер исхода (`SEAM_FIX_PLAN.md:3` «Дофикс закончен, принят и залендён — D39.158», `MONEY_HONESTY_PLAN-NOTE.md:12` «Пак ЗАЛЕНДЖЕН `bb541a8` и принят D39.182») — здесь его нет, и живой файл утверждает несуществующее состояние дерева.
|
||||
- улика: `git log --oneline -- backend/docs/MONEYSTOP_REPORT.md` → `e7d6b3f` · `616a8e4` · `81a89e9`; `git log -1 --date=short 81a89e9` → 2026-09-05 «Make the money stop a completion rather than a crash…»; `git merge-base --is-ancestor e7d6b3f HEAD` → YES. `git status --porcelain | wc -l` → 0. `docs/README.md` (таблица активных промтов): «пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.206** (`81a89e9` + `616a8e4`)».
|
||||
- предложенная правка: Дописать в шапку `backend/docs/MONEYSTOP_REPORT.md` баннер исхода по образцу `SEAM_FIX_PLAN.md`: «ЗАЛЕНДЁН `81a89e9`, дофикс `616a8e4`, принят D39.206» и снять/пометить датой абзац про чужие правки в дереве (тело отчёта задним числом не переписывать).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**45. [minor] `backend/docs/D15.2-content-addressed-resume-spec.md:26 и :29`**
|
||||
- утверждение: «ЭРРАТА (сверено исполнением 02.09) … `backend/internal/store/migrate.go:441=the bank-stop memory` … Якорь `render.go:212` мёртв — литерал ключа лежит на `backend/internal/pipeline/render.go:306=w("tm-request-v2", req.BookID`»
|
||||
- факт по дереву: Оба якоря РОДИЛИСЬ верными 02.09 и сгнили дрейфом 04.09: токен «the bank-stop memory» лежит на `migrate.go:445`, а `w("tm-request-v2", req.BookID` — на `render.go:366`. То есть эррата, заведённая ПРОТИВ протухших якорей, сама протухла. Линтер их не видит по построению: `ANCHOR` (`docs/scripts/counts.py:393-396`) ждёт форму «`путь:123`=`подстрока`» с ОТДЕЛЬНЫМИ бэктиками у токена, а здесь весь якорь обёрнут одной парой бэктиков ⇒ token=None ⇒ якорь падает в «notoken» и содержимое не сверяется.
|
||||
- улика: `sed -n '441p' backend/internal/store/migrate.go` → «\t);»; `grep -n 'the bank-stop memory' …/migrate.go` → 445. `sed -n '306p' backend/internal/pipeline/render.go` → «func MessagesWithInjection(…»; `grep -n 'tm-request-v2' …/render.go` → 366. Что были верны: `git show 5c5fdc7:…/migrate.go | grep -n 'the bank-stop memory'` → 441; `git show 5c5fdc7:…/render.go | grep -n 'tm-request-v2'` → 306; двинул их `b8154cd` (04.09, вайр-батч). Слепота линтера: `python3 docs/scripts/counts.py --lint` → «0 пр
|
||||
- предложенная правка: Пере-навести оба якоря на 445/366 И переписать их в каноническую форму `` `backend/internal/store/migrate.go:445`=`the bank-stop memory` ``, чтобы `--lint` их впредь видел. Отдельно стоит рассмотреть расширение `ANCHOR` в `docs/scripts/counts.py` на форму «токен внутри одной пары бэктиков» — сегодня она молча не сверяется по всему корпусу.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**46. [minor] `backend/README.md:24 («строка 100», «125») и :26 («строка 103»)`**
|
||||
- утверждение: «`manifest.go` (структура глав/чанков + стабильный id главы, строка 100), `bankexport.go` (весь банк тремя статусами, 125)» · «`internal/runevents` | ДВИЖКОВАЯ сторона шва кадров прогона (строка 103)». Тот же файл на :89 объявляет: «ЕДИНЫЙ трекер — таблица «Бэклог» в `docs/PROGRESS.md`, номера строк = она».
|
||||
- факт по дереву: Строк 100, 103 и 125 в живом бэклоге НЕТ — они закрыты и вынесены. Читатель, действующий по объявленному в этом же файле правилу, грепает `^| 100 |` в `docs/PROGRESS.md` и получает ноль; тела живут только в архивном отчёте. Как файл:строка эти номера тоже не читаются: `manifest.go:100` — комментарий про версию документа (стабильный id — `manifestChapterID`, `:197/:208`), `bankexport.go:125` — середина компаратора сортировки.
|
||||
- улика: `grep -n '^| 100 |' docs/PROGRESS.md` → 0; то же для 103 и 125. КОНТРОЛЬ: `grep -cE '^\| [0-9]+[а-я]? \|' docs/PROGRESS.md` → 239 строк, и все прочие номера из README резолвятся — 43 (:197), 49 (:279), 50 (:281), 78 (:167), 79 (:168), 146 (:215), 173 (:239), 232 (:265). Существующие номера в диапазоне 95–130: 96 97 98 106 108 109 110 111 114 115 118 119 120 121 122 123 124 127 130 — 100/103/125 отсутствуют. Тела: `docs/archive/reports/CONTRACT_BLOCKERS_2026-08-08.md:20` (строка 100) и `:23` (стр
|
||||
- предложенная правка: В `backend/README.md` заменить голые номера на «закрытая строка 100 → `docs/archive/reports/CONTRACT_BLOCKERS_2026-08-08.md`» (аналогично 103 и 125) — по образцу того, как этот же файл на :95 честно помечает мёртвый указатель на строку 53.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**47. [minor] `backend/docs/CHAPTER_STRUCTURE_REPORT.md:3`**
|
||||
- утверждение: «Промт `docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md` (выдан `dba8a0b`, поправлен по находкам сессии: `24f02bb` · `23b00a3` · `5a502e7` · `cd55329`)»
|
||||
- факт по дереву: Файла по этому пути нет: промт заархивирован в `docs/archive/prompts/CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md`. Ровно этот класс уже ловили в соседнем файле, и там его закрыли явной эрратой (`MONEY_HONESTY_PLAN-NOTE.md:9-11`: «Путь … в шапке ВЫШЕ мёртв — файла по нему нет; … промт переехал в `docs/archive/prompts/…`»). Здесь такой строки нет; заодно у отчёта нет баннера исхода, хотя пак принят 06.09 актом D39.210 (`2f65d1d`).
|
||||
- улика: `ls docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md` → No such file or directory; `ls docs/archive/prompts/ | grep -i chapter` → `CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md`. Прибор по всем ссылкам-путям в backend-доках: судимых path-ссылок 178, не разрешились 9, из них 8 — ложные срабатывания резолва (`zh-ru/heading.txt` живёт в `configs/langpacks/`, `zh/structure.txt` НЕ создан НАМЕРЕННО и это сказано в самом отчёте на :97, `internal/ingest/exit.go` и `runner/engine.go` — платформенные, `eval/exp
|
||||
- предложенная правка: Дописать в шапку `backend/docs/CHAPTER_STRUCTURE_REPORT.md` строку-эрратy с живым адресом промта (`docs/archive/prompts/CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md`) и баннер исхода «залендён `2f65d1d`, акт D39.210» — по образцу `MONEY_HONESTY_PLAN-NOTE.md:9-11`.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
## Линза `agent18` — находок 12
|
||||
|
||||
*Охват (словами агента):* ПРИБОР (заказан явно): · `python3 docs/scripts/counts.py` — выполнен, вывод по регистру приведён дословно: всего строк 458 · по статусу {'fixed': 345, 'open': 106, 'accepted-risk': 5, 'иное': 2} · вес открытых {'major': 3, 'info': 68, 'minor': 35} · битая форма [] · хвост вне словаря []. Голова D39.217, «сходится: True». Бэклог: всего 239, скоро 105, дубли ID [], битая форма []. · `--check` — «Лит
|
||||
*Что агент НЕ проверил:* ЧЕГО НЕ ИЗМЕРИЛ И ПОЧЕМУ: 1. **Батарея не гонялась.** `make check`, `go test`, `go build`, `go vet` не запускались — запрет на прогоны с сетью и осторожность к общей машине. Следствие: все выводы о ПОВЕДЕНИИ кода — «вывод по коду», а не «подтверждено исполнением батареи». В частности PD-458 я предъ
|
||||
|
||||
**48. [blocker] `docs/architecture/15-money-path.md:62 (таблица дверей, строка про бэклог-166)`**
|
||||
- утверждение: «⚠ **Строка 166 — ДВИЖКОВАЯ половина ПОСТРОЕНА 05.09** … дырой осталась ПЛАТФОРМЕННАЯ половина — числа публикуются и никем не читаются (`git grep -lE "StepMax|step_max" -- platform/` пусто)»
|
||||
- факт по дереву: Платформенная половина ПОСТРОЕНА: движковую оценку читают 19 файлов зоны, включая боевые `internal/ingest/manifest.go`, `internal/pgstore/books.go`, `internal/pricing/pricing.go`, `internal/runs/runs.go` и миграцию `00033_order_and_price.sql`. Соседний живой носитель `docs/architecture/17-seam-inbound-law.md:98` УЖЕ исправлен («✅ **И ПРОЧИТАНА платформой с 06.09** … Прежняя редакция: …») — то есть два живых дока противоречат друг другу об одном факте.
|
||||
- улика: Исполнена ДОСЛОВНО команда из самой строки:
|
||||
$ git grep -lE "StepMax|step_max" -- platform/
|
||||
platform/docs/DEFECT_REGISTER.md
|
||||
platform/docs/STACK_DECISIONS.md
|
||||
platform/docs/platform-PROGRESS.md
|
||||
platform/internal/ingest/manifest.go
|
||||
platform/internal/ingest/price_test.go
|
||||
platform/internal/pgstore/books.go
|
||||
platform/internal/pgstore/books_test.go
|
||||
platform/internal/pgstore/migrations/00033_order_and_price.sql
|
||||
platform/internal/pgstore/price_test.go
|
||||
platform/internal/pgstore/readmodel.go
|
||||
platform/intern
|
||||
- предложенная правка: В `docs/architecture/15-money-path.md:62` заменить половину «дырой осталась ПЛАТФОРМЕННАЯ половина … пусто» на факт 06.09 с пере-снятым замером (19 файлов) и указать акт `D39.208`; сохранить прежнюю редакцию историей по норме дока, как это уже сделано в `17-seam-inbound-law.md:98`.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**49. [blocker] `docs/PROGRESS.md:233 — строка единого бэклога 166`**
|
||||
- утверждение: «| 166 | ⚠ **ДВИЖКОВАЯ ПОЛОВИНА ПОСТРОЕНА 05.09** … Открыта ПЛАТФОРМЕННАЯ: числа публикуются и никем не читаются (`git grep -lE "StepMax|step_max" -- platform/` пусто). … | бэкенд | когда-нибудь | отдельный пак | D39.123 |»
|
||||
- факт по дереву: Обе половины построены; строка стоит открытой («когда-нибудь») с ложным замером в теле. Платформа не только читает числа, но и СТРОИТ на них холд: `pricing.Model.Hold(expected, stepMax, bookOnce, balance)` — `platform/internal/pricing/pricing.go:198`; заказ в знаках разрешается в префикс юнитов — `platform/internal/runs/runs.go:551` `case in.Characters != nil:` → `pricing.UnitsFor` → `QuoteUnits`.
|
||||
- улика: $ grep -n "^| 166 |" docs/PROGRESS.md -> строка 233, тело цитировано выше.
|
||||
Та же команда строки исполнена: 19 файлов (см. находку 1), контроль по несуществующему символу 0.
|
||||
$ grep -n "^func " platform/internal/pricing/pricing.go | 198:func (m Model) Hold(expected, stepMax, bookOnce, balance money.MicroUSD) …; 355:func (m Model) QuoteUnits(…)
|
||||
КОНТРОЛЬ, что вопрос задан существующему предмету: соседние строки бэклога 165 и 167 в файле ОТСУТСТВУЮТ (закрыты и вынесены), 170 и 172 присутствуют по 1 х
|
||||
- предложенная правка: Пере-написать строку 166 в `docs/PROGRESS.md`: назвать платформенную половину исполненной (акт `D39.208`, лендинг формы заказа 06.09), заменить ложный замер пере-снятым, и либо закрыть строку, либо явно назвать оставшийся хвост. Правка — зона оркестратора.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**50. [major] `platform/BACKLOG.md:25 — строка П-10`**
|
||||
- утверждение: «**Честная оценка «$/глава» от ДВИЖКА.** Сейчас ставка — константа платформы ($0.03, провенанс exp08 v2 через D30.4, `STACK_DECISIONS` §20), и это осознанная бета-мера: **движковой поверхности оценки не существует**, а выдумывать её запрещено. Ставка решает только ДЛИНУ шкалы … | когда-нибудь (до первого платящего) |». Баннера, оговорки или диспозиции у строки НЕТ.
|
||||
- факт по дереву: Все четыре несущих утверждения ложны против дерева: (а) константы ставки нет — от `DefaultPerChapter` остался ОДИН хит, и он надгробный комментарий; (б) движковая поверхность оценки существует — `manifest --json` публикует `expected_usd`/`book_once_usd`/`step_max_usd`; (в) переменной `TM_PLATFORM_USD_PER_CHAPTER`/`PerChapterMicroUSD` в конфиге нет; (г) «шкалы» в главах больше нет — `Model.Scale` удалён. Собственный источник строки, `STACK_DECISIONS` §20, УЖЕ несёт баннер «⚠⚠ РЕШЕНИЕ ОТМЕНЕНО ПАКОМ «ФОРМА ЗАКАЗА» 05.09 — СТАВКИ БОЛЬШЕ НЕТ, и посылка, на которой она стояла, была неверна», то есть зонный бэклог противоречит зонному же STACK_DECISIONS.
|
||||
- улика: $ grep -rn "DefaultPerChapter" platform/ --include=*.go
|
||||
platform/internal/pricing/pricing.go:5:// than a tidy-up. Until 05.09 a chapter was worth a CONSTANT — `DefaultPerChapter`, $0.03, provenance
|
||||
-> хитов в .go: 1 (комментарий-надгробие)
|
||||
КОНТРОЛЬ, что грепал существующий предмет: в том же pricing.go 11 деклараций const/поле, файл 365 строк.
|
||||
$ grep -rn "PerChapter" platform/internal/config/*.go | grep -v _test -> 0 строк; КОНТРОЛЬ: `grep -rn "PerChapter" platform/ | wc -l` -> 14 (все в доках/т
|
||||
- предложенная правка: В `platform/BACKLOG.md` пометить П-10 ИСПОЛНЕННОЙ (лендинги `81a89e9` движка 05.09 + форма заказа 06.09, акт `D39.208`), прежнюю редакцию оставить историей под ⚠-баннером, как это уже сделано в `STACK_DECISIONS` §20. Правка — зона платформы; лендит оркестратор.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**51. [major] `platform/docs/DEFECT_REGISTER.md:146 — ряд PD-458 (колонка «Статус» = `open`)`**
|
||||
- утверждение: Ряд `PD-458 | bug | info | `Makefile` цель `check`, подметание в первом шаге; гейт `internal/gates.TestTheBatterySweepsOnlyLogsWhoseWriterIsGone` | … ⇒ подметание перед прогоном, и оно **условно по живости писателя** (`kill -0` — POSIX, без `/proc`) … Три мутации ловятся … | **open** |»
|
||||
- факт по дереву: Классическая «статус-жертва»: лекарство и его пин легли в дерево ТЕМ ЖЕ коммитом, что и сам ряд. `platform/Makefile` цель `check` первым шагом делает условное подметание с `kill -0`; гейт `TestTheBatterySweepsOnlyLogsWhoseWriterIsGone` стоит в `platform/internal/gates/battery_test.go:532` и ловит ровно три названные мутации. Правило шапки регистра («закрытие — только с коммитом фикса и тестом, пинящим свойство») выполнено, а статус остался `open`. Следствие в деньгах внимания: ряд входит в число 106, которое CURRENT-STATE подаёт как остаток работы, и следующий пак пойдёт чинить построенное — ровно тот класс, против которого стоит п.8 `ENGINEERING_STANDARDS` §3.
|
||||
- улика: platform/Makefile:149-152 (цель `check`):
|
||||
check: build vet fmt lint sqlc-check
|
||||
@for f in .check.log.*; do [ -e "$f" ] || continue; p=${f##*.}; \
|
||||
case "$p" in ''|*[!0-9]*) continue;; esac; \
|
||||
kill -0 "$p" 2>/dev/null || rm -f "$f"; done; \
|
||||
platform/internal/gates/battery_test.go:532:func TestTheBatterySweepsOnlyLogsWhoseWriterIsGone(t *testing.T) { (в шапке теста: «Mutation caught: replacing the conditional sweep with a bare `rm -f .check.log.*`; dropping the liveness test while keeping the
|
||||
- предложенная правка: Проставить `PD-458` статус `fixed(0632a30)` в `platform/docs/DEFECT_REGISTER.md:146` и пере-снять `python3 docs/scripts/counts.py`, после чего обновить число открытых рядов в CURRENT-STATE `docs/PROGRESS.md:3` (станет 105 при тех же 458 всего). ⚠ Смена статуса — акт лендинга, поэтому правку делает оркестратор, а не зона.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**52. [minor] `platform/docs/STACK_DECISIONS.md:444 — строка «Инвентарь каналов движка», канал `events.jsonl``**
|
||||
- утверждение: «| `events.jsonl` (NDJSON эмиттера) | движок, StreamVersion **1.2** (замерено живым прогоном 04.09: `grep -o '"stream_version":"[^"]*"' events.jsonl`; прежняя строка говорила 1.1 и протухла) | append-only | … |»
|
||||
- факт по дереву: Движок пишет **1.3** с лендинга `81a89e9` (05.09): минор добавил `Ceiling.ShortfallMicroUSD` и `Finished.Money` (строки бэклога 277/278). Функционального разрыва нет — платформенный декодер сравнивает только МАЖОР, — но число в единственном носителе инвентаря протухло на один минор, ровно тем же способом, каким протухло предыдущее (1.1), и об этом в той же ячейке написано.
|
||||
- улика: $ grep -rn "StreamVersion" backend/internal/runevents/runevents.go
|
||||
backend/internal/runevents/runevents.go:56:const StreamVersion = "1.3"
|
||||
(в доккомменте :44-49: «1.3 adds `Ceiling.ShortfallMicroUSD` and `Finished.Money` … backlog rows 277/278»)
|
||||
$ git log --oneline -S'StreamVersion = "1.3"' -- backend/internal/runevents/runevents.go -> 81a89e9
|
||||
$ grep -n "StreamVersion" platform/internal/ingest/events.go -> :46 `const StreamVersion = "1.1"` (это ЧТО ПОНИМАЕТ читатель, не что пишет движок — сказано
|
||||
- предложенная правка: В `platform/docs/STACK_DECISIONS.md:444` поменять 1.2 → 1.3 с датой лендинга `81a89e9` и назвать, что добавил минор (`Ceiling.ShortfallMicroUSD`, `Finished.Money`); прежнее число оставить в скобках, как уже сделано для 1.1.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**53. [minor] `platform/README.md:147 и :151 (раздел «Карта зоны», абзац про каналы движка)`**
|
||||
- утверждение: :147 — «атомарность каждого канала, колонка «потребляет ли платформа» и все оговорки лежат **ЕДИНСТВЕННЫМ носителем** в `docs/STACK_DECISIONS.md`, «Инвентарь каналов движка»»; :151 — «`tmctl backup` читается с 05.09 — `internal/runner/backup.go` → `internal/backup`, — и это **ВОСЬМОЙ движковый канал зоны**».
|
||||
- факт по дереву: Названный единственный носитель этого канала НЕ содержит. Секция «Инвентарь каналов движка» (`platform/docs/STACK_DECISIONS.md:420–455`) несёт 14 строк каналов, и `tmctl backup` среди них нет — то есть у восьмого канала зоны нет ни строки атомарности, ни колонки «потребляет ли платформа» нигде, хотя README отправляет читателя именно туда и обещает, что второй копии перечня нет намеренно.
|
||||
- улика: $ n=$(grep -n "Инвентарь каналов движка" platform/docs/STACK_DECISIONS.md | head -1 | cut -d: -f1); end=… -> секция строки 420..455
|
||||
$ sed -n "420,455p" platform/docs/STACK_DECISIONS.md | grep -c "tmctl backup" -> 0
|
||||
КОНТРОЛЬНАЯ ВЕЛИЧИНА (что секция найдена и не пуста): первая ячейка каждой строки таблицы в этой же секции — 15 штук (заголовок + 14 каналов): `<project_db>.manifest.json`, `<project_db>.bank.json`, `<project_db>.bank-stop.txt`, `<project_db>.mined-signature.yaml`, `<project_db>.aut
|
||||
- предложенная правка: Добавить в таблицу «Инвентарь каналов движка» (`platform/docs/STACK_DECISIONS.md`, секция со строки 420) строку `tmctl backup`: писатель в движке (`backend/cmd/tmctl/backup.go` `backupCmd`), атомарность (`VACUUM INTO` + `integrity_check`), читатель платформы (`internal/runner/backup.go` `backupPathIn` → `internal/backup`) и оговорка «ответ разбирается из человеческой строки stdout, версии нет — `PD-449`».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**54. [minor] `platform/docs/DEFECT_REGISTER.md:41 — ряд PD-448 (открытый), колонка «Где»`**
|
||||
- утверждение: «`internal/runs/control_test.go:846` `TestTwoResumesOfOneRunTakeOneHoldAndBothAnswer` (пин гарантии)»
|
||||
- факт по дереву: На строке 846 стоит `if _, err := f.svc.Start(f.ctx, StartRequest{UserID: "u1", BookID: second, Chapters: order(10)}); err != nil {` — чужой тест. Названный пин живёт на строке 881, дрейф 35 строк. Ряд ОТКРЫТ, то есть якорь поведёт следующий пак не туда; гейт `counts.py --lint` этого не ловит, потому что форма якоря голая (без токена `=`), а голому он проверяет только существование файла и что 846 ≤ 1395.
|
||||
- улика: $ sed -n '846p' platform/internal/runs/control_test.go
|
||||
if _, err := f.svc.Start(f.ctx, StartRequest{UserID: "u1", BookID: second, Chapters: order(10)}); err != nil {
|
||||
$ grep -rn "TestTwoResumesOfOneRunTakeOneHoldAndBothAnswer" platform/internal/
|
||||
platform/internal/runs/control_test.go:881:func TestTwoResumesOfOneRunTakeOneHoldAndBothAnswer(t *testing.T) {
|
||||
$ wc -l platform/internal/runs/control_test.go -> 1395
|
||||
Прибор-проход по ВСЕМУ регистру: якорей вида `путь:N` — 135, из них с названным рядом си
|
||||
- предложенная правка: Пере-нацелить якорь в `PD-448` на форму с токеном, которую гейт сверяет по содержимому: `` `internal/runs/control_test.go:881`=`func TestTwoResumesOfOneRunTakeOneHoldAndBothAnswer` ``. По симметричному правилу `ENGINEERING_STANDARDS` §3 п.8 чинит тот, чей переезд якорь убил, но ряд открыт и цена промаха ложится на следующий пак.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**55. [minor] `platform/docs/DEFECT_REGISTER.md:81 — ряд PD-445 (открытый), колонка «Где»`**
|
||||
- утверждение: «`internal/httpapi/bank.go:386`=`Undecided int` (проекция квитанции); честный счёт — `internal/pgstore/readmodel.go:324`»
|
||||
- факт по дереву: Первый якорь верен (bank.go:386 = `Undecided int `json:"undecided"``). Второй мёртв: readmodel.go:324 — это `revision = excluded.revision,`, фрагмент апсерта, к «честному счёту» отношения не имеющий. Носитель, который ряд имеет в виду, стоит на строке 411: `// The honest count of undecidedness is the ENGINE's (\`SignatureState\`, served on the correction …`. Дрейф 87 строк; ряд открыт.
|
||||
- улика: $ sed -n '386p' platform/internal/httpapi/bank.go
|
||||
Undecided int `json:"undecided"`
|
||||
$ sed -n '324p' platform/internal/pgstore/readmodel.go
|
||||
revision = excluded.revision,
|
||||
$ grep -n "ndecided" platform/internal/pgstore/readmodel.go
|
||||
411:// The honest count of undecidedness is the ENGINE's (`SignatureState`, served on the correction
|
||||
КОНТРОЛЬ (что искал в существующем файле): `wc -l platform/internal/pgstore/readmodel.go` -> 1490 строк, и в нём ровно 1 вхождение подстроки «ndecided».
|
||||
- предложенная правка: Заменить в `PD-445` голый указатель на токен-форму `` `internal/pgstore/readmodel.go:411`=`The honest count of undecidedness is the ENGINE's` `` — тогда его начнёт сторожить `counts.py --lint`.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**56. [minor] `docs/PROGRESS.md:3 — CURRENT-STATE, предложение «Трезвость по масштабу»`**
|
||||
- утверждение: «Трезвость по масштабу (пере-считано 02.09): **90** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, **9** в `backend/docs`»
|
||||
- факт по дереву: По ДОСЛОВНО названной в скобках команде сегодня 94, а не 90; в `backend/docs` — 11, а не 9. Совпадает только `platform/docs` = 8. ⚠ Числа регистра платформы в том же предложении («открытых рядов … 106 (major 3), всего рядов 458») ПОДТВЕРЖДЕНЫ прибором и расхождения не дают — протухли именно счётчики доков, и сам док рядом предупреждает, что `counts.py` их не сторожит и пере-считывать надо руками.
|
||||
- улика: $ find docs -name '*.md' -not -path 'docs/archive/*' | wc -l
|
||||
94
|
||||
$ find backend/docs -name '*.md' | wc -l
|
||||
11 (MONEYSTOP_REPORT, SEAM_FIX_PLAN, SEAM_FIX3_PLAN, SEAM_PACK_FINDINGS, SEAM_FIX2_PLAN, MONEY_HONESTY_PLAN-NOTE, SEAM_PACK_PLAN, DISCLOSURE_LAW_DESIGN, CHAPTER_STRUCTURE_REPORT, MONEY_HONESTY_REPORT, D15.2-content-addressed-resume-spec)
|
||||
$ find platform/docs -name '*.md' -not -path '*archive*' | wc -l -> 8 (совпало)
|
||||
КОНТРОЛЬ по регистру (те же числа, что заявлены, — расхождения НЕТ):
|
||||
$ pyth
|
||||
- предложенная правка: Пере-снять оба счётчика в `docs/PROGRESS.md:3` названной там же командой (90→94, 9→11) и, раз число уже разошлось дважды, либо завести им гард в `counts.py`, либо снять их из CURRENT-STATE — сегодня они дают ложную «трезвость по масштабу».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**57. [minor] `platform/internal/httpapi/v0.go:118 (доккомментарий записи `contractSurface` для `.../exports/{exportId}/content`)`**
|
||||
- утверждение: «// The artifact itself — the address `Export.url` names. It **carries no `operationId`** because no generated client calls it: a browser NAVIGATES to it.»
|
||||
- факт по дереву: Канон операцию ИМЕНУЕТ: `docs/architecture/14-api-contract/openapi.yaml:940` = `operationId: downloadExport`. Зонный бэклог это знает и говорит верно (`platform/BACKLOG.md:32`, П-17: «третий адрес `.../content` (канон дал ему `operationId` `downloadExport` минором `0.10.0` — `58bca19`, `D39.194` п.3)»), то есть протух именно комментарий в коде, а читает его тот, кто правит таблицу маршрутов. Косвенное следствие: счёт «21 операция / 19 построено» в `PLATFORM_DIRECTION.md` §3 держится только потому, что считали по канону, а не по этому комментарию.
|
||||
- улика: $ grep -c "operationId:" docs/architecture/14-api-contract/openapi.yaml -> 21
|
||||
$ grep -n "downloadExport" docs/architecture/14-api-contract/openapi.yaml
|
||||
940: operationId: downloadExport
|
||||
2989: `downloadExport`.
|
||||
$ grep -c "{method: \"" platform/internal/httpapi/v0.go -> 19
|
||||
Сверка с заявленным в PLATFORM_DIRECTION §3 («на 05.09 — 21 и 19»): 21 и 19 — СХОДИТСЯ, находки там нет.
|
||||
- предложенная правка: Переписать комментарий `platform/internal/httpapi/v0.go:118`: операция имеет `operationId: downloadExport` (канон 0.10.0, `58bca19`, `D39.194` п.3), а довод «её не зовёт генерированный клиент» оставить как объяснение, почему маршрут всё равно перечислен здесь. Правка — зона платформы.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**58. [minor] `platform/BACKLOG.md:28 — строка П-13`**
|
||||
- утверждение: «Запрос уходит строкой ЕДИНОГО бэклога через оркестратора; строка регистра — PD-177 **→ строка 171 единого заведена 14.08**»
|
||||
- факт по дереву: Строки 171 в едином бэклоге больше нет: её вынули лендингом `a0fd2be` (05.09) как поглощённую строкой 278. Читатель П-13, пошедший за указателем, находит пустоту — а соседние номера на месте, так что «не нашёл» неотличимо от «искал не там».
|
||||
- улика: $ grep -c "^| 171 " docs/PROGRESS.md -> 0
|
||||
КОНТРОЛЬНАЯ ВЕЛИЧИНА: `grep -c "^| 170 " docs/PROGRESS.md` -> 1; `grep -c "^| 172 " docs/PROGRESS.md` -> 1 (форма грепа рабочая, соседи на месте).
|
||||
$ grep -rn "^| 171 " docs/archive/ | wc -l -> 0 (в архив не уезжала)
|
||||
$ git log --oneline -S'| 171 |' -- docs/PROGRESS.md
|
||||
a0fd2be Take seven rows out of the backlog that two acts had already closed…
|
||||
$ git show a0fd2be -- docs/PROGRESS.md | grep "^-| 171 "
|
||||
-| 171 | ⚠ **ПОГЛОЩЕНА СТРОКОЙ 278 — испр. 05.09** … Зак
|
||||
- предложенная правка: В `platform/BACKLOG.md:28` (П-13) пере-нацелить указатель со строки 171 на строку **278** единого бэклога и назвать причину («171 поглощена 278 и вынута лендингом `a0fd2be`»), иначе следующий читатель прочтёт молчание грепа как отсутствие заказа.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**59. [minor] `docs/architecture/15-money-path.md:35 и :41 — греп-указатели внутри исторических абзацев §2/§3`**
|
||||
- утверждение: Три греп-указателя ведут в никуда: «`platform/internal/pricing/pricing.go`, греп `func (m Model) Scale(`» (:35) · «`platform/internal/config/config.go`, греп `PerChapterMicroUSD`» (:41) · «`platform/internal/pricing/pricing.go`, греп `Provenance, so the number is auditable`».
|
||||
- факт по дереву: Все три дают 0 хитов: `Scale` и `PerChapterMicroUSD` удалены паком формы заказа, доккоммент про provenance переписан в надгробный. ⚠ Смягчающее и его надо назвать честно: оба абзаца стоят ПОД ⚠-баннерами «Ниже — прежняя редакция, историей», а §3 п.3 прямо предупреждает «грепать его как живой носитель нельзя». То есть документ не врёт о состоянии — он оставляет мёртвые указатели в историческом тексте, и гейт `counts.py --lint` их не судит по построению (регексп якоря требует `:номер`, у греп-формы его нет — сказано в шапке того же дока).
|
||||
- улика: Проверены ВСЕ 43 греп-указателя файла машинно (список собран регекспом, каждый проверен `grep -cF` по названному файлу):
|
||||
ИТОГ: указателей проверено 43, мёртвых 3, файлов нет 0.
|
||||
Мёртвые:
|
||||
platform/internal/pricing/pricing.go греп «func (m Model) Scale(» -> 0 хитов
|
||||
platform/internal/config/config.go греп «PerChapterMicroUSD» -> 0 хитов
|
||||
platform/internal/pricing/pricing.go греп «Provenance, so the number is auditable» -> 0 хитов
|
||||
КОНТРОЛЬНАЯ ВЕЛИЧИНА: остальные 40 указателей того же файла
|
||||
- предложенная правка: В исторических абзацах `15-money-path.md:35,41` снять три греп-указателя (или заменить на `pricing.go:5` — надгробный комментарий), оставив сам исторический текст: указатель, который гарантированно ничего не находит, дороже отсутствующего, потому что читается как «искал не там».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
## Линза `agent26` — находок 8
|
||||
|
||||
*Охват (словами агента):* ЧТО ОСМОТРЕНО (только чтение; ни одной меняющей команды, .env не открывался, платных вызовов 0). 1) Предмет: docs/README.md прочитан целиком (wc -l = 43). Таблица активных промтов — grep -n '^ |' docs/README.md даёт 14 строк = шапка + разделитель + **12 строк ролей** (24-35). Проверены все 12. 2) Пункт 1 задания (файл существует). 5 строк называют живой файл — все 5 на месте, с длинами: docs/ORCH
|
||||
*Что агент НЕ проверил:* НЕ ПРОВЕРЕНО и где не хватило данных. 1) Поведение кода не трогал вовсе: утверждения строк 267/318/320/321/322 о том, что делает движок (гард полисемии статус-слеп, постчек делает `continue`, редакторская волна передаёт nil), взяты как есть из бэклога и не сверены с backend/ ни чтением кода, ни тест
|
||||
|
||||
**60. [blocker] `docs/README.md:25 — строка таблицы «Бэкенд · КОНСИСТЕНТНОСТЬ», колонка «Статус»`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «приоритет владельца №1: **канон в прогон (295)** · гард перекрытия окон (267) · честный комментарий постчека (318) · не уничтожать принятую редактуру (322 а/б) · два ложных комментария»
|
||||
- факт по дереву: Промт, на который ссылается та же строка, СНЯЛ 295 из пака: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:80-82 = «**Строка 295 (подать подписанный канон в прогон)** — снята из этого пака: у бэкенд-сессии нет ни книги, ни стенда, ни санкции на деньги. Если найдёшь чисто бэкендовую половину — **назови её пингом**, но не бери». То же говорит CURRENT-STATE: docs/PROGRESS.md:7-9 = «(2) БЭКЕНД … строки 267 · 318 · 320а + два ложных комментария… ⚠ Строка 295 из пака СНЯТА». Пак объявлен $0 (промт §Деньги:139-141), а 295 требует стенда, книги и платного прогона.
|
||||
- улика: cat -n docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → §4.5 на строках 76-83; sed -n '3,9p' docs/PROGRESS.md → «⚠ Строка 295 из пака СНЯТА — у бэкенд-сессии нет ни книги, ни стенда, ни санкции». Археология: git show --stat 6457d77 (16:04) — промт и строка README созданы ОДНИМ коммитом, и тогда промт действительно заказывал 295 (git show 6457d77:docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md | grep -n 295 → «### 1. Подать подписанный канон в прогон (половина строки 295) — ПЕРВЫМ»); git show --stat e6990
|
||||
- предложенная правка: Заменить ячейку «Статус» строки 25 docs/README.md на: «приоритет владельца №1 «закон банка честно»: гард перекрытия окон (267) · совет, который движок не исполняет (320а) · честный комментарий постчека (318) · два ложных комментария (321 и попутная сноска строки 322). ⛔ **Строка 295 (канон в прогон) из пака СНЯТА** и **строка 322 (указатель принятой редакции) вынесена отдельным паком** — §4.5 промта; брать их отсюда нельзя. Пак $0, санкции на деньги не несёт»
|
||||
- уверенность автора: подтверждено исполнением (чтение обоих носителей + git-археология коммитов)
|
||||
|
||||
**61. [blocker] `docs/README.md:25 — та же ячейка, фрагмент «не уничтожать принятую редактуру (322 а/б)»`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «не уничтожать принятую редактуру (322 а/б)» — то есть пак заказывает указатель принятой редакции по строке 322, и у строки есть половины «а» и «б»
|
||||
- факт по дереву: (1) Промт вынес этот предмет ИЗ пака: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:78-79 = «**Строка 322 (история принятой редактуры)** — другой предмет: жизненный цикл чекпойнтов и схема, а не закон банка. **Отдельным паком.**» Из 322 пак берёт только попутную сноску о ложном комментарии (§4.4:73-74 — «Утверждение, что обычный резюм перезаписывает строку статуса, — ложно»). (2) У живой строки 322 половин «а/б» НЕТ: они есть у строки 320, на которую README как раз не ссылается.
|
||||
- улика: sed -n '401p' docs/PROGRESS.md | grep -o '(а)\|(б)' | wc -l → 0 (это строка бэклога 322); контроль на существующем предмете: sed -n '398p' docs/PROGRESS.md (строка 320) → 3 совпадения ((а) ×2, (б) ×1); строка 321 → 0. Текст 322: «⛔ УКАЗАТЕЛЯ ПРИНЯТОЙ РЕДАКЦИИ НЕТ… Заказ здесь узкий: указатель принятой редакции | бэкенд+платформа | скоро | … | **D39.215**». Форма «части «а» и «б»» пришла из ПРЕЖНЕЙ редакции промта: git show 6457d77:docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md | grep -n 322 → «### 4
|
||||
- предложенная правка: Из ячейки строки 25 фрагмент «не уничтожать принятую редактуру (322 а/б)» УБРАТЬ из перечня состава и перенести в оговорку: «⛔ строка 322 (указатель принятой редакции) вынесена ОТДЕЛЬНЫМ паком — из неё пак берёт только ложный комментарий про резюм». Полный текст ячейки — в находке №1.
|
||||
- уверенность автора: подтверждено исполнением (счёт вхождений с контрольной строкой + git-археология)
|
||||
|
||||
**62. [major] `docs/README.md:25 — та же ячейка, ОТСУТСТВУЮЩИЙ элемент`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Перечень состава пака: «канон в прогон (295) · гард перекрытия окон (267) · честный комментарий постчека (318) · не уничтожать принятую редактуру (322 а/б) · два ложных комментария» — строки 320а в перечне нет
|
||||
- факт по дереву: 320а — полноправный пункт пака и стоит в карте чтения промта: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:24 («Строки бэклога **267**, **318**, **320**») и §4.2:52-57 («Совет, который движок не исполняет (строка 320а) — **реши сам, аргументируй**»). CURRENT-STATE перечисляет пак так же: docs/PROGRESS.md:7 «строки 267 · 318 · 320а + два ложных комментария». Ратифицировано телом D39.215 п.5 («Что взято ещё (строка 320): два совета движка, которых движок не исполняет»). ⇒ холодная сессия, собравшая заказ по таблице, единственный пункт «реши сам, аргументируй» пропустит.
|
||||
- улика: grep -n 'Строки бэклога' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → строка 24 с номерами 267/318/320; sed -n '52,57p' — §4.2 про 320а; sed -n '7,9p' docs/PROGRESS.md — тот же состав; grep -o '\b320\b' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md | wc -l → 2, при контроле grep -o '\b318\b' → 2 и '\b267\b' → 2 (все три пункта промт называет одинаково часто).
|
||||
- предложенная правка: В перечне состава ячейки строки 25 добавить пункт «· совет, который движок не исполняет (320а) — единственный пункт «реши сам, аргументируй»». Полный текст ячейки — в находке №1.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**63. [major] `docs/README.md:25 — хвост ячейки: «⚠ Несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»»`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Промт «несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»»
|
||||
- факт по дереву: В промте такого заказа нет ни в каком виде, и формулировка не встречается НИГДЕ в репозитории, кроме самой этой ячейки. Отчётные секции промта (§10, §Отчёт, строки 122-148) требуют «что не проверено / не воспроизвелось / где данных не хватило» и таблицу мутаций — списка «задумано против сделано» среди них нет. ⇒ либо ячейка приписывает паку заказ, которого промт не несёт (тогда сессия сдаст не то и потратит ход), либо заказ владельца реален и промт его потерял (тогда дефект — у промта). Истина носителя состава — промт + CURRENT-STATE; ячейка тут стоит ОДНА.
|
||||
- улика: grep -c 'задумано' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → 0, при контрольном grep -c 'банк' в том же файле → 5; grep -rni 'логическ[а-я]* расхожден' --include='*.md' . (без .git) → 1 хит, и это сам docs/README.md:25; контроль на существующем предмете: grep -rli 'консистентност' --include='*.md' . → 101 файл. Живые доки отдельно: grep -rni 'логическ[а-я]* расхожден' docs/ --exclude-dir=prompts --exclude-dir=reports → 1 (README), при контроле grep -rn 'расхожден' по тому же дереву → 282.
|
||||
- предложенная правка: Либо удалить хвост «⚠ Несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»» из ячейки строки 25, либо (если заказ владельца настоящий) внести его секцией в docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md и оставить в ячейке ссылку на эту секцию номером. Молча оставлять нельзя: сегодня носитель заказа — только ячейка.
|
||||
- уверенность автора: подтверждено исполнением (нулевые счёты предъявлены с контрольными величинами)
|
||||
|
||||
**64. [major] `docs/PROGRESS.md:3 (CURRENT-STATE, «ОЧЕРЕДЬ №22») — адрес, на который отправляет docs/README.md:24 («счётчик роли — CURRENT-STATE»)`**
|
||||
- утверждение: «**ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184)»; там же docs/PROGRESS.md:54 «**ОТКРЫТО НА ОРКЕСТРАТОРЕ №22:**»
|
||||
- факт по дереву: Ратифицированная голова журнала решений объявляет передачу дальше: docs/architecture/05-decisions-log.md — «## D39.217 — ПЕРЕДАЧА РОЛИ ОРКЕСТРАТОРА №22 → №23: чем эта смена дорога и где она врала (06.09) ✅». По прецеденту предыдущей передачи (D39.184 «Передача роли оркестратора №21 → №22», после которой голова показывает №22) счётчик после ноты передачи обязан показывать НОВЫЙ номер. ⇒ холодный оркестратор, которому его же ролевой промт велит взять номер отсюда (docs/ORCHESTRATOR_SESSION_PROMPT.md:13 «**Твой номер и очередь работ — CURRENT-STATE в `PROGRESS.md`**»), подпишется номером только что закрытой смены.
|
||||
- улика: sed -n '3p' docs/PROGRESS.md → «…**ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184)»; grep -n '^## D39.217' docs/architecture/05-decisions-log.md → заголовок ноты передачи №22 → №23; grep -n '^| D39.184 ' docs/architecture/05-decisions-index.md:245 → «Передача роли оркестратора №21 → №22»; git show --stat c992ee5 (17:22, нота D39.217) → docs/PROGRESS.md изменён на 1 строку (голова «голова D39.217»), счётчик не тронут.
|
||||
- предложенная правка: В docs/PROGRESS.md:3 заменить «**ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184)» на «**ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи **D39.217**)»; строку 54 «**ОТКРЫТО НА ОРКЕСТРАТОРЕ №22:**» — на «**ОТКРЫТО НА ОРКЕСТРАТОРЕ №23:**».
|
||||
- уверенность автора: вывод по документам: правило «после ноты передачи голова показывает новый номер» нигде не записано словом, взято по прецеденту D39.184 — исполнением не проверено
|
||||
|
||||
**65. [major] `docs/archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md:2 — баннер исхода, на который ссылается docs/README.md:31 («промт в `archive/prompts/` с баннером исхода»)`**
|
||||
- утверждение: «Строки заказа 269 · 270 · 274 · **282 ЗАКРЫТЫ**, заведена 293»
|
||||
- факт по дереву: 282 НЕ закрыта. Ратифицированный акт того же пака говорит обратное: docs/architecture/05-decisions-log.md, тело D39.201 п.7 — «**282** (ложная подпись «Знаков») — состав минора внесён прозой, **поле за паком формы заказа**». Живая строка бэклога 282 открыта (статус «скоро», зона «платформа+фронт») и прямо заказана СЕГОДНЯШНИМ активным паком платформы: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:92 «### 4.2 Экран не врёт о единице (строка 282) — **делай РОВНО так**», и README:29 перечисляет её в составе активного пака. ⇒ два носителя, на которые таблица ссылается в соседних строках, говорят о 282 противоположное.
|
||||
- улика: grep -n '282' docs/archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md → строка 2 с «282 ЗАКРЫТЫ»; grep -n '^| 282 |' docs/PROGRESS.md → строка 353, хвост колонок «платформа+фронт || скоро || снять ложную подпись + заменить источник на манифест движка»; sed -n '2388p' docs/architecture/05-decisions-log.md (п.7 ноты D39.201) → «**282** … поле за паком формы заказа»; grep -n '282' docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md → строки 18, 41, 92.
|
||||
- предложенная правка: В баннере docs/archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md:2 заменить «Строки заказа 269 · 270 · 274 · 282 ЗАКРЫТЫ, заведена 293» на «Строки заказа 269 · 270 · 274 ЗАКРЫТЫ, заведена 293. ⚠ **282 (ложная подпись «Знаков») НЕ закрыта** — состав минора внесён прозой, поле за паком формы заказа (D39.201 п.7); строка живёт и заказана паком «ДЕНЬГИ И ПРАВДА»».
|
||||
- уверенность автора: подтверждено исполнением (три носителя прочитаны текстом, не счётом)
|
||||
|
||||
**66. [minor] `docs/README.md:27 — строка таблицы «Бэкенд · отозванный», колонка «Статус»`**
|
||||
- утверждение: «Следующий пак — СТРУКТУРА ГЛАВ (решение владельца 05.09 «любая книга любого формата»), **пишется**»
|
||||
- факт по дереву: Пак СТРУКТУРА ГЛАВ не «пишется»: он написан, выдан, отработан, принят с дофиксом и залендён 06.09 — об этом говорит СОСЕДНЯЯ строка той же таблицы (docs/README.md:26, акт D39.210, коммит 2f65d1d), и промт уже в архиве с баннером исхода. Актуальная следующая работа зоны — активный пак «КОНСИСТЕНТНОСТЬ» (строка 25).
|
||||
- улика: sed -n '26,27p' docs/README.md — строка 26 «пак 1 «форматы и честный словарь» ОТРАБОТАН, ПРИНЯТ С ДОФИКСОМ и ЗАЛЕНДЕН 06.09 — акт **D39.210**, `2f65d1d`», строка 27 «Следующий пак — СТРУКТУРА ГЛАВ … пишется»; head -8 docs/archive/prompts/CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md → «⛔⛔ ОТРАБОТАН, ПРИНЯТ С ДОФИКСОМ И ЗАЛЕНДЕН 06.09 — АКТ `D39.210`, коммит `2f65d1d`»; git log -1 --format='%h %ad %s' --date=short 2f65d1d → 2f65d1d 2026-09-06 (коммит существует).
|
||||
- предложенная правка: В ячейке строки 27 заменить хвост «Следующий пак — СТРУКТУРА ГЛАВ (решение владельца 05.09 «любая книга любого формата»), пишется» на «Заменивший его пак СТРУКТУРА ГЛАВ выдан 05.09 и залендён 06.09 (акт **D39.210**, строка выше); активная работа зоны сегодня — «КОНСИСТЕНТНОСТЬ»».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**67. [minor] `docs/README.md:13 — карта, буллет `14-api-contract/` (вне таблицы, тот же документ)`**
|
||||
- утверждение: «зонная копия `frontend/docs/api-contract/` ОТСТАЛА на `0.2.3` при каноне `0.10.0` (испр. 05.09; ⚠ версию канона брать ФАЙЛОМ … число здесь стареет)»
|
||||
- факт по дереву: Канон сегодня 0.12.0, а не 0.10.0 — разрыв в два минора (0.11.0 внесён паком «форма заказа», D39.208; 0.12.0 — лендингом 06.09, D39.217 п.5). Число зонной копии (0.2.3) верно. Голова PROGRESS уже несёт правильную пару: «зеркало 0.2.3/16 операций против канона 0.12.0/21». Оговорка «число здесь стареет» риск объявляет, но не снимает: в тексте стоит конкретное ложное число.
|
||||
- улика: grep -n '^ version:' docs/architecture/14-api-contract/openapi.yaml → «5: version: 0.12.0»; grep -n '^ version:' frontend/docs/api-contract/openapi.yaml → «5: version: 0.2.3»; grep -n '0.10.0' docs/README.md → строка 13; sed -n '3p' docs/PROGRESS.md → «…зеркало 0.2.3/16 операций против канона 0.12.0/21».
|
||||
- предложенная правка: В docs/README.md:13 заменить «ОТСТАЛА на `0.2.3` при каноне `0.10.0` (испр. 05.09;» на «ОТСТАЛА на `0.2.3` при каноне `0.12.0` (пере-снято 06.09 файлом;» — остальную часть оговорки («версию канона брать ФАЙЛОМ … число здесь стареет») оставить как есть.
|
||||
- уверенность автора: подтверждено исполнением (число снято из файла-носителя обеими сторонами)
|
||||
|
||||
## Линза `agent42` — находок 10
|
||||
|
||||
*Охват (словами агента):* ПРОЧИТАНО ЦЕЛИКОМ: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (150 строк — обе редакции: HEAD ff14901 и обновлённая в дереве) · docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (176 строк, обе редакции) · docs/product-requirements.md (93 строки, 45 рядов ПТ). ИСТОЧНИКИ ЗАКАЗА: docs/PROGRESS.md — CURRENT-STATE строки 3–40 включая «ЧЕТЫРЕ ПОТОКА РАБОТЫ» (строки 4–21), «ЗАКАЗ ВЛАДЕЛЬЦА 01.09» (строка 3)
|
||||
*Что агент НЕ проверил:* 1. ⛔ ГЛАВНОЕ: ДЕРЕВО НЕ ЧИСТОЕ, вопреки заданию. В 21:20 (через ~10 минут после моего старта) параллельная сессия оркестратора начала переписывать `docs/`: `git status --short` даёт 15 изменённых файлов + новый `docs/BACKLOG.md` (untracked→A), включая ОБА проверяемых промта, README, PROGRESS, counts
|
||||
|
||||
**68. [blocker] `состав платформенного пака, docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:92-95 (§4.2), продублировано в §1 (строка 17-18) и docs/README.md:30`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «### 4.2 Экран не врёт о единице (строка 282) — делай РОВНО так. Либо число приезжает из манифеста движка, либо подпись переименована в то, что оно на самом деле считает. ⛔ Третьего — «оставить как есть, все привыкли» — нет: это живая ложь на продуктовом экране.»
|
||||
- факт по дереву: Платформенная половина строки 282 ПОСТРОЕНА и ЗАЛЕНДЕНА 06.09, ДО написания пака. `character_count` берётся из `source_chars` манифеста движка, рядом стоит флаг `character_count_exact`, есть пин. Остаток строки 282 — только фронтовая подпись `'about.characters': 'Знаков'`, а фронт заморожен и паку запрещён (§2). Строка 282 осталась помечена «скоро» потому, что акт лендинга D39.208 её НЕ назвал — ровно тот класс, о котором предупреждает CURRENT-STATE: «акт лендинга, объявивший закрытие строки, обязан быть СВЕРЕН СТАТУСОМ в тот же заход — иначе следующий пак собирается ПО РЕГИСТРУ и едет чинить построенное».
|
||||
- улика: platform/internal/httpapi/project.go:35-40 = `if b.SourceChars != nil { count, out.CharacterCountExact = *b.SourceChars, true }`; platform/internal/httpapi/v0.go:199-211 = `CharacterCount *int64` + `CharacterCountExact bool` с доккомментарием «unified backlog row 282»; пин platform/internal/httpapi/v0_test.go:901 `TestTheCharacterCountSaysWhichNumberItIs`.
|
||||
`git log --format='%h %ad %s' --date=iso -5 -- platform/internal/httpapi/project.go` → `6ceb133 2026-09-06 02:58:24`, `628cc56 2026-09-06 00:
|
||||
- предложенная правка: Снять §4.2 из платформенного пака целиком и убрать 282 из §1 и из карты чтения (§3 п.4). Отдельно: пометить строку 282 в docs/BACKLOG.md исполненной платформенной половиной с указанием `628cc56`/`6ceb133`, оставив открытым фронтовый остаток (подпись) до разморозки. Иначе сессия потратит заход на переделку построенного и, что хуже, может «починить» уже верное поведение.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**69. [major] `состав платформенного пака — §4.5 «Чего в паке НЕТ» и §5.1/§8, docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:110-113, 117-119, 130-131`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Пак берёт три мажора, 282 и 325 и требует «Мутационная проверка каждого пина… прочитай ТЕКСТ падения — говорит ли он про сломанное тобой» и «`MAKE-EXIT` цитируй из лога, а не из кода возврата составной команды».
|
||||
- факт по дереву: Открытым висит строка бэклога 305 (зона платформа, вес «скоро», источник D39.207): `make check` платформы при ТАЙМАУТЕ пакета печатает заголовок `--- FAILURES ---` и НИЧЕГО под ним — оператор получает «check упал» без единого имени. Пак вменяет сессии обязанность читать ТЕКСТ падения на каждом пине, а прибор, который этот текст выдаёт, известно ломается ровно на том классе отказа, который у ЭТОЙ батареи наблюдался (`FAIL … 600.251s`, замер 06.09). Правка — одна ветка в цели `check` того же `platform/Makefile`, который только что правил заленденный ряд 310 (D39.213): то есть тот же файл, та же цель, тот же класс дефекта, $0.
|
||||
- улика: docs/BACKLOG.md строка 305, ячейка «чем закрывается»: «таймаут пакета называет пакет и причину, а не пустую секцию | платформа | скоро | … | **D39.207**».
|
||||
platform/Makefile:163-166 = `if [ $$status -ne 0 ]; then echo "--- FAILURES ---"; grep -E '^(---|[[:space:]]+---) FAIL' "$$log"; …; exit 1; fi` — при `panic: test timed out` строк `--- FAIL:` в логе нет, секция печатается пустой.
|
||||
`grep -c "305\|285" docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md` → 0; контроль: `grep -c "282" …` → 3.
|
||||
Счёт зоны: с
|
||||
- предложенная правка: Добавить пунктом §4.x «Прибор приёмки называет причину таймаута» со ссылкой на строку 305 и D39.207, с формулировкой «делай РОВНО так»: при ненулевом статусе, если в логе нет ни одной строки `--- FAIL:`, печатать имя пакета и хвост его вывода (`FAIL … Ns`, `panic: test timed out`), а не пустую секцию. Довод для промта: без этого §5.1 («прочитай ТЕКСТ падения») исполним не всегда, и мутация будет засчитана по цвету, что CLAUDE.md прямо запрещает.
|
||||
- уверенность автора: вывод по коду (текст цели Makefile прочитан; сам таймаут не воспроизводил — батарея требует DSN и сети)
|
||||
|
||||
**70. [major] `состав платформенного пака, §4.3 docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:97-101`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «### 4.3 Вход не шире выдачи (строка 325) — реши сам, аргументируй. …интейк обязан отказывать форматам, чью выдачу мы не умеем, — с честной причиной человеку, а не молча.»
|
||||
- факт по дереву: На той же двери интейка открытым висит строка 285 — прямое РЕШЕНИЕ ВЛАДЕЛЬЦА 05.09 («почему просто не fail fast, как это обычно принято»): сегодня при загрузке проверяется только размер, а на классе «источник нечитаем» интейк ПРИНИМАЕТ файл и потом УДАЛЯЕТ загрузку. Механизм для отказа $0 и уже есть — `tmctl manifest` режет книгу без ключей и без единого платного вызова, и платформа умеет его звать. Это второй отказ на той же двери, с той же формулировкой «честная причина человеку», и он попутно закрывает строку 254. Делать 325 отдельно — открывать одну дверь дважды и дважды согласовывать текст отказа.
|
||||
- улика: docs/BACKLOG.md строка 285: «FAIL FAST ПРИ ЗАГРУЗКЕ вместо приёма-и-удаления (решение владельца 05.09) … `tmctl manifest` … Звать СИНХРОННО на загрузке | платформа | скоро | синхронный $0-разбор на приёме + отказ вместо удаления | решение владельца 05.09».
|
||||
Механизм отказа на двери уже смонтирован: platform/internal/httpapi/project.go:46 = `if reason := ingest.ContractRejectReason(b.RejectReason); reason != ""`.
|
||||
Приём .epub закреплён тестом: platform/internal/books/books_test.go:844 = `book := f.
|
||||
- предложенная правка: Слить 285 в §4.3 одним предметом: «интейк отказывает СИНХРОННО — и форматам, чью выдачу мы не умеем (325), и файлу, в котором книги нет (285, решение владельца 05.09); одна дверь, один текст отказа, `tmctl manifest` как $0-прибор». Оставить сессии свободу по границе и по тому, что показывать во время разбора (это и есть открытый вопрос ячейки 285).
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**71. [major] `состав ОБОИХ паков: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:84-90 (§4.1) и 137 (§7) + docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md §4 целиком`** ✅ закрыто `e4097cb`
|
||||
- утверждение: Платформенный пак: «⚠ По `PD-441` отдельно: если полная запись цены отменённого вызова недостижима, честный выход — объявить маржу…» и §7 «как именно собираешься лечить `PD-441` (полная запись против объявленной маржи)». Бэкенд-пак о PD-441 не говорит ничего.
|
||||
- факт по дереву: Опция «полная запись» физически недостижима из зоны platform/, и это записано в самом ряду регистра: «⚠ Правка `stagerun.go` — ЧУЖАЯ зона, отсюда только строка». Носители движковой половины — строки бэклога 261 и 262, обе зона БЭКЕНД, обе вес «скоро (вместе с денежным паком)» / «скоро (вместе с 261)», и 261 говорит буквально: «остаток `PD-441` = 261 + 262… структурный корень невидимого расхода — эта строка… платформенной зоне: `PD-441` закрывать «паком денежного стопа» НЕЛЬЗЯ». Ни один из двух паков их не берёт. При этом 262 — это ложный комментарий в `backend/internal/pipeline/stagerun.go`, то есть ровно жанр бэкенд-пака («комментарий шире ветки»), и он живёт в файле того же пакета `pipeline`, который бэкенд-пак и так трогает по строке 321. Итог: сессия платформы получает выбор из двух вариантов, где один заведомо вне её досягаемости, и пак ей этого не говорит.
|
||||
- улика: platform/docs/DEFECT_REGISTER.md, ряд PD-441 (открыт, `**major, деньги**`): «⚠ Правка `stagerun.go` — ЧУЖАЯ зона, отсюда только строка. Смежная строка единого бэклога — **78**».
|
||||
docs/BACKLOG.md строка 261: «остаток `PD-441` = **261 + 262** … | бэкенд | скоро (вместе с денежным паком)»; строка 262: «Комментарий ветки отмены — сверх-утверждение: «No 2xx ever arrived: nothing was billed» описывает ветку ШИРЕ, чем она есть … | бэкенд | скоро (вместе с 261)».
|
||||
Код жив: `grep -rn "No 2xx ever arrived"
|
||||
- предложенная правка: Минимальная и не раздувающая правка: в §4.1 платформенного пака назвать ограничение прямо — «полная запись цены отменённого вызова живёт в `backend/internal/pipeline/stagerun.go` (строки бэклога 261 и 262, зона бэкенд); этим паком она НЕ заказана ⇒ из этой зоны честен только вариант «объявленная маржа», и §7 отвечает на вопрос «какая маржа и как показана», а не «какой из двух вариантов». Отдельно — решение оркестратора: заказать 261/262 третьим паком или прицепить 262 к бэкенд-паку (⚠ сама строк
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**72. [major] `docs/README.md:26 (таблица активных промтов — единственный носитель холодного входа) против docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «Бэкенд · КОНСИСТЕНТНОСТЬ … приоритет владельца №1: канон в прогон (295) · гард перекрытия окон (267) · честный комментарий постчека (318) · не уничтожать принятую редактуру (322 а/б) · два ложных комментария. ⚠ Несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»»
|
||||
- факт по дереву: Три из пяти утверждений строки ложны против пака, который она описывает. (1) 295 из пака СНЯТА (§4.5). (2) 322 «а/б» из пака ИСКЛЮЧЕНА (§4.5), взята только попутная половина — ложный комментарий. (3) Заказ владельца на «список ЛОГИЧЕСКИХ расхождений «задумано против сделано»» в паке отсутствует ПОЛНОСТЬЮ: он стоял в §Отчёт первой редакции пака и выпал при переписывании, а строка README осталась от той редакции. Формулировка не имеет НИ ОДНОГО другого носителя во всём дереве — то есть если это действительно слово владельца, оно сейчас не заказано никому.
|
||||
- улика: `grep -ci "логическ\|задумано" docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md` → **0**; контроль на том же файле `grep -ci "банк"` → **6**.
|
||||
`grep -rn "задумано против сделано" . --include=*.md` → ОДНО вхождение: `docs/README.md:26`; контроль: всего .md в дереве — **1969**.
|
||||
Первая редакция несла его: `git show 6457d77:docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md | grep -n "295\|322\|логическ"` → `12: Строки бэклога 295, 267, 318, 320, 322`, `29: ### 1. Подать подписанный канон в прогон (половина строки
|
||||
- предложенная правка: Развилка, и её обязан снять оркестратор, а не сессия: либо ВЕРНУТЬ строку «список логических расхождений «задумано против сделано»» в §Отчёт бэкенд-пака (одна строка, ноль раздувания, и она ровно в жанре пака — он весь про «описано против сделано»), либо СНЯТЬ её из README:26 как никогда не бывшее слово владельца. Одновременно привести README:26 к действующему составу: убрать «канон в прогон (295)» и «не уничтожать принятую редактуру (322 а/б)».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**73. [major] `состав платформенного пака, §4.0 «Приёмка» (docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:80-82) против §2 «Зона и git» (строки 28-30)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §4.0: «Приёмка §4.0: проход печатает **ноль** утверждений без носителя · … всё, что оказалось правилом или незакрытой находкой, получило ряд регистра ИЛИ СТРОКУ БЭКЛОГА ПЕРЕД выносом». §2: «Чужие зоны (`backend/`, `frontend/`, `eval/`, `docs/`) — только чтение».
|
||||
- факт по дереву: Один из двух легальных носителей — строка бэклога — живёт в `docs/`, которую тот же пак объявляет read-only, а второй (ряд регистра) — в своей зоне. То есть приёмочный критерий §4.0 недостижим в объявленной зоне для любой находки бэклоговой формы, и сессия оказывается перед выбором «нарушить зону или не сдать пункт 0». Масштаб измерен прибором самого пака: на названном им диапазоне 55 утверждений без носителя, и до нуля их надо довести именно раздачей носителей.
|
||||
- улика: `python3 docs/scripts/carriers.py platform/docs/platform-PROGRESS.md --from 3 --to 2007` → «carriers: **55** помеченных утверждений без носителя / осмотрено строк: **2005** (с 3 по 2007 из **5029**) / носителем считается: ряд PD · строка бэклога · D-нота · эррата». Число в паке (55) воспроизвелось точно; `wc -l` = 5029, `grep -c '^## '` = 42 — обе цифры §4.0 верны.
|
||||
Строки бэклога сейчас лежат в `docs/BACKLOG.md` (239 рядов) — зона оркестратора; ряды регистра — `platform/docs/DEFECT_REGISTER.md`
|
||||
- предложенная правка: Переписать приёмку §4.0: «носитель, который зона заводит САМА, — ряд `DEFECT_REGISTER.md`; строка бэклога — ПИНГ оркестратору с готовой формулировкой, и до его ответа соответствующий кусок НЕ выносится». Иначе критерий приёмки прямо провоцирует запись в чужую зону — то, что CLAUDE.md запрещает жёстко.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**74. [minor] `docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4) против :78 (§4.5)`** ✅ закрыто `e4097cb`
|
||||
- утверждение: §4.4: «Два ложных комментария — снять (строки 321 и 322) — делай РОВНО так». §4.5: «Строка 322 (история принятой редактуры) — другой предмет: жизненный цикл чекпойнтов и схема, а не закон банка. Отдельным паком.»
|
||||
- факт по дереву: Один и тот же номер строки в одном паке и заказан, и запрещён. По существу противоречия нет — §4.4 берёт только «попутную» половину ряда 322 (ложный комментарий про резюм), а §4.5 исключает его главный предмет (указатель принятой редакции), — но из текста это не следует, и §9 требует от сессии эхо-протокол «скоуп · не-делать», где она обязана разложить это по разные стороны. Заголовок §4.4 при этом называет номер, а не предмет.
|
||||
- улика: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 и :78 — дословно выше.
|
||||
Попутная половина ряда 322 действительно существует и якорь верен: docs/BACKLOG.md строка 322 «⚠ Попутно: комментарий `backend/internal/store/chunkstatus.go:52-57` про «резюм переписывает строку» ЛОЖЕН — обычный резюм её не пишет»; в дереве backend/internal/store/chunkstatus.go:52-57 = доккомментарий `UpdatedAt` с фразой «A resume that re-writes an unchanged row moves it too».
|
||||
- предложенная правка: Заголовок §4.4 переписать по ПРЕДМЕТУ, а не по номеру: «Два ложных комментария — снять (строка 321 + попутный комментарий `chunkstatus.go:52-57` из строки 322; сама строка 322 в пак НЕ входит, см. §4.5)».
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**75. [minor] `docs/BACKLOG.md:212 (строка бэклога 267) — пункт 2 карты чтения бэкенд-пака и предмет его §4.1`** ✅ закрыто `e4097cb`
|
||||
- утверждение: «гард «одна форма на главу» существует (`backend/internal/pipeline/memseed.go`, греп `a term has ONE rendering per chapter`) и статус-слеп, но работает ВНУТРИ ОДНОГО ФАЙЛА»
|
||||
- факт по дереву: Файла `backend/internal/pipeline/memseed.go` в дереве НЕТ. Гард живёт в `backend/internal/membank/memseed.go:217`. Сессия, которой карта чтения делает эту строку ЗАКОНОМ, грепнет по названному пути и получит ноль — а ноль здесь неотличим от «гарда нет», то есть ровно тот класс ошибки, против которого пак сам ставит норму «рядом с нулём — контрольная величина».
|
||||
- улика: `ls backend/internal/pipeline/memseed.go` → `No such file or directory`; `find backend -name "memseed*.go"` → `backend/internal/membank/memseed.go`, `backend/internal/membank/memseed_test.go`.
|
||||
Контроль, что искал в существующем месте: в `backend/internal/pipeline/` 128 файлов `.go`, и второй якорь той же строки цел — `grep -c storeOrder backend/internal/pipeline/bankmaterialize.go` → 5.
|
||||
Гард на месте: `grep -rn "a term has ONE rendering per chapter" backend/` → `backend/internal/membank/memseed.
|
||||
- предложенная правка: Исправить путь в ячейке строки 267 на `backend/internal/membank/memseed.go` (зона оркестратора, docs/). Если правку не успеть до выдачи пака — назвать верный путь прямо в §4.1 бэкенд-пака, чтобы карта чтения не вела в пустоту.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**76. [minor] `карты чтения обоих паков (§3 п.2 бэкенд-пака, §3 п.4 платформенного) — состояние на HEAD ff14901`**
|
||||
- утверждение: HEAD-редакция обоих паков: «Строки бэклога **267**, **318**, **320** (`docs/PROGRESS.md`, греп `^| N |`)» и «Строки **282**, **325**, **326** бэклога (`docs/PROGRESS.md`, греп `^| N |`)».
|
||||
- факт по дереву: В рабочем дереве параллельная сессия оркестратора вынесла таблицу бэклога из `docs/PROGRESS.md` в новый `docs/BACKLOG.md` (побайтно, ID не двигались, ратификация D39.218). В `docs/PROGRESS.md` рядов не осталось НИ ОДНОГО — названный паками греп вернул бы ноль, неотличимый от «такой строки нет». ⚠ ФИКСИРУЮ КАК УЖЕ ИСПРАВЛЕННОЕ: пока я работал, та же сессия обновила оба пака на `docs/BACKLOG.md`. Правка НЕ закоммичена, HEAD её не несёт.
|
||||
- улика: `grep -cE "^\| [0-9]+[а-яё]? \|" docs/PROGRESS.md` → **0**; контроль: та же команда по `git show HEAD:docs/PROGRESS.md` → **239**, по `docs/BACKLOG.md` → **239**.
|
||||
В `docs/PROGRESS.md` на месте секции: «## Бэклог / > ⟶ **ПЕРЕЕХАЛ 06.09 в [BACKLOG.md](BACKLOG.md)** (ратификация — D39.218)».
|
||||
Паки уже поправлены в дереве: `grep -n "BACKLOG.md" docs/*SESSION_PROMPT.md` → `BACKEND_…:24`, `PLATFORM_…:41`.
|
||||
`git status --short` → 15 изменённых файлов в `docs/` + `A docs/BACKLOG.md`, всё незакоммичено.
|
||||
- предложенная правка: Не добавлять ничего — правка уже в дереве. Проверить только одно ПЕРЕД выдачей паков: что переезд закоммичен ОДНИМ актом вместе с обеими правками карт чтения. Если паки уйдут в работу до лендинга переезда, их карты чтения будут указывать на файл, которого в HEAD нет.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
|
||||
**77. [minor] `состав платформенного пака (полнота набора «три открытых мажора»)`**
|
||||
- утверждение: §4.1: «`PD-441` · `PD-424` · `PD-438`. Все три про одно…»; §1 перечисляет их же как «три способа врёт и один раз молчит».
|
||||
- факт по дереву: ОПРОВЕРЖЕНИЯ НЕТ — набор полон. Открытых рядов веса major в регистре ровно три, и все три в паке. Ни одного открытого BLOCKER-ряда нет. Записываю как законный результат проверки, а не как находку: по осям «открытые мажоры регистра» и «требования продукта со статусом ⭕» платформенный пак укомплектован, и добавлять туда нечего.
|
||||
- улика: Скрипт по `platform/docs/DEFECT_REGISTER.md` (разбор ячеек С КОНЦА, как `counts.py`): всего рядов **458**, открытых **106**, из них веса major — **3**: `PD-424` (open), `PD-441` (open), `PD-438` (open). Контроль: рядов веса `**BLOCKER**` — 3, все три `fixed(P8-FIX)` (`PD-169`, `PD-346`, `PD-353`); рядов нестандартной формы — 3 (`PD-375` minor, `PD-422` info, `PD-197` fixed), проверены поимённо.
|
||||
Продуктовые требования: `docs/product-requirements.md` — 45 рядов ПТ, статусы 🔶23 / ⭕11 / ✅6 / ❌3 / 🔒2
|
||||
- предложенная правка: Не добавлять ничего. Оставляю запись, чтобы следующая смена не переоткрывала этот вопрос: по регистру и по требованиям продукта паки укомплектованы, весь дефицит — в четырёх находках выше.
|
||||
- уверенность автора: подтверждено исполнением
|
||||
Loading…
Add table
Reference in a new issue