diff --git a/.github/actions/resolve-config/callers.test.mjs b/.github/actions/resolve-config/callers.test.mjs index 57cca294b1..81810a9452 100644 --- a/.github/actions/resolve-config/callers.test.mjs +++ b/.github/actions/resolve-config/callers.test.mjs @@ -1537,7 +1537,7 @@ test("pr-run-activity-read.yml: the run job can only read, and each launcher ste const { jobs } = workflow("pr-run-activity-read.yml"); assert.deepEqual(jobs.run.permissions, { contents: "read", "pull-requests": "read" }, "read-only, no id-token"); const step = (id) => jobs.run.steps.find((s) => s.id === id); - const launcher = "melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52"; + const launcher = "melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8"; for (const [id, input, secret] of [ ["act-key", "api-key", "claude-api-key"], ["act-token", "subscription-token", "claude-code-oauth-token"], @@ -1594,12 +1594,13 @@ test("no run-claude-cli plugin-dirs or add-dirs value names runner.temp, RUNNER_ // Launcher SHAs checked to pass `--permission-prompts none` unconditionally, // under which the default mode denies every call no rule allows, as dontAsk // does; check-permission-mode.sh accepts default for dontAsk on that basis. -// 7b362428: lane.cjs:311-312; 164c2809: lane.cjs:355-358; d02b8697: lane.cjs:357-358; in cliArgs. A pin +// 7b362428: lane.cjs:311-312; 164c2809: lane.cjs:355-358; d02b8697 and e5167fc2: lane.cjs:357-358; in cliArgs. A pin // bump fails here until its lane.cjs is read and its SHA added. const PERMISSION_PROMPTS_NONE_LAUNCHERS = new Set([ "7b362428c76085a160e28656cd2c75c3147a69ff", "164c2809f6150429b6f24d4a2777bb377af953d9", "d02b8697e092705153f0996549b05f95a446bb52", + "e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8", ]); test("pr-run-activity-read.yml: every run-claude-cli pin is a launcher checked to pass --permission-prompts none", () => { @@ -3702,7 +3703,7 @@ test("scan job: every gate, skip and launcher class value the runner sets passes const schema = JSON.parse(read("../../../docs/conventions/pr-pipeline/pr-pipeline.schema.json")); const gateReasons = Object.keys(JSON.parse(read("../report-check-run/gate-skip-reasons.json"))); // run-claude-cli's failure classes, the keys of SUMMARY_NOTES in lane.cjs at - // the pinned d02b8697. cant-fail-ok: an external contract's value list. + // the pinned e5167fc2. cant-fail-ok: an external contract's value list. const laneClasses = ["credit-stop", "rate-limit", "auth", "overloaded", "max-turns", "timeout", "other"]; const cases = [ ...schema.$defs["skip-reason"].enum.map((value) => ["skip-reason", value]), diff --git a/.github/scripts/pr-verify/probe/replay.mjs b/.github/scripts/pr-verify/probe/replay.mjs index 9ed9a30b6d..38665d6930 100644 --- a/.github/scripts/pr-verify/probe/replay.mjs +++ b/.github/scripts/pr-verify/probe/replay.mjs @@ -60,7 +60,7 @@ const REPOSITORY = "melodic-software/claude-code-plugins"; // apply-claude-managed-settings to. cliArgs, LEG_ENV, CLI_VERSION and // MANAGED_SETTINGS were read from that SHA; the parity test fails when the // pin moves, so they are read again. -export const RUN_CLAUDE_CLI_PIN = "d02b8697e092705153f0996549b05f95a446bb52"; +export const RUN_CLAUDE_CLI_PIN = "e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8"; export const CLI_VERSION = "latest"; export const MANAGED_SETTINGS = Object.freeze({ apiKeyHelper: "", diff --git a/.github/workflows/intake-triage.yml b/.github/workflows/intake-triage.yml index 192fcbdc2c..a17a76f710 100644 --- a/.github/workflows/intake-triage.yml +++ b/.github/workflows/intake-triage.yml @@ -201,7 +201,7 @@ jobs: concurrency: group: intake-triage-${{ github.event.issue.number || inputs.issue-number || github.run_id }} cancel-in-progress: false - uses: melodic-software/ci-workflows/.github/workflows/intake-triage.yml@215cec5c362f953f8b6196effb04451696c3f970 # 215cec5 2026-10-25 v0.65.10 + uses: melodic-software/ci-workflows/.github/workflows/intake-triage.yml@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 with: runner: ubuntu-24.04 role: intake diff --git a/.github/workflows/pr-review-hosted.yml b/.github/workflows/pr-review-hosted.yml index e3a4eced58..ce89a51910 100644 --- a/.github/workflows/pr-review-hosted.yml +++ b/.github/workflows/pr-review-hosted.yml @@ -169,7 +169,7 @@ jobs: contents: read pull-requests: write # the review, its inline comments and the lane's # reviewed-head marker comment - uses: melodic-software/ci-workflows/.github/workflows/pr-review-cli.yml@4fbceb4b75ffd568dfa5db31de0d0e753c0c64e6 # v0.65.9 + uses: melodic-software/ci-workflows/.github/workflows/pr-review-cli.yml@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 with: lane: code publish: comments diff --git a/.github/workflows/pr-review-security-hosted.yml b/.github/workflows/pr-review-security-hosted.yml index 68204fda3b..78f9cd024d 100644 --- a/.github/workflows/pr-review-security-hosted.yml +++ b/.github/workflows/pr-review-security-hosted.yml @@ -174,7 +174,7 @@ jobs: contents: read pull-requests: write # the review, its inline comments and the lane's # reviewed-head marker comment - uses: melodic-software/ci-workflows/.github/workflows/pr-review-cli.yml@4fbceb4b75ffd568dfa5db31de0d0e753c0c64e6 # v0.65.9 + uses: melodic-software/ci-workflows/.github/workflows/pr-review-cli.yml@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 with: lane: security publish: comments diff --git a/.github/workflows/pr-run-activity-read.yml b/.github/workflows/pr-run-activity-read.yml index 5b4f01f2c6..20899e899a 100644 --- a/.github/workflows/pr-run-activity-read.yml +++ b/.github/workflows/pr-run-activity-read.yml @@ -1059,7 +1059,7 @@ jobs: # need sudo, so they are written before the runner is isolated. - name: Apply the Claude managed settings if: steps.launch.outcome == 'success' && steps.go.outputs.run == 'true' - uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 # Nothing after this step needs sudo or docker. - name: Isolate the runner @@ -1344,7 +1344,7 @@ jobs: if: steps.key-present.outputs.present == 'true' continue-on-error: true timeout-minutes: ${{ fromJSON(steps.launch.outputs.step-minutes || '50') }} - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: # No work may outlive the result message the launcher reads. CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" @@ -1396,7 +1396,7 @@ jobs: if: steps.token-present.outputs.present == 'true' continue-on-error: true timeout-minutes: ${{ fromJSON(steps.launch.outputs.step-minutes || '50') }} - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" LD_LIBRARY_PATH: "" @@ -1611,10 +1611,11 @@ jobs: always() && steps.key-present.outputs.present != 'false' && steps.act-key.outputs.handoff != 'true' && (steps.act-key.outcome == 'success' || steps.act-key.outcome == 'failure' || steps.act-token.outcome == 'success' || steps.act-token.outcome == 'failure') - uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 with: outcome: ${{ steps.act-key.outcome != 'skipped' && steps.act-key.outcome || steps.act-token.outcome }} execution-file: ${{ steps.act-key.outputs.execution-file || steps.act-token.outputs.execution-file }} + log-file: ${{ steps.act-key.outputs.log-file || steps.act-token.outputs.log-file }} lane: >- ${{ inputs.issue-number != '' && inputs.fallback == 'handoff' && format('{0} (key {1} handed off)', inputs.lane, steps.launch.outputs.key-name) @@ -2957,7 +2958,7 @@ jobs: id: summary-settings if: steps.summary-prompt.outcome == 'success' continue-on-error: true - uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 - name: Isolate the runner id: isolate @@ -2976,7 +2977,7 @@ jobs: if: steps.isolate.outcome == 'success' && inputs.fallback == '' continue-on-error: true timeout-minutes: 15 - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" with: @@ -3002,7 +3003,7 @@ jobs: if: steps.isolate.outcome == 'success' && inputs.fallback != '' continue-on-error: true timeout-minutes: 15 - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" with: diff --git a/.github/workflows/pr-run-activity-write.yml b/.github/workflows/pr-run-activity-write.yml index 64de67a495..1d124303ce 100644 --- a/.github/workflows/pr-run-activity-write.yml +++ b/.github/workflows/pr-run-activity-write.yml @@ -1644,7 +1644,7 @@ jobs: - name: Record the lane outcome id: lane-record if: always() && (steps.act-skill.outcome == 'success' || steps.act-skill.outcome == 'failure') - uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 with: outcome: ${{ steps.act-result.outputs.outcome || steps.act-skill.outcome }} execution-file: >- diff --git a/.github/workflows/pr-unblock.yml b/.github/workflows/pr-unblock.yml index c1b4d09288..5a49c2ac3c 100644 --- a/.github/workflows/pr-unblock.yml +++ b/.github/workflows/pr-unblock.yml @@ -935,7 +935,7 @@ jobs: # need sudo, so they are written before the runner is isolated. - name: Apply the Claude managed settings if: steps.key.outputs.present == 'true' - uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 # Nothing after this step needs sudo or docker. - name: Isolate the runner @@ -968,7 +968,7 @@ jobs: if: steps.key.outputs.present == 'true' && fromJSON(steps.prepare.outputs.count || '0') > 0 continue-on-error: true timeout-minutes: 20 - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" LD_LIBRARY_PATH: "" @@ -1029,7 +1029,7 @@ jobs: if: steps.key.outputs.present == 'true' && fromJSON(steps.prepare.outputs.count || '0') > 1 continue-on-error: true timeout-minutes: 20 - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" LD_LIBRARY_PATH: "" @@ -1090,7 +1090,7 @@ jobs: if: steps.key.outputs.present == 'true' && fromJSON(steps.prepare.outputs.count || '0') > 2 continue-on-error: true timeout-minutes: 20 - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" LD_LIBRARY_PATH: "" diff --git a/.github/workflows/pr-verify.yml b/.github/workflows/pr-verify.yml index d31075bfed..edda0bce87 100644 --- a/.github/workflows/pr-verify.yml +++ b/.github/workflows/pr-verify.yml @@ -213,7 +213,7 @@ jobs: # need sudo, so they are written before the runner is isolated. - name: Apply the Claude managed settings if: steps.agree.outcome == 'success' - uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 - name: Isolate the runner if: steps.agree.outcome == 'success' @@ -263,7 +263,7 @@ jobs: if: steps.credential.outputs.present == 'true' continue-on-error: true timeout-minutes: 22 - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: # No work may outlive the result message the launcher reads. CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" @@ -322,10 +322,11 @@ jobs: # it, and auth as auth. - name: Report the judgment's outcome if: (steps.judge.outcome == 'success' || steps.judge.outcome == 'failure') && (steps.judge.outputs.handoff != 'true' || steps.key-leg.outcome == 'failure') - uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 with: outcome: ${{ steps.judge.outcome }} execution-file: ${{ steps.judge.outputs.execution-file }} + log-file: ${{ steps.judge.outputs.log-file }} lane: pr-verify lane-id: pr-verify step-started-at: ${{ steps.prompt.outputs.started-at }} @@ -541,7 +542,7 @@ jobs: # need sudo, so they are written before the runner is isolated. - name: Apply the Claude managed settings if: steps.agree.outcome == 'success' - uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/apply-claude-managed-settings@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 - name: Isolate the runner if: steps.agree.outcome == 'success' @@ -589,7 +590,7 @@ jobs: if: steps.credential.outputs.present == 'true' continue-on-error: true timeout-minutes: 22 - uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/run-claude-cli@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 env: # No work may outlive the result message the launcher reads. CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" @@ -624,10 +625,11 @@ jobs: - name: Report the judgment's outcome if: steps.judge.outcome == 'success' || steps.judge.outcome == 'failure' - uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@d02b8697e092705153f0996549b05f95a446bb52 # v0.65.0 + uses: melodic-software/ci-workflows/.github/actions/report-lane-outcome@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0.65.11 with: outcome: ${{ steps.judge.outcome }} execution-file: ${{ steps.judge.outputs.execution-file }} + log-file: ${{ steps.judge.outputs.log-file }} lane: pr-verify lane-id: pr-verify step-started-at: ${{ steps.prompt.outputs.started-at }} diff --git a/scripts/ci-review-lanes.test.sh b/scripts/ci-review-lanes.test.sh index 71a7af3d03..8a5ea9c515 100755 --- a/scripts/ci-review-lanes.test.sh +++ b/scripts/ci-review-lanes.test.sh @@ -76,10 +76,10 @@ for pair in 'pr-review-hosted.yml pr-review:' 'pr-review-security-hosted.yml pr- caller="$ROOT/.github/workflows/$file" if grep -qxF " $job" "$caller" && grep -qxF ' publish: comments' "$caller" && grep -qxF ' hold-label: needs-human' "$caller" && - grep -qE '^ uses: melodic-software/ci-workflows/\.github/workflows/pr-review-cli\.yml@4fbceb4b75ffd568dfa5db31de0d0e753c0c64e6 # v0\.65\.9$' "$caller"; then - ok "$file calls pr-review-cli v0.65.9 as job ${job%:} with publish: comments and hold-label: needs-human" + grep -qE '^ uses: melodic-software/ci-workflows/\.github/workflows/pr-review-cli\.yml@e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8 # v0\.65\.11$' "$caller"; then + ok "$file calls pr-review-cli v0.65.11 as job ${job%:} with publish: comments and hold-label: needs-human" else - fail "$file lost its job id, publish: comments, hold-label or v0.65.9 pin" + fail "$file lost its job id, publish: comments, hold-label or v0.65.11 pin" fi # pr-review-cli's check-key-credit job requests actions: read; a caller that # does not grant it fails at startup. diff --git a/scripts/ci-review-plugin-source.test.sh b/scripts/ci-review-plugin-source.test.sh index 0fdae1758c..ca1421941c 100755 --- a/scripts/ci-review-plugin-source.test.sh +++ b/scripts/ci-review-plugin-source.test.sh @@ -50,10 +50,10 @@ for (const file of ["pr-review-hosted.yml", "pr-review-security-hosted.yml"]) { } // The check itself rejects each shape it guards against. -const sha = "4fbceb4b75ffd568dfa5db31de0d0e753c0c64e6"; +const sha = "e5167fc29d948ab7d0923cf62f5ea9eeeef8e9e8"; const call = (uses, inputs) => ({ review: { uses, with: inputs } }); for (const [name, jobs] of [ - ["a tag ref", call(`${REUSABLE}v0.65.9`, {})], + ["a tag ref", call(`${REUSABLE}v0.65.11`, {})], ["a short SHA", call(`${REUSABLE}${sha.slice(0, 12)}`, {})], ["another repository's copy", call(`someone/ci-workflows/.github/workflows/pr-review-cli.yml@${sha}`, {})], ["a plugin-dirs input", call(`${REUSABLE}${sha}`, { "plugin-dirs": "plugins/review" })],