Use disclosure-controlled UK geography outputs for constituency and local authority impacts
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
- #860 de @PavelMakarchuk — cerrado sin fusionar
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 25/100
Línea de trabajo
Start with simulation_output_geographic.py, especially build_uk_constituency_impact and build_uk_local_authority_impact, and inspect how Stage 12 retains household identifiers. Read the compute_uk_geography_disclosure API in the pinned policyengine.py 6.7.5 and its tests. Done means both geography breakdowns use one nested release, blocking findings withhold suggested cells while references remain published, and backward compatible output includes optional tier and interval fields; keep source_household_id and region_code_oa in the retained frame.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Problem
UK constituency and local-authority results in the economy output are not disclosure-controlled, and some of them are wrong in a way readers can see.
The executor builds them with policyengine.py's deprecated compute_uk_constituency_impacts and compute_longwise_uk_geography_impacts (simulation_output_geographic.py, build_uk_constituency_impact and build_uk_local_authority_impact). Per area, these compute:
average_household_income_change= Σ(change × w) / Σwrelative_household_income_change= Σ(reform × w) / Σ(baseline × w) − 1
There is no minimum sample. A small cell with a few negative-income households has a baseline total near zero or below zero, so the relative change explodes or changes sign.
Examples from production output
Reform: gov.hmrc.income_tax.rates.uk[0].rate 0.20 → 0.21, 2026.
- App report 4684, region
country/wales. Cardiff West:average_household_income_change≈ −192, butrelative_household_income_change≈ +13.72 (the app shows +1372%). A tax rise that loses £192 shows a large gain. Both values imply a baseline mean household income of about −£14. Caerphilly shows −5.6%, while neighbouring seats show −0.1% to −2.3%. - App report 4693, UK-wide. Pendle and Clitheroe shows +1.8%, while every other English constituency loses.
First reported, in the wrong issue, at https://github.com/PolicyEngine/policyengine-sim-api/issues/858#issuecomment-6301724245.
Licensing risk
The UK datasets derive from UK Data Service licensed survey microdata (FRS and others). The End User Licence binds every published number, and a local result that rests on a handful of survey households can breach it. policyengine.py deprecated the two functions above for this reason: their output "is not disclosure-controlled, so it must not be published when the data is licensed survey microdata". The executor still publishes it in every UK economy result, through the API and the app.
Fix
policyengine.py already has the replacement: compute_uk_geography_disclosure (PolicyEngine/policyengine.py#605, closing PolicyEngine/policyengine.py#589), available in the pinned 6.7.5. It applies a count floor of 10 distinct survey households (by source_household_id), a dominance rule, a check on what subtraction between published areas recovers, a bootstrap 90% interval and precision-adaptive rounding. Each cell is reported, approximate or withheld.
Switch both breakdowns to it:
- Build constituencies and local authorities in one release, nested in regions and the nation, so the check sees both levels.
- Resolve blocking findings by withholding the suggested cells; never withhold a reference (region or national) cell, because those numbers are public elsewhere.
- Keep the output contract backward compatible: existing fields keep their types. A withheld area is left out of the list. Published areas gain optional fields for the tier and the 90% interval.
- Keep
source_household_id(andregion_code_oa) in the Stage 12 retained household frame.
Known limits
- The enhanced FRS 1.58.1 in the current bundle sets
source_household_idafter its SPI and capital-gains copies are stacked, so copies of one survey household count separately (PolicyEngine/policyengine-uk-data#591, fixed in #597 for later releases). Support is overstated on that release until the bundle moves to a rebuilt eFRS or to Microcosm (PolicyEngine/policyengine.py#685). - The check covers one run. It does not compare results across runs, such as a UK run against a Wales run.
🤖 Generated with Claude Code
- Lenguaje dominante
- Python
- Estrellas
- 1
- Forks
- 1
- Merge medio
- 1 d 16 h
- PR fusionados (30 d)
- 61
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de PolicyEngine/policyengine-sim-api
-
Update policyengine to 6.7.3Quizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 2/5 Medio día Aptitud para principiantes 70/100
PolicyEngine/policyengine-sim-api#823 ·
Los mantenedores suelen responder en 1 día
-
Integration tests fail due to missing UV virtual environment setupPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
PolicyEngine/policyengine-sim-api#314 ·
Los mantenedores suelen responder en 1 día
-
Update policyengine to 6.10.1Posiblemente ocupada @policyengine la tomó hoy. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 20/100
PolicyEngine/policyengine-sim-api#905 ·
Los mantenedores suelen responder en 1 día
-
Calculate a household under several policies in one call on Modal (v2 household functions)Posiblemente ocupada @anth-volk la tomó hoy. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
PolicyEngine/policyengine-sim-api#902 ·
Los mantenedores suelen responder en 1 día
-
Add simulation and report definitions to the simulation schemaPosiblemente ocupada @anth-volk la tomó hoy. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
PolicyEngine/policyengine-sim-api#899 ·
Los mantenedores suelen responder en 1 día
Todos los issues de PolicyEngine/policyengine-sim-api
Issues similares
-
[oblt-aw][autodoc] Update workflow docs for gh-aw v0.92.5 and detector permission scopePosiblemente ocupada @github-actions la tomó hoy. Abierto
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
feat(ide): VS Code access through the shipped MCP server (config doc and tool-list smoke test)Abiertoroadmap-100
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
comp/tools P2 tool/browser tool/file type/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
NousResearch/hermes-agent#143418 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
python-hyper/uritemplate#164 ·