Fold the self-audit into the honesty-pack prompt: zone invariants inlined, exit-code attribution corrected, row 164 and the omissions signed

This commit is contained in:
Claude (backend session) 2026-08-17 00:33:00 +03:00
parent abf49caa5d
commit 7e0affd2f2

View file

@ -1,7 +1,14 @@
# Промт: бэкенд, пак «честные числа и статусы» — строки 176 · 181 · 172-г · 187
> Выдан оркестратором №18, 16.08.2026. Запуск — по слову владельца.
> Выдан оркестратором №18, 17.08.2026. Запуск — по слову владельца.
> Вес пака — лёгкий-средний: четыре точечных места, приёмка инлайн.
>
> **Что сознательно НЕ вошло** (подписываю пропуск, чтобы ты не считал это забывчивостью и не
> «дочинил» молча): **146** (гейт свежести цен запирает $0-пути `report`/`status`) · **173**
> (`backupStamp` секундной точности маскирует «проект занят») · **177** (гигиена restore point у
> `migrate`: рваная копия при `kill -9`, копии не подчищаются, SIGINT не прерывает) — все три той же
> темы «движок врёт наружу», но в другой области кода (деплой и бэкап), и владелец выбрал МЕЛКИЙ пак.
> Увидишь их по пути — не трогай, а перечисли в отчёте.
## 0. Зачем (проблема, понятная без истории проекта)
@ -47,13 +54,30 @@ git, и норма «персист, не scratch» требует, чтобы
3. Тела строк **176 · 181 · 172-г · 187** в таблице «Бэклог» файла `docs/PROGRESS.md` — это ЗАКАЗ;
в них лежат `file:line` отправные точки. Строки писала нейросеть: якоря могли уплыть, формулировка
могла устареть — **код первичен**, расхождение строки с кодом называй вслух в отчёте.
4. `docs/architecture/05-decisions-log.md`: **D39.131** (половина 05 контракта кодов выхода) ·
**D39.134 п.2** (полоса отказов 1019 и её обещание) · **D39.137** (пере-пин цен — откуда взялась
строка 181). Греп по номеру: сначала живой файл, потом слайсы `docs/archive/architecture/`.
4. `docs/architecture/05-decisions-log.md`: **D39.131 п.2а** (ратифицированы exit **4** потолок и **5**
graceful stop + полоса отказов 1019 со словарём классов) · **D39.134 п.2** (exit 13 финализирован;
там же обещание полосы) · **D39.137** (пере-пин цен — откуда взялась строка 181). ⚠ Коды **03** этими
нотами НЕ ратифицировались — их источник Milestone 2 / R1-FL-A, действующая формулировка живёт
комментарием `cmd/tmctl/main.go:61-75`; при расхождении верь коду. Греп по номеру: сначала живой
файл, потом слайсы `docs/archive/architecture/`.
5. `docs/experiments/00-provider-quirks.md`**только если** дойдёт до пункта 5 (живой прогон вахты).
Всё остальное — код, и его ты достаёшь сам.
**Инварианты зоны, которые этот пак способен сломать** (полный список — `backend/README.md` §Инварианты
и `docs/architecture/12-go-style-notes.md`; сюда вынесено то, что под ударом именно здесь):
- **Деньги:** `reserve → call → settle+checkpoint ОДНОЙ транзакцией`, `committed == SUM(checkpoints)`
переживает `kill -9`, цена — по ФАКТИЧЕСКИ ответившей модели. Пункт 1 трогает ПРОЕКЦИЮ (read-путь),
а не эту цепь; уехал в саму цепь — стоп и пинг.
- **Снапшот-дисциплина:** всё, что влияет на wire-байты ИЛИ вердикты, свёрнуто в `snapshotID`; правка
= громкий `--resnapshot` = переоплата книги. Этот пак таких правок НЕ содержит по построению.
- **Эхо-мина DeepSeek:** thinking НИКОГДА не отключать (`reasoning:"off"` там осознанный no-op, гейт
`echoMineViolation` валит конфиг fail-fast). Касается пункта 5.
- **Язык кода — английский** (решение владельца 20.07, `12-go-style-notes` §1): комментарии, логи,
тексты ошибок, usage-строка. Русским остаются ТОЛЬКО wire/инъекц-промпты, которые читает модель, и
lang-data таблицы — их пак не трогает. Пункты 2 и 4 пишут именно код и комментарии ⇒ по-английски.
## 3. Состав
Пункты 14 — **«делай РОВНО так» по ПРЕДМЕТУ** (что чинится, решено); **форма фикса внутри — твоя,
@ -76,7 +100,8 @@ git, и норма «персист, не scratch» требует, чтобы
приходить наружу кодом, который потребитель прочтёт как ПРОВАЛ.
⚠ **Обе полосы кодов — ЗАМОРОЖЕНЫ, это шов, их словарь двигается только ратификацией.**
- **05 не трогать** (ратифицированный словарь, D39.131; шапка `cmd/tmctl/main.go`). В частности
- **05 не трогать** (03 — Milestone 2 / R1-FL-A, живут комментарием `cmd/tmctl/main.go:61-75`;
4 и 5 ратифицированы D39.131 п.2а). В частности
**exit 2 НЕ переносить**: значение «завершено с флагами» зашито у потребителя намертво
(`platform/internal/ingest/exit.go:24,89` · `platform/internal/runs/reconcile.go:484``ready`), и
«развести номера, оставив полосу 1019 нетронутой» **сломает шов, не нарушив буквы этого запрета**
@ -112,15 +137,30 @@ git, и норма «персист, не scratch» требует, чтобы
**4. Строка 187 — два лживых комментария.** `internal/pipeline/snapshot.go` («auto/draft исключены
per D8») и докстринг `internal/membank/memory.go` («Approved-only») описывают до-паковое поведение;
код с пака-20 сворачивает в хеш КАЖДУЮ строку любого статуса. $0, поведение не двигается.
код с пака-20 сворачивает в хеш КАЖДУЮ строку любого статуса. $0, поведение не двигается; новый текст —
по-английски, как весь код зоны.
**Диспозиция соседней строки 164 — назови её явно, не решай молча.** 164 («`status` завышает
RebillUSD: read-путь не материализует base-банк ⇒ инъекция пустая ⇒ repin недоопознан») живёт в ТОЙ ЖЕ
функции проекции, что и пункт 1. Возможных исходов два, и оба легитимны: взять её этим паком (тогда
скажи цену и покрой тестом) либо оставить (тогда напиши в отчёте, почему разделение честнее). ⚠ Чего
делать нельзя — молча починить половину так, что строка 164 станет неверной, но останется открытой.
**5. Живой прогон вахты весов — ТОЛЬКО при явной санкции владельца в твоём запуске.** Если
санкция названа: прогнать риг из п.3 живьём (`TM_LIVE=1 TM_CLASSIFY6_CONFIG=<стендовый book.yaml>
go test -tags live -run TestLiveClassifierHarmSet -v ./internal/pipeline/`), сырьё персистить рядом с
проектом пробы, ЛЕДЖЕР не сбрасывать, принимать только `finish=stop`, потратить не больше названной
санкция названа: прогнать риг из п.3 живьём — стендовый конфиг существует, абсолютным путём это
`~/books/gu-zhenren/coldrun-b/reprobe/classify6/book.yaml` (проверь сам, что он на месте и что это
именно проба классификатора):
`TM_LIVE=1 TM_CLASSIFY6_CONFIG=~/books/gu-zhenren/coldrun-b/reprobe/classify6/book.yaml go test -tags live -run TestLiveClassifierHarmSet -v ./internal/pipeline/`.
Сырьё персистить рядом с проектом пробы (риг это делает сам — файл `classifier-6of6-<effort>.json`), ЛЕДЖЕР не сбрасывать, принимать только `finish=stop`, потратить не больше названной
владельцем суммы. ⚠ **Стартовать вне пиковых окон DeepSeek (0104 и 0610 UTC)** — в пике вызов
стоит вдвое; суммы копеечные, но правило стоячее. **Санкции нет в твоём запуске — пункт НЕ исполняется**, и это не obstacle, а
стоит вдвое; суммы копеечные, но правило стоячее. ⚠ **Thinking у DeepSeek не отключать ни при каком
уровне эффорта** — это эхо-мина, и гейт `echoMineViolation` обязан оставаться в силе.
**Санкции нет в твоём запуске — пункт НЕ исполняется**, и это не obstacle, а
норма: платные вызовы без явно названной суммы запрещены.
**Ревью исполнением здесь — не только кода** (мандат самопроверки, CLAUDE.md): прочитай СФОРМИРОВАННЫЕ
запросы к модели и ПОЛУЧЕННЫЕ ответы своими глазами, а не только агрегат рига — совпадает ли
отправленное с тем, что ты думаешь, что отправил (модель, уровень эффорта, thinking, состав промпта),
и подтверждают ли сырые ответы вердикт, который печатает риг. Расхождение — в отчёт, а не в сноску.
**Чего НЕ делать (жёстко).**
- Не трогать ничего, что двигает провод: тела промптов, состав инъекции, версии снапшота,