Skip to content

Flag the replay's weakly identified matches in the paper (revision 11) - #97

Merged
MaxGhenis merged 7 commits into
mainfrom
amterr-replay-caveat-paper
Oct 24, 2026
Merged

MaxGhenis merged 7 commits into
mainfrom
amterr-replay-caveat-paper

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Flags the Colorado replay's weakly identified matches in the working paper and accounts for each case the replay does not reproduce. Publishes this as revision 11.

History. This PR was stacked on #95 (retire-qc-claims). #95 merged as 780f305 and #96 as c247b3d. This branch has been rebased onto main and retargeted to it. The original paper commits (1e2c45d, 773e170 and a945cde) are now 9fd731b, cf7b1aa and f070578. Four commits follow them:

What it changes in the paper

Replay paragraph (#sec-decompose)

  • Weak identification, after the threshold rates: "In 64 of the 230 moved matches, 32 of them above the threshold, the issued benefit lies within $5 of a stretch where the solver's benefit formula is flat in the moved input (the maximum allotment in 53, the minimum benefit in 6, rent past the shelter-deduction cap in 3 and rent low enough for a zero shelter deduction in 2). By that formula every amount of the input on the stretch reproduces the issued benefit, so the match bounds the input on one side at most and is weakly identified. In 34 of the 53 the issued benefit is the maximum allotment and the solver lowered an income; the solver pays the maximum whenever net income is zero or less, so every value of that income up to the point where net income reaches zero yields it."
  • Accounting of the 37 misses. The solver's-limits sentence now covers each one exactly once:
    • 17 where nothing moved, which the paper already said;
    • "In 6 more, its $3 steps reached within $3 of the issued benefit before the utility reset moved the input off that match";
    • 9 where a stop rule ended the steps short;
    • 5 household-size misses.
  • "Of the 10, 2 are among the 6 the utility reset moved off a match."
  • "a stepped utility amount is then reset" now reads "the utility amount is then reset". Two rows were reset without a step.

Footnote and FACTS D4. The stop rules now say "at or above the maximum allotment" (202311-40369 has RAWBEN above it). They also add the mirror rule: at or below a one- or two-person unit's minimum benefit, income-raising steps run until the uncapped benefit falls below zero.

New FACTS rows

  • D5: weak identification. It covers the both-ways push, the 61 / 3 direction split and its keys, and the counts by stretch (53, 6, 3, 2). It also gives the 3 matches bounded on neither side, the 2 household-size matches that are not assessed, the 34 income cuts at the maximum, the 5 matches not counted, and the at_max flag's 54. The wording matches paper/snapshot/labs/amterr/ANALYSIS.md with 7c074f6's two rewordings.
    • D5 states the push test as a condition: "The benefit is monotone in each input, so when a pushed amount still gives a benefit within $5 of RAWBEN, every amount between the solver's and that one does too; a match counts when that pushed amount also lies on one of the flat stretches named below." The $100,000 is quoted from audit_claims.SOLVER_PUSH.
  • D6: what the solver did in the 20 moved misses, the 3 moves that end farther from RAWBEN than FSBEN, and the audit's two checks of D4.

Lab write-up. ANALYSIS.md picks up the same two rewordings as D5 (7c074f6):

  • "so they too bound the input on one side only, from above";
  • "the solver moves household size once, by one person, so there is no range of amounts to scan".

Abstract and headline claims

The abstract is unchanged. It says the engine "reproduces the issued benefit within $5 for 78.4% … and 91.4% … which is consistent with correct arithmetic on a wrong input". That claim still holds for every weakly identified match. The caveat qualifies how much those matches show; it doesn't change a headline number.

Rendering and revision

  • Re-rendered at the final head with Quarto 1.9.36 (cd paper && quarto render index.qmd). paper/out/index.html is byte-identical to the committed app/public/paper/web/index.html. The PDF's text is identical (pdftotext); only its creation timestamps and document ID differ.
  • Revision 11 (2026-10-24). Revision 10 is live: it was deployed for d934. So this publishes a new revision:
    • the date moves in index.qmd;
    • the wrapper (app/public/paper/index.html) gets a new description, the tag "Revision 11 · 2026-10-24" and the cache key r11-20261024.

Tests

  • tests/test_retired_claims.py:
    • replay_quotes locks the paper's sentences against claims_audit.json;
    • the Hypothesis count strategy draws the four stretch counts;
    • test_replay_counts_partition checks 53 + 6 + 3 + 2 = 64, 34 ≤ 53, and 14 + 3 + 6 + 9 + 5 = 37;
    • test_facts_quotes_the_solver_outcomes locks D5 and D6, including the push sentence, the direction split, the neither-side keys, the household-size clause and the "Not counted" sentence.
  • tests/test_paper_embed.py: test_revision_label_matches_the_manuscript_date checks that the wrapper's tag, its description and the cache key name one revision, dated as paper/index.qmd.
  • Mutations: six edits each failed a lock. They changed the tag's number, the tag's date, the description's revision, the manuscript date, D5's $100,000, and D5's "also lies on".
  • audit_claims.py --check reports "is current".
  • tests/test_retired_claims.py, tests/test_amterr_lab.py, tests/test_cause_shares.py and tests/test_paper_embed.py give 71 passed at 7c074f6, none skipped, with the QC postings present.

Review

~/reviews/snap-qc-sim-pr97/review-r3.md (in-session Opus; every Subfleet lane was closed) approved 7c074f6 with three nits. d3460a2 addresses nits 1 and 3. From nit 2 it takes the revision-label lock; the footnote's stop rules stay unlocked, as round 1 accepted.

axiom: n/a: manuscript text and fact catalog; no policy encoding changes

🤖 Generated with Claude Code

MaxGhenis added a commit that referenced this pull request Oct 4, 2026
Mirrors #96's review-r1 fixes and #97's review-r1 suggestions:
- The weak-identification sentence now says the issued benefit lies
  within $5 of a stretch where the solver's formula is flat. The 3
  shelter cases are now "rent past the shelter-deduction cap", since the
  solver stopped $11 to $14 short of it. The sentence also says "by that
  formula", "on one side at most" and "34 of the 53".
- FACTS D5 gives the push the audit uses ($100,000 or $0), notes the
  engine was not run there, and names the 2 matches bounded on neither
  side and the 7 matches it doesn't count.
- "Of the 10, 2 are …", so no sentence opens with a numeral.

Re-rendered; the PDF is still 27 pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 6 commits October 24, 2026 18:45
…he paper

The replay paragraph now says that 34 of the 230 moved matches, 19 of them
above the threshold, are weakly identified. In each, the issued benefit is
the maximum allotment and the solver lowered an income. Every income at or
below break-even yields the maximum, so these matches do not pin the
income down.

It also adds a sixth cause to the account of non-reproduced cases. In 6,
the $3 steps reached within $3 of the issued benefit, and the utility
reset then moved the input off that match.

New FACTS rows D5 and D6 record both, and test_retired_claims.py locks the
sentences against claims_audit.json (from #96). The paper is re-rendered.
Revision 10 is not yet published, so it keeps its number; its date and
the wrapper's cache key move to 2026-10-04. The abstract is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… paper

This follows #96's second round, after 8 independent agents checked the
claims.

- The replay paragraph now gives all 60 weakly identified moved matches,
  31 above the threshold:
  - 53 at or within $5 of the maximum allotment;
  - 4 at the minimum benefit;
  - 3 at the shelter-deduction cap.

  Of the 53, 34 are income cuts at the maximum. The mechanism is now
  stated as "up to the point where net income reaches zero" rather than
  "break-even".
- The 37 misses are now each accounted for once: 17 unmoved, 6 reset-off,
  9 stopped short and 5 household-size misses.
- It notes that 2 of the 10 computational misses are reset-off cases.
- "A stepped utility amount is then reset" now reads "the utility amount",
  since two rows were reset without a step.
- The footnote and D4 now say "at or above the maximum allotment" and add
  the mirror rule at the minimum benefit.
- D5 and D6 are rewritten to match, and the locks follow. A new identity
  checks that the misses partition the 37.

Re-rendered with Quarto 1.9.36. The PDF is still 27 pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mirrors #96's review-r1 fixes and #97's review-r1 suggestions:
- The weak-identification sentence now says the issued benefit lies
  within $5 of a stretch where the solver's formula is flat. The 3
  shelter cases are now "rent past the shelter-deduction cap", since the
  solver stopped $11 to $14 short of it. The sentence also says "by that
  formula", "on one side at most" and "34 of the 53".
- FACTS D5 gives the push the audit uses ($100,000 or $0), notes the
  engine was not run there, and names the 2 matches bounded on neither
  side and the 7 matches it doesn't count.
- "Of the 10, 2 are …", so no sentence opens with a numeral.

Re-rendered; the PDF is still 27 pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#96 now counts flat stretches on both sides of a match and adds the
zero-shelter-deduction stretch: 64 of the 230 moved matches are weakly
identified (32 above the threshold), 53/6/3/2 by stretch. The replay
paragraph, FACTS D5 and their locks now carry those counts: the
opposite-side split, the 3 matches bounded on neither side (by the
solver's formula), the $23 minimum (one-person units), the $8
zero-shelter gap, the 2 unassessed household-size matches, and the 5 not
counted with #96's round-3 wording. The paper is dated 2026-10-24 and
re-rendered with Quarto 1.9.36; the wrapper's iframe key moves to
r10-20261024.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Revision 10 (2026-10-03) went live with #95's deploy on 2026-10-24, so
this content change takes the next number. The wrapper describes
revision 11 and keeps revision 10's description; its iframe key moves to
r11-20261024.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The "Not counted" matches bound the input on one side only, from above;
the weakly identified ones are bounded from either side. Household-size
matches are not assessed because the solver moves household size once,
so there is no range of amounts to scan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis changed the base branch from retire-qc-claims to main October 24, 2026 22:48
@MaxGhenis
MaxGhenis force-pushed the amterr-replay-caveat-paper branch from a945cde to 7c074f6 Compare October 24, 2026 22:48
@MaxGhenis MaxGhenis changed the title Flag the replay's weakly identified matches and reset-off misses in the paper Flag the replay's weakly identified matches in the paper (revision 11) Oct 24, 2026
FACTS D5 read as if every push lands on a flat stretch. It now says
when a pushed amount still matches, every amount between it and the
solver's does too, and that a match counts when that amount also lies
on a named flat stretch. The $100,000 push is quoted from SOLVER_PUSH.

test_paper_embed now checks that the wrapper's revision tag, its
description and the cache key name one revision, dated as paper/index.qmd.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis merged commit c42e608 into main Oct 24, 2026
1 check passed
@MaxGhenis
MaxGhenis deleted the amterr-replay-caveat-paper branch October 24, 2026 23:17
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.

1 participant