Analyze. Not advocate.
A transparent, AI-aggregated analysis of candidate programs for the 2027 French presidential election. Multiple frontier AI models independently analyze each candidate's program across economic, social, security, sovereignty, environmental, institutional, and intergenerational dimensions. Results are aggregated with dissent preserved, published as a static website, with every source, prompt, and raw model output exposed for verification.
For each declared candidate:
- Gather the official program from primary sources (manifestos, speeches, voting records) into a versioned, human-reviewed source document.
- Analyze the program by running a single structured prompt against 4–5 frontier models from different providers (Anthropic, OpenAI, Google, Mistral, xAI…).
- Aggregate the independent analyses into a single result that preserves model disagreement rather than averaging it into consensus.
- Publish as a static Next.js site with clear visual dimensions, a transparency drawer showing raw model outputs, and comparison mode across candidates.
Every claim on the site traces back to the source program. Every model output is public. The methodology is fixed before any candidate is analyzed.
The site is analysis, not advocacy. If a program is fiscally sound but transfers wealth from young to old, that's a measurement, not a verdict — readers decide. Specifically:
- Symmetric scrutiny — every candidate analyzed with identical rigor on identical dimensions.
- Measurement over indictment — the intergenerational section quantifies net transfers, it does not editorialize.
- Dissent preserved — when models disagree, the disagreement is shown, not averaged away.
- Full transparency — sources, prompts, raw model outputs, and aggregation notes all published.
See docs/specs/analysis/ for the editorial principles baked into the pipeline.
┌─────────────┐ ┌──────────────┐ ┌──────────────┐ ┌─────────────┐
│ Primary │ --> │ sources.md │ --> │ 5× LLMs │ --> │ Aggregator │
│ Sources │ │ (reviewed) │ │ (parallel) │ │ LLM │
└─────────────┘ └──────────────┘ └──────────────┘ └──────┬──────┘
│
▼
┌─────────────────┐
│ aggregated.json │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Next.js build │
│ (static) │
└─────────────────┘
See docs/specs/data-pipeline/ for the full pipeline spec.
election-2027/
├── candidates/ # Per-candidate versioned data (THE DATA)
│ └── <candidate-id>/
│ └── versions/<date>/
│ ├── sources.md # Human-reviewed program summary
│ ├── sources-raw/ # Original PDFs, screenshots
│ ├── raw-outputs/ # Per-model JSON outputs
│ ├── aggregated.json # Final synthesized analysis
│ └── metadata.json # Version info, model versions used
├── prompts/ # Versioned LLM prompts (consolidation, analysis, aggregation)
├── scripts/ # Pipeline orchestration (TypeScript)
├── site/ # Next.js app (reads from candidates/ at build time)
├── docs/ # Specs, roadmap, methodology
│ ├── ROADMAP.md
│ └── specs/
├── tasks/ # Tickets-as-code (active / backlog / archive / templates)
├── AGENTS.md # AI coding agent guide
└── .github/
├── copilot-instructions.md
└── prompts/ # Reusable agent prompts (create-spike, start-task, …)
pnpm install
npm run analyze -- <candidate-id> # fan out to all models in parallel
npm run aggregate -- <candidate-id> # produce aggregated.json
npm run site:build # static site build → site/out/npm run test # Vitest (pipeline + site unit tests)
npm run test:schema # JSON schema validation
npm run test:pipeline # pipeline integration tests
npm run test:site-build # full static export (runs site/prebuild + next build)
npm run test:site-smoke # post-build smoke check against site/out/
npm run lint # ESLint
npm run typecheck # tsc --noEmit| Document | Purpose |
|---|---|
docs/README.md |
Documentation index |
docs/ROADMAP.md |
Milestones and project plan |
docs/quick-start-zero-api.md |
End-to-end pipeline run without API calls (fictional candidates, testing) |
docs/specs/ |
Permanent design documents |
AGENTS.md |
AI coding agent instructions |
tasks/README.md |
How the tickets-as-code system works |
Start with AGENTS.md → check tasks/active/ → read the linked spec in docs/specs/ → implement → test → archive the task.
The editorial principles in docs/specs/analysis/ are not negotiable and must not drift during implementation. If a change seems to compromise them, open a spike to discuss — do not silently change behavior.
TBD. This project will be open-source with a license chosen before launch.
- French election-period communication rules apply to this site. A legal review is required before the official campaign period.
- This site does not endorse any candidate. It does not accept advertising. Funding sources, if any, will be publicly disclosed.
- All source materials used are public primary sources. Copyright of program documents belongs to their respective authors; this project reproduces them under fair-use for analysis and commentary.