textmachine/backend/docs/MONEY_HONESTY_PLAN-NOTE.md

115 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Записка-план — пак «ДЕНЬГИ И ЧЕСТНОСТЬ ВЫДАЧИ» (§7.1 промта)
Сессия `textmachine-main-8a`, роль БЭКЕНД. Промт — `docs/BACKEND_MONEY_HONESTY_SESSION_PROMPT.md`
(оркестратор №21, 31.08). Написана **ДО первой правки** дерева; ниже — состояние на момент написания,
она не переписывается задним числом (дополнения помечаются датой и словом «дописано»).
> ⚠ **Дописано 02.09 — указатели и исходы; тело записки НЕ переписывается (это пре-регистрация).**
> ⚠ Путь `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**.
> ⚠ Два места ниже опровергнуты собственной же работой пака, и оба разобраны в отчёте:
> «22.6%» (§4) — ответ на ДРУГОЙ вопрос, величина завышения = **29.2%** (отчёт §5.4); пред-регистрированная
> посадка A9 (§2, «воспроизведение перерасхода фикстурой + посадка») НЕ написана — долг назван прямо
> в отчёте §8 п.1.
**Личность старта.** HEAD `9d27c0b`, дерево ЧИСТО (`git status --short` → пусто).
Go-модуль `backend/`. Пак **$0**: платных вызовов не содержит и не планирует.
---
## 0. ВЕРДИКТ ПО СНАПШОТУ ДЛЯ A1 — первым пунктом, как велит §7.1
**Вопрос:** двигает ли снапшот правка дефолта `regenerate_echo_before_escalate`?
**Ответ: НЕ ДВИГАЕТ.** Основание — определение промта §5 («снапшот-движущее = всё, что попадает в
payload `buildSnapshotID`»), проверенное ИСПОЛНЕНИЕМ, а не памятью:
```
$ grep -c 'Retries' backend/internal/pipeline/snapshot.go
0
```
Полный перечень полей payload снят командой (`sed -n '/^\tsnap := struct {/,/^\t}{/p' … | grep 'json:"'`)
— 22 верхнеуровневых поля плюс `[]stageSnap`; ни `Retries`, ни `RegenerateBeforeEscalate`, ни
`RegenerateEchoBeforeEscalate` среди них нет, и в `repairSnap` их тоже нет.
**Грепа МАЛО, и я это знаю:** он проверяет ИМЯ, а не поведение. Поэтому вердикт получает МАШИННУЮ
проверку по §5: snapshot ID снимается на фикстуре **ДО** моего диффа и **ПОСЛЕ** него, и равенство
предъявляется в отчёте командой. До предъявления равенства вердикт считается PLAUSIBLE, а не
подтверждённым.
⇒ A1 остаётся в ярусе A и делается в этом паке.
---
## 1. Что беру и в каком порядке
Пак ДВУХФАЗНЫЙ (§1 промта), и порядок продиктован стоп-точкой:
### ФАЗА 1 — ЗАКОН РАСКРЫТИЯ (главный результат, НЕ ратифицирую сама)
1. Корпус из десяти строк (A0·A2·A3а·A3б·A4·A5·A6·A7·A8·A10) грунтуется В КОДЕ — по агенту на строку,
каждый с адверсариальным проверяющим поверх (веер описан в отчёте).
2. Карта потребителей и каналов снимается ГРЕПОМ по `platform/internal/` (read-only) — промт прямо
велит проверить перечень самой, потому что его автор один раз уже назвал его неверно.
3. Закон пишется файлом `backend/docs/DISCLOSURE_LAW_DESIGN.md`: классы фактов · назначение
потребитель→канал · гейт · разбор ВСЕХ десяти строк корпуса.
4. Специально ищу **ОДИННАДЦАТЫЙ экземпляр** вне таблицы промта — это лучший результат фазы (§1).
5. Дизайн уезжает ПИНГОМ оркестратору №21 (`textmachine-main-5f`, жив по `ListAgents`) и секцией
отчёта. **К правкам A0/A2/A3/A4/A5/A6/A7/A8/A10 не приступаю до ответа.**
### ФАЗА 2 — пока жду ратификации (не зависит от закона и его не предрешает)
6. **A1** — дефолт эхо-регена. Гейтится вердиктом §0 выше.
7. **A9** — строка 233 (трата терминолога масштабируется книгой).
8. **A11** — строка 232 (ось «свежий/пере-делка» из полноты строк, а не из факта отгрузки).
Порядок 6→7→8 — как велит промт §2 («A9A11 по остатку ресурса, в этом порядке» — с поправкой, что A1
идёт раньше: он назван в §1 как то, что берётся «пока ждёшь», и он самый дешёвый по риску).
### Если ратификация придёт
9. Применяю закон к десяти экземплярам. Если не придёт — сдаю фазу 1 + три пункта, и это ПОЛНОЦЕННЫЙ
результат (§1 дословно). **Закон сама не изобретаю, чтобы успеть.**
## 2. Чем докажу каждое — оси предъявления (§6)
| пункт | чем предъявляю |
|---|---|
| A1 | (а) равенство snapshot ID на фикстуре ДО/ПОСЛЕ диффа — командой; (б) посадка на САМУ ручку: сегодня у `RegenerateEchoBeforeEscalate` **НОЛЬ тестов** (`grep -rn RegenerateEchoBeforeEscalate --include=*_test.go` → пусто), значит тест ловит и то, что ручка вообще работает; (в) экономика — числами, ПЕРЕ-СНЯТЫМИ мной из БД прогона read-only, а не из отчёта |
| A9 | воспроизведение перерасхода фикстурой + посадка |
| A11 | посадка: конфиг с ДОБАВЛЕННОЙ стадией на дочитанной книге обязан перестать печатать «N unit(s) NEVER delivered» |
| фаза 1 | закон обязан объяснить ВСЕ десять строк и назвать канал каждой; гейт — исполнимый, а не намерение |
**Дисциплина посадок (§6, D39.171):** каждая посадка сажается на состояние ДО правки и обязана
краснеть АДРЕСНО. Посадка на ТЕКСТ сообщения обязана предъявить, что она краснеет при подмене именно
этой строки, — ассерт по подстроке в общем лог-буфере даёт тихо-зелёное.
## 3. Чего НЕ делаю (границы, объявленные заранее)
- **Ничего снапшот-движущего** — ярус B не трогаю: эффорт редактора, потолок вывода (`finish=length`
как ПРИЧИНА в A0), свёртка числа ре-генов, метка-из-хеша в A8.
- **Новый код выхода не завожу** (A5 — пинг с домашней заготовкой).
- **Числами прогона ставку не калибрую** (n=3, `D39.165 ⛔г`) — экономика A9 идёт как механизм, не как число.
- **Не коммичу** — лендит оркестратор. Пишу только в `backend/` и в свою секцию «Бэкенд» в `docs/PROGRESS.md`.
- `books/gu-zhenren/coldrun-v16/` — только чтение, БД только `file:…?mode=ro`.
- Тест/голден/гейт ради зелени не правлю; несогласие — пинг.
## 4. Что уже сделано на момент записки (чтения, не правки)
Карта чтения §4 пройдена целиком (5 позиций). Пере-снято мной из БД прогона read-only
(`sqlite3 'file:…?mode=ro'`), а не взято из отчёта:
- `ok=0 AND cost_usd>0`**11 строк, $0.12316089**, при `SUM(cost_usd)` книги **$0.43610966** ⇒
**28.24%**. Цифры промта подтверждены.
- `estimated=1`**0 строк** (биллящихся decode-fail не было).
- Эскалационные хопы: **5**, `$0.10330452`, средний `$0.02066090`.
- Эхнутые черновые попытки (flash, `ok=0`): **5**, `$0.01070788`, средняя `$0.00214158`.
- Успешные черновые flash: **15**, средняя `$0.00382851`.
**И находка, которой в промте НЕТ** (заведена как кандидат в одиннадцатый экземпляр): срез
`ok=0 AND cost_usd>0` **НЕ ЕСТЬ «оплаченный впустую»** — в нём смешаны три разные вещи, и на живых
деньгах все три присутствуют:
`degraded=cjk_artifact` у роли **classifier** (3 строки, `$0.00918827`) — это МИС-ВЕРДИКТ
(строка бэклога 105), вызовы удались; `degraded=sanitizer_stripped` у редактора (1 строка,
`$0.01865424`) — текст ОТГРУЖЕН; и только остальное (`$0.09531838`) действительно выброшено.
Наивная поверхность A0 назвала бы оператору на 22.6% больше потерь, чем было.