Repository navigation
ci(lanes): run the mutation lane on run-claude-cli, mutants in a job with no secret - #13632
Conversation
…with no secret post-merge-test-mutation.yml leaves claude-code-action, where the model ran every mutant in its own Bash beside the OAuth token. It now runs: - generate, generate-subscription, generate-fallback: run-claude-cli on the automations API key, then its subscription token, then the fallback token, /mutation-testing:audit --phase generate, read-only, no test; - mutate: no secret, no write grant, applies and runs each mutant with execute.mjs, which validates every mutant before applying it; - triage legs on the same chain, --phase triage over the survivors; - report: assemble.mjs builds the result from the executor's states and triage's verdicts, then report.mjs as before. Jobs pass data as artifacts pinned by SHA-256, a key-credit gate covers both chains, and every leg writes a lane-outcome record. The audit skill gains --phase generate|triage for a caller that executes mutants itself. A new callers test fails when a job that runs mutants reads any secret, names the job token, holds a write grant or keeps a checkout credential. Refs: #13586 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The audit skill's body stays under its 500-line cap and its argument hint under 100 characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…claude-cli # Conflicts: # .github/actions/resolve-config/callers.test.mjs
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. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d6fd0c66e0
ℹ️ 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".
|
claude-security-review reviewed Security review: PR #13632, incremental (d6fd0c6 → d9895b4)No security issues found in this push. I read every hunk of all 6 files on the incremental list. critical-findings: 0 What I checkedGenerate legs can now run the suppression lint. The new rule is
Instruction surface. Trust controls. None changed: trusted-trigger check, lane token request and broker, kill switch, merge holds and resolve-config. Prior findings. The only earlier post is the summary comment at d6fd0c6, which reported no findings. There is nothing to repeat, and the settled threads hold nothing this push touches. |
|
claude-review reviewed Code review: PR #13632, incremental review (d6fd0c6 → d9895b4)This lane already reviewed an earlier head ( No blocking findings. What changed, and how it holds up:
Closing issue #13586: this push does not change how the earlier review judged the criteria. Not checked by me: I ran nothing. Test results and hosted-runner behaviour are the author's claims. Spend (not a hold): none new in this push. The extra lint calls in the generate legs use only the existing prepaid credit or subscription usage. |
…essions in generate - execute.mjs matched the mutate globs with path.matchesGlob, whose `**` skips a leading dot directory, so a `.github/**` source was rejected as outside `**/*.mjs` though the trigger's paths filter takes it. A small matcher now lets `**` cross every directory; a test runs the repository's own config against `.github/` sources and its excluded trees. - The generate legs allow the plugin's suppression lint, which --phase generate runs in Phase 1 step 3, as the triage legs already did. - The audit skill's argument hint keeps --full, as on main; --phase, a CI caller's flag, is documented in the body and split-runs.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The pr-verify verifier failed head What it wrote (44 lines)This pull request leaves the merge queue, and ci-status holds it out while it carries |
Refs: #13586
Summary
post-merge-test-mutation.ymlmoves offclaude-code-action, the last lane in #13586 without the three-leg chain. Before, the model ran every mutant in its own Bash with the automations OAuth token in the job. Now the owner's constraint holds: no job that runs mutants holds a Claude credential or a write token. Two credentialedrun-claude-clichains, generate and triage, sit around a mutant job that holds no secret, and they pass data through artifacts pinned by SHA-256. The lane is still advisory, gates nothing, and a usage or capacity limit is still a designed stop.auditgenerate,generate-subscription,generate-fallback--phase generate; read-only, runs no testmutatecontents: read; applies and runs each mutanttriage,triage-subscription,triage-fallback--phase triageover the survivors; starts only when a mutant survivedkey-creditcheck-key-creditfor both chains,actions: readonlyreportFix
The skill's split.
/mutation-testing:audithad no way to stop after Phase 2 or to start at Phase 4.--phase generate|triage, with the detail inskills/audit/context/split-runs.mdand a minor changelog fragment:generate: Phases 0 to 2 without running any test. It returns each mutant's path, line, operator,old_stringandnew_string.triage <file>: Phase 4 over the survivors the executor ran. It returns verdicts by index.The mutant job.
mutateruns.github/scripts/post-merge-test-mutation/execute.mjs.generate.schema.json.mutateglobs and itsold_stringoccurs exactly once and covers its line. Any other mutant isinvalidand is never applied.not-run, and exit 2 meansno-coverage.timeout-msand 1.5 times the baseline plus 5 s. The harness exit gives the state: 0 issurvived, 1killed, 2no-coverage, a timeouttimeout.scripts/, as before.restore-failed. The job's owngit diff --quiet HEADcheck stays.persist-credentials: false. Its scanner comes from a fresh checkout of main after the mutants run.Report.
assemble.mjstakes every state from the executor and only a survivor's disposition and cause from triage. A survivor triage gave no verdict isunclassified.report.mjsis unchanged.Chains. They follow the pattern of #13590, #13592 and #13608:
report-lane-outcomerecord withlane-id;key-credit-stop-post-merge-test-mutation.yml-<generate|triage>after a credit stop;if:keeps the same-repositoryworkflow_rungate as a top-level term;TRANSCRIPT_EXEMPTentry is gone.Catalog and tests.
Catalog.
lane-funding.jsonlists the six legs, and.github/artifact-retention.jsonhas rows for the generate, executed and triage artifacts and the two markers.Exemption. The
post-merge-test-mutation.yml automations auditLEG_EXEMPTIONSentry is gone. With ci(lanes): run the maintenance eval and propose lanes on the three-leg chain #13626 merged,LEG_EXEMPTIONSis now{}.The no-secret test (callers.test.mjs). It fails when any job that runs mutants (a step running
run-covering-tests.shorexecute.mjs):secretRefssees;github.tokenorGITHUB_TOKEN;id-token, or inherits the workflow's permissions;Its fixture shows each case failing, and it asserts that the mutation lane's
mutatejob is found.Other tests.
execute.test.mjsruns the executor against a real temp git repository with a stub harness;report.test.mjs's workflow tests follow the new jobs.Verification
Node suites.
node --test ".github/scripts/**/*.test.mjs" ".github/actions/**/*.test.mjs"(this covers.github/scripts/lib): 8221 tests, 8221 pass, 0 fail, 0 skipped after merging main with ci(lanes): run the maintenance eval and propose lanes on the three-leg chain #13626. The post-merge-test-mutation tests run 48 of 48.Bash suites:
write-runner-never-rules.test.shcheck-artifact-retention.test.shcheck-app-key-references.test.shcheck-read-caller-keys.test.shcheck-lane-coverage.test.shcheck-scan-carrier-secret-shadow.test.shworkflow-self-paths.test.shcredential-sweep.test.shrun-zizmor.test.shci-review-lanes.test.shplan-test-lanes.test.shrun-covering-tests.test.shaffected-tests-live.shGates, all clean:
runner-policy.mjs --root .(passed, so no standards contract change is needed);check-artifact-retention.sh --check(129 uploads, 87 families),check-read-caller-keys.shandcheck-app-key-references.sh;validate-plugins.sh --only mutation-testingandcheck-changed-skills.sh;Simulated report step. The rendered report step ran in bash with the real
assemble.mjsandreport.mjs:Remaining
This PR delivers the post-merge-test-mutation lane. Already merged for #13586: #13590, #13592, #13594, #13608, #13610, #13626 and #13636. What remains on #13586 is intake triage's check-key-credit gate, melodic-software/ci-workflows#996. It waits on melodic-software/standards#950, which accepts both caller permission sets, then the standards sync and the intake caller's
actions: readgrant.--phase generateand--phase triageunderrun-claude-cli --restricted, with the plugin loaded from.lane/pluginsthroughplugin-dirs;_work/_actionsincluded. It holds no secret, no write grant andcache-mode: read, and downstream jobs treat its output as untrusted, schema-checked data. So the worst a mutant can do is a wrong advisory report.Related
🤖 Generated with Claude Code