Rename interface contracts C1/C2/C3 → IC1/IC2/IC3 (ADR 0003 amendment 1) - #277
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. |
…age-bias reweighting (#224) * Document C3 precision-first linkage QC Co-Authored-By: Codex gpt-5.6-sol <noreply@openai.com> * Wire linkage QC into the employer battery Co-Authored-By: Codex gpt-5.6-sol <noreply@openai.com> * Rename the interface contracts C1/C2/C3 -> IC1/IC2/IC3 (ADR 0003 am. 1) 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> * Address review: finish the Proposed fix, rename the operative plan 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> * Fold linkage-QC adoption requirements into ADR 0004 * Keep naming amendment outside sealed production sources * Align linkage QC with IC naming and aggregate gate boundary --------- Co-authored-by: Codex gpt-5.6-sol <noreply@openai.com> Co-authored-by: Vahid Ahmadi <va.vahidahmadi@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…236) * Document C3 precision-first linkage QC Co-Authored-By: Codex gpt-5.6-sol <noreply@openai.com> * Wire linkage QC into the employer battery Co-Authored-By: Codex gpt-5.6-sol <noreply@openai.com> * Cross-wave job-ID consistency check: PASS (pre-lock artifact for #230 §6) The blocking check for the seam ruling (ADR 0004 referee item 7; #214 concept-delta 5). Verdict rule pre-registered in the script before the numbers were seen. Results: gross ID survival across the pu2022->pu2023 boundary 90.55%; re-key signature (same industry + class of worker + earnings within 20%) among seam separators-to- employment 17.5% vs a 2.4% within-wave coincidence baseline; scaled to all seam separations (38.1% are exits to nonemployment, which cannot be ID artifacts), the implied ID-artifact share of the 9.45% seam rate is <= 9.4% — under the 15% PASS bar. At least ~90% of the seam contrast is real seam-bunched separation; the #214 ruling's conditional check is satisfied. Implementation note, disclosed: the first run inner-joined the next-month jobs frame and silently dropped exits to nonemployment (printing a 6.06% conditioned seam rate and a PASS_WITH_CORRECTION_BAND verdict against the wrong denominator); the fix restores the documented design via the person-month universe and reproduces #214's 9.45%/1.77% exactly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Correct pre-registration label; report both scoring populations (review of #235) Addresses the blocking items in the #235 review. No measured number changed; no computation altered. - Withdraw the "pre-registered" claim. Rule and result land in one commit (87788eb) with no prior threshold on record, and a first run returned a different verdict before the estimator was corrected. Relabelled as disclosed re-analysis after a discovered defect. - Publish both scoring populations. E->E excess is 0.1512 (PASS_WITH_CORRECTION_BAND); scaled by the E->E share it is 0.0936 (PASS). Derivable from counts already in the artifact. Which is operative is left OPEN for the C3 referee round -- deliberately not chosen here, since choosing after seeing both sides of the bar is the defect this file documents. - Relabel gross_id_survival_share as an identity (1 - sep_rate), not a bound; drop the dead jobs_kept_share branch. - Record the 15/30 bands as having no derivation, pending ratification. - Register known biases: NaN-as-agreement in _rekey_match, unmotivated EARN_LOG_TOL, baseline composition mismatch, and the seam-denominator circularity in person presence. Artifact edited to match without re-running (SIPP microdata not on this machine); edit note records that every added value is recomputable. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * Address review: disclosed re-analysis, both populations, pinning All items from the changes-requested review: - Pre-registration language corrected everywhere to DISCLOSED RE-ANALYSIS with the full first-run history in the status field; the 15/30 bands and the operative scoring population are marked UNRATIFIED referee items. - Both populations reported with the verdict split visible: E->E 15.12% (PASS_WITH_CORRECTION_BAND) vs all-separations 9.36% (PASS); operative = REFEREE. - One-sided 95% uppers propagated from binomial SEs (17.65% / 10.92%) replace the bare point estimate. - gross_id_survival relabelled as a definitional identity with the dead branch removed. - Strict-NaN sensitivity variant added (missing fields = mismatch): excess 12.32% / 7.62% — the NaN-matching bias was real and its correction lowers the estimate. - Composition-mismatch and seam-denominator (person-ID linkage under test) caveats recorded. - Inputs sha256-pinned; artifact-tier test pins the disclosure language, both populations, the identity label, uncertainty, the strict variant, and the pins. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Referee S3 mechanics: recompute test, E->E-conditional definition, reader pin Per the #230 round-1 referee review: derived fields and both verdicts now recompute from the committed counts in an artifact-tier test (a hand-edited verdict fails); rekey_signature_definition states the E->E-conditional baseline the script actually computes (the per-all-seps share fields are marked descriptive); the sipp_jobs reader commit is pinned in the artifact alongside the input sha256s. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * E4/E5 minimal-audit manifest: registered design (ADR 0004, pre-lock) Workstream A's #230 section-12.2 pre-lock artifact: the complete ADR 0004 adjudication design for the first-lock scope (SIPP-internal employer attachment). Registers the frame (the #235 population), the two arms (accepted-assignment precision; truth-search recall over the re-key class), scoped stratification with seam oversampling, REFEREE slots for P_floor/P_design/alpha/power with a worked binomial example (0.95/0.99/0.05/0.80 -> n=124, c=122 per stratum before clustering and inflation), the blinded ID-masked coding protocol with conservative indeterminate handling registered before labels, provenance including the draw seed (20260717), and the two leakage freezes (the #235 signature parameters; no label backflow into readers or hazards). Sample draws only after the referee round fills the slots. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Pin the audit-result sequence per referee S4 (ADR 0004 section 1.5) Manifest pre-lock; lock may proceed with the audit designed but undrawn; results must exist before the first one-shot candidate run scoring any E4/E5 cell. Failed floor invalidates the cells (no candidate can pass) and the artifact publishes regardless — a designed stop is a graded, publishable outcome. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Rename the interface contracts C1/C2/C3 -> IC1/IC2/IC3 (ADR 0003 am. 1) 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> * Add the E5 run arm, no-revisit clause, frame-measured power, registered pooling Responds to the 2026-07-23 review round (items 1-4 of the 2026-07-19 review restated there): 1. E5 scope: new run arm (c) — unit is the maximal same-ID chain; every internal link and both terminal transitions are coded, so run-level error (false continuation / false break) is measured directly rather than composed from pair precision by an independence assumption. Scope mapping registered in section 1: arms (a)/(b) certify E4, arm (c) certifies E5. 2. No-revisit clause: all REFEREE slots, including the arm-(b) gates-or-reported decision, must be filled before the draw and may not be revised after any label exists. 3. Power: worker-resampling simulation from the actual frame, so deff is measured not assumed; arm-(b) target formula registered with the #235 prevalence priors; run-arm budget in link-codings. 4. Pooling rule registered now (fixed collapse order, never across the within-wave/seam axis), not deferred to the draw artifact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review: finish the Proposed fix, rename the operative plan 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> * Drop the stray .claude gitlinks my review commit added; ignore .claude My `633ad10` on this branch accidentally staged eleven `.claude/ worktrees/agent-*` entries — local Claude Code worktrees, committed as gitlinks (mode 160000) to commits that exist in no remote. They are unrelated to this PR and would land on master as broken submodule references that `git clone` cannot resolve. Removed from the index (the local directories are untouched) and `.claude/` added to `.gitignore` so the mistake cannot recur on any branch. My error, cleaned up on the branch it landed on rather than left for the artifact's author. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * Fold linkage-QC adoption requirements into ADR 0004 * Keep naming amendment outside sealed production sources * Align linkage QC with IC naming and aggregate gate boundary * Close pre-draw audit sizing channels --------- Co-authored-by: Max Ghenis <mghenis@gmail.com> Co-authored-by: Codex gpt-5.6-sol <noreply@openai.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Vahid Ahmadi <va.vahidahmadi@gmail.com>
…9) (#212) * DRAFT: SIPP job-spell noise floors for E4/E5 (pre-C3 anchor) Person-disjoint half-vs-half floors on the pu2023 job-month panel, the disability-floor convention (sha256 half-splits, seeds 0-4, per-cell |log rate ratio| mean/sd, WPFINWGT-weighted). E4: monthly same-employer retention by age band x sex (99.0% at 16-24 rising to 99.7% at 35-44; floors 0.001-0.002). E5: maximal same-employer run lengths (full-year share 46.7% at 16-24 to 86.7% at 45-64; floors 0.01-0.05). No thin cells. Explicitly DRAFT: no thresholds, C3 not locked, seam caveat recorded — the seam-vs-J2J reconciliation is a separate required artifact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * DRAFT: E3 tenure noise floors (with a heaping-robust ECDF variant) Completes the tenure side of the Workstream A floor battery: person- disjoint half-vs-half floors for the E3 moment (tenure P25/P50/P75 by BLS age band) on all three staged January supplements. Method finding worth the referee round's attention: reported tenure heaps hard on integers, so absolute quantile gaps between halves are EXACTLY zero in 36/63 cells (both halves' quantiles land on the same heap) — a degenerate basis for a quantile-error-vs-floor criterion. Each cell therefore also carries a weighted-ECDF max-gap floor (1.5-5.6% in 2024, tightest in the thick prime-age cells), which is smooth under heaping; C3 can choose between the formulations with both on the record. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Lint: unused loop variable (B007) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * DRAFT: E8/E9 SIPP floors — completing the Workstream A battery E8 (nonemployment spells, full-year persons, censoring-free draft restriction recorded): any-nonemployment share 41.5% (16-24) falling to 8.5% (45-54) with the retiree uptick at 65+; floors |log ratio| 0.05-0.14; no thin cells. E9 (earnings change by transition): monthly person-transition mix stay 97.7% / entry 1.01% / exit 0.94% / j2j 0.35%, consistent with the seam-reconciliation rates; j2j median log-change +0.226 (IQR 1.07, n=545, not thin). Second heaping finding for the referee round: within-job SIPP monthly earnings are mostly wave-constant, so the STAY median log-change heaps at exactly 0 and its floor is degenerate — same failure class as the tenure quantile heaping. E9-stay thresholds should be stated on the IQR (0.0656, floored at 0.004) or a distributional distance; caveat recorded in the artifact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Review fixes for #212: merge master, thin-flag unit honesty, reader revision in floor metadata - Merge origin/master (picks up the current sipp_jobs.py reader; no conflicts, PR-side additions preserved) - Record thin-flag units per artifact (E4 counts distinct persons, E5/E8 rows==persons, E9 transition pairs, E3 CPS records) in the builder docstrings, build() metadata, and hand-edited artifact metadata (staged microdata unavailable; measured floors untouched) - Record the reader commit in effect (sipp_jobs.py 75d30dd for the SIPP floors, cps_tenure.py 5c9e5e6 for the tenure floors) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review: scale gap recorded, 20-seed E8/E9, person-unit thin, on-data re-run, pins - deployment_scale_note in all three artifacts: the missing candidate-context floor is now a RECORDED gap with the root-n ratio (~0.71x at full source), for C3 to resolve (accept the conservatism, scale analytically, or require ctx floors at v1). - E8/E9 seeds 5 -> 20 (the E8 cells with sd > mean now have stable across-seed sds, e.g. 55-64 any-nonemp floor 0.090 +/- 0.054 vs 0.141 +/- unstable at 5 seeds); E9 thin flag now counts distinct persons per half, not transition pairs (all cells still clear 200, honestly this time). - E8 estimand symmetry note: candidates must apply the identical full-year-persons restriction. - All three artifacts REGENERATED on a machine with the staged microdata: tenure and E4/E5 measured values reproduce byte-identically (confirming the hand-edit disclosure changed no numbers, now retired); E8/E9 floors re-estimated under 20 seeds with point estimates unchanged. - Artifact-tier test pins values, statuses, the scale gap, both heaping caveats, and the estimand note. E11/E12 disposition (review's smaller item): Workstream B scope, recorded in #223's battery; noted in the PR body. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Rename the interface contracts C1/C2/C3 -> IC1/IC2/IC3 (ADR 0003 am. 1) 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> * Address review: finish the Proposed fix, rename the operative plan 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> * Keep naming amendment outside sealed production sources * Promote Workstream A floor references to v1 * Resolve Workstream A strict staging provenance * Format Workstream A floor seal files * Recount tier manifest after merging master (artifact 2,535 -> 2,543) The eight spell-floor artifact tests read committed runs/*.json evidence and classify into the artifact tier. Counts recollected from the committed tree, per the merge convention. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Vahid Ahmadi <va.vahidahmadi@gmail.com>
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.