Repository navigation
fix(claude-lanes): treat an already-reviewed new-SHA contract as satisfying lockstep - #890
Conversation
…sfying lockstep planLockstep declined a re-pinned caller whose surface changed without checking whether policy.json already holds a reviewed contract for the new SHA, so the repin lane PR kept "Runner-policy lockstep requires a human" after the contracts were registered. A same-path pin with an existing new-SHA contract is now satisfied (neither declined nor copied). The renamed-path decline is unchanged. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn
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 (incremental, b9bca36)No security findings. The change since 537b835 touches only
No manifest or instruction-surface files changed. critical-findings: 0 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 537b8359ed
ℹ️ 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-review reviewed No findings in the incremental change since 537b835. The fix. Raw-JSON paths. Test. The new I read the diff and the surrounding code. I did not run the test suite. The PR body's verification counts are author-claimed. The earlier increments were reviewed at 537b835. The closing issue is |
…cy's Map validatePolicy returns approvedReusableWorkflowContracts as a Map, so the bracket lookup never matched. policyHasContract uses Map.has and is tested against a validatePolicy result. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn
No related issue: the defect was found while the claude-lanes repin lane PR (#844) stayed on the human checklist after the contracts were registered (#889).
Summary
planLockstepdeclined any re-pinned caller whose security surface changed from its old pin. It never checked whetherpolicy.jsonalready holds a reviewed contract for<workflowPath>@<newSha>, thoughcopyReusableContractdoes. The repin lane PR (#844) carried "Runner-policy lockstep requires a human" from 2026-10-22 and kept it after #889 registered the v0.65.14 contracts, with CI green.Fix
planLocksteptakes ahasContract(path, sha)predicate (default: none). After the renamed-path decline, a pin whose new-SHA contract exists is skipped: neither declined nor copied, and no upstream fetch. The renamed-path decline is unchanged, since a rename always needs a hand-reviewed entry.mainpasses a lookup intopolicy.approvedReusableWorkflowContracts.Verification
node --test components/claude-lanes/repin-policy-lockstep.test.mjs: 26 pass, including three new cases (surface changed with an existing contract is satisfied; surface changed with none is still declined; a rename with a contract at the new path is still declined).bash harness/shell/run-tests.sh components/claude-lanes/repin-callers.test.sh: pass.npx biome check components/claude-lanes/: clean.Related
Refs: #844, #889
🤖 Generated with Claude Code
https://claude.ai/code/session_01DpzEJAE4EMndcWQXiKSZYn