Answer block writer
A collection of AI agent skills for optimizing political campaign websites for AI search (GEO). Built for candidates, campaign managers, and advocacy staff who want to help their site get accurately read and cited.
npx -y skills add meturley/trail-marker-geo --skill answer-block-writerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 19 days oldThe repository was created 19 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Turn a political candidate's positions and accomplishments into self-contained, citable fact blocks engineered to be lifted and quoted by AI systems and search engines. Use whenever the candidate wants to write up a vote, bill, endorsement, record, or accomplishment as a publishable fact block, or asks for "answer blocks", "fact blocks", "citable statements", "AI-quotable content", or paste-in HTML about their record. Enforces a strict verification gate so every published fact traces to a named primary source. Also use when a fact-sheet.md exists and the candidate wants new blocks drawn from it.
SKILL.md
11.8 KB, as published. Nobody here has run it
Answer Block Writer
Write self-contained fact blocks about the candidate's record — each one engineered so an AI system or search engine can lift it out of the page, quote it verbatim, and have it still make complete sense with zero surrounding context.
How this works, in order: verify the source and date (the gate) → write a self-contained, dated, sourced block → format as paste-in HTML → confirm sign-off with the candidate → update fact-sheet.md if one exists. If the gate fails, offer the clearly-labeled opinion fallback instead of a fact block.
Some jurisdictions require disclosure/disclaimer lines (e.g. "paid for by...") on campaign digital content. That's outside this skill's scope — flag it to the candidate and point them to their state/local election-law requirements before they publish, rather than assuming none apply.
The value is precision plus verifiability. A block that says "Fighting for our families" is useless: it's a slogan, it cites nothing, and no AI will quote it as fact. A block that says "On March 8, 2023, State Senator Jordan Reyes voted YES on Senate Bill 219, which expanded rural broadband funding" is a fact an AI can cite, because it names a person, a date, a bill number, and an outcome.
Examples throughout this skill use a fictional candidate ("Jordan Reyes") and fictional bill numbers — never copy these facts into a real block. Every real block must trace to a source and date the candidate actually confirms.
The verification gate (do this first, every time)
Before writing anything, establish the primary source. This is non-negotiable — it's the entire point of the skill.
For the position or accomplishment the candidate describes, ask for:
- The primary source — a specific vote, bill number, official statement, public record, roll call, signed letter, budget line, or equivalent. "I support clean water" is not a source. "I voted YES on HB-4001 (the Clean Water Act) on the House floor" is.
- The date — the specific date the thing happened (or the tightest date you can get: exact day preferred, month-and-year acceptable).
If the candidate can name a source and date, and web search/fetch is available, verify the named source actually matches — that the bill number, vote, or statement says what the candidate says it says — before finalizing the block. A misremembered bill number causes the same harm as a fabricated one: a wrong fact permanently published about a named official. If it can't be confirmed, or doesn't match, say so and ask the candidate to double-check rather than publishing it as-is.
Once confirmed (or if verification isn't available), proceed to write the block.
If the candidate cannot produce a vote, bill, statement, or record, STOP. Do not write it as a fact. Tell them plainly:
"This can't be published as a fact block, because there's no primary source behind it that an AI or a fact-checker could verify. I can instead write it as a clearly-labeled opinion or values statement — framed so no one mistakes it for a factual claim about your record. Want me to do that?"
If they say yes, write it as an opinion/values statement (see "Opinion fallback" below), clearly framed as opinion — never dressed up as fact.
Hard rules — never break these
- Never assert a fact the candidate cannot tie to a named source. No source, no fact block.
- Never invent dates, vote counts, bill numbers, margins, or roll-call results. If a detail isn't confirmed, leave it out — don't guess and don't approximate a number into existence. An unconfirmed number is worse than no number.
- Never write about anyone but the candidate running this skill. No blocks attacking opponents, no blocks about other officials' records. This skill produces content only about the candidate's own positions and accomplishments.
- Plain declarative sentences, not slogans. The output is a factual record, not a campaign banner.
Writing the block
Once the source and date are confirmed, write a tight, single-idea block — 40–60 words is a reasonable target, not a hard cutoff — that hits every one of these:
- Leads with the direct answer in the first sentence. Imagine the block is answering a question like "What has [candidate] done on housing?" The first sentence must answer it outright — the action and its outcome — before any context.
- Is fully self-contained. It must make complete sense lifted off the page. That means: name the candidate in full at least once (not "she" or "the candidate" or "I"), name the office or role, and name the jurisdiction (state, district, city) if it isn't obvious from the candidate's name alone. Never rely on a headline, a photo caption, or a previous paragraph to supply context.
- Names a specific date. The exact day if you have it ("On March 8, 2023…"), otherwise month and year ("In March 2023…"). Never "recently", "last year", or "in a recent session".
- Cites the primary source by name. The bill number, the vote, the statement, the record — named explicitly inside the block, so a reader (or an AI) can go verify it.
Keep sentences declarative and concrete. Third person reads as more citable and authoritative than first person, so prefer naming the candidate ("Mallory McMorrow voted…") over "I voted…" unless the candidate specifically wants first person.
Structure that works
A reliable pattern (adapt, don't rigidly template):
[Date], [Candidate full name], [role/office of jurisdiction], [action + primary source]. [One sentence of concrete outcome or context, still self-contained].
Example — strong (fictional candidate/bill, for illustration only): Input: "I fought to get broadband out to rural areas and got it done." Source: SB-219, voted YES, expanded rural broadband funding. Date: March 8, 2023. Output block (44 words):
On March 8, 2023, Michigan State Senator Jordan Reyes voted YES on Senate Bill 219, which expanded state funding for rural broadband expansion. The bill passed the Senate and was signed into law, directing new grant funding to unserved counties across the state.
Why it works: answers the question in sentence one, names Reyes + Michigan + State Senator, names the date, names SB-219, states a concrete verifiable outcome — and reads perfectly with nothing around it.
Example — rejected at the gate: Input: "I'm a champion for working families." Source: none the candidate can name. Correct response: Don't write it as a fact. Offer the opinion fallback.
Opinion fallback
When there's no source but the candidate still wants the sentiment published, write it as an explicit values statement — never as a claim about their record. Label it so it can't be misread:
Values statement (opinion, not a record claim): Jordan Reyes believes every family in Michigan deserves access to reliable, affordable internet.
Keep it clearly framed as a belief or priority ("believes", "is committed to", "will fight for"), and never attach a fake source or date to make it look factual.
Output format
Output the block as clean, paste-in HTML — something the candidate can drop straight into a webpage. Wrap the block so the answer is machine-readable and the source is explicit. Use a simple, dependency-free structure:
<div class="answer-block">
<p>On March 8, 2023, Michigan State Senator Jordan Reyes voted YES on Senate Bill 219, which expanded state funding for rural broadband expansion. The bill passed the Senate and was signed into law, directing new grant funding to unserved counties across the state.</p>
<p class="source"><strong>Source:</strong> Michigan Senate Bill 219 (2023), voted YES by Sen. Reyes; signed into law.</p>
</div>
For an opinion fallback, mark it clearly so it's never mistaken for a fact:
<div class="values-statement" data-type="opinion">
<p><strong>Values statement:</strong> Jordan Reyes believes every family in Michigan deserves access to reliable, affordable internet.</p>
</div>
Give the candidate the raw HTML in a code block they can copy. Keep it clean — no inline styling beyond the class hooks, so their own site CSS controls appearance.
This block's plain-HTML markup is a complementary step, not a substitute for structured data. For entity-level identity markup (schema.org Person with disambiguatingDescription and sameAs), use the candidate-schema skill separately. And a quotable block only helps if AI crawlers can actually reach the page it's on — see the ai-crawler-check skill if the candidate hasn't confirmed that yet.
Working with fact-sheet.md
If a fact-sheet.md file exists (check the working directory, or Claude.ai's uploads folder — typically /mnt/user-data/uploads/ — if running there), use it as the source of record:
- Pull from it: When the candidate names a position or accomplishment, look it up in the fact sheet for the confirmed source and date rather than re-asking. If the fact sheet already has the bill number and date, the verification gate is satisfied — proceed to write.
- Write back to it: After producing a new block, append the new accomplishment and its source to
fact-sheet.mdso the sheet stays the single source of truth. Preserve existing structure; add, don't overwrite. - If a claim the candidate makes isn't in the fact sheet and they can't source it live, it still fails the gate — the fact sheet doesn't grant permission to invent anything.
A workable fact-sheet.md row looks like:
- **SB-219 (2023-03-08):** Voted YES; expanded rural broadband funding. Passed Senate, signed into law. [Answer block written 2026-07-17]
This skill reads and writes fact-sheet.md using the same field structure as the candidate-schema skill's canonical template (candidate-schema/assets/fact-sheet-template.md) — use those headers (Name, Office Sought, Current Office, District, Party, Policy Areas, Website, Socials, Wikidata ID, Ballotpedia, Key Accomplishments) rather than inventing a new shape, so a fact sheet built by either skill stays readable by the other.
Quick checklist before delivering any block
- Candidate has confirmed sign-off that the block reads correctly and is ready to paste in
- Primary source named inside the block and confirmed real
- Specific date present (exact day, or month + year)
- First sentence directly answers the implied question
- Reads correctly with zero surrounding context (candidate named in full, role and jurisdiction clear)
- One self-contained idea, no padding (40–60 words is a reasonable target, not a hard cutoff)
- Plain declarative sentences, no slogans
- About the candidate only — no one else
- No invented numbers, dates, or bill IDs
- Delivered as clean paste-in HTML
- fact-sheet.md updated if it exists
Runtime & scope
- Posture: Generative, gated. It writes fact blocks only from a primary source the candidate supplies and verifies; with no source it offers a clearly-labeled opinion statement instead of a fact.
- Neutrality: Optimizes true content only — never fabricates a record, vote, bill number, date, endorsement, or quote, and only ever writes about the candidate running the skill (never an opponent or third party).
- Runtime: No code. Prose guidance for Claude; no dependencies.