Description
Found by SKT-0010.09 when pod-log entries first became comparable.
The real k3d cluster carries pods with no Deployment owner and no node attribute — the corpus records exactly that variant as its second pod-log shape, with 8 attribute keys against the 11 of an owned, scheduled pod. buildPodLogEntries in internal/construct/k8scluster/podlogs.go always sets a Deployment, so synthkit never emits that variant on any transport.
Why it matters beyond one missing shape: an unowned or unscheduled pod is not an exotic edge case. A bare Pod, a pod between scheduling and admission, a pod owned by a Job or a CRD controller — all produce it, and all are normal in a real cluster. A user whose dashboard handles the absent-k8s_deployment_name case correctly gets no synthetic data exercising that path, so the panel that breaks in production looks fine against synthkit.
It currently cannot surface as a finding in either direction, which is why it needs a task rather than waiting for the gate to catch it. The corpus schema has no optional-key concept, so a family whose key set varies by pod state has no representation — under the old comparator identity it showed up as a whole MISSING log family, which was wrong in a more misleading direction, and under the new shape join it is absorbed silently.
So this is two things: the construct should model the variant, and the corpus schema probably needs a way to say “this key is present only for some members of the family” rather than forcing a choice between two families or one over-specified one.
Acceptance Criteria
- #1 synthkit emits pod logs for a pod with no Deployment owner and no node, on both transports
- #2 The absent attributes are omitted, never emitted empty
- #3 The corpus can express a key that is present for only some members of a family, or the reason it deliberately cannot is recorded
- #4 The variant is visible to the comparator rather than silently absorbed by the shape join
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 F adds the unowned and unscheduled pod-log variant on both transports and an optional-key comparator representation.
Implementation Notes
2026-08-30 closeout: both transports emit the unowned/unscheduled pod variant with absent owner/node keys omitted. Optional stream/metadata keys survive normalization and the comparator reports the reality-only variant without treating synth-only optional keys as contradictions. Final gates exited 0.
Final Summary
The pod-log estate now models and compares pods with no Deployment owner and no node on both transports.