Most finance sites publish takes with no accountability. I built the schema that makes retroactive weaseling impossible.
If the schema allows vagueness, the content will be vague. Schema design is editorial policy.
Financial media runs on free-text CMS fields. That's not a technical complaint it's what makes retroactive hedging so easy. A writer can publish "AMD looks strong heading into Q3," wait for earnings, and claim they were right either way.
When I built Finovian's Track Record system, I wanted predictions that couldn't be weaseled out of. A specific number, a check-by date, and a binary outcome after the event.
Free-text fields can't enforce that. Schema-level validation can.
I built a custom Sanity document type for Track Record entries. The fields that matter:
defineField({
name: 'expectedValue',
title: 'Expected Value',
type: 'string',
description: 'Specific threshold a number, not a direction.',
validation: Rule => Rule.required()
}),
defineField({
name: 'actualValue',
title: 'Actual Value',
type: 'string',
description: 'Filled in after the event resolves.'
}),
defineField({
name: 'checkByDate',
title: 'Check-By Date',
type: 'datetime',
validation: Rule => Rule.required()
}),
defineField({
name: 'outcome',
title: 'Outcome',
type: 'string',
options: {
list: ['pending', 'correct', 'incorrect', 'partial']
},
initialValue: 'pending'
}),
defineField({
name: 'predictionType',
title: 'Prediction Type',
type: 'string',
options: {
list: ['quantitative', 'directional', 'binary']
},
validation: Rule => Rule.required()
}),
defineField({
name: 'xPostUrl',
title: 'X Post URL',
type: 'url',
description: 'Link to the public X post made before the event.'
})
expectedValue and checkByDate are required. You can't publish a Take without specifying a threshold and a date. That's the whole point, the schema rejects vague predictions at the data layer.
A schema alone doesn't prove the prediction was written before the event. Anyone could publish after earnings and backdate the content.
Before publishing each Take, I post it on X and submit the URL to the Internet Archive. The xPostUrl field in Sanity links to that public post. The Archive snapshot timestamps the content before the event. That's the verification chain: Sanity record β X post β Archive snapshot β earnings result.
It's a bit more work per prediction. But it's the only way to make the Track Record actually mean something.
The homepage pulls all Track Record entries from Sanity and displays resolution status dynamically. Pending predictions show the threshold and check-by date. Resolved ones show the outcome alongside the original expected value.
Wrong calls stay visible. That's the only way a track record is worth reading.