Description
Once captures exist from more than two substrates, the comparator has to answer a question it cannot answer today: is a difference between synth and reality a synthkit defect, or a legitimate difference between clouds?
The corpus already tags entries with a substrate — eks, k3s — and the report already prints it. What is missing is the semantics. A shape verified only on EKS is not evidence about AKS, but the comparator currently treats an absent AKS capture the same way it treats a matching one: silently. Once AKS and GKE land, a synthkit emission that matches EKS and contradicts GKE must produce a finding that names both, rather than one verdict that depends on which capture happened to be compared.
This is the seam that makes multi-cloud capture worth doing, and it must land before the per-cloud reconciliation work, or each new substrate will look like a wall of contradictions against a comparator that has no way to express “these clouds genuinely differ”.
Depends on at least one non-EKS managed capture existing, so it can be built against real divergence rather than an imagined shape.
Acceptance Criteria
- #1 A shape verified on one substrate is never treated as evidence about another
- #2 An emission that matches one cloud and contradicts another produces a finding naming both, not a single substrate-dependent verdict
- #3 A substrate with no capture for a signal reads as absent evidence, distinct from agreement
- #4 The report makes the substrate a finding applies to unambiguous
- #5 docs/reality-corpus.md documents how a legitimate cross-cloud difference is recorded versus a defect
Definition of Done
- #1 make gate (build vet test race rw-proto-check spdx-check forbidden-words)
- #2 make blueprint-schema (only if a blueprint field or construct/workload config struct changed)
- #3 DRY_RUN=true go run ./cmd/synthkit -once -dump — inventory diffed against signals/
Implementation Plan
2026-08-31 Lane E: implement substrate-keyed comparator semantics, preserve absent evidence as a gap, ingest the short clean GCP capture with exact duration, and refuse the mixed-provenance capture pending SKT-0042.
Implementation Notes
2026-08-31 verification: comparator findings remain document- and substrate-scoped, distinguish matching from absent evidence, and require every relevant document for a substrate to contain the signal before calling that substrate a match. The short GCP capture is retained as immutable provenance only; the ambiguous mixed AWS/Azure artifact was not ingested or relabelled and is tracked by SKT-0042. Final gates passed.
2026-09-06 per-AC evidence map: AC1 TestCompareCorpusDoesNotUnionSubstratesAndUsesArea; AC2-3 TestCompareCorpusNamesMatchingAndAbsentSubstrateEvidence and TestCompareCorpusRequiresEverySubstrateDocumentToContainSignalBeforeMatching; AC4 TestWriteFindingsReportNamesCrossSubstrateMatchAndAbsentEvidence plus the new grouped tuple-preservation regression; AC5 docs/reality-corpus.md Cross-substrate findings. All ran in the current just check. Status and checked criteria remain Done; grouping preserves the existing substrate contract.
Final Summary
2026-08-31: Implemented first-class substrate divergence and explicit absent-evidence reporting, documented the contract, and retained immutable GCP provenance without promoting a short capture into comparator evidence.