Rename interface contracts C1/C2/C3 → IC1/IC2/IC3 (ADR 0003 amendment 1) - #277
Rename interface contracts C1/C2/C3 → IC1/IC2/IC3 (ADR 0003 amendment 1)#277vahid-ahmadi wants to merge 5 commits into
Conversation
Naming only: no column, band, code mapping, or gate definition changes, and the numbering is preserved 1:1 so every prior reference maps by prefixing "I". A bare "C1" meant four different things in this repo: the gate_w1 fingerprints (gates.yaml fingerprints.c1/.c2), the SSA Trustees table II.C1, an RNG substream in household composition, and the employer-firm interface contracts. Only the last is repo-internal, pre-lock, and ours -- the fingerprints sit inside gate_w1, which is locked: true, so renaming those would cost a public amendment plus a fresh referee round. Timing is the point. IC3 (the employer gate block) is about to be written into gates.yaml, which already contains fingerprints.c1 and fingerprints.c2. A block named C3 locking next to them makes either rename cost exactly what the fingerprint row of that table already costs. Vahid flagged the collision on #192 before the referee round; this closes it while it is still free. Touches frozen ADR 0003 text, so it is a joint-PR change under the IC1/IC2 freeze rule -- procedurally, not because anything moved. Prior discussion keeps the old names; the ADR carries the mapping. Also corrects a stale claim in sipp_jobs: the module said "ADR 0003 is Proposed, not frozen" as the reason job_spells is IC1-preview. It is Accepted and IC1 is frozen; what is still preview-grade is the collapse's single-ref_year coverage, which is what the docstring now says. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Responds to the 2026-07-17 adversarial review (NOT RATIFIABLE AS DRAFTED). B2 stays open by design -- the block YAML is registered as a required pre-lock artifact and authored after #277 lands, so it is written once under final names rather than renamed after being refereed. B1 -- E1 and E6 stop gating. The review is right and the draft's reasoning on both was wrong in a way worth stating rather than quietly patching. E1: the coarsened BDS partition is not "something calibration does not target", it is an exact merge of the SUSB margins calibration consumes (1_9 = LT10; 10_19 + 20_99 = B10_49 + B50_99 with 20_99 whole). E6: the draft demoted the sector x size cells for being "close to the calibration margin" when those cells ARE the targets, and gated their job-weighted aggregate, where the miss terms average out. Both now report-only with floors retained as diagnostics, per the gates.yaml not_certified.stock_margins precedent. Section 10 re-issued exhaustively over E1-E12 with a per-gate disjointness basis, because a gate with no registered cells cannot be mutation-tested. Adds the ONLY quantifier binding every fitting stage -- microcalibrate, phase-1 hazard calibration, QRF tuning, any post-hoc alignment -- since #192's hazards calibrate to QWI/J2J and that consumer was unregistered, leaving the E2 and E11-margin holdouts unenforceable. Adds the corollary that a deterministic function of calibration targets IS a calibration target, which is the test B1 applied. Section 10.6 states B1's cost plainly: first-lock firm-side gating is E2, E7 and E11-margins only. That is thinner than #192 implied, and the two routes to restore it are registered rather than the weakness being disguised. B5 -- tolerance basis register (10A) covering all seven unbased tolerances plus the 10,000-job thin flag, with the binomial reference calculation shown and explicitly labelled an analogy rather than a derivation (LEHD cells are noise-infused population counts, not samples). E9-stay withdrawn rather than defended: its IQR floor is 0.0/0.0 like its median, so "IQR-only" was 100% a hand-set 0.02 gating alone. Section 4's register corrected -- it had listed only the median and presented the IQR as the non-degenerate escape. B4 -- ADR 0004 section 3 instantiated (9.0) at first-lock scope from Workstream A's offer: analysis unit, clustering, target reference population, observables X including the load-bearing seam indicator, weight construction, and both-versions publication. Numerics and the operative-version choice added to section 13 as items 16-17, registered before any candidate scores exist. B3 -- section 12.2 now requires #224 merged with its three adopted changes folded into ADR 0004's text, every evidence PR merged, and every artifact sha256-pinned at its merge commit. S1 -- k precedent restated honestly: the locked band is 1.8-8, not 4.2-8, with two locked ks below the proposed 4. k=4 survives as policy, and only partially -- the SIPP-side floors aggregate 5 seeds exactly as gate-1's did, so for E3/E4/E5/E8/E9 there is no aggregation distinction and k=4 is a bare policy choice. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
daphnehanse11
left a comment
There was a problem hiding this comment.
Contract-owner review — approve. Verified line-by-line across all 8 files: every change is a mechanical C→IC prefix substitution except the Amendment 1 block itself and the disclosed sipp_jobs.py docstring rationale, and the amendment's four-senses mapping table is accurate (I checked each claimed sense exists: the locked gate_w1 fingerprints.c1/c2, the SSA 4.C2/II.C1 external table labels, the nonfamily-bridge C3 RNG substream, and the contracts). Band definitions, columns, code mappings, and gate meanings are untouched; gates.yaml has a zero-line diff; and IC1|IC2|IC3 is collision-free on master. The chosen boundary — history preserved, live docs renamed — is right, and a full-repo grep confirms every surviving C1/C2/C3 is a legitimately-unrenamed sense. All four of our open PRs (#212/#235/#236/#274) merge-tree clean against this, and nothing of ours pins the docstrings you edited. Our own open-branch docs (the #236 manifest, the #212/#274 status strings) will pick up the IC names on our side at rebase/promotion — noted as our work, not this PR's.
Two should-fixes:
- The PR body's claimed fix is half-applied: the stale "IC1 spell schema of ADR 0003 (Proposed — this is a preview, not the frozen contract)" text was corrected in the module docstring but survives in the
job_spellsfunction docstring (src/populace_dynamics/data/sipp_jobs.py:506). Post-merge, the ADR says Accepted/frozen while this line says Proposed. docs/plans/employer-firm-plan.html:258-262,280-281uses C1/C2/C3 in the contract sense and is cited by the ADR's Context section as the operative plan — the one file on the wrong side of the boundary. Rename it or add it to the Amendment 1 table as a declared-historical document, so a referee following the ADR's own link doesn't meet unmapped old names. 🤖 Generated with Claude Code
Two should-fixes from Daphne's #277 review: 1. The stale "ADR 0003 (Proposed — this is a preview, not the frozen contract)" text was corrected in the module docstring but survived in `job_spells`'s own docstring. Post-merge the ADR says Accepted while that line said Proposed. It now mirrors the module wording: the schema is frozen; what is preview-grade is this collapse's single-`ref_year` coverage. 2. `docs/plans/employer-firm-plan.html` used C1/C2/C3 in the contract sense while being cited by the ADR's Context section as the operative split — the one file on the wrong side of the rename boundary. Renamed to IC1/IC2/IC3 (six lines; the SVG path data containing `C265,247` is untouched), and Amendment 1 now states the boundary explicitly: history keeps the old names, live documents are renamed, and the three unrenamed senses stay as the table gives them. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Two items from the #278 round-1 continuation: 1. The design document is renamed `c3_` -> `ic3_` and its bare C1/C2/C3 contract references become IC1/IC2/IC3 (ADR 0003 amendment 1, #277). This is the name #278's block YAML pins in `design:` and `design_filename_pin`: leaving the document at the old path would have left that block's draft/design agreement test permanently skipped rather than firing, so the filename is now a pinned decision on both sides rather than an assumption on one. 2. E3's floor rule is stated: 3 supplement years x 7 BLS age bands = 21 cells, each cell's threshold from its own year's floor, never pooled or worst-of'd. Daphne's review found the block YAML pinning 7 cells against this document's year x band definition, with a free `<year>` placeholder and no registered rule — a count pin hardening an ambiguity. Both sides now say 21 and per-year. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Both should-fixes applied at 1. The half-applied fix is finished — 2. Renamed rather than declared historical: Repo-wide grep confirms every surviving bare |
|
Current-head readiness audit at
The earlier two review residuals are resolved. The final source-docstring treatment is deliberate: production-source text covered by the published first-estimates replay seal remains historical rather than taking a cosmetic identity-breaking edit, and ADR 0003 now states that boundary and the one-to-one mapping explicitly. A broader local unit/artifact run reached 747 passes before one unrelated sealed-interpreter probe exceeded its fixed 60-second timeout despite printing No code change or new commit was needed. This does not presume or request approval. |
|
Master refresh addendum by
Verification:
This refresh does not merge or approve the PR. The frozen-contract cross-workstream approval requirement remains unchanged. |
Naming only. No column, band, code mapping, or gate-definition changes; numbering remains 1:1, so every prior contract reference maps by prefixing
I.The collision is four-way
gate_w1fingerprintsc1/c2gates.yamlnonfamily_bridgeThe interface contracts move because they are repository-internal and not yet locked as an employer gate. Amendment 1 in ADR 0003 records the mapping and preserves prior discussion as history.
Scope and sealed-source boundary
The current-head diff is intentionally five files:
Production-source docstrings sealed by the published first-estimates replay ceremony retain their historical C1/C2 wording. Cosmetic edits there would invalidate the sealed source identity. ADR 0003 states this boundary explicitly; the old wording maps one-to-one through Amendment 1 and is not operative contract text. New source text uses the IC names.
The IC3 draft artifact is
docs/design/ic3_employer_gate_block_draft.yamlon #278, which is stacked on this PR and therefore authored once under the final naming.Procedure and verification
This edits frozen ADR 0003 text, so it is a joint-PR change procedurally, even though no contract semantics move. The other workstream owner’s approval is the required joint sign-off; this PR does not presume or fabricate it.
Current-head checks:
#223, #224, #230, and #276 carry historical or in-flight references that should be synchronized to IC terminology during their own promotion/rebase passes after this naming root lands.