Files
jellybit/docs/tasks/items/auto-link-confidence-gate.md
T
av f42db0a275 sprint: набран спринт 2026-08-06 под цель распознавания
- в наборе шесть задач: локаль TVDB и confidence-гейт под цель, плюс баги и
  техдолг помимо неё
- взятым дописаны разделы своего типа: «Затрагивает», критерии с оракулами,
  воспроизведение
- решены развилки: оба расхождения код↔спека правятся спекой (и потому стали
  chore), опрос qBittorrent тормозится бэкоффом до минутного потолка
2026-08-06 13:57:33 +03:00

6.7 KiB
Raw Blame History

Узаконить 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 — дом числа там, и при смене дефолта оно разъедется первым. Формулировки инварианта в CLAUDE.md и ложноположительного в docs/review.md уже приведены к «единственным гейтом не является» (канон 4, 2026-08-06) — переписывать их задача не должна.
  5. Тесты: decide с threshold=0 (гейт выключен, авто при чистых 1–3); confidence ниже/выше порога при выполненных 1–3.
  6. Точное число порога откалибровать позже по рабочему потоку — сколько раздач ушло в ревью и сколько из них пришлось поправить. Размеченный корпус, по которому порог можно было бы подобрать заранее, решено не собирать (../REJECTED.md, 2026-08-06), так что первое значение остаётся оценкой.

Затрагивает

  • internal/recognizedecide/validate.go (четвёртое условие) и recognize.go (пере-применение дефолта, из-за которого 0 не выключает гейт);
  • секция [recognition] конфига, config.example.toml и значение по умолчанию в internal/config;
  • openspec/specs/recognition/spec.md — требование «Модель уверенности и решение auto/review»;
  • docs/database.md (дом числа) и docs/conventions/config.md (описание ключа).

Критерии приёмки

  • auto_confidence_threshold = 0 выключает гейт: при чистых условиях 1–3 раздача уходит в авто независимо от confidence (оракул: тест decide с нулевым порогом).
  • При confidence ниже порога и выполненных условиях 1–3 раздача уходит в review (оракул: табличный тест на границе порога — ниже, равно, выше).
  • Умолчание равно 0.7 в одном месте — загрузке конфига; recognize.go своего дефолта не применяет (оракул: тест, что пустой конфиг даёт 0.7, плюс отсутствие defaultAutoThreshold в диффе).
  • Спека называет confidence четвёртым конфигурируемым блокирующим условием и несёт сценарий «матч чист, но уверенность ниже порога → review» (оракул: openspec validate --strict).

Оформить как OpenSpec-change (дельта recognition + правки validate.go/recognize.go/config).

Связано: openspec/specs/recognition, ADR-2026-06-13-auto-link-requires-db-match, пакет recognize.