diff --git a/docs/observer/STATUS.md b/docs/observer/STATUS.md index e09b2cf8..8d682c08 100644 --- a/docs/observer/STATUS.md +++ b/docs/observer/STATUS.md @@ -1,6 +1,6 @@ # Brain Status (auto-generated) -Last updated: 2026-05-28T07:19:07.640Z +Last updated: 2026-05-28T07:28:29.669Z | Контролёр | Состояние | Детали | |---|---|---| @@ -8,13 +8,13 @@ Last updated: 2026-05-28T07:19:07.640Z | 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 | ⚠️ | 758 episode(s) this month · Stop-hook + post-commit OK · 20 missed activation(s) — see /brain-retro | +| C5 Observer-coverage | ⚠️ | 759 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: 758 episodes this month, 0 observer_error markers, 164 PII matches before filter -- Legacy v1 episodes (not in factor analysis): 619 +- Observer evidence: 759 episodes this month, 0 observer_error markers, 165 PII matches before filter +- Legacy v1 episodes (not in factor analysis): 620 - Last /brain-retro: 0 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 | 7 | 0.0% | 0.0% | | refactor | 1 | 0.0% | 0.0% | -Router step distribution: 1: 328, 2: 278, 3: 77, 5: 67 +Router step distribution: 1: 328, 2: 279, 3: 77, 5: 67 -Boundaries applied (ADR / границы): 90 of 750 эпизодов (12.0%). +Boundaries applied (ADR / границы): 90 of 751 эпизодов (12.0%). ## Активные многоэтапные проекты @@ -51,10 +51,10 @@ Boundaries applied (ADR / границы): 90 of 750 эпизодов (12.0%). | Компонент | Токены (in/out) | USD | |---|---|---| -| Classifier (Sonnet 4.6) | 9430/88590 | $1.36 | +| Classifier (Sonnet 4.6) | 9471/89293 | $1.37 | | Self-assessment (Sonnet 4.6) | 0/0 | $0.00 | | Reviewer (Opus 4.7 + fallback) | 0/0 | $0.00 | -| **Итого** | | **$1.36** | +| **Итого** | | **$1.37** | ## Аномалии классификатора @@ -67,7 +67,7 @@ Episodes since last run: 0 / threshold: 10 ## Reviewer: субагент vs fallback -0 эпизодов проверено из 758. +0 эпизодов проверено из 759. ## Reviewer findings @@ -109,7 +109,7 @@ Episodes since last run: 0 / threshold: 10 | Фраза | За всё время | За сегодня | |---|---|---| -| `recovery` | 639 | 366 ⚠️ | +| `recovery` | 700 | 427 ⚠️ | | `ремонт инфраструктуры` | 185 | 26 ⚠️ | | `без скилов` | 103 | 45 ⚠️ | | `срочно` | 93 | 11 ⚠️ | @@ -117,7 +117,7 @@ Episodes since last run: 0 / threshold: 10 | `direct ok` | 6 | 0 | | `быстрый коммит` | 3 | 0 | -## C6: System Health +## System Health Долго работающих процессов нет (порог CPU > 1ч). diff --git a/tools/status-md-generator.test.mjs b/tools/status-md-generator.test.mjs index db673291..065c2989 100644 --- a/tools/status-md-generator.test.mjs +++ b/tools/status-md-generator.test.mjs @@ -17,21 +17,21 @@ describe('renderStatus — systemHealthBlock (brain-retro #9 candidate 5)', () = }; it('renders systemHealthBlock when provided as string', () => { - const block = '## C6: System Health\n\nТоп-3 процессов с CPU > 1ч:\n\n| PID | Имя | CPU-время | Возраст |\n|---|---|---|---|\n| 6444 | python | 7.07ч | 13.6ч |\n\n⚠️ Проверь, не «осиротевшие» ли это процессы.\n'; + const block = '## System Health\n\nТоп-3 процессов с CPU > 1ч:\n\n| PID | Имя | CPU-время | Возраст |\n|---|---|---|---|\n| 6444 | python | 7.07ч | 13.6ч |\n\n⚠️ Проверь, не «осиротевшие» ли это процессы.\n'; const md = renderStatus({ ...minInputs, systemHealthBlock: block }); - expect(md).toContain('## C6: System Health'); + expect(md).toContain('## System Health'); expect(md).toContain('6444'); expect(md).toContain('python'); }); it('omits systemHealthBlock when absent (backward compat)', () => { const md = renderStatus(minInputs); - // Should not contain C6 System Health section - expect(md).not.toContain('## C6: System Health'); + // Should not contain System Health section + expect(md).not.toContain('## System Health'); }); it('renders "Долго работающих процессов нет" variant correctly', () => { - const block = '## C6: System Health\n\nДолго работающих процессов нет (порог CPU > 1ч).\n'; + const block = '## System Health\n\nДолго работающих процессов нет (порог CPU > 1ч).\n'; const md = renderStatus({ ...minInputs, systemHealthBlock: block }); expect(md).toContain('Долго работающих процессов нет'); }); diff --git a/tools/system-health.mjs b/tools/system-health.mjs index 04be847f..f59c9336 100644 --- a/tools/system-health.mjs +++ b/tools/system-health.mjs @@ -47,12 +47,12 @@ export function computeSystemHealthBlock(procs) { .sort((a, b) => b.cpuSeconds - a.cpuSeconds) .slice(0, 3); if (heavy.length === 0) { - return `## C6: System Health\n\nДолго работающих процессов нет (порог CPU > 1ч).\n`; + return `## System Health\n\nДолго работающих процессов нет (порог CPU > 1ч).\n`; } const rows = heavy.map(p => { const hours = (p.cpuSeconds / 3600).toFixed(2); const ageHours = (p.ageMinutes / 60).toFixed(1); return `| ${p.pid} | ${p.name} | ${hours}ч | ${ageHours}ч |`; }).join('\n'); - return `## C6: System Health\n\nТоп-3 процессов с CPU > 1ч:\n\n| PID | Имя | CPU-время | Возраст |\n|---|---|---|---|\n${rows}\n\n⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.\n`; + return `## System Health\n\nТоп-3 процессов с CPU > 1ч:\n\n| PID | Имя | CPU-время | Возраст |\n|---|---|---|---|\n${rows}\n\n⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.\n`; } diff --git a/tools/system-health.test.mjs b/tools/system-health.test.mjs index 59726615..9bf86862 100644 --- a/tools/system-health.test.mjs +++ b/tools/system-health.test.mjs @@ -74,9 +74,9 @@ describe('computeSystemHealthBlock', () => { ]; const block = computeSystemHealthBlock(procs); // Should contain top 3 by CPU: b(8000), d(6000), c(5000) - expect(block).toContain('2'); // pid 2 = b - expect(block).toContain('4'); // pid 4 = d - expect(block).toContain('3'); // pid 3 = c + expect(block).toContain('| 2 |'); // pid 2 = b + expect(block).toContain('| 4 |'); // pid 4 = d + expect(block).toContain('| 3 |'); // pid 3 = c // pid 1 (lowest CPU among heavy) should be excluded expect(block).not.toContain('| 1 |'); });