# P1 — Proposal Extraction Prompt

*Run in a fresh claude.ai chat with web access. Paste this prompt, then the candidate roster, then name the ONE domain to extract. Output is the attribution map (Schema 2): what each candidate proposes in this domain, attributed, with sources. This stage KEEPS candidate names — de-identification happens in the next stage. Save output as `domains/<domain>/attribution.json`.*

---

## Your task

Extract what candidates in the 2026 New Mexico primary actually propose in ONE policy domain (named at the bottom). You are a faithful stenographer of stated positions — not an evaluator. Produce an accurate, sourced record of what each candidate says they would do.

## Whose proposals

Only candidates for offices with authority over this domain. The roster (pasted below) tags each office with the domains it can act on — extract only from offices tagged for the named domain. Include candidates of all parties and all office levels, **including federal candidates** (their proposals operate through federal levers; that distinction is handled later, not here). Work only from the roster; do not add anyone not listed.

## What to capture per candidate

For each candidate with any stated position in this domain:

- **Each distinct proposal**, broken out separately (a compound position = multiple proposals).
- **The candidate's framing** — a faithful paraphrase of how they justify it, in their own terms. Capture this richly. For vague/posture statements especially ("tough on crime," "common-sense approach"), preserve enough of their actual wording that the position is meaningful on its own — this framing may be the ONLY content that represents the position downstream, so do not flatten it to a bare slogan.
- **Source** — a working URL for every proposal (campaign site, candidate questionnaire, debate, interview, voter guide).

Where a candidate has no stated position in this domain, record them as "no stated position found" — do NOT infer positions from party, record, or background.

## Sourcing rules

- Prefer the candidate's own words. Every proposal needs a real, checkable source URL. A proposal you cannot source does not go in.
- If a source is stale (e.g. from a prior election) or only implied, flag it explicitly rather than presenting it as a current, explicit position.
- Faithfulness over completeness. If they didn't say it, it isn't here.

## Hard constraints

- **No evaluation.** Do not assess whether anything would work or is good policy. That is a later, separate stage.
- **No editorializing.** Neutral paraphrase only — do not characterize proposals as tough/soft, progressive/conservative, realistic/unrealistic.
- **Equal care across parties.** Extract every candidate's positions with identical diligence and neutrality.

## Output format

A JSON array. Each element is one proposal:

```json
{
  "proposal": "neutral statement of the specific thing the candidate proposes",
  "candidate": "Full Name",
  "office": "office sought (with district/county if relevant)",
  "party": "DEM | REP | other",
  "framing": "faithful paraphrase of how they justify it, in their terms — rich enough to stand alone for posture items",
  "source_url": "working URL",
  "source_flag": "none | stale | implied  (note if not a current explicit statement)"
}
```

At the end, add two plain lists: candidates checked but with **no stated position found** in this domain, and the **sources checked**. Do not assign IDs or merge duplicates — that happens in the next stage. One candidate proposing several things = several array elements.

---

**DOMAIN TO EXTRACT:** _[name one domain here]_

**ROSTER:** _[paste the candidate roster below]_
