Authority, context and temporal truth
Temporal entitlement for decisions
A consequential decision is reproducible only from the facts, policy and permissions that were valid, available and authorised at its declared cutoff, not from whatever became true later.
TLDR
- Truth has at least two times: when a claim held and when the system could know that version.
- A third test is authority: whether that version could be used for this subject, purpose and action.
- Replaying the latest state lets future corrections, policy drift and permission changes leak into the past.
- Preserve a decision slice containing temporal facts, policy and grant versions, provenance, cutoff and snapshot receipts.
- Judge historical justification separately from the decision that should be made now.
The payslip that arrived after the decision
At 09:40, a credit-limit service rejects Maya because the authorised employer feed reports annual income of £42,000. At 11:15, the employer corrects the value to £62,000 and marks the correction as valid from the beginning of the month.
A week later, an auditor reruns the old rule against the current database. The decision becomes an approval. The auditor concludes that the service made the wrong decision at 09:40.
Maya really did earn £62,000. Yet the service could not retrieve that version at 09:40. Which conclusion follows: wrong outcome, defective process, or contaminated replay?
The answer depends on whether the audit allows the future to rewrite what the past was entitled to know.
The future can corrupt the past
Most organisations can recover an old result. Far fewer can recover the exact evidence boundary that made the result legitimate.
The usual audit recipe sounds sensible: retrieve the historical record, load the old model or rule, and compare the result. The weakness hides inside the word “historical”. A record may describe an earlier period while carrying a correction learned much later. A current table may preserve the latest truth about the past, not the knowledge that was available in the past.
This is not an exotic database puzzle. It appears whenever information arrives late, is backdated, is retracted, or changes authority. Employer data, medical coding, sanctions lists, identity attributes, consent, delegated permissions, fraud labels, market prices and operational status all acquire new versions. A system that silently reads the newest version during replay can look more accurate than the system that actually acted. The past can be made wiser by evidence it never possessed.
Temporal database research gives us the first necessary distinction. Valid time is when a fact is true in the modelled reality. Transaction time is when that fact is current in a database and can be retrieved. The dimensions are orthogonal: a correction can be recorded today yet claim validity last month.[1][2] System-versioned tables make database history queryable, which is valuable for forensics and point-in-time reconstruction.[3] But a consequential decision needs one more distinction. A fact can be present and still be forbidden, expired, insufficiently authoritative or outside the declared purpose.
Replace the database, preserve the visible history
System A stores only the latest value plus a human-readable note saying when it became effective. System B stores valid-time and record-time intervals for every version. At noon, both display “income £62,000, effective from the first day of the month”. At 09:40, only B can show that £42,000 was the retrievable version.
Now replace B with A while keeping every current screen identical. Have you preserved historical decisionability? No. The current behaviour matches, but the causal relation between a decision and the version it could consume has vanished. A fact is not a timeless string; it is a version with a temporal and evidential address.
The bitemporal cube and the decision cut
Three judgements, not one
Return to Maya. The correction supports a judgement about the world: £62,000 was the better account of her income. It does not by itself establish that the 09:40 service ignored available evidence. Nor does it show that the employer feed met its latency obligation. One event can therefore produce three different findings:
Separate outcome, process and replay integrity
Outcome accuracy asks whether the action fits the best account available now. Process validity asks whether the decision used the evidence, policy and authority it was required to use then. Replay integrity asks whether the audit reconstructed that historical boundary without importing later state.
A decision can have a poor outcome yet a valid process. It can have a fortunate outcome produced by an invalid process. A replay can also accuse or excuse the process by using evidence that did not cross the original boundary.
Backdate the permission, not the fact
An analyst receives permission at 10:05 to use a sensitive attribute. The grant is written with an effective start of 09:00 because a manager intended access to begin then. The analyst’s service acted at 09:40.
If the later grant is allowed to authorise the earlier action, the same visible result can be generated by two different mechanisms: genuine authority present at the cutoff, or retroactive administrative repair. Whether retroactivity is legitimate depends on the governing rule. The replay must therefore preserve both the grant’s effective interval and when the grant entered the authoritative system. A later licence cannot silently become an earlier cause.
Hindsight leakage as a causal intervention
The superseded match
A screening source reports a strong match at 09:20. The service pauses an action at 09:40. At 13:00, the source withdraws the match after receiving a new identifier. A naive replay using the withdrawn status says “no pause”.
The later status may demand immediate remediation. It does not erase that the earlier match was the authorised source’s live assertion. The useful audit question is not “Which value wins forever?” It is “Which version was authoritative at the decision cut, and did the service meet its obligations for uncertainty, review and reversal?” Historical accuracy and present accuracy are different questions.
flowchart TD A["The payslip that arrived after<br/>the decision"] --> B["The future can corrupt the past"] B --> C["A decision needs three clocks"] C --> D["Build the decision slice, not<br/>just the history table"] D -. "re-test" .-> A classDef first fill:#0a1424,stroke:#D95545,stroke-width:2px,color:#e6f3ff classDef step fill:#0a1424,stroke:#3f7da0,stroke-width:1px,color:#e6f3ff class A first class B,C,D step
A decision needs three clocks
A useful temporal model must tell us when a claim held, when the system could retrieve it, and when the system was permitted to use it.
Imagine four marks on a wall. The first marks when Maya’s income actually changed. The second marks when the employer asserted a value. The third marks when the decision service received and committed that assertion. The fourth marks when the service had authority to use that source for credit assessment. Collapsing these marks into a single timestamp creates a clean table and a dirty explanation.
The established terms valid time and transaction time cover the first and database-facing third marks. Streaming systems add the practical distinction between event time and processing time because late and out-of-order arrivals force a trade-off among completeness, latency and cost.[4] For compound decision systems, transaction time must be interpreted carefully. A fact committed in a central source may still be absent from the snapshot, cache or message set used by one decision node. I will call the time at which a version crosses the decision system’s evidence boundary its record time. This is a practitioner extension, not a replacement for the database term.
The third clock is entitlement time: the interval during which a particular version may be used for a declared principal, subject, purpose, action and resource. Attribute-based access control already evaluates subject, object and environmental attributes against policy, while NIST guidance stresses authoritative establishment, update, readiness and revocation of attributes.[6][7] Cedar makes the request shape explicit as principal, action, resource and context, with time available as request context.[11] Temporal entitlement applies that logic to evidence selection itself.
Four clocks inside one income fact
The smallest useful formalism
Formal notation earns its place here because it prevents a familiar substitution. Let a fact version f contain a value, a valid interval V, a record interval R, a source and provenance. Let a decision d have a target time τ, a cutoff κ, a purpose, a principal, an action and a policy version. Let Allow evaluate the grant and policy state applicable at κ.
The equation assumes crisp intervals and a policy engine able to reconstruct historical grants. Remove either assumption and the result can become indeterminate. If a distributed clock says the cutoff lies somewhere between 09:39:59.970 and 09:40:00.030, while a permission is revoked at 09:40:00.000, no honest Boolean answer follows. Systems such as Spanner expose clock uncertainty to support externally consistent ordering, while Zanzibar’s authorisation design preserves causal ordering amid permission and content changes.[9][8] Many ordinary systems provide neither guarantee.
The decision cutoff is part of the decision, not an audit parameter chosen later. It can be a point, an uncertainty interval, or a consistency token. What matters is that the system declares what it treated as knowable before it acts.
A decision slice is a temporal join with a refusal state
The mechanism can be understood as a join across several histories. Start with versions whose valid interval covers the time the decision is about. Remove every version whose record interval begins after the cutoff. Join the survivors to the policy and grant versions visible at that same cut. Apply source-quality and freshness requirements. Only then evaluate the rule or model. A normal database join tries to return rows. A defensible decision join must also be able to return unresolved.
That refusal state matters when intervals overlap, a revocation sits inside the clock-uncertainty band, or the receipt identifies a source version that has since been deleted. Choosing the newest remaining row would hide the missing guarantee. Choosing the oldest would be equally arbitrary. The system should instead name the failed predicate: fact version unknown, policy revision unavailable, grant order ambiguous, source below threshold, or snapshot not causally comparable.
Consider a service with ten relevant fact versions, three policy revisions and two grant revisions. The Cartesian product contains sixty combinations, most of which were never simultaneously eligible. The decision slice collapses that space by applying the same target and cutoff before evaluation. This is more than an optimisation. It prevents an auditor from assembling a plausible combination that no historical actor could have seen. The slice is therefore both an input set and a proof of exclusion.
Two rows are enough to expose the mechanism
Version v1 says £42,000. It is valid from the start of the month and recorded from 08:55 until 11:15. Version v2 says £62,000. It has the same valid start but is recorded from 11:15 onwards. Rule B17 requires at least £50,000 and is active at 09:40. Grant G9 permits the employer feed for credit assessment from 09:00 to 10:00.
At target time τ equal to the month start and cutoff κ equal to 09:40, both versions pass valid time. Only v1 passes record time. V1 also passes entitlement, so the historical result is reject. At noon, v2 passes all three tests and the present result is approve. There is no contradiction. The questions differ.
The decision slice for Maya at 09:40
| Item | Value or rule | Valid interval | Record interval | Entitlement at 09:40 | Slice result |
|---|---|---|---|---|---|
| Income v1 | £42,000 | Month start onward | 08:55 to 11:15 | Allowed by G9 | Used |
| Income v2 | £62,000 | Month start onward | 11:15 onward | Allowed now | Excluded: after cutoff |
| Policy B17 | Income ≥ £50,000 | 09:30 onward | 09:25 onward | Approved policy bundle | Used |
| Grant G9 | Employer feed for credit assessment | 09:00 to 10:00 | 08:50 onward | Principal and purpose match | Used |
Why authorisation needs its own history
A common design versions the business data but evaluates replay with today’s policy engine, today’s permission graph and today’s source classifications. That design answers a useful counterfactual: what would the old input produce under current governance? It does not reconstruct the old decision.
Policies and grants are temporal facts too. A policy can be published, activated, superseded, withdrawn or applied retroactively. A purpose grant can be issued, narrowed or revoked. A source can move from approved to quarantined. Each change needs valid and record semantics. OPA decision logs illustrate the kind of evidence a policy layer can retain: decision identifiers, query input, the policy queried and bundle metadata for audit and offline debugging.[10] The log becomes much more useful when its bundle revision and data snapshot can be joined to the decision receipt.
Provenance has a similar role. W3C PROV provides relations for generation, use, derivation, invalidation and responsible agents, including times that bound an entity’s lifetime.[5] Provenance does not decide whether an input was lawful or reliable. It tells the replay which entity version came from which activity and who was responsible for it. A timestamp is not a licence, and a hash is not an explanation.
Move the cutoff by twenty milliseconds
A permission revocation commits at 09:40:00.000. A decision node records its action at 09:40:00.012, but its clock uncertainty is ±30 milliseconds. What do you expect the replay to decide?
If the system reports “authorised” or “unauthorised” without exposing uncertainty, it invents order. A safe design either carries a snapshot token proving the authorisation state read by the decision, or treats the case as unresolved and applies a policy for ambiguity. Indeterminate is a valid audit result when time cannot support the claimed order.
Build the decision slice, not just the history table
A temporal database preserves versions. A decision slice proves which versions crossed the evidence and authority boundary of one action.
Adding system-versioned tables is a strong first step. It is not the finish. A compound decision may read from a customer store, a feature service, a policy engine, an authorisation service, a model gateway and a human review queue. Each component can expose a different “as of” state. Replaying each store independently at 09:40 can still combine versions that never coexisted.
The implementation target is a coordinated slice. The slice is the smallest bundle that lets another party answer four questions: What was the decision about? What crossed the evidence boundary? What authority applied? Which executable configuration produced the proposal or action? A replay without the original evidence boundary is a counterfactual, even when every component is individually versioned.
Configured boundary for a temporally entitled decision
What belongs in the slice
The exact schema depends on consequence and regulation, but the causal minimum is stable. The decision receipt should identify the subject and decision target, the target time, the evidence cutoff, the principal, purpose and typed action, the selected fact versions, the policy bundle revision, the authorisation decision or snapshot, the executable model or rule version, and the output. It should also capture provenance and any uncertainty that affected ordering.
Record what was excluded as well as what was used. An excluded-after-cutoff manifest turns “the system ignored the corrected income” into a testable statement. It shows that the correction was seen during audit but intentionally barred from historical replay. An excluded-for-purpose entry explains why a retrievable attribute did not enter. An unresolved entry preserves missingness rather than converting it into an implicit default.
The negative space is part of the evidence
Two replays can use the same three inputs and still differ in integrity. One may have evaluated five candidate versions and excluded two under explicit rules. The other may have retrieved only the three convenient rows because an index, cache or query filter hid the alternatives. The visible input set is identical, but only the first replay can show that a later correction or prohibited attribute was deliberately kept outside the boundary.
An exclusion manifest need not copy every sensitive value. It can retain the candidate version identifier, source, discovery time, exclusion reason, policy clause and a commitment hash. For a purpose-restricted attribute, the receipt may say that a qualifying version existed but was not disclosed to the decision component. This preserves the control claim without broadening access during audit. Where even the existence of an attribute is sensitive, the manifest can be released selectively to an authorised reviewer.
The practical test is counterfactual. Remove the exclusion record and ask whether a reviewer could distinguish a principled omission from a retrieval failure. If not, the receipt is incomplete. Evidence of non-use is what separates bounded context from accidental blindness.
Several systems already expose pieces of this pattern. Temporal tables retain row versions and support point-in-time queries.[3] Provenance vocabularies can represent generation, derivation and invalidation.[5] Policy engines can log decision identifiers, inputs and bundle metadata.[10] Consistent authorisation systems can bind checks to causally ordered state.[8] Temporal entitlement is the integration rule: no load-bearing item enters unless its time and authority are evaluated against the same decision cut.
A credit-limit review with a reproducible boundary
Consider a synthetic service asked to set Maya’s limit at 09:40. The typed request binds principal credit_service, subject maya, purpose credit_assessment, action set_limit, target time 09:40 and cutoff token s-8841. The service reads income v1, current exposure e7 and identity verification k4. It receives policy bundle B17 and authorisation decision A921.
The proposal is “no increase”. The decision receipt stores the three fact-version identifiers, the bundle hash, the authorisation decision identifier, the rule trace, the cutoff token and the excluded-after-cutoff list. At 11:15, income v2 arrives. The system opens a remediation case because the current decision should differ. Historical replay still returns “no increase” and labels it justified under the captured slice. The source-latency control then fails because the employer correction breached its service target.
The design produces three actions instead of one accusation: correct Maya’s present outcome, retain the historical decision explanation, and improve the delayed source. Do not remediate the present by rewriting the past.
A fact’s lifecycle keeps supersession without erasure
A historical-replay benchmark
The most useful test is not whether the system can return an old row. It is whether several replay strategies disagree for reasons the evidence can localise. The benchmark below generates synthetic decisions with late corrections, policy changes, permission changes and missing receipts. It compares three methods:
Three replay strategies
Latest-state replay uses the final fact, current policy and current grant. Fact-time replay reconstructs the fact available at the cutoff but still uses current policy and grant. Temporal-entitlement replay reconstructs the fact, policy and grant at the cutoff and refuses a verdict when the required receipt is missing.
The first method measures hindsight leakage. The second isolates the remaining policy and authority drift. The third tests the paper’s proposed decision slice. All numbers are synthetic and have no client or operational provenance.
Replay divergence as late corrections increase
Historical-replay benchmark
Change the rates, run 10,000 synthetic decisions, and compare the three replay boundaries. The generator uses a deterministic seed so results can be repeated.
Interpretation: a positive gap between latest-state and fact-time replay indicates future fact leakage. A remaining fact-time gap indicates policy or grant drift. A non-zero temporal-entitlement gap would reveal a defect in the slice or replay logic. Unresolved cases are not failures of honesty; they identify missing evidence that should block a confident historical verdict.
The lab encodes a simple threshold decision, so it does not prove that temporal entitlement will improve every system. Its purpose is narrower: make three sources of disagreement observable rather than mixing them into “the replay changed”. A positive result permits confidence that the captured slice reproduces the configured decision. A negative result localises what changed. It does not establish that the original source was true, the policy was wise, or the outcome was fair.
Open the benchmark assumptions and invariants
The synthetic world contains a latent eligibility score. Some initial observations are materially wrong and receive a late correction. A threshold policy and a purpose grant can change after the cutoff. The captured decision uses the initial observation, historical threshold and historical grant. Latest-state replay uses final values. Fact-time replay restores the initial observation but not the policy or grant. Temporal-entitlement replay restores all three.
Invariant 1: record intervals never move backwards. Invariant 2: one fact version is selected for a target and cutoff. Invariant 3: policy and grant are evaluated at the same cutoff as facts. Invariant 4: missing load-bearing receipts return unresolved, never an invented Boolean. Invariant 5: all metrics are about replay agreement, not substantive correctness.
Open the runnable Python reference implementation
from __future__ import annotations
from dataclasses import dataclass
from random import Random
from typing import Literal
Decision = Literal["approve", "deny", "unresolved"]
@dataclass(frozen=True)
class Scenario:
observed_at_cutoff: float
corrected_value: float
threshold_at_cutoff: float
threshold_now: float
grant_at_cutoff: bool
grant_now: bool
receipt_present: bool
def decide(value: float, threshold: float, grant: bool) -> Decision:
return "approve" if grant and value >= threshold else "deny"
def captured(s: Scenario) -> Decision:
return decide(s.observed_at_cutoff, s.threshold_at_cutoff, s.grant_at_cutoff)
def replay_latest(s: Scenario) -> Decision:
return decide(s.corrected_value, s.threshold_now, s.grant_now)
def replay_fact_time(s: Scenario) -> Decision:
return decide(s.observed_at_cutoff, s.threshold_now, s.grant_now)
def replay_temporal_entitlement(s: Scenario) -> Decision:
if not s.receipt_present:
return "unresolved"
return decide(s.observed_at_cutoff, s.threshold_at_cutoff, s.grant_at_cutoff)
def scenario(rng: Random, late: float, policy: float,
auth: float, missing: float) -> Scenario:
true_score = max(0.0, min(100.0, rng.gauss(62.0, 12.0)))
if rng.random() < late:
direction = 1.0 if rng.random() < 0.5 else -1.0
initial = true_score + direction * rng.uniform(12.0, 28.0)
else:
initial = true_score + rng.uniform(-2.0, 2.0)
initial = max(0.0, min(100.0, initial))
historical_threshold = 60.0 if rng.random() < 0.5 else 65.0
current_threshold = historical_threshold
if rng.random() < policy:
current_threshold = 65.0 if historical_threshold == 60.0 else 60.0
historical_grant = rng.random() > 0.05
current_grant = historical_grant
if rng.random() < auth:
current_grant = not historical_grant
return Scenario(
observed_at_cutoff=initial,
corrected_value=true_score,
threshold_at_cutoff=historical_threshold,
threshold_now=current_threshold,
grant_at_cutoff=historical_grant,
grant_now=current_grant,
receipt_present=rng.random() >= missing,
)
def benchmark(n: int = 10_000, *, late: float = 0.15,
policy: float = 0.08, auth: float = 0.08,
missing: float = 0.02, seed: int = 183) -> dict[str, float]:
if n <= 0:
raise ValueError("n must be greater than zero")
rates = {"late": late, "policy": policy, "auth": auth, "missing": missing}
invalid = {name: value for name, value in rates.items()
if not 0.0 <= value <= 1.0}
if invalid:
raise ValueError(f"rates must lie between 0 and 1: {invalid}")
rng = Random(seed)
latest_diff = fact_diff = entitled_diff = unresolved = resolved = 0
for _ in range(n):
s = scenario(rng, late, policy, auth, missing)
actual = captured(s)
latest_diff += replay_latest(s) != actual
fact_diff += replay_fact_time(s) != actual
entitled = replay_temporal_entitlement(s)
if entitled == "unresolved":
unresolved += 1
else:
resolved += 1
entitled_diff += entitled != actual
return {
"latest_divergence_pct": 100 * latest_diff / n,
"fact_time_divergence_pct": 100 * fact_diff / n,
"temporal_entitlement_divergence_pct": 100 * entitled_diff / max(1, resolved),
"unresolved_pct": 100 * unresolved / n,
}
if __name__ == "__main__":
for name, value in benchmark().items():
print(f"{name}: {value:.2f}")
Run with Python 3.10 or later. A zero entitled divergence means the complete historical slice reproduces the captured threshold decision. The browser and Python versions use different deterministic random-number generators, so their rounded rates differ slightly. Neither can establish truth, fairness or legal validity.
The replay verdict matrix
Replay supports the old process and the present action.
Old process may be justified; current action changes.
A matching outcome does not cure impermissible evidence use.
Correct the action and investigate authority.
Do not infer validity from agreement.
Act now while preserving audit uncertainty.
stateDiagram-v2 [*] --> Claim state "Replace the database, preserve<br/>the visible history" as Claim state "The bitemporal cube and the<br/>decision cut" as Test state "Three judgements, not one" as Revision Claim --> Test: expose mechanism Test --> Decision: evidence survives Test --> Revision: rival survives Revision --> Claim: narrow or rebuild Decision --> [*]
Where the decision slice breaks
Temporal entitlement improves reconstruction. It does not turn records into reality, settle the law, or make distributed time exact.
A faithful replay can reproduce a bad source
The strongest boundary is simple. A complete slice proves what the configured system consumed and which authority it invoked. It cannot prove that the employer feed, identity register or model feature was substantively correct. Maya’s v1 can be perfectly preserved and still be false. Temporal entitlement cannot make a bad source true. Source quality, appeal, corroboration and correction obligations remain separate controls.
This boundary matters because audit language often slides from “the system used the authorised version” to “the system was right”. The first is an operating-evidence claim. The second is an outcome claim. A mature review states both and records disagreement.
Retroactivity is a rule, not a database trick
Some domains intentionally apply corrections or permissions retroactively. A court order, accounting restatement or policy decision may alter how earlier periods are treated. Temporal entitlement does not forbid that. It requires the retroactivity rule to be explicit, versioned and attributable. The system should be able to distinguish “this value was learned later but governs the earlier period” from “this value was learned later and is being smuggled into a historical reconstruction”.
That distinction is partly legal and organisational. This paper offers a systems grammar, not legal advice. The authority responsible for a domain must define whether a later correction changes past liability, past process validity, present remediation, or all three. Where the rule is disputed, the receipt should preserve the competing interpretations rather than force one Boolean.
Distributed time creates uncertainty bands
A timestamp produced by one node is not automatically comparable with a timestamp produced by another. Replication lag, queue delay, cache activation and clock skew can place a permission change on either side of the apparent cutoff. Spanner’s TrueTime is notable because it exposes clock uncertainty rather than pretending to perfect time, and Zanzibar binds authorisation checks to causal order across changing access-control state.[9][8]
Most systems should not imitate their scale. They should imitate the honesty of the contract. Carry a monotonic revision, snapshot token, log sequence, signed event time, or explicit uncertainty interval. Require a freshness bound for permissions and policy. When the bound straddles a consequential change, abstain, retry against a stronger read, or require review.
A snapshot token can order state without proving meaning
A token can show that the policy read was at least as recent as a grant change. It cannot show that the policy represented the correct legal interpretation or that the source attribute referred to the right person. Consistency prevents one class of error. It does not absorb identity, semantics or governance.
Deletion and minimisation can conflict with replay
Keeping every historical input forever is neither necessary nor always permissible. A decision receipt can retain identifiers, hashes, reason codes, provenance pointers and selective evidence manifests while the underlying content follows its retention rule. Yet a hash only verifies a later copy against a commitment. It does not reveal the deleted content or prove that use was authorised. The architecture must therefore declare which future questions it chooses to remain capable of answering.
A practical design separates three layers: an operational record needed for immediate recovery, an audit manifest needed for accountability, and the source record governed by its own retention and access policy. Erasure may intentionally make some exact replays impossible. In that case, the correct historical verdict is “not reconstructable under the retained evidence”, not a guess derived from current state.
Models and people may not replay bit for bit
A deterministic rule can usually be rerun if code and inputs are captured. A sampled model may also depend on weights, runtime, prompt construction, tool results, random seed and provider behaviour. A human reviewer depends on the evidence displayed, instructions, delegated authority and reasons recorded, but not on a recoverable copy of private cognition.
For these systems, exact output equality may be the wrong target. Use tiers. A bitwise replay reproduces the same bytes. A decision-equivalent replay reaches the same typed outcome within declared tolerance. An explanatory replay reproduces the evidence, policy and authority path even when the proposal is stochastic. Exact replay is a systems property, not a model feature.
Define the replay envelope before seeing the rerun
A team should declare what counts as reproduction before it observes the new output. For a threshold rule, the envelope may require the same eligibility Boolean and reason code. For a ranked recommendation, it may require the same top choice, no movement across a prohibited boundary and a bounded change in score. For a human review, it may require the same evidence display, instruction set and authority, while treating the reviewer’s judgement as a fresh decision rather than a mechanical replay.
Suppose a sampled model originally produced risk 0.64 and the captured policy mapped 0.60 or above to manual review. A rerun returns 0.67. Byte equality fails, but decision equivalence holds if the model version, decoding contract, input slice and review threshold are all preserved. If the rerun returns 0.58, the audit should not immediately call the original result irreproducible. It should test whether stochastic variance can cross the threshold at an unacceptable rate. The relevant artefact is then a distribution and acceptance bound, not one lucky rerun.
Predeclaring the envelope blocks another form of hindsight. Without it, reviewers can tighten or relax similarity after seeing whether the replay supports their preferred conclusion. A negative result should therefore identify which layer failed: bytes, typed decision, evidence path, authority path, or effect. This keeps nondeterminism from becoming a blanket excuse and prevents exact sameness from becoming an impossible standard.
Adversarial paths that make history lie
The replay that agrees for the wrong reason
A service denied an action because an income value was low. During replay, the archived input is missing, so an engineer substitutes the current corrected value. The policy has also tightened since the decision. The current value is high enough for the old policy but too low for the new one, so the replay still returns deny.
Output agreement disguises two substitutions. The fact came from the future and the policy came from the present. Without a slice, the audit reports success. With a slice, the case is unresolved because the historical input is absent. This is the counterexample to using agreement as evidence of reproducibility.
Temporal-entitlement receipts will reduce false audit conclusions
The proposal is strengthened if controlled incident reviews using decision slices classify disagreements more accurately, reduce time spent reconstructing context, and separate remediation from process fault. It is weakened if simple immutable event snapshots provide the same localisation and governance at lower cost.
A rival explanation is that most replay disagreement comes from model nondeterminism or code drift rather than temporal leakage. The smallest useful test is a matched benchmark: replay the same incident set with latest state, fact-time state and full temporal entitlement, then have independent reviewers classify the cause without seeing the method label.
Do not apply the full mechanism to trivial, reversible decisions whose inputs and permissions cannot change materially. The overhead is justified by consequence, dispute likelihood and the cost of a false historical claim.
The smallest implementation worth building
An organisation does not need a three-dimensional database product to begin. Add immutable recorded_at and source-version identifiers to load-bearing facts. Capture the target time and cutoff in the decision request. Version the policy bundle and authorisation decision. Store an input manifest with included and excluded versions. Record clock or snapshot evidence where ordering matters. Return unresolved when a required join cannot be made.
Then run one incident through three replays. If latest-state, fact-time and temporal-entitlement results are identical, the extra structure may still prove why. If they differ, the design has already paid for itself by locating the leak. The minimum is not a warehouse. The minimum is a decision receipt that refuses to confuse current truth with historical entitlement.
sequenceDiagram participant Q as Question participant M as Mechanism participant E as Evidence participant D as Decision Q->>M: The payslip that arrived after the decision M->>E: Replace the database, preserve the visible history E-->>M: compare rival explanations E->>D: Judge the past inside its original decision slice D-->>Q: revise scope or act
Judge the past inside its original decision slice
Before this distinction, teams ask whether an old decision can be reproduced from historical data. After it, they ask a more exact question: can the decision be reconstructed from the facts, policy and authority that crossed its declared cutoff?
That question changes release criteria. For a consequential decision, do not rely on a load-bearing input unless the system can identify the time it describes, the version recorded before the cutoff, the authority and purpose that permitted its use, the policy version that interpreted it, and the receipt that binds those items to the action. When any element is missing, classify the historical judgement as indeterminate. Do not silently substitute the latest value.
It also changes incident response. Produce three outputs: the best action now, the validity of the historical process, and the control improvement required. Maya may deserve an immediate limit correction even when the 09:40 service used the only authorised version it had. The employer feed may still have failed its latency obligation. These findings can coexist.
Use the decision slice before assigning fault
Do not call a historical decision correct, incorrect or compliant until the replay excludes every fact, policy and permission that crossed the boundary after the original cutoff. If the slice is complete, judge the process under that slice and remediate the present under current truth. If the slice is incomplete, preserve uncertainty and fix the evidence architecture.
The past should not be judged by evidence it never possessed, and the present should not be trapped by what the past once knew.
Appendix
Glossary
- Valid time
- The interval in which a fact is asserted to hold in the modelled world.
- Transaction time
- The interval in which a fact is current in a database and retrievable, using the established temporal-database term.
- Record time
- In this paper, the interval in which a version has crossed the decision system’s evidence boundary and can be selected by its coordinated snapshot.
- Entitlement time
- The interval in which a version may be used for the declared principal, subject, purpose, action and resource under a versioned policy.
- Decision cutoff
- The point, uncertainty interval or consistency token defining which state the decision treats as knowable and authoritative.
- Decision slice
- The bound set of fact versions, policy, grants, executable configuration, provenance and receipts that causally supported one decision.
- Historical replay
- Reconstruction of the configured decision under its original slice, distinct from a counterfactual using later information.
- Watermark
- A progress estimate used in stream processing to reason about whether earlier event-time data may still arrive.
Appendix
References
Snodgrass, Richard T. “Temporal Databases.” In Theories and Methods of Spatio-Temporal Reasoning in Geographic Space, 1992. Primary paper.
Dyreson, Curtis E., et al. “A Consensus Glossary of Temporal Database Concepts.” SIGMOD Record 23(1), 1994. Primary paper.
Microsoft. “Temporal tables” and “Query data in a system-versioned temporal table.” Official overview; official query guide.
Akidau, Tyler, et al. “The Dataflow Model: A Practical Approach to Balancing Correctness, Latency, and Cost in Massive-Scale, Unbounded, Out-of-Order Data Processing.” PVLDB 8, 2015. Primary paper page. See also the Apache Beam programming guide for watermarks and late data.
W3C. “PROV-O: The PROV Ontology.” W3C Recommendation, 2013. Official specification.
Hu, Vincent C., et al. Guide to Attribute Based Access Control Definition and Considerations. NIST SP 800-162, 2014, updated 2019. Official publication.
Hu, Vincent C., David F. Ferraiolo and Rick Kuhn. Attribute Considerations for Access Control Systems. NIST SP 800-205, 2019. Official publication.
Pang, Ruoming, et al. “Zanzibar: Google’s Consistent, Global Authorization System.” USENIX ATC, 2019. Primary paper page.
Corbett, James C., et al. “Spanner: Google’s Globally-Distributed Database.” OSDI, 2012. Primary paper page.
Open Policy Agent. “Decision Logs.” Official documentation.
Cedar Policy Language. “Authorization” and “What is Cedar?” Official authorisation guide; official reference guide.