Context
#154 gave facts an assertion axis (observation vs source_projection) and target profiles an assertion_policy (observed_only / prefer_observed / allow_source_projection). The axis distinguishes measured-past from projected-future. It has no way to say a third thing: the publisher has marked this figure provisional and will revise it.
The case that surfaced it
ons-pipr-private-rent-march-2026 (#159): the February 2026 average private rents are provisional PIPR estimates — the bulletin says so explicitly — subject to routine revision in later editions. On the current axis they are correctly observations: they measure an elapsed period. But once ONS revises, the bundle carries a stale value indistinguishable from a final one, and a consumer resolving "latest" against a revisable figure is exactly the silent-wrong-answer case the assertion axis was built to prevent.
This will not be a one-package need: PIPR revises monthly, DWP Stat-Xplore series revise, ONS MYE revises back-years (the mid-2025 estimates publication also revises mid-23/24), and OBR restates. First-print packages are systematically exposed.
Design space (not deciding here)
- A third assertion state (
provisional_observation), or
- an orthogonal per-fact flag (e.g.
revision_status: provisional | revised | final), keeping assertion two-valued, plus
- possibly an
assertion_policy vocabulary extension for consumers that want to fence on it (e.g. warn or fail when a resolved fact is provisional).
An orthogonal flag avoids overloading the observed/projected boundary (a provisional estimate of an elapsed period is still an observation) and keeps #154's policy semantics intact, but the consumer-side story (_choose_period, series keying, warnings) needs thinking through either way.
Provenance
Filed from review discussion on #159, same shape as #157 (structural gap identified in a wave review, fixed outside the wave PR).
Context
#154 gave facts an
assertionaxis (observationvssource_projection) and target profiles anassertion_policy(observed_only/prefer_observed/allow_source_projection). The axis distinguishes measured-past from projected-future. It has no way to say a third thing: the publisher has marked this figure provisional and will revise it.The case that surfaced it
ons-pipr-private-rent-march-2026(#159): the February 2026 average private rents are provisional PIPR estimates — the bulletin says so explicitly — subject to routine revision in later editions. On the current axis they are correctlyobservations: they measure an elapsed period. But once ONS revises, the bundle carries a stale value indistinguishable from a final one, and a consumer resolving "latest" against a revisable figure is exactly the silent-wrong-answer case the assertion axis was built to prevent.This will not be a one-package need: PIPR revises monthly, DWP Stat-Xplore series revise, ONS MYE revises back-years (the mid-2025 estimates publication also revises mid-23/24), and OBR restates. First-print packages are systematically exposed.
Design space (not deciding here)
provisional_observation), orrevision_status: provisional | revised | final), keepingassertiontwo-valued, plusassertion_policyvocabulary extension for consumers that want to fence on it (e.g. warn or fail when a resolved fact is provisional).An orthogonal flag avoids overloading the observed/projected boundary (a provisional estimate of an elapsed period is still an observation) and keeps #154's policy semantics intact, but the consumer-side story (
_choose_period, series keying, warnings) needs thinking through either way.Provenance
Filed from review discussion on #159, same shape as #157 (structural gap identified in a wave review, fixed outside the wave PR).