From e031b23b497082e2b47c52246953daa49aaa5fcc Mon Sep 17 00:00:00 2001 From: heaven Date: Wed, 2 Sep 2026 15:47:04 +0300 Subject: [PATCH] Apply the controller's dofix in the backend zone: restore what the cut lost and repair what it broke, including places where the text asserted the wrong thing about the code --- backend/docs/MONEY_HONESTY_PLAN-NOTE.md | 4 +++- backend/docs/SEAM_PACK_FINDINGS.md | 29 ++++++++++++++++++------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/backend/docs/MONEY_HONESTY_PLAN-NOTE.md b/backend/docs/MONEY_HONESTY_PLAN-NOTE.md index b619f09c..c472fb31 100644 --- a/backend/docs/MONEY_HONESTY_PLAN-NOTE.md +++ b/backend/docs/MONEY_HONESTY_PLAN-NOTE.md @@ -5,7 +5,9 @@ она не переписывается задним числом (дополнения помечаются датой и словом «дописано»). > ⚠ **Дописано 02.09 — указатели и исходы; тело записки НЕ переписывается (это пре-регистрация).** -> Промт переехал: `docs/archive/prompts/BACKEND_MONEY_HONESTY_SESSION_PROMPT.md`. Прожитый дамп пака из +> ⚠ Путь `docs/BACKEND_MONEY_HONESTY_SESSION_PROMPT.md` в шапке ВЫШЕ мёртв — файла по нему нет; тело +> записки не переписывается, поэтому адрес живёт здесь: промт переехал в +> `docs/archive/prompts/BACKEND_MONEY_HONESTY_SESSION_PROMPT.md`. Прожитый дамп пака из > секции «Бэкенд» `docs/PROGRESS.md` снят 02.09 — исходы живут в `MONEY_HONESTY_REPORT.md`. > Пак ЗАЛЕНДЖЕН `bb541a8` и принят **D39.182**; закон раскрытия ратифицирован **D39.181**. > ⚠ Два места ниже опровергнуты собственной же работой пака, и оба разобраны в отчёте: diff --git a/backend/docs/SEAM_PACK_FINDINGS.md b/backend/docs/SEAM_PACK_FINDINGS.md index 579b11e2..e9ec478d 100644 --- a/backend/docs/SEAM_PACK_FINDINGS.md +++ b/backend/docs/SEAM_PACK_FINDINGS.md @@ -21,8 +21,12 @@ ⚠ **Батарея НЕ детерминированно зелена на этой машине, и это НЕ пак** — читай до пере-рана, иначе красное будет отнесено на пак. Два пред-существующих `-race`-флейка в `internal/store` (§10 п.7) -срабатывают примерно раз на 2–4 полных прогона. **Красное ИМЕННО в этих двух тестах ожидаемо; любое -другое красное — регрессия.** Полное объяснение их поведения и атрибуция ЗАМЕРОМ против HEAD — §31. +срабатывают примерно раз на 2–4 полных прогона: замерено `go test ./... -race -count=1` ×4 → прогон 1 +чист, прогон 2 — `TestKillMinus9LosesAtMostOneCall` +(`backend/internal/store/kill9_test.go:201=func TestKillMinus9LosesAtMostOneCall`). **Красное ИМЕННО в +этих двух тестах ожидаемо; любое другое красное — регрессия.** ⚠ Частота — из ЭТОГО замера, а не из §31: +там ДРУГОЙ прогон (чередующийся A/B против HEAD, 5 раундов, обе стороны 5×FAIL), и он закрывает +АТРИБУЦИЮ — «флейк пред-существует паку», — а не частоту. На дереве пака: `make battery` — `EXIT=0` на чистом прогоне (skip: `TestMinerFullBookParity`, `TestHelperEventsRun`, `TestHelperKillLoop`); `make battery-stand` **без единого `TM_*_DIR`** — `EXIT=2`, @@ -592,7 +596,7 @@ YAML не накладывает ничего. Новый гоняет прои | **4.7** алиас судится по НАБОРУ | ✅ сделано; **углублено по §30 п.2** | проверка перенесена ПОСЛЕ свёртки и судит РЕЗУЛЬТАТ — именно поэтому два отказа (терм + его алиас) остаются законными: к концу вызова алиасом никто не владеет. ⚠ Побега «своя поверхность проверяется по ВХОДНОМУ документу» в коде НЕТ — он был заведён и снят как вредный (§30 п.2), заводить заново не надо. Мутации P, AB | | **4.8** перевёрнутое окно глав | ✅ сделано | отказ с цитатой окна; открытая верхняя граница законна. Мутация O | | **4.9** честность про непогасший стоп | ✅ **исполнено фактом, не предсказанием** | `signature{map,surfaces,undecided}` по правилу самого прогона; `undecided>0` — факт, `undecided==0` — явно не обещание. Аргумент в §22. Мутация U | -| **4.10** SIGTERM | ✅ сделано; сомнение записки СНЯТО замером; **довод в комментарии исправлен по ревью** | ctx проверяется дважды, стоп не пишет ничего, exit 5. Несущий довод — НЕ длина непрерываемого участка (её оценка была неверна в 15 раз), а то, что записи идут последними и атомарно: убитый где угодно до них процесс не записал ничего. Мутация S (пин целится именно во вторую проверку) | +| **4.10** SIGTERM | ✅ сделано; сомнение записки СНЯТО замером; **довод в комментарии исправлен по ревью** | ctx проверяется дважды, стоп не пишет ничего, exit 5. Несущий довод — НЕ длина непрерываемого участка (первая редакция назвала её «≈20 с, два порядка внутри stop grace»; замер §29 п.1 дал **308.2 с** на 28 900 минимальных `decline`, которые байтовый кап пускает, — оценка неверна в 15 раз), а то, что записи идут последними и атомарно: убитый где угодно до них процесс не записал ничего. Мутация S (пин целится именно во вторую проверку) | | **4.11** десять посадок, пин на каждую | ✅ 9 из 10 + доказательство по десятой | A–H, E1–E3 краснеют своими пинами; **G недостижима за первым гейтом — доказано, не предположено** (§17), вместо поведенческого пина запинен контракт функции | | **4.12** цепь в репозитории | ✅ сделано | `internal/pipeline/bankchain_test.go`, $0 на фейковом провайдере, ОДИН проект от стопа до погасшего стопа; форма фикстуры (2 терма = 1 approve + 1 decline) проверяется как ПРЕМИСА; ограничение синтетики названо в комментарии; карта подписи после погасшего стопа зафиксирована явно | | **4.13** девять мелочей | ✅ по каждой решение и довод | §21: починено 3, отклонено с аргументом 5, пингом 1 | @@ -780,11 +784,14 @@ nil, …)` → true и **записала бы файл нулевой длин ### Что ревью подтвердило исполнением (не переделывал) -Нормализация идемпотентна на 50-строчном адверсариальном корпусе и КОПИРУЕТ · ложного провала -`renderProved` найти не удалось (400 000 случайных строк по алфавиту управляющих/пунктуации/CJK, -невалидный UTF-8, NUL, C0/C1, одиночные суррогаты) · оба капа не off-by-one · после второй проверки -контекста ничего не пишется, `defer lock.Release()` стоит сразу за захватом · общности не нарушено ни -одной новой строкой · `TestDecisionByBankID` и пин на инъективность действительно независимы · +Нормализация идемпотентна на 50-строчном адверсариальном корпусе и КОПИРУЕТ (проверено мутацией выхода +при неподвижном входе) · ложного провала `renderProved` найти не удалось (400 000 случайных строк по +алфавиту управляющих/пунктуации/CJK, невалидный UTF-8, NUL, C0/C1, одиночные суррогаты) · оба капа не +off-by-one · после второй проверки контекста ничего не пишется, `defer lock.Release()` стоит сразу за +захватом · общности не нарушено ни одной новой строкой · `TestDecisionByBankID` и пин на инъективность +действительно независимы (все три константы пере-считаны в Python по спецификации из комментария +`TermID`, а не из его же выхода — +`backend/internal/membank/decisions_test.go:348=Computed outside Go, from the spec in TermID's own comment`) · `SeedProblems.Error()` побайтно равен прежнему склеенному сообщению. ⚠ **Унаследованное замечание, не дефект пака:** всё, на чём эта дверь ключуется, проходит через @@ -1183,6 +1190,12 @@ retired-ключи ловятся полями, а не голым strict-decode - **Клауза «ничего не произошло» у классов 10–14 сужена до «состояния КНИГИ»**: пред-полётный бэкап `translate` пишется ДО отказа 12/13. И **`preexisting_problems: []` в кап-отчёте ≠ «проверено чисто»** — оговорено на самом поле: при отказе по капу проверка не выполнялась. +- **Баннер стопа выдавал РАЗМЕР карты за число НОВЫХ термов** — под моделью флажка карта намеренно + смешивает новое и ранее предъявленное-нерешённое, поэтому счётчик не имеет права называться «new». + `WaveSignatureStop.Error` переписан, а `renderSignatureStop` печатает нейтральное + `backend/cmd/tmctl/render.go:171=(%d term(s) in the map)`; довод стоит рядом с кодом + (`backend/cmd/tmctl/render.go:169=must not be labelled «new»`). ⚠ Поимённой разметки новизны в карте + НЕТ — продуктовая поверхность, не этот пак; сюда и ссылается §41. ---