Repository navigation
feat(ci): let the issue lane run skill-quality's checks - #7912
Conversation
resolve-issue lists check-skill.sh and check-evals-quality.sh as verify-scripts. Every verify-script wrapper now unsets GH_TOKEN and GITHUB_TOKEN before running the script, as run-test-file.sh does, so check-skill.sh runs checkout test scripts and markdownlint without the token: the power run-test-file.sh already gives the run. Refs: #7840 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The verify-script wrapper unsets GH_TOKEN and GITHUB_TOKEN in the script's own environment only. Code the script runs can still read the token from the wrapper's or the Bash shell's /proc/<pid>/environ, the same as run-test-file.sh today. Say so wherever the docs said the script runs without the token. Refs: #7840 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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. |
|
claude-security-review reviewed Security review: PR #7912 at f95317dFindings: 0 The PR adds What I checked
Residual note (not a finding): this lane reads untrusted issue text while holding push credentials, and Actions-hardening items such as permission changes and pins are zizmor's lane, and this diff has none of them. I did not consult |
|
claude-review reviewed Code review: PR #7912No findings. What I checked
Noted, not a finding
|
Refs: #7840
Refs: #7375
Summary
The issue lane (
work-resolve-issue) may now run skill-quality's two checks,check-skill.shandcheck-evals-quality.sh. This changes what the lane may do unattended; the repository owner chosethis design in the main session.
Run 39089376952
(issue #7840) stopped because the lane, under
--permission-mode dontAsk, may run only thescripts
resolve-issue.verify-scriptslists, andcheck-skill.shwas left out on purpose.Fix
docs/conventions/pr-pipeline.yaml:resolve-issue.verify-scriptsaddsplugins/skill-quality/scripts/check-skill.shandplugins/skill-quality/scripts/check-evals-quality.sh. The comment states the residual:check-skill.shruns checkout code (each checked skill'sscripts/*.test.shand the checkout'smarkdownlint) with the network open, the same power
scripts/run-test-file.shhas..github/actions/collect-base-activity/action.yml: the generated verify-script wrapper runsunset GH_TOKEN GITHUB_TOKENbefore the script, the linescripts/run-test-file.shalreadyruns before its test. One line in the generator covers every listed script, so no second
token-stripping wrapper script is added.
README.md,pr-run-activity.mdand the conventionCHANGELOG.md(2.7.0)say the same.
Residual risk (the owner should confirm it): the
unsetclears the token from the script's ownenvironment only. Code the script runs, such as a skill test the lane wrote, can still read the
lane's push-capable token from the wrapper's or the Bash shell's
/proc/<pid>/environ, and thenetwork is open.
scripts/run-test-file.shhas exactly the same gap today. The owner approved thisdesign believing "no token", so the docs now state the gap plainly. Containment (a separate PID
namespace with a fresh
/proc) is deferred to #7919.Not added:
scripts/sync-shared-copies.sh(#7375). It runscd "$script_dir/.."(
scripts/sync-shared-copies.sh:18-19), so under the wrapper it works on the read-only base copy,not the checkout. Its registry's first canonical,
lib/html-escape.mjs, is not in that copy, whichholds only
scripts/, soload_registryexits 2 (:42-45).--check-bumpcan callgh api(
scripts/lib/changelog-fragments.sh:279). The generator writes oneBash($verifier *)rule perscript, so it cannot limit the script to its read-only modes. To make it fit, the script would have
to resolve the checkout from its working directory and the wrapper would have to fix its flags.
Basis:
dontAsk, a call that would prompt is denied andpermissions.allowrules still run:permissions, permission modes table (
dontAskrow), read 2026-10-17.
Bash(<wrapper> *)matches the bare wrapper and the wrapper with arguments, and needs the space:same page, "Wildcard patterns". A rule must match each subcommand of a compound command, and an
allow rule does not match past a leading assignment of a variable outside the known-safe set:
same page, "Compound commands" and the environment-variable paragraph after it. So the lane
cannot set
GH_TOKEN=...orCHECK_SKILL_*in front of the wrapper, or chain it.CLAUDE_CODE_SUBPROCESS_ENV_SCRUB"leavesGitHub tokens and proxy settings in place"
(env-vars, read 2026-10-17), set at
.github/workflows/pr-run-activity-write.yml:966, with the lane token passed at:981.Bash($verifier *)rule per script, from a read-only base copy:.github/actions/collect-base-activity/action.yml:271-330.check-skill.shruns each skill'sscripts/*.test.sh(plugins/skill-quality/scripts/check-skill.sh:1298-1327)and markdownlint through
npx --no-installor the nearestnode_modules/.bin(
:1249-1296).ACTIONS_RUNTIME_TOKENorACTIONS_ID_TOKEN_REQUEST_TOKEN) reach the lane's Bash; the docs row names GitHub tokens andproxy settings only. This PR strips the same two names
run-test-file.shstrips.Verification
collect-base-activity.test.mjs: "the verify-script wrapper runs the script without GH_TOKENor GITHUB_TOKEN and keeps the rest of the environment" failed with
GH_TOKEN=fake-ghbeforethe generator change.
the GitHub token" stages the real
plugins/skill-quality, runscheck-skill.shthrough thewrapper on a fixture skill whose test prints the tokens, and failed with
seen=fake-gh,fake-githubwhen theunsetline was removed.live-config.test.mjs: theresolve-issueverify-scripts list failed before the yaml edit.node --test .github/actions/resolve-config/*.test.mjs .github/actions/collect-base-activity/*.test.mjs:382 pass, 0 fail.
bash scripts/write-runner-never-rules.test.sh: PASS=83 FAIL=0.actionlint .github/workflows/pr-run-activity-write.ymlandzizmor --offline .github/actions/collect-base-activity/action.yml: no findings.review:security-reviewer(opus): pass-with-findings. P2: the/proc/<pid>/environgap above(reproduced locally; the docs are fixed and containment is deferred to Hide the lane token from checkout code run by verify-scripts #7919). P5: check-skill's
markdownlint lookup walks above the checkout for
node_modules/.bin. It needs code execution therun already has, so it is not fixed.
Related
check-skill.shwas first left out.check-skill.shwith the token unset in its ownenvironment, so no skip-tests mode is needed. Until Hide the lane token from checkout code run by verify-scripts #7919 lands, the skill tests it runs can
still read the token from an ancestor process (see Residual risk).
sync-shared-copies.sh, which does not fit as written (see Fix).🤖 Generated with Claude Code