Code review noted that the new section heading ## C6: System Health collided
with the existing alert-table row | C6 Chain map sync | for controller C6.
Two things named C6 confuses readers and brain-retro analysis scripts.
Heading is now ## System Health (no prefix). Section position unchanged.
Also tightens weak toContain('2')-style assertions in system-health.test.mjs
to pipe-delimited '| 2 |' form -- prevents false-passes if sort order breaks.
Follow-up to 7314a926.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Brain-retro #5 surfaced a correlation: long sessions (≥50 turns) correlate
with discipline drift. Reviewer pass showed regulated rate dropped 19% →
4.5% during a long session.
This commit adds:
• computeSessionLengthBlock(episodes, opts?) — pure function that
groups today's (UTC) episodes by task_id, finds the MAX session_turn
per session, and surfaces sessions with ≥threshold turns (default 50)
in a markdown block.
• Wire-up in renderStatus + main CLI: new "## Длинные сессии" section
inserted between disciplineBlock/activeProjects and costBlock.
• 7 new unit tests (36/36 total green).
Behavior:
• No sessions today → ✅ "Ни одной сессии с >50 ходов".
• One+ flagged → ⚠️ table { session_id, max turn, regulated %, last episode ts }.
• Custom threshold via opts.threshold.
Per memory project_enforce_hard_rules.md: this is an indicator, not a hook;
no blocking, just observability. Owner can decide whether to restart when
regulated % drops in a long session.
Auto-generated блок с разбивкой % дисциплины по типам задач,
router-step distribution + suspicious-флаг, boundaries-applied rate.
Backward-compat: блок опускается, если discipline не передан.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes brain-retro 2026-05-20 #18 — episodes without schema_version=2
(legacy v1 era pre-2026-05-19T08:06) are now visible in STATUS.md
metrics. They're already filtered out of factor analysis by analyzer's
v1SkippedCount, but their existence was invisible to humans reading
STATUS — masking the bootstrap-epoch gap.
2 new vitest tests, 326/326 GREEN.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes brain-retro 2026-05-20 #10 — STATUS.md теперь сообщает, когда
последний раз был прочитан observer (через .read-counter.json
last_read_at). Помогает не забыть про ретро между sprint-кадансами.
3 new vitest tests, 304/304 GREEN.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes brain-retro 2026-05-20 #3 SIMPLIFIED — sanitizeWithCount in
pii-filter (counts matches per pattern) + persistent monthly counter
docs/observer/.pii-counters.json (bumped by Stop-hook on each episode
write) + status-md-generator reads real count (no more piiMatches: 0
hardcode).
PII patterns themselves NOT changed (F7 of parallel session already
extended to 13 patterns).
Counter is informational — write failure never blocks Stop-event.
5+1+1=7 new vitest tests, 256/256 GREEN.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Aggregates C1/C2/C3 outputs via execFileSync (Security Guidance #40
compliant — uses fixed args array, no shell injection surface) +
observer episode count. Behavioral rule embedded in metric copy.
Per ADR-011 + spec §6.4.
3 Vitest tests GREEN (31/31 total).
Smoke run rebuilds STATUS.md with current state:
- C1 🔴 (l1-watcher surfaces 9 plugins in settings not formalized
in Tooling Прил. Н by exact name@source — see commit 4382de3)
- C2 🔴 (cross-ref-checker surfaces noise from 'наследие' headers
— see commit a780959 DWC)
- C3 ✅ (0 weeks since last read)
- C4 ✅ (this file)
Both 🔴 states surface known pre-existing drift (not regressions).
C5 lefthook wiring will handle WARN-vs-FAIL semantics.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>