diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 8e24d8a..e19d1ef 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -39,7 +39,7 @@ Tududi (проект `jellybit`) больше **не** держит беклог - [Глубокий healthcheck и статус зависимостей](healthcheck-zavisimosti.md) — /healthz проверяет только сам сервис - [НФТ: масштаб до 100 одновременных загрузок (потолок — 1000)](masshtab-100-zagruzok.md) — Зафиксировать в НФТ ориентир 100/1000 загрузок + аудит узких мест (SQLite, воркер, поллинг) - [Обучение на правках человека (few-shot из прошлых ревью)](obuchenie-na-pravkah.md) — Когда человек поправил матч, тип или нумерацию — сохранять это как пример и подмешивать… -- [Гейт авто-раскладки по confidence: спека vs код](gate-confidence-spec-vs-code.md) — Расхождение спека↔код: код делает confidence жёстким гейтом вопреки спеке — нужно решение +- [Confidence-гейт авто-раскладки: узаконить в спеке + сделать выключаемым (дефолт 0.7)](gate-confidence-spec-vs-code.md) — Решено (B): гейт оставляем как доп. проверку на ревью — выключаемый порог, дефолт 0.85→0.7, записать в спеку - [Внешние субтитры: пары VobSub и языковой суффикс](vneshnie-subtitry.md) — Привязка субтитр→серия уже работает; остались пары VobSub .idx+.sub и потеря Lang/Flags - [Sweep застрявших linking при рестарте + фикс persist-failure (MAJOR-4)](review-major4-sweep-linking.md) — задачи застревают в linking при рестарте; заодно фикс persist-failure _(ревью 2026-07-08)_ - [Defer из catched → лимбо → необратимый deleted (MAJOR-6)](review-major6-defer-catched.md) — Defer из ещё-не-добавленного catched уводит задачу в необратимый deleted _(ревью 2026-07-08)_ diff --git a/docs/backlog/gate-confidence-spec-vs-code.md b/docs/backlog/gate-confidence-spec-vs-code.md index b11b112..7d472a9 100644 --- a/docs/backlog/gate-confidence-spec-vs-code.md +++ b/docs/backlog/gate-confidence-spec-vs-code.md @@ -1,7 +1,47 @@ -# Гейт авто-раскладки по confidence: спека vs код +# Confidence-гейт авто-раскладки: узаконить в спеке + сделать выключаемым (дефолт 0.7) **Приоритет:** средний -Аудит спек↔код (2026-07-03) нашёл расхождение в модели уверенности. Спека recognition утверждает, что самооценка LLM confidence — вспомогательный сигнал, НЕ единственный гейт: при подтверждённом матче + чистой валидации + согласованности сигналов авто-раскладка допускается. Код же (internal/recognize/validate.go, confidence < AutoThreshold, дефолт 0.85) делает confidence жёстким блокирующим условием: план с матчем и чистой валидацией, но confidence 0.5 уйдёт в review вопреки спеке. Определиться: признать порог AutoThreshold в спеке как легитимный гейт (скорее так — код его осознанно ввёл конфигом) либо ослабить код. Заодно AutoThreshold как конфигурируемый гейт спекой не описан. +Аудит спек↔код (2026-07-03) нашёл расхождение: спека recognition считает +`confidence` вспомогательным сигналом (условия авто — только матч в базе + +чистая валидация + согласованность), а код (`internal/recognize/validate.go:102`) +добавляет `confidence < threshold` (дефолт 0.85) четвёртым **блокирующим** +условием. -Связано: openspec/specs/recognition, ADR-2026-06-13-auto-link-requires-db-match, пакет recognize. +**Решение (2026-07-08): оставляем гейт (вариант B).** Низкий confidence — это +полезная доп. проверка на ревью: LLM могла ошибиться так, что под ошибочные +данные в базе нашёлся «такой же» фильм/сериал (ложный, но самосогласованный +матч — матч и валидация чисты, а модель при этом не уверена). Такой случай ловит +именно порог, уводя задачу в review, а не в авто. Значит confidence остаётся +законным условием — но его надо честно оформить. + +Что сделать: + +1. **Сделать гейт реально выключаемым.** Сейчас `recognize.go:173-175` + (`if threshold <= 0 { threshold = defaultAutoThreshold }`) не даёт выключить + порог: `0` в конфиге молча возвращается к дефолту. Убрать этот фолбэк — дефолт + задаётся один раз при загрузке конфига; значение `0` → гейт пропускается + (в `decide` уже `p.Confidence < 0` никогда не истинно, достаточно снять + пере-применение дефолта). +2. **Понизить дефолт** `recognition.auto_confidence_threshold` 0.85 → **0.7** + (`config.go:218`, `recognize.go:144 defaultAutoThreshold`). Условия 1–3 несут + корректность; порогу остаётся ловить только по-настоящему неуверенные планы. +3. **Записать в спеку.** В `openspec/specs/recognition/spec.md` (Requirement + «Модель уверенности и решение auto/review») переформулировать: confidence — + явное **четвёртое, конфигурируемое** блокирующее условие (порог + `recognition.auto_confidence_threshold`, `0` = выкл, дефолт 0.7), а не «лишь + вспомогательный сигнал». Добавить сценарий: матч + чистая валидация + + согласованность, но `confidence` ниже порога → review. +4. **Конфиг-конвенция/дока:** описать ключ в `docs/conventions/config.md` (диапазон + [0,1], 0 = выкл, дефолт 0.7). +5. **Тесты:** `decide` с `threshold=0` (гейт выключен, авто при чистых 1–3); + confidence ниже/выше порога при выполненных 1–3. +6. Точное число порога откалибровать позже — для этого есть задача + [eval-харнес распознавания](eval-harness-raspoznavaniya.md) (сейчас гейтим по + неизмеренному сигналу). + +Оформить как OpenSpec-change (дельта `recognition` + правки +`validate.go`/`recognize.go`/`config`). + +Связано: openspec/specs/recognition, ADR-2026-06-13-auto-link-requires-db-match, +[eval-харнес](eval-harness-raspoznavaniya.md), пакет recognize.