Repository navigation
ci(pr-pipeline): repin check-key-credit to the probing marker - #12935
Conversation
Pin ci-workflows check-key-credit at 09cf6f2 (ci-workflows#980) in pr-verify.yml and pr-review-main.yml, and add the write, scan and upload steps for the gate's probing marker right after each gate step, kept one day, continue-on-error, with the runner's token. Once a credit stop is past its window, the first gate after it probes the key and later gates skip while its marker is fresh. pr-verify pins every ci-workflows action at one SHA (workflow.test.mjs), so its run-claude-cli and apply-claude-managed-settings move to 09cf6f2 too; lane.cjs still passes --permission-prompts none at lines 404-405, recorded in callers.test.mjs, and replay.mjs follows the pin. pr-review-main's gate job checks nothing out, so it scans with ci-workflows' scan-upload at the same pin; its retention row says scan none because the checker recognizes only the local action. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_015te8CqFTUd8N8Byd5NUvMb
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-review reviewed Code review: incremental,
|
|
claude-security-review reviewed Security review: PR #12935, incremental from
|
The probing marker in review-handoffs-credit now needs the review job's trigger terms (review != 'false', judged != 'true'), so a run whose trigger found no lane source or a judged head never writes a probe that holds later gates off the key while no key leg tries it. The test pins the exact if: and adds paired judged and no-review cases. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_015te8CqFTUd8N8Byd5NUvMb
|
The pr-verify verifier failed head What it wrote (27 lines)This pull request leaves the merge queue, and ci-status holds it out while it carries |
pr-review-main: the probing marker also needs the trigger's proceed == 'true', the review job's remaining trigger term, so a kill-switch or gated-off run never writes a probe that holds later gates off the key. pr-verify: the gate runs whenever the resolver agrees, but the first judge step starts only when steps.credential.outputs.present == 'true'. An empty PR_VERIFY_CLAUDE_API_KEY would have written a probe with no judge trying the key. The probe steps now run right after the credential check and require that term (an if: cannot read secrets). Both tests pin the exact if: and add paired no-write cases. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_015te8CqFTUd8N8Byd5NUvMb
Refs: #12526
Summary
ci-workflows#980 adds a probing marker to check-key-credit. After a credit stop's window ends, the first gate run names itself the probe. Later gates skip the key while its marker is fresh, so one run tries the key instead of every run that reads before the next credit stop lands. #980 asks its direct callers to repin and to upload that marker. This repository has two direct callers:
pr-verify.yml(check-intent) andpr-review-main.yml(review-handoffs-credit).Fix
09cf6f2(the merge of feat(claude-memory): dotfile-manager backfill detection beyond chezmoi (yadm, stow, fingerprints) #980,# 09cf6f2 2026-11-03).Write the key's probing marker,Scan the key's probing marker for credentialsandUpload the key's probing marker.continue-on-error, kept 1 day, and uploaded with the runner's token, so no job permission is added.probing-markerequals the name written out (key-credit-probing-pr-verify.yml-check-intent,key-credit-probing-pr-review-main.yml-review-handoffs; gate.cjsprobeNameat 09cf6f2). The retention rows claim those exact names.if:takes the(<scan if>) && cleanform thatcheck-artifact-retention.mjsrequires, not upstream's three flat conjuncts..github/artifact-retention.jsonhas one row per new artifact..changes/pr-pipelinefragment, patch bump.Deviations from the brief, for review:
every ci-workflows action is pinned to one commitrequires one pin, so run-claude-cli and apply-claude-managed-settings move as well.run-claude-cli/lane.cjschanges onlyjudgeLeg(test(disk-hygiene): mock sys.argv in run_guard_powershell to seal the kill-switch argv seam #974: a token leg that timed out under a rejected rate limit is now a limit stop).cliArgsstill passes--permission-prompts noneat lane.cjs:404-405, and run-claude-cli'saction.ymland apply-claude-managed-settings are unchanged.PERMISSION_PROMPTS_NONE_LAUNCHERSincallers.test.mjs, andreplay.mjsRUN_CLAUDE_CLI_PINfollows the pin.scan-upload@09cf6f2. Its gate job checks nothing out, and its test forbids./.base. The retention checker'sSCAN_ACTIONmatches only the local action, so that row saysscan: none, like the siblingkey-credit-stop-*row. The reason field explains this.Verification
node --teston the pr-verify and pr-review-main workflow tests,probe/parity.test.mjsandresolve-config/callers.test.mjs: 347 of 347 pass.if:strings, that the scan and upload use the same path, retention 1,if-no-files-found: error,continue-on-error, that the steps sit right after the gate, and that they appear in no other job.scripts/ci-review-lanes.test.shpasses 239 checks and is unchanged: its callers run pr-review-cli at@mainand pin no gate.scripts/ci-lanes-pr-hold.test.shpasses 303 checks.scripts/check-artifact-retention.sh: 85 upload steps match (60 families).scripts/check-changelog-fragments.sh --check: 21 fragments valid.--check-required origin/mainpasses.cache-modekey gap.check-intenttimeout counts only the 22-minute judge steps (judges × 22 + 15), so it does not move.review-handoffs-creditsums 6 minutes of step timeouts, under its 10.Remaining
Work #12526 still needs after this merges, none of it in this PR:
KEY_CREDIT_WINDOW_HOURSwindow once that measurement shows the burst is gone.Related
🤖 Generated with Claude Code
https://claude.ai/code/session_015te8CqFTUd8N8Byd5NUvMb