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

This commit is contained in:
heaven 2026-09-02 15:47:04 +03:00
parent 40730551e1
commit e031b23b49
2 changed files with 24 additions and 9 deletions

View file

@ -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**.
> ⚠ Два места ниже опровергнуты собственной же работой пака, и оба разобраны в отчёте:

View file

@ -21,8 +21,12 @@
**Батарея НЕ детерминированно зелена на этой машине, и это НЕ пак** — читай до пере-рана, иначе
красное будет отнесено на пак. Два пред-существующих `-race`-флейка в `internal/store` (§10 п.7)
срабатывают примерно раз на 24 полных прогона. **Красное ИМЕННО в этих двух тестах ожидаемо; любое
другое красное — регрессия.** Полное объяснение их поведения и атрибуция ЗАМЕРОМ против HEAD — §31.
срабатывают примерно раз на 24 полных прогона: замерено `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 + доказательство по десятой | AH, E1E3 краснеют своими пинами; **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
- **Клауза «ничего не произошло» у классов 1014 сужена до «состояния КНИГИ»**: пред-полётный бэкап
`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.
---