Write Resolution Criteria That Hold Up
Most bad forecasts are bad questions. "Will Waymo expand to London?" has no answer, because expand could mean a press release, a testing permit, or a paying passenger, and the three resolve months apart. Give the agents a question that can only resolve one way and the forecast gets sharper immediately.
forecast reads four columns beyond question, and uses all of them:
| Column | What it does |
|---|---|
resolution_criteria | The precise test for YES. Pass it verbatim, fine print included. |
resolution_date | When the question settles. Anchors the whole research window. |
background | Context the agents would otherwise have to rediscover per row. |
market_creation_date, market_price | For questions tied to Polymarket, Kalshi or Metaculus. Include the as-of date of the price. |
Self-contained questions need none of these. "When will Anthropic IPO?" is already unambiguous. The columns earn their keep as soon as the question involves a threshold, a source of truth, or a deadline.
The three failure modes
Ambiguous trigger. Decide what event counts, and name the document or announcement that would prove it. Compare "Will Alphabet report Waymo separately?" against the published version, Will Alphabet break out Waymo's financial results as a separate reporting segment by 2027?, which names the filing that settles it.
Missing deadline. Almost every real question is "by when", not "ever". Will Anthropic make a formal public ASL-4-equivalent determination by May 2027? puts the date in the question text, so it survives being copied into a spreadsheet without its metadata.
Paraphrased fine print. If the question comes from a prediction market, copy the criteria across exactly. Markets carry edge cases that decide close calls, and a tidied-up summary silently drops them. This is the single most common reason a forecast disagrees with a market for the wrong reason.
Add FutureSearch to Claude Code if you haven't already:
claude mcp add futuresearch --scope project --transport http https://mcp.futuresearch.ai/mcp
Paste the criteria in and ask Claude to keep them intact:
Forecast this. Pass the resolution criteria through verbatim, don't
summarise them:
Question: Will federal autonomous vehicle legislation establishing
NHTSA authority over automated driving systems be signed into law
by 31 January 2027?
Resolution criteria: Resolves YES if a bill is signed by the
President on or before 2027-01-31 that grants NHTSA explicit
statutory authority over automated driving systems. Executive
orders, agency rulemaking and state law do not count.
Resolution date: 2027-01-31
Claude passes them as columns:
Tool: futuresearch_forecast
├─ data: [{"question": "Will federal autonomous vehicle legislation...",
│ "resolution_criteria": "Resolves YES if a bill is signed...",
│ "resolution_date": "2027-01-31"}]
└─ forecast_type: "binary"
→ Submitted: 1 row for binary forecasting.
Add the FutureSearch connector if you haven't already. Then paste the question and its criteria together, and say:
Forecast this, and pass the resolution criteria through verbatim rather than summarising them.
Go to futuresearch.ai/app. If you are forecasting one question, paste the question and its resolution criteria into the prompt together.
For a batch, upload a CSV with question, resolution_criteria and resolution_date columns. Every column you provide is used.
pip install futuresearch
export FUTURESEARCH_API_KEY=your_key_here # Get one at futuresearch.ai/app/api-key
import asyncio
import pandas as pd
from futuresearch.ops import forecast
questions = pd.DataFrame([
{
"question": (
"Will federal autonomous vehicle legislation establishing NHTSA "
"authority over automated driving systems be signed into law by "
"31 January 2027?"
),
"resolution_criteria": (
"Resolves YES if a bill is signed by the President on or before "
"2027-01-31 that grants NHTSA explicit statutory authority over "
"automated driving systems. Executive orders, agency rulemaking "
"and state law do not count."
),
"resolution_date": "2027-01-31",
"background": (
"Several AV bills have been introduced since 2017; none have "
"passed both chambers."
),
},
])
async def main():
result = await forecast(input=questions, forecast_type="binary")
print(result.data[["probability", "rationale"]])
asyncio.run(main())
For a market-sourced question, add the market columns so the agents can see what the crowd already thinks and reason about the gap:
questions = pd.DataFrame([
{
"question": "Will the Fed hold rates at the July 2026 meeting?",
"resolution_criteria": "<paste the market's criteria verbatim>",
"resolution_date": "2026-07-29",
"market_creation_date": "2026-01-15",
"market_price": "0.62 as of 2026-06-30",
},
])
Batch-level instructions that apply to every row go in context rather than being repeated per row:
result = await forecast(
input=questions,
forecast_type="binary",
context="Resolve all questions against SEC filings, not press coverage.",
)
Check your work
Read the rationale. If the agents spent their reasoning arguing about what the question means rather than what will happen, the criteria were not tight enough. That is the cheapest signal you get, and it shows up on every row.
Built with FutureSearch. See the forecast documentation for all input columns and output formats. Related guides: Turn Claude into an Accurate Forecaster, Find Profitable Prediction Market Trades, Forecast Conditional Scenarios. More worked examples in published forecasts.