feat: track shipping runtime pins in the drift check - #127
Conversation
The org's CI-runner release process now installs releases one host at a time under real production traffic with a cheap lock-revert rollback (melodic-software/provisioning#145), so the isolated canary acceptance contract and the production HA-proof rollout gate have no callers. - Delete the local-runner-canary and production-ha-proof reusable workflows, their runtime/test/generator scripts, the canary-only hosted/self-hosted parity check, and the templates/ci-runner-canary seed (the repository's only template). - Delete the immutable-workflow-pins fetcher and test: template workflows were its only subject, so it has nothing left to pin. - tool-version-drift-check: drop the canary-runtime drift block and its now-unused runtime-lookup helpers; the pinned runtimes existed only for the canary parity contract. - Reword dotnet action fallback comments to track only the root global.json, and replace ambiguous generic-"canary" wording in the OSV guidance with explicit consumer verification runs. BREAKING CHANGE: the local-runner-canary.yml and production-ha-proof.yml reusable workflows no longer exist; their only sanctioned caller (melodic-software/ci-runner-canary) is being decommissioned. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF
The removed canary-runtime drift block was incidentally the only watch on runtime pins that still ship: composite-action node-version and python-version input defaults, the root global.json SDK, and the dotnet actions' fallback pins. Watch those directly instead — require each family's pins to agree across the tree, then compare the agreed pin against the upstream first-party release index within its reviewed line. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF
…pparatus # Conflicts: # .github/workflows/tool-version-drift-check.yml
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF
Review complete
This is a clean, well-structured follow-up. The fail-closed consistency check (diverging sibling pins → hard error before upstream comparison) is exactly the right design; it prevents the drift check from silently picking a stale or incorrect baseline. The test bump from 3→6 Findings1. Unescaped dots in if ! grep -q "dotnet-version: ${dotnet_current}$" "$file"; then
if ! grep -q "dotnet-version: ${dotnet_current//./\\.}$" "$file"; thenIn practice version strings won't trigger this, but it's a latent correctness gap that's cheap to close. Fix this → 2. Lines 174–181: the jq filter is 3. Push trigger doesn't include runtime action files — low priority / likely intentional The new runtime consistency check reads SummaryThe core logic is correct and the design choices are sound. Finding #1 is the only concrete correctness gap (unescaped regex metacharacters); findings #2 and #3 are informational. No security concerns — new code does not expand credential scope, does not reach for privileged context, and the three new |

Summary
Follow-up to #125, addressing its Codex review finding: the removed canary-runtime drift block was incidentally the only watch on runtime pins that still ship. The daily drift check now watches those pins directly:
global.json(.NET SDK),markdownaction'snode-versiondefault,ruffaction'spython-versiondefault.global.json).latest_dotnet_sdk/latest_node_runtime/latest_python_runtimelookups the canary block used).No linked issue.
Related
Verification
node --test .github/scripts/*.test.cjs: 191/191 locally.actionlint: clean.🤖 Generated with Claude Code
https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF