# SpinFilter rubric

Version 1.3 · Run 1, 9 October 2026 (1.1 adds conventions from the Ward 19 independent check; 1.2, 12 October 2026: editor rulings on headings, present-tense advocacy and incumbents' votes, from Run 6; 1.3, 13 October 2026: the cross-ward rulings on headings that name commitments, work-with, bare list items, focus, intend, character pledges, reported speech, survey counting, opposed proposals, personal history, past candidacies, office sites, The Local, unnamed rival claims and ratings conventions, applied to every race). Applies to every race. The catalogue (`catalogue.json`) holds the ratings; this file holds the rules.

## 1. Feasibility ratings

Ratings judge whether the City could do something and what stands in the way, not whether it is a good idea. They are given to **proposals**, never to candidates.

| Rating | Chip | Meaning |
|---|---|---|
| **Realistic** | ● | Within the councillor's own office or council's routine power, at modest cost. Examples: constituency service, ward meetings, a motion asking for a report, parking rules on a local street. |
| **Possible but hard** | ◐ | Within the City's power, but needs a council majority plus new money, a long timeline, or the agreement of another body (including City agencies such as the TTC, or a school board). Show a cost figure where one exists. |
| **Outside City control** | → | Another government or body decides: the Province (rent rules, evictions, schools, GO and the Ontario Line, tolls on provincial highways, bike lanes that remove a traffic lane, election rules), Ottawa, the police board and Chief, Metrolinx, or the Ontario Land Tribunal on appeal. Council can only ask. |
| **Already exists** | ✓ | A current program, by-law or scheduled decision already does this. The promise is about keeping, funding or expanding it at the margin. |
| **Vague** | ∼ | No measurable commitment: no rule, program, amount, place or deadline is named. |

**Not rated** (?) is a status, not a rating: who decides could not be established from the sources read. Every Not rated entry is listed in the run report for research. It is shown on the page as "Not rated" so a reader is never told more than we know.

### Conventions (keep ratings consistent)

- An adopted study, or a pilot approved without funding, is **Possible but hard**, not Already exists.
- The TTC is a City agency, so fare and service proposals are **Possible but hard**; GO and the Ontario Line are **Outside City control**.
- Refusing a development application is **Outside City control** (the applicant can appeal to the provincial tribunal); zoning rules council writes itself are **Possible but hard**.
- A proposal is **Outside City control** only when a source read shows another body decides; otherwise it is Not rated.
- Unspecific goals are **Vague** whoever states them.
- A statement that makes two proposals is attached to both.
- Organizer pledges and yes/no surveys are recorded in the organizer's wording and are not rated.
- A general pledge with no measure ("safer streets", "more co-op housing") is **Vague**, even where a City program exists in the area.
- Withholding approvals on private applications ("no approvals until…") is refusing them: attach **Outside City control** (`refuse_over_zoning`) alongside any infrastructure-first entry.
- Initiating a ward-wide review or request is **Realistic**; implementing redesigns or capital works ward-wide is **Possible but hard**.
- At GO stations, City-side walkways are **Possible but hard**; new station entrances, platforms or a station hub are **Outside City control** (Metrolinx).
- A pledge to build affordable housing that names no land, program or amount is **Vague** (`affordable_housing_vague`), not `public_build_general`.
- Expanding an existing program at the margin is **Already exists** (e.g. more subway musician permits, a wider bubble zone under the existing by-law); a new program or a step change in scale is rated on its own.
- A targeted review or audit requested by motion is **Realistic** (`consultant_audit`); an outside line-by-line audit of every division, or a spending cut, is **Possible but hard**.

## 2. How ratings are assigned

1. **Rate the proposal, then attach candidates.** Every commitment claim is mapped to a catalogue entry (`catalogue_ids`). The same proposal carries the same rating in every race.
2. **Catalogue entries take precedence.** A race run uses the catalogue rating as it stands.
3. **New proposals**: add a catalogue entry (id, label, issue, rating, one-line reason, who decides, cost or "none found", sources, as-of date, `origin`), and list it as new in the run report.
4. **New evidence about an existing entry** (a law changes, a program launches, a source contradicts the reason): never change the rating silently. Add a `flags` item to the entry (date, what was found, source, suggested rating) and list it in the run report. The editor decides; when a rating changes, update `as_of`, keep the old rating in `history`, and re-check every race file that uses it.
5. **Cost**: an official figure if one exists (budget, staff report, agency estimate), else "none found". A candidate's own figure goes on the claim as `cost_stated`, never into the catalogue.

## 3. Commitment strength

Record commitments only as strongly as stated. Strength belongs to the claim (what the candidate said), not the catalogue entry.

| Value | Prose word | Typical wording |
|---|---|---|
| `will_deliver` | pledges | "I will…", "I will make…", "is committed to…", "the City will…" in their own platform, "I would ensure…" |
| `will_push_for` | will push for | "I will fight for / push for / advocate / champion / work to / work with…", "I'll prioritize…" |
| `would_advocate` | would advocate | "I would push / advocate / work with…", "I'd press…", platform headings phrased "Advocate for…" |
| `wants_to_explore` | wants to explore | "look at", "explore", "consider", "study" |
| `supports` | supports | a stance, "we need", "the City should", a listed platform item, a survey choice |
| `opposes` | opposes | an explicit no, "against", a survey "No" |
| `mentions` | names as a priority | a topic with no action attached |

Imperative list items with no "I will" whose verb is an advocacy verb ("Advocate for…", "Push for…", "Champion…", "Fight…", "Press…", "Demand…", "Pursue…", "Partner with…", "Work with…", "Prioritize…", "Defend…", "Stand firm against…", "Take action to protect … from the Province", "Keep advocating…") are `would_advocate`; e.g. "Prioritize faster responses to potholes" is `would_advocate`. Any other bare list item ("Support X", "Build X", "Raise X", "Commit to…", "Resolve to…") and gerund or noun platform items ("Championing…", "Rent control on all units") are `supports`; e.g. "Double RentSafeTO by-law officers" is `supports`. "We will push" counts as the candidate's own `will_push_for`.

Rulings that decide which commitments count as **firm** (`will_deliver` or `will_push_for`, shown as "n firm" on cards):
- A lead-in that directly introduces a list ("I will advocate for stronger municipal action to:") governs every item in it. Page-level framing ("my platform sets out the policies I will advocate for") does not make each item firm.
- A heading worded as a commitment that sits directly above a list governs every item in it, including third-person forms on the candidate's own site: "What is Denis Committed to Working on…" (`will_deliver`), "Four things Roy will push on from day one" (`will_push_for`).
- A heading that names the list as the candidate's commitments or promises ("My Commitments", "Michael's Commitments on Housing", "My Campaign Promises", "Key commitments") also governs it (1.3): plain items and "Work with…" items are `will_deliver`; advocacy-verb and "Prioritize…" items are `will_push_for`; "Support / Back…" items are `supports`; "Explore…" items are `wants_to_explore`. E.g. under "Michael's Commitments", "Reduce unnecessary red tape in housing permits" is `will_deliver` and "Advocate for stronger protections against renovictions" is `will_push_for`.
- A noun heading that does not name commitments or promises ("Value for Tax Dollars", "My Priorities", "Where I'll focus") does not govern; its items are coded by their own wording, so a gerund item such as "Continuing to fight for…" is `supports`. A present-tense advocacy heading ("What Amanda is fighting for") governs as `will_push_for`.
- Under any governing lead-in or heading, an item's own softer verb wins: "Study…" is `wants_to_explore`, "I will support…" is `supports`, items the candidate frames as "ideas for discussion" go no higher than `would_advocate`, and a "No" item is `opposes`.
- A "will" sentence that ends in a full stop above a list does not govern the list; only colon lead-ins and headings do.
- Present-tense first-person advocacy ("I am pushing for…", "I am advocating for…", "I continue to advocate…", "I work to…", "is working to…", "I am calling on…", "and prioritizing…" in the same sentence) is `will_push_for`.
- "I will support / I'll back X" is `supports`: a stance, not a pledge to act. "I will focus on X" is also `supports` (1.3): it names a priority, not an action.
- "I intend to…" is coded by its verb, below the firm line (1.3): "I intend to champion…" is `would_advocate`, "I intend to explore…" is `wants_to_explore`.
- "I will work with…" is `will_push_for`; "committed to working with…" is `will_deliver` (1.3). "I will work with all levels of government to explore…" is coded by its own verb, `wants_to_explore`.
- "I'll prioritize…" is `will_push_for`; "committed to…" and "my commitment is…" are `will_deliver`; a third-person "Name will…" on the candidate's own site reads as "I will".
- Character pledges ("I will listen, show up and deliver", "committed to serving") are `will_deliver` on `representation_vague`, which is Vague (1.3).
- "I would work with / push / advocate…" is `would_advocate`; "I would create / ensure / resist…" (an action in the councillor's own hands) is `will_deliver`. "The City will…" in the candidate's own platform is `will_deliver`.
- Reported speech is recorded at the strength of the words reported ("she said she would ask the Province to…" is `would_advocate`). A reporter's own summary with no words attributed ("her main pledge is…", "he proposes…" with no quote) is not the candidate's position: the row is held, not counted and not shown (1.3).
- Where an incumbent's campaign says nothing on a question, a recent council vote or motion of their own may place them in a Where-they-differ dimension, with the tag saying it is a vote or motion and its date (e.g. "Proposed a 10-cent fare rise in the 2026 budget (lost 3-20)"). Votes never feed the tally counts.

Firmness and feasibility are separate: a firm pledge on something Outside City control is shown with both chips.

**Counting (1.3).** The tally counts distinct catalogued proposals in the candidate's own words. A written survey comment counts; the survey's yes/no or multiple-choice answer never does, even when a comment is attached (record the comment on its own row, e.g. "Build Canada comment: …"). A proposal the candidate opposes is not counted and does not colour the rating bar; it stays on cards, issue lines and Where they differ. Held rows never count. A proposal the candidate both supports and opposes (on different points) is counted once, as a proposal.

**One proposal per row (1.3).** When one item makes several proposals with different verbs, record each proposal on its own row at its own strength ("Fix subway slow zones… and press for the new Line 2 trains…": `supports` and `would_advocate`). When one proposal is stated with two verbs, the row takes the stronger one.

## 4. Fact labels

Apply to facts: background, record, endorsements, figures a candidate cites, and claims about rivals.

| Label | When |
|---|---|
| **Confirmed** | An official record or a dated news report establishes it. |
| **Self-reported** | Only the candidate's own materials say so. |
| **Unverified** | Looked for and could not be checked (including aggregator-only facts). |
| **Disputed** | Sources conflict, or the claim's verdict is Misleading or Inaccurate. |

On the page a label appears only when the fact is not Confirmed. Positions and commitments are recorded from the candidate's own words; the evidence line shows the kind of source instead. A position found only in a rival's or a reporter's framing is not recorded as the candidate's position.

**What the page shows about a candidate's history (1.3).**
- A past candidacy or role is shown only when official results or dated news confirm it; an aggregator listing or a name match stays in the ledger (e.g. Ward 22: Lovell's 2025 NDP candidacy is shown from Elections Canada's official results; Morgan's 2022 listing is not, because no official source confirms the party or the match).
- Personal, legal and disciplinary history: the record line carries one dated clause for an Integrity Commissioner finding about the candidate during this term (since November 2022), saying if Council did not adopt it, or for a court conviction. Investigations without a charge, acquittals, allegations, family matters, a company's case and media disputes are held: not on the page and not on the sources page. E.g. "Integrity Commissioner found a Code breach in 2023; Council docked 10 days' pay."

## 5. Verdicts on figures and claims about rivals

| Verdict | Chip | Meaning |
|---|---|---|
| **Accurate** | ✓ | Matches the primary record. |
| **Mostly accurate** | ≈ | Close; or right but missing a caveat that matters; or supported only by a secondary source. |
| **Misleading** | ! | A real figure used in a way that gives a wrong impression (e.g. out of date but presented as current). |
| **Inaccurate** | ✕ | Contradicted by the primary record. |
| **Unverifiable** | ? | A record was looked for and none found. |

Internal statuses, never shown in Numbers checked: **Not checked** (source could not be opened or no search was possible) and **Opinion** (a view with no checkable fact). Long statements are split so each part carries its own verdict. Where a statement has two fair readings, rate the reading more favourable to the candidate. Claims about rivals cover other candidates in the race and the incumbent; statements about other politicians are checked as ordinary figures. A statement is a claim about a rival only if it names, or unmistakably points to, a candidate in the race ("the incumbent"); "choose the candidate who lives in the riding" names no one and is recorded as a slogan (1.3).

## 6. Source tiers

1. Official records: City Clerk, council decisions and votes (secure.toronto.ca), budgets, legislation, court decisions, Statistics Canada, school boards, agencies.
2. The candidate's own materials: website, written Q&As, survey answers in their words.
3. Dated news reports, and organizers' pages for their own surveys or events.
4. Aggregators (The Local's listings and candidate pages, WardWatch, Wikipedia, Ground News): leads only. A fact found only here is Unverified.

The Local's dated, reported features are dated news (tier 3). An incumbent's councillor-office site may stand in for a campaign platform when the candidate has no readable campaign platform; the evidence line says "Councillor's office site" and the method line says so (1.3).

## 7. Tier 3 lighter profile

For Wards 2, 6, 7, 8, 9, 12, 15, 16, 17 (run three to a session):

- **Includes**: the certified list with websites; for each candidate their own site and one common Q&A or questionnaire; top 3 commitments rated via the catalogue; up to 4 contested issues with one line each; Where they differ; record and endorsements one line each; engagement count; incumbents' key council votes (at most 5) and 2022 promises vs delivery in one line; claims about rivals checked; at most one figure per candidate checked.
- **Leaves out**: secondary platform pages, past-campaign archaeology, full survey transcriptions (link instead), news trawls beyond the race's main local outlet.
- **Checks**: independent check of every summary and rating and a sample of 20 one-liners.
- Same schema, same limits, same page. The race file sets `"tier": 3`, and the method line on the page says the profile is lighter.
