Skip to content

Rename interface contracts C1/C2/C3 → IC1/IC2/IC3 (ADR 0003 amendment 1) - #277

Open
vahid-ahmadi wants to merge 5 commits into
masterfrom
rename-interface-contracts
Open

Rename interface contracts C1/C2/C3 → IC1/IC2/IC3 (ADR 0003 amendment 1)#277
vahid-ahmadi wants to merge 5 commits into
masterfrom
rename-interface-contracts

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

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

sense where renameable?
locked gate_w1 fingerprints c1/c2 gates.yaml No — amendment plus a fresh referee round
SSA Trustees table II.C1 external source filenames No — publisher terminology
RNG substream C3 household-composition nonfamily_bridge Unrelated
interface contracts C1/C2/C3 ADR 0003 and the live employer-firm plan Yes — renamed to IC1/IC2/IC3 here

The 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:

  • ADR 0003 records Amendment 1 and consistently uses IC1/IC2/IC3 in operative contract text.
  • The live employer-firm plan uses the final names.
  • The NOEMP evidence builder and its two pinning-test modules use IC2.

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.yaml on #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:

  • whitespace/error scan: clean
  • affected tests: 71 passed, 1 skipped
  • changed Python lint: clean
  • GitHub CI: lint, Python 3.11, Python 3.13, and build all green

#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.

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>
@vercel

vercel Bot commented Jul 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
social-security-model Ready Ready Preview Jul 31, 2026 8:32am

Request Review

vahid-ahmadi added a commit that referenced this pull request Jul 23, 2026
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 daphnehanse11 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

  1. 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_spells function docstring (src/populace_dynamics/data/sipp_jobs.py:506). Post-merge, the ADR says Accepted/frozen while this line says Proposed.
  2. docs/plans/employer-firm-plan.html:258-262,280-281 uses 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>
vahid-ahmadi added a commit that referenced this pull request Jul 23, 2026
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>
@vahid-ahmadi

Copy link
Copy Markdown
Contributor Author

Both should-fixes applied at 7912751.

1. The half-applied fix is finished — job_spells's own docstring (sipp_jobs.py:501-507) now mirrors the module wording: the schema is Accepted and frozen, and what remains preview-grade is this collapse's single-ref_year coverage. Nothing in the repo now says Proposed post-merge.

2. Renamed rather than declared historical: docs/plans/employer-firm-plan.html was the one live document on the wrong side of the boundary, and it's cited by the ADR's own Context section, so a referee following the link would have met unmapped names. Six lines renamed to IC1/IC2/IC3 (the SVG path data containing C265,247 untouched — that was the trap in doing this with a regex). 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.

Repo-wide grep confirms every surviving bare C1/C2/C3 is a gate_w1 fingerprint or an SSA table label.

@vahid-ahmadi

Copy link
Copy Markdown
Contributor Author

Current-head readiness audit at c5b4d11, performed as vahid-ahmadi from an isolated worktree:

  • git diff --check origin/master...HEAD: clean
  • affected tests with the isolated tree on PYTHONPATH: 71 passed, 1 skipped
  • Ruff on all changed Python files: clean
  • repository CI at this head: lint, Python 3.11, Python 3.13, and build all green
  • current-head diff reviewed: naming-only and scoped to five files

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 COMPUTE_SURFACE_COMPLETE; I stopped the remainder after capturing that environmental timeout. The same head’s full GitHub test matrix is green.

No code change or new commit was needed. This does not presume or request approval.

@vahid-ahmadi

Copy link
Copy Markdown
Contributor Author

Master refresh addendum by vahid-ahmadi:

  • Merged exact current master 044d2fc789052e89ea0849fa39fea9899317d97e into rename-interface-contracts at 35499f1.
  • The merge was conflict-free; no naming-contract content or unrelated master content was hand-resolved.
  • The PR diff remains scoped to ADR 0003, the operative employer-firm plan, the NOEMP evidence builder wording, and their naming tests. It still changes names only (C1/C2/C3IC1/IC2/IC3) and does not change contract semantics or gates.yaml.

Verification:

  • Targeted naming/banding/evidence tests: 61 passed, 1 skipped.
  • Changed-Python Ruff: passed.
  • Diff/whitespace checks: passed.
  • Exact tiers match the refreshed manifest: unit 853; artifact 1,967; integration_psid 812; reproduction_legacy 520; oracle_policyengine 159 (4,311 total).
  • Master 044d2fc is verified as an ancestor of the pushed head.

This refresh does not merge or approve the PR. The frozen-contract cross-workstream approval requirement remains unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants