Skip to content

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

Merged
vahid-ahmadi merged 5 commits into
masterfrom
rename-interface-contracts
Aug 11, 2026
Merged

Rename interface contracts C1/C2/C3 → IC1/IC2/IC3 (ADR 0003 amendment 1)#277
vahid-ahmadi merged 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.

@vahid-ahmadi
vahid-ahmadi merged commit bcd21fd into master Aug 11, 2026
7 checks passed
@vahid-ahmadi
vahid-ahmadi deleted the rename-interface-contracts branch August 11, 2026 11:37
vahid-ahmadi added a commit that referenced this pull request Aug 11, 2026
…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>
vahid-ahmadi added a commit that referenced this pull request Aug 11, 2026
…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>
vahid-ahmadi added a commit that referenced this pull request Aug 11, 2026
…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>
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