Envelope and claims
The runtime-neutral modules are:shared/decision-signal-provenance-contract.ts— TypeScript vocabularyshared/decision-signal-provenance-families.ts— family declarations and the CI registration frontiershared/decision-signal-provenance.ts— runtime validation and canonical serialization adapters
contractVersion, a stable signalId, a declared
familyId, and the complete claims object. Each claim has exactly one status:
unknown and not_applicable claims cannot carry a value. This prevents an
absent field from turning into a current, official, independent, verified,
normal, or zero-valued presentation claim.
Family declarations
Each family declares every dimension asrequired, unknown_allowed, or
not_applicable. The shared reference families cover:
- official numeric observations
- typed document events
- operational activity records
- exchange disclosures
- composed corridor conditions
- derived comparisons
required dimension accepts only a known claim.
unknown_allowed accepts known or explicit unknown.
not_applicable accepts only explicit not_applicable.
Omitting any dimension is invalid under every policy.
The dimensions cover publisher identity, source URL, original evidence,
language, translation, four distinct time roles, revision and supersession,
two independent confidence claims, corroboration, transport freshness, content
freshness, and derivation.
Publisher and evidence identity
Source-backed publishers retain a stable publisher ID and aregistryReference snapshot containing the canonical source name, source
type, and propaganda-risk state from shared/source-provenance.ts. Validation
fails when the source is undeclared or the snapshot has drifted from the
registry established by the source-level provenance contract.
Publisher classes are separate from confidence or corroboration:
official_governmentis a direct government publisher.state_controlled_mediaremains distinct from government ministries.official_exchangeidentifies an official market or disclosure authority.independent_observation,independent_media,wire_service, andmarket_publisherretain their own meanings.derived_outputhas no source-registry reference. Its input signal IDs and method belong in the required derivation claim.unknownis an explicit non-favorable publisher classification.
Language and translation
Original language is independent of translation state. Translation values use only:unavailablenot_translatedmachine_assistedhuman_reviewed
not_applicable; it is
not represented as a favorable translation state.
Time, lineage, and confidence
Observation, effective, publication, and retrieval time are separate claims. Each known time value also carries its semantic role, so a serializer or adapter cannot substitute one timestamp for another without validation failing. Precision is explicit (instant, day, month, or year).
Revision claims preserve a stable vintage ID, monotonic sequence, and
original, revised, or corrected state. Supersession separately records
current, corrected, cancelled, or superseded; corrected and superseded
records link to the related signal, while cancellation requires a reason.
current records cannot carry correction, cancellation, or replacement
metadata.
Historical vintages therefore remain addressable.
Extraction confidence and classification confidence are independent values
with their own score and method. Publisher authority never supplies either
score. Corroboration is another claim, with explicit source signal IDs; an
official source does not imply independent verification.
Freshness and last-good data
Transport freshness reports whether collection isfresh, stale, missing,
or in error. Content freshness independently reports current, stale,
unavailable, partial, or timestamp_unknown.
This distinction survives last-good fallback. A fresh transport can return
stale content, and stale transport can coexist with still-current cached
content. Consumers must render both claims rather than collapsing them into a
single green or red state. timestamp_unknown cannot carry a contentAsOf
value.
Serialization parity
DECISION_SIGNAL_PROVENANCE_SURFACE_ADAPTERS exposes the same canonical wire
shape for:
cache_storageapimcpui
Extending the contract
When a domain lane launches a provenance-bearing signal family:- Add a complete family declaration in
shared/decision-signal-provenance-families.ts. - Add the matching registration and explicitly choose
launchStatus: 'launched'. - Add a positive serialization fixture under
tests/fixtures/decision-signal-provenance/and point the registration at its fixture ID. - Add domain-specific positive and negative fixtures for its own payload semantics.
- Validate at the adapter boundary before writing cache/storage data or exposing API, MCP, or UI output.
- Run the focused provenance test plus frontend and API typechecks.
