Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/actions/resolve-config/callers.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
Expand Down Expand Up @@ -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", () => {
Expand Down Expand Up @@ -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]),
Expand Down
2 changes: 1 addition & 1 deletion .github/scripts/pr-verify/probe/replay.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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: "",
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/intake-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-review-hosted.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-review-security-hosted.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 8 additions & 7 deletions .github/workflows/pr-run-activity-read.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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: ""
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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:
Expand All @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-run-activity-write.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: >-
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/pr-unblock.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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: ""
Expand Down Expand Up @@ -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: ""
Expand Down Expand Up @@ -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: ""
Expand Down
14 changes: 8 additions & 6 deletions .github/workflows/pr-verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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 }}
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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 }}
Expand Down
6 changes: 3 additions & 3 deletions scripts/ci-review-lanes.test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions scripts/ci-review-plugin-source.test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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" })],
Expand Down
Loading