- закрыты few-shot на правках человека и eval-харнес с размеченным корпусом: направление — тюнинг автоматического распознавания без участия человека - цель распознавания переписана: точность видна по рабочему потоку, а не по фиксированному корпусу - поправлены ссылки на удалённые задачи в CLAUDE.md, review.md, research/README.md и в задаче про confidence-гейт
57 lines
4.9 KiB
Markdown
57 lines
4.9 KiB
Markdown
# ✨ Узаконить confidence-гейт авто-раскладки в спеке и сделать его выключаемым (дефолт 0.7)
|
||
|
||
- **Тип:** feature
|
||
- **Категория:** Ядро продукта
|
||
- **Зачем:** Решено (B): гейт оставляем как доп. проверку на ревью — выключаемый порог, дефолт 0.85→0.7, записать в спеку
|
||
- **Теги:** goal:recognition-accuracy
|
||
|
||
Аудит спек↔код (2026-07-03) нашёл расхождение: спека recognition считает
|
||
`confidence` вспомогательным сигналом (условия авто — только матч в базе +
|
||
чистая валидация + согласованность), а код (`internal/recognize/validate.go:102`)
|
||
добавляет `confidence < threshold` (дефолт 0.85) четвёртым **блокирующим**
|
||
условием.
|
||
|
||
**Решение (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) и поправить значение в таблице «Настройки с
|
||
числовым значением» [docs/database.md](../../database.md) — дом числа там, и
|
||
при смене дефолта оно разъедется первым. Формулировки инварианта в
|
||
`CLAUDE.md` и ложноположительного в `docs/review.md` уже приведены к
|
||
«единственным гейтом не является» (канон 4, 2026-08-06) — переписывать их
|
||
задача не должна.
|
||
5. **Тесты:** `decide` с `threshold=0` (гейт выключен, авто при чистых 1–3);
|
||
confidence ниже/выше порога при выполненных 1–3.
|
||
6. Точное число порога откалибровать позже по рабочему потоку — сколько раздач
|
||
ушло в ревью и сколько из них пришлось поправить. Размеченный корпус, по
|
||
которому порог можно было бы подобрать заранее, решено не собирать
|
||
(`../REJECTED.md`, 2026-08-06), так что первое значение остаётся оценкой.
|
||
|
||
Оформить как OpenSpec-change (дельта `recognition` + правки
|
||
`validate.go`/`recognize.go`/`config`).
|
||
|
||
Связано: openspec/specs/recognition, ADR-2026-06-13-auto-link-requires-db-match,
|
||
пакет recognize.
|