What this pack is

4 contests, 605 people, 527 poll response rows, 5,103 result rows and 5,261 money edges, built 2026-09-03.

The cycle phase shown on every contest is computed from the election date and how well that date is known. The corpus carries its own status column; it disagrees with the derived phase on 20 of the 61 contests across all twenty-two countries, so it is carried through but never read.

Money rows and result rows are held off the site at their full grain: the staged corpus is 156 MB. What is published here is the aggregate computed once at build time, and every aggregate states the number of rows it stands for.

Everything known to be wrong or limited

licence · grain · method
  • HATVP filers list 0 EUR for years of an activity with no remuneration. Those explicit as-filed zeros are excluded from money-edges.csv (they are not flows); '[Données non publiées]' lines are excluded as nulls, never as 0.
  • AN uid (PA*) == HATVP liste.csv id_origine; XML Député declarations matched on exact HATVP nom+prenom to that liste row. No name fuzzy-match across money and roster. Ambiguous names dropped.
  • Every extracted topline table was checked to sum to 100% of exprimés (+-4). Tables outside that band are a parser failure, not a published figure.
  • AN 17e = sitting; presidential 2027 R1 227 days out = active; législatives 2029 = distant/constitutional_due. No 2026 snap législative.
  • Marine Tondelier (party validated the principle of an autonomous candidacy, no personal declaration), Emmanuel Maurel (declared to the PS primary only), Jordan Bardella, Éric Zemmour, Dominique de Villepin, François Hollande, Gérald Darmanin, Sébastien Lecornu — polled in trial heats but not declared.
  • Conseil constitutionnel legal list does not exist before March 2027 (parrainages due 2027-03-12 18:00). people.csv carries the 28 publicly declared candidacies as of 2026-09-03 with per-candidate declaration dates and sources; undeclared but polled names are excluded (see not_declared_note).
  • Ministère de l'intérieur résultats définitifs par circonscription (data.gouv.fr, Licence Ouverte 2.0). CLEA/MEDSL staged files NOT re-downloaded.
  • vote_share in this pack is a FRACTION of 1 (largest observed 1), not a percentage. India and Nigeria file percentages; the rest file fractions.

The pack's own record

every URL fetched, every inclusion and exclusion
SOURCES.md
# Sources — France (fra) elections pack

Built 2026-09-03. Licence on official dumps: Licence Ouverte 2.0 / Etalab unless noted.
No Wikipedia sourceUrl. Nulls over invention. Amounts and poll percentages copied as filed/published.

## Calendar (official)

- Presidential 2027: first round **2027-04-18**, second **2027-05-02**.  
  Source: service-public.gouv.fr, published 2026-07-02, Conseil des ministres 2026-07-01.  
  https://www.service-public.gouv.fr/particuliers/actualites/A15053
- Législatives next: **2029** unless dissolution. Last vote 29–30 June / 6–7 July 2024 (17e législature).  
  https://www.service-public.gouv.fr/particuliers/vosdroits/F1943
- No scheduled National Assembly election in 2026. Macron camp has denied a 2026/27 dissolution rumor; this pack does **not** file a snap législative as scheduled.

## Assemblée nationale roster (sitting)

- Portal: https://data.assemblee-nationale.fr/acteurs/deputes-en-exercice
- Dump used: http://data.assemblee-nationale.fr/static/openData/repository/17/amo/deputes_actifs_mandats_actifs_organes/AMO10_deputes_actifs_mandats_actifs_organes.json.zip  
  File stamp ~2026-09-02/03. 577 `json/acteur/PA*.json` (complete 577-seat house).
- `person_id` = official AN `uid` (e.g. PA795046).
- Group / district from active GP and ASSEMBLEE mandats in the same dump.
- Photo URLs: HATVP liste `url_photo` when present, else AN tribun/17 pattern.
- Bios: empty (not scraped from deputy pages in this build).
- `uri_hatvp` is published by the AN on each acteur file (official join key to HATVP nominative pages).

## HATVP interests / assets (not campaign money)

