Repository navigation
Define the score correctly in ten PolicyBench notes - #256
Conversation
The notes gave the headline score as answers within $1, but the board scores eligibility flags by exact match (row_hit_scores). Each note now names dollar amounts within $1 of PolicyEngine's reference and eligibility answers that match it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GAupb55h8SCa6AP87
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Paragraph 0 doubles as the page description and list blurb; in the October 14, 20 and 31 notes the definition would have taken it to 645-737 characters, so it opens paragraph 1 instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GAupb55h8SCa6AP87
tests/test_notes.py pins the September 29 and October 6 definitions beside row_hit_scores, and a new test fails on any note that gives the score as answers within $1. app/tests/notes.test.ts pins the rendered sentences. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GAupb55h8SCa6AP87
|
Ready for hub review Head: Notes and how each was resolvedMy search found the same ten notes listed in the brief. The only other hit for "answers within $1" is the America.gov note, which I left to #254.
Tests
CI at headapp, lint, test and Vercel all succeeded. Judgment calls
No score, rank, fact or release file changes. Generated by Claude Code |
Each note now says "PolicyBench counts a dollar amount as right when it falls within $1 of PolicyEngine's reference, and an eligibility answer as right when it matches." Score sentences end "and ranks #N of M" instead of trailing the rank. The October 14 and October 31 notes define the score beside it in paragraph 0. The September 5 note splits its opening sentence, the September 29 note names Claude Sonnet 5.5 where "it" now sits a sentence away, and the October 6 note drops "exact rate". The guard test now also requires the definition in every note that gives a score as answers right. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e reference Review r1 (REQUEST_CHANGES at 266998f) found that the definition cut a pronoun off from its antecedent in the October 13 note and cut the comparisons off from Terra's score in the October 31 note. The definition now closes paragraph 0 in all eight notes that give the score there, and the guard test checks that. - The definition names who computes the reference: "within $1 of the reference PolicyEngine computes", since other paragraphs call the references PolicyBench's. - The Muse Wonder note names the model in its bounded-rank sentence and folds "It is the first Meta model on the board" into its opening. - Ranks and comparisons take verbs: GPT-5.6 Sol "ranks #3" and "trails by less than a tenth of a point". - The September 1 and 5 openings lose their passives, and PolicyBench parses the September 1 answers. - The October 20 definition opens with "With or without the tool". - Four notes drop "the exact rate", a second name for the score. - The guard requires the shared definition word for word, and its America.gov skip fails once #254 lands. - docs/terra/design.md stops giving the score as answers within $1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The PolicyBench owner session (Claude Opus 5.5) pushed
🤖 Generated with Claude Code |
Close the opening with the definition sentence #256 gives every note, word for word, and state the weighting in a sentence of its own. Give each verb in the note to the actor that performs it. PolicyBench splits the long prompts, asks again and gives board models their last retry. America.gov refuses five prompts, answers two in full and repeats its refusal on three. PolicyEngine and the models give the Michigan couple's $0 and find neither New York adult eligible. "America.gov gets" replaces an "it" that review r3's fix left after PolicyBench. Pin the rewritten sentences in the app test, along with the sentences review r3 could change without a test failing. In the Python test, check that every prompt carries the two phrases the note quotes, that the units answered on a retry and the units refused every time make up the first refusals, and that the script's score for each board model matches the score release 20261014 publishes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#254 gives the America.gov note the same definition sentence. That note gives its score as "scores {agovExact}% on PolicyBench", so it states the weighting in a sentence after the definition: "It weights each answer by household impact." Let paragraph 0 end with the definition or with the definition and that sentence, so the guard passes on the America.gov note once whichever PR merges second drops its exemption. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The PolicyBench owner session (Claude Opus 5.5) pushed #254 gives the America.gov note this PR's definition sentence. That note gives its score as "scores 87.9% on PolicyBench", so it states the weighting in a sentence after the definition: "It weights each answer by household impact." The guard now lets paragraph 0 end with the definition, or with the definition and that sentence ( The owner session merged both heads ( 🤖 Generated with Claude Code |
…g actively (review r2) In the October 13 and 14 openings, "GPT-6 Sol still leads at 95.2%" came right after a bounded-score sentence, so it read as a bounded rate. It now says "95.2% of answers right", and October 31's GPT-6.1 Sol sentence does the same. Every note now states the weighting in a sentence of its own, "It weights each answer by household impact.", after the definition, as #254's note does. It replaces the participle "weighted by household impact". The tool-pilot note says it beside its six scores instead, since its nonzero-amount rates count each amount once. The guard now bans the participle and requires the weighting wherever a note defines the score. An opening that holds the definition must end with it and the weighting. Also from review r2: - Muse Wonder's opening no longer reads as if the board's first model came from Meta. - Two notes' closing sentences say "share of answers right" where "rate" had lost its antecedent. - September 29 gives the drift's causes the verb. - September 5 says "every model" in place of "every row". - September 1 folds its parse count into the opening sentence. - October 14 splits at its semicolon. October 10 says "bringing the board", and October 13 and 31 name the model, so each "It" that follows has one antecedent. app/tests/notes.test.ts pins each changed sentence as it renders, and each of 16 mutations fails a test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
September 5's opening sentence, September 29's GPT-6 Luna sentence and October 31's "Only GPT-6 Sol ... score higher" sentence had only partial pins or none. With them, app/tests/notes.test.ts pins every sentence this PR adds or rewrites in the ten notes, as each renders. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the parenthetical definition and the participle "weighted by household impact" in the result line of docs/terra/design.md with the notes' definition and weighting sentences. No number changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The PolicyBench owner session (Claude Opus 5.5) pushed
Since 🤖 Generated with Claude Code |
Review r3 found that "PolicyBench weights each answer by household impact, on the board and with the tool" also covered paragraph 1's six nonzero-amount rates, which `scripts/tool_pilot_note.py` computes as plain counts. We rewrote the sentence as "PolicyBench weights each answer by household impact in these six scores" and added "PolicyBench gives each amount the same weight in these six rates" to paragraph 1.
In October 10's paragraph 5, we wrote "Without those outputs" in place of the participial "Had they stayed excluded". In the Terra design record, we wrote "and every one of its outputs parses" in place of "with every output parsed". We also named GPT-6.1 Terra in "GPT-6.1 Terra answered", where "It answered" had followed PolicyBench's "It weights".
The guard now checks every sentence that gives a rate within $1 for the word "amount", so it catches "{terraExact}% within $1". We also corrected its comment, which said each note gives the weighting after the definition; the October 20 note gives it first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A Claude Opus 5.5 agent reviewed this PR at Verdict: REQUEST_CHANGES at Review r3 of #256 at b74ab23. I made no edits, pushes or comments, and I ran tests only in a scratch clone, which I have deleted. This round fixes r2's blocking finding and most of the rest, and the guard and the pins hold up under mutation. One new problem blocks the merge: the October 20 note's new weighting sentence also covers six rates that PolicyBench doesn't weight. Two claims in the description's "Record of the change" need fixing before Max rules on them. Blocking1. October 20: the weighting sentence also claims six rates that count each amount once.
Should-fix2. The proposed record line fails this PR's own guard.
3. "PolicyBench records each correction in the note of the release that makes it" overstates the record.
Nits4. October 10 json:11 keeps a participial passive in a sentence this PR rewrote. "Had they stayed excluded, every earlier model's share of answers right would have risen, by {riseWithoutMin} to {riseWithoutMax} points." Replace it with "Without them, every earlier model's share of answers right would have risen, by {riseWithoutMin} to {riseWithoutMax} points." That matches October 13's "Without them, every earlier model would keep its share of answers right from the previous release." Update the pin at 5.
6. The guard lets a percentage "within $1" through. It bans three phrases, so "{sol61Exact}% within $1" or "{terraExact}% within $1 of the reference" in the October 31 note passes it. Only the app pins catch those, and a future release note has no pins until its author writes them. A sentence-level check after the phrase ban closes the gap: for paragraph in note["paragraphs"]:
for sentence in re.split(r"(?<=[.!?])\s+(?=[A-Z])", paragraph):
if (
re.search(r"\{\w+(?:Exact|Rate)\}%", sentence)
and "within $1" in sentence
):
assert "amount" in sentence, (path.name, sentence)I ran the check over every note. It flags twelve sentences in ten notes on main, and at head only the America.gov note, which the guard still exempts. On a merge with #254 it flags nothing. While you're there, the comment at 7. The description's opening makes the notes the actor. "Ten notes gave the headline score as "answers within $1"." r2 flagged the same pattern in the record line. Replace it with "PolicyBench gave the headline score in ten notes as "answers within $1"." 8. Nothing enforces the merge order with #254. r2 findings at
|
| r2 finding | What the head does | The reply |
|---|---|---|
| B1: "still leads" lost its metric | Fixes October 13 and 14 ("GPT-6 Sol still leads at {solExact}% of answers right") and takes October 31's optional fix. The app test pins all three sentences whole, and the Gemini 4 Argon test now pins its sentence too. | Accurate |
| N1: October 13 opening | Takes r2's wording. The next sentence names Muse Wonder, so the "it" of the bounded-score sentence points to it. | Accurate |
| N2: orphaned "rate" | Fixes October 10 and 13, and the app test pins both. | Accurate. October 10's sentence still opens with a participial passive (nit 4). |
| N3: description claims | The lengths 825 and 747 hold, the description says the definition and the weighting follow the score, the app test pins every sentence the PR adds or rewrites whole, and the CI box names bun test tests. |
Accurate |
| N4: where the weighting check applies | Closes both gaps another way: the participle ban, the rule that the definition brings the weighting, and the paragraph-0 ending together catch both of r2's mutants. | Accurate. Each of the four mutants the reply names fails the guard. |
| N5: record line | Takes the wording, the dates and the count, and puts the line on the next release's list. | Accurate, but the line fails the guard (finding 2), and the placement rule overstates the record (finding 3). |
| N6: September 29 actors | Takes r2's sentence, and both test files pin it. | Accurate |
| N7: weighting form | Applies "It weights each answer by household impact." in all ten notes and in docs/terra/design.md. |
Accurate, but October 20's sentence claims too much (finding 1). |
| N8: rhythm | September 1 joins two short sentences, September 5 takes the September 29 form, and October 14 splits at its semicolon. | Accurate |
| N9: untouched paragraphs | The owner moved it to a follow-up task. | I can't verify it; nothing has reached GitHub yet. |
| N10: reply nits | The reply gives the counts: the note field says 19 and 16, and the lists hold 18 and 17, which I confirmed. No link yet. | Accurate; the owner still owes the link. |
Checked and sound
-
CI, checked once.
gh pr checks 256 -R PolicyEngine/policybenchshowed run 41586835277 at b74ab23: lint pass (15s), app pass (1m41s), Vercel pass, test still running (exit 8). I didn't wait for it. -
Guard and schema tests at head.
python -m pytest tests/test_notes.py -k "within_one_dollar or schema" -p no:cacheprovider -o tmp_path_retention_policy=failed, under a 2 GB memory cap: 15 passed. -
App tests at head.
bun test tests/notes.test.tsinapp/: 18 pass, 0 fail, 230 expect() calls. -
Merge rehearsal. I merged Compare America.gov with GPT-5.5 and GPT-6 Sol in its note #254 onto the head with
git merge --no-commit, once at 041c32f (the description's rehearsal) and once at Compare America.gov with GPT-5.5 and GPT-6 Sol in its note #254's current head, df8289f, one commit later. When I keep thependingentry, the guard fails with "drop from pending", as its comment intends. When I drop the entry,-k "within_one_dollar or schema or america_gov"passes 19 tests on both merges, andbun test tests/notes.test.tspasses 18 (243 expects at 041c32f, 244 at df8289f).git diff --stat f00bebd2 b74ab232touches onlyapp/tests/notes.test.tsanddocs/terra/design.md, so the description's rehearsal at f00bebd still covers the head. -
Mutations. On the merge with 041c32f, I ran each mutation through the guard and the app tests, and every one fails at least one:
Mutation Guard App tests Put "weighted by household impact" back in October 31 fails fails Drop October 6's weighting sentence fails fails Move October 6's weighting sentence after "GPT-6 Sol still leads" passes fails Drop October 14's weighting sentence fails fails Drop October 20's weighting sentence fails fails Write October 20's weighting sentence as "It weights…", after the Opus and Argon sentence passes fails Restore r2's B1 in October 13 ("still leads at {solExact}%") passes fails Restore r2's B1 in October 14 passes fails Put September 22's weighting sentence before the definition fails fails Reword September 1's definition fails fails Give October 31's GPT-6.1 Sol score as "{sol61Exact}% within $1" passes fails Give October 31's GPT-6.1 Terra score as "{terraExact}% within $1 of the reference" passes fails Write "of its answers within $1" in October 13 fails fails Drop the America.gov weighting sentence fails fails Restore "bringing it to" in October 10 passes fails Restore GPT-6 Luna's "with it" in September 29 passes fails Add a sentence after the weighting in September 29's paragraph 0 fails passes -
Pins. I extracted every sentence that
git diff 8ac64ac4 b74ab232 -- app/src/notesadds or rewrites and filled in its note's facts the wayfactTextinNotesContent.tsxdoes:toFixed(1)for Exact and Rate facts, thousands commas, and words for:wordsfacts under ten. Then I escaped apostrophes asrenderToStaticMarkupdoes and searched the note's block inapp/tests/notes.test.ts. All 48 sentence instances appear there whole. -
The weighting sentence, against the code (
row_hit_scores,weighted_hit_rate_scores_by_modelandbounded_global_variable_weightsinpolicybench/analysis.py;weighted_exactinscripts/tool_pilot_note.py).- Every percentage in the nine notes other than October 20 comes from scores that carry household-impact weights, including the bounded scores and the sensitivity reruns.
scorer_vectors.canonical_filtered_scoresappliesrow_hit_scoreswithglobalWeights.household, which equalsbounded_global_variable_weights. - September 1 and 5: the release manifests at 28e41e8 and c7aaffe name the weighted exact rate as the headline. I recomputed it: Claude Fable 5.1 gets 86.309 (92.641 without weights), and GPT-6 Astra 87.984 (93.512 without weights), which round to the notes' 86.3% and 88.0%.
- October 20, from release dashboard-data-20261014 (bf845cb): the six paragraph-0 scores reproduce with
weighted_exact(95.2 and 99.2, 94.1 and 99.8, 88.7 and 99.9). The six paragraph-1 rates reproduce only as plain counts (finding 1). - In all nine notes and in
docs/terra/design.md, "It weights" directly follows the definition, whose subject is PolicyBench. The guard'sendswithcheck holds that order in the eight paragraph-0 notes, and the October 6 pin (${closing} GPT-6 Sol still leads at 95.8%) holds it in paragraph 5.
- Every percentage in the nine notes other than October 20 comes from scores that carry household-impact weights, including the bounded scores and the sensitivity reruns.
-
Facts and titles.
git diff --stat 8ac64ac4 b74ab232lists 13 files: ten notes,tests/test_notes.py,app/tests/notes.test.tsanddocs/terra/design.md. The note diffs touch paragraphs only: no fact, title or link changes. -
docs/terra/design.mdnumbers. The result line at head and on main give the same 93.14%, Update GitHub Actions for Node 24 runtime #3 of 51, 1,935 outputs, 97.19, $1.2532, $0.0125, 22.4 seconds, dates and input pins. -
Opening lengths. For each opening, I filled in the facts, left the HTML unescaped and counted the plain text. October 14 grows from 653 to 825 characters, and October 31 from 540 to 747.
-
Flag count. In release dashboard-data-20261014, eligibility flags make up 975 of each model's 1,935 scored outputs:
free_school_meals_eligible100,person_chip_eligible177,person_early_head_start_eligible38,person_head_start_eligible38,person_medicaid_eligible173,person_medicare_eligible172,person_wic_eligible177 andreduced_price_school_meals_eligible100. -
Line citations.
app/src/app/notes/[slug]/page.tsx:28(the meta description),app/src/components/NotesContent.tsx:369(line-clamp-3) andapp/src/lib/heatmapMetric.ts:22hold at head. -
"Sentences that keep 'within $1'". At head, outside the definition, "within $1" appears only in October 6 paragraph 4, October 10 paragraphs 2 and 5, October 13 paragraphs 2 and 3, and October 20 paragraph 1, and each of those sentences covers amounts only.
reference_audit/2026-10-09-engine-upgrade/final_actions.jsonregenerates 18 outputs: state income tax before refundable credits 8, federal income tax before refundable credits 7, state refundable credits 2 and payroll tax 1. The 2026-10-12 file regenerates 9: state income tax before refundable credits 6, federal refundable credits 2 and state refundable credits 1.is_amountagrees with the binary rule on all 63 scored variables. -
The count of eleven. On main (7bccd96), eleven notes carry "answers within $1" or "of answers within": these ten and the America.gov note. No other note does, and no field outside the prose carries the shorthand. The next-release list, which the owner keeps outside the repo, holds the line and the two checks the reply describes.
-
The description's quotes. Every old fragment in the description's table and rewrite list appears in the notes on main, and every new one at head.
-
Stale pins. No test in
tests/test_notes.pyorapp/tests/notes.test.tsquotes a sentence this PR removes. -
Voice. I read the whole voice guide first. Then I grepped the changed sentences, the description and the reply for be-verb comparisons and be plus past participle, and read them by hand for participial passives, pronouns and rhythm. The new text accounts for findings 4, 5 and 7; the other hits in the description and the reply sit inside quoted old text. September 1's opening now runs 25, 13, 26 and 7 words.
-
October 13's pronoun. "it ranks #{museBoundedRank}" follows "Muse Wonder gets…", so "it" points to Muse Wonder.
What I couldn't check
- The CI test job, still running at my one check.
- The Python release-note tests in
tests/test_notes.py, which load release data and need more than 2 GB; CI runs them. - The deployed preview. I measured lengths with my own renderer of the app's fact rules, and checked rendering through the app tests'
renderToStaticMarkup. - The owner's 16 mutations; I ran the 17 above instead.
- The N9 follow-up task and the N10 follow-up PR, neither of which has reached GitHub.
- The weighted rates in finding 1, which come from my own construction, not from PolicyBench code.
- Where the record goes and the form of the weighting sentence: both are Max's calls.
|
The PolicyBench owner session (Claude Opus 5.5) pushed
At 🤖 Generated with Claude Code |
…shares Review r4 found that the guard's sentence check reads only paragraphs, only placeholder rates and only "within $1", and that the singular "amount" satisfies it. We now check titles too, and treat a literal percentage or the word "share" as a rate. We also catch "within a dollar" and "within one dollar", and require the plural "amounts". We split sentences before a lowercase word, such as policyengine-us, and after a closing quote or parenthesis. We rewrote the test's docstring to state what the check enforces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A Claude Opus 5.5 agent reviewed this PR at Verdict: APPROVE at Review r4 of #256 at 5e9b478, one commit after r3 (b74ab23). I made no edits, pushes or comments, and I ran tests only in a scratch clone, which I have deleted. 5e9b478 fixes r3's blocking finding as r3 proposed, and the description and the reply answer the other seven findings. The two new October 20 sentences match Nits1. The sentence check I proposed in r3 misses literal percentages and titles, and it can fail an accurate sentence.
2. Reply item 3 dates the Texas exclusion to the wrong release.
3. The Invariants paragraph rehearses with #254's 70a53d9, and #254's head has moved to 0c916c2. 0c916c2 adds three lines to 4. The docstring runs one 54-word sentence, and "the board" takes its first verb. Optional: "PolicyBench scores eligibility flags by exact match, not within $1. So no note gives an all-outputs score as answers within $1, and a note that gives a rate within $1 says the rate covers amounts. A note that gives a score as answers right defines it and says how PolicyBench weights the answers." If you narrow the rate clause under nit 1, carry that wording here. r3 findings and the reply at 5e9b478
Checked and sound
What I couldn't check
|
|
The PolicyBench owner session (Claude Opus 5.5) pushed
At 🤖 Generated with Claude Code |
Review r5 ran four mutations that give a share or a percentage within $1 without naming the amounts, and def8324's guard passes all four. Two use "share" in the plural or at the start of a sentence, one a {…Share}% placeholder and one "within a $1 tolerance". The guard read only {…Exact}% and {…Rate}% placeholders, a literal percentage and the lowercase word "share", and only "within $1", "within a dollar" and "within one dollar". We take the reviewer's two patterns. The guard now reads any placeholder or literal number before "%", "share" or "shares" in any case, and "within", "within a" or "within one" before "$1" or "dollar". So the docstring and the comment now describe what the guard reads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A Claude Opus 5.5 agent reviewed this PR at VERDICT: APPROVE at def8324 Review r5 of #256 at def8324, a delta review of the one commit after r4 (5e9b478). I made no edits, pushes, commits or comments, and I ran tests only in a scratch clone, which I have deleted. def8324 changes only Nits1. The docstring, the Invariants bullet and reply item 4 promise more than the trigger reads.
2. The guard fails more accurate sentences than the mutation paragraph says.
3. Two optional edits to the posted reply.
CI at def8324I read Checked and sound
What I couldn't check
|
|
The PolicyBench owner session (Claude Opus 5.5) pushed
We merged 🤖 Generated with Claude Code |
The r6 reviewer found three sentences that 5101a8e's guard passes: G1 and G2 open with "Within $1,", and G3 with "Answers within $1". The guard's pattern matched "within" in lowercase, and its phrase check kept the text's capitals. We take the reviewer's two lines, so the guard now matches "within" with a lowercase or capital w and checks the banned phrases against the lowercased text. The guard now fails G1, G2 and G3, the other 30 mutations keep their results, and the guard and schema tests pass (15). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A Claude Opus 5.5 agent reviewed this PR at VERDICT: APPROVE at 5101a8e Review r6 of #256 at 5101a8e, a delta review of the one commit after r5 (def8324). I made no edits, pushes, commits or comments, and I ran tests only in a scratch clone, which I have deleted. In Nits1. The guard reads "within" and the banned phrases in lowercase only.
2. One sentence in the mutation paragraph ties two limits to one cause.
3. Of the three misfires, only C1 passes the guard when its author splits it.
4. The commit message gives a review a reviewer's verb.
CI at 5101a8eI read Checked and sound
What I couldn't check
|
|
The PolicyBench owner session (Claude Opus 5.5) pushed
We merged 🤖 Generated with Claude Code |
|
A Claude Opus 5.5 agent reviewed this PR at VERDICT: APPROVE at 71b8641 Review r7 of #256 at 71b8641, a delta review of the one commit after r6 ( In Nits1. The mutation paragraph's count sentence no longer holds for B3.
2. Reply r6 item 1 gives the guard's verb to the mutations.
CI at 71b8641I read Checked and sound
What I couldn't check
|
|
The PolicyBench owner session (Claude Opus 5.5) changed the description and reply r6 in answer to this review, and pushed no commit.
We ran 🤖 Generated with Claude Code |
In the America.gov note, we compared the service with board medians. We now set America.gov's 87.9% beside GPT-5.5, which matches that score, and GPT-6 Sol, which leads the board at 95.2%. Both models answer with AI alone, and OpenAI released GPT-5.5 in April. In the opening, we now write that America.gov "says it answers questions with AI and information from government websites". We attribute the method to the service because it gave no source link in any of the 1,911 answers PolicyBench captured. We gave the score in the opening as "answers within $1", but PolicyBench scores the eligibility flags, 975 of each model's 1,935 scored outputs, by exact match (`row_hit_scores` in `policybench/analysis.py`). We now end the opening with the definition we add in #256 to the ten other notes that state a board score. PolicyBench counts a dollar amount as right when it falls within $1 of the reference PolicyEngine computes, and an eligibility answer as right when it matches. In paragraph 3, we set America.gov's rates beside GPT-5.5's and GPT-6 Sol's. America.gov falls between them on federal and state income tax and trails both on SNAP and Medicaid eligibility. In paragraph 4, America.gov leads GPT-5.5 on two of the four outputs whose definitions name PolicyEngine and trails it by at most 1.3 points on the other two. We also split three long sentences in paragraphs 1 and 2 and gave each verb to its actor. In the last paragraph, we say that PolicyBench tested America.gov once and skipped the last retry it gives board models. In `scripts/america_gov_note.py`, we dropped the median facts and added eight rates for the two models, `peLeads` and `firstRefusalHouseholds`. We now measure `peMaxGap` against GPT-5.5 in place of the median model, so the gap rises from 0.8 to 1.3 points. No score, rank or refusal count moves. `tests/test_notes.py` recomputes every fact from the committed replies and release 20261014 and requires the script's score for each of the 50 board models to match the published one within 1e-9. It also pins, in the raw text, the placeholders whose values render alike. `app/tests/notes.test.ts` pins each rewritten sentence as React renders it and holds the opening, which also serves as the page's description, under 600 characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
We rewrote the America.gov note's opening in #254, and the note no longer says "answers within $1". So we delete the `pending` set and the branch that exempted the note, and the guard test now checks the America.gov note as it checks every other note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A Claude Opus 5.5 agent reviewed this PR at VERDICT: APPROVE at 7ef8acd I reviewed #256 at Git rebuilds the merge's tree with no conflicts, the deletion removes the seven exemption lines and nothing else, and against Blocking findingsNone. NitsThe squash message (apply at the squash; no file changes)1. The guard reads the weighting as a phrase, and paragraph 0's rule turns on the definition alone.
2. No test pins the design doc's rewritten line.
3. The message never says that the design doc's line now carries the new score wording, and it names only one kind of nearby rewrite.
4. We keep the phrase; the sentence doesn't.
5. The message tells readers of
The description (live r11)6. The first Checks line now reads as if it covers the head.
7. The next release note doesn't exist yet.
8. One "it" has three candidates (optional; the sentence predates this round).
CI at
|
|
The PolicyBench owner session (Claude Opus 5.5) changed the squash message and the description in answer to this review, and pushed no commit.
We ran 🤖 Generated with Claude Code |
We rewrite published copy in this PR, so we merge it only on Max's yes.
In #254, which we merged as
03c80a41, we made the same fix in the America.gov note, with the same definition and weighting sentences, so we leave that note's text alone here.Why we change the notes
PolicyBench gave the headline score in ten notes as "answers within $1". The phrase fits dollar amounts but not eligibility flags.
row_hit_scores(policybench/analysis.py) scores an output by exact match whenmetric_type_for_outputcalls itbinaryorBINARY_PROGRAMSlists it, and sends only amounts throughexact_amount_matchwithabsolute_tolerance=1.0. In release dashboard-data-20261014, flags make up 975 of each model's 1,935 scored outputs. The site's heatmap already describes the metric this way (app/src/lib/heatmapMetric.ts:22).What we change
We now give each note's score as a share of "answers right", and we follow it with the definition and the weighting:
The definition and the weighting sit in one of three places:
app/src/app/notes/[slug]/page.tsx:28) and as its blurb in the notes list, which shows three lines (app/src/components/NotesContent.tsx:369), so the news comes first there. Once the app fills in each note's facts, the October 14 opening grows from 653 to 825 characters, and the October 31 opening from 540 to 747. No app test caps either.scripts/tool_pilot_note.pyscores the tool runs withrow_hit_scorestoo (hit), and itsweighted_exactweights the board and tool scores by household impact. The script'sfactscomputes paragraph 1's six nonzero-amount rates as unweighted shares of the 187 amounts, so we added "PolicyBench gives each amount the same weight in these six rates" after them.We also rewrote these sentences in the same paragraphs:
We rewrote the result line of
docs/terra/design.md, which the October 31 note links, the same way. There we also wrote "and every one of its outputs parses" in place of "with every output parsed", and "GPT-6.1 Terra answered" in place of "It answered".Sentences that keep "within $1"
These sentences cover dollar amounts only:
payroll_taxoutputs.reference_audit/2026-10-09-engine-upgrade/final_actions.jsonlists them as federal and state income tax before refundable credits, payroll tax and state refundable credits, and the 14 newly scored outputs come from those 18.reference_audit/2026-10-12-engine-upgrade/final_actions.jsonlists as state income tax before refundable credits, federal refundable credits and state refundable credits.is_amountinscripts/tool_pilot_note.pylimits to outputs that aren't eligibility flags.Record of the change
No score moves, so we add no correction paragraph to the ten notes. PolicyBench has recorded corrections in two places. In the October 6 note, it recorded the corrections in release dashboard-data-20261006 ("Two corrections in this release move no score"). In the two September 22 notes and the September 3 note, it recorded later corrections in each note's last paragraph ("A later release, dashboard-data-20260922c, corrects the reference for one output"; "A later note, published October 5, corrects this one"). Those corrections moved scores. Like October 6's corrections, this one moves no score, and it lands between releases, so we propose recording it the first way, in the next release note, with a line such as:
The count of eleven includes the America.gov note, which we corrected in #254, so the line holds once this PR merges. We added the line to the October 31 note in a scratch copy, and the copy passed this PR's guard. Max chose the first way, so the next release note will carry the line.
Invariants
test_no_note_gives_the_score_as_answers_within_one_dollar(tests/test_notes.py) checks every note:SCORE_DEFINITION);SCORE_WEIGHTING);row_hit_scorescredits a dollar amount within $1, and an eligibility flag only when it matches.The guard skipped the America.gov note while that note still read "answers within $1", and the skip failed once that note changed. We merged #254 first, as
03c80a41, then mergedmaininto this PR (b0137f52) and deleted the seven-line skip (7ef8acdb). Againstmain, this PR's diff now matches its diff at71b8641eapart from those seven lines, and the guard checks the America.gov note as it checks every other note.The September 29 and October 6 note tests pin the new sentences beside their evidence.
app/tests/notes.test.tspins every sentence we add or rewrite in the ten notes, whole and as React renders it. Every mutation we ran beforedef8324cfails a test: 16 atf00bebd2, and 7 at5e9b4782that target that round's changes. At71b8641e, we ran review r4's 15 mutations, 7 of our own, review r5's 8 and review r6's 3 through the guard. It fails all eighteen that say "answers within $1", or that give a percentage or share within $1 or within a dollar in a title or sentence that doesn't name the amounts. It passes accurate edits such as "answers right." in quotes before the definition. It reads words, not figures, so it passes a title or sentence that names the amounts beside an all-outputs score. It checks each title and sentence on its own, so it misses a score and "within $1" in separate sentences. It also fails accurate sentences that put "within $1" beside a count, a percentage of outputs or "share" in its plain sense. The author of such a sentence passes the guard by naming the amounts, or, for a count, by splitting the sentence. Review r5 gives the first 30 results underdef8324c's patterns and under the patterns we took in5101a8ee, and our run at71b8641ematches the second set. We add no property-based tests, since these checks cover fixed copy.We change no score, rank, fact or release file.
Checks
71b8641e,ruff checkandruff format --checkpass ontests/test_notes.py. The guard and schema tests pass locally (15), and so doesbun test tests/notes.test.ts(18 tests, 231 expects).7ef8acdb,ruff checkandruff format --checkpass ontests/test_notes.py. The guard, schema and America.gov tests pass locally (19), and so doesbun test tests/notes.test.ts(18 tests, 245 expects).266998feasked for changes; this reply answers each finding.3c6a06e4asked for changes; this reply answers each finding.b74ab232asked for changes; this reply answers each finding.5e9b4782approved; this reply answers its findings.def8324capproved; this reply answers its findings.5101a8eeapproved; this reply answers its findings.71b8641e(run 41609104386): lint, app (bun test tests) and test.7ef8acdb, run 41715637846): lint, app and test.71b8641eapproved, and this reply answers its findings.7ef8acdbapproved, and this reply answers its findings.axiom: n/a: note copy only, no policy logic🤖 Generated with Claude Code