Description
Found by SKT-0013.04. A three-way desync that must be fixed as one change or not at all.
SKT-0010.09 made the synth side classify log entries by SHAPE via inventory.ClassifyLogSource, because pod-log streams deliberately carry no source label and keying on it made them invisible to the comparator. Three other places still key on the raw source label:
- the capture receiver, so the reality side FUSES every source-less Loki lane — pod logs and object manifests together — into one entry whose union label set matches no shape rule and therefore no real capture;
- synthkit own text
-dump, whose source-less line carries a union of every source-less lane; e2e/inventory.ParseDump, which reads that dump.
Flipping any one alone breaks something. Changing only the receiver desyncs make e2e, whose Subset correlation compares receiver output against ParseDump output — they would key differently and the correlation would fail for a reason unrelated to what synthkit emits. That is why SKT-0013.04 correctly declined to touch it.
The consequence of leaving it: the reality side of the log comparison is a fictitious fused family, so pod-log evidence from a real capture still cannot pair with what synthkit emits even though the synth side is now correct. Half the fix is in.
All three should call the shared classifier SKT-0010.09 already created, so there is one rule rather than four implementations of the same guess.
Acceptance Criteria
- #1 The receiver, the text dump and ParseDump all key log entries through the shared classifier
- #2 They change together, and make e2e Subset correlation still passes
- #3 The reality side no longer fuses pod logs with object manifests into one union-labelled entry
- #4 Real captured pod-log evidence pairs with what synthkit emits, on both transports
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
Lane C owns the receiver, text-dump producer and ParseDump together: first add a failing correlation/classification test, then route all three through ClassifyLogStream and verify e2e Subset no longer fuses pod logs with manifests.
Add a failing text-dump projection regression for source-less pod logs and manifests. Route the text dump through the already-captured canonical inventory projection, preserve separate label/metadata keys, run focused checks and a sourced dump, then use exact-SHA hosted e2e as final Docker proof. The one local e2e invocation is recorded as failed and will not be repeated.
Implementation Notes
Dispatch preflight 2026-08-28: generic EXECUTION route gpt-5.6-luna/max and fork_turns=none confirmed before spawn. Post-spawn route metadata is unexposed by this Codex client; only lane name/status are observable, so absence is recorded as a limitation rather than treated as substitution.
ClassifyLogStream now keys synth projection, ParseDump and receiver correlation consistently; unit and e2e-tagged inventory/receiver package tests pass. Root make e2e reached the receiver comparison but failed on a separate 131-family CloudWatch/base-name inventory mismatch plus storage_operation_duration_seconds; the known state-volume permission warning was also present. No successful full Docker e2e claim is made.
Final evidence: receiver paths, synth inventory and ParseDump use ClassifyLogStream for Loki while OTLP remains resource-classified. The initial source-less fusion tests failed before the fix; final e2e-tagged inventory and receiver package tests passed, and the integrated make gate passed. The earlier Docker make e2e run reached the known pre-existing full-inventory comparison failure, not a Subset classifier regression.
2026-09-05: the mandatory local Docker e2e exposed one extra receiver family, k8s_manifests. The receiver and ParseDump use the shared classifier, but cmd/synthkit still prints lokiSink.Inventory(), which unions all source-less streams before classification. Adding Envoy pod logs makes that old dump defect observable. Reopen the existing exact-scope task; do not create a duplicate or weaken the comparison.
Final Summary
Unified Loki log-family keying across receiver capture, synth projection and text-dump parsing so pod logs no longer fuse with manifests. Verified with failing-first classifier tests, e2e-tagged package tests, and the integrated gate.
2026-09-05 correction: the earlier completion missed cmd/synthkit grouping source-less streams before classification. The root now projects captured streams through the canonical classifier before grouping. The regression failed first, focused checks and the explicit safe dump passed, and hosted ci run 33979908369 at 9abdd42425117ad241ed37648eff33690a2ab803 completed success including e2e and ci-success. This proves the corrected Subset correlation. The single local Docker invocation remains recorded as failed; it was not retried.