feat(ci): default-on security review — path-filtered caller + posture ADR - #722
Conversation
|
Claude finished @kyle-sexton's task in 2m 5s —— View job PR Review
Overall this is a clean, well-structured PR. The security posture of the new caller is strong and the ADR is coherent. A few observations below, ordered from most to least significant.
|
| File | Finding | Severity |
|---|---|---|
claude-security-review.yml |
Concurrency, permissions, pin, secrets all correct | ✅ |
claude-security-review.yml |
Path filter omits *.py/*.js/*.ts/*.bash — likely intentional but undocumented |
Minor |
docs/adr/0002-...md |
Missing ## Consequences and ## Sources vs. ADR 0001's format |
Minor |
ci.yml |
One-line addition is correct | ✅ |
No blocking issues. The two minor items are worth a follow-up but don't need to hold the merge.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b14b32050a
ℹ️ 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".
|
Tower scope check (checkpoint 2026-07-20 ~17:5xZ) — trim before merge:
With those two edits this merges as a clean #696 increment. Authoring lane or babysit can apply; tower will re-digest on the next cycle. |
|
Claude finished @kyle-sexton's task in 2m 35s —— View job PR Review — post-sync (
|
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml single-line alphabetical addition |
✅ Correct |
ADR ## Consequences + ## Sources sections missing vs ADR 0001 |
Minor — still open |
Closes #509 should be Refs #509 |
|
| ADR interim framing | |
| MCP-server paths missing from filter | ✅ Fixed in 2f1fc78 |
Recommendation: The two ⚠️ Pending items from kyle-sexton's comment should be applied before merge — particularly Closes #509 → Refs #509, since merging as-is will auto-close a deferred design issue.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2f1fc78b8c
ℹ️ 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".
… reusable workflow (#211) ## Summary Adds the reviewed runner-input contract entry for `melodic-software/ci-workflows/.github/workflows/claude-security-review.yml@0a5fd4c…` (merged in ci-workflows#160), mirroring the claude-review sibling's shape exactly: `routing: runner-input` with `runner`, `allowedInputs` runner + skip-actors, single named `CLAUDE_CODE_OAUTH_TOKEN`, caller permissions contents:read + pull-requests:write + id-token:write. Unblocks claude-code-plugins#722's Runner-policy gate (the new security-review caller currently fails `runner-target-contract: no reviewed runner-input contract`). Component tests: 224/224 pass. ## Related - melodic-software/ci-workflows#160 (the lane) - melodic-software/claude-code-plugins#722 (the blocked consumer caller) No linked issue in this repository. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 58s —— View job PR Review — post-merge sync (
|
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml alphabetical addition |
✅ Correct |
| MCP-server paths in path filter | ✅ Fixed in 2f1fc78 |
| Runner-policy contract (Codex P1) | ✅ Acknowledged — upstream standards#211 brings the contract via the next sync PR |
Closes #509 → Refs #509 |
|
| ADR interim-status framing | |
ADR missing ## Consequences + ## Sources vs ADR 0001 |
Minor — still open |
Recommendation: The ⚠️ Pending items should be resolved before merge — particularly Closes #509 → Refs #509, since merging as-is will auto-close a deferred design issue that per kyle-sexton's 17:41 comment is explicitly out-of-scope for this PR. The ADR format gap (## Consequences + ## Sources) remains a minor follow-up, not a blocker.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2d001744a4
ℹ️ 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".
… ADR (#696, #509) Wires the ci-workflows claude-security-review reusable workflow (pinned at its merge SHA) behind a path filter over this repo's security-sensitive surfaces, and records the default-on decision as ADR 0002: both AI review lanes default-on and ADVISORY, promotion to blocking earned by demonstrated precision (the WP5 verification-promotion discipline), security severity vocabulary CRITICAL/IMPORTANT/SUGGESTION with a confidence axis. Registers the new caller in the workflow schema-check list. Closes #696 Closes #509 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ew path filter Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…h filter Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2d00174 to
a845663
Compare
|
Claude finished @kyle-sexton's task in 1m 43s —— View job PR Review — post-sync (
|
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml alphabetical addition |
✅ Correct |
| MCP-server source + compiled JS paths | ✅ Fixed in a14450a |
MCP launch config paths (**/.mcp.json, **/mcp.json) |
✅ Fixed in a845663 |
| Runner-policy contract (Codex P1) | ✅ Acknowledged — upstream standards#211 brings the contract via next sync PR |
Closes #509 → Refs #509 in PR body |
|
| ADR interim-status framing | |
ADR missing ## Consequences + ## Sources vs ADR 0001 format |
Minor — still open |
Recommendation: Resolve both ⚠️ Pending items before merge. The Closes #509 item is the higher-priority one — auto-closing a deferred design gate on squash-merge would lose the enforcement design question permanently.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a845663293
ℹ️ 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".
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 37s —— View job PR Review — post-sync (
|
| Layer | Patterns |
|---|---|
| CI / agent config | .github/**, .claude/** |
| Repo-level scripts | scripts/** |
| Plugin hooks, bins, tools, skill scripts | plugins/*/hooks/**, plugins/*/bin/**, plugins/*/tools/**, plugins/*/skills/*/scripts/** |
| Plugin MCP source + compiled output | plugins/*/src/**, plugins/*/dist/** |
| MCP launch configs | **/.mcp.json, **/mcp.json |
| Code extensions (blanket) | **/*.sh, **/*.ps1, **/*.mjs, **/*.ts, **/*.js, **/*.cjs |
No remaining gaps for the current plugin inventory.
Pending items from kyle-sexton's 17:41 comment — ⚠️ Both still open
1. Closes #509 → Refs #509
The initial commit (3feef14) body reads Closes #696 / Closes #509. Per this repo's squash-merge convention (PR title becomes the commit subject, PR body becomes the commit body), merging as-is will auto-close #509 from the PR body. Per kyle-sexton's explicit instruction, #509 (the pipeline-enforcement / required-gate design question) is deferred to a scoped design session — this PR's advisory lane is a legitimate increment toward it but does not answer it. The PR body needs a manual edit to change Closes #509 to Refs #509 before merge.
2. ADR 0002: missing interim-status framing
docs/adr/0002-default-on-ai-review-advisory-with-earned-promotion.md L3 still reads:
- Status: accepted
Kyle-sexton's intent: the advisory posture is the current interim state pending #509's design ruling, not the recorded end-state; without a qualifier the ADR closes the design session's option space. Suggested two-part fix:
- Status: accepted→- Status: accepted (interim — pending #509 design ruling)- Add one sentence at the end of the Decision section, e.g.: "This is the interim posture pending the autonomy pipeline: no dedicated security-review pass — automated code review only #509 design session on enforcement; that session may elect to promote the security lane to a required gate without requiring a further precision window."
Full status table
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml alphabetical addition |
✅ Correct |
| MCP-server source + compiled JS paths | ✅ Fixed in a14450a |
MCP launch config paths (**/.mcp.json, **/mcp.json) |
✅ Fixed in a845663 |
Plugin bin wrapper paths (plugins/*/bin/**) |
✅ Fixed in b2277e5 |
| Runner-policy contract (Codex P1) | ✅ Acknowledged — upstream standards#211 contract via next sync PR |
ADR missing ## Consequences + ## Sources vs ADR 0001 format |
Minor — still open |
Closes #509 → Refs #509 in PR body |
|
| ADR interim-status framing |
Recommendation: Resolve both ⚠️ Pending items before merge. The Closes #509 → Refs #509 change is the higher-priority one — auto-closing a deferred design gate on squash-merge would lose the enforcement design question. The ADR format gap (## Consequences + ## Sources) remains a minor follow-up, not a blocker.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b2277e51a1
ℹ️ 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".
… path filter Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 53s —— View job PR Review — post-sync (
|
| Layer | Patterns |
|---|---|
| CI / agent config | .github/**, .claude/** |
| Repo-level scripts | scripts/** |
| Plugin hooks, bins, tools, skill scripts | plugins/*/hooks/**, plugins/*/bin/**, plugins/*/tools/**, plugins/*/skills/*/scripts/** |
| Plugin MCP source + compiled output | plugins/*/src/**, plugins/*/dist/** |
| MCP launch configs | **/.mcp.json, **/mcp.json |
| Code extensions (blanket) | **/*.sh, **/*.ps1, **/*.mjs, **/*.ts, **/*.js, **/*.cjs |
| Dependency manifests + lockfiles | **/package.json, **/package-lock.json |
| Plugin runtime manifests | plugins/*/.claude-plugin/plugin.json |
No remaining gaps for the current plugin inventory.
Pending items from kyle-sexton's 17:41 comment — ⚠️ Both still open
1. Closes #509 → Refs #509 in the PR body
The PR body still reads Closes #509. Per kyle-sexton's explicit instruction, #509 (the pipeline-enforcement / required-gate design question) is deferred to a scoped design session — this PR's advisory lane is a legitimate increment toward it but does not answer it. Merging as-is will auto-close #509 from the PR body. This requires a manual edit to the PR body before merge. I cannot modify PR bodies.
2. ADR 0002: missing interim-status framing
docs/adr/0002-default-on-ai-review-advisory-with-earned-promotion.md L3 still reads:
- Status: accepted
Without an interim qualifier, this ADR records the advisory posture as the settled end-state and closes the #509 design session's option space. Suggested two-part fix:
- Status: accepted→- Status: accepted (interim — pending #509 design ruling)- Add one sentence at the end of the Decision section, e.g.: "This is the interim posture pending the autonomy pipeline: no dedicated security-review pass — automated code review only #509 design session on enforcement; that session may elect to promote the security lane to a required gate without requiring a further precision window."
Full status table
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml alphabetical addition |
✅ Correct |
| MCP-server source + compiled JS paths | ✅ Fixed in a14450a |
MCP launch config paths (**/.mcp.json, **/mcp.json) |
✅ Fixed in a845663 |
Plugin bin wrapper paths (plugins/*/bin/**) |
✅ Fixed in b2277e5 |
Dependency manifests + lockfiles (**/package.json, **/package-lock.json) |
✅ Fixed in 1066c43 |
Plugin runtime manifests (plugins/*/.claude-plugin/plugin.json) |
✅ Fixed in 1066c43 |
| Runner-policy contract (Codex P1) | ✅ Acknowledged — upstream standards#211 contract via next sync PR |
ADR missing ## Consequences + ## Sources vs ADR 0001 format |
Minor — still open |
Closes #509 → Refs #509 in PR body |
|
| ADR interim-status framing |
Recommendation: The path filter is now comprehensive and the workflow itself is correct. The two ⚠️ Pending items should be resolved before merge — particularly Closes #509 → Refs #509, since auto-closing a deferred design gate on squash-merge would permanently lose the enforcement design question.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1066c43c0a
ℹ️ 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".
…urity surfaces In a plugin marketplace, skill/agent/command markdown is executable behavior and the marketplace manifest supplies each plugin's source — both now schedule the dedicated pass. Repository prose (docs, READMEs, changelogs) deliberately stays with the general review lane. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 29s —— View job PR Review — post-sync (
|
| Layer | Patterns |
|---|---|
| CI / agent config | .github/**, .claude/** |
| Repo-level scripts | scripts/** |
| Plugin hooks, bins, tools | plugins/*/hooks/**, plugins/*/bin/**, plugins/*/tools/** |
| Plugin instruction assets (skills, agents, commands) | plugins/*/skills/**, plugins/*/agents/**, plugins/*/commands/** |
| Plugin MCP source + compiled output | plugins/*/src/**, plugins/*/dist/** |
| MCP launch configs | **/.mcp.json, **/mcp.json |
| Code extensions (blanket) | **/*.sh, **/*.ps1, **/*.mjs, **/*.ts, **/*.js, **/*.cjs |
| Dependency manifests + lockfiles | **/package.json, **/package-lock.json |
| Plugin runtime manifests | plugins/*/.claude-plugin/plugin.json |
| Marketplace manifest | .claude-plugin/** |
No remaining gaps for the current plugin inventory. All Codex P2 findings are resolved.
Pending items from kyle-sexton's 17:41 comment — ⚠️ Both still open
1. Closes #509 → Refs #509 in the PR body
The PR body still reads Closes #509. Per this repo's squash-merge convention the PR body becomes the commit body, so GitHub will auto-close #509 on merge. Per kyle-sexton's explicit instruction, #509 (the pipeline-enforcement / required-gate design question) is deferred to a scoped design session — this PR's advisory lane is a legitimate increment toward it but does not answer it. This requires a manual edit to the PR body before merge. I cannot modify PR bodies.
2. ADR 0002: missing interim-status framing
docs/adr/0002-...md L3 still reads - Status: accepted. I attempted to apply this fix locally but cannot push to the branch (GitHub App write permission denied for this repo). The exact diff needed:
- - Status: accepted
+ - Status: accepted (interim — pending #509 design ruling)And at the end of the Decision section (after the severity-vocabulary item):
+ This is the interim posture pending the #509 design session on enforcement;
+ that session may elect to promote the security lane to a required gate
+ without requiring a further precision window.Full status table
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml alphabetical addition |
✅ Correct |
| MCP-server source + compiled JS paths | ✅ Fixed in a14450a |
MCP launch config paths (**/.mcp.json, **/mcp.json) |
✅ Fixed in a845663 |
Plugin bin wrapper paths (plugins/*/bin/**) |
✅ Fixed in b2277e5 |
| Dependency manifests + lockfiles | ✅ Fixed in 1066c43 |
Plugin runtime manifests (plugins/*/.claude-plugin/plugin.json) |
✅ Fixed in 1066c43 |
| Plugin instruction assets (skills, agents, commands) | ✅ Fixed in 28cffd3 |
Marketplace manifest (.claude-plugin/**) |
✅ Fixed in 28cffd3 |
| Runner-policy contract (Codex P1) | ✅ Acknowledged — standards#211 brings the contract via next sync PR |
ADR missing ## Consequences + ## Sources vs ADR 0001 format |
Minor — still open |
Closes #509 → Refs #509 in PR body |
|
| ADR interim-status framing |
Recommendation: The path filter is now comprehensive and the workflow itself is correct. The two ⚠️ Pending items should be resolved before merge. Closes #509 → Refs #509 is the higher-priority one — auto-closing a deferred design gate on squash-merge would permanently lose the enforcement design question.
…orcement design ruling The operator deferred the enforcement/evidencing question to a design session (2026-07-19, on-record on the issue); this ADR records the interim advisory posture that session builds on, not its answer. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 40s —— View job PR Review — post-sync (
|
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml alphabetical addition |
✅ Correct |
| MCP-server source + compiled JS paths | ✅ Fixed in a14450a |
MCP launch config paths (**/.mcp.json, **/mcp.json) |
✅ Fixed in a845663 |
Plugin bin wrapper paths (plugins/*/bin/**) |
✅ Fixed in b2277e5 |
| Dependency manifests + lockfiles | ✅ Fixed in 1066c43 |
Plugin runtime manifests (plugins/*/.claude-plugin/plugin.json) |
✅ Fixed in 1066c43 |
| Plugin instruction assets (skills, agents, commands) | ✅ Fixed in 28cffd3 |
Marketplace manifest (.claude-plugin/**) |
✅ Fixed in 28cffd3 |
| Runner-policy contract (Codex P1) | ✅ Acknowledged — standards#211 brings the contract via next sync PR |
| ADR interim-status framing | ✅ Fixed in 6e4066c |
ADR missing ## Consequences + ## Sources vs ADR 0001 format |
Minor — still open |
Closes #509 → Refs #509 in PR body |
One item left before merge: edit the PR body to change Closes #509 to Refs #509. Everything else is resolved — the path filter is comprehensive, the workflow is correct, and the ADR is properly framed as interim.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6e4066c578
ℹ️ 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".
…path filter Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 44s —— View job PR Review — post-sync (
|
| Layer | Patterns |
|---|---|
| CI / agent config | .github/**, .claude/** |
| Root agent-instruction files | REVIEW.md, CLAUDE.md, AGENTS.md |
| Repo-level scripts | scripts/** |
| Plugin hooks, bins, tools | plugins/*/hooks/**, plugins/*/bin/**, plugins/*/tools/** |
| Plugin instruction assets | plugins/*/skills/**, plugins/*/agents/**, plugins/*/commands/** |
| Plugin MCP source + compiled output | plugins/*/src/**, plugins/*/dist/** |
| MCP launch configs | **/.mcp.json, **/mcp.json |
| Code extensions (blanket) | **/*.sh, **/*.ps1, **/*.mjs, **/*.ts, **/*.js, **/*.cjs |
| Dependency manifests + lockfiles | **/package.json, **/package-lock.json |
| Plugin runtime manifests | plugins/*/.claude-plugin/plugin.json |
| Marketplace manifest | .claude-plugin/** |
No remaining gaps for the current plugin inventory. All Codex P2 findings resolved.
All previously pending items — resolved ✅
Closes #509 → Refs #509 — ✅ Confirmed resolved per kyle-sexton's 17:41 comment ("the PR body closes only #696 — #509 stays open for the operator-deferred enforcement design session").
ADR 0002 interim-status framing — ✅ Fixed in 6e4066c. Status line reads accepted (interim — pending the #509 enforcement design ruling) and the Decision section closes with the enforcement design session note.
Full status table
| Item | Status |
|---|---|
| Permissions model (top-level + job-level) | ✅ Correct |
Concurrency cancel-in-progress: false |
✅ Correct |
| SHA pin with inline comment | ✅ Correct |
Secret handling (named, not inherit) |
✅ Correct |
ci.yml alphabetical addition |
✅ Correct |
| MCP-server source + compiled JS paths | ✅ Fixed in a14450a |
| MCP launch config paths | ✅ Fixed in a845663 |
| Plugin bin wrapper paths | ✅ Fixed in b2277e5 |
| Dependency manifests + lockfiles | ✅ Fixed in 1066c43 |
| Plugin runtime manifests | ✅ Fixed in 1066c43 |
| Plugin instruction assets (skills, agents, commands) | ✅ Fixed in 28cffd3 |
| Marketplace manifest | ✅ Fixed in 28cffd3 |
| Root agent-instruction files (REVIEW.md, CLAUDE.md, AGENTS.md) | ✅ Fixed in 0465acc |
| ADR interim-status framing | ✅ Fixed in 6e4066c |
Closes #509 → Refs #509 |
✅ Resolved (PR body) |
| Runner-policy contract (Codex P1) | ✅ Acknowledged — standards#211 brings the contract via next sync PR |
ADR missing ## Consequences + ## Sources vs ADR 0001 format |
Minor — still open |
No blocking issues. The ADR format gap (## Consequences + ## Sources) remains a minor cosmetic follow-up — it doesn't affect the decision record's correctness or the security lane's behavior. Everything else is resolved. This PR is ready to merge.
Summary
Consumer wiring for the dedicated security-review lane plus the recorded decision, completing the two remaining default-on review items:
.github/workflows/claude-security-review.yml— thin caller of the ci-workflows reusable workflow (pinned at its merge SHA0a5fd4c), path-filtered to security-sensitive surfaces (workflows,.claude/, scripts, hooks, tools, shell/PS/mjs). Same secret + permission shape as the sibling claude-review caller; fork PRs skipped by design.Related
Closes #696
Refs #509 (advisory increment only — the enforcement/evidencing design stays with the operator-deferred #509 design session)
🤖 Generated with Claude Code