Repository navigation
ci: repin ci-workflows to v0.58.0 - #8800
Merged
Merged
Conversation
Move every hand-maintained ci-workflows pin to v0.56.0 (1bb8953) and apply what the callers need between each old pin and it: - ci-status: pass step-name to aggregate-results (ci-workflows#814) and raise timeout-minutes from 3 to 5 for the rate-limit waits (ci-workflows#833). - check-managed-files: the job comment now says a merge group checks each queued pull request's diff (ci-workflows#823). - report-check-run: admit report-lane-outcome's install-failed and no-execution classes, so those runs keep their lane record (ci-workflows#813). - intake-reenter: rewrite the Accepted exposure paragraph for the trusted-comment filter (ci-workflows#782, ci-workflows#830). - Refresh the markdownlint cache key, the pr-verify replay pin and the hand-verified pin notes in README.md and check-docs-only-gate.sh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
…he exposure note Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
… v0.55.0 Move pr-review-hosted.yml and pr-review-security-hosted.yml from v0.48.0 to v0.55.0 (3a2c748), the release standards holds runner contracts for, and pass allowed-author-ids to the code-review lane so a trusted person's closing issue keeps its title and body (ci-workflows#828). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
kyle-sexton
added a commit
to melodic-software/standards
that referenced
this pull request
Oct 21, 2026
…829) Refs: melodic-software/ci-workflows#818 Refs: melodic-software/ci-workflows#819 ## Summary Registers ci-workflows [v0.56.0](https://github.com/melodic-software/ci-workflows/releases/tag/v0.56.0) (`1bb8953644d16f21d10718962c6702f01ea3308a`) contracts for `intake-triage.yml` and `intake-label-needs-triage.yml`. [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) repins both intake callers to that SHA, and its runner-policy gate fails with `runner-target-contract: the reusable workflow path@SHA has no reviewed runner-input contract (auto-approval declined: ... carries a reviewed allowedCallerPermissions grant; its steps cannot be proven unchanged by this surface diff, so auto-approval is declined)` for both. **Owner sign-off pending.** The README rollout line says "sign-off pending"; replace it with "signed off by hand on <date>" when you sign off. ## Fix - `components/runner-policy/policy.json`: - `intake-triage.yml@1bb8953`: a verbatim copy of the v0.55.0 entry (`3a2c748`). - `intake-label-needs-triage.yml@1bb8953`: a verbatim copy of the v0.42.0 entry (`182aca3`), the newest reviewed SHA for that file. - `components/runner-policy/README.md`: the v0.56.0 rollout line, sign-off pending. - `components/runner-policy/runner-policy.test.mjs`: a test that both v0.56.0 entries equal their source entries and that they are the only two keys at that SHA. ### Byte-identity evidence Git blob SHA of each file, from `gh api repos/melodic-software/ci-workflows/contents/.github/workflows/<file>?ref=<sha> --jq .sha`: | File | `182aca3` | `3a2c748` (v0.55.0) | `1bb8953` (v0.56.0) | |---|---|---|---| | `intake-triage.yml` | `fa4e86f8` | `d79b7e9e` | `d79b7e9e` | | `intake-label-needs-triage.yml` | `8d274a66` | `8d274a66` | `8d274a66` | `gh api repos/melodic-software/ci-workflows/compare/3a2c748...1bb8953` is one commit ([ci-workflows#836](melodic-software/ci-workflows#836)) touching nine files, all under `.github/actions/pr-require-checks/` plus `README.md`; neither intake file is among them. Against `182aca3`, the compare lists `intake-triage.yml` as modified (that file's reviewed SHA is `3a2c748`, not `182aca3`) and not `intake-label-needs-triage.yml`. No input, secret, caller permission, or `runs-on` routing changes. ## Verification - `npm run test:runner-policy`: 323 pass, 0 fail, including `✔ both intake contracts at the v0.56.0 tag copy their reviewed entries forward verbatim`. Adding an input to the new `intake-label-needs-triage` entry makes that test fail. - `npm run lint:runner-policy`: `Runner policy passed.` - Against the claude-code-plugins#8800 worktree (`--repository-visibility public`, worktree not modified): - with its vendored policy: the two `runner-target-contract` failures above, and no others; - with `--policy` set to this branch's `policy.json`: `Runner policy passed.`; - with this branch's `runner-policy.mjs` and `policy.json`: `Runner policy passed.` - Every other ci-workflows reusable that #8800 calls stays on a SHA that already has a contract (`pr-review` and `pr-review-security` at v0.48.0, `maintenance-check-links-online` at v0.55.0). The other v0.56.0 pins are composite actions, which need no contract. - lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks, biome): clean. ## Related - [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) passes its runner-policy gate once this merges and syncs. - Precedent: #828 (v0.55.0 verbatim copies), #811, #802. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
kyle-sexton
marked this pull request as ready for review
October 21, 2026 05:13
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
A full plan puts plugins/planning/shared/tests/ui.test.sh (41 browser suites, about 9.3 minutes by ui-timings.txt) in one leg with ~380 other suites, so the 9-minute limit cancels the leg on every full run, main dispatches included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
Move every ci-workflows composite pin at v0.56.0 to v0.58.0 (5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c), and the markdownlint cache key with it. v0.58.0's run-claude-cli defaults cli-version to latest and adds the handoff output; report-lane-outcome accepts fallback-reason auth. No other composite changed between the two tags. The pr-verify replay records the new pin and CLI_VERSION latest, and a live run resolves latest with npm view as lane.cjs does. cliArgs and legEnv are byte-identical across the two tags. intake-triage.yml and intake-label-needs-triage.yml stay at v0.56.0: the standards-managed runner policy has no reviewed contract for either reusable workflow at 5e18f3d6, and runner-policy.mjs rejects them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Key the subscription fallback on run-claude-cli v0.58.0's handoff output instead of lane-class credit-stop, as ci-workflows' intake-triage.yml does: a credit stop, or class auth with API status 401 or 402, hands the judgment on; a 403 does not, and the key job fails. - check-intent outputs handoff; Check the key leg, the key report and the subscription job's if read it. The key-leg warning tells a refused key (replace the secret) from a credit stop (rotate one in), with the class passed through env. - The subscription job's report goes back to the plain lane name pr-verify and says why it ran in fallback-reason (credit-stop, auth or no-key). The long lane string worked around ci-workflows#806, fixed in v0.55.0. - known-failure-class is unchanged: credit-stop reports as rate-limit, auth as auth. workflow.test.mjs holds the new gates and the fallback-reason literals, and fails if any if still keys on lane-class credit-stop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kyle-sexton
added a commit
to melodic-software/standards
that referenced
this pull request
Oct 21, 2026
…832) Refs: melodic-software/ci-workflows#840 Refs: melodic-software/ci-workflows#841 ## Summary Registers ci-workflows [v0.58.0](https://github.com/melodic-software/ci-workflows/releases/tag/v0.58.0) (`5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c`) contracts for `intake-triage.yml` and `intake-label-needs-triage.yml`, so [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) can repin both intake callers from v0.56.0 (`1bb8953`) to v0.58.0 and intake gets the 401/402 subscription handoff. **Owner review needed.** Unlike #829, `intake-triage` is not byte-identical to the SHA its copied entry reviewed. Its contract surface is unchanged, but its steps changed, so the gate cannot auto-approve it and the copy rests on the review below. The README rollout line says "sign-off pending"; replace it with "signed off by hand on <date>" when you sign off. ## Fix - `components/runner-policy/policy.json`: verbatim copies of the v0.56.0 (`1bb8953`) entries at `5e18f3d6`, for `intake-triage` and `intake-label-needs-triage`. No input, secret mapping, caller permission or routing is added or widened. - `components/runner-policy/README.md`: the v0.58.0 rollout line, sign-off pending. - `components/runner-policy/runner-policy.test.mjs`: a test that both v0.58.0 entries equal their v0.56.0 entries and are the only two keys at that SHA. ### Review basis Git blob SHAs (`git rev-parse <sha>:.github/workflows/<file>`): | File | `1bb8953` (v0.56.0) | `5e18f3d6` (v0.58.0) | |---|---|---| | `intake-label-needs-triage.yml` | `8d274a66` | `8d274a66` | | `intake-triage.yml` | `d79b7e9e` | `8ff8eac3` | `intake-label-needs-triage.yml` is byte-identical, so its copy has the same basis as #829. For `intake-triage.yml`, parsing both versions and comparing them structurally: `on.workflow_call` inputs (except the `cli-version` description), secrets and outputs are identical, as are the top-level permissions and every job's `permissions` and `runs-on`. The two jobs that hold `issues: write`, `apply` and `skipped`, are identical in full. The `claude`, `subscription` and `status` jobs changed (ci-workflows#840, #841). Please review these changes: 1. **CLI default goes from the pinned `2.1.304` to `latest`.** When the caller passes no `cli-version` and sets no `CLAUDE_LANE_CLI_VERSION` variable, run-claude-cli now installs whatever npm resolves as latest at run time, with a Claude credential in its environment ([L200](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L200), [L527](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L527), [L1053](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1053)). The contract does not model this. It is a supply-chain change. 2. **The subscription token is used in more cases.** The secret mapping is unchanged, but the `subscription` job, which holds `CLAUDE_CODE_OAUTH_TOKEN`, now runs when `handoff == 'true'`: after a credit stop as before, and also when the API refuses the key with status 401 or 402. A 403 stops the run ([L855](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L855)). 3. A new `handoff` job output on `claude` and `subscription` ([L340](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L340), [L866](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L866)). These are job outputs, not `workflow_call` outputs. 4. `fallback-reason: auth` in the subscription job's lane record ([L1295](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1295)), and a status-job warning and `class=auth` when the key was refused ([L1671](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1671)). The contract has no allowlist entry for the `skipped-label` input. That was already true at v0.56.0, and this PR leaves it unchanged. ## Verification - `npm run test:runner-policy`: 324 pass, 0 fail, including `✔ both intake contracts at the v0.58.0 tag copy their v0.56.0 entries forward verbatim`. - `npm run lint:runner-policy`: `Runner policy passed.` - End to end, against a temp copy of the claude-code-plugins#8800 worktree's `.github` with both intake callers repinned to `5e18f3d6` (`--repository-visibility public`): - with #8800's vendored `runner-policy.mjs` and policy: two `runner-target-contract` failures, `intake-label-needs-triage` ("carries a reviewed allowedCallerPermissions grant; its steps cannot be proven unchanged by this surface diff, so auto-approval is declined") and `intake-triage` ("inputs changed since the previously reviewed ...intake-triage.yml@182aca3..."), and no others; - with the vendored `runner-policy.mjs` and `--policy` set to this branch's `policy.json`: `Runner policy passed.`; - with this branch's `runner-policy.mjs` and `policy.json`: `Runner policy passed.` - lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks, biome): clean. ## Related - [claude-code-plugins#8800](melodic-software/claude-code-plugins#8800) can repin to v0.58.0 once this merges and syncs. - v0.58.0 also changes `pr-review.yml` and `pr-review-security.yml` (4 lines each). This PR adds no contracts for them. #8800 calls both at v0.55.0 (`3a2c748`), which already has contracts. - Precedent: #829 (v0.56.0 verbatim copies), #828. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs: melodic-software/ci-workflows#818
Refs: melodic-software/ci-workflows#819
Refs: melodic-software/ci-workflows#782
Summary
This moves the two locally owned review lane callers to v0.55.0 (see below). The other hand-maintained
melodic-software/ci-workflowscomposite pins move to v0.58.0 (5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c). The two reusable intake callers,intake-triage.ymlandintake-label-needs-triage.yml, stay at v0.56.0 (1bb8953) until the standards runner policy approves v0.58.0 contracts for them.The PR also applies what the callers need from each release in between:
handoffoutput.pr-verifylane name, with the reason infallback-reason.intake-reenter.yml"Accepted exposure" paragraph is updated for the trusted-comment filter (ci-workflows#782 / #830).Fix
Pins moved:
.github/workflows/pr-require-checks.yml(21 composite pins,check-managed-filesamong them, and the markdownlint npx cache key)594987a.github/workflows/pr-verify.yml(run-claude-cli,apply-claude-managed-settings,report-lane-outcome)7b36242.github/workflows/pr-run-activity-read.yml,pr-run-activity-write.yml(report-lane-outcome)64fd515.github/workflows/maintenance-audit-test-selection.yml(shellcheck)ab83b01.github/workflows/intake-triage.yml7b36242.github/workflows/intake-label-needs-triage.yml182aca3Changes the callers needed, v0.39.4 through v0.58.0:
run-claude-clidefaultscli-versiontolatest(it was 2.1.304). pr-verify passes nocli-version, so the verifier now runs the newest Claude Code release. The action's npm-signature and GPG-manifest checks still verify it (#819)..github/scripts/pr-verify/probe/replay.mjsrecordsRUN_CLAUDE_CLI_PIN=5e18f3d6…andCLI_VERSION=latest. A live replay resolveslatestwithnpm view @anthropic-ai/claude-code version, aslane.cjsdoes, and refuses a local CLI that differs.cliArgsandlegEnvinlane.cjsare byte-identical between7b36242and5e18f3d6, andapply-claude-managed-settingsis unchanged.New
handoffoutput onrun-claude-cli(v0.57.0 #840, narrowed in v0.58.0 #841):trueonly when the key leg ended in a credit stop, or in classauthwith API status 401 or 402.false, and the output is empty when the step failed before the leg ran.pr-verify now follows ci-workflows'
intake-triage.ymlat v0.58.0:check-intentoutputshandoff.if, and thecheck-intent-subscriptionjob'sifkey onhandoff == 'true'instead oflane-class == 'credit-stop'.known-failure-classis unchanged: a credit stop reports asrate-limit, auth asauth.report-lane-outcomefallback-reason(#834; v0.57.0 addsauth). The subscription job's report no longer builds the longlane:string, which worked around ci-workflows#806, fixed in v0.55.0. It passeslane: pr-verifyand afallback-reasonofcredit-stop,authorno-key, using the same expression as intake-triage.docs/conventions/pr-pipeline/README.md(Funding) and a pr-pipeline changelog fragment describe the new rule.run-claude-cliruns one leg per invocation (#803, v0.54.0). pr-verify already uses the two-job pattern from feat(pr-pipeline): run pr-verify's model on the key first and the subscription token only on a credit stop #8577.report-lane-outcomeemitsinstall-failedandno-execution(#813, v0.55.0;install-failedis newer than the v0.43.0 pin)..github/actions/report-check-run/lane-record.mjsdrops the lane record for any class outside its allowlist, so a pr-run-activity run that left no execution file would have lost its record. Both classes are added, with a test that fails without the change.aggregate-resultsfinds its own gate job byjob.check_run_idand step name (#814). ci-status now passesstep-name: Aggregate lane results, as ci-workflows' own ci-status does.ci-status waits out GitHub API rate limits (#833). Two 60 s waits, the retries and the 90 s re-run wait add up to about four minutes, so ci-status
timeout-minutesgoes from 3 to 5, as feat(toolchain): add lychee-offline to cross-cutting ecosystem default #833 sets in its own workflow and README.check-managed-fileschecks each queued PR's own diff in a merge group (#823). feat(planning): add incumbent mode to devils-advocate #823 named the job comment saying a merge group "passes" as stale at this bump, so it is rewritten. The job already grantspull-requests: read, which that mode needs.aggregate-resultsaccepts a carried writer only from a full run (#826). No caller change is needed: a full run here runs many jobs, whichjob_shapereads asfull, and its 12 jobs fit theper_page=100jobs read.The markdownlint default moves to 0.23.3 (#809). The npx cache key is keyed on the composite pin, so it now names
5e18f3d6.intake-triage (#821, #830): caller inputs, secrets and the
contents: read/issues: writegrant are unchanged. The trusted-comment filter readsallowed-author-ids, which this caller already fills from the trusted-actor list (human-ids, which includes 153232337), andallowed-bot-sender-ids.The rest are additive, optional inputs:
check-contractissue-ref-patternandrate-limit-wait-seconds, andreport-lane-outcomefallback-reason,install-outcomeandknown-failure-class. Amerge_grouppath was added tocheck-contract,aggregate-resultsandgitleaks.Re-verified hand-maintained notes:
aggregate-resultsandcheck-machine-pathshave no diff between1bb8953and5e18f3d6, so thecontract-onlyclaim holds. The pin notes inREADME.mdandscripts/check-docs-only-gate.shmove to v0.58.0, dated 2026-10-21.intake-reenter.yml: the "Accepted exposure" paragraph now says what the triage run passes the model:allowed-author-ids/allowed-bot-sender-idsauthors, and never the lane's own comment.The sentence saying this work belonged in ci-workflows is removed, because #830 did it.
Review lane callers (locally owned), pinned to v0.55.0
.github/workflows/pr-review-hosted.ymland.github/workflows/pr-review-security-hosted.ymlarelocally-ownedfor this repository in the standardsdistribution/sync-manifest.yml(claude-review-hosted-caller,claude-security-review-hosted-caller), and their headers say so. Both move from v0.48.0 (96b50d4) to v0.55.0 (3a2c748fdef9cfb9ceec5a66289e21842189689f). Standards already holds approved runner contracts for both reusables at3a2c748. The local resolve-model, kill-switch and model-args wiring stays as it is.What the callers need from v0.48.0 to v0.55.0:
pr-review.ymlgainsallowed-author-ids, which defaults to empty. When it is empty, every same-repository closing issue written by a person becomes a placeholder. The code-review caller now passesallowed-author-ids: '153232337', thehumanentry of.github/standards/trusted-actors/trusted-actors.json, with the comment from standardscomponents/claude-lanes-hosted/claude-review.yml. The comment's sentence abouttrusted-actors.test.mjsis left out, because that test does not cover this file.pr-review-security.ymlhas no such input, so the security caller gets nothing new.sandbox-unavailable,install-failedandno-executionto the lane's failure-class output. These callers do not read that output.on.workflow_callinputs and job permission lines are otherwise unchanged between96b50d4and3a2c748, so the callers' grants and their singleCLAUDE_CODE_OAUTH_TOKENsecret stay as they are.Intake reusable callers held at v0.56.0
runner-policy.mjsrejectsintake-triage.yml@5e18f3d6andintake-label-needs-triage.yml@5e18f3d6, because the syncedpolicy.jsonhas no reviewed contract for either at v0.58.0. That file is standards-managed. Both callers stay at1bb8953, which the synced policy approves. A standards PR adding v0.58.0 contracts, then a follow-up repin, brings the intake lane the same auth handoff andlatestCLI default.Sync-managed files left to the standards sync (hand-editing them fails
check-managed-files):.github/workflows/pr-check-managed-files-hosted.yml(v0.55.0)..github/workflows/maintenance-check-links-online-claude-code-plugins.yml(v0.55.0)..github/standards/runner-policy/policy.json.Verification
actionlint(1.7.12, repo config) on the five changed workflows: no findings.node --test:workflow.test.mjs: 14/14, including new assertions on the handoff gates, the plain lane plusfallback-reason, and that noifkeys onlane-class == 'credit-stop'.parity.test.mjs13/13,replay.test.mjs11/11,write-verdict.test.mjs11/11,resolve-pr.test.mjs26/26,resolve-config/callers.test.mjs22/22.scripts/check-affected.sh --tests: 11 passed, 3 skipped (no plugin,.pyor skill changes).node .github/standards/runner-policy/runner-policy.mjs --root .: "Runner policy passed." The syncedpolicy.jsonnow holds the1bb8953contracts, so the earlier expected red is gone.scripts/check-changelog-fragments.sh --check: all fragments are valid.pr-require-checks.yml, so its AI review lanes skip themselves.Related
intake-triage.ymlandintake-label-needs-triage.ymlto v0.58.0 once standards approves their contracts.🤖 Generated with Claude Code