Files
govoplan-core/docs/TEMPORAL_DATA_CONTEXT.md

3.1 KiB

Temporal Data Context

GovOPlaN exposes one read context for data validity and system knowledge. The calendar control in the authenticated titlebar applies that context to supported list and detail reads for the current account and tenant.

Two Independent Axes

  • Valid time answers when a fact applied in the represented domain.
  • Recorded time answers what the system had recorded by a particular instant.

The default is data valid now under the latest recorded state. At time selects a valid-time instant. All removes the valid-time interval filter but still uses the selected recorded state. The optional recorded-state cutoff can be combined with any valid-time mode, which keeps correction history distinct from changes in real-world validity.

An interval is half open: valid_from <= instant < valid_to. A revision belongs to a recorded-state snapshot when recorded_at <= cutoff and it was not superseded at or before that cutoff.

Security And Mutation Rules

The temporal data context is a read projection, not an authorization context. Authentication, permissions, active delegations, tenant boundaries, module policy, and maintenance controls are always evaluated under current security state. A historical projection never restores an expired permission.

The context also does not supply mutation dates. Writes continue to target the current lifecycle revision and must carry their explicit valid/effective dates, expected revision, reason, and evidence where the owning contract requires them. A screen showing historical data must not silently turn a normal edit into a historical correction.

HTTP Contract

Core accepts these request headers:

Header Meaning
X-Govoplan-Validity-Mode current, at, or all
X-Govoplan-Valid-At Timezone-aware ISO 8601 instant required by at
X-Govoplan-Recorded-At Optional timezone-aware system-knowledge cutoff

Invalid or naive timestamps fail with HTTP 400. Responses expose the resolved mode and evaluated instant. Conditional JSON responses vary by all three request headers, and the shared WebUI API client includes them in request deduplication and conditional-cache keys.

Module Adoption

Revision-owning modules apply govoplan_core.db.temporal.apply_temporal_revision_filter only to read queries that are meant to follow the platform context. Explicit version references and explicit resolver effective_at arguments take precedence. Current-row lookups used for optimistic concurrency, authorization, routing, effects, or other mutations must remain explicit and context-independent.

The initial bitemporal adoption covers Decisions, Mandates, Parties, and Services. Their immutable revisions have indexed valid, recorded, and superseded timestamps. Modules with effective-dated security records or recorded-only revision histories require separate display-query adoption so the global selector cannot affect current authorization or execution.

The WebUI selection is stored in session storage per account and tenant. A change remounts the active module route so existing page loaders issue a fresh request. Returning both axes to their defaults removes the stored selection.