Description
SKT-0015.02 landed declarable churn on network_topology only, rotating network_topology_edge_info identities and retiring the gauges with state.DeleteGauge. It deliberately excluded Kubernetes identity, and recorded the reason: pod, node and storage identities are deterministic cross-signal joins.
Decision taken 2026-08-28 (Rob): add pod lifecycle churn as well. Edge churn alone is too narrow a signal for the detectors this feature exists to test. Pods are the highest-volume churning identity in a real cluster and the one a new-series detector actually sees.
The exclusion reasoning was right and still binds. This is not a reversal of SKT-0015.02’s decision, it is the harder case it declined to take on. Pod names and UIDs are seeded (seed:cluster, clusterSeed), ordinal pods share names but differ by UID, and resolve to liveCluster byte-parity is tested. Churn must NOT reseed any of that.
What churn means here is a whole pod identity reaching end of life and a new one starting – the same thing a real rollout, eviction or node drain does. Concretely:
- A churned pod stops emitting across EVERY signal it participates in: its metric series, its Loki and OTLP log streams, its trace resource. A pod that vanishes from metrics but keeps logging is a shape no cluster produces, and it is the obvious way to get this wrong.
- Its retired gauges are deleted, as
network_topologydoes, not left to go stale. - The replacement is a new pod identity drawn from the same deterministic scheme, not a reseed of the existing one. The k8s churn baseline recorded for the real Karpenter cluster is the realism reference: real churn is node lifecycle plus pod-startup transients, not background errors.
- The active pod count stays bounded. Churn replaces, it does not grow the estate.
Reuse the network_topology mechanic where it generalises rather than writing a second one. Whatever seam carries the rate should be the same shape for both, so a blueprint declares churn one way.
Cross-signal coherence is the acceptance risk, not the rate arithmetic. Test that a churned pod disappears from every lane in the same tick.
Acceptance Criteria
- #1 A blueprint declares a pod churn rate and the active pod set turns over at approximately that rate without growing
- #2 A churned pod stops emitting across metrics, logs and traces in the same tick, proven by a cross-signal test
- #3 Retired pod gauges are deleted rather than left stale
- #4 Deterministic cluster-scoped identity is unchanged: pod UID, volume identity and cluster seeds still pass their existing determinism tests
- #5 The churn rate is declared through the same seam shape as network_topology, not a second unrelated field
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 after SKT-0013.09: add pod lifecycle churn using the existing churn seam shape, test same-tick retirement across metrics/logs/traces, delete retired gauges, and preserve deterministic cluster-scoped identity. Return root-owned blueprint/schema wiring requests.
Implementation Notes
Lane C dispatch preflight: EXECUTION route requested as gpt-5.6-luna/max with fork_turns=none; Delegation forbidden. Lane A code base 25e8c040 is exact-SHA green including e2e and ci-success.
Final verification: focused lifecycle tests prove bounded turnover, same-tick retirement across metrics/logs/traces, gauge deletion, deterministic replacement UIDs, stable StatefulSet ordinal names and retained PVC identity. The shared series_churn_per_minute seam is generated in the schema and exercised by k8s-logs-events. Existing determinism tests and the complete make gate pass; the complete 28-blueprint dry-run inventory and make e2e at 650/650 also pass.
Exact implementation SHA 1729e2068321fc53b6d973a6fc981fc1066c4c42 passed GitHub ci run 33186760476, including signal-fidelity, go, docker, hygiene, helm, ui, secret-scan, e2e and ci-success.
Final Summary
Added bounded pod lifecycle churn through the shared churn seam with coherent metrics/logs/traces retirement, gauge deletion and deterministic identity preservation; focused cross-signal tests and full gates passed.