textmachine/docs/BACKEND_PACKAGE5_SESSION_PROMPT.md

48 lines
6.2 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.

# Промт: бэкенд-сессия, мини-пакет №5 — фиксы приёмки этапа A (D24), 2026-07-11
---
## Кто ты и что делаешь
Ты — **бэкенд-сессия** TextMachine, мини-пакет №5. Зона записи: `backend/` (+ своя секция в `docs/PROGRESS.md` → «## Бэкенд»). **Ничего не коммитить** — лендинг у оркестратора после внешнего ревью. Пакет маленький и целевой: две ратифицированные смены поведения из приёмки этапа A (D24.324.4) + два теста-оговорки вердикта (D24.1) + микро-хвосты D23.4. **Пакет гейтит этап B приёмки** — не расползаться.
## Онбординг (~30 мин)
1. `CLAUDE.md` → CURRENT-STATE в `docs/PROGRESS.md` → отчёт «## Приёмка Ф1 … этап A» там же (особенно «Находки для оркестратора»).
2. `docs/architecture/05-decisions-log.md`: **D24 целиком** (твой мандат), D23.1 (процедура golden), D22.9/D23.4 (микро-хвосты).
3. `backend/README.md` (инварианты 18) + `docs/experiments/00-provider-quirks.md` (флоры thinking-моделей: строки DeepSeek/Gemini/Kimi).
## Задачи (по приоритету)
### 1. Per-model floor `min_max_tokens` (D24.3) — смена wire-поведения
- Поле в `models.yaml` **capabilities** (схема, не комментарий): `min_max_tokens: <int>`. Значения: `deepseek-v4-flash: 8000`, `deepseek-v4-pro: 8000`, `gemini-3.1-pro-preview: 8000`, `kimi-k2.6: 16000`. glm-5/5.1 и grok-4.3 — БЕЗ поля (reasoning off/none).
- Применение: при деривации max_tokens **любого** вызова модели — праймари-аттемпты (`stagerun.go:89-92`) И эскалационные хопы (`maybeEscalate` наследует бюджет праймари — ровно это сломало эскалацию на этапе A: хопы deepseek-v4-pro при 2048/3291 вернули finish=length, один — 0 байт контента). Флор берётся по МОДЕЛИ вызова (у хопа — модель хопа, не праймари), применяется ДО request_hash — wire-видимо.
- Существующие комментарии-заглушки «дать max_tokens ≥8000/16000» в models.yaml привести к новому полю (комментарий → схема).
- Санити: резервация EstimateUSD вырастет на флорнутых вызовах (≤$0.10/вызов) — убедись, что тесты потолков это переживают; committed не меняется (биллинг по факту).
### 2. Post-check `dstFormPresent`: базовый dst всегда проверяется (D24.4) — смена вердиктов
- `mempostcheck.go:85-96`: множество проверяемых форм = `declForms normalizeTargetForm(dst)` ВСЕГДА (сейчас фолбэк на базу только при пустом decl). Закрывает 37/55 ложных промахов этапа A (класс: «Фан Юань» в выходе, decl только косвенные).
- Тест на репро-кейс этапа A: entry с непустым oblique-only decl + именительный в выходе → промаха НЕТ; и негатив: dst и все формы отсутствуют → промах ЕСТЬ (mutation-verified: реверт фикса валит тест).
### 3. Golden re-capture — ратифицированная смена поведения (D23.1, инвариант №8)
- `TM_UPDATE_GOLDEN=1` вручную; в журнал пакета — дифф-класс golden: изменения ДОЛЖНЫ исчерпываться (а) `max_tokens` в wire-телах/request_hash флорнутых моделей, (б) postcheck-вердиктами (confirmed-miss набор). Любой другой класс диффа = стоп и пинг оркестратору.
- Заодно D23.4: ячейка AMBIGUOUS>0 в фикстуру ИЛИ смягчение коммента `golden_test.go:32` — реши и сделай.
### 4. Тесты-оговорки вердикта этапа A (D24.1)
- **Coverage-recall (D24.1б):** синтетический мини-набор искусственных пропусков (вырезание предложений/абзацев из эталонных чанков) → coverage-гейт ловит **≥90%** (критерий 4 приёмки, первая половина). Юнит/интеграционный, без wire. Зафиксируй в тесте и recall-число.
- **Отказ эскалации по budget_usd (D24.1г):** исчерпанный `escalation.budget_usd` → хоп НЕ стреляет, диспозиция честная (флаг остаётся), деньги не тратятся. Mutation-verified.
### 5. Микро-хвосты D23.4 (попутно, не разрастаться)
- Тест errTail на границу руны (реверт фикса сейчас выживает сьют); лог-ассерты retryLoop (retry_in / отсутствие «will retry» на последней попытке) через slog-capture. Опционально: компонент-тест snapshotID-payload; kill9 rounds 3→5.
## Дисциплина
- Промпты/конфиг-семантику НЕ менять сверх D24-мандата; никаких «заодно» в wire.
- Всё mutation-verified где применимо; `go build ./... && go vet ./... && go test -race ./...` чисто.
- `git status` перед стартом: чужие незакоммиченные правки — стоп и пинг. `.env` не читать. Книга/производные вне git.
- Отчёт: секция в `docs/PROGRESS.md` «Бэкенд» — что сделано, дифф-класс golden, числа тестов, вопросы. Не коммитить.