Observed directly
The number came from a direct observation of the thing itself, with a source reference that can be re-checked.
Write-time enforcement
Whole industries ship modeled figures as if they were measured. The fix is not a footnote — it is a constraint. Here, a value cannot be inserted without a provenance class and a published method version, and every read carries the label back out with it.
Every value belongs to exactly one class. There is no unlabelled state, and no read path that strips the label off on the way out.
The number came from a direct observation of the thing itself, with a source reference that can be re-checked.
The number was produced by a published method rather than observed. It must carry an interval, or explicitly declare that no interval is available.
The number is an arithmetic consequence of other labelled values. It inherits the weakest provenance of its inputs.
The number came from outside this system. The source is recorded, but the method behind it is not ours to vouch for.
These are not conventions the team agrees to follow. They are conditions the database refuses to violate.
Provenance and method version are NOT NULL at the schema level. There is no application path that can bypass them.
A modeled value carries both bounds, or it states plainly that no interval is available. Silence is rejected by a CHECK constraint.
You cannot edit a published method. You publish a new version that points at the one it supersedes, and the history stays visible.
When a row moves from modeled to measured — or the other way — the move is recorded with its evidence and its actor.
There is no unlabelled read path, in the UI or the API. A consumer cannot accidentally strip the provenance off.
The public numbers are computed from live rows. No one can type a friendlier figure into them.
A write that omits provenance, omits its method version, or claims to be modeled without an interval does not get a warning. It gets a 422 and a specific reason.
Count what the census admits →POST /api/public/values
{ "subject": "east-corridor",
"metric": "Throughput",
"amount": 7150 }
422 Unprocessable Entity
{ "error": "provenance_required",
"detail": "provenance and method_version
are mandatory on every value" }