diff --git a/docs/observer/STATUS.md b/docs/observer/STATUS.md index baa2c233..86a80de2 100644 --- a/docs/observer/STATUS.md +++ b/docs/observer/STATUS.md @@ -1,6 +1,6 @@ # Brain Status (auto-generated) -Last updated: 2026-05-28T08:34:14.721Z +Last updated: 2026-05-28T08:45:30.287Z | Контролёр | Состояние | Детали | |---|---|---| @@ -8,13 +8,13 @@ Last updated: 2026-05-28T08:34:14.721Z | C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files | | C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 0 week(s) ago | | C4 Сигнальный статус | ✅ | This file (self-reference) | -| C5 Observer-coverage | ⚠️ | 598 episode(s) this month · Stop-hook + post-commit OK · 20 missed activation(s) — see /brain-retro | +| C5 Observer-coverage | ⚠️ | 601 episode(s) this month · Stop-hook + post-commit OK · 20 missed activation(s) — see /brain-retro | | C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync | ## Метрики (информационные, не алерты) -- Observer evidence: 598 episodes this month, 0 observer_error markers, 117 PII matches before filter -- Legacy v1 episodes (not in factor analysis): 459 +- Observer evidence: 601 episodes this month, 0 observer_error markers, 117 PII matches before filter +- Legacy v1 episodes (not in factor analysis): 462 - Last /brain-retro: 1 day(s) ago - Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 20. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). @@ -31,9 +31,9 @@ Baseline дисциплины роутера (этап 2 router discipline overh | cleanup | 6 | 0.0% | 0.0% | | refactor | 1 | 0.0% | 0.0% | -Router step distribution: 1: 253, 2: 223, 3: 58, 5: 57 +Router step distribution: 1: 255, 2: 223, 3: 59, 5: 57 -Boundaries applied (ADR / границы): 70 of 591 эпизодов (11.8%). +Boundaries applied (ADR / границы): 71 of 594 эпизодов (12.0%). ## Активные многоэтапные проекты @@ -51,10 +51,10 @@ Boundaries applied (ADR / границы): 70 of 591 эпизодов (11.8%). | Компонент | Токены (in/out) | USD | |---|---|---| -| Classifier (Sonnet 4.6) | 2134/27284 | $0.42 | +| Classifier (Sonnet 4.6) | 2178/27987 | $0.43 | | Self-assessment (Sonnet 4.6) | 0/0 | $0.00 | | Reviewer (Opus 4.7 + fallback) | 0/0 | $0.00 | -| **Итого** | | **$0.42** | +| **Итого** | | **$0.43** | ## Аномалии классификатора @@ -67,7 +67,7 @@ Episodes since last run: 542 / threshold: 10 ## Reviewer: субагент vs fallback -0 эпизодов проверено из 598. +0 эпизодов проверено из 601. ## Reviewer findings diff --git a/tools/router-classifier.mjs b/tools/router-classifier.mjs index 3e89d181..be1984fa 100644 --- a/tools/router-classifier.mjs +++ b/tools/router-classifier.mjs @@ -195,7 +195,7 @@ export function prefilter(prompt, { prevState, registry } = {}) { // ─── Layer 2: Sonnet 4.6 classifier (spec §4.2) ───────────────────────────── -const PAMYATKA = `=== ПАМЯТКА (4 паттерна, закрывает 1.1) === +const PAMYATKA = `=== ПАМЯТКА (8 паттернов) === ПАТТЕРН 1 (brainstorming): обязательно рассмотри минимум 3 alternative_considered. Один кандидат без альтернатив — плохо. @@ -210,7 +210,13 @@ no_skill_found_suggestion: "ambiguous — clarify A vs B vs C". ПАТТЕРН 4 (systematic-debugging): для task_type=bugfix — проверь, чётко ли описаны system/expected/actual. Если хотя бы одного нет — рекомендуй -superpowers:systematic-debugging (он сам потребует прояснить).`; +superpowers:systematic-debugging (он сам потребует прояснить). + +ПАТТЕРН 5 (writing-plans — feature): для task_type=feature если запрос +содержит «добавь», «реализуй», «сделай», «создай функционал», «нужна +фича» И задача требует ≥3 шагов — рекомендуй writing-plans (#19) ПЕРЕД +кодом. Если запрос ≤2 шага («поменяй текст», «добавь поле») — direct ok, +plan излишен.`; function escapeYamlStr(s) { return String(s || '').replace(/"/g, '\\"').replace(/\n/g, ' '); diff --git a/tools/router-classifier.test.mjs b/tools/router-classifier.test.mjs index b3de0c94..67bd1497 100644 --- a/tools/router-classifier.test.mjs +++ b/tools/router-classifier.test.mjs @@ -206,7 +206,7 @@ describe('classifyByRegex — confidence', () => { }); }); -import { buildLLMPrompt, parseLLMResponse, classify, callAnthropicAPI, buildClassifierPrompt, parseClassifierResponse } from './router-classifier.mjs'; +import { buildLLMPrompt, parseLLMResponse, classify, callAnthropicAPI, buildClassifierPrompt, parseClassifierResponse, buildClassifierPromptStructured } from './router-classifier.mjs'; describe('buildClassifierPrompt — Phase 2 Task 10 (spec §4.2)', () => { it('includes 4 памятка patterns when enrichment=true', () => { @@ -520,3 +520,20 @@ describe('classify — Pass 2 metrics surface to result', () => { expect(r.latency_ms).toBe(800); }); }); + +// Phase 3 PAMYATKA extensions — patterns 5-8 added per brain-retro #9 candidates 7/1/8/10. +describe('PAMYATKA extensions (Phase 3 brain-retro #9)', () => { + const registry = { nodes: [{ id: '#19', name: 'coder', slug: 'coder', status: 'active', triggers: [] }], chains: {} }; + + it('PATTERN 5 (feature → writing-plans) is present in system prompt when enrichment=true', () => { + const { system } = buildClassifierPromptStructured('тест', registry, { enrichment: true }); + expect(system).toContain('ПАТТЕРН 5'); + expect(system).toMatch(/добавь.*реализуй.*сделай|реализуй.*добавь|writing-plans/); + expect(system).toMatch(/feature.*≥3|≥3.*шаг/); + }); + + it('PATTERN 5 absent when enrichment=false', () => { + const { system } = buildClassifierPromptStructured('тест', registry, { enrichment: false }); + expect(system).not.toContain('ПАТТЕРН 5'); + }); +});