Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
14 KiB
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 дней эксплуатации обнаружилось:
- Карта §12.2 не покрывает всё. Новые классы задач (security, marketing, multi-step planning без явного «эпик», analysis-only без коды) не имели чётких маппингов. Заказчик регулярно правил карту вручную.
- Рационализация пропуска. Несмотря на §12.4 «hard-rule статус — рационализация нарушение», в episodes-2026-05 (brain-retro #2 + #3) накопились случаи «direct без skill» с post-hoc обоснованием «эта задача проще» — поведение, которое §12 формально запрещал, но не enforce'ил механически.
- Skill-discipline хуки (
skill-marker.py+skill-check.py) работали как «speed-bump», а не как блокирующая защита — bypass через Bash был тривиален (см. memoryfeedback_superpowers_hard_rule). - Continuation case (D1). «Делай», «дальше», «продолжай» — короткие коротыши без анкера, формально fail на §12 (нет skill в карте) → классифицировались как
direct→ накапливали missed-activations. brain-retro #3 (23.05.2026) показал 7/15 missed-activations были такого рода после очистки шума маппинга (memoryfeedback_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. Ключевые тезисы:
- Default-deny на non-conversation задачах. Все задачи, кроме явных
conversation/micro/manual_override, должны быть покрыты skill или цепочкой изdocs/registry/nodes.yaml. Direct-исполнение допустимо только в 5 exempt-классах §17.2. - Classifier как источник exempt-decisions. Не закрытый список пар, а классификатор (Sonnet 4.6 + памятка, активируется Phase 2 Task 10) определяет class задачи; exempt =
conversation∪micro∪manual_override∪ acknowledgment/cancellation prefilter ∪ escape-hatch. - Continuation НЕ exempt (D1). «Да», «делай», «дальше» наследуют classification предыдущего хода; если та была non-conversation — §17 применяется как обычно.
NON_BLOCKING_TASK_TYPESв router-tool-gate содержит толькоconversation/micro/manual_override; continuation там нет, и это намеренно. - Enforcement через
tools/router-tool-gate.mjs. Mode =~/.claude/runtime/router-gate-mode.json∈{off, warn-only, enforce}. Default Phase 2 bootstrap —warn-only. - §17 — не hard-rule под §9. Заказчик может временно перевести mode →
off(runtime-flag). Но рационализация типа «эта задача проще» не работает: гейт оперирует на classifier output, не на оценке Claude. - Связь с §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(commit9d4a30c3). - 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
- 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). - Mode hot-reload. Каждый tool-вызов перечитывает
~/.claude/runtime/router-gate-mode.json. Заказчик может перевестиoff↔warn-only↔enforceбез рестарта сессии. - 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). - brain-retro discipline. Раз в 1-2 недели
/brain-retroskill читает episodes за период, считает sanity-check coverage (disciplinePercentByClassification,routerStepReached,boundariesAppliedRateизtools/discipline-metrics.mjs), сравнивает с предыдущим периодом. Расхождение > порога → сигнал в notes. - 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:
# 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.mdTask 5.