diff --git a/docs/observer/STATUS.md b/docs/observer/STATUS.md index 7cbfe8a6..8ca76bab 100644 --- a/docs/observer/STATUS.md +++ b/docs/observer/STATUS.md @@ -1,6 +1,6 @@ # Brain Status (auto-generated) -Last updated: 2026-05-23T10:10:13.940Z +Last updated: 2026-05-23T10:16:44.994Z | Контролёр | Состояние | Детали | |---|---|---| @@ -8,12 +8,12 @@ Last updated: 2026-05-23T10:10:13.940Z | 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 | ⚠️ | 142 episode(s) this month · Stop-hook + post-commit OK · 21 missed activation(s) — see /brain-retro | +| C5 Observer-coverage | ⚠️ | 143 episode(s) this month · Stop-hook + post-commit OK · 21 missed activation(s) — see /brain-retro | | C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync | ## Метрики (информационные, не алерты) -- Observer evidence: 142 episodes this month, 0 observer_error markers, 64 PII matches before filter +- Observer evidence: 143 episodes this month, 0 observer_error markers, 64 PII matches before filter - Legacy v1 episodes (not in factor analysis): 5 - Last /brain-retro: 0 day(s) ago - Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 21. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). diff --git a/tools/observer-hook-resolver.mjs b/tools/observer-hook-resolver.mjs index fa1cbcb9..83499456 100644 --- a/tools/observer-hook-resolver.mjs +++ b/tools/observer-hook-resolver.mjs @@ -13,7 +13,7 @@ import { createHash } from 'node:crypto'; -const TOOL_SCRIPT_RE = /(?:^|[\s"'/])(tools\/[\w-]+\.(?:mjs|py|sh))/; +const TOOL_SCRIPT_RE = /(?:^|[\s"'/\\])(tools[\/\\][\w-]+\.(?:mjs|py|sh))/; const NPX_RE = /(?:^|[\s"'])npx\s+(?:-y\s+)?([\w@/.-]+)/; /** @@ -33,7 +33,7 @@ function normalizeCommand(s) { export function extractScriptName(command) { const cmd = String(command || ''); const toolMatch = cmd.match(TOOL_SCRIPT_RE); - if (toolMatch) return toolMatch[1]; + if (toolMatch) return toolMatch[1].replace(/\\/g, '/'); const npxMatch = cmd.match(NPX_RE); if (npxMatch) return npxMatch[1]; const sha = createHash('sha256').update(normalizeCommand(cmd)).digest('hex').slice(0, 16); diff --git a/tools/observer-hook-resolver.test.mjs b/tools/observer-hook-resolver.test.mjs index 4a8d6a4d..f9cdb93f 100644 --- a/tools/observer-hook-resolver.test.mjs +++ b/tools/observer-hook-resolver.test.mjs @@ -31,6 +31,14 @@ describe('extractScriptName', () => { const b = extractScriptName('node -e "process.exit(1);"'); expect(a).not.toBe(b); }); + + it('extracts tools/X.mjs from Windows backslash path', () => { + expect(extractScriptName('node tools\\observer-stop-hook.mjs')).toBe('tools/observer-stop-hook.mjs'); + }); + + it('extracts tools/X.mjs from full Windows abs path with backslashes', () => { + expect(extractScriptName('node C:\\path\\tools\\foo.mjs')).toBe('tools/foo.mjs'); + }); }); describe('buildHookMap', () => {