# The prediction-compilation prompt (parameterised)

A reusable research prompt that turns **a list of people** into **a verified, dated, source-linked
prediction catalogue** in the schema used by The Prediction Ledger.

- Executable copy: `apps/web/src/lib/promptTemplate.ts` (`buildPrompt(options)`)
- Interactive builder: the **Compile** panel on the site
- Edge runner: `POST /api/compile` (Gemini primary, Groq fallback)
- Validator: `node scripts/verify-data.mjs`

---

## 1. Parameters

| Placeholder | Type | Notes |
| --- | --- | --- |
| `{{PEOPLE}}` | newline list | `Name — Organisation`. One per line. Keep organisations current as of `{{AS_OF}}`; prefer the roster format in `docs/people/current-key-ai-tech-folks.md`. |
| `{{AS_OF}}` | `YYYY-MM-DD` | The evidence cutoff. Verdicts are only valid at this date. |
| `{{MAX_PER_PERSON}}` | integer | 3–5 is the useful band. More produces weaker, repetitive records. |
| `{{DOMAINS}}` | list | Default: all nine. Narrow for a themed sweep. |
| `{{LENS}}` | enum | `all` · `capability` · `society` · `capital` |
| `{{FORMAT}}` | enum | `json` (ingestible) or `markdown` (readable) |
| `{{STRICTNESS}}` | enum | `standard` or `strict` (strict drops secondary-only quotations) |
| `{{AUDIENCE}}` | string | E.g. "a general but sceptical reader", "a policy analyst". |
| `{{EXISTING}}` | text | Already-logged quotes/ids to avoid duplicating. |

Domain ids: `models`, `compute`, `work`, `science`, `robotics`, `capital`, `policy`, `security`,
`openness`.

---

## 2. The prompt

Copy everything between the rules. Replace each `{{PLACEHOLDER}}`.

---

You are a forensic research analyst compiling a verified prediction ledger. You are not a
commentator and you are not a summariser. Your output is an evidence artefact: every claim must be
traceable to a dated, linkable source, and every grade must be defensible to a sceptical editor who
will try to falsify it.

# TASK

Compile up to {{MAX_PER_PERSON}} public, dated, checkable predictions for each person below, as of
{{AS_OF}}. Lens: {{LENS}}. Domains in scope: {{DOMAINS}}.

## People

{{PEOPLE}}

# NON-NEGOTIABLE RULES

1. **Verbatim only.** The `quote` field must reproduce the speaker's words exactly as published,
   with original punctuation and hedging. Never paraphrase inside `quote`. If the only available
   rendering is a translation or an outlet paraphrase, say so in the source's `establishes` field
   and set `kind` to `reporting`.
2. **One claim per prediction.** Split compound statements into separate records with their own
   horizons.
3. **A prediction needs a future referent at the time it was made.** Present-tense claims are
   admissible only when they carry an implied testable consequence; extract that consequence and
   date it. Otherwise exclude the claim.
4. **Date the statement, not the article.** Use the publication date of the earliest primary source.
   If a podcast was recorded before publication and the recording date is disclosed, use it and note
   the discrepancy.
5. **Horizons.** `exact` only for a specific date or bounded year; `range` for a stated window;
   `open` when no end date is given. Convert relative phrasing ("in five years") into absolute dates
   from the statement date and keep the original phrasing in `label`.
6. **Falsifiability.** Set `falsifiable: true` only if you can name the observation that would
   settle the claim. If no such observation exists, set it false and explain why. Do not invent a
   test the speaker did not imply.
7. **No score for the future.** If the horizon has not elapsed at {{AS_OF}}, the verdict must be
   `open` unless the claim is already demonstrably settled by evidence. Never award `validated` or
   `missed` to a deadline that has not arrived. The single exception is a claim whose delivery
   mechanism has been dismantled; then add `settledEarly` with the explanation.
8. **Grade on published evidence.** Use filings, peer-reviewed results, official statistics,
   independent evaluations, dated reporting. A vendor's claim about its own product is evidence of
   the vendor's claim, not of the outcome.
9. **Sources.** At least two sources where they exist, and at least one `primary` source. Separate
   the outlet that *reports* a claim from the venue that *made it available*. Never cite a page you
   have not verified contains the quotation.
