Files
brain/docs/adr/ADR-016-section17-universal-skill-coverage.md
T

108 lines
14 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.
# ADR-016: §17 Universal skill-coverage — заменяет §12
**Status:** Accepted
**Date:** 2026-05-25
**Контекст:** LLM-first router overhaul (Phase 1), spec `docs/superpowers/specs/2026-05-24-llm-first-router-overhaul-design.md` v2.3, plan `docs/superpowers/plans/2026-05-25-llm-first-router-overhaul.md` v1.2 Task 5.
## Context
§12 «Superpowers — hard rule (инвокация skills первой)» (введено 09.05.2026 на явный запрос заказчика) исходило из ограниченного списка из 14 пар «задача → skill» (§12.2 map). За 16 дней эксплуатации обнаружилось:
1. **Карта §12.2 не покрывает всё.** Новые классы задач (security, marketing, multi-step planning без явного «эпик», analysis-only без коды) не имели чётких маппингов. Заказчик регулярно правил карту вручную.
2. **Рационализация пропуска.** Несмотря на §12.4 «hard-rule статус — рационализация нарушение», в episodes-2026-05 (brain-retro #2 + #3) накопились случаи «direct без skill» с post-hoc обоснованием «эта задача проще» — поведение, которое §12 формально запрещал, но не enforce'ил механически.
3. **Skill-discipline хуки** (`skill-marker.py` + `skill-check.py`) работали как «speed-bump», а не как блокирующая защита — bypass через Bash был тривиален (см. memory `feedback_superpowers_hard_rule`).
4. **Continuation case (D1).** «Делай», «дальше», «продолжай» — короткие коротыши без анкера, формально fail на §12 (нет skill в карте) → классифицировались как `direct` → накапливали missed-activations. brain-retro #3 (23.05.2026) показал 7/15 missed-activations были такого рода после очистки шума маппинга (memory `feedback_feature_via_writing_plans`).
Brain governance (ADR-011) уже ввёл наблюдателя + 5 контролёров C1-C5 + registry `docs/registry/nodes.yaml` как single source of truth. Inside Phase A/B/C наблюдатель пишет episodes с classifier output (`task_classification`, `node_chosen`, `triggers_matched`, etc) — у нас есть **данные** о реальных пропусках.
LLM-first router overhaul (spec v2.3, plan v1.2) предлагает **universal skill-coverage** как замену §12: вместо закрытого списка задача→skill, classifier (Sonnet 4.6 + памятка) на каждом ходе решает class задачи (`conversation` / `micro` / `manual_override` / `feature` / `bugfix` / ...) и enforcement-гейт блокирует direct на non-exempt классах. Closed list (§12.2) → open universe via classifier.
## Decision
**§12 «Superpowers hard rule» архивируется.** Текст переносится в `docs/archive/llm-bootstrap-2026-05/pravila-12/Pravila_section_12.md` (выполнено Phase 1 Task 4, commit `bca63fc6`).
**§17 «Universal skill-coverage rule» добавляется** (Phase 1 Task 5, this commit). Полная формулировка — Pravila §17. Ключевые тезисы:
1. **Default-deny на non-conversation задачах.** Все задачи, кроме явных `conversation` / `micro` / `manual_override`, должны быть покрыты skill или цепочкой из `docs/registry/nodes.yaml`. Direct-исполнение допустимо только в 5 exempt-классах §17.2.
2. **Classifier как источник exempt-decisions.** Не закрытый список пар, а классификатор (Sonnet 4.6 + памятка, активируется Phase 2 Task 10) определяет class задачи; exempt = `conversation` `micro` `manual_override` acknowledgment/cancellation prefilter escape-hatch.
3. **Continuation НЕ exempt (D1).** «Да», «делай», «дальше» наследуют classification предыдущего хода; если та была non-conversation — §17 применяется как обычно. `NON_BLOCKING_TASK_TYPES` в router-tool-gate содержит только `conversation` / `micro` / `manual_override`; continuation там нет, и это намеренно.
4. **Enforcement через `tools/router-tool-gate.mjs`.** Mode = `~/.claude/runtime/router-gate-mode.json``{off, warn-only, enforce}`. Default Phase 2 bootstrap — `warn-only`.
5. **§17 — не hard-rule под §9.** Заказчик может временно перевести mode → `off` (runtime-flag). Но рационализация типа «эта задача проще» не работает: гейт оперирует на classifier output, не на оценке Claude.
6. **Связь с §16.4.** Missed-activation в §16.4 = симметричный отчёт о пропусках §17. Surface в STATUS.md C5 + `/brain-retro`, не блокирует.
## Consequences
### Положительные
- **Universal coverage.** Любая новая категория задач (security, marketing, audit, etc.) автоматически покрывается классификатором без правки списка §12.2.
- **Continuation case закрыт.** D1 (наследование classification на коротких коротышах) явно описан и enforce'ится одинаково с явной non-conversation задачей.
- **Механический enforcement.** Router-tool-gate работает на classifier output + hard-coded exempt list; рационализация Claude через переформулировку не работает — гейт не читает текст хода.
- **Откатываемость.** 9-флаговая система (см. plan §10) позволяет выключить любой компонент независимо (`router-gate-mode → off`, `router-classifier-mode → regex-fallback`, etc.). Полный откат через `tools/test-rollback.mjs --execute` + `git reset --hard brain-pre-llm-bootstrap` (commit `9d4a30c3`).
- **Evidence loop.** Каждый ход пишет `classifier_output` в episode JSONL; brain-retro раз в 1-2 недели разбирает paterns, опционально дистиллирует regex-правила (Phase 4 через ~6 месяцев).
### Отрицательные / риски
- **Стоимость классификатора.** Sonnet 4.6 на каждом ходе — оценка $320-1370/мес на bootstrap (spec §10). Без daily cap, только monitoring через STATUS.md. Принято осознанно как «плата за качество данных» (заказчик 2026-05-25).
- **Период несогласованности.** Phase 2 bootstrap — `warn-only`; реальный enforce только после явного решения заказчика. До этого §17 действует только как обещание, поведенчески ничего не меняется.
- **Classifier-cost vs. человеческая оценка.** Возможны ложные классификации (например, рутинный bugfix → classifier label feature). Это нарушения, которые brain-retro подсветит в sanity-check, но они засоряют warn-only метрики.
- **Регрессия зависит от nodes.yaml gaps.** Если узел реестра не имеет `triggers[].classification` для данного class задачи — classifier выдаст `task_type=feature` но `recommended_node=null`. Router-tool-gate сегодня блокирует на `no_skill_found_block` (см. spec §4.4). При неполном реестре это false-block. Phase 2 Task 8 добавляет `capabilities:` на ~85 узлов, что снижает риск.
### Не влияет на
- §1-§11 Pravila — без изменений (§11 «Superpowers override §2.2/§4.5/§8.4» остаётся; экономия 0%/5%/25%/50%/75%/100% сохраняется).
- §13 (Frontend Design plugin paired stack) — без изменений.
- §14 (Ruflo Queen routing — dormant) — без изменений.
- §15 (Параллельные сессии) — без изменений.
- §16 (Brain governance — наблюдатель + контролёры C1-C6) — §16.4 minor update (cross-ref на nodes.yaml вместо JSON-карты, сделано Task 4); §16.5 hard-rule list update (§12 → §17, сделано Task 4).
- Schema БД, открытые вопросы, ADR-001…ADR-015 — не трогаются.
- Production code портала liderra.ru — overhaul затрагивает только Claude-meta-слой (router, observer), не application code.
## Boundaries
| Сценарий | §17 применяется? | Почему |
|---|---|---|
| `feature` task type + skill recommended | Да, требует skill | Default-deny на non-conversation |
| `feature` task + классификатор не нашёл подходящий skill | Да, блокирует на `no_skill_found_block` | Сигнал, что реестр неполон |
| `bugfix` task + явное «делай через TDD» в prompt | Нет, `manual_override` exempt | П.3 §17.2 |
| Continuation «делай» после `feature` predecessor | Да, наследует non-conversation classification | П.3 §17.3 (D1) |
| Continuation «спасибо» / «отлично» | Нет, `conversation` через prefilter | П.4 §17.2 |
| `<!-- routing: direct_justified=true reason="..." -->` в начале хода | Нет, escape-hatch | П.5 §17.2 |
| Q&A заказчика без действий над кодом | Нет, `conversation` | П.1 §17.2 |
| Опечатка в комментарии / переименование переменной | Нет, `micro` | П.2 §17.2 |
| `<!-- routing: skill="brainstorming" -->` без него | Да (но prefilter уже даёт `manual_override` → exempt) | П.3 §17.2 |
| ПДн handling, gitleaks pre-commit | НЕ override-ится — §5 + technical compensators выше §17 | §17.5 «замещает §12», но не §5 |
## Enforcement
1. **Hook chain.** `tools/router-tool-gate.mjs` подписан на `PreToolUse:Edit|Write|MultiEdit|Bash`. На каждый tool-вызов читает `~/.claude/runtime/router-state-<session>.json` (записан router-prehook на UserPromptSubmit), извлекает `classifier_output.task_type` + `recommended_node` + `skillInvokedThisTurn`. Применяет логику §17.4 (`shouldBlock`).
2. **Mode hot-reload.** Каждый tool-вызов перечитывает `~/.claude/runtime/router-gate-mode.json`. Заказчик может перевести `off``warn-only``enforce` без рестарта сессии.
3. **adr-judge.** При попытке Edit на нормативке (`Pravila_raboty_Claude_v1_1.md`, `docs/Plugin_stack_rules_v1.md`, `Tooling_v8_3.md`, `CLAUDE.md`) — adr-judge lefthook job pre-commit (job 9, см. `lefthook.yml`) проверяет, что новые правки не нарушают принятые ADR. ADR-016 декларирует «§17 заменяет §12»: попытка вернуть §12 в Pravila требует sup среды-ADR (опровергнуть/superseded).
4. **brain-retro discipline.** Раз в 1-2 недели `/brain-retro` skill читает episodes за период, считает sanity-check coverage (`disciplinePercentByClassification`, `routerStepReached`, `boundariesAppliedRate` из `tools/discipline-metrics.mjs`), сравнивает с предыдущим периодом. Расхождение > порога → сигнал в notes.
5. **STATUS.md C5.** `tools/observer-coverage-checker.mjs` (lefthook job 15, warn-only) считает missed-activations + observer registration; surface в `docs/observer/STATUS.md`.
## Rollback
Полный откат §17 → §12:
```bash
# 1. Restore user-level (settings.json with skill-marker/skill-check; runtime flags)
node tools/test-rollback.mjs --execute
# 2. Restore git-tracked (Pravila §12 + ADR-016 absent + router-tool-gate revert + lefthook + ...)
git reset --hard brain-pre-llm-bootstrap # tag at 9d4a30c3
# 3. Reinstall deps
npm install
```
ROLLBACK runbook: `docs/archive/llm-bootstrap-2026-05/ROLLBACK.md` (verified end-to-end in Phase 1 Task 1 smoke proof, commit `dc7fd579`).
## Cross-refs
- **Pravila §17** — текст правила (introduced this commit).
- **Pravila §16.4** — обновлено в Task 4 (commit `bca63fc6`) с cross-ref на nodes.yaml.
- **Pravila §12** — архивировано в Task 4 (`docs/archive/llm-bootstrap-2026-05/pravila-12/Pravila_section_12.md`).
- **ADR-011** brain-governance — §16 enforcement через 5 контролёров; ADR-016 опирается на observer evidence из ADR-011.
- **spec** `docs/superpowers/specs/2026-05-24-llm-first-router-overhaul-design.md` §6, §4.4.
- **plan** `docs/superpowers/plans/2026-05-25-llm-first-router-overhaul.md` Task 5.