Forecast a Decision: Grant Funding at Three Levels
decision forecasts one outcome under each option of a decision. The decision here is how much to donate to an open funding proposal, and the alternatives are $0, an intermediate amount, and the full remaining ask. All alternatives are researched jointly, so the gaps between them price the money rather than reading as three unrelated forecasts.
Use decision whenever the "if" is something someone decides, whether that is you, your organization, a regulator or a government. Use a conditional forecast when nobody decides it and you can only wait and see.
The question
Every row asks the same outcome question about a different organization:
By December 31, 2028, will a named outside actor take a costly action, documented in public records, that stakes something on this project's work produced after August 1, 2026?
The alternatives column holds that organization's three funding levels: $0, an intermediate amount, and the amount remaining to meet its full goal as of July 31, 2026. The $0 branch is the unconditional baseline.
Run it
import asyncio
import json
from pandas import DataFrame
from futuresearch.ops import decision
OUTCOME = (
"By December 31, 2028, will a named outside actor take a costly action, "
"documented in public records, that stakes something on this project's "
"work produced after August 1, 2026?"
)
proposals = DataFrame([
{
"organization": "ControlAI",
"question": OUTCOME,
"grant_size": json.dumps(["$0 (no grant)", "$250k", "$1M"]),
"resolution_criteria": (
"250 individually listed sitting parliamentarians from non-US G7 "
"legislatures or the European Parliament on ControlAI's public "
"campaign statements by end of 2028."
),
},
{
"organization": "Transluce",
"question": OUTCOME,
"grant_size": json.dumps(["$0 (no grant)", "$500k", "$1.96M"]),
"resolution_criteria": (
"Two distinct frontier labs or government AI safety institutes "
"document use of Transluce tooling in official model evaluations, "
"with the use occurring after August 1, 2026."
),
},
])
async def main():
result = await decision(
input=proposals,
alternatives_field="grant_size",
# The published run passed no context. This is where your own facts go.
context="We are a foundation giving about $12M a year. We fund early, we announce grants publicly, and no other funder is currently evaluating these proposals.",
intervention=(
"Assume the grant is announced publicly at the time it is made, that "
"no other funder backfills a declined application, and that the "
"decision is made within the next quarter."
),
)
print(result.data[["organization", "probabilities", "rationale"]])
asyncio.run(main())
context is where the facts the web cannot supply go, including facts about you. It applies to every proposal in the call. The results below are from the published run, which did not pass one.
intervention replaces the default assumptions wholesale, so state the full set rather than only the one you want to change.
Results
Five of the eighteen proposals, with the probability of the 2028 outcome under each funding level:
| Organization | Partial | Full ask | p($0) | p(partial) | p(full) |
|---|---|---|---|---|---|
| Tarbell Center for AI Journalism | $50k | $171k | 78 | 79 | 81 |
| ControlAI | $250k | $1M | 39 | 54 | 70 |
| Transluce | $500k | $1.96M | 21 | 25 | 31 |
| GPAI Policy Lab | $250k | $2.47M | 11 | 16 | 27 |
| PauseAI US | $100k | $450k | 7 | 10 | 15 |
Tarbell's outcome is close to settled before any money moves, so the full ask buys 3 points. ControlAI's buys 31.
Going deeper
- Long-form analysis: Forecasting the outcomes of philanthropic grants
- Published output: all 18 proposals at three funding levels
- Reference: decision