Files
politics-tracking/docs/roadmap.md
T
simonandClaude Opus 5.5 456f9816f4 Redesign the web app from a written design concept
Design concept and design system in docs/design/: principles (evidence
first, neutral, fair to the people shown, plain language, time as a
dimension, accessible and private), information architecture, core
patterns and a concept for every page; tokens with checked contrast,
component catalogue, content and accessibility rules.

web:
- neutral ink-indigo accent instead of flag red; party colours only as
  small markers next to the name; light/dark theme with a switcher
- stylesheets split into tokens, base, layout, components, print
- new header (search, filter count, language, theme, mobile menu) and
  footer; breadcrumbs, page headers, tabs with counts, filter bars that
  collapse on phones, pagination, notices and empty states
- claim cards with source meter, legal stage, innocence notice inside
  the card and a permalink; claim pages with citation (/angaben/{id})
- profiles with role timeline and key figures; party and organisation
  dashboards; vote list with position chips; calendar agenda on phones;
  tables that stack into cards; loading and error pages; favicon

backend:
- GET /api/v1/claims/{id} and MCP tool get_claim for permalinks
- parties list: evaluate person_status once instead of per party
  (30 s -> 1 s on the sample database, identical result)
- parliament calendar: HTML-decode titles ("84. Sitzung")

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 22:21:44 +01:00

6.3 KiB
Raw Blame History

Roadmap

Done

Foundation (v1) – claim/evidence model, source trust and topic filters, parliament (members, mandates, functions, side jobs, speeches, faction votes, roll calls, immunity waivers, questions), Wikidata (state/local offices, party membership, careers), Rechnungshof donations, news feeds and sitemaps (headline-level, TDM-aware), entity linking, travel/meeting extraction, legal-matter detection with review, corroboration, activity status, former politicians, calendar, timeline, REST API, MCP server, Next.js frontend (de/en), Docker Compose for Unraid.

Re-architecture (v2) – see architecture/02-comparison-and-decisions.md:

  • Adapter framework: SourceSpec in code, pure parse(), Fetcher with robots/TDM/throttle/conditional GET
  • Raw archive + politrack reparse; change detection (body hash + parser version)
  • Single writer (Loader), identity from resolved entities, identifier table, resolution hints (roll-call surnames, office holders on a date), legal-form-insensitive organisation matching
  • Registry + entry points; periodic tasks generated from adapter metadata; queues scrape/social/bulk/enrich
  • Typed API (Pydantic) → OpenAPI → generated TypeScript; golden-fixture tests
  • Contributor documentation

New data (v2):

  • Rechnungshof annual party reports (totals, public funding, loans, holdings, affiliated organisations)
  • Public procurement core data (contract awards, eForms)
  • RTR media transparency (government ads, media subsidies)
  • Council of Ministers minutes (agenda items per reporting minister)
  • U-committee hearings (who testified when)
  • WKStA press releases (documents for search; legal claims only after review)
  • European Parliament: Austrian MEPs, declarations of interests
  • European Commission meetings with interest representatives
  • Wikipedia edits from parliament/government IP ranges
  • Political ads: Google (bundle), Meta Ad Library (opt-in token)
  • Social: Bluesky, Mastodon, public Telegram channels, YouTube (key), X via official API (token); party/institution channels; curated social_accounts.yaml
  • Pages: organisations, money explorer, social feed, Wikipedia edits, person network ("follow the money"), say-vs-vote on roll calls

Design (v2) – see design/README.md:

  • Design concept and design system (neutral palette, light/dark, tokens with checked contrast, icons)
  • Redesigned pages: header with search and filter count, profiles with role timeline and key figures, party and organisation dashboards, vote list with position chips, calendar agenda on phones
  • Claim permalink pages with citation (/angaben/{id}, GET /api/v1/claims/{id})

Next

Data

  • X deletion sync (Developer Agreement: remove posts deleted on X) – required before enabling social.x in production
  • Full speech texts and interjections from the protocols; committee memberships (list 250)
  • HowTheyVote.eu / EP roll-call votes of Austrian MEPs
  • EU Council participant lists, ministries' press releases, Federal President's schedule
  • Election results and candidate lists; AMA/TAM subsidy recipients (after checking bulk access and terms)
  • Cabinet staff and appointments to state-owned companies (from answers to parliamentary questions)
  • One adapter per Landtag (OGD where available); municipal councils and mayors
  • Lobbying register – if the BMJ ever offers stable URLs or an export

Quality

  • Golden fixtures for every adapter (the framework and first cases are in place)
  • Better event dates (explicit dates in the text instead of publication dates)
  • Entity resolution for donors/companies via Firmenbuch numbers from procurement notices
  • Wayback Machine archiving of evidence URLs (document.archive_url)

Product

  • Before going public: Impressum/Offenlegung (§ 5 ECG, § 25 MedienG), privacy policy, a corrections contact
  • Image proxy for portraits and logos (no visitor IPs to Wikimedia/parliament)
  • Compare two people or parties; topic pages (/themen/{slug}); Open Graph share images; CSV export
  • Review queue for editors in the web UI (today politrack review)
  • Community link submissions and a corrections/right-of-reply form
  • Alerts (e-mail/RSS) for followed politicians
  • Optional accounts via reverse-proxy SSO using app_user
  • Partnerships: MeineAbgeordneten, Parteispenden.at, APA (OTS full-text licence)
  • Map view of trips and appearances

Not yet verified (v2)

Tested so far: unit and golden tests, a live pipeline run of every adapter with --max-requests against a test database, every API endpoint, the frontend type check against the generated types. Not run yet, because PyPI/npm were unreachable on the development network (October 2026):

  • Building the backend and web images (docker compose build), npm run build
  • Procrastinate workers and the periodic schedule; the job-queue schema (politrack migrate installs it)
  • The MCP server at runtime
  • Mastodon (no account in the test sample), YouTube, X and Meta Ad Library (no credentials)
  • GDELT (rate-limited during the test), EP declarations for MEPs whose API calls returned HTTP 500

Known limitations

  • Votes in the Nationalrat are faction-level except roll calls (an Austrian parliamentary practice).
  • Split votes (factions voting differently on parts of a bill) keep the official text but no faction positions, because the summary cannot be attributed reliably.
  • Activity status: parliament and EP data are authoritative (status_verified). Open-ended roles from Wikidata count as current for 15 years after their start, so some state/local politicians may show wrong status until per-state adapters exist.
  • Roll-call surnames that are ambiguous without a link in the protocol are skipped, not guessed.
  • Travel/meeting extraction is rule-based; dates are publication dates of the source.
  • News coverage is headline-level; mentions are linked by exact name or "office title + surname".
  • Telegram: only channels with the public web preview; only the latest posts per run.
  • Council of Ministers items are attributed to the office holder on that date; if the resolver cannot find who held the office (missing role data), the item is skipped and counted.