RFC: What should the data-generation pipeline be — shaped by its consumers and validation? #409
Replies: 1 comment
|
Builder-side context, as requested — answers to your four questions plus two factual refinements. Overall: the diagnosis is right, Phase 1 is the correct keystone, and today's build day supplied fresh evidence for it. One correction to the incident list: Q1 — gate the pointer? Yes, unambiguously. Two pieces of evidence from this weekend that enforcement-at-the-door works when it exists: (a) the #406 staged builder's code-identity lock refused to resume a checkpoint chain across a code change twice today — mildly annoying, correct both times; (b) the child-support signal gate stopped the first full-scale Build M base this afternoon on a 0.0047-vs-0.005 share and the investigation it forced surfaced a real modeling question (#417: the retired eCPS had silently drifted payer prevalence 3–4.5× above its survey source). Gates that block produce investigations; telemetry that observes produces backfills. And note the counter-evidence for the current design: I bypassed the whole publish driver with a direct API write for buildl — legitimately, for a non-default artifact — which proves the door is open to anyone. Q2 — invert the default namespace? Yes, and the infrastructure now exists: Q3 — reform-validation as a hard gate? As a candidate-phase gate, yes — with the probe set versioned inside the contract, so "complete" is falsifiable. The reform-validation battery only means something relative to a declared probe list (which reforms, which oracle scores, in/out-of-sample split). If the contract pins Q4 — minimal contract + ledger hash? Refinement: the ledger linkage is more recorded than "currently unrecorded" — since the parity stack (#404/#405), the certified contract carries Sequencing endorsement: Phase 1 → #398 role classes → Phase 2, and hold Phase 3 until the probe-set versioning lands. Also +1 to naming — happy to bikepaint post-launch; the build letters were checkpoint labels that escaped into production vocabulary, which is itself an argument for your pipeline. 🤖 Generated with Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Why this discussion
Over the last week several releases (
buildi/buildj=sparse-rmloss100calibration sweeps,buildl=acs-localmultispine) shipped to productionlatestwithout staging telemetry, withoutreform_validation.json, and without a Slack alert. Each was patched downstream (consumer-side reform-validation backfill, bypass-proof alert in #407, a dashboard redeploy). That's three symptoms of one structural cause, so before adding more patches I want to agree on what the pipeline should be — designed backwards from what consumes the data and how we validate it.Start from the consumers
The pipeline exists to serve four consumers. Each implies a specific validation — validation isn't a generic checklist, it's "what would break this consumer if the data were wrong."
Validation is already defense-in-depth — it just isn't enforced
gate_summary) — cheap/fast — microsim sanity (convergence, PUMA ladder, mass conservation)The stack is good. The problem is that none of these gate promotion.
The one structural flaw
So the easy path is the unsafe path: a calibration sweep or a geography experiment can be built bare and promoted to
latestwith a manual pointer write, and nothing refuses it. The microsim, reform scoring, and dashboard all immediately consume it. We then patch symptoms downstream instead of closing the hole.Proposal: invert the default
Experiments should be the cheap default; production should be opt-in and gated. You should have to earn
latest, and you should be able to run a hundred sweeps a week without thinking about safeguards because they can't reach production anyway.Phase 1 — the promotion gate (keystone, do first)
Make
latest.jsonmovable only throughpublish_release --promote, which refuses unless the release satisfies the full contract: gates pass +reform_validation.jsoncomplete (out_of_sample_simulated=true) + staging telemetry present. We already have this instinct —publish_clirefuses incomplete reform-validation today. Generalize that one refusal into "the contract is the only door tolatest." Small change to code we own; ends the bare-release class immediately.Phase 2 — make experiments cheap and separate
Builder defaults output to a
runs/namespace (or the staging repo) that never toucheslatest. Sweeps/geography land there bare by design. Production requires an explicit--promote→ triggers the Phase 1 gate. Now the default is safe and experimentation is unconstrained. This is directly adjacent to #398 (release contract needs dataset-role classes — national-default vs local-area artifacts).Phase 3 — reform-validation as a candidate-phase gate (only when it hurts)
Move the slow out-of-sample validation into the candidate phase, run async, and have
--promotewait on it. This retires the consumer-side backfill net. Don't build until Phases 1–2 are stable.What I would not build
Experimental builds as first-class tracked artifacts with their own dashboard view — most machinery, least risk reduction. Revisit only if the research/geography workflow grows into a product.
The backbone: a versioned contract
One declared, schema-versioned set of
{H5 + JSON files}that every promoted release must satisfy, with contents derived from consumers:calibration_diagnostics+ reform-validation reproduces known scoresThe dashboard consumes the contract; the microsim consumes the H5; the gate enforces the contract once, at the door.
Related work
publish_release)Questions for the team
latestshould be reachable only through a contract-checking gate (Phase 1)?latestnamespace (invert the polarity), or keep explicit opt-out?Filed to frame the design before adding more per-symptom patches. Happy to turn Phase 1 into a PR against the standard flow if there's agreement.
All reactions