{
"id": "app.matakite.question",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"text",
"resolutionCriteria",
"questionType",
"closesAt",
"resolvesAt",
"resolver",
"createdAt"
],
"properties": {
"date": {
"ref": "#dateParams",
"type": "ref",
"description": "Required iff questionType is 'date'. Reserved for v2."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 640,
"maxGraphemes": 64
},
"maxLength": 8,
"description": "Free-form topic tags for discovery and filtering."
},
"text": {
"type": "string",
"maxLength": 3000,
"description": "The headline question. Convention: 'Will X happen by DATE per SOURCE?'",
"maxGraphemes": 300
},
"multi": {
"ref": "#multiParams",
"type": "ref",
"description": "Required iff questionType is 'multi'. Reserved for v2."
},
"domain": {
"type": "string",
"description": "Optional curated top-level subject area (author-selected). Feeds per-domain reputation and filtering. Open set: clients may encounter values they don't recognize and should tolerate them.",
"knownValues": [
"politics",
"geopolitics",
"economics",
"finance",
"crypto",
"tech",
"science",
"health",
"climate",
"sports",
"culture"
]
},
"numeric": {
"ref": "#numericParams",
"type": "ref",
"description": "Required iff questionType is 'numeric'. Reserved for v2."
},
"closesAt": {
"type": "string",
"format": "datetime",
"description": "Last moment forecasts count for scoring. All datetimes are UTC (ISO 8601)."
},
"resolver": {
"type": "string",
"format": "did",
"description": "DID designated to resolve this question. v1: typically the question creator. Appviews apply their own trust policy to resolutions."
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"finePrint": {
"type": "string",
"maxLength": 30000,
"description": "Optional edge cases: source-unavailable fallbacks, rescheduling, tie-breaks, timezone specifics.",
"maxGraphemes": 3000
},
"background": {
"type": "string",
"maxLength": 30000,
"description": "Optional context for forecasters. Not part of the resolution rule.",
"maxGraphemes": 3000
},
"inspiredBy": {
"type": "string",
"format": "at-uri",
"description": "Optional AT-URI of the post that prompted this question (the 'formalize this take' flow). Weak ref by design: the referenced post may be edited or deleted."
},
"resolvesAt": {
"type": "string",
"format": "datetime",
"description": "Expected resolution time. Must be >= closesAt. Informational; actual resolution is a separate record."
},
"questionType": {
"type": "string",
"description": "v1 appviews support 'binary' only. 'multi', 'numeric', and 'date' are reserved; records using them should be skipped, not rejected, by clients that don't understand them.",
"knownValues": [
"binary",
"multi",
"numeric",
"date"
]
},
"resolutionSources": {
"type": "array",
"items": {
"ref": "#source",
"type": "ref"
},
"maxLength": 10,
"description": "Authoritative sources for resolution, in priority order. First is primary; the rest are fallbacks."
},
"resolutionCriteria": {
"type": "string",
"maxLength": 30000,
"description": "The precise rule determining the outcome. Must pass the Clairvoyance Test: a reader at resolution time can determine the outcome definitively from this text plus the sources.",
"maxGraphemes": 3000
}
}
},
"description": "A resolvable forecasting question. Immutability contract: editing this record after forecasts exist changes its CID; forecasts reference the question by strongRef (uri+cid), so appviews detect and flag post-forecast edits."
},
"source": {
"type": "object",
"required": [
"name"
],
"properties": {
"url": {
"type": "string",
"format": "uri"
},
"name": {
"type": "string",
"maxLength": 640,
"maxGraphemes": 64
}
}
},
"dateParams": {
"type": "object",
"required": [
"min",
"max"
],
"properties": {
"max": {
"type": "string",
"format": "datetime",
"description": "Latest representable resolution datetime (UTC ISO 8601). Must be >= min."
},
"min": {
"type": "string",
"format": "datetime",
"description": "Earliest representable resolution datetime (UTC ISO 8601)."
},
"openLower": {
"type": "boolean",
"description": "If true, resolution before min is representable."
},
"openUpper": {
"type": "boolean",
"description": "If true, resolution after max is representable."
}
},
"description": "Reserved (v2). Date question parameters — 'when will X happen?'. Resolves to the datetime the event occurred."
},
"multiParams": {
"type": "object",
"required": [
"options"
],
"properties": {
"options": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000,
"maxGraphemes": 100
},
"maxLength": 50,
"minLength": 2
},
"sumToOne": {
"type": "boolean",
"description": "If true, options are mutually exclusive and exactly one resolves yes (Kalshi mutually_exclusive / Polymarket negRisk semantics)."
},
"optionIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 640,
"minLength": 1,
"maxGraphemes": 64,
"minGraphemes": 1
},
"maxLength": 50,
"minLength": 2,
"description": "Opaque stable identifiers aligned by index with options. Required by the reference app for forecastable multi questions; optional in the Lexicon so previously published records remain valid. Labels may change in a new question version, but forecasts refer to these ids and pin the version by cid."
}
},
"description": "Multiple-choice question parameters. New questions that accept forecasts include optionIds aligned one-to-one with options; appviews require the ids to be unique and stable within the cid-pinned question version."
},
"numericParams": {
"type": "object",
"required": [
"min",
"max"
],
"properties": {
"max": {
"type": "string",
"description": "Decimal string. Upper bound."
},
"min": {
"type": "string",
"description": "Decimal string. Lower bound."
},
"unit": {
"type": "string",
"maxLength": 320,
"maxGraphemes": 32
},
"logScale": {
"type": "boolean"
},
"openLower": {
"type": "boolean",
"description": "If true, resolution below min is representable."
},
"openUpper": {
"type": "boolean",
"description": "If true, resolution above max is representable."
}
},
"description": "Reserved (v2). Numeric range question parameters."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}