Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
8cad05e
Record every comparable external estimate before an analysis is publi…
MaxGhenis Oct 21, 2026
455a1f5
Test the comparables gate, document it, and regenerate the feeds
MaxGhenis Oct 21, 2026
d5bf0ad
Note the childcare dashboard's takedown in its comparables record
MaxGhenis Oct 21, 2026
372b256
Refuse a claim on a published quantity that is left uncompared
MaxGhenis Oct 21, 2026
b3fb90e
Require a fresh comparables search before an analysis is promoted
MaxGhenis Oct 21, 2026
2297707
fixup! Require a fresh comparables search before an analysis is promoted
MaxGhenis Oct 22, 2026
3aeed8a
Close the review's holes in the comparables gate
MaxGhenis Oct 22, 2026
6c8eb0b
Merge main into feat/comparables-gate
MaxGhenis Oct 22, 2026
71bd485
Publish the entry rules in the comparables index, and regenerate the …
MaxGhenis Oct 22, 2026
14d708f
Refuse a sign convention that names the other side of the ledger
MaxGhenis Oct 22, 2026
2337fa6
Let a household calculator record its search with no fixed estimate
MaxGhenis Oct 22, 2026
5b7e98b
Read a dash between two numbers as a range, and let a claim's basis b…
MaxGhenis Oct 22, 2026
f9395eb
Stage a one-sided figure as a bound, set beside an estimate
MaxGhenis Oct 22, 2026
c4490d1
Make a money figure's price base part of its identity
MaxGhenis Oct 22, 2026
3b7421f
Count a hashed primary as used when a basis or a checked page links it
MaxGhenis Oct 22, 2026
0ebe6d8
Cite the latest search in a registry block, and record where an analy…
MaxGhenis Oct 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,17 @@ python pipeline/compute_tariff_counterparts.py # parquet if present, else the
python pipeline/build_moments.py # -> app/public/data/moments.json
```

## Pre-publish comparables

A PolicyEngine analysis is searched against every listed external producer
before it is published or promoted, and each estimate found is recorded here
with the cause of any gap over the threshold, 25% by default
(docs/COMPARABLES.md). One directory per analysis,
`sources/analysis-<country>-<slug>/`; the validator and index are
`scorecard_db/comparables.py`. policyengine-app-v2's CI
(PolicyEngine/policyengine-app-v2#1380) and PolicyEngine/newsletters' CI
(PolicyEngine/newsletters#29) read the index.

## Reproducing

Python side (requires the policyengine.py-managed environment; heavy —
Expand Down
24 changes: 23 additions & 1 deletion app/public/data/lanes.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"country": "US | UK | BE | NZ \u2014 the model instance the lane feeds (issue #42)",
"note": "Repo-committed status feed (issue #7); graduate to Supabase when lane count makes commits noisy. Every lane writes its transition here."
},
"updated": "2026-10-21",
"updated": "2026-10-22",
"lanes": [
{
"id": "urban-sotsn",
Expand Down Expand Up @@ -577,6 +577,28 @@
"running": false,
"updated": "2026-10-15",
"note": "88 of 132 claims computed \u2014 State individual income tax collections (T40) for 41 States, DC, NH and WA, FY2023-FY2025; FY2023 (a us-6.2.1 calibration target) and FY2025 compared with PE's CY2024 State income tax on us-6.2.1; adapter QC checks the US column against the 50 States on all 25 items; admin outturns staged as claims by decision on #176"
},
{
"id": "analysis-comparables-uk",
"source": "Pre-publish comparables",
"area": "every external estimate of each PolicyEngine analysis, found before it is published",
"mode": 2,
"country": "UK",
"stage": "computed",
"running": false,
"updated": "2026-10-21",
"note": "1 analysis searched, 22 claims, 22 PolicyEngine results beside them"
},
{
"id": "analysis-comparables-us",
"source": "Pre-publish comparables",
"area": "every external estimate of each PolicyEngine analysis, found before it is published",
"mode": 2,
"country": "US",
"stage": "registered",
"running": false,
"updated": "2026-10-21",
"note": "0 analyses searched, 0 claims, 0 PolicyEngine results beside them"
}
]
}
2,847 changes: 2,276 additions & 571 deletions app/public/data/populations.json

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions app/src/sourceLabels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,17 @@ const SOURCE_SPECIAL: Record<string, string> = {
loughborough_crsp: "Loughborough CRSP",
trussell_wpi: "Trussell / WPI Economics",
niesr: "NIESR",
// Pre-publish comparables (docs/COMPARABLES.md): producers on
// data/comparables/producers.json that no earlier lane staged. (The
// Centre for British Progress label arrives with #207.)
dfe: "DfE",
lse_case: "LSE CASE",
landman_economics: "Landman Economics",
academic: "Academic working paper",
urban: "Urban Institute",
cbpp: "CBPP",
itep: "ITEP",
crfb: "CRFB",
};

export function sourceLabel(s: string): string {
Expand Down
Loading
Loading