Skip to content

feat!: remove the ci-runner canary and production HA-proof apparatus - #125

Merged
kyle-sexton merged 2 commits into
mainfrom
chore/remove-canary-apparatus
Jul 16, 2026
Merged

feat!: remove the ci-runner canary and production HA-proof apparatus#125
kyle-sexton merged 2 commits into
mainfrom
chore/remove-canary-apparatus

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Summary

Part of the canary decommission (companion to melodic-software/provisioning#145). 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, so the isolated canary acceptance contract and the production HA-proof rollout gate have no callers — their only sanctioned caller, the private ci-runner-canary repository, is being decommissioned via github-iac.

  • Delete local-runner-canary.yml + production-ha-proof.yml reusable workflows, their runtime/test/generator scripts (production-ha-proof.cjs + test + renderer, local-runner-canary.test.cjs, local-runner-parity.sh), and the templates/ci-runner-canary/ seed — the repo's only template.
  • Delete fetch-immutable-workflow-pins.cjs + test: template workflows were its only subject; with no templates left, it had nothing to pin. Removed its invocation steps from ci.yml and selector-conformance.yml.
  • tool-version-drift-check: drop the canary-runtime drift block plus the now-unused latest_dotnet_sdk/latest_node_runtime/latest_python_runtime helpers; those runtime pins existed only for the canary parity contract. Absorb-procedure prose updated to match.
  • selector-conformance: remove deleted-file path triggers.
  • dotnet-build / dotnet-format / dependabot-lock-regen: fallback-SDK comments now track only the root global.json (previously "in lockstep with" the canary workflow's default).
  • README: canary/HA-proof sections removed; two ambiguous generic-"canary" phrases in OSV guidance reworded to explicit consumer verification runs.

The manual failover/power-proof operator knowledge is preserved in provisioning/runbooks/ci-runner-manual-proofs.md (PR #145).

Verification

  • node --test .github/scripts/*.test.cjs: 191/191 passing locally.
  • lychee --offline: 0 errors.
  • actionlint over all four edited workflows: clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF

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
@claude

claude Bot commented Jul 16, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 14s —— View job


PR Review

  • Gather context and understand the request
  • Review changed/modified files
  • Check CLAUDE.md security and pin rules
  • Verify no dangling references to deleted artifacts
  • Post review findings

This is a clean decommission. The deletions are comprehensive, the modified files are internally consistent, and no cross-cutting references to the removed artifacts survive. A few minor observations below.

Security (CLAUDE.md rules)

No violations:

  • No pull_request_target or workflow_run events introduced
  • All uses: SHA pins in the modified files are untouched
  • No permissions are widened
  • Secrets context and log-hygiene rules are unaffected

Findings

1. Stale job name in selector-conformance.yml

selector-conformance.yml line 53 still reads:

name: Selector and immutable-pin tests

The step name at line 69 was correctly updated to Test selector implementation and generation, but the parent job's display name was not. This is cosmetic — it shows as a stale label in the Actions UI — but worth tidying to match the step rename.

Fix this →

2. Now-unnecessary fetch-depth: 0 and lfs: true in checkout steps

Two checkout steps that previously served fetch-immutable-workflow-pins.cjs (which required full history for PR refs) and the LFS fixture in templates/ci-runner-canary/ can be simplified:

Neither is broken — lfs: true is a no-op when no LFS objects exist, and fetch-depth: 0 just adds unnecessary full-history cost. These can be dropped to fetch-depth: 1 without lfs: in a follow-up, or addressed here since the cause is being removed in the same PR.

Everything else checks out

  • No remaining references to any deleted file anywhere in .github/ or README.md (grep clean)
  • network-timeout-policy.test.cjs count update (6→3) correctly matches the 3 remaining curl_small_json call sites in tool-version-drift-check.yml (latest_pypi, latest_npm, and the Go proxy direct call)
  • Both path-filter blocks in selector-conformance.yml (pull_request and push) are symmetric after removals
  • README rewrites replacing "canary" with "consumer's verification run" / "verification run" are complete and accurate
  • Absorb-procedure prose in tool-version-drift-check.yml no longer references canary runtime bump steps

@claude

claude Bot commented Jul 16, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 21s —— View job


PR Review (updated for 3628dec)

  • Gather context
  • Inspect what changed in the follow-up commit (3628dec)
  • Verify previous findings were addressed
  • Post updated review

Follow-up commit (3628dec)

The second commit removes 7 link reference definitions from README.md that became orphaned when the canary and HA-proof sections were deleted in the first commit:

[dependency-cache], [job-workflow-context], [native-aot], [runner-group-rest], [runner-scale-set-ha], [workflow-artifacts], [workflow-cancellation]

A grep of the current README confirms zero remaining [text][label] references to any of these identifiers — the removal is complete and correct. This is a good catch; orphaned link definitions produce no visible breakage but add noise to the link-definition block.

Status of previous findings

The two observations from the earlier review remain open:

1. Stale job name in selector-conformance.yml — not addressed

selector-conformance.yml line 53 still reads:

name: Selector and immutable-pin tests

The immutable-pin test step was removed; the job name no longer matches what the job actually does. Cosmetic, but a one-word fix.

Fix this →

2. Now-unnecessary fetch-depth: 0 and lfs: true — not addressed

Both selector-conformance.yml (lines 62–63) and ci.yml (lines 357–358) still carry fetch-depth: 0 and lfs: true on their checkout steps. The full-history depth was needed by the now-deleted fetch-immutable-workflow-pins.cjs; the LFS flag served the templates/ci-runner-canary/fixtures/lfs/ fixture. Neither is needed today. Neither breaks anything, but they add unnecessary CI cost.


Overall

Both commits together form a clean, comprehensive decommission. No security rule violations, no dangling references, no widened permissions. The two open items above are cosmetic / efficiency nits — neither blocks merge.

@kyle-sexton
kyle-sexton merged commit 1ecc8a9 into main Jul 16, 2026
37 checks passed
@kyle-sexton
kyle-sexton deleted the chore/remove-canary-apparatus branch July 16, 2026 22:10
kyle-sexton added a commit to melodic-software/standards that referenced this pull request Jul 16, 2026
## Summary

Part of the CI-runner canary decommission (companion to
melodic-software/provisioning#145 and
melodic-software/ci-workflows#125). The
`melodic-canary-ubuntu-24.04-x64` scale set is being removed via
github-iac, so its enumerated coverage entry in the managed-namespace
test and the "and canary forms" prose mention are retired. The
managed-namespace pattern itself is untouched and still generically
forbids every owner-prefixed scale-set label.

Deliberately left alone: the generic "reviewed canary contract" test
fixture string (unrelated to the CI-runner canary) and
`policy.json`/schemas (the canary label was matched by pattern, never
listed).

## Verification

- `node --test components/runner-policy/runner-policy.test.mjs`: 145/145
passing locally.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
kyle-sexton added a commit to melodic-software/ci-runner that referenced this pull request Jul 16, 2026
## Summary

Part of the CI-runner canary decommission (companion to
melodic-software/provisioning#145, melodic-software/ci-workflows#125,
melodic-software/standards#157). No functional change — prose and one
Detail string only.

- `docs/roadmap.md`: deferred-capability admission now requires "a first
rolling-host rollout under production traffic with the documented health
checklist" instead of a canary.
- `docs/worker-image.md`: runtime isolation is observed live during each
release's first rolling-host rollout; the zstd origin story is marked as
the *retired* canary process (historical record kept).
- `internal/app/doctor_inspector.go` + `doctor_test.go`:
`github-jit-proof` skip rationale updated together — the first enable on
a rolling-host rollout performs the JIT proof under real traffic.
- `.github/workflows/dependency-drift.yml`: PR-body guidance now says
"CI, a rolling-host rollout, and independent review".
- `README.md`: drops "isolated canary" from the acceptance-gate
sentence.

## Verification

- `go test ./...` locally: all pass except
`TestCurrentUserNamedPipeRoundTrip`, which fails identically on an
unmodified tree because this machine's live production controller owns
the control pipe — environmental, not related; hosted CI has no live
controller.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3628dec1b6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/tool-version-drift-check.yml
kyle-sexton added a commit that referenced this pull request Jul 16, 2026
## 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:

- Reads the canonical pins from the tree: root `global.json` (.NET SDK),
`markdown` action's `node-version` default, `ruff` action's
`python-version` default.
- Fails closed if any family's pins diverge across the tree (biome/tsc
node defaults; pyright/check-jsonschema python defaults;
dotnet-build/dotnet-format/dependabot-lock-regen fallback SDK pins vs
`global.json`).
- Compares each agreed pin against the upstream first-party release
index within its reviewed major/minor line (same
`latest_dotnet_sdk`/`latest_node_runtime`/`latest_python_runtime`
lookups the canary block used).
- Absorb-procedure guidance updated to say runtime bumps update every
matching default in lockstep.

No linked issue.

## Related

- #125 (canary apparatus removal that orphaned these pins)

## Verification

- `node --test .github/scripts/*.test.cjs`: 191/191 locally.
- `actionlint`: clean.
- Consistency logic dry-run against the current tree: all families agree
(dotnet 10.0.302, node 24.18.0, python 3.14).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01TPPLWAtX5BWyEmghrKkYYF

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant