Summary
The talos CI job runs only talhelper validate talconfig — schema validation. A bad patch merge (e.g., the strategic-merge interface replacement in talos/patches/k8s-prod-N/network-extras.yaml) or an invalid VolumeConfig/UserVolumeConfig field passes CI and surfaces only during a manual task talos:generate-config, possibly mid-rollout. talhelper genconfig is never exercised in CI.
Additionally, each node's primary networkInterfaces block in talconfig.yaml is atomically replaced by the per-node patch, which restates it identically today — two sources of truth where the patch silently wins on divergence, with no CI signal.
Proposed work
- PR job (secret-free, per repo policy —
docs/repository-validation.md forbids SOPS keys on PR jobs): generate an ephemeral fixture secret via talhelper gensecret, run talhelper genconfig against talconfig.yaml + patches, and validate each node output with talosctl validate --mode metal.
- Assert generated Kubernetes/Talos versions match
talenv.yaml.
- Add a lint asserting
.nodes[].networkInterfaces is absent from talconfig.yaml (or equivalent rendered-field assertion), making the per-node patches the single interface source of truth.
- Optional trusted-main job: render with the real decrypted
talsecret.sops.yaml, scoped like the existing SOPS push gate.
Acceptance criteria
Related
Summary
The talos CI job runs only
talhelper validate talconfig— schema validation. A bad patch merge (e.g., the strategic-merge interface replacement intalos/patches/k8s-prod-N/network-extras.yaml) or an invalidVolumeConfig/UserVolumeConfigfield passes CI and surfaces only during a manualtask talos:generate-config, possibly mid-rollout.talhelper genconfigis never exercised in CI.Additionally, each node's primary
networkInterfacesblock intalconfig.yamlis atomically replaced by the per-node patch, which restates it identically today — two sources of truth where the patch silently wins on divergence, with no CI signal.Proposed work
docs/repository-validation.mdforbids SOPS keys on PR jobs): generate an ephemeral fixture secret viatalhelper gensecret, runtalhelper genconfigagainsttalconfig.yaml+ patches, and validate each node output withtalosctl validate --mode metal.talenv.yaml..nodes[].networkInterfacesis absent fromtalconfig.yaml(or equivalent rendered-field assertion), making the per-node patches the single interface source of truth.talsecret.sops.yaml, scoped like the existing SOPS push gate.Acceptance criteria
talenv.yamlfails CI.talconfig.yamlno longer shadows the patches.Related