10. **No invented URLs, titles or dates.** If you cannot verify support, drop the prediction. Fewer,
    harder records are the correct output.
11. **No strawman and no whitewash.** Prefer the claim the person repeated over both their most
    extreme and their softest available sentence.
12. **Distinguish influence from authority.** Record roles as they were on the statement date. Do
    not carry a title across a departure, acquisition or reorganisation.

# VERDICT POLICY

- `validated` — independent evidence shows the claim held, or the named trend is measurably holding.
- `partial` — direction right; magnitude, scope or timing materially wrong.
- `contested` — credible evidence points both ways, measurement is disputed, or the claim holds only
  inside the speaker's organisation.
- `missed` — the stated date passed, or the mechanism was dismantled, without the claim landing.
- `open` — horizon not reached at {{AS_OF}}.
- `unfalsifiable` — no possible observation could settle it as worded.

# SOURCE HIERARCHY

1. `primary` — speaker's own writing, transcript, keynote, filing, official company post.
2. `data` — benchmarks, independent evaluations, official statistics, price lists, download counts.
3. `reporting` — dated independent coverage quoting the person directly.
4. `analysis` — commentary, retrospectives, trackers. Never sufficient alone for a grade.

# OUTPUT

Return {{FORMAT_INSTRUCTION}} matching this schema exactly. Use `null` rather than inventing a
value. Keep `claim` under 45 words, `verdict_note` under 90, and each `establishes` to one sentence.

```json
{
  "person_id": "stable-slug",
  "name": "as written in the roster",
  "org": "organisation at the time of the statement",
  "predictions": [
    {
      "id": "person-slug.short-claim-slug",
      "person_id": "stable-slug",
      "quote": "verbatim quotation",
      "claim": "neutral restatement",
      "domain": "models | compute | work | science | robotics | capital | policy | security | openness",
      "venue": "publication, event, podcast or filing",
      "made_on": "YYYY-MM-DD",
      "horizon": { "kind": "exact | range | open", "start": "YYYY-MM-DD | null", "end": "YYYY-MM-DD | null", "label": "2028 – 2030" },
      "falsifiable": true,
      "stated_probability": "0-1 | null",
      "verdict": "validated | partial | contested | missed | open | unfalsifiable",
      "verdict_note": "2–4 sentences citing evidence",
      "settledEarly": "only when grading before the horizon because the mechanism was dismantled",
      "revisionOf": "id of the earlier version, if this is a revision",
      "tags": ["3-6 lowercase tags"],
      "sources": [
        {
          "label": "short handle",
          "publisher": "publisher or author",
          "title": "exact page title",
          "url": "https://…",
          "date": "YYYY-MM-DD | null",
          "kind": "primary | reporting | analysis | data",
          "establishes": "what this source specifically proves"
        }
      ]
    }
  ],
  "notes": "records deleted during self-check, and why"
}
```

Write for {{AUDIENCE}}. Assume the reader is intelligent, sceptical, and will click the sources. No
marketing language. No editorialising inside `claim`.

# SELF-CHECK BEFORE YOU ANSWER

For every record, verify: the quotation appears word for word in the cited source; the date is the
statement date; the horizon is consistent with the quotation's own phrasing; the verdict is
permitted by {{AS_OF}} and backed by a cited observation; nothing is inferred that the source does
not support. Delete any record that fails and list it under `notes`.

# ALREADY LOGGED (do not duplicate)

{{EXISTING}}

---

## 3. Running it

### Gemini (primary)

```bash
curl -s "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=$GEMINI_API_KEY" \
  -H 'content-type: application/json' \
  -d "$(jq -n --rawfile p prompt.md '{contents:[{parts:[{text:$p}]}],generationConfig:{temperature:0.2,responseMimeType:"application/json"}}')"
```

Low temperature matters: this is extraction, not ideation. Prefer a model with search/grounding
enabled, and treat every URL it returns as unverified until fetched.

### Groq (fallback / cheap sweeps)

```bash
curl -s https://api.groq.com/openai/v1/chat/completions \
  -H "authorization: Bearer $GROQ_API_KEY" -H 'content-type: application/json' \
  -d '{"model":"llama-3.3-70b-versatile","temperature":0.2,"response_format":{"type":"json_object"},"messages":[{"role":"user","content":"<rendered prompt>"}]}'
```

### Via the site

`POST /api/compile` with `{ "people": ["Name — Org"], "maxPerPerson": 4 }`. The endpoint renders the
same prompt server-side, calls Gemini then Groq, and returns candidates **plus** the rendered
prompt. Candidates are never merged into the catalogue automatically.

## 4. Validation and merge

1. Run the validator: `node scripts/verify-data.mjs`. It enforces the no-score-for-the-future rule,
   source `kind` rules, https URLs, ISO dates, unique ids, acyclic revisions and more.
2. Fetch every URL. A model that hallucinates one source has probably hallucinated others.
3. Merge accepted records into `apps/web/src/data/predictions-a.ts` (frontier labs) or
   `predictions-b.ts` (science, evaluation, compute, capital), then `npm run build:data`.
4. If a verdict changes an existing record, add `revisionOf` rather than editing history.

## 5. Worked example (one record, real)

```json
{
  "id": "amodei-90-percent-code",
  "person_id": "amodei",
  "quote": "I think we’ll be there in three to six months—where AI is writing 90 percent of the code. And then in twelve months, we may be in a world where AI is writing essentially all of the code.",
  "claim": "By September 2025 AI would write 90% of software code; by March 2026, essentially all of it.",
  "domain": "work",
  "venue": "Council on Foreign Relations, CEO Speaker Series",
  "made_on": "2025-03-10",
  "horizon": { "kind": "exact", "start": null, "end": "2026-03-10", "label": "90% by Sept 2025 · ~all by Mar 2026" },
  "falsifiable": true,
  "verdict": "contested",
  "verdict_note": "Inside Anthropic the number was reported as met; industry-wide measurement put AI-authored code nearer 25–40% in 2026, and Amodei later called 90% “a very weak criterion”. The literal claim held in one company, not in the industry it implied.",
  "tags": ["coding", "labour", "agents"],
  "sources": [
    { "label": "CFR transcript", "publisher": "Council on Foreign Relations", "title": "CEO Speaker Series With Dario Amodei of Anthropic", "url": "https://www.cfr.org/event/ceo-speaker-series-dario-amodei-anthropic", "date": "2025-03-10", "kind": "primary", "establishes": "Full transcript and exact wording." },
    { "label": "Forbes", "publisher": "Forbes", "title": "Dario Amodei Doubled Down On His AI Jobs Warning", "url": "https://www.forbes.com/sites/kolawolesamueladebayo/2026/02/21/dario-amodei-doubled-down-on-his-ai-jobs-warning-heres-whats-different-now/", "date": "2026-02-21", "kind": "analysis", "establishes": "Inside-Anthropic success versus 25–40% industry-wide." }
  ]
}
```

Note what makes this record usable: the quotation keeps "I think" and "may"; the claim restates the
timeline without strengthening it; the verdict is neither the flattering nor the punitive reading;
and the contested grade names the scope in which each side is true.

## 6. Failure modes, and their fixes

| Failure | Symptom | Fix |
| --- | --- | --- |
| Quote laundering | A news paraphrase appears inside `quote` | Require the transcript; downgrade the source kind |
| Timeline inflation | "In five years" becomes "by 2031" without arithmetic | Keep relative phrasing in `label`; recompute from `made_on` |
| Hindsight grading | An open claim is marked `missed` | Validator rejects it |
| Definition drift | The date moves but the definition does not | Tag `moved goalposts`; keep both records |
| Vendor evidence | A supplier is cited as independent proof of its own market | Exclude vendor metrics from `validated` |
| Selection bias | Only the wildest quote is used | Rule 11 requires the claim the person repeated |
| Fake authority | A non-role is asserted ("chief scientist") | Copy titles from the roster doc, with dates |

## 7. Versioning

The prompt is versioned with the schema. If you change a rule, change
`apps/web/src/lib/promptTemplate.ts`, the validator, and this document in the same commit, and note
the change in `docs/predictions/methodology.md`. A prompt that drifts from its validator produces a
catalogue that cannot be defended.
