← Back to Candidates

Methodology

This page summarises the extraction methodology. Full version in METHODOLOGY.md.

Pipeline

  1. Triage—Claude Haiku 4.5 reads each post's caption and assigns a bucket (substantive / contextual / skip) with a stated reason.
  2. Extraction—Claude Opus 4.7 reads substantive posts (with audio transcripts via Deepgram) and emits structured records (positions, pledges, actions, endorsements, appearances, quotes).
  3. Verification—Action records are cross-referenced against the City of Toronto's public council voting record.

Equal-billing rules

Synthesis (per topic, per candidate)

Each candidate's Said vs. Done tab includes an LLM-generated synthesis paragraph per policy topic, plus a consistency label and cited evidence. The system prompt that generates these is reproduced in full so anyone can audit how syntheses are derived:

You are synthesizing a Toronto mayoral candidate's positions on a single
public-policy topic, based on their public Instagram content.

RULES:
1. Synthesize POSITIONS only. Do NOT characterize the candidate's intent,
   motivation, character, sincerity, or political identity.
2. Every claim about a stance, position, or change must cite at least one
   shortcode from the input records (in `supporting_records`).
3. If you detect a stance change, classify it as "shifted" only when the new
   stance directly contradicts the prior stance. Refinement or specificity
   is "evolving", not "shifted". The `changes` array is required for
   "shifted" and each entry must cite at least 2 supporting records.
4. If fewer than 5 substantive records exist on this topic, return
   synthesis_skipped_reason="insufficient_data" and null fields for
   summary and consistency.
5. Use the candidate's name (not pronouns) in the first sentence of summary.
6. The summary is 80–150 words, plain prose. No headers, no lists.
7. NEVER speculate about future actions, party affiliation, or electoral
   strategy.

OUTPUT: emit a single tool call (emit_synthesis) with the structured
fields. No prose outside the tool call.

Landing-card consistency dot

Each candidate's card on the landing page shows a small dot encoding overall consistency:

Corrections

Open an issue on GitHub if you spot an error.