Facade retirement

Deleting signal_measurement, one home per metric.

Stream: facade-retirement · closed 2026-07-01

The problem

  • validation/signal_measurement.py: a DEPRECATED facade duplicating ownership.
  • MEASUREMENT.md's own copy-paste block already ImportErrors — 10 names, 7 unresolved.
  • Two owners disagreed; every caller needed exactly ONE true home.

The fix

  • Deleted the facade + 22 orphaned scripts, atomically (261add7).
  • Every metric routed to one home: data_analyzer.py or statistics.py.
  • Parity invariant held throughout: facade.X == home.X to ≤1e-12.

What we learned — architecture

  • data_analyzer imports statistics one-way — some wrappers can't move there (circular import).
  • Promoting a source-level name risks shadowing an existing array-level one.
  • ensemble_dispersion / event_effect_size import from statistics directly, never data_analyzer.

What we learned — test discipline

  • validation/legacy/ is pytest-collected: one stray facade import reddens the whole suite.
  • So the facade delete and the legacy purge had to land in ONE atomic commit (P5).
  • A s_min_J red mid-stream was cross-tree contamination from a parallel repo-consolidation agent, not a regression.

What comes next

  • No blockers — state: done, P0–P7 all ticked.
  • Unconfirmed: does the s_min_J cross-tree red clear now the repos are merged?
  • Non-blocking: promote any purged diagnostic back to keeper? Default stayed purge.

Side effects

  • Fixed a live ghost beyond scope: divergence_seriesdivergence_array in guidance.
  • 8 guidance surfaces repointed off the dead facade (MEASUREMENT.md, INSIGHTS.md, 2 skills, a YAML comment, more).
  • Landed alongside unrelated peer-agent infra: AGENT_COMMS.md, the planning-with-files coordination block.

New terminology

No new terms coined or pinned this stream.

cliffs_delta and project_onto_polyline are code-identifier renames onto pre-existing implementations — not independently sourced in notes/terminology.md, so they get no slide.