- Index: https://www.hatvp.fr/livraison/opendata/liste.csv (via data.gouv.fr resource 8583f5c6-5665-473b-9d3e-1d54bbc88a4a), 13,687 rows.
- Content XML: http://www.hatvp.fr/livraison/merge/declarations.xml (87,022,657 bytes, last-modified 2026-08-27 per data.gouv.fr).
- Join: `liste.csv` `id_origine` = AN uid without `PA` prefix (official). XML Député declarations matched to that liste row on exact nom+prénom (HATVP-to-HATVP, unique keys only).
- `edge_type=side_income` = yearly remuneration in `activProfCinqDerniereDto` / `mandatElectifDto` / `participationDirigeantDto` / `activConsultantDto` as filed (EUR).
- `edge_type=asset_declaration` = `participationFinanciereDto/evaluation` as filed (EUR).
- Never labelled PAC / donation. CNCCFP campaign accounts are largely paper — no invented donation rows.
- Latest declaration per sitting deputy kept (by `dateDepot`) to avoid double-counting modificatives.
- One row per **filed year-line** (HATVP publishes remuneration year by year), so `cycle` is the declared year.
- Explicit as-filed **0 EUR** year-lines (9472) are excluded — a 0 EUR line is a declared activity with no remuneration that year, not a flow. `[Données non publiées]` is treated as null, never as 0. Negative values (2) are kept with sign as filed.

## Polling (published tables, 2025–2026 presidential trial heats)

Institute PDFs only (not Wikipedia):

1. **Elabe** / BFMTV / La Tribune Dimanche — 26–28 Aug 2026 — https://elabe.fr/fichier-pdf/13224-les-francais-et-lelection-presidentielle-2027/
2. **Elabe** / BFMTV / La Tribune Dimanche — 9–10 Jul 2026 — https://elabe.fr/fichier-pdf/13159-les-francais-et-lelection-presidentielle-2027/
3. **Elabe** / BFMTV / La Tribune Dimanche — 25–27 Mar 2026 — https://elabe.fr/fichier-pdf/12955-20260328_elabe_bfmtv_la-tribune-dimanche_election-presidentielle-2027/
4. **Elabe** / BFMTV / La Tribune Dimanche — 30–31 Oct 2025 — https://elabe.fr/fichier-pdf/12400-les-francais-et-lelection-presidentielle/
5. **Elabe** / BFMTV / La Tribune Dimanche — published 5 Apr 2025 — https://elabe.fr/fichier-pdf/12034-05042025_elabe_bfmtv_la-tribune-dimanche_les-francais-et-lelection-presidentielle/
6. **Ipsos** bva / CESI / Le Parisien — 27–28 May 2026 — https://www.ipsos.com/sites/default/files/ct/news/documents/2026-06/presidentielle-2027-intention-vote-mai26-rapport-complet-web.pdf
7. **IFOP**-Fiducial / Sud Radio / Le Figaro — 26–27 Feb 2026 — https://www.ifopgroup.com/wp-content/uploads/2026/03/122319-resultats-intention-de-vote-presidentielle.pdf
8. **Cluster17** / Le Point — 30 Sep–1 Oct 2025 — https://cluster17.com/wp-content/uploads/2025/10/Le-Point-Cluster17-ITV-Presidentielle.pdf

Long format: one row per response option. MoE copied only when the report states a single range; otherwise blank.
QC: all 62 extracted topline tables sum to 100 % of exprimés (+-4), i.e. 62/62. Harris Interactive 2026 PDFs were Cloudflare-captcha'd from this environment and are not included.

## Last-cycle results (results.csv)

Official commission source, both rounds of the 2024 snap législatives that produced the sitting 17e législature:

- 1er tour 30 June 2024 — https://static.data.gouv.fr/resources/elections-legislatives-des-30-juin-et-7-juillet-2024-resultats-definitifs-du-1er-tour/20240710-171413/resultats-definitifs-par-circonscriptions-legislatives.csv
- 2nd tour 7 July 2024 — https://static.data.gouv.fr/resources/elections-legislatives-des-30-juin-et-7-juillet-2024-resultats-definitifs-du-2nd-tour/20240710-170728/resultats-definitifs-par-circonscription.csv
- Dataset pages: `Elections législatives des 30 juin et 7 juillet 2024 - Résultats définitifs du 1er/2nd tour`, Ministère de l'intérieur, Licence Ouverte 2.0.
- One row per candidate per circonscription per round. `votes` as filed; `vote_share` = share of *exprimés* expressed as a fraction (e.g. 43,52 % -> 0.435200). `seats`=1 marks the `Elu` flag as filed.
- `party` = official **nuance** code as filed (RN, UG, ENS, LR, UXD, DVD, ...), not a normalised party name.
- `person_id` filled only for elected rows where the circonscription code matches a sitting AN mandate **and** the surname matches (524/577 elected rows). Non-elected rows have no official person id and are left blank.
- CLEA / MEDSL: the staged `elections-intl-master.csv.gz` on Zee already carries France 2024 (CLEA Release 18, ICPSR 39687) but **1er tour only**; it was not re-downloaded. `results.csv` here is the official ministry file for both rounds. Cite CLEA (Kollman et al., Release 18, ICPSR 39687) and MEDSL when publishing the staged aggregates.

## Declared 2027 presidential candidates (people.csv, role=candidate/both)

- Roundup used: https://www.touteleurope.eu/vie-politique-des-etats-membres/presidentielle-2027-qui-sont-les-candidats-deja-declares/ (Touteleurope, updated 31 Aug 2026) + https://www.rfi.fr/fr/france/20260212-france-l-ancien-ministre-bruno-retailleau-annonce-sa-candidature-%C3%A0-l-%C3%A9lection-pr%C3%A9sidentielle-de-2027 (RFI, 12 Feb 2026) + https://www.nouvelobs.com/politique/20260609.OBS115649/quels-sont-les-25-candidats-deja-officiellement-declares-a-la-presidentielle-de-2027.html (Nouvel Obs list, updated 31 Aug 2026). **No Wikipedia.**
- 28 declared candidacies as of 2026-09-03. Declaration dates/venues per candidate are in `STATS.json` -> `declared_2027_candidates`.
- The **legal** candidate list does not exist yet: 500 parrainages must reach the Conseil constitutionnel by **2027-03-12 18:00**. These rows are declared candidacies, not the validated list, and no candidate has an official CC id yet.
- `person_id`: AN `uid` for the 7 declared candidates who are sitting deputies (unique exact-name match against the roster, verified 1:1), otherwise a pack-local `fra-pres2027-<slug>` id.
- Not filed as candidates: Marine Tondelier (party validated the principle of an autonomous candidacy, no personal declaration), Emmanuel Maurel (declared to the PS primary only), Jordan Bardella, Éric Zemmour, Dominique de Villepin, François Hollande, Gérald Darmanin, Sébastien Lecornu — polled in trial heats but not declared.
- `party` left empty where the source does not state a party affiliation for the declaration (nulls over invention).

## Not used

- Wikipedia.
- CNCCFP paper campaign accounts (not digitised here).
- Conseil constitutionnel validated candidate list (does not exist before March 2027).
- OpenSanctions / NosDéputés third-party mirrors as join keys.
HANDOFF.md
# HANDOFF — France (fra) Cartevoir elections pack

**As of 2026-09-03 (America/Chicago).** Write path: `/workspace/elections-ingest/fra/`

## Two products

1. **Sitting Assemblée nationale, 17e législature** (`fra-an-17`, `cycle_status=sitting`)  
   Roster of **577** deputies (official AN open data, complete 577-seat house) plus HATVP declared **interests/assets** (`side_income` / `asset_declaration` in EUR as filed). Not PAC/donations.
2. **Presidential 2027** (`fra-pres-2027-r1` 2027-04-18, `fra-pres-2027-r2` 2027-05-02, `cycle_status=active`)  
   Polling from Elabe, IFOP, Ipsos, Cluster17 published tables 2025–2026, plus **28 declared candidates** (role `candidate`, or `both` for the 7 who are sitting deputies). The **Conseil constitutionnel list is not published until March 2027** (parrainages due 2027-03-12 18:00), so these are declared candidacies as reported, not the legal list. Not declared as of 2026-09-03: Marine Tondelier (party validated the principle of an autonomous candidacy, no personal declaration), Emmanuel Maurel (declared to the PS primary only), Jordan Bardella, Éric Zemmour, Dominique de Villepin, François Hollande, Gérald Darmanin, Sébastien Lecornu — polled in trial heats but not declared.

Législatives 2029 are filed as `fra-an-2029` / `distant` / `constitutional_due`. **There is no scheduled AN election in 2026.**

## Counts

| file | rows |
|------|------|
| elections.csv | 4 |
| people.csv | 605 (577 sitting deputies + 28 declared 2027 presidential candidates) |
| money-edges.csv | 5261 (side_income=4437, asset_declaration=824) |
| polls.csv | 527 option-rows / 8 surveys / institutes=['Cluster17', 'Elabe', 'IFOP', 'Ipsos'] |
| results.csv | 5103 candidate-rows (577 circonscriptions, both 2024 rounds, 577 elected rows) |

## Join keys

- `person_id` = AN `uid` (`PA######`) for deputies. Declared 2027 candidates who are **not** deputies get a pack-local `fra-pres2027-<slug>` id (no official candidate id exists before the Conseil constitutionnel list in March 2027); the 7 who are sitting deputies reuse their AN uid, so `fra-an-17` and `fra-pres-2027-r1` rows join on it.
- Money: HATVP `liste.csv` `id_origine` == AN numeric uid; XML matched on unique HATVP nom+prénom. Ambiguous names dropped (0). 516 sitting deputies have a latest Député declaration in the XML dump.
- `results.csv` -> roster: joined on official circonscription code + surname check; `person_id` filled on 524/577 elected rows. The other 53 are seats where the 2024 winner no longer sits (minister replaced by suppléant, resignation, etc.) or where the ministry and AN spell the name differently — left blank rather than guessed.
- `polls.csv` `response_label` is the published candidate label; it is **not** an id join (trial-heat labels include people who never declared). Match to `people.csv` by name only if you accept that.
- Do not fuzzy-match names across money and roster.

## Last-cycle results layer

`results.csv` ships the **official Ministère de l'intérieur résultats définitifs** for both rounds of the 2024 législatives (the contest that seated this legislature): 5103 candidate-rows over 577 circonscriptions, `vote_share` as a fraction of exprimés, `party` = official nuance code. Staged CLEA France 2024 (`/Users/jess/Cartevoir-elections/elections-intl-master.csv.gz`, Release 18 / ICPSR 39687) covers **1er tour only** and was not re-downloaded; cite CLEA + MEDSL for the staged aggregates.

## QC actually run

- Every one of the 62 extracted poll tables sums to 100 % of exprimés (+-4): 62/62 pass. Spot-checked against the PDFs (Cluster17 hyp. 1, Ipsos recap H1–H8, Ifop hyp. E/O, Elabe Aug-2026 config 1 + 2nd-tour duels).
- Where an institute prints a "Rappel" (previous wave) column next to the current one, the **current** wave is taken (Elabe: left column; Ifop: right column) — verified per file.
- Poll rows: 497 first-round option-rows, 30 second-round (duel) option-rows.
- money-edges.csv: every `person_id` resolves to a roster deputy (464 distinct deputies with at least one non-zero declared line, out of 516 with a declaration on file), all `currency=EUR`, no zero-amount rows, 2 negative values kept as filed, max single line 27,000,000 EUR (declared company participation valuation).
- results.csv: 577 circonscriptions x both rounds, exactly 577 rows flagged `seats=1`, no blank vote counts.

## Gaps

- `bio_text` empty (allowed; not scraped from assemblee-nationale.fr pages).
- CNCCFP campaign accounts not digitised — no donation rows invented.
- Poll MoE blank when the institute published a table-by-score rather than a single figure.
- HATVP zeros: 9472 as-filed 0 EUR year-lines excluded from money-edges.csv (declared activity, no pay that year). `[Données non publiées]` kept as null, never coerced to 0.
- One AN acteur has nil `uri_hatvp`; 576/577 match HATVP `id_origine`.
- Harris Interactive 2026 PDFs were Cloudflare-captcha’d from this environment; the ≥8-survey bar is met with Elabe (5) + Ipsos + IFOP + Cluster17.

## Files

- `/workspace/elections-ingest/fra/elections.csv`
- `/workspace/elections-ingest/fra/people.csv`
- `/workspace/elections-ingest/fra/money-edges.csv`
- `/workspace/elections-ingest/fra/polls.csv`
- `/workspace/elections-ingest/fra/results.csv`
- `/workspace/elections-ingest/fra/SOURCES.md`
- `/workspace/elections-ingest/fra/STATS.json`
- `/workspace/elections-ingest/fra/HANDOFF.md`

Licences on the rows

  • Licence Ouverte 2.0 / Etalab10,941
  • All rights reserved — Elabe (published table)303
  • All rights reserved — Ifop (published table)104
  • All rights reserved — Ipsos (published table)84
  • All rights reserved — Cluster17 (published table)36
  • Press / institutional roundup — declaration reporting, all rights reserved28