A forecast on a binary, multi, numeric, or date question. Revisions are new records with the same subject uri; the full trail is retained and used for time-weighted scoring. Appviews select the payload matching the cid-pinned question type and reject records with conflicting typed payloads.
tid
Timestamp-based ID
Properties
createdAt
string
datetime
Required
An RFC 3339 formatted timestamp.
date
ref
#dateForecast
Optional
Point and optional quantile forecast for a date question.
multi
ref
#multiForecast
Optional
Probability mass for a multi question. Appviews require one entry per question option id, unique ids, and a total of 100.
numeric
ref
#numericForecast
Optional
Point and optional quantile forecast for a numeric question.
probability
integer
Required
Percent probability of YES for binary questions. 0 and 100 are permitted but brave. Integer by design (matches Metaculus/Manifold/Kalshi UX; calibration math is fine at integer precision; nuance lives in the forecast trail over time, not in a single value). If extreme-tail precision is ever needed, add an optional logOdds field; do not change this one. The field remains required for Lexicon evolution compatibility. Writers of multi, numeric, and date forecasts MUST set it to 50; appviews MUST ignore it when a typed payload is present. See docs/lexicon-evolution.md.
minimum: 0maximum: 100rationale
string
Optional
Optional short reasoning. Public, attached to the forecaster's track record.
maxLength: 3000 bytesmaxGraphemes: 300 graphemessubject
ref
com.atproto.repo.strongRef
Required
The question being forecast (uri + cid). The cid pins the exact question version this forecast was made against.
View raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"subject",
"probability",
"createdAt"
],
"properties": {
"date": {
"ref": "#dateForecast",
"type": "ref",
"description": "Point and optional quantile forecast for a date question."
},
"multi": {
"ref": "#multiForecast",
"type": "ref",
"description": "Probability mass for a multi question. Appviews require one entry per question option id, unique ids, and a total of 100."
},
"numeric": {
"ref": "#numericForecast",
"type": "ref",
"description": "Point and optional quantile forecast for a numeric question."
},
"subject": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "The question being forecast (uri + cid). The cid pins the exact question version this forecast was made against."
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"rationale": {
"type": "string",
"maxLength": 3000,
"description": "Optional short reasoning. Public, attached to the forecaster's track record.",
"maxGraphemes": 300
},
"probability": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Percent probability of YES for binary questions. 0 and 100 are permitted but brave. Integer by design (matches Metaculus/Manifold/Kalshi UX; calibration math is fine at integer precision; nuance lives in the forecast trail over time, not in a single value). If extreme-tail precision is ever needed, add an optional logOdds field; do not change this one. The field remains required for Lexicon evolution compatibility. Writers of multi, numeric, and date forecasts MUST set it to 50; appviews MUST ignore it when a typed payload is present. See docs/lexicon-evolution.md."
}
}
},
"description": "A forecast on a binary, multi, numeric, or date question. Revisions are new records with the same subject uri; the full trail is retained and used for time-weighted scoring. Appviews select the payload matching the cid-pinned question type and reject records with conflicting typed payloads."
}