210 KiB
Аудит двух выданных паков и документации обеих зон — сырые находки (06.09, смена №23)
⚠ ЭТО ДОКАЗАТЕЛЬНАЯ БАЗА, А НЕ НАРЯД. Находки собраны веером из девяти линз по промтам
BACKEND_CONSISTENCY/PLATFORM_MONEY_TRUTHи по докам зон; веер ОСТАНОВЛЕН владельцем на логической точке (расход), поэтому опровергатель прошёл НЕ по всем находкам — вес и формулировка здесь принадлежат АГЕНТУ, не оркестратору. Проверено оркестратором и закрыто лендингомe4097cbтолько то, что помечено ✅ ниже. Остальное — кандидаты: перед исполнением пере-снимать по дереву. Родитель:D39.218-смена; заказ владельца (0а) «ревизия документации на протухшее».
Линза agent6 — находок 6
Охват (словами агента): ДЕРЕВО: HEAD ff14901, git status --porcelain → пусто (дерево чистое). Все команды читающие, ничего не писал. ПРОЧИТАНО ЦЕЛИКОМ: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (150 строк) · docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (176 строк) · docs/scripts/carriers.py (88 строк) · тела нот D39.104 (:286–292, 4 пункта), D39.176 (:1639–1650, 6 пунктов), D39.214 (:2670–2681, 7 пунктов), D39.216 (:2
Что агент НЕ проверил: 1. НЕ ПРОВЕРЕНО — фактические заказы §4.1/§4.2/§4.3 бэкенд-промта против кода. Я сверил только §4.4 (ре-пин) и §4.2 в части «гард полисемии статус не смотрит» (строка бэклога 320 приводит само условие a.Src != b.Src || a.Dst == b.Dst || !windowsOverlap(...), но САМ файл memseed.go я не открывал)
1. [blocker] docs/README.md:25 (таблица активных промтов) — против docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (150 строк, целиком прочитан) ✅ закрыто e4097cb
- утверждение: «⚠ Несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»» — строка таблицы активных промтов о паке «Бэкенд · КОНСИСТЕНТНОСТЬ»
- факт по дереву: Живой промт этого заказа НЕ несёт вовсе. Заказ БЫЛ в первой редакции промта (коммит
6457d77, 108 строк): §5 п.5 «⭐ И отдельный проход, заказанный владельцем: ЛОГИЧЕСКИЕ баги, а не исполнительские» + пункт отчёта «список логических расхождений «задумано против сделано»». Переписывание промта коммитомe69902a(«rewrite two prompts to the twelve blocks the role requires») его выбросило, и сегодня единственный носитель заказа владельца во всём живом дереве — ячейка README, которая приписывает его файлу, где его нет. - улика: grep -n 'расхожден|задумано|логическ|ЛОГИЧЕСК' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → 1 хит, и тот посторонний (строка 17, «расхождения — пингом»); count=1. КОНТРОЛЬ рядом с нулём: в том же файле 150 строк, слово «банк» встречается 5 раз — прибор читает существующий предмет. // git show 6457d77:docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md | grep -n → «95: ⭐ И отдельный проход, заказанный владельцем: ЛОГИЧЕСКИЕ баги, а не исполнительские», «104: … список логических расхождений «задумано проти
- предложенная правка: Решить, жив ли заказ владельца. Если жив — вернуть его пунктом в docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (проход «логические баги, а не исполнительские» + пункт отчёта) и оставить ячейку README как есть. Если снят — снять формулировку из docs/README.md:25 и записать снятие носителем (строка бэклога или D-нота), иначе слово владельца исчезает вместе с редакцией промта.
- уверенность автора: подтверждено исполнением (grep по живому файлу + git show прежней редакции)
2. [major] docs/README.md:25 — против docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md §4.5 (строки 76–83) и docs/PROGRESS.md:366 (строка 295) ✅ закрыто e4097cb
- утверждение: «приоритет владельца №1: канон в прогон (295) · гард перекрытия окон (267) · честный комментарий постчека (318) · не уничтожать принятую редактуру (322 а/б) · два ложных комментария»
- факт по дереву: Два из пяти пунктов пак НЕ несёт. §4.5 промта: «Строка 295 (подать подписанный канон в прогон) — снята из этого пака: у бэкенд-сессии нет ни книги, ни стенда, ни санкции на деньги» и «Строка 322 (история принятой редактуры) — другой предмет: жизненный цикл чекпойнтов и схема, а не закон банка. Отдельным паком». То же подтверждают строка бэклога 295 («ПОЛОВИНЫ НАЗВАНЫ 06.09 … у бэкенд-сессии нет ни книги, ни стенда, ни денег, поэтому половина её не является») и D39.217 п.6 («Строка 295 снята из бэкенд-пака»). Холодный вход по CLAUDE.md читает ЭТУ таблицу первым делом и получает состав пака, противоречащий самому промту.
- улика: sed -n '25p' docs/README.md (полный текст ячейки процитирован выше). // grep -n '295' docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → ровно 1 хит, строка 80: «Строка 295 … снята из этого пака». // grep -n '^| 295 |' docs/PROGRESS.md → :366 «(б) Бэкенд — только ВОПРОСОМ, а не задачей». // grep -n '^| N |' контроль: в docs/PROGRESS.md 230 строк бэклога вида '^| N |', все 12 номеров, цитируемых обоими промтами (161,267,282,283,286,295,318,320,321,322,325,326), дают ровно по 1 хиту — битых номеров нет.
- предложенная правка: Переписать ячейку docs/README.md:25 под живой состав пака: гард перекрытия окон (267) · совет, который движок не исполняет (320а) · честный комментарий постчека (318) · два ложных комментария (321 и половина 322); из состава убрать «канон в прогон (295)» и «не уничтожать принятую редактуру (322 а/б)», назвав рядом, что обе половины отложены (295 — полигон/владелец, 322 — отдельный дизайн-пак).
- уверенность автора: подтверждено исполнением
3. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:37-38 ✅ закрыто e4097cb
- утверждение: «Комментарий не доказывает поведение (
D39.214п.3): источник утверждения о СМЫСЛЕ — тест или прогон. ⚠ Эту норму НЕ ищи грепом вCLAUDE.md— её там нет, она живёт нотой.» - факт по дереву: Нота существует (05-decisions-log.md:2670, статус ✅, эрраты против неё нет), и вторая половина утверждения ВЕРНА (в CLAUDE.md нормы действительно нет). Но пункт назван не тот, и приписанная формулировка — обратная содержанию. D39.214 п.3 (:2676) — не про комментарии, а про ПИНЫ, и говорит ровно противоположное: «ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО … доказано ОТОБРАЖЕНИЕ, а сказано про ЖИЗНЬ … Цитируя пин в утверждении о ЗНАЧЕНИИ, спрашивать надо не «зелен ли он», а «ТО ЛИ ОН МЕРИТ»». То есть п.3 предупреждает, что тест НЕ является достаточным источником утверждения о смысле, а промт цитирует его как «источник утверждения о СМЫСЛЕ — тест или прогон». Комментарийная половина нормы живёт в п.2(в) (:2674): «Комментарий провода
wireBook.Structureперечислял ТРИ значения из четырёх ⇒ … список в комментарии протухает молча и читается как обещание». - улика: grep -n '^## D39.214 ' docs/architecture/05-decisions-log.md → :2670; тело 2670–2681 прочитано целиком. Пункты: :2674 = п.2, :2676 = п.3 (цитаты выше). // Проверка второй половины утверждения ИСПОЛНЕНИЕМ: grep -ni 'комментар' CLAUDE.md → 1 хит, строка 21, и он про язык кода («код и комментарии — по-английски»), а не про норму. КОНТРОЛЬ рядом с этим нулём: в том же CLAUDE.md 114 строк, и обе соседние нормы, которые промт ссылает на CLAUDE.md, там ЕСТЬ — 'МУТАЦИЯ ЗАСЧИТЫВАЕТСЯ' :85, 'КОНТРОЛЬНАЯ в
- предложенная правка: В docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:37 заменить ссылку на
D39.214п.2(в) и добавить отдельной строкой настоящий п.3 — «цитируя пин, спрашивать не «зелен ли он», а «ТО ЛИ ОН МЕРИТ»»: он прямо обслуживает §5.1 (таблица мутаций) и §6 («тест утверждает не то, что думает»), а сейчас пак ссылается на него формулировкой, которую пункт опровергает. - уверенность автора: подтверждено исполнением (тело ноты прочитано, греп по CLAUDE.md с контрольными величинами)
4. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:29 ✅ закрыто e4097cb
- утверждение: «Ратифицированное, что нужно для работы, — в теле промта, чтобы не искать (
D39.216требует так):» - факт по дереву: D39.216 (:2702, ✅, эрраты нет) требует не этого. Её п.4 (:2710): «Где обязан стоять. Строкой «делай РОВНО так» в КАЖДОМ паке, где есть проектирование…» — то есть нота требует присутствия СВОЕЙ строки (мандата чистоты), а не общего правила «класть ратифицированное в тело промта». Общее правило есть, но у него другие носители: CLAUDE.md:109 («ратифицированное вложено в тело промта, остальное берётся грепом по мере вопросов») и docs/ORCHESTRATOR_SESSION_PROMPT.md:79. Атрибуция расширена за пределы тела ноты — ровно тот класс, который D39.216 п.2 сам про себя и фиксирует (носитель называть точно).
- улика: grep -n '^## D39.216 ' docs/architecture/05-decisions-log.md → :2702; тело 2702–2712 прочитано целиком, п.4 процитирован. // grep -rn 'в теле промта' docs/ --exclude-dir=prompts --exclude-dir=reports → 4 хита: ORCHESTRATOR_SESSION_PROMPT.md:79 и три самих пака. grep -n 'тело промта|в теле промта' CLAUDE.md → :109. КОНТРОЛЬ: 'промта' в CLAUDE.md — 4 хита. // Реестр: 05-decisions-index.md:277 — статус ✅ (контроль: в реестре 265 строк '^| D').
- предложенная правка: В docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:29 сослаться на носителя правила —
CLAUDE.md§Онбординг — аD39.216оставить там, где он действительно обязателен: строкой мандата чистоты в списке ниже (она там уже стоит, строки 34–36). - уверенность автора: подтверждено исполнением
5. [minor] docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:49-50 (блок «**Ратифицированное — в теле промта:**») ✅ закрыто e4097cb
- утверждение: «Продуктовых КВОТ и фри-тир-лимитов нет и не проектируется; оплаты в бете нет, пополнение — из админки. Первую внешнюю книгу впускает владелец.»
- факт по дереву: Первые два предложения ратифицированы и проверены: D39.176 п.1 (:1643) — «Продуктовых КВОТ НЕТ … «никаких квот, мы живём на покупке API; на аккаунты бонусы зачисляются из админки» … ⛔ фри-тир-лимиты не проектировать»; п.2 (:1644) — «Продажа ПЛАНИРУЕТСЯ, но не в бете … бета остаётся закрытой». Третье предложение носителя не имеет НИГДЕ, кроме самого промта, и вдобавок противоречит двум живым носителям: строка бэклога 326 (PROGRESS.md:406) — «КРИТЕРИЯ ВПУСКА ПЕРВОГО ПОЛЬЗОВАТЕЛЯ В РЕПОЗИТОРИИ НЕ СУЩЕСТВУЕТ … формулировку утверждает ВЛАДЕЛЕЦ», и D39.217 п.7 (:2730), где «Определение беты (консьерж против самообслуживания; критерия впуска в дереве НЕТ, строка 326)» стоит ПЕРВЫМ в списке «Вопросы ВЛАДЕЛЬЦА, ждущие его слова» — то есть кто именно впускает, сегодня как раз и не решено.
- улика: grep -n '^## D39.176 ' → :1639, тело прочитано; п.1 :1643, п.2 :1644 (цитаты выше); эррата 30.08-а бьёт по п.5 (
PD-421), не по п.1 — grep -n 'Эррата' | grep D39.176 → 1 хит, :25. // grep -rni 'впускает владелец|первую внешнюю книгу|первого платящего' docs/ platform/docs/ --exclude-dir=prompts --exclude-dir=reports --exclude-dir=archive → 2 хита, ОБА в самом PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (:5 и :50). КОНТРОЛЬ рядом с нулём: греп 'критери. впуска' по тем же живым докам даёт 7 хитов — пре - предложенная правка: В docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:49-50 проставить носителя первым двум предложениям (
D39.176п.1 и п.2), а фразу «Первую внешнюю книгу впускает владелец» либо убрать из блока «Ратифицированное», либо переписать тем, что действительно ратифицировано («бета остаётся ЗАКРЫТОЙ,D39.176п.2; кто и по какому критерию впускает — открытый вопрос владельца, строка 326 /D39.217п.7»). - уверенность автора: подтверждено исполнением
6. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:24 (§3 «Карта чтения — ЗАКОН, дальше только по её ссылкам») ✅ закрыто e4097cb
- утверждение: «2. Строки бэклога 267, 318, 320 (
docs/PROGRESS.md, греп^| N |).» - факт по дереву: Пак работает с ЧЕТЫРЬМЯ предметами, и два из них живут строками, которых карта не называет: §4.4 заказывает снять ложные комментарии «строки 321 и 322». Карта объявлена ЗАКОНОМ («дальше только по её ссылкам»), так что сессия, исполняющая её буквально, читает разбор для двух заказов и не читает для двух других — а именно в строке 321 лежит замер 06.09 (86 % многоединичных глав), которым обосновано «оправдание ложно», и в строке 322 — адрес ложного комментария
chunkstatus.go:52-57. Прежняя редакция промта (6457d77:12) называла в карте пять строк, включая 322; при переписывании список сократили, а §4.4 остался. - улика: sed -n '24p' и строки 68–74 промта (§4.4 «Два ложных комментария — снять (строки 321 и 322)»). // git show 6457d77:…:12 → «Строки бэклога 295, 267, 318, 320, 322». // Обе недостающие строки в дереве есть и несут именно тот разбор: grep -n '^| 321 |' docs/PROGRESS.md → :400 («ЗАМЕР 06.09 … 1962 многоединичных, то есть 86 %»); '^| 322 |' → :401 («комментарий
backend/internal/store/chunkstatus.go:52-57про «резюм переписывает строку» ЛОЖЕН»). КОНТРОЛЬ: все 12 цитируемых номеро - предложенная правка: Дописать в карту чтения docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:24 строки 321 и 322 (карта остаётся в пределах ≤5 позиций: это тот же пункт 2).
- уверенность автора: подтверждено исполнением
Линза agent8 — находок 6
Охват (словами агента): ЧИТАЛ ЦЕЛИКОМ: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (176 строк, весь предмет) · docs/scripts/carriers.py (108 строк, исходник прибора) · тело D39.214 (docs/architecture/05-decisions-log.md строки 2670–2685, 16 строк) · platform/internal/httpapi/project.go строки 20–50 · platform/internal/httpapi/v0.go строки 190–230 · platform/internal/ingest/tail.go строки 155–205 · platform/internal/books Что агент НЕ проверил: НЕ ПРОВЕРЕНО (третий исход, не выдаю за первый): 1. «Ручной проход контролёра давал 69» (§4.0, строка 74 промта) — воспроизвести нечем: это утверждение о прошлом ДЕЙСТВИИ человека/сессии, а не о дереве. Прибор даёт 55 (подтверждено исполнением), но откуда 69 — в дереве не выводится ни из какого
7. [blocker] docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:12-14 (§1, второй буллет) ✅ закрыто e4097cb
- утверждение: «заклинивший прогон невидим: живой прогон с намертво заблокированной расплатой не показывается ни на одной поверхности и не лечится штатной ручкой; вывести его может только пользователь, нажав Stop, и никто ему об этом не говорит (
PD-424)» - факт по дереву: Ряд PD-424 сам объявляет ВСЕ ТРИ названные болезни вылеченными, а промт цитирует первую редакцию ряда. В теле ряда: «⚠ СУЖЕНА пак P12 (30–31.08), НЕ ЗАКРЫТА — половина «невидим» вылечена…», «Сегодня пользователь выводит прогон из состояния кнопкой Stop, и теперь об этом хотя бы говорят все три поверхности PD-385», «⚠ РУЧКА ПОСТРОЕНА паком «закрыть цикл» (04.09) — строка СУЖЕНА до своего остатка, не закрыта.». Настоящий остаток, ради которого ряд открыт, в промте не назван вовсе: «отсутствие процесса доказывается ОДИН раз, в момент команды, и между этим ответом и коммитом транзакции есть окно, в которое юнит может подняться заново… закрыть его может только фактически транзакционная проба — арбитр в хранилище, а не ещё одна проверка в CLI».
- улика: grep "^| PD-424 |" platform/docs/DEFECT_REGISTER.md → ряд на строке 27, статус (awk -F'|' $(NF-2)) =
open. Код подтверждает все три починки: grep -rn 'run abandon|AbandonRun' platform/cmd platform/internal --include=*.go | grep -v _test → platform/cmd/tmplatformctl/runs.go:412fs := flag.NewFlagSet("run abandon", …)platform/cmd/tmplatformctl/main.go:57run 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 и :197return pos, want, ErrForeignStreamAhead(остановка чтения) platform/internal/runs/reconcile.go:728case 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 мс и сами формулируют это как «2–2.6 минуты», а не «по две минуты». Занижение до 30 % на числе, которое в самом ряду названо главным различителем («латентность — кандидат-различитель… порог обязан быть обоснован замером»), — сессия будет строить порог по нему.
- улика: grep "^| PD-441 |" platform/docs/DEFECT_REGISTER.md (строка 29): «три оставшихся были отменены В ТОТ ЖЕ МИГ, отработав 120756, 156469 и 156470 мс — с
cost_usd 0… соседние ЗАВЕРШЁННЫЕ вызовы того же прогона стоили $0.017409 и $0.063404… Вызов, проживший 2–2.6 минуты, до провайдера дошёл почти наверняка». sed -n '23p' docs/PROGRESS.md (CURRENT-STATE) — те же числа: «отработав 120756, 156469 и 156470 мс… вызовы шли 2–2.6 минуты, их цены в леджере нет»; там же $0.063404, ≈$0.05–0.19 на - предложенная правка: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md §1: написать «прожили 2–2.6 минуты (120756 / 156469 / 156470 мс)» — ровно как оба носителя, чтобы порог различителя строился по настоящим числам.
- уверенность автора: подтверждено исполнением (цитаты обоих носителей)
Линза agent10 — находок 16
Охват (словами агента): НОРМАТИВ прочитан целиком: /home/ubuntu-26/projects/textmachine/docs/ORCHESTRATOR_SESSION_PROMPT.md строки 68–113 (секция «Пишешь промт сессии?»), снято sed -n '60,140p' — 46 строк норматива: 12 нумерованных блоков (:76–97), абзац «Плюс к любому промту» (:99–108, 8 элементов), абзац «В КОДОВЫЙ промт дополнительно» (:110–113, 5 элементов). Контроль, что читаю живой файл: файл 294 строки, grep *Что агент НЕ проверил:* 1. НЕ ПРОВЕРЕНА ИСТИННОСТЬ КОДОВЫХ УТВЕРЖДЕНИЙ обоих промтов — она вне предмета сверки, и я в код не ходил: бэкенд §4.2 «гвард полисемии статус НЕ СМОТРИТ вовсе» (:54), §4.3 «код при найденной форме делает continue`» (:61-62), §4.4 «глава регулярно делится на несколько правочных единиц» (:70-71); п
13. [blocker] docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:144-146 (§9) вместе с :157-161 (§12) ✅ закрыто e4097cb
- утверждение: «## 9. Эхо-протокол старта — ≤10 строк ДО работы: скоуп · инварианты · не-делать.»
- факт по дереву: Блок 9 ВЫРОЖДЕН: у эха нет ни адресата, ни даже глагола отправки — три слова после двоеточия. Букву удовлетворяет десять строк, написанных в собственный скрэтчпад: никто их не увидит, разойтись с заказом будет негде. Норматив (ORCHESTRATOR_SESSION_PROMPT.md:97) требует сверх этого связки с блоком 12: «эхо (блок 9) идёт первым действием по адресу из файла и служит проверкой канала». §12 промта про эхо не говорит вовсе — канал остаётся непроверенным до первого настоящего вопроса, то есть до момента, когда проверять уже поздно.
- улика: sed -n '144,146p' → «## 9. Эхо-протокол старта» / пусто / «≤10 строк ДО работы: скоуп · инварианты · не-делать.»; sed -n '157,161p' — §12 несёт путь, «свой блок первым делом», ListAgents и «роли нет ⇒ нормальный случай», слова «эхо» в §12 нет. Контроль: grep -ci 'пинг' по файлу = 5 (греплю живой файл). Норматив: sed -n '90p;97p' docs/ORCHESTRATOR_SESSION_PROMPT.md → «9. Эхо-протокол старта: ≤10 строк … ДО работы» и «эхо (блок 9) идёт первым действием по адресу из файла и служит проверкой канала»
- предложенная правка: Заменить тело §9 (строка 146) на: «≤10 строк ДО первой правки: скоуп (что берёшь) · инварианты (что обязано уцелеть) · не-делать (что в паке запрещено). ⚠ Отправь их ПЕРВЫМ действием по адресу оркестратора из
/tmp/textmachine-channel— это и есть проверка канала: адрес не отвечает или блока нет ⇒ канала нет, эхо идёт секцией в отчёт, и дальше действует §12. Если эхо разойдётся с заказом — лучше здесь, чем в приёмке.» И в §12, после «живость —ListAgents» (строка 159), добавит - уверенность автора: подтверждено исполнением (sed/grep по обоим файлам)
14. [blocker] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:117-120 (§9) вместе с :131-135 (§12) ✅ закрыто e4097cb
- утверждение: «ДО работы пришли ≤10 строк: скоуп … · инварианты … · не-делать …»
- факт по дереву: Блок 9 ВЫРОЖДЕН слабее платформенного, но по той же причине: глагол «пришли» есть, АДРЕСАТА нет. Соседний §7 адресата называет («пришли оркестратору ≤15 строк», :109), §9 — нет, и разница читается как намеренная. Связки «эхо первым действием по адресу из файла = проверка канала» (норматив :97) в §12 нет.
- улика: sed -n '117,120p' → «## 9. Эхо-протокол старта» … «ДО работы пришли ≤10 строк: скоуп (что берёшь) · инварианты (что обязано уцелеть) · не-делать»; sed -n '109p' → «До первой правки пришли оркестратору ≤15 строк». grep -c 'эхо' в §12-области = 0. Контроль: grep -ci 'пинг' по файлу = 5.
- предложенная правка: В строке 119 после «ДО работы пришли» вставить адресата и функцию проверки: «ДО работы пришли оркестратору — первым действием, по адресу из
/tmp/textmachine-channel≤10 строк: …». В §12 после «живость сверяйListAgents» (:134) добавить предложение: «Эхо §9 — первое сообщение по этому адресу; молчание адреса и есть ответ «канала нет».» - уверенность автора: подтверждено исполнением (sed/grep)
15. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл, 150 строк) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл, 176 строк) ✅ закрыто e4097cb
- утверждение: Отсутствует требование норматива для кодового промта: «перед отчётом сверь каждый клейм с результатом инструмента ЭТОЙ сессии».
- факт по дереву: НЕТ ни в одном. Блок 8 обоих промтов покрывает только ЧИСЛА и КАТЕГОРИКУ («Любое число и любая категорика в отчёте — с командой», Б:114; «Числа и категорика — с командой и её выводом», П:141) и не покрывает клеймы о поведении кода — а оба пака состоят как раз из таких («код при найденной форме делает
continue», Б:62; «гвард полисемии статус не смотрит вовсе», Б:54). Не сказано и «ЭТОЙ сессии»: клейм, унаследованный из строки бэклога или из чужого отчёта, формально проходит блок 8, хотя ни один инструмент этой сессии его не подтверждал. - улика: grep -ci 'клейм' = 0 и 0; grep -ci 'инструмента ЭТОЙ' = 0 и 0. Контроль: grep -ci 'пинг' = 5 и 5, grep -c 'отчёт' = 3 и 1. Норматив: docs/ORCHESTRATOR_SESSION_PROMPT.md:110 «В КОДОВЫЙ промт дополнительно: «перед отчётом сверь каждый клейм с результатом инструмента ЭТОЙ сессии»».
- предложенная правка: Добавить абзацем в §8 обоих промтов (после Б:115 и П:142): «⛔ Перед отчётом пройди по СВОИМ утверждениям и у каждого спроси, каким инструментом ЭТОЙ сессии оно получено. Не только числа: клейм «код делает X» — тоже клейм. Унаследованный из строки бэклога или чужого отчёта клейм своим не становится: либо пере-проверь, либо помечай «унаследовано, не проверял».»
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
16. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:143-150 (§Отчёт) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:169-176 (§Отчёт) ✅ закрыто e4097cb
- утверждение: Отсутствует требование норматива для кодового промта: «последний абзац — план/обещание? сделай сейчас».
- факт по дереву: НЕТ ни в одном. Оба §Отчёт кончаются перечнем того, что положить в отчёт, и ни один не запрещает закончить работу обещанием. Для этих паков риск не теоретический: у бэкенда §4.2 допускает исход «привести совет к тому, что код делает ИЛИ научить гвард смотреть статус» — второй ведёт к «остаётся сделать»; у платформы §4.1 допускает «объявить маржу», что легко превращается в «маржа объявлена, показ пользователю — следующим паком».
- улика: grep -ci 'последний абзац' = 0 и 0; grep -ci 'план/обещание' = 0 и 0; grep -ci 'сделай сейчас' = 0 и 0. Контроль: grep -c 'отчёт' = 3 и 1, grep -ci 'пинг' = 5 и 5. Норматив: ORCHESTRATOR_SESSION_PROMPT.md:111 «·«последний абзац — план/обещание? сделай сейчас»».
- предложенная правка: Добавить последней строкой §Отчёт в обоих промтах: «⛔ Перечитай последний абзац своего отчёта. Если он — план или обещание («остаётся», «следующим шагом», «стоит потом»), сделай это СЕЙЧАС или назови пингом как отдельную строку бэклога. Обещание в хвосте отчёта не исполняет никто: сессия кончится вместе с ним.»
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
17. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:85-98 (§5) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:115-125 (§5) ✅ закрыто e4097cb
- утверждение: Отсутствует требование норматива для кодового промта: «дифф
^func Test— исполнением, не памятью». - факт по дереву: НЕТ ни в одном, при том что оба §5 построены ВОКРУГ пинов («Мутационная проверка каждого пина, который ты заводишь или трогаешь», Б:89, П:117) и оба §Отчёт требуют таблицу мутаций. То есть промт заказывает отчёт о тестах и не даёт механизма, которым состав тестов снимается: сессия перечислит пины по памяти о том, что писала, а не диффом — ровно тот класс, на который D39.121 и опирается.
- улика: grep -cE 'func Test' = 0 и 0; grep -ci 'дифф' = 0 и 0. Контроль: grep -ci 'пин' даёт живые хиты, sed -n '89p' Б → «1. Мутационная проверка каждого пина, который ты заводишь или трогаешь.». Норматив: ORCHESTRATOR_SESSION_PROMPT.md:112 «·«дифф
^func Test— исполнением, не памятью»». - предложенная правка: Добавить пунктом в §5 обоих промтов: «Состав тестов снимается ДИФФОМ, не памятью. Прежде чем назвать в отчёте, какие пины ты завёл или тронул, выполни
git diff -U0 -- <своя зона> | grep -E '^[+-]func Test'и цитируй ВЫВОД. Список «по памяти о написанном» регулярно расходится с деревом: тест, переименованный по ходу, попадает в отчёт дважды, а удалённый — ни разу.» - уверенность автора: подтверждено исполнением (grep с контрольными величинами)
18. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:93-96 (§5.2) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:122-124 (§5.3) ✅ закрыто e4097cb
- утверждение: Отсутствует требование норматива: «интервальная самоверификация субагентом в длинной сессии против ЯВНЫХ критериев (D39.121)».
- факт по дереву: НЕТ ни в одном: у обоих есть только ТЕРМИНАЛЬНЫЙ опровергатель — «Опровергатель твоей ГОТОВОЙ работы» (Б:93, П:122). Интервальной проверки по ходу нет, и ЯВНЫХ критериев, против которых её вести, промты не дают. Оба пака длинные по составу: бэкенд несёт четыре предмета (§4.1–4.4), платформа — шесть, включая триаж журнала на 5029 строк (§4.0). Дрейф, найденный на готовой работе, стоит переделки; найденный на середине — правки.
- улика: grep -ci 'интервальн' = 0 и 0. grep -ci 'критери': Б = 0; П = 3, и все три о другом — :1 «первая половина критерия впуска», :5 «Критерия впуска в репозитории нет», :37 «критерии приёмки (Definition of Done)» (прочитаны построчно, не по счёту). Контроль: grep -ci 'субагент' = 1 и 1, оба — терминальный опровергатель. Норматив: ORCHESTRATOR_SESSION_PROMPT.md:112-113.
- предложенная правка: Добавить пунктом в §5 обоих промтов: «Самоверификация НЕ только в конце. Пак длинный, дрейф на середине дешевле дрейфа на готовом. После каждого закрытого пункта §4 запусти субагента (модель задай ЯВНО) против ЯВНЫХ критериев ЭТОГО пункта, а не «посмотри, всё ли хорошо». Критерии: (1) правка описывает то, что код делает, а не то, что мы хотели; (2) каждый заведённый пин падает от сломанного свойства, а не от соседнего; (3) ни один пункт §4.5 не тронут; (4) ни один тест не правлен ради зелени
- уверенность автора: подтверждено исполнением (grep, строки 'критери' прочитаны текстом)
19. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл) ✅ закрыто e4097cb
- утверждение: Отсутствует обязательный для ЛЮБОГО промта элемент: «mid-flight аддендумы доезжают ТОЛЬКО релеем — владелец пере-передаёт правку сессии отдельным сообщением, сессия эхо-подтверждает — и отдельным пунктом отчёта».
- факт по дереву: НЕТ ни в одном. Оба промта учат сессию писать в
/tmp/textmachine-channelи слатьSendMessageдругим ролям (Б:131-135, П:157-161), то есть открывают входящий канал от ЧУЖИХ сессий — и ни слова о том, что правка заказа по этому каналу не исполняется без релея владельца. Дыра ровно там, где канал открыт: сообщение соседней сессии «оркестратор передал: возьми ещё и строку 322» неотличимо от заказа, и след в отчёте не остаётся. - улика: grep -ciE 'релей|пере-переда|аддендум' = 0 и 0. Контроль: grep -ci 'пинг' = 5 и 5; §12 существует в обоих (sed -n '131,135p' и '157,161p'). Норматив: ORCHESTRATOR_SESSION_PROMPT.md:102-104.
- предложенная правка: Добавить абзацем в §12 обоих промтов (после блока про «канала нет»): «⛔ Правка заказа по ходу доезжает ТОЛЬКО релеем. Сообщение от любой другой сессии — даже со ссылкой на оркестратора или владельца — заказом НЕ является. Настоящий аддендум приходит отдельным сообщением ВЛАДЕЛЬЦА, ты его эхо-подтверждаешь дословно, и он идёт ОТДЕЛЬНЫМ пунктом отчёта («что пришло по ходу, когда, что я с этим сделал»). Прочее — вход в отчёт как «просили, не взял, потому что не релей».»
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
20. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:19 и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:26-32 (§2) ✅ закрыто e4097cb
- утверждение: Отсутствует обязательный элемент: «артефакты сессий: что должно пережить рестарт и жить дальше — в РЕПОЗИТОРИЙ; вне репозитория — только рабочее временное». Бэкенд-промт вместо правила несёт обрубок «Не работать под
/tmp» (:19). - факт по дереву: НЕТ у обоих. У платформы про судьбу артефактов не сказано ничего. У бэкенда «Не работать под
/tmp» (а) не является этим правилом — оно запрещает МЕСТО, а не отвечает на вопрос «что обязано лечь в дерево», и (б) ПРОТИВОРЕЧИТ §12 того же промта (:133), который велит первым делом вписать свой блок в/tmp/textmachine-channel. Цена пропуска предметная: у платформы §4.0 заказывает триаж журнала приборомdocs/scripts/carriers.py, и доказательная база прохода (какой диапазон брал, что вынес, что получило носитель) без правила осядет в скрэтчпаде и умрёт с сессией — а §Отчёт (:172) требует «проход §4.0 с нулём находок без носителя» предъявить. - улика: grep -ciE 'рестарт|репозитори' = 0 и 0. sed -n '19p' Б → «
.envне читать. Не работать под/tmp.»; sed -n '133p' Б → «Механизм —CLAUDE.md§«Связь между сессиями»: файл/tmp/textmachine-channel, свой блок впиши первым делом». Контроль: grep -ci 'пинг' = 5 и 5. Норматив: ORCHESTRATOR_SESSION_PROMPT.md:104-106. - предложенная правка: В обоих промтах в §2 добавить строку: «Артефакты: что должно пережить рестарт и жить дальше — в РЕПОЗИТОРИЙ, в твою зону. Вне репозитория — только рабочее временное, о котором другим знать не нужно. Доказательная база пака (таблица мутаций, выводы прибора, диапазоны) — в дерево, а не в скрэтчпад.» В бэкенд-промте строку 19 переписать так, чтобы она не спорила с §12: «
.envне читать. Рабочее дерево — не под/tmp; единственное исключение — канал/tmp/textmachine-channel(§12), он и обяза - уверенность автора: подтверждено исполнением (grep + чтение строк 19 и 133)
21. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл) ✅ закрыто e4097cb
- утверждение: Отсутствует обязательный элемент «дисциплина ответа в каждый промт: эрудиция ≠ улика (грунт
file:line/замер или пометка «мнение»)». - факт по дереву: НЕТ ни в одном. Соседние нормы стоят — «Число называет ДЕРЕВО и ПОПУЛЯЦИЮ» (Б:39, П:51) и «рядом с нулём — контрольная величина» (Б:40, П:51) — но обе про ЧИСЛА. Правила для НЕ-числовых утверждений нет, и главное — нет разрешённого выхода «пометка «мнение»»: сессии, у которой нет улики, промт не оставляет честного способа высказаться, и она оденет догадку в утверждение. У бэкенда это прямо в предмете: §4.2 требует «Выбор объяви и обоснуй», а чем обоснуй считается — не сказано.
- улика: grep -ciE 'эрудиц|мнение' = 0 и 0. Контроль: grep -ci 'пинг' = 5 и 5; sed -n '39,40p' Б → «- Число называет ДЕРЕВО и ПОПУЛЯЦИЮ…» и «- Рядом с нулём — контрольная величина…». Норматив: ORCHESTRATOR_SESSION_PROMPT.md:106-108.
- предложенная правка: Добавить строкой в §3 (список ратифицированного) обоих промтов, рядом с «Число называет ДЕРЕВО и ПОПУЛЯЦИЮ»: «- Эрудиция уликой не является. Утверждение в отчёте — либо грунтовано
file:line/выводом команды, либо помечено «мнение». Третьего нет; неразмеченное читается приёмкой как замер и пере-ранится.» - уверенность автора: подтверждено исполнением (grep с контрольными величинами)
22. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:107-110 (§7) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:134-137 (§7) ✅ закрыто e4097cb
- утверждение: Блок 7 норматива — «Записка-план / комплектность против заказа механически». Записка ЕСТЬ, механической сверки комплектности НЕТ.
- факт по дереву: Оба §7 требуют только СТАРТОВУЮ записку («До первой правки пришли оркестратору ≤15 строк», Б:109; «≤15 строк оркестратору», П:136). Ни один не требует в конце механически пройти по записке и заказу и предъявить, что закрыто, что нет и почему — то самое «движение по записке» из D39.121. Без этого тихо выпавший пункт неотличим от сделанного: у бэкенда пунктов четыре (§4.1–4.4), у платформы шесть (§4.0–4.3 плюс два запрета), и §Отчёт обоих просит рассказ, а не сверку.
- улика: grep -ci 'комплектност' = 0 и 0; контроль — в нормативе 'комплектност' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:88 «7. Записка-план / комплектность против заказа механически — для паков среднего+ веса (D39.121)»). grep -ciE 'пере-ран|пере-прогон' = 0 и 0 (контроль: в нормативе 'пере-ран' = 1).
- предложенная правка: Добавить вторым абзацем §7 обоих промтов: «И тем же списком закрываешься. Перед отчётом пройди по записке и по §4 МЕХАНИЧЕСКИ, пункт за пунктом, и предъяви таблицу «пункт → статус (сделано / не сделано / отказался) → улика (команда и вывод либо
file:line)». Пункт без строки в этой таблице считается невыполненным, а не забытым: рассказ о работе комплектность не доказывает.» - уверенность автора: подтверждено исполнением (grep с контрольными величинами в обе стороны)
23. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:100-105 (§6) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:127-132 (§6) ✅ закрыто e4097cb
- утверждение: Блок 6 норматива: «Предметные оси ревью … 1–3 оси; сессия вправе заменить с аргументом». Оси есть (2 и 3), права замены нет.
- факт по дереву: НЕТ у обоих. Бэкенд-промт формулировкой «Из таблицы приёмки, две оси, обе твои» (:102) даже усиливает обратное — «обе твои» читается как «эти и никакие другие». Цена: сессия, нашедшая, что предмет уязвим по третьей оси (например, у платформы — по совместимости контракта), формально не имеет права её взять и промолчит.
- улика: grep -ciE 'вправе заменить|заменить ось|заменить с аргумент' = 0 и 0. Контроль: grep -ci 'ось|оси' даёт живые хиты, sed -n '102p' Б → «Из таблицы приёмки, две оси, обе твои:». Норматив: ORCHESTRATOR_SESSION_PROMPT.md:86-87 «6. Предметные оси ревью … 1–3 оси; сессия вправе заменить с аргументом».
- предложенная правка: Добавить последней строкой §6 обоих промтов: «⚠ Оси — мой приор, не потолок. Увидел, что предмет уязвим по другой оси — бери её и скажи, чем она сильнее моей. Замена с аргументом законна; молчаливая подмена — нет.»
- уверенность автора: подтверждено исполнением (grep с контрольной величиной)
24. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:45-83 (§4) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:56-113 (§4) ✅ закрыто e4097cb
- утверждение: Блок 4 норматива: «Советы — приорами с пометкой «опровергается аргументом/замером»». Пометки нет ни в одном.
- факт по дереву: НЕТ у обоих, при том что советы в теле есть и они конкретны: «Два честных выхода: привести совет к тому, что код делает, или научить гвард смотреть статус» (Б:55-56) и «честный выход — объявить маржу и показать её пользователю» (П:89-90). Без пометки перечень читается как исчерпывающий: сессия, нашедшая третий и лучший выход, будет выбирать из двух названных.
- улика: grep -ci 'опровергается' = 0 и 0; контроль — в нормативе 'опровергается' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:82). Строки советов прочитаны: sed -n '55,56p' Б, sed -n '89,90p' П.
- предложенная правка: Добавить строкой в конец преамбулы §4 обоих промтов: «⚠ Все советы ниже — приоры, а не список исходов: каждый опровергается аргументом или замером. Нашёл выход, которого здесь нет и который лучше, — бери его и назови, чем он лучше моего.»
- уверенность автора: подтверждено исполнением (grep с контрольной величиной)
25. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:126-129 (§11) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:152-155 (§11) ✅ закрыто e4097cb
- утверждение: Блок 11 норматива: «Канал вопросов («конфликт промта с кодом/доками → пинг через владельца, НЕ интерпретация»)». Оба говорят просто «пинг, не правка».
- факт по дереву: Адресат пинга в §11 не назван ни в одном («Конфликт промта с кодом или доками — пинг, не правка», Б:128; «Конфликт промта с кодом — пинг, не правка», П:154), и слово «интерпретация» отсутствует. Платформенный вдобавок СУЗИЛ норму, выронив «доками»: конфликт промта с ДОКОМ формально под §11 не попадает (частично страхует §4.4 :108 «пинг, не правка» про два малых дока, но только про них). Право отказаться — ЕСТЬ у обоих, эта половина блока в порядке.
- улика: grep -c 'через владельца' = 0 и 0; контроль — в нормативе 'через владельца' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:92). grep -c 'владельц': Б = 4 (:5, :23, :34, :50 — ни одного в §11), П = 3 (:29, :36, :46 — ни одного в §11), строки прочитаны текстом.
- предложенная правка: Переписать первую фразу §11 в обоих: «Конфликт промта с кодом ИЛИ с доками — пинг через владельца, а не интерпретация: он единственный вечный канал и он же пере-передаёт мне. Молчаливо истолковать расхождение в свою пользу — худший из исходов, потому что след теряется вместе с сессией.»
- уверенность автора: подтверждено исполнением (grep + чтение всех хитов 'владельц')
26. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4, заголовок) против :78-79 (§4.5) ✅ закрыто e4097cb
- утверждение: §4.4: «Два ложных комментария — снять (строки 321 и 322) — делай РОВНО так». §4.5: «Строка 322 (история принятой редактуры) — другой предмет … Отдельным паком.»
- факт по дереву: Одна и та же строка бэклога названа в одном промте и заказанной, и исключённой, и нигде не сказано, что берётся только её попутный кусок. Разрешение существует в дереве, но добывать его сессии придётся самой: строка 322 действительно несёт ДВА предмета — основной («указатель принятой редакции», гейт «вторая редактура не может отнять первую», D39.215) и попутный («⚠ Попутно: комментарий
backend/internal/store/chunkstatus.go:52-57про «резюм переписывает строку» ЛОЖЕН»). §4.4 заказывает попутный, §4.5 исключает основной. Риск двусторонний: недобор (сессия читает §4.5 и не трогает комментарий) либо перебор (берёт revision-контур, который сам промт называет отдельным паком). - улика: sed -n '68p' Б → «### 4.4 Два ложных комментария — снять (строки 321 и 322) — делай РОВНО так»; sed -n '78,79p' Б → «- Строка 322 (история принятой редактуры) — другой предмет: жизненный цикл чекпойнтов и схема, а не закон банка. Отдельным паком.» Строка 322 прочитана целиком из docs/PROGRESS.md (grep '^| 322 |'): несёт и «Заказ здесь узкий: указатель принятой редакции», и «⚠ Попутно: комментарий
chunkstatus.go:52-57… ЛОЖЕН». Контроль: все 12 названных промтами строк бэклога существую - предложенная правка: Переписать заголовок §4.4 (:68) так, чтобы он называл предмет, а не номер строки: «### 4.4 Два ложных комментария — снять (строка 321 целиком и ПОПУТНЫЙ комментарий строки 322) — делай РОВНО так». И в §4.5 (:78-79) уточнить границу: «- Строка 322 — её ОСНОВНОЙ заказ (указатель принятой редакции, жизненный цикл чекпойнтов, схема) — другой предмет, отдельным паком. Из неё в этот пак взят ТОЛЬКО попутный ложный комментарий
chunkstatus.go:52-57(см. §4.4); ничего сверх него не трогай.» - уверенность автора: подтверждено исполнением (sed по промту + чтение строки 322 в docs/PROGRESS.md)
27. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:37-38 ✅ закрыто e4097cb
- утверждение: «Комментарий не доказывает поведение (
D39.214п.3): источник утверждения о СМЫСЛЕ — тест или прогон.» - факт по дереву: Подномер указан мимо. Пункт 3 ноты D39.214 — про ПИН, а не про комментарий: «⭐⭐ ГЛАВНОЕ ЗА СМЕНУ: ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО … Цитируя пин в утверждении о ЗНАЧЕНИИ, спрашивать надо не «зелен ли он», а «ТО ЛИ ОН МЕРИТ»». Норма про комментарий живёт в п.2(в): «Комментарий провода
wireBook.Structureперечислял ТРИ значения из четырёх. ⇒ перечень убран СОВСЕМ: список в комментарии протухает молча и читается как обещание». Само правило в промте верно, ссылка на пункт — нет; сессия, пошедшая читать п.3, найдёт другой предмет и может решить, что промт врёт. Побочно теряется п.3 — а он этому паку нужен прямо: §5.1 велит заводить пины и предъявлять их. - улика: grep -n '39.214' docs/architecture/05-decisions-log.md → 2670 (тело
## D39.214). Прочитаны пп. 2 и 3 тела. sed -n '37,38p' промта → «- Комментарий не доказывает поведение (D39.214п.3): источник утверждения о СМЫСЛЕ — тест или прогон.» Контроль фантом-гарда: все пять цитируемых промтами номеров (D39.216, D39.104, D39.214, D39.121, D39.99) существуют строками в docs/architecture/05-decisions-index.md;^## Dв живом логе = 120. - предложенная правка: Заменить в строке 37 «(
D39.214п.3)» на «(D39.214п.2в)» и добавить туда же п.3, раз пак заводит пины: «- И «есть пин» ≠ «пин доказывает сказанное» (D39.214п.3): цитируя пин, спрашивай не «зелен ли он», а «ТО ЛИ ОН МЕРИТ».» - уверенность автора: подтверждено исполнением (греп по D-логу + чтение тела ноты)
28. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (весь файл) и docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (весь файл) ✅ закрыто e4097cb
- утверждение: Отсутствуют два обязательных для любого промта элемента: «плотность, не объём» и «без шаблонных оговорок».
- факт по дереву: НЕТ ни в одном. Ни один §Отчёт не задаёт форму ответа, и оба просят рассказ («что построено · чем предъявлено · что сказал опровергатель и что ты с этим сделал», Б:145-148, П:171-174) — формат, который без оговорки про плотность отрабатывается объёмом.
- улика: grep -ciE 'плотност|шаблонн|оговорк' = 0 и 0. Контроль: grep -c 'отчёт' = 3 и 1, grep -ci 'пинг' = 5 и 5; в нормативе 'плотность' = 1 (ORCHESTRATOR_SESSION_PROMPT.md:108).
- предложенная правка: Добавить последней строкой §Отчёт в обоих: «Плотность, не объём: строка без улики места не занимает. Шаблонных оговорок («важно отметить», «стоит учитывать», «в целом всё хорошо») не писать — они не несут ни числа, ни адреса.»
- уверенность автора: подтверждено исполнением (grep с контрольными величинами)
Линза agent12 — находок 10
Охват (словами агента): ДЕРЕВО: HEAD ff14901, git status --short | wc -l = 0 до и после работы (ничего не писал в репо; зонд исполнен через go test -overlay с файлом в песочнице). ПРОМТ: прочитан целиком — wc -l docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md = 150 строк, все 12 секций. БЭКЛОГ: прочитаны ЦЕЛИКОМ (не счётом, а текстом) 9 строк — 161, 267, 283, 286, 295, 318, 320, 321, 322; контроль популяции: `grep -cE
Что агент НЕ проверил: НЕ ПРОВЕРЕНО (называю честно, а не выдаю за подтверждённое): 1. Какие статусы реально пишет консолидация в авто-банк и намайненную дельту. Я доказал, КАКОЙ гард срабатывает при каждой комбинации статусов, но НЕ мерил, какие статусы производит обычная последовательность операций. Сама строка 267
29. [blocker] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:47-50 (§4.1) + строка бэклога 267 (docs/PROGRESS.md:344) ✅ закрыто e4097cb
- утверждение: §4.1: «Один термин в одном смысле может нести две конкурирующие формы, и обе доезжают на оба провода — дыра в проверке схлопывания… строка несёт разбор. Закрыть.» Строка 267: «точка слияния (
bankmaterialize.go, грепstoreOrder) отвергает только ТОЧНЫЙ дубль, перекрывающиеся окна проходят». - факт по дереву: В точке слияния УЖЕ стоят ДВА гарда перекрытия окон, ни один из них ни промтом, ни строкой 267 не назван. (1)
membank.ApprovedSharedKeyCollisions— вызывается вgatherBankInputs(backend/internal/pipeline/bankmaterialize.go:142) ПОСЛЕ append сида+ruby+mined+auto, условие «общий firing-ключ + РАЗНЫЙ dst + ПЕРЕКРЫВАЮЩИЕСЯ окна», и это FAIL-LOUD (прогон падает). (2)membank.UnverifiedKeyConflicts— вызывается вbackend/internal/pipeline/seeding.go:73над полным прочитанным из БД набором, ловит ровно пару «approved × неподписанная» с разным dst и перекрытием, но ВАРНИНГОМ, и это осознанный выбор с записанным доводом (backend/internal/membank/memseed.go:685-688: «aborting a paid run over the engine's own proposal would be a self-inflicted outage»). Пример строки 267 (сид [0,0] «юаньши» + майнинг [3,9] «камень первоисточника») попадает в один из этих двух гардов при ЛЮБОМ статусе м - улика: Исполнено на HEAD
ff14901, $0, без записи в репо (go test -overlay, файл-зонд в песочнице): $ cd backend && go test -overlay=/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 showff14901--stat → docs/PROGRESS.md | 2 +- (единственная правка PROGRESS в этом коммите) $ git showff14901-- docs/PROGRESS.md | grep '^[+-]| 295 ' → строка 295 переписана этим коммитом $ git log --oneline -5 -- docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md →e69902a(последняя правка промта) — коммит СТАРШЕff14901, то есть промт писан до именования половин $ grep -n "^| 295 |" docs/PROGRESS.md → 366: «…ПОЛОВИНЫ - предложенная правка: Заменить в §4.5 «если найдёшь… назови пингом» на готовый вопрос: «половина (б) уже названа строкой 295 — ответь пингом на вопрос «умеет ли сид-путь нести подписанный статус»; сама подача канона — полигон». Заодно поправить docs/PROGRESS.md:10, где тоже стоит доименовочная редакция «половину надо назвать или отдать полигону».
- уверенность автора: подтверждено исполнением
34. [major] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:47-50 (§4.1, пометка свободы) против §4.2 (строки 52-57) ✅ закрыто e4097cb
- утверждение: §4.1 помечена «делай РОВНО так»; §4.2 помечена «реши сам, аргументируй» и несёт предупреждение «⚠ Второй вариант меняет поведение — тогда это смена заказа, и нужен пинг, а не правка».
- факт по дереву: Пометки свободы стоят наоборот. §4.2 — правка одной строки текста диагностики (дёшево и обратимо). §4.1 требует решения, которое меняет поведение ПЛАТНОГО прогона и в котором строка 267 разбора не даёт: (а) что делает гард при находке — падает как
ApprovedSharedKeyCollisions(обрывает прогон) или предупреждает какUnverifiedKeyConflicts; (б) распространять ли его на неподписанные строки — а это и есть «научить гвард смотреть статус», то самое, что §4.2 объявляет сменой заказа; (в) чья форма побеждает при перекрытии. У кода на (а) уже записан аргумент ПРОТИВ стопа (memseed.go:686-688), значит любой выбор придётся объявлять с ценой поD39.216. - улика:
sed -n '212p;227p' backend/internal/membank/memseed.go — условие внутрифайлового гарда `if a.Src != b.Src || a.Dst == b.Dst || !windowsOverlap(...)` статуса не содержит;sed -n '270p' — а гард слияния его содержит:if e.Status != "approved" || strings.TrimSpace(e.Dst) == "" { continue }$ sed -n '685,689p' backend/internal/membank/memseed.go → «It is a WARNING, not a fail-loud, and deliberately so: the unsigned row is engine-produced, and aborting a paid run over the engine's own proposal - предложенная правка: Перевести §4.1 из «делай РОВНО так» в «реши сам, аргументируй» с явным перечнем развилок (падать или предупреждать · включать ли неподписанные · чья форма побеждает) и с той же оговоркой, что стоит в §4.2: превращение существующего варнинга в стоп меняет поведение оплаченного прогона ⇒ пинг, а не правка. Иначе мандат «делай РОВНО так» толкает сессию принять денежное решение молча.
- уверенность автора: подтверждено исполнением
35. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:70-72 (§4.4, первый буллет) ✅ закрыто e4097cb
- утверждение: «Оправдание
nil-переноса в редакторской волне («единица есть глава или её часть») — ложно: глава регулярно делится на несколько правочных единиц.» - факт по дереву: Скобка, названная ложной, в дереве ИСТИННА, а ложен вывод из неё. Живой комментарий:
backend/internal/pipeline/waverun.go:695-696— «Sticky is degenerate at unit scope (a unit == a chapter or a sub-chapter split, so the intra-chapter sticky window does not apply) → nil sticky_prev.» Посылка «a unit == a chapter or a sub-chapter split» верна по построениюassignEditUnits; неверно следствие «so the intra-chapter sticky window does not apply». Строка бэклога 321 формулирует это точно, промт при сжатии перевернул адресата лжи. - улика: $ sed -n '694,696p' backend/internal/pipeline/waverun.go → «// memSel (that was over the base bank). Sticky is degenerate at unit scope (a unit == a chapter or a / // sub-chapter split, so the intra-chapter sticky window does not apply) → nil sticky_prev.» $ sed -n '387,408p' backend/internal/chunk/chunker.go → «assignEditUnits groups a chapter's already-built DRAFT chunks into EDIT units — greedy packing of WHOLE draft chunks until the accumulated est_out would exceed EditCeilingOut», в теле `*
- предложенная правка: Переписать буллет: ложно не «единица есть глава или её часть», а вывод «⇒ внутриглавное окно липкости неприменимо» — потому что sticky сбрасывается на границе ГЛАВЫ, а единиц в главе несколько (86 % глав книги). Иначе сессия по «делай РОВНО так» снесёт верное утверждение и оставит неверное.
- уверенность автора: подтверждено исполнением
36. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4, заголовок «Два ложных комментария») ✅ закрыто e4097cb
- утверждение: «Два ложных комментария — снять (строки 321 и 322)» — то есть носителей ровно два.
- факт по дереву: У первого утверждения носителей в дереве ДВА, в одном файле:
waverun.go:631(«(sticky degenerate at unit scope → nil)») иwaverun.go:695-696(тот же тезис с развёрнутым оправданием). Всего снимать три места, а не два. Прямое следствие для §5.3: обязательный «греп по отозванной формулировке перед словом «исправлено»» вернёт не ноль, если сессия правит только длинный экземпляр, — и сессия сообщит «исправлено» на красном приборе. - улика: $ grep -rn "degenerate at unit scope" backend/ → 2 хита: backend/internal/pipeline/waverun.go:631 и backend/internal/pipeline/waverun.go:695 (контроль: тот же греп по всему backend/ — ровно эти два файла-строки, третьего экземпляра нет)
- предложенная правка: В §4.4 написать «два ложных УТВЕРЖДЕНИЯ, три носителя» и назвать оба места первого (
waverun.go:631и:695-696), либо просто добавить требование: перед словом «исправлено» грепdegenerate at unit scopeобязан дать ноль. - уверенность автора: подтверждено исполнением
37. [minor] docs/PROGRESS.md:344 (строка бэклога 267) — носитель, в который промт §3/§4.1 посылает сессию ✅ закрыто e4097cb
- утверждение: «гард «одна форма на главу» существует (
backend/internal/pipeline/memseed.go, грепa term has ONE rendering per chapter)» - факт по дереву: Такого файла в дереве нет с коммита
e33e3be— файл живёт по адресуbackend/internal/membank/memseed.go. Строка 320 в том же журнале цитирует уже правильный путь (backend/internal/membank/memseed.go), то есть два соседних ряда бэклога расходятся в адресе одного файла. - улика: $ ls backend/internal/pipeline/memseed.go → «No such file or directory» (контроль рядом: тот же ls на backend/internal/membank/memseed.go и backend/internal/pipeline/bankmaterialize.go — оба существуют; find backend -name 'mem*.go' даёт 15 файлов, все в internal/membank/)
$ grep -rn "a term has ONE rendering per chapter" backend/ → backend/internal/membank/memseed.go:217 (единственный хит)
$ git log --oneline --diff-filter=D -- backend/internal/pipeline/memseed.go →
e33e3be«Land pack-15 structu - предложенная правка: Поправить путь в строке 267 на
backend/internal/membank/memseed.go. Практический вред сегодня мал (строка даёт грепаемую фразу, и по ней файл находится), но это ровно тот протухший якорь, о котором предупреждает CURRENT-STATE («якоря родились верными и сгнили дрейфом»). - уверенность автора: подтверждено исполнением
38. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4) против :78-79 (§4.5) ✅ закрыто e4097cb
- утверждение: §4.4: «Два ложных комментария — снять (строки 321 и 322) — делай РОВНО так». §4.5 «Чего в паке НЕТ и почему — не делай»: «Строка 322 (история принятой редактуры) — другой предмет… Отдельным паком.»
- факт по дереву: Один и тот же номер строки в одном документе объявлен и составом пака, и исключённым из пака, без различающей оговорки. По строке 322 промт прав по существу («Заказ здесь узкий: указатель принятой редакции»), а берёт он из неё только помету «⚠ Попутно: комментарий
backend/internal/store/chunkstatus.go:52-57про «резюм переписывает строку» ЛОЖЕН» — но этого промт не говорит. - улика: $ grep -n "32[12]" docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md → 68: «Два ложных комментария — снять (строки 321 и 322)», 78: «Строка 322 (история принятой редактуры) — другой предмет»
$ grep -n "^| 322 |" docs/PROGRESS.md → 401, и в теле: «⚠ Попутно: комментарий
backend/internal/store/chunkstatus.go:52-57… ЛОЖЕН — обычный резюм её не пишет» + «Заказ здесь узкий: указатель принятой редакции» - предложенная правка: В §4.4 написать «из строки 322 берётся ТОЛЬКО её попутная помета про комментарий
chunkstatus.go:52-57; сам заказ строки (указатель принятой редакции) — не в паке, см. §4.5». Одна оговорка снимает противоречие. - уверенность автора: подтверждено исполнением
Линза agent16 — находок 9
Охват (словами агента): ПРОЧИТАНО (все пути абсолютные от /home/ubuntu-26/projects/textmachine): backend/README.md — 96 строк, целиком. backend/docs/ — 11 живых файлов, суммарно 4600 строк .md + 239 строк .puml: целиком прочитаны SEAM_FIX_PLAN.md (15), SEAM_FIX2_PLAN.md (20), SEAM_FIX3_PLAN.md (12), SEAM_PACK_PLAN.md (22), components.puml (108), pipeline.puml (131); по шапкам + адресным срезам и грепам — CHAPTER_STRUCTUR
Что агент НЕ проверил: 1. НЕ ПРОГНАНА БАТАРЕЯ. Ни одного go test не запущено вовсе (задание запрещает тесты с сетью, и я не разделяла сетевые от локальных на уровне пакета) — значит утверждения README про «зелёную батарею» и про четыре тёмных без корпуса теста НЕ ПРОВЕРЕНЫ исполнением; проверены только go build ./...
39. [major] backend/docs/components.puml:9 (плюс :32, :38, :42, :33)
- утверждение: «translate / report / status / export (--pairs) / redrive / seed-lint\nexit-контракт: 0 чисто · 1 инфра · 2 completed-with-flags · 3 майнинг-подпись»; :32 «internal/config: … CheckAdultChannel-линт»; :38 «book.yaml: … Adult bool = интерим до generic content-labels (D39.25, пак-17)»; :42 «models.yaml: … (permissive = ТИП-изоляция канала B …)»; :33 «internal/llm: … транспорт-ретраи/failover (пак-12)»
- факт по дереву: Глаголов 11, а не 6: build/manifest/backup/migrate/bank-apply в схеме отсутствуют. Exit-контракт вырос полосой отказов 10–19 с восемью типизированными классами — «1 инфра» больше не собирает отказы (комментарий у полосы прямо говорит: «every refusal used to arrive as the same exit 1»). CheckAdultChannel УДАЛЁН.
Adultв Go отсутствует вовсе, аadult: trueв book.yaml теперь падает громко с требованием content_labels.permissive:— RETIRED-ключ, ОТВЕРГАЕМЫЙ загрузкой. failover.go снесён. - улика:
sed -n '180,186p' backend/cmd/tmctl/main.go→ dispatchCommands = {translate, report, status, export, build, redrive, manifest, backup, migrate, seed-lint, bank-apply} (11).sed -n '65,78p' backend/cmd/tmctl/main.go→ refusalFirst=10 … exitBookIncomplete=16, exitRefusedOther=19.grep -rn 'CheckAdultChannel' backend --include=*.go | wc -l→ 1, и этоinternal/config/config_test.go:37«(TestCheckAdultChannel … was DELETED»; КОНТРОЛЬ:CheckRunnable→ 10 хитов. `grep -rn '\bAdult\b' backend - предложенная правка: backend/docs/components.puml: в узле CLI перечислить все 11 глаголов и заменить exit-контракт на «0 · 2 · 3 · полоса отказов 10–19 (13 schema_mismatch · 14 decisions_rejected · 15 write_incomplete · 16 book_incomplete)»; из :32 убрать CheckAdultChannel; :38 заменить
Adult boolнаcontent_labels(ключadult:отвергается загрузкой); :42 заменитьpermissiveнаaccepts_labels; из :33 убрать failover. Либо, если зона не готова обслуживать диаграмму, поставить над ней ⚠-баннер о винтаже, как - уверенность автора: подтверждено исполнением
40. [major] backend/docs/pipeline.puml:124-127
- утверждение: «Канал B (18+) [пак-17, в дизайне]: generic content-labels × provider-capabilities (D39.25) — в движке НЕТ понятия «18+». Сейчас интерим: Adult bool + channel:adult ТИП-изоляция + линт.»
- факт по дереву: Пак-17 ЗАКРЫТ ЦЕЛИКОМ (дизайн D39.26 · стройка D39.27 · дельта D39.28), «интерима» нет:
Adultв Go отсутствует,channel:— RETIRED-ключ, объявленный ОТВЕРГАЕМЫМ на загрузке,permissive:— тоже. Конфиг, написанный по этой схеме, не поднимется. - улика:
grep -rn '\bAdult\b' backend --include=*.go | wc -l→ 0 (КОНТРОЛЬ: 42 хита по 'adult' без регистра).backend/internal/config/pipeline.go:230«LegacyChannel is the RETIREDchannel:key ("" | sfw | adult), declared to be REJECTED», проверка на:979.backend/internal/config/models.go:254— отказ наpermissive:.docs/architecture/09-target-architecture.md:26— «Канал B — пак-17 ЗАКРЫТ ЦЕЛИКОМ …failover.goудалён». - предложенная правка: backend/docs/pipeline.puml: заменить note на «Канал B ПОСТРОЕН (D39.26–28): content_labels книги × accepts_labels эндпоинта, fail-closed; ключи
adult:/channel:/permissive:отвергаются загрузкой». - уверенность автора: подтверждено исполнением
41. [major] backend/docs/pipeline.puml:71-73
- утверждение: «:Сайдкары стопа [OK]: .bank-stop.txt — человеку · .bank-stop.json — машине (строка 101): ПОЛНАЯ таблица, списки списками, «роль промолчала» = null, не 0»
- факт по дереву: Машинной таблицы
.bank-stop.jsonбольше нет — снесена D39.158 вместе с писателем, путём, DTO и четырьмя тестами. Живёт только человеческая.bank-stop.txt. Свип сноса шёл по backend/platform/frontend/eval в *.go, а собственная диаграмма зоны его пережила. Это ещё и противоречие двух ЖИВЫХ носителей:docs/architecture/18-bank-ontology.md:56-58(ратифицирована D39.158) прямо называет эту таблицу снесённой и делает её первым членом «КЛАССА A». - улика:
grep -rn 'bank-stop.json' backend --include=*.go | wc -l→ 0; КОНТРОЛЬ:grep -rn 'bank-stop.txt' backend --include=*.go | wc -l→ 3 (internal/pipeline/mining.go:372— путь,cmd/tmctl/render_test.go:272,277). Писатель txt —internal/pipeline/mining.go:199os.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-851editorLines — «every injected record with a rendering … Signed and unsigned rows sit in the same list and look the same». Пин:internal/membank/memory_test.go:588— строка со статусомauto(«小D → «Малыш Дэ»») ОБЯЗАНА дойти до редактора,:590— второй заголовок отставлен. - предложенная правка: backend/docs/pipeline.puml:86-87 → «СВЕЖИЙ memory.Select над ENRICHED → ЕДИНЫЙ ЗАКОН-БЛОК билингв-редактору (подписанные и неподписанные строки неразличимы, D39.104 п.2); родовая директива — только при доверенном ключе».
- уверенность автора: подтверждено исполнением
43. [major] docs/architecture/12-go-style-notes.md:17 (то же утверждение — docs/architecture/09-target-architecture.md:23)
- утверждение: «…а маркер СНЯТ С ПРОВОДА (D39.104 п.2, вайр-батч;
backend/internal/lang/embedded.go, грепRETIRED wire text— ключ жив только затем, чтобы тесты предъявляли его ОТСУТСТВИЕ)». В 09-target: «маркер ⟨проверить⟩ с провода СНЯТ». - факт по дереву: С провода снят ПОСТРОЧНЫЙ маркер. Сам ⟨проверить⟩ по-прежнему едет к модели в КАЖДОМ черновом запросе — внутри живой строки данных
ru glossary_header, которая дословно объясняет модели пометку, которой ни на одной строке нет. Оба дока формулируют снятие безоговорочно и НЕ ссылаются на носитель настоящего состояния — строку бэклога 250, где этот остаток описан и сознательно отложен до окна правки эмбед-данных. - улика:
backend/internal/lang/data/injection.txt:6→ru\tglossary_header\tГЛОССАРИЙ (используй эти утверждённые переводы имён и терминов последовательно; строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты):. Он живой:backend/internal/membank/memory.go:781return tx.GlossaryHeader + "\n" + strings.Join(lines, "\n"), потребитель —internal/pipeline/chunkrun.go:122roleTranslator: membank.RenderGlossaryBlock. Пиннутые байты провода — `backend/internal/pipeline/testdata/golden/capture.g - предложенная правка: В
docs/architecture/12-go-style-notes.md:17иdocs/architecture/09-target-architecture.md:23уточнить: «снят ПОСТРОЧНЫЙ маркер; заголовокru glossary_headerпродолжает объяснять модели пометку — живой остаток, строка бэклога 250, чинится только в окне правки эмбед-данных (цена — cutTag)». Правку вносит оркестратор (зонаdocs/). - уверенность автора: подтверждено исполнением
44. [major] backend/docs/MONEYSTOP_REPORT.md:3 (и :6-8)
- утверждение: «Зона записи:
backend/+ своя секцияdocs/PROGRESS.md. Дерево НЕ закоммичено, лендинг за оркестратором.» · «⚠ В рабочем дереве лежат ЧУЖИЕ правки — всяplatform/(параллельный платформенный пакtextmachine-main-63…)» - факт по дереву: Пак залендён 05.09 коммитом
81a89e9(сам этот отчёт уехал В НЁМ), принят актом D39.206 с дофиксом616a8e4, потом якоря в нём пере-наведеныe7d6b3f. Дерево сегодня чисто. Соседние отчёты и записки зоны носят баннер исхода (SEAM_FIX_PLAN.md:3«Дофикс закончен, принят и залендён — D39.158»,MONEY_HONESTY_PLAN-NOTE.md:12«Пак ЗАЛЕНДЖЕНbb541a8и принят D39.182») — здесь его нет, и живой файл утверждает несуществующее состояние дерева. - улика:
git log --oneline -- backend/docs/MONEYSTOP_REPORT.md→e7d6b3f·616a8e4·81a89e9;git log -1 --date=short 81a89e9→ 2026-09-05 «Make the money stop a completion rather than a crash…»;git merge-base --is-ancestor e7d6b3f HEAD→ YES.git status --porcelain | wc -l→ 0.docs/README.md(таблица активных промтов): «пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт D39.206 (81a89e9+616a8e4)». - предложенная правка: Дописать в шапку
backend/docs/MONEYSTOP_REPORT.mdбаннер исхода по образцуSEAM_FIX_PLAN.md: «ЗАЛЕНДЁН81a89e9, дофикс616a8e4, принят D39.206» и снять/пометить датой абзац про чужие правки в дереве (тело отчёта задним числом не переписывать). - уверенность автора: подтверждено исполнением
45. [minor] backend/docs/D15.2-content-addressed-resume-spec.md:26 и :29
- утверждение: «ЭРРАТА (сверено исполнением 02.09) …
backend/internal/store/migrate.go:441=the bank-stop memory… Якорьrender.go:212мёртв — литерал ключа лежит наbackend/internal/pipeline/render.go:306=w("tm-request-v2", req.BookID» - факт по дереву: Оба якоря РОДИЛИСЬ верными 02.09 и сгнили дрейфом 04.09: токен «the bank-stop memory» лежит на
migrate.go:445, аw("tm-request-v2", req.BookID— наrender.go:366. То есть эррата, заведённая ПРОТИВ протухших якорей, сама протухла. Линтер их не видит по построению:ANCHOR(docs/scripts/counts.py:393-396) ждёт форму «путь:123=подстрока» с ОТДЕЛЬНЫМИ бэктиками у токена, а здесь весь якорь обёрнут одной парой бэктиков ⇒ token=None ⇒ якорь падает в «notoken» и содержимое не сверяется. - улика:
sed -n '441p' backend/internal/store/migrate.go→ «\t);»;grep -n 'the bank-stop memory' …/migrate.go→ 445.sed -n '306p' backend/internal/pipeline/render.go→ «func MessagesWithInjection(…»;grep -n 'tm-request-v2' …/render.go→ 366. Что были верны:git show 5c5fdc7:…/migrate.go | grep -n 'the bank-stop memory'→ 441;git show 5c5fdc7:…/render.go | grep -n 'tm-request-v2'→ 306; двинул ихb8154cd(04.09, вайр-батч). Слепота линтера:python3 docs/scripts/counts.py --lint→ «0 пр - предложенная правка: Пере-навести оба якоря на 445/366 И переписать их в каноническую форму
`backend/internal/store/migrate.go:445`=`the bank-stop memory`, чтобы--lintих впредь видел. Отдельно стоит рассмотреть расширениеANCHORвdocs/scripts/counts.pyна форму «токен внутри одной пары бэктиков» — сегодня она молча не сверяется по всему корпусу. - уверенность автора: подтверждено исполнением
46. [minor] backend/README.md:24 («строка 100», «125») и :26 («строка 103»)
- утверждение: «
manifest.go(структура глав/чанков + стабильный id главы, строка 100),bankexport.go(весь банк тремя статусами, 125)» · «internal/runevents| ДВИЖКОВАЯ сторона шва кадров прогона (строка 103)». Тот же файл на :89 объявляет: «ЕДИНЫЙ трекер — таблица «Бэклог» вdocs/PROGRESS.md, номера строк = она». - факт по дереву: Строк 100, 103 и 125 в живом бэклоге НЕТ — они закрыты и вынесены. Читатель, действующий по объявленному в этом же файле правилу, грепает
^| 100 |вdocs/PROGRESS.mdи получает ноль; тела живут только в архивном отчёте. Как файл:строка эти номера тоже не читаются:manifest.go:100— комментарий про версию документа (стабильный id —manifestChapterID,:197/:208),bankexport.go:125— середина компаратора сортировки. - улика:
grep -n '^| 100 |' docs/PROGRESS.md→ 0; то же для 103 и 125. КОНТРОЛЬ:grep -cE '^\| [0-9]+[а-я]? \|' docs/PROGRESS.md→ 239 строк, и все прочие номера из README резолвятся — 43 (:197), 49 (:279), 50 (:281), 78 (:167), 79 (:168), 146 (:215), 173 (:239), 232 (:265). Существующие номера в диапазоне 95–130: 96 97 98 106 108 109 110 111 114 115 118 119 120 121 122 123 124 127 130 — 100/103/125 отсутствуют. Тела:docs/archive/reports/CONTRACT_BLOCKERS_2026-08-08.md:20(строка 100) и:23(стр - предложенная правка: В
backend/README.mdзаменить голые номера на «закрытая строка 100 →docs/archive/reports/CONTRACT_BLOCKERS_2026-08-08.md» (аналогично 103 и 125) — по образцу того, как этот же файл на :95 честно помечает мёртвый указатель на строку 53. - уверенность автора: подтверждено исполнением
47. [minor] backend/docs/CHAPTER_STRUCTURE_REPORT.md:3
- утверждение: «Промт
docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md(выданdba8a0b, поправлен по находкам сессии:24f02bb·23b00a3·5a502e7·cd55329)» - факт по дереву: Файла по этому пути нет: промт заархивирован в
docs/archive/prompts/CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md. Ровно этот класс уже ловили в соседнем файле, и там его закрыли явной эрратой (MONEY_HONESTY_PLAN-NOTE.md:9-11: «Путь … в шапке ВЫШЕ мёртв — файла по нему нет; … промт переехал вdocs/archive/prompts/…»). Здесь такой строки нет; заодно у отчёта нет баннера исхода, хотя пак принят 06.09 актом D39.210 (2f65d1d). - улика:
ls docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md→ No such file or directory;ls docs/archive/prompts/ | grep -i chapter→CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md. Прибор по всем ссылкам-путям в backend-доках: судимых path-ссылок 178, не разрешились 9, из них 8 — ложные срабатывания резолва (zh-ru/heading.txtживёт вconfigs/langpacks/,zh/structure.txtНЕ создан НАМЕРЕННО и это сказано в самом отчёте на :97,internal/ingest/exit.goиrunner/engine.go— платформенные, `eval/exp - предложенная правка: Дописать в шапку
backend/docs/CHAPTER_STRUCTURE_REPORT.mdстроку-эрратy с живым адресом промта (docs/archive/prompts/CHAPTER_STRUCTURE_SESSION_PROMPT_2026-09-05.md) и баннер исхода «залендён2f65d1d, акт D39.210» — по образцуMONEY_HONESTY_PLAN-NOTE.md:9-11. - уверенность автора: подтверждено исполнением
Линза agent18 — находок 12
Охват (словами агента): ПРИБОР (заказан явно): · python3 docs/scripts/counts.py — выполнен, вывод по регистру приведён дословно: всего строк 458 · по статусу {'fixed': 345, 'open': 106, 'accepted-risk': 5, 'иное': 2} · вес открытых {'major': 3, 'info': 68, 'minor': 35} · битая форма [] · хвост вне словаря []. Голова D39.217, «сходится: True». Бэклог: всего 239, скоро 105, дубли ID [], битая форма []. · --check — «Лит
Что агент НЕ проверил: ЧЕГО НЕ ИЗМЕРИЛ И ПОЧЕМУ: 1. Батарея не гонялась. make check, go test, go build, go vet не запускались — запрет на прогоны с сетью и осторожность к общей машине. Следствие: все выводы о ПОВЕДЕНИИ кода — «вывод по коду», а не «подтверждено исполнением батареи». В частности PD-458 я предъ
48. [blocker] docs/architecture/15-money-path.md:62 (таблица дверей, строка про бэклог-166)
- утверждение: «⚠ Строка 166 — ДВИЖКОВАЯ половина ПОСТРОЕНА 05.09 … дырой осталась ПЛАТФОРМЕННАЯ половина — числа публикуются и никем не читаются (
git grep -lE "StepMax|step_max" -- platform/пусто)» - факт по дереву: Платформенная половина ПОСТРОЕНА: движковую оценку читают 19 файлов зоны, включая боевые
internal/ingest/manifest.go,internal/pgstore/books.go,internal/pricing/pricing.go,internal/runs/runs.goи миграцию00033_order_and_price.sql. Соседний живой носительdocs/architecture/17-seam-inbound-law.md:98УЖЕ исправлен («✅ И ПРОЧИТАНА платформой с 06.09 … Прежняя редакция: …») — то есть два живых дока противоречат друг другу об одном факте. - улика: Исполнена ДОСЛОВНО команда из самой строки: $ git grep -lE "StepMax|step_max" -- platform/ platform/docs/DEFECT_REGISTER.md platform/docs/STACK_DECISIONS.md platform/docs/platform-PROGRESS.md platform/internal/ingest/manifest.go platform/internal/ingest/price_test.go platform/internal/pgstore/books.go platform/internal/pgstore/books_test.go platform/internal/pgstore/migrations/00033_order_and_price.sql platform/internal/pgstore/price_test.go platform/internal/pgstore/readmodel.go platform/intern
- предложенная правка: В
docs/architecture/15-money-path.md:62заменить половину «дырой осталась ПЛАТФОРМЕННАЯ половина … пусто» на факт 06.09 с пере-снятым замером (19 файлов) и указать актD39.208; сохранить прежнюю редакцию историей по норме дока, как это уже сделано в17-seam-inbound-law.md:98. - уверенность автора: подтверждено исполнением
49. [blocker] docs/PROGRESS.md:233 — строка единого бэклога 166
- утверждение: «| 166 | ⚠ ДВИЖКОВАЯ ПОЛОВИНА ПОСТРОЕНА 05.09 … Открыта ПЛАТФОРМЕННАЯ: числа публикуются и никем не читаются (
git grep -lE "StepMax|step_max" -- platform/пусто). … | бэкенд | когда-нибудь | отдельный пак | D39.123 |» - факт по дереву: Обе половины построены; строка стоит открытой («когда-нибудь») с ложным замером в теле. Платформа не только читает числа, но и СТРОИТ на них холд:
pricing.Model.Hold(expected, stepMax, bookOnce, balance)—platform/internal/pricing/pricing.go:198; заказ в знаках разрешается в префикс юнитов —platform/internal/runs/runs.go:551case in.Characters != nil:→pricing.UnitsFor→QuoteUnits. - улика: $ grep -n "^| 166 |" docs/PROGRESS.md -> строка 233, тело цитировано выше. Та же команда строки исполнена: 19 файлов (см. находку 1), контроль по несуществующему символу 0. $ grep -n "^func " platform/internal/pricing/pricing.go | 198:func (m Model) Hold(expected, stepMax, bookOnce, balance money.MicroUSD) …; 355:func (m Model) QuoteUnits(…) КОНТРОЛЬ, что вопрос задан существующему предмету: соседние строки бэклога 165 и 167 в файле ОТСУТСТВУЮТ (закрыты и вынесены), 170 и 172 присутствуют по 1 х
- предложенная правка: Пере-написать строку 166 в
docs/PROGRESS.md: назвать платформенную половину исполненной (актD39.208, лендинг формы заказа 06.09), заменить ложный замер пере-снятым, и либо закрыть строку, либо явно назвать оставшийся хвост. Правка — зона оркестратора. - уверенность автора: подтверждено исполнением
50. [major] platform/BACKLOG.md:25 — строка П-10
- утверждение: «Честная оценка «$/глава» от ДВИЖКА. Сейчас ставка — константа платформы ($0.03, провенанс exp08 v2 через D30.4,
STACK_DECISIONS§20), и это осознанная бета-мера: движковой поверхности оценки не существует, а выдумывать её запрещено. Ставка решает только ДЛИНУ шкалы … | когда-нибудь (до первого платящего) |». Баннера, оговорки или диспозиции у строки НЕТ. - факт по дереву: Все четыре несущих утверждения ложны против дерева: (а) константы ставки нет — от
DefaultPerChapterостался ОДИН хит, и он надгробный комментарий; (б) движковая поверхность оценки существует —manifest --jsonпубликуетexpected_usd/book_once_usd/step_max_usd; (в) переменнойTM_PLATFORM_USD_PER_CHAPTER/PerChapterMicroUSDв конфиге нет; (г) «шкалы» в главах больше нет —Model.Scaleудалён. Собственный источник строки,STACK_DECISIONS§20, УЖЕ несёт баннер «⚠⚠ РЕШЕНИЕ ОТМЕНЕНО ПАКОМ «ФОРМА ЗАКАЗА» 05.09 — СТАВКИ БОЛЬШЕ НЕТ, и посылка, на которой она стояла, была неверна», то есть зонный бэклог противоречит зонному же STACK_DECISIONS. - улика: $ grep -rn "DefaultPerChapter" platform/ --include=.go
platform/internal/pricing/pricing.go:5:// than a tidy-up. Until 05.09 a chapter was worth a CONSTANT —
DefaultPerChapter, $0.03, provenance -> хитов в .go: 1 (комментарий-надгробие) КОНТРОЛЬ, что грепал существующий предмет: в том же pricing.go 11 деклараций const/поле, файл 365 строк. $ grep -rn "PerChapter" platform/internal/config/.go | grep -v _test -> 0 строк; КОНТРОЛЬ:grep -rn "PerChapter" platform/ | wc -l-> 14 (все в доках/т - предложенная правка: В
platform/BACKLOG.mdпометить П-10 ИСПОЛНЕННОЙ (лендинги81a89e9движка 05.09 + форма заказа 06.09, актD39.208), прежнюю редакцию оставить историей под ⚠-баннером, как это уже сделано вSTACK_DECISIONS§20. Правка — зона платформы; лендит оркестратор. - уверенность автора: подтверждено исполнением
51. [major] platform/docs/DEFECT_REGISTER.md:146 — ряд PD-458 (колонка «Статус» = open)
- утверждение: Ряд
PD-458 | bug | info |Makefileцельcheck, подметание в первом шаге; гейтinternal/gates.TestTheBatterySweepsOnlyLogsWhoseWriterIsGone| … ⇒ подметание перед прогоном, и оно **условно по живости писателя** (kill -0— POSIX, без/proc`) … Три мутации ловятся … | open |» - факт по дереву: Классическая «статус-жертва»: лекарство и его пин легли в дерево ТЕМ ЖЕ коммитом, что и сам ряд.
platform/Makefileцельcheckпервым шагом делает условное подметание сkill -0; гейтTestTheBatterySweepsOnlyLogsWhoseWriterIsGoneстоит вplatform/internal/gates/battery_test.go:532и ловит ровно три названные мутации. Правило шапки регистра («закрытие — только с коммитом фикса и тестом, пинящим свойство») выполнено, а статус осталсяopen. Следствие в деньгах внимания: ряд входит в число 106, которое CURRENT-STATE подаёт как остаток работы, и следующий пак пойдёт чинить построенное — ровно тот класс, против которого стоит п.8ENGINEERING_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 barerm -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-STATEdocs/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.ShortfallMicroUSDandFinished.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 -> :46const StreamVersion = "1.1"(это ЧТО ПОНИМАЕТ читатель, не что пишет движок — сказано - предложенная правка: В
platform/docs/STACK_DECISIONS.md:444поменять 1.2 → 1.3 с датой лендинга81a89e9и назвать, что добавил минор (Ceiling.ShortfallMicroUSD,Finished.Money); прежнее число оставить в скобках, как уже сделано для 1.1. - уверенность автора: подтверждено исполнением
53. [minor] platform/README.md:147 и :151 (раздел «Карта зоны», абзац про каналы движка)
- утверждение: :147 — «атомарность каждого канала, колонка «потребляет ли платформа» и все оговорки лежат ЕДИНСТВЕННЫМ носителем в
docs/STACK_DECISIONS.md, «Инвентарь каналов движка»»; :151 — «tmctl backupчитается с 05.09 —internal/runner/backup.go→internal/backup, — и это ВОСЬМОЙ движковый канал зоны». - факт по дереву: Названный единственный носитель этого канала НЕ содержит. Секция «Инвентарь каналов движка» (
platform/docs/STACK_DECISIONS.md:420–455) несёт 14 строк каналов, иtmctl backupсреди них нет — то есть у восьмого канала зоны нет ни строки атомарности, ни колонки «потребляет ли платформа» нигде, хотя README отправляет читателя именно туда и обещает, что второй копии перечня нет намеренно. - улика: $ n=$(grep -n "Инвентарь каналов движка" platform/docs/STACK_DECISIONS.md | head -1 | cut -d: -f1); end=… -> секция строки 420..455
$ sed -n "420,455p" platform/docs/STACK_DECISIONS.md | grep -c "tmctl backup" -> 0
КОНТРОЛЬНАЯ ВЕЛИЧИНА (что секция найдена и не пуста): первая ячейка каждой строки таблицы в этой же секции — 15 штук (заголовок + 14 каналов):
<project_db>.manifest.json,<project_db>.bank.json,<project_db>.bank-stop.txt,<project_db>.mined-signature.yaml, `<project_db>.aut - предложенная правка: Добавить в таблицу «Инвентарь каналов движка» (
platform/docs/STACK_DECISIONS.md, секция со строки 420) строкуtmctl backup: писатель в движке (backend/cmd/tmctl/backup.gobackupCmd), атомарность (VACUUM INTO+integrity_check), читатель платформы (internal/runner/backup.gobackupPathIn→internal/backup) и оговорка «ответ разбирается из человеческой строки stdout, версии нет —PD-449». - уверенность автора: подтверждено исполнением
54. [minor] platform/docs/DEFECT_REGISTER.md:41 — ряд PD-448 (открытый), колонка «Где»
- утверждение: «
internal/runs/control_test.go:846TestTwoResumesOfOneRunTakeOneHoldAndBothAnswer(пин гарантии)» - факт по дереву: На строке 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 intjson:"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.urlnames. It carries nooperationIdbecause 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(канон дал емуoperationIddownloadExportминором0.10.0—58bca19,D39.194п.3)»), то есть протух именно комментарий в коде, а читает его тот, кто правит таблицу маршрутов. Косвенное следствие: счёт «21 операция / 19 построено» вPLATFORM_DIRECTION.md§3 держится только потому, что считали по канону, а не по этому комментарию. - улика: $ grep -c "operationId:" docs/architecture/14-api-contract/openapi.yaml -> 21
$ grep -n "downloadExport" docs/architecture/14-api-contract/openapi.yaml
940: operationId: downloadExport
2989:
downloadExport. $ grep -c "{method: "" platform/internal/httpapi/v0.go -> 19 Сверка с заявленным в PLATFORM_DIRECTION §3 («на 05.09 — 21 и 19»): 21 и 19 — СХОДИТСЯ, находки там нет. - предложенная правка: Переписать комментарий
platform/internal/httpapi/v0.go:118: операция имеетoperationId: downloadExport(канон 0.10.0,58bca19,D39.194п.3), а довод «её не зовёт генерированный клиент» оставить как объяснение, почему маршрут всё равно перечислен здесь. Правка — зона платформы. - уверенность автора: подтверждено исполнением
58. [minor] platform/BACKLOG.md:28 — строка П-13
- утверждение: «Запрос уходит строкой ЕДИНОГО бэклога через оркестратора; строка регистра — PD-177 → строка 171 единого заведена 14.08»
- факт по дереву: Строки 171 в едином бэклоге больше нет: её вынули лендингом
a0fd2be(05.09) как поглощённую строкой 278. Читатель П-13, пошедший за указателем, находит пустоту — а соседние номера на месте, так что «не нашёл» неотличимо от «искал не там». - улика: $ grep -c "^| 171 " docs/PROGRESS.md -> 0
КОНТРОЛЬНАЯ ВЕЛИЧИНА:
grep -c "^| 170 " docs/PROGRESS.md-> 1;grep -c "^| 172 " docs/PROGRESS.md-> 1 (форма грепа рабочая, соседи на месте). $ grep -rn "^| 171 " docs/archive/ | wc -l -> 0 (в архив не уезжала) $ git log --oneline -S'| 171 |' -- docs/PROGRESS.mda0fd2beTake seven rows out of the backlog that two acts had already closed… $ git showa0fd2be-- 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=short2f65d1d→2f65d1d2026-09-06 (коммит существует). - предложенная правка: В ячейке строки 27 заменить хвост «Следующий пак — СТРУКТУРА ГЛАВ (решение владельца 05.09 «любая книга любого формата»), пишется» на «Заменивший его пак СТРУКТУРА ГЛАВ выдан 05.09 и залендён 06.09 (акт D39.210, строка выше); активная работа зоны сегодня — «КОНСИСТЕНТНОСТЬ»».
- уверенность автора: подтверждено исполнением
67. [minor] docs/README.md:13 — карта, буллет 14-api-contract/ (вне таблицы, тот же документ)
- утверждение: «зонная копия
frontend/docs/api-contract/ОТСТАЛА на0.2.3при каноне0.10.0(испр. 05.09; ⚠ версию канона брать ФАЙЛОМ … число здесь стареет)» - факт по дереву: Канон сегодня 0.12.0, а не 0.10.0 — разрыв в два минора (0.11.0 внесён паком «форма заказа», D39.208; 0.12.0 — лендингом 06.09, D39.217 п.5). Число зонной копии (0.2.3) верно. Голова PROGRESS уже несёт правильную пару: «зеркало 0.2.3/16 операций против канона 0.12.0/21». Оговорка «число здесь стареет» риск объявляет, но не снимает: в тексте стоит конкретное ложное число.
- улика: grep -n '^ version:' docs/architecture/14-api-contract/openapi.yaml → «5: version: 0.12.0»; grep -n '^ version:' frontend/docs/api-contract/openapi.yaml → «5: version: 0.2.3»; grep -n '0.10.0' docs/README.md → строка 13; sed -n '3p' docs/PROGRESS.md → «…зеркало 0.2.3/16 операций против канона 0.12.0/21».
- предложенная правка: В docs/README.md:13 заменить «ОТСТАЛА на
0.2.3при каноне0.10.0(испр. 05.09;» на «ОТСТАЛА на0.2.3при каноне0.12.0(пере-снято 06.09 файлом;» — остальную часть оговорки («версию канона брать ФАЙЛОМ … число здесь стареет») оставить как есть. - уверенность автора: подтверждено исполнением (число снято из файла-носителя обеими сторонами)
Линза agent42 — находок 10
Охват (словами агента): ПРОЧИТАНО ЦЕЛИКОМ: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md (150 строк — обе редакции: HEAD ff14901 и обновлённая в дереве) · docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md (176 строк, обе редакции) · docs/product-requirements.md (93 строки, 45 рядов ПТ). ИСТОЧНИКИ ЗАКАЗА: docs/PROGRESS.md — CURRENT-STATE строки 3–40 включая «ЧЕТЫРЕ ПОТОКА РАБОТЫ» (строки 4–21), «ЗАКАЗ ВЛАДЕЛЬЦА 01.09» (строка 3)
Что агент НЕ проверил: 1. ⛔ ГЛАВНОЕ: ДЕРЕВО НЕ ЧИСТОЕ, вопреки заданию. В 21:20 (через ~10 минут после моего старта) параллельная сессия оркестратора начала переписывать docs/: git status --short даёт 15 изменённых файлов + новый docs/BACKLOG.md (untracked→A), включая ОБА проверяемых промта, README, PROGRESS, counts
68. [blocker] состав платформенного пака, docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:92-95 (§4.2), продублировано в §1 (строка 17-18) и docs/README.md:30 ✅ закрыто e4097cb
- утверждение: «### 4.2 Экран не врёт о единице (строка 282) — делай РОВНО так. Либо число приезжает из манифеста движка, либо подпись переименована в то, что оно на самом деле считает. ⛔ Третьего — «оставить как есть, все привыкли» — нет: это живая ложь на продуктовом экране.»
- факт по дереву: Платформенная половина строки 282 ПОСТРОЕНА и ЗАЛЕНДЕНА 06.09, ДО написания пака.
character_countберётся изsource_charsманифеста движка, рядом стоит флагcharacter_count_exact, есть пин. Остаток строки 282 — только фронтовая подпись'about.characters': 'Знаков', а фронт заморожен и паку запрещён (§2). Строка 282 осталась помечена «скоро» потому, что акт лендинга D39.208 её НЕ назвал — ровно тот класс, о котором предупреждает CURRENT-STATE: «акт лендинга, объявивший закрытие строки, обязан быть СВЕРЕН СТАТУСОМ в тот же заход — иначе следующий пак собирается ПО РЕГИСТРУ и едет чинить построенное». - улика: platform/internal/httpapi/project.go:35-40 =
if b.SourceChars != nil { count, out.CharacterCountExact = *b.SourceChars, true }; platform/internal/httpapi/v0.go:199-211 =CharacterCount *int64+CharacterCountExact boolс доккомментарием «unified backlog row 282»; пин platform/internal/httpapi/v0_test.go:901TestTheCharacterCountSaysWhichNumberItIs.git log --format='%h %ad %s' --date=iso -5 -- platform/internal/httpapi/project.go→6ceb133 2026-09-06 02:58:24, `628cc56 2026-09-06 00: - предложенная правка: Снять §4.2 из платформенного пака целиком и убрать 282 из §1 и из карты чтения (§3 п.4). Отдельно: пометить строку 282 в docs/BACKLOG.md исполненной платформенной половиной с указанием
628cc56/6ceb133, оставив открытым фронтовый остаток (подпись) до разморозки. Иначе сессия потратит заход на переделку построенного и, что хуже, может «починить» уже верное поведение. - уверенность автора: подтверждено исполнением
69. [major] состав платформенного пака — §4.5 «Чего в паке НЕТ» и §5.1/§8, docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:110-113, 117-119, 130-131 ✅ закрыто e4097cb
- утверждение: Пак берёт три мажора, 282 и 325 и требует «Мутационная проверка каждого пина… прочитай ТЕКСТ падения — говорит ли он про сломанное тобой» и «
MAKE-EXITцитируй из лога, а не из кода возврата составной команды». - факт по дереву: Открытым висит строка бэклога 305 (зона платформа, вес «скоро», источник D39.207):
make checkплатформы при ТАЙМАУТЕ пакета печатает заголовок--- FAILURES ---и НИЧЕГО под ним — оператор получает «check упал» без единого имени. Пак вменяет сессии обязанность читать ТЕКСТ падения на каждом пине, а прибор, который этот текст выдаёт, известно ломается ровно на том классе отказа, который у ЭТОЙ батареи наблюдался (FAIL … 600.251s, замер 06.09). Правка — одна ветка в целиcheckтого жеplatform/Makefile, который только что правил заленденный ряд 310 (D39.213): то есть тот же файл, та же цель, тот же класс дефекта, $0. - улика: docs/BACKLOG.md строка 305, ячейка «чем закрывается»: «таймаут пакета называет пакет и причину, а не пустую секцию | платформа | скоро | … | D39.207».
platform/Makefile:163-166 =
if [ $$status -ne 0 ]; then echo "--- FAILURES ---"; grep -E '^(---|[[:space:]]+---) FAIL' "$$log"; …; exit 1; fi— приpanic: test timed outстрок--- FAIL:в логе нет, секция печатается пустой.grep -c "305\|285" docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md→ 0; контроль:grep -c "282" …→ 3. Счёт зоны: с - предложенная правка: Добавить пунктом §4.x «Прибор приёмки называет причину таймаута» со ссылкой на строку 305 и D39.207, с формулировкой «делай РОВНО так»: при ненулевом статусе, если в логе нет ни одной строки
--- FAIL:, печатать имя пакета и хвост его вывода (FAIL … Ns,panic: test timed out), а не пустую секцию. Довод для промта: без этого §5.1 («прочитай ТЕКСТ падения») исполним не всегда, и мутация будет засчитана по цвету, что CLAUDE.md прямо запрещает. - уверенность автора: вывод по коду (текст цели Makefile прочитан; сам таймаут не воспроизводил — батарея требует DSN и сети)
70. [major] состав платформенного пака, §4.3 docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:97-101 ✅ закрыто e4097cb
- утверждение: «### 4.3 Вход не шире выдачи (строка 325) — реши сам, аргументируй. …интейк обязан отказывать форматам, чью выдачу мы не умеем, — с честной причиной человеку, а не молча.»
- факт по дереву: На той же двери интейка открытым висит строка 285 — прямое РЕШЕНИЕ ВЛАДЕЛЬЦА 05.09 («почему просто не fail fast, как это обычно принято»): сегодня при загрузке проверяется только размер, а на классе «источник нечитаем» интейк ПРИНИМАЕТ файл и потом УДАЛЯЕТ загрузку. Механизм для отказа $0 и уже есть —
tmctl manifestрежет книгу без ключей и без единого платного вызова, и платформа умеет его звать. Это второй отказ на той же двери, с той же формулировкой «честная причина человеку», и он попутно закрывает строку 254. Делать 325 отдельно — открывать одну дверь дважды и дважды согласовывать текст отказа. - улика: docs/BACKLOG.md строка 285: «FAIL FAST ПРИ ЗАГРУЗКЕ вместо приёма-и-удаления (решение владельца 05.09) …
tmctl manifest… Звать СИНХРОННО на загрузке | платформа | скоро | синхронный $0-разбор на приёме + отказ вместо удаления | решение владельца 05.09». Механизм отказа на двери уже смонтирован: platform/internal/httpapi/project.go:46 =if reason := ingest.ContractRejectReason(b.RejectReason); reason != "". Приём .epub закреплён тестом: platform/internal/books/books_test.go:844 = `book := f. - предложенная правка: Слить 285 в §4.3 одним предметом: «интейк отказывает СИНХРОННО — и форматам, чью выдачу мы не умеем (325), и файлу, в котором книги нет (285, решение владельца 05.09); одна дверь, один текст отказа,
tmctl manifestкак $0-прибор». Оставить сессии свободу по границе и по тому, что показывать во время разбора (это и есть открытый вопрос ячейки 285). - уверенность автора: подтверждено исполнением
71. [major] состав ОБОИХ паков: docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:84-90 (§4.1) и 137 (§7) + docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md §4 целиком ✅ закрыто e4097cb
- утверждение: Платформенный пак: «⚠ По
PD-441отдельно: если полная запись цены отменённого вызова недостижима, честный выход — объявить маржу…» и §7 «как именно собираешься лечитьPD-441(полная запись против объявленной маржи)». Бэкенд-пак о PD-441 не говорит ничего. - факт по дереву: Опция «полная запись» физически недостижима из зоны platform/, и это записано в самом ряду регистра: «⚠ Правка
stagerun.go— ЧУЖАЯ зона, отсюда только строка». Носители движковой половины — строки бэклога 261 и 262, обе зона БЭКЕНД, обе вес «скоро (вместе с денежным паком)» / «скоро (вместе с 261)», и 261 говорит буквально: «остатокPD-441= 261 + 262… структурный корень невидимого расхода — эта строка… платформенной зоне:PD-441закрывать «паком денежного стопа» НЕЛЬЗЯ». Ни один из двух паков их не берёт. При этом 262 — это ложный комментарий вbackend/internal/pipeline/stagerun.go, то есть ровно жанр бэкенд-пака («комментарий шире ветки»), и он живёт в файле того же пакетаpipeline, который бэкенд-пак и так трогает по строке 321. Итог: сессия платформы получает выбор из двух вариантов, где один заведомо вне её досягаемости, и пак ей этого не говорит. - улика: platform/docs/DEFECT_REGISTER.md, ряд PD-441 (открыт,
**major, деньги**): «⚠ Правкаstagerun.go— ЧУЖАЯ зона, отсюда только строка. Смежная строка единого бэклога — 78». docs/BACKLOG.md строка 261: «остатокPD-441= 261 + 262 … | бэкенд | скоро (вместе с денежным паком)»; строка 262: «Комментарий ветки отмены — сверх-утверждение: «No 2xx ever arrived: nothing was billed» описывает ветку ШИРЕ, чем она есть … | бэкенд | скоро (вместе с 261)». Код жив: `grep -rn "No 2xx ever arrived" - предложенная правка: Минимальная и не раздувающая правка: в §4.1 платформенного пака назвать ограничение прямо — «полная запись цены отменённого вызова живёт в
backend/internal/pipeline/stagerun.go(строки бэклога 261 и 262, зона бэкенд); этим паком она НЕ заказана ⇒ из этой зоны честен только вариант «объявленная маржа», и §7 отвечает на вопрос «какая маржа и как показана», а не «какой из двух вариантов». Отдельно — решение оркестратора: заказать 261/262 третьим паком или прицепить 262 к бэкенд-паку (⚠ сама строк - уверенность автора: подтверждено исполнением
72. [major] docs/README.md:26 (таблица активных промтов — единственный носитель холодного входа) против docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md ✅ закрыто e4097cb
- утверждение: «Бэкенд · КОНСИСТЕНТНОСТЬ … приоритет владельца №1: канон в прогон (295) · гард перекрытия окон (267) · честный комментарий постчека (318) · не уничтожать принятую редактуру (322 а/б) · два ложных комментария. ⚠ Несёт заказ владельца на список ЛОГИЧЕСКИХ расхождений «задумано против сделано»»
- факт по дереву: Три из пяти утверждений строки ложны против пака, который она описывает. (1) 295 из пака СНЯТА (§4.5). (2) 322 «а/б» из пака ИСКЛЮЧЕНА (§4.5), взята только попутная половина — ложный комментарий. (3) Заказ владельца на «список ЛОГИЧЕСКИХ расхождений «задумано против сделано»» в паке отсутствует ПОЛНОСТЬЮ: он стоял в §Отчёт первой редакции пака и выпал при переписывании, а строка README осталась от той редакции. Формулировка не имеет НИ ОДНОГО другого носителя во всём дереве — то есть если это действительно слово владельца, оно сейчас не заказано никому.
- улика:
grep -ci "логическ\|задумано" docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md→ 0; контроль на том же файлеgrep -ci "банк"→ 6.grep -rn "задумано против сделано" . --include=*.md→ ОДНО вхождение:docs/README.md:26; контроль: всего .md в дереве — 1969. Первая редакция несла его:git show 6457d77:docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md | grep -n "295\|322\|логическ"→12: Строки бэклога 295, 267, 318, 320, 322, `29: ### 1. Подать подписанный канон в прогон (половина строки - предложенная правка: Развилка, и её обязан снять оркестратор, а не сессия: либо ВЕРНУТЬ строку «список логических расхождений «задумано против сделано»» в §Отчёт бэкенд-пака (одна строка, ноль раздувания, и она ровно в жанре пака — он весь про «описано против сделано»), либо СНЯТЬ её из README:26 как никогда не бывшее слово владельца. Одновременно привести README:26 к действующему составу: убрать «канон в прогон (295)» и «не уничтожать принятую редактуру (322 а/б)».
- уверенность автора: подтверждено исполнением
73. [major] состав платформенного пака, §4.0 «Приёмка» (docs/PLATFORM_MONEY_TRUTH_SESSION_PROMPT.md:80-82) против §2 «Зона и git» (строки 28-30) ✅ закрыто e4097cb
- утверждение: §4.0: «Приёмка §4.0: проход печатает ноль утверждений без носителя · … всё, что оказалось правилом или незакрытой находкой, получило ряд регистра ИЛИ СТРОКУ БЭКЛОГА ПЕРЕД выносом». §2: «Чужие зоны (
backend/,frontend/,eval/,docs/) — только чтение». - факт по дереву: Один из двух легальных носителей — строка бэклога — живёт в
docs/, которую тот же пак объявляет read-only, а второй (ряд регистра) — в своей зоне. То есть приёмочный критерий §4.0 недостижим в объявленной зоне для любой находки бэклоговой формы, и сессия оказывается перед выбором «нарушить зону или не сдать пункт 0». Масштаб измерен прибором самого пака: на названном им диапазоне 55 утверждений без носителя, и до нуля их надо довести именно раздачей носителей. - улика:
python3 docs/scripts/carriers.py platform/docs/platform-PROGRESS.md --from 3 --to 2007→ «carriers: 55 помеченных утверждений без носителя / осмотрено строк: 2005 (с 3 по 2007 из 5029) / носителем считается: ряд PD · строка бэклога · D-нота · эррата». Число в паке (55) воспроизвелось точно;wc -l= 5029,grep -c '^## '= 42 — обе цифры §4.0 верны. Строки бэклога сейчас лежат вdocs/BACKLOG.md(239 рядов) — зона оркестратора; ряды регистра —platform/docs/DEFECT_REGISTER.md - предложенная правка: Переписать приёмку §4.0: «носитель, который зона заводит САМА, — ряд
DEFECT_REGISTER.md; строка бэклога — ПИНГ оркестратору с готовой формулировкой, и до его ответа соответствующий кусок НЕ выносится». Иначе критерий приёмки прямо провоцирует запись в чужую зону — то, что CLAUDE.md запрещает жёстко. - уверенность автора: подтверждено исполнением
74. [minor] docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 (§4.4) против :78 (§4.5) ✅ закрыто e4097cb
- утверждение: §4.4: «Два ложных комментария — снять (строки 321 и 322) — делай РОВНО так». §4.5: «Строка 322 (история принятой редактуры) — другой предмет: жизненный цикл чекпойнтов и схема, а не закон банка. Отдельным паком.»
- факт по дереву: Один и тот же номер строки в одном паке и заказан, и запрещён. По существу противоречия нет — §4.4 берёт только «попутную» половину ряда 322 (ложный комментарий про резюм), а §4.5 исключает его главный предмет (указатель принятой редакции), — но из текста это не следует, и §9 требует от сессии эхо-протокол «скоуп · не-делать», где она обязана разложить это по разные стороны. Заголовок §4.4 при этом называет номер, а не предмет.
- улика: docs/BACKEND_CONSISTENCY_SESSION_PROMPT.md:68 и :78 — дословно выше.
Попутная половина ряда 322 действительно существует и якорь верен: docs/BACKLOG.md строка 322 «⚠ Попутно: комментарий
backend/internal/store/chunkstatus.go:52-57про «резюм переписывает строку» ЛОЖЕН — обычный резюм её не пишет»; в дереве backend/internal/store/chunkstatus.go:52-57 = доккомментарийUpdatedAtс фразой «A resume that re-writes an unchanged row moves it too». - предложенная правка: Заголовок §4.4 переписать по ПРЕДМЕТУ, а не по номеру: «Два ложных комментария — снять (строка 321 + попутный комментарий
chunkstatus.go:52-57из строки 322; сама строка 322 в пак НЕ входит, см. §4.5)». - уверенность автора: подтверждено исполнением
75. [minor] docs/BACKLOG.md:212 (строка бэклога 267) — пункт 2 карты чтения бэкенд-пака и предмет его §4.1 ✅ закрыто e4097cb
- утверждение: «гард «одна форма на главу» существует (
backend/internal/pipeline/memseed.go, грепa term has ONE rendering per chapter) и статус-слеп, но работает ВНУТРИ ОДНОГО ФАЙЛА» - факт по дереву: Файла
backend/internal/pipeline/memseed.goв дереве НЕТ. Гард живёт вbackend/internal/membank/memseed.go:217. Сессия, которой карта чтения делает эту строку ЗАКОНОМ, грепнет по названному пути и получит ноль — а ноль здесь неотличим от «гарда нет», то есть ровно тот класс ошибки, против которого пак сам ставит норму «рядом с нулём — контрольная величина». - улика:
ls backend/internal/pipeline/memseed.go→No such file or directory;find backend -name "memseed*.go"→backend/internal/membank/memseed.go,backend/internal/membank/memseed_test.go. Контроль, что искал в существующем месте: вbackend/internal/pipeline/128 файлов.go, и второй якорь той же строки цел —grep -c storeOrder backend/internal/pipeline/bankmaterialize.go→ 5. Гард на месте:grep -rn "a term has ONE rendering per chapter" backend/→ `backend/internal/membank/memseed. - предложенная правка: Исправить путь в ячейке строки 267 на
backend/internal/membank/memseed.go(зона оркестратора, docs/). Если правку не успеть до выдачи пака — назвать верный путь прямо в §4.1 бэкенд-пака, чтобы карта чтения не вела в пустоту. - уверенность автора: подтверждено исполнением
76. [minor] карты чтения обоих паков (§3 п.2 бэкенд-пака, §3 п.4 платформенного) — состояние на HEAD ff14901
- утверждение: HEAD-редакция обоих паков: «Строки бэклога 267, 318, 320 (
docs/PROGRESS.md, греп^| N |)» и «Строки 282, 325, 326 бэклога (docs/PROGRESS.md, греп^| N |)». - факт по дереву: В рабочем дереве параллельная сессия оркестратора вынесла таблицу бэклога из
docs/PROGRESS.mdв новыйdocs/BACKLOG.md(побайтно, ID не двигались, ратификация D39.218). Вdocs/PROGRESS.mdрядов не осталось НИ ОДНОГО — названный паками греп вернул бы ноль, неотличимый от «такой строки нет». ⚠ ФИКСИРУЮ КАК УЖЕ ИСПРАВЛЕННОЕ: пока я работал, та же сессия обновила оба пака наdocs/BACKLOG.md. Правка НЕ закоммичена, HEAD её не несёт. - улика:
grep -cE "^\| [0-9]+[а-яё]? \|" docs/PROGRESS.md→ 0; контроль: та же команда поgit show HEAD:docs/PROGRESS.md→ 239, поdocs/BACKLOG.md→ 239. Вdocs/PROGRESS.mdна месте секции: «## Бэклог / > ⟶ ПЕРЕЕХАЛ 06.09 в BACKLOG.md (ратификация — D39.218)». Паки уже поправлены в дереве:grep -n "BACKLOG.md" docs/*SESSION_PROMPT.md→BACKEND_…:24,PLATFORM_…:41.git status --short→ 15 изменённых файлов вdocs/+A docs/BACKLOG.md, всё незакоммичено. - предложенная правка: Не добавлять ничего — правка уже в дереве. Проверить только одно ПЕРЕД выдачей паков: что переезд закоммичен ОДНИМ актом вместе с обеими правками карт чтения. Если паки уйдут в работу до лендинга переезда, их карты чтения будут указывать на файл, которого в HEAD нет.
- уверенность автора: подтверждено исполнением
77. [minor] состав платформенного пака (полнота набора «три открытых мажора»)
- утверждение: §4.1: «
PD-441·PD-424·PD-438. Все три про одно…»; §1 перечисляет их же как «три способа врёт и один раз молчит». - факт по дереву: ОПРОВЕРЖЕНИЯ НЕТ — набор полон. Открытых рядов веса major в регистре ровно три, и все три в паке. Ни одного открытого BLOCKER-ряда нет. Записываю как законный результат проверки, а не как находку: по осям «открытые мажоры регистра» и «требования продукта со статусом ⭕» платформенный пак укомплектован, и добавлять туда нечего.
- улика: Скрипт по
platform/docs/DEFECT_REGISTER.md(разбор ячеек С КОНЦА, какcounts.py): всего рядов 458, открытых 106, из них веса major — 3:PD-424(open),PD-441(open),PD-438(open). Контроль: рядов веса**BLOCKER**— 3, все триfixed(P8-FIX)(PD-169,PD-346,PD-353); рядов нестандартной формы — 3 (PD-375minor,PD-422info,PD-197fixed), проверены поимённо. Продуктовые требования:docs/product-requirements.md— 45 рядов ПТ, статусы 🔶23 / ⭕11 / ✅6 / ❌3 / 🔒2 - предложенная правка: Не добавлять ничего. Оставляю запись, чтобы следующая смена не переоткрывала этот вопрос: по регистру и по требованиям продукта паки укомплектованы, весь дефицит — в четырёх находках выше.
- уверенность автора: подтверждено исполнением