Full codebase review (multi-agent, adversarially verified) surfaced several
documented-but-dead mechanisms and doc/code drift. Fixes:
- adam-observe: struggle signals now emit `active_skills`, so silent_drift's
primary cluster key AND §5b skill-attribution sub-clustering (+1 rubric
bonus) actually fire — both were silently dead (no struggle signal carried
the field).
- adam-cooldown: new `--compute` CLI deterministically derives
proposal_fingerprint. The exported computeProposalFingerprint() was never
called and the analyst was told to hand-compute a djb2 hash it cannot
reproduce. Spec now mandates a *stable* cluster id so fingerprints reproduce
across /reflect runs. Removed one dead normalization line.
- spec: reinforcement proposals excluded from A/B tracking — agents/adam.md
contradicted itself (:376 included, :476 excluded); SKILL.md aligned.
- adam-nudge: PENDING_CHECK_PATHS now mirrors the full install set
(adam-utils / adam-batch / adam-rollback were missing).
- adam-explain: synthesized clustering summary carries `regressions: 0`
(structural consistency with parsed summaries).
- docs: test-count drift (87/94 -> 126) and "350-line hook" (-> ~600) fixed;
adam-score header documents severity_sum/severity_by_type; adam-batch §4
reference corrected.
Tests: +12 assertions (114 -> 126), all green. New regression tests cover the
active_skills fix and --compute, plus boundary gaps the review flagged:
retry_loop/weak_agent thresholds, A/B exact +/-25% deltas, cooldown 30d
blacklist edge.
- New signal types in hooks/adam-observe.mjs:
- silent_drift: 5 consecutive read-only PostToolUse without an action tool
- error_after_recovery: same error fingerprint returns within 5 events of clean_recovery
- Severity-weighted scoring in adam/scripts/adam-score.mjs:
- SEVERITY_DIVISORS exported per struggle signal type
- Per-session severity_sum + severity_by_type added to JSON output
- Skill-attribution clustering in agents/adam.md:
- Sub-cluster struggle signals on active_skills[0]
- New struggle-driven skill_edit variant (always queues, never auto-applies)
- Rubric updates:
- +1 for cluster severity-sum >= 10, additional +1 for >= 32
- +1 for skill-attributed sub-cluster naming an existing skill
- silent_drift + error_after_recovery added to struggle signal list
- Window: silent_drift 14d, error_after_recovery 30d
- Tests: 94 passing (78-82 new)
Backward compat: entries without count default to severity 1. Existing
win-driven skill_edit gate untouched. No journal migration.