textmachine/docs/archive/reports/PROMPT_AND_DOCS_AUDIT_2026-09-06.md

210 KiB
Raw Blame History

Аудит двух выданных паков и документации обеих зон — сырые находки (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 (:286292, 4 пункта), D39.176 (:16391650, 6 пунктов), D39.214 (:26702681, 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 (строки 7683) и 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; тело 26702681 прочитано целиком. Пункты: :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; тело 27022712 прочитано целиком, п.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 оставить там, где он действительно обязателен: строкой мандата чистоты в списке ниже (она там уже стоит, строки 3436).
  • уверенность автора: подтверждено исполнением

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' и строки 6874 промта (§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 строки 26702685, 16 строк) · platform/internal/httpapi/project.go строки 2050 · platform/internal/httpapi/v0.go строки 190230 · platform/internal/ingest/tail.go строки 155205 · 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 (3031.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 'PLATFORMPROMPT*' -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 мс и сами формулируют это как «22.6 минуты», а не «по две минуты». Занижение до 30 % на числе, которое в самом ряду названо главным различителем («латентность — кандидат-различитель… порог обязан быть обоснован замером»), — сессия будет строить порог по нему.
  • улика: grep "^| PD-441 |" platform/docs/DEFECT_REGISTER.md (строка 29): «три оставшихся были отменены В ТОТ ЖЕ МИГ, отработав 120756, 156469 и 156470 мсс cost_usd 0… соседние ЗАВЕРШЁННЫЕ вызовы того же прогона стоили $0.017409 и $0.063404… Вызов, проживший 22.6 минуты, до провайдера дошёл почти наверняка». sed -n '23p' docs/PROGRESS.md (CURRENT-STATE) — те же числа: «отработав 120756, 156469 и 156470 мс… вызовы шли 22.6 минуты, их цены в леджере нет»; там же $0.063404, ≈$0.050.19 на
  • предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md §1: написать «прожили 22.6 минуты (120756 / 156469 / 156470 мс)» — ровно как оба носителя, чтобы порог различителя строился по настоящим числам.
  • уверенность автора: подтверждено исполнением (цитаты обоих носителей)

Линза agent10 — находок 16

Охват (словами агента): НОРМАТИВ прочитан целиком: /home/ubuntu-26/projects/textmachine/docs/ORCHESTRATOR_SESSION_PROMPT.md строки 68113 (секция «Пишешь промт сессии?»), снято sed -n '60,140p' — 46 строк норматива: 12 нумерованных блоков (:7697), абзац «Плюс к любому промту» (:99108, 8 элементов), абзац «В КОДОВЫЙ промт дополнительно» (:110113, 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.14.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.14.4), у платформы шесть (§4.04.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 норматива: «Предметные оси ревью … 13 оси; сессия вправе заменить с аргументом». Оси есть (2 и 3), права замены нет.
  • факт по дереву: НЕТ у обоих. Бэкенд-промт формулировкой «Из таблицы приёмки, две оси, обе твои» (:102) даже усиливает обратное — «обе твои» читается как «эти и никакие другие». Цена: сессия, нашедшая, что предмет уязвим по третьей оси (например, у платформы — по совместимости контракта), формально не имеет права её взять и промолчит.
  • улика: grep -ciE 'вправе заменить|заменить ось|заменить с аргумент' = 0 и 0. Контроль: grep -ci 'ось|оси' даёт живые хиты, sed -n '102p' Б → «Из таблицы приёмки, две оси, обе твои:». Норматив: ORCHESTRATOR_SESSION_PROMPT.md:86-87 «6. Предметные оси ревью … 13 оси; сессия вправе заменить с аргументом».
  • предложенная правка: Добавить последней строкой §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=/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-контракт вырос полосой отказов 1019 с восемью типизированными классами — «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 · полоса отказов 1019 (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.2628): 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:6ru\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.mde7d6b3f · 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). Существующие номера в диапазоне 95130: 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 chapterCHAPTER_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.UnitsForQuoteUnits.
  • улика: $ 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.gointernal/backup, — и это ВОСЬМОЙ движковый канал зоны».
  • факт по дереву: Названный единственный носитель этого канала НЕ содержит. Секция «Инвентарь каналов движка» (platform/docs/STACK_DECISIONS.md:420455) несёт 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 backupPathIninternal/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.058bca19, 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 2f65d1d2f65d1d 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 строки 340 включая «ЧЕТЫРЕ ПОТОКА РАБОТЫ» (строки 421), «ЗАКАЗ ВЛАДЕЛЬЦА 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.go6ceb133 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.md0; контроль на том же файле 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.goNo 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.md0; контроль: та же команда по git show HEAD:docs/PROGRESS.md239, по docs/BACKLOG.md239. В docs/PROGRESS.md на месте секции: «## Бэклог / > ⟶ ПЕРЕЕХАЛ 06.09 в BACKLOG.md (ратификация — D39.218)». Паки уже поправлены в дереве: grep -n "BACKLOG.md" docs/*SESSION_PROMPT.mdBACKEND_…: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
  • предложенная правка: Не добавлять ничего. Оставляю запись, чтобы следующая смена не переоткрывала этот вопрос: по регистру и по требованиям продукта паки укомплектованы, весь дефицит — в четырёх находках выше.
  • уверенность автора: подтверждено исполнением