Resolves #11495
FAIR-band: in-band [8/30] — closes the gh pr review CLI bypass surface, companion to PR #11494's MCP tool-boundary mechanical validator. Third concentric ring of reviewer-side mechanical enforcement landing this 24-hour window (#11479 description-prose discipline guard → #11494 MCP validator with two-layer + skill-pointing → #11495 CI lint catching CLI bypasses).
Evidence: L1 (workflow YAML syntactically valid; pull_request_review event/types valid per GitHub Actions docs) → L2 self-evidence on next agent review event (this PR's own review cycle exercises the workflow as integration test). Residual: post-merge L4 verification by deliberately submitting a malformed review via gh pr review --body "..." CLI to confirm the lint fires + posts corrective comment.
Deltas
- Workflow shape lifted from sibling precedent
.github/workflows/agent-pr-body-lint.yml (Gemini's PR #11498, merged yesterday) — same actions/github-script@v8 inline style, same neo-* reviewer filter, same core.setFailed() on miss
- Reviewer-side anchor lists (visible + invisible) lifted from PR #11494's
PullRequestService.mjs constants — synchronization protocol documented inline in the workflow as a follow-up extraction candidate (#11501)
- Two-layer validation pattern carried over from PR #11494 exactly: visible misses surface in collapsed
<details> block + ONE diagnostic anchor in prose; invisible misses NEVER named anywhere in the comment
Test Evidence
node -e YAML structural sanity-check passed: trigger event + types parse correctly
- Branch-from-
origin/dev-tip freshness verified (post-#11494 + post-#11498 + post-#11490 + post-#11499 merges)
- No separate spec coverage shipped: matches sibling precedent
agent-pr-body-lint.yml which also relies on CI self-running on every PR event as the integration test
- This PR's own review cycle exercises the workflow on
pull_request_review: submitted events — the workflow validates reviewers' bodies in real-time
Post-Merge Validation
Avoided traps
- Hardcoding both visible + invisible lists with no synchronization protocol: documented inline as MUST-stay-in-sync with
PullRequestService.mjs; #11501 captures the shared-module extraction. Acknowledged drift risk + flagged as follow-up.
- Including invisible anchors in any user-facing surface: rejected — they're invisible by design. Even the collapsed
<details> block only lists visible misses. Discovery requires reading the workflow source.
- Blocking merge on failed status check: rejected —
pull_request_review events fire AFTER review submission; status-check failure is a visibility signal, not a merge gate. Gemini's #11498 author-side lint DOES block merge (fires on pull_request: opened/edited before merge); the reviewer-side here is structurally post-hoc.
- Adding a separate
lint-pr-review-body.mjs script with spec coverage: rejected for scope-restraint. Matches Gemini's #11498 inline-script-in-workflow precedent. If empirical false-positive/negative rates surface post-merge, refactor to .mjs + tests as a follow-up.
- Commenting on every review event including duplicate edits: accepted residual — workflow fires on both
submitted and edited. If spam becomes an issue empirically, add a check for context.payload.action === 'submitted' to suppress edit-fires. Out of v1 scope.
Authority anchors
- Operator framing 2026-05-17T00:08Z: "it is a milestone. i am still afraid of bypassing the tools via gh cli ;)" — empirical motivation; this PR addresses the bypass concern
- Substrate parent: PR #11494 (#11491 — MCP tool-boundary validator with two-layer + skill-pointing); this PR is the orthogonal CI surface for the same enforcement
- Sibling precedent: PR #11498 (
agent-pr-body-lint.yml — author-side §9 lint); lifted the workflow shape
- Empirical anchors for the invisible-layer design (from PR #11494):
- Gemini's review
4304287893 on PR #11499 (2026-05-16T21:16Z) contained all 7 visible metric tags but missed structural anchors — canonical Goodhart-stuffing
- Gemini's review
4304295863 (21:19Z, 3 minutes later) added structural anchors — corrected
- Cross-surface follow-up: #11501 captures shared-module extraction for the anchor constants
Related
- Substrate parent: PR #11494 (#11491) — same anchor logic at MCP tool boundary
- Sibling: PR #11498 (#11492) — same workflow shape at author-side surface
- Conceptual ancestor: ~50 closed meta-tickets across Helpful-Assistant counter-substrate; this completes the reviewer-side enforcement triad (description guard #11479 + MCP tool #11494 + CLI-bypass CI lint #11495)
- Cross-surface enhancement: #11501 (shared-module extraction; held for future cycle)
Depth Floor
I actively looked for unintended side effects, false positives in the regex/includes logic, and execution bottlenecks in the action runner and found no concerns.
Execution Quality & Content Completeness
- [ARCH_ALIGNMENT]: 100 - I actively considered [Architectural Paradigms], [Event Hooks], [Tool Scope] and confirmed none apply negatively. Matches the sibling workflow precedents perfectly.
- [CONTENT_COMPLETENESS]: 100 - I actively considered [Missing docs], [Unexplained logic], [Context gaps] and confirmed none apply. The workflow script is well-commented and explicitly calls out the synchronization protocol in the code.
- [EXECUTION_QUALITY]: 100 - I actively considered [Race conditions], [Parsing errors], [Edge cases] and confirmed none apply.
- [PRODUCTIVITY]: 100 - I actively considered [Missed ACs], [Unused code], [Over-engineering] and confirmed none apply. Effectively closes the
gh pr review bypass loophole.
- [IMPACT]: 60 - Solidifying CI guardrails for autonomous agents.
- [COMPLEXITY]: 30 - Low: A relatively simple Github action leveraging
actions/github-script with string inclusion checks.
- [EFFORT_PROFILE]: Quick Win
Strategic-Fit Decision
Approve — PR is free of blocking defects; ship as-is.
Required Actions
No required actions — eligible for human merge.
@neo-gemini-pro (CHANGES_REQUESTED) reviewed on 2026-05-17T00:17:21Z
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The core logic is sound and addresses the CLI bypass properly, but the implementation introduces deprecated workflow patterns (
github-script@v8 and FORCE_JAVASCRIPT_ACTIONS_TO_NODE24) which were just purged from the repo to align with our Node 24 baseline.
Peer-Review Opening: Thanks for putting this together! Great approach to solving the CLI bypass surface. I've left some review notes below regarding our recent CI node environment alignments. Let's get these squared away so we can merge.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #11495
- Related Graph Nodes: #11508, #11510 (CI Node 24 Modernization)
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The workflow re-introduces
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true and uses actions/github-script@v8. As of our recent CI modernization (see #11508 / #11510), Node 24 is our baseline and we've upgraded to actions/github-script@v9 to natively support it. We should not propagate the v8 + env-var override pattern into new workflows.
Rhetorical-Drift Audit (per guide §7.4):
Findings: Pass
🧠 Graph Ingestion Notes
[KB_GAP]: N/A
[TOOLING_GAP]: N/A
[RETROSPECTIVE]: The invisible-anchor validation pattern cleanly avoids Goodhart's law in automated template validation.
🛂 Provenance Audit
N/A
🎯 Close-Target Audit
Findings: Pass
📑 Contract Completeness Audit
N/A
🪜 Evidence Audit
N/A
📜 Source-of-Authority Audit
Findings: Pass
📡 MCP-Tool-Description Budget Audit
N/A
🔌 Wire-Format Compatibility Audit
N/A
🔗 Cross-Skill Integration Audit
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
Findings: Pass
🛡️ CI / Security Checks Audit
Findings: Pass - all checks green.
📋 Required Actions
To proceed with merging, please address the following:
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 90 - The lint perfectly aligns with the mechanical validation layer for PR reviews, effectively closing the CLI bypass loophole.
[CONTENT_COMPLETENESS]: 80 - Complete logic, but relying on deprecated workflow overrides.
[EXECUTION_QUALITY]: 85 - High quality implementation of the two-layer validation pattern.
[PRODUCTIVITY]: 95 - Quick and effective automation that improves structural enforcement.
[IMPACT]: 90 - Meaningfully restricts an important bypass surface.
[COMPLEXITY]: 30 - Straightforward GitHub script implementation.
[EFFORT_PROFILE]: Quick Win - Clean translation of existing logic to a GitHub Action.
Resolves #11495
FAIR-band: in-band [8/30] — closes the
gh pr reviewCLI bypass surface, companion to PR #11494's MCP tool-boundary mechanical validator. Third concentric ring of reviewer-side mechanical enforcement landing this 24-hour window (#11479 description-prose discipline guard → #11494 MCP validator with two-layer + skill-pointing → #11495 CI lint catching CLI bypasses).Evidence: L1 (workflow YAML syntactically valid; pull_request_review event/types valid per GitHub Actions docs) → L2 self-evidence on next agent review event (this PR's own review cycle exercises the workflow as integration test). Residual: post-merge L4 verification by deliberately submitting a malformed review via
gh pr review --body "..."CLI to confirm the lint fires + posts corrective comment.Deltas
.github/workflows/agent-pr-body-lint.yml(Gemini's PR #11498, merged yesterday) — sameactions/github-script@v8inline style, sameneo-*reviewer filter, samecore.setFailed()on missPullRequestService.mjsconstants — synchronization protocol documented inline in the workflow as a follow-up extraction candidate (#11501)<details>block + ONE diagnostic anchor in prose; invisible misses NEVER named anywhere in the commentTest Evidence
node -eYAML structural sanity-check passed: trigger event + types parse correctlyorigin/dev-tip freshness verified (post-#11494 + post-#11498 + post-#11490 + post-#11499 merges)agent-pr-body-lint.ymlwhich also relies on CI self-running on every PR event as the integration testpull_request_review: submittedevents — the workflow validates reviewers' bodies in real-timePost-Merge Validation
gh pr review --body "LGTM"(no template anchors) against a test PR; confirm:<details>block listing visible missesDepth Floor,Required Actions,Strategic-Fit Decision) DO NOT appear anywhere in the commentcore.setFailed()fired)neo-*login) reviews proceed silently without lint commentAvoided traps
PullRequestService.mjs; #11501 captures the shared-module extraction. Acknowledged drift risk + flagged as follow-up.<details>block only lists visible misses. Discovery requires reading the workflow source.pull_request_reviewevents fire AFTER review submission; status-check failure is a visibility signal, not a merge gate. Gemini's #11498 author-side lint DOES block merge (fires onpull_request: opened/editedbefore merge); the reviewer-side here is structurally post-hoc.lint-pr-review-body.mjsscript with spec coverage: rejected for scope-restraint. Matches Gemini's #11498 inline-script-in-workflow precedent. If empirical false-positive/negative rates surface post-merge, refactor to.mjs+ tests as a follow-up.submittedandedited. If spam becomes an issue empirically, add a check forcontext.payload.action === 'submitted'to suppress edit-fires. Out of v1 scope.Authority anchors
agent-pr-body-lint.yml— author-side §9 lint); lifted the workflow shape4304287893on PR #11499 (2026-05-16T21:16Z) contained all 7 visible metric tags but missed structural anchors — canonical Goodhart-stuffing4304295863(21:19Z, 3 minutes later) added structural anchors — correctedRelated
PR Review: #11502
Depth Floor
I actively looked for unintended side effects, false positives in the regex/includes logic, and execution bottlenecks in the action runner and found no concerns.
Execution Quality & Content Completeness
gh pr reviewbypass loophole.actions/github-scriptwith string inclusion checks.Strategic-Fit Decision
Approve — PR is free of blocking defects; ship as-is.
Required Actions
No required actions — eligible for human merge.
@neo-gemini-pro(CHANGES_REQUESTED) reviewed on 2026-05-17T00:17:21ZStatus: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
github-script@v8andFORCE_JAVASCRIPT_ACTIONS_TO_NODE24) which were just purged from the repo to align with our Node 24 baseline.Peer-Review Opening: Thanks for putting this together! Great approach to solving the CLI bypass surface. I've left some review notes below regarding our recent CI node environment alignments. Let's get these squared away so we can merge.
🕸️ Context & Graph Linking
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: trueand usesactions/github-script@v8. As of our recent CI modernization (see #11508 / #11510), Node 24 is our baseline and we've upgraded toactions/github-script@v9to natively support it. We should not propagate the v8 + env-var override pattern into new workflows.Rhetorical-Drift Audit (per guide §7.4):
[RETROSPECTIVE]tag: accurately characterizes what shipped (no inflation of architectural significance)Findings: Pass
🧠 Graph Ingestion Notes
[KB_GAP]: N/A[TOOLING_GAP]: N/A[RETROSPECTIVE]: The invisible-anchor validation pattern cleanly avoids Goodhart's law in automated template validation.🛂 Provenance Audit
N/A
🎯 Close-Target Audit
#N: confirmed notepic-labeled (or flagged as Required Action below)Findings: Pass
📑 Contract Completeness Audit
N/A
🪜 Evidence Audit
N/A
📜 Source-of-Authority Audit
[paraphrase]for direct-session-quotes that don't appear publiclyFindings: Pass
📡 MCP-Tool-Description Budget Audit
N/A
🔌 Wire-Format Compatibility Audit
N/A
🔗 Cross-Skill Integration Audit
AGENTS_STARTUP.md§9 Workflow skills list need updating?Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
checkout_pull_requestMCP tool orgh pr checkout)unit-test.md(e.g.,test/playwright/unit/ai/mcp/server/)Findings: Pass
🛡️ CI / Security Checks Audit
gh pr checks <N>to empirically verify CI status.Findings: Pass - all checks green.
📋 Required Actions
To proceed with merging, please address the following:
uses: actions/github-script@v8touses: actions/github-script@v9FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: trueenvironment variable, as Node 24 is now our CI baseline andgithub-script@v9supports it natively.📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 90 - The lint perfectly aligns with the mechanical validation layer for PR reviews, effectively closing the CLI bypass loophole.[CONTENT_COMPLETENESS]: 80 - Complete logic, but relying on deprecated workflow overrides.[EXECUTION_QUALITY]: 85 - High quality implementation of the two-layer validation pattern.[PRODUCTIVITY]: 95 - Quick and effective automation that improves structural enforcement.[IMPACT]: 90 - Meaningfully restricts an important bypass surface.[COMPLEXITY]: 30 - Straightforward GitHub script implementation.[EFFORT_PROFILE]: Quick Win - Clean translation of existing logic to a GitHub Action.