feat: "Make It Actually Useful" sprint — observability + Phase 10
Pipeline observability:
- Retrieval harness runs nightly (Step E in batch-extract.sh)
- Pipeline summary persisted to project state after each run
(pipeline_last_run, pipeline_summary, retrieval_harness_result)
- Dashboard enhanced: interaction total + by_client, pipeline health
(last_run, hours_since, harness results, triage stats), dynamic
project list from registry
Phase 10 — reinforcement-based auto-promotion:
- auto_promote_reinforced(): candidates with reference_count >= 3 and
confidence >= 0.7 auto-graduate to active
- expire_stale_candidates(): candidates unreinforced for 14+ days
auto-rejected to prevent unbounded queue growth
- Both wired into nightly cron (Step B2)
- Batch script: scripts/auto_promote_reinforced.py (--dry-run support)
Knowledge seeding:
- scripts/seed_project_state.py: 26 curated Trusted Project State
entries across p04-gigabit, p05-interferometer, p06-polisher,
atomizer-v2, abb-space, atocore (decisions, requirements, facts,
contacts, milestones)
Tests: 299 → 303 (4 new Phase 10 tests)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>