Part of #168 (gap analysis: data-model integrity). ## Problems (from the #168 gap analysis) 1. **Unresolved-reference diagnostics** — the indexer `MERGE`s missing occurrences instead of flagging dangling cross-record references; #168 requires actionable diagnostics rather than silently creating an incomplete graph. 2. **Deployment history** — `RUNS` is keyed only by (deployment, occurrence), so deployment-state changes can overwrite history; #168 requires preserving history (like `POINTED_TO`/`REFERS_TO`). 3. **Tag validity intervals** — `POINTED_TO` stores `observedAt` but no derivable validity interval. ## Acceptance criteria - [ ] Indexer emits diagnostics for unresolved references (opt-in strict mode acceptable). - [ ] Deployment events are append-only / history-preserving. - [ ] Tag→digest relationships expose a validity interval when derivable. - [ ] Tests + docs updated.
Part of #168 (gap analysis: data-model integrity).
Problems (from the #168 gap analysis)
MERGEs missing occurrences instead of flagging dangling cross-record references; Supply-chain graph: define file-backed artifact discovery and lineage requirements #168 requires actionable diagnostics rather than silently creating an incomplete graph.RUNSis keyed only by (deployment, occurrence), so deployment-state changes can overwrite history; Supply-chain graph: define file-backed artifact discovery and lineage requirements #168 requires preserving history (likePOINTED_TO/REFERS_TO).POINTED_TOstoresobservedAtbut no derivable validity interval.Acceptance criteria