Follow-up runtime work for the temporal fact-supersession contract landed in #20 (schema + reference filter + teeth). The contract and reference temporal_retrieve filter exist; this issue is the runtime wiring into the live retrieval path, which is out of scope for the contract PR.
Context
- Contract:
schemas/search/temporal-fact.schema.json
- Reference filter:
tools/validate_temporal_supersession.py :: temporal_retrieve(facts, entity, relation)
- Behavior: high-recall candidate pass → suppress facts marked superseded (
superseded_by/superseded_at) → most-recent (max valid_from) surviving fact per (entity, relation) is authoritative.
- Cross-ref: prophet-workspace#76
Runtime work
- Project graph edges / epistemic-edge records into
temporal-fact records at index time (map valid_time.from/to / temporalScope.validFrom/validTo → valid_from/valid_to; carry superseded_by/superseded_at from ACR decision-ledger / epistemic-edge promotionState: superseded).
- Apply the supersession suppression in the retriever's high-recall pass (exclude, or hard-downrank, facts marked superseded).
- Apply max-
valid_from-wins tie-break per (entity, relation) in the re-ranker.
- Keep
claims_canonical_truth = false end to end; canonical authority stays with ACR / epistemic-edge.
Acceptance criteria
Follow-up runtime work for the temporal fact-supersession contract landed in #20 (schema + reference filter + teeth). The contract and reference
temporal_retrievefilter exist; this issue is the runtime wiring into the live retrieval path, which is out of scope for the contract PR.Context
schemas/search/temporal-fact.schema.jsontools/validate_temporal_supersession.py :: temporal_retrieve(facts, entity, relation)superseded_by/superseded_at) → most-recent (maxvalid_from) surviving fact per(entity, relation)is authoritative.Runtime work
temporal-factrecords at index time (mapvalid_time.from/to/temporalScope.validFrom/validTo→valid_from/valid_to; carrysuperseded_by/superseded_atfrom ACR decision-ledger / epistemic-edgepromotionState: superseded).valid_from-wins tie-break per(entity, relation)in the re-ranker.claims_canonical_truth = falseend to end; canonical authority stays with ACR / epistemic-edge.Acceptance criteria
(entity, relation)with no supersession returns its single fact unchanged.valid_from,superseded_at < valid_from,valid_to < valid_from) are rejected at index time — the live path reuses/mirrorsvalidate_temporal_supersession.py.