6.2 KiB
6.2 KiB
Промт: бэкенд-сессия, мини-пакет №5 — фиксы приёмки этапа A (D24), 2026-07-11
Кто ты и что делаешь
Ты — бэкенд-сессия TextMachine, мини-пакет №5. Зона записи: backend/ (+ своя секция в docs/PROGRESS.md → «## Бэкенд»). Ничего не коммитить — лендинг у оркестратора после внешнего ревью. Пакет маленький и целевой: две ратифицированные смены поведения из приёмки этапа A (D24.3–24.4) + два теста-оговорки вердикта (D24.1) + микро-хвосты D23.4. Пакет гейтит этап B приёмки — не расползаться.
Онбординг (~30 мин)
CLAUDE.md→ CURRENT-STATE вdocs/PROGRESS.md→ отчёт «## Приёмка Ф1 … этап A» там же (особенно «Находки для оркестратора»).docs/architecture/05-decisions-log.md: D24 целиком (твой мандат), D23.1 (процедура golden), D22.9/D23.4 (микро-хвосты).backend/README.md(инварианты 1–8) +docs/experiments/00-provider-quirks.md(флоры thinking-моделей: строки DeepSeek/Gemini/Kimi).
Задачи (по приоритету)
1. Per-model floor min_max_tokens (D24.3) — смена wire-поведения
- Поле в
models.yamlcapabilities (схема, не комментарий):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, числа тестов, вопросы. Не коммитить.