From e7d6b3f8bb4c5efa746e625bc2d5ab3bd61c7a1f Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 5 Sep 2026 15:33:13 +0300 Subject: [PATCH] Re-point six anchors in the engine's own docs, five of them broken before the pack and hidden until the docs joined the lint roots --- backend/docs/DISCLOSURE_LAW_DESIGN.md | 10 +++++----- backend/docs/MONEYSTOP_REPORT.md | 13 ++++++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/backend/docs/DISCLOSURE_LAW_DESIGN.md b/backend/docs/DISCLOSURE_LAW_DESIGN.md index ef4dcb41..ba785b7f 100644 --- a/backend/docs/DISCLOSURE_LAW_DESIGN.md +++ b/backend/docs/DISCLOSURE_LAW_DESIGN.md @@ -37,11 +37,11 @@ ⚠ **И закон не импортируется извне — он уже наполовину написан В ЭТОМ КОДЕ, просто применён точечно.** Две нормы живут в комментариях и не имеют ни имени, ни гейта: -1. **«unknown, not zero»** — `internal/pipeline/quality.go:228`=`the UNSIGNED BANK count is unknown, not zero`, - `internal/pipeline/status.go:684`=`the unsigned-term count is unknown, not zero`, - `internal/pipeline/status.go:733`=`reported as unknown, not as none`, - `internal/pipeline/bookbuild.go:221`=`(reported as unknown, not as none)`. -2. **Фигура едет С БАЗИСОМ** — `RebillBasis` (`internal/pipeline/status.go:249`=`RebillBasis string`), +1. **«unknown, not zero»** — `internal/pipeline/quality.go:233`=`the UNSIGNED BANK count is unknown, not zero`, + `internal/pipeline/status.go:768`=`the unsigned-term count is unknown, not zero`, + `internal/pipeline/status.go:851`=`reported as unknown, not as none`, + `internal/pipeline/bookbuild.go:227`=`(reported as unknown, not as none)`. +2. **Фигура едет С БАЗИСОМ** — `RebillBasis` (`internal/pipeline/status.go:275`=`RebillBasis string`), четыре значения `pending|stored|none|failed` (`internal/pipeline/bankmaterialize.go:360-363`), и её докстринг формулирует ровно закон: *«RebillBasis says WHAT the two figures above are a projection of, because the number alone cannot diff --git a/backend/docs/MONEYSTOP_REPORT.md b/backend/docs/MONEYSTOP_REPORT.md index 68c29979..5d9b6c77 100644 --- a/backend/docs/MONEYSTOP_REPORT.md +++ b/backend/docs/MONEYSTOP_REPORT.md @@ -1,6 +1,6 @@ # Отчёт бэкенд-пака «денежный стоп перестаёт быть аварией» (05.09) -> **Промт:** `docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md`. **Зона записи:** `backend/` + своя секция +> **Промт:** `docs/archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md` (сдан и заархивирован 05.09, `D39.206`). **Зона записи:** `backend/` + своя секция > `docs/PROGRESS.md`. **Дерево НЕ закоммичено, лендинг за оркестратором.** > > ⚠ **В рабочем дереве лежат ЧУЖИЕ правки — вся `platform/`** (параллельный платформенный пак @@ -197,7 +197,8 @@ $ git grep -c "StepMax" HEAD -- backend/internal/runevents/ # 0 - `docs/product-requirements.md` (ПТ-35): отзывая 05.09 «запрет денег на экране», владелец оставил остальное дословно — «цены моделей, стоимость стадий **и вызовов**». Сузить это до «пользовательской поверхности» зона не вправе, и я это сужение приняла. -- `docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md:78` применяет запрет к **ПРОВОДУ**, а не к экрану: «Наружу — +- `docs/archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md:82`=`цены моделей, стадий и вызовов не выходят` + применяет запрет к **ПРОВОДУ**, а не к экрану: «Наружу — только НЕДОСТАЮЩАЯ сумма; цены моделей, стадий и вызовов не выходят». ⇒ замер верификатора попал не в реализацию поля, а **в посылку ЗАКАЗА**, а на этот случай норма однозначна: стоп и вопрос владельцу. - ссылка на ратификацию «D39.106 §2» — овер-атрибуция: `05-decisions-index.md:167` говорит, что D39.106 — @@ -513,6 +514,8 @@ $ grep -rh '^func Test' backend --include=*_test.go | wc -l # 1213 | 54 | ⛔ **ПОЧИНКУ V2-7 НЕ ДЕРЖАЛ НИ ОДИН ТЕСТ — предъявила ВЫЖИВШАЯ ПОСАДКА, а не чтение.** В `internal/chunk/*_test.go` слова `Structure` не было вовсе; два случая в `priceprojection_test.go:144-146` — КРАЙНИЕ (только form feed → `declared`, только заголовки → `detected`), а СМЕШАННОГО — одного случайного `\f` среди найденных заголовками глав — не держал никто. Ровно в нём дефект и жил | ПОЧИНЕНО — `TestTXTStructureIsDeclaredOnlyWhenTheFormatDrewEVERYBoundary` (вся линейка из трёх), посадка красна именно подтестом `one_stray_form_feed_among_matched_headers`. ⚠ Класс: **починка, у которой есть посадка, но нет теста, выглядит как покрытая ровно до полного прогона каталога** | | 55 | ⛔ **МОЯ СОБСТВЕННАЯ ПРОВЕРКА «отличаются только комментариями» ДАЛА ЛОЖНУЮ ЗЕЛЕНЬ.** Утилита-стриппер не собралась (`error obtaining VCS status`), оба выхода вышли ПУСТЫМИ, `diff` сравнил пустоту с пустотой и напечатал «ИДЕНТИЧНО» — и я чуть не оперлась на это, доказывая законность склейки двух прогонов | ПОЧИНЕНО — размер выхода печатается рядом с вердиктом, пустой выход стал отдельной красной ветвью; результат пере-снят и верен (5020/5020 и 2710/2710 байт). ⚠ Тот же класс, что §6.4, но теперь на ИНСТРУМЕНТЕ ПРОВЕРКИ: **проверка, которая не умеет провалиться, ничего не проверяет** | | 56 | ⛔ **ДВА КОММЕНТАРИЯ ОДНОГО КОММИТА ПРОТИВОРЕЧИЛИ ДРУГ ДРУГУ О ФОЛБЭКЕ ЦЕНЫ (F7 приёмки).** `manifest.go` объявлял фолбэк ИНВАРИАНТОМ («без него книга без сайдкара молча отчитывается без цены»), а `status.go` в шапке того же поля утверждал обратное: «absent when there is no current manifest — у фолбэка есть текст, но нет гарантии сайдкара, что он описывает ЭТУ резку». Второе описывало код ровно до того момента, как ТОТ ЖЕ коммит добавил фолбэк и сюда не вернулся. Потребитель построил бы «нет сайдкара ⇒ нет цены» и показал бы покупателю пустоту на той самой поверхности, с которой тот и спрашивает | ПОЧИНЕНО — шапка `StatusReport.Price` пере-написана: цена есть и БЕЗ сайдкара; совпадение двух поверхностей держится тем, что оба конца гоняют ОДНУ деривацию (`readModelPrice` → `projectBook`), а не тем, что один отказывается отвечать; и фолбэк описывает эту резку ПО ПОСТРОЕНИЮ, а не по гарантии. ⚠ Правка комментарная, предъявлено машинно: `status.go` без комментариев побайтно идентичен (20012 vs 20012) | +| 57 | ⛔ **ЯКОРНЫЙ ЛИНТ ДОКОВ Я НЕ ГОНЯЛА НИ РАЗУ ЗА СМЕНУ, а свой — после каждого касания кода.** Проверяла `mutations.json` собственным скриптом и не заметила, что у зоны есть ВТОРОЙ корпус якорей и готовый гейт на него (`docs/scripts/counts.py --lint`, зовётся пре-коммит-хуком при ЛЮБОМ коммите с непустым индексом). На дереве он показывал **6 битых якорей в `backend/docs/`**, из них 5 — долг зоны, старше моего пака (замерено: `RebillBasis string` стоял на 275 ещё в `81a89e9^`, а якорь звал 249), и 1 — свежая, от переноса промта в архив | ПОЧИНЕНО — все шесть пере-нацелены по СОДЕРЖИМОМУ, линт `0 проблемных якорей в 113 живых доках`, сверяемых по токену стало 194 → 200. ⚠ Класс: **у зоны было ДВА множества якорей и одна привычка** — та, которую я завела сама, а не та, под которую в репозитории уже стоял гейт. Собственная дисциплина вытеснила существующую | +| 58 | ⛔ **МОЯ ФОРМУЛИРОВКА ЛЕЧЕНИЯ КЛИНА НАЗЫВАЛА СМЕНОЙ ТО, ЧТО ЕЮ НЕ ЯВЛЯЕТСЯ.** §9 п.1 предлагал «деградацию отказа резервации на attempt 0 (**смена D2.3**)» — а `D2` УЖЕ кончается флагом («ретрай с бо́льшим `max_tokens` до капа, потом флаг»), и денежная ветка до него просто не доходит: ошибка уходит наверх из цикла попыток раньше. То есть это ДОСТРОЙКА существующей диспозиции, а не правка ратифицированного — разница решает, нужна ли ратификация вообще | ПОЧИНЕНО — сверено по телу ноты, формулировка заменена, добавлено требование оркестратора: **причина флага обязана ОТЛИЧАТЬСЯ от исчерпания регенераций**, иначе пометка врёт о причине (`D39.204`, строка бэклога 291). ⚠ Поймал оркестратор чтением журнала; я предлагала правку ратифицированной ноты, не открыв её тела | ### 6.4. ⛔ ЧЕТВЁРТЫЙ КЛАСС ЛОЖНОЙ ЗЕЛЕНИ, найденный в этой смене @@ -741,7 +744,11 @@ go test ./internal/chunk/ -run 'TestTXTStructureIsDeclaredOnly' -v удвоенным бюджетом, юнит не доделается НИКОГДА, а прогон уходит exit 4 при полностью доставленных купленных юнитах. Мой `step_max_usd` это НАЗЫВАЕТ (ретраи в нём именно поэтому), `Finished.Money` называет доставленное и отложенное — но клин остаётся. Лечение: (а) деградация отказа ретрая во флаг - attempt 0 (смена D2.3) либо (б) минимальная покупка платформы ≥ `step_max_usd`. Выбор не мой и не + attempt 0 — ⚠ **и это НЕ смена D2, как я записала сперва:** тело ноты + `D2` («ретрай с бо́льшим `max_tokens` до капа, ПОТОМ ФЛАГ») уже кончается флагом, а денежная + ветка до него не доходит — ошибка уходит наверх из цикла попыток раньше. Значит это ДОСТРОЙКА + существующей диспозиции, а не её правка, и требование к ней одно: **причина флага обязана + ОТЛИЧАТЬСЯ от исчерпания регенераций**, иначе пометка врёт о причине (`D39.204`, строка 291) — либо (б) минимальная покупка платформы ≥ `step_max_usd`. Выбор не мой и не оркестратора; строка бэклога с ОБОИМИ путями — в моей секции `docs/PROGRESS.md`. 2. ⚠ **⭐-уточнение оркестратора («защёлка на свежем, продолжение на ретрае») ОТКЛОНЕНО, и не по цене.** Его посылка — «текст у юнита ЕСТЬ, он лишь флагован» — ложна: см. п. 1, строки `chunk_status` нет,