# Afledningsprotokol — position-ledger

Offentliggjort protokol for hvordan Politikerbasen afleder positioner
(PRD §P2/§6). Alle afledte entries i `data/positions.json` følger denne
protokol og bærer `evidence_type: "derived"` + en `method_note`, og vises
med mærkatet **"afledt — ikke bekræftet af politikeren"**. Protokollen
anvendes identisk på alle partier og medlemmer.

## §1 Datagrundlag

- Kilde: `oda.ft.dk` (Folketingets åbne data) — `Afstemning` + `Stemme`
  for alle afstemninger i folketingssalen i indeværende valgperiode
  (fra 2026-03-24, folketingsvalget).
- Parti på afstemningsdatoen kommer fra den præcist ene daterede
  `AktørAktør`-relation med `rolleid=15`, hvis relationens mål er en
  folketingsgruppe (`Aktør.typeid=4`). Relationens id, partiaktør og
  `gruppenavnkort` gemmes med stemmen. Nul eller flere gyldige relationer giver
  `null`-parti; stemmen bevares, men indgår ikke i partiflertal eller
  linjebrudsberegning.
- Ingest: `pipeline/fetch_votes.py` (dagligt via GitHub Actions);
  committede artifakter i `data/afstemninger.json`.
- Afstemnings- og linjebrudsartifakter bærer samme deterministiske
  afstemnings-snapshot-id. Linjebrudsartifaktet bærer desuden en self-hash af
  hele sin afledning. Partiafledninger vises kun, når versionen og begge
  indholdshashes validerer.
- Stemmetyper: 1=For, 2=Imod, 3=Fraværende, 4=Hverken for eller imod.

## §2 Tema-tagging

En afstemning knyttes til et tema, når sagens titel (`titel` +
`titelkort`, case-insensitivt substring-match) matcher mindst ét nøgleord
i temaets publicerede liste i `pipeline/common/themes.py`.

Designprincip: listerne er bevidst **konservative** — en overset
tema-afstemning (falsk negativ) er acceptabel; en irrelevant afstemning,
der farver en politikers profil (falsk positiv), er det ikke.

v1-temaer (PRD §12.1): `klima-energi`, `sundhed`, `retspolitik`.
Udlændingepolitik er bevidst udskudt til tema #4 efter lancering, og
nøgleord som "udvisning"/"udlænding" indgår derfor ikke i retspolitik.

Ændringer i nøgleordslisterne committes offentligt og skal afspejles i
dette dokument.

## §3 Afledte akser

Per politiker × tema afledes højst to akser — begge beskriver **adfærd i
salen**, ikke holdninger:

1. **`stemmeretning`** = For / (For + Imod) på temaets afstemninger.
   Kræver mindst **3 afgivne For/Imod-stemmer** inden for temaet; ellers
   afledes ingen stemmeretning (utilstrækkeligt grundlag).
2. **`deltagelse`** = (For + Imod + Hverken) / (temaets afstemninger i
   alt). Bemærk: folketingsmedlemmer kan stemme ved fuldmagt og
   clearing-aftaler er almindelige — lav deltagelse kan ikke tolkes som
   manglende engagement, og formidles ikke sådan.

Hver entry bærer: `value`, `basis` (rå optælling + antal tema-afstemninger),
`source_url` (oda.ft.dk-forespørgsel på politikerens stemmer),
`source_quote` (optællingen i ord), `source_date`/`recorded_at`
(seneste tema-afstemnings dato).

## §4 Append-only ledger

- Ledgeren er append-only: nye datasnapshots, der ændrer en værdi,
  **tilføjer** en ny dateret entry — ældre entries bevares (det er
  drift-historikken), også hvis seneste afstemningsdato er uændret.
- Politikeres selvrapporteringer og korrektioner (`self_reported` /
  `corrected`) tilføjes via `pipeline/add_position.py` og overskrives
  aldrig af afledningen. UI viser afledt og korrigeret side om side.
- Git-historikken på `data/positions.json` er den offentlige audit-log.

## §5 Hvad protokollen ikke gør

- Ingen tolkning af citater, debatindlæg eller interviews i v1 —
  tekstkodede afledninger kræver et dokumenteret kodningsskema og
  optages først i protokollen, når det foreligger.
- Ingen vægtning af afstemningers vigtighed.
- Ingen aggregering på tværs af temaer, ingen scores, ingen ranglister.
