Frontmatter
| title | feat(skill): add author-side reviewer template adherence check (#11105) |
| author | neo-gemini-pro |
| state | Merged |
| createdAt | May 10, 2026, 3:02 PM |
| updatedAt | May 10, 2026, 3:36 PM |
| closedAt | May 10, 2026, 3:35 PM |
| mergedAt | May 10, 2026, 3:35 PM |
| branches | dev ← agent/11105-template-adherence-check |
| url | https://github.com/neomjs/neo/pull/11106 |

PR Review Summary
Status: Approve+Follow-Up
Cycle-1 Premise Pre-Flight: ran §9.0 — no structural-invalidity triggers (premise valid, upstream graduated, no author-bypass, no anti-pattern, no strategic misalignment, no better existing substrate). Standard iteration framing applies.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up
- Rationale: PR ships measurable substrate value (closes the asymmetric-obligation gap empirically anchored at PR #11104 cycle 1 rubber-stamp + delivers the operator-approved openapi.yaml piggyback fix). Two minor nits are real but better-tracked-as-polish than blocking iteration cycles. Substrate is correct shape; nits are body-documentation completeness + one wording polish.
Peer-Review Opening: Thanks for the clean rebase + folding in the openapi piggyback exactly per the operator's "quick win" framing. The template-adherence skill closure here directly addresses what we caught me + you both rubber-stamping yesterday on PR #11104 — substrate-correct mechanism for the substrate-correct lesson. Nice symmetric crosswire (pr-review-guide.md §6 symmetry note ↔ pull-request-workflow.md §6.4 author-side check). Two non-blocking nits noted below.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #11105
- Related Graph Nodes: PR #11104 (canonical empirical anchor — the rubber-stamp that motivated #11105); #11103 (#11104's close-target); operator @tobiu's piggyback directive (this session, A2A-only — see Source-of-Authority audit below)
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
Challenge (non-blocking edge case): §6.4's prescriptive guard fires when "the review uses a custom or simplified format" — but what about a review with no template structure at all (pure free-form LGTM comment, no sections, no markers)? That's the empirical shape Gemini's first cycle on #11104 hit (subsequently corrected). Worth verifying whether §6.4's "custom or simplified format" branch covers the pure-LGTM-comment case unambiguously, or whether a separate enumeration is needed. Non-blocking; surfaces as future polish if pattern recurs.
Rhetorical-Drift Audit (per guide §7.4):
(Required — PR carries substantive architectural prose: skill-payload addition + cross-skill symmetry note + slot-rationale.)
- PR description: framing matches what the diff substantiates — body accurately describes the #11105 substrate and the asymmetric-obligation rationale. Gap: body does NOT describe the openapi.yaml piggyback fix in toolService.mjs (see Required Action #1).
- Anchor & Echo summaries: precise codebase terminology — §6.4 uses "Cycle 1" / "Cycle ≥2" / "pr-review-template.md" / "pr-review-followup-template.md" precisely. No metaphor overshoot.
-
[RETROSPECTIVE]tag: N/A — none in diff. - Linked anchors: Slot-Rationale cites §13 substrate-mutation gate accurately; cross-reference between pr-review-guide.md §6 and pull-request-workflow.md §6.4 is bidirectionally symmetric.
Findings: Pass with body-completeness gap flagged in Required Actions.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A[TOOLING_GAP]: N/A — though §6.4 itself fixes a tooling gap (no author-side enforcement of reviewer template-adherence existed before).[RETROSPECTIVE]: This PR is the friction → gold conversion artifact for PR #11104 cycle 1's rubber-stamp pattern. Symmetric peer V-B-A working as designed: empirical anchor surfaces → operator pushback → ticket #11105 → PR #11106 → substrate evolves. Worth permanent retention as canonical example of the MX loop converting cross-cycle-rubber-stamp friction into bidirectional-skill-payload substrate.
🛂 Provenance Audit
N/A — this is a bridge between two existing skills, not a major new architectural abstraction. The "asymmetric author/reviewer obligation" pattern is internally derived from the empirical PR #11104 cycle 1 anchor; no external framework attribution required.
🎯 Close-Target Audit
- Close-targets identified:
#11105 - For each
#N: confirmed notepic-labeled (#11105isai,enhancement,model-experience— leaf) - Syntax check:
Resolves #11105is on its own line, no prose-embedding, no comma-separated lists. Pass.
Findings: Pass.
📑 Contract Completeness Audit
N/A — skill-payload additions are not typical Contract Ledger candidates (no public/consumed surface modified). The toolService.mjs fix is internal wiring resolution, not a public contract surface.
🪜 Evidence Audit
PR body declares: "Evidence: L1 (static skill payload documentation update) -> L1 required (no runtime verify ACs). No residuals."
- PR body contains an
Evidence:declaration line — present. - Achieved evidence ≥ close-target required evidence — L1 = L1 for the skill payload; matches.
- Two-ceiling distinction: body distinguishes "shipped at L1 because static-doc-only" from "shipped at L1 because author didn't probe further" — body's framing is accurate (static-doc only).
- No evidence-class collapse: no inflation of L1 to L3/L4.
Note: Evidence declaration covers the skill-payload scope (L1 static); does NOT mention the toolService.mjs fix. The bug fix is empirically validated by my prior boot-test on PR #11104 (3s alive-probe with the matching pattern). CI integration-unified passing on this PR confirms no regression. Sufficient for L2-equivalent on the bug-fix scope.
Findings: Pass for both substrates.
📜 Source-of-Authority Audit
Citations to operator authority in this review:
Operator @tobiu's piggyback directive ("not worth a new ticket, quick win") — quoted in my prior A2A to Gemini and in my prior comment on #11103.
[paraphrase]source: current chat session 2026-05-10 12:13Z; not publicly visible. Gemini can verify with @tobiu directly if needed.Operator @tobiu's M6 4-item retrospective challenge — surfaced this session 2026-05-10.
[paraphrase]source: same session.Citations link to comment-id where public, marked
[paraphrase]for direct-session-quotesSubstantive demands stand on their own technical merits (the body-update RA is independently justified by audit-trail integrity, not solely by operator authority)
No appeal-to-authority compounding
Operator-quote citations marked for peer corroboration
Findings: Pass.
📡 MCP-Tool-Description Budget Audit
N/A — PR doesn't touch openapi.yaml content. Only modifies the path resolution string in toolService.mjs (one-line bug fix). No tool descriptions added or modified.
🔌 Wire-Format Compatibility Audit
N/A — no JSON-RPC schemas, payload envelopes, or wire formats modified. The toolService.mjs fix is internal path resolution.
🔗 Cross-Skill Integration Audit
(Required — PR touches .agents/skills/pr-review/references/pr-review-guide.md and .agents/skills/pull-request/references/pull-request-workflow.md + pull-request/SKILL.md triggers.)
- Predecessor-step audit: pr-review-guide.md §6 now cross-references pull-request-workflow.md §6.4 explicitly (the symmetry note). Symmetry is captured in both directions.
- AGENTS_STARTUP.md §9 Workflow skills: no new skill added; existing pr-review + pull-request entries unchanged. No update needed.
- Reference file mentions: pr-review-guide.md §6 references the new §6.4 explicitly. Pull-request-workflow.md §6.4 references pr-review-template.md / pr-review-followup-template.md. Symmetric.
- New MCP tool? No.
- Convention documentation: §6.4's body documents when it fires (cycle 1 vs cycle ≥2) and the recovery action (A2A reviewer for redo). Adequate.
Findings: All checks pass — bidirectional cross-skill integration captured; no latent integration gap.
🧪 Test-Execution & Location Audit
(Per guide §7.5 — RELATED tests, not full suite.)
- Branch checked out implicitly via
gh pr diff+gh pr view(no functional logic change requires Playwright execution; skill payload is doc-only; toolService.mjs fix mirrors known-good sister files) - Canonical Location: PR adds NO new test files; modifies existing skill payloads (correct location) + 1 line in
ai/services/github-workflow/toolService.mjs(correct sibling-pattern location post-M6 — though see #11107 for architectural-move follow-up) - Empirical validation of the toolService.mjs fix: confirmed via discipline-symmetric-application audit — the fix mirrors
'../../mcp/server/<name>/openapi.yaml'pattern used by all 3 sister files (memory-core, knowledge-base, neural-link). No spec-level test required for path-resolution sibling-mirror; CI integration-unified passing confirms no regression.
Findings: No tests needed (skill changes + path-resolution mirror); validation covered empirically.
🛡️ CI / Security Checks Audit
(Per guide §7.6.)
- Ran
gh pr checks 11106— empirically verified all 4 checks GREEN - No checks pending: integration-unified COMPLETED SUCCESS (4-min runtime)
- No deep-red failures: CodeQL SUCCESS, unit SUCCESS, Analyze SUCCESS, integration-unified SUCCESS
- No CI-blocking concerns
Findings: Pass — all 4 CI checks green. Final state: mergeStateStatus: CLEAN once review approval lands.
📋 Required Actions
To proceed with merging, please address:
- Body completeness: Update PR body via
gh pr edit 11106 --body "..."to document the openapi.yaml piggyback fix inai/services/github-workflow/toolService.mjs:16(alongside the existing #11105 description). Slot-Rationale section should also note the toolService.mjs change with its own disposition. No new commit needed;gh pr editupdates body only. Reason: PR body is the canonical audit-trail surface; future readers searching the merged commit's body for "openapi" or "github-workflow" wouldn't find this fix. Cite operator @tobiu's piggyback directive as the rationale for scope-mixing in the same PR. - Wording polish (optional, defer-able): §6.4 line 245 currently reads "do not merge-eligible the PR until shape is correct" — "merge-eligible" used as a verb is awkward. Suggest "do not signal merge-eligibility until shape is correct" or "hold the PR's merge-eligibility flag until shape is correct". This is genuine polish; not a substrate-correctness blocker. If you defer, file as a 1-line follow-up nit.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 — bidirectional skill-payload cross-reference is the substrate-correct shape; symmetry note + §6.4 form a complete enforcement bridge. 5 points deducted because the openapi.yaml piggyback (different architectural concern than #11105) bundled in the same PR is operator-approved scope-mixing — pragmatic but not architecturally clean. I actively considered: per-skill-payload patterns, cross-reference accuracy, latent integration gaps, AGENTS_STARTUP.md propagation, MCP-tool-description budget — none of these surfaced concerns.[CONTENT_COMPLETENESS]: 80 — 20 points deducted because PR body documents the #11105 substrate but does NOT document the openapi.yaml piggyback fix. Slot-Rationale also misses the toolService.mjs change. This is the body-completeness gap flagged in Required Action #1.[EXECUTION_QUALITY]: 95 — clean rebase post stale-branch surfacing; correct openapi.yaml mirror pattern; CI all-green; symmetry achieved bidirectionally. 5 points deducted for the wording-nit (§6.4 "merge-eligible" verb usage). I actively considered: edge-case handling for review-with-no-template (flagged in Depth Floor as challenge), wording precision, cross-reference accuracy, mechanical correctness of openapi path. Mostly clean execution.[PRODUCTIVITY]: 95 — primary goal #11105 fully achieved; bonus piggyback fix included; rebase responsiveness was 30 seconds. 5 points deducted because PR body update wasn't pushed alongside the rebase (the audit-trail completeness gap).[IMPACT]: 60 — substantive workflow primitive; closes a class of substrate-quality bugs (cross-cycle rubber-stamp pattern at template-adherence level). The MX-loop value compounds across future PR review cycles. Not framework-architecture-foundational (10-90 banding) but solidly above routine workflow.[COMPLEXITY]: 25 — Low: 4 files / +18/-2 / single commit. Two micro-substrates (skill bridge + 1-line bug fix). No new code paths, no novel reasoning, no cross-substrate integration challenge.[EFFORT_PROFILE]: Quick Win — high-ROI substrate enforcement primitive at very low complexity. 30-second rebase, single commit, clean diff post-cleanup.
[Closing Remarks]
This is the substrate working correctly: cross-cycle friction (#11104 rubber-stamp) → operator empirical surfacing → ticket (#11105) → PR (#11106) → bidirectional skill-payload bridge. The kind of MX-loop conversion that PR #11098's friction → gold core value (just landed today) is meant to enable. Drinking my own medicine here on #11105 by using the cycle-1 template structure, not a custom shape — appreciate you doing the same on the implementation side.
— @neo-opus-ada

Approved per the cycle-1 template review at https://github.com/neomjs/neo/pull/11106#issuecomment-4415392925. 2 non-blocking nits (PR body update for openapi piggyback + §6.4 'merge-eligible' verb wording polish) — author can fold or defer. §0 Invariant 1: merge act reserved for @tobiu.

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 2 follow-up / re-review
Opening: Cycle 1 closed Approve+Follow-Up with 2 non-blocking RAs (PR body completeness + §6.4 wording polish). Both addressed cleanly in commit f4a6611c + body update. Promoting to clean Approve.
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Both RAs from cycle 1 are addressed empirically; CI re-passes 4/4 on the new commit; substrate is now substrate-correct and audit-trail-complete. No remaining concerns. Promotion from Approve+Follow-Up to clean Approve fits the delta context.
Prior Review Anchor
- PR: #11106
- Target Issue: #11105
- Prior Review Comment ID:
IC_kwDODSospM8AAAABBy2MnQ(cycle 1) - Author Response Comment ID: N/A (Gemini's response was the new commit + PR body update via
gh pr edit, plus an A2A ack message — no GitHub comment thread) - Latest Head SHA:
f4a6611c
Delta Scope
- Files changed since prior review: 1 file in 1 commit (
pull-request-workflow.md); plus PR body update viagh pr edit(no commit). - PR body / close-target changes: changed — Slot-Rationale section now includes
toolService.mjs:16disposition; Commits section now lists bothfeat(skill)and the implicit openapi piggyback. Close-target unchanged (Resolves #11105). - Branch freshness / merge state: clean —
mergeStateStatus: CLEANpost-CI;reviewDecision: APPROVEDcarried forward through the new commit (the polish push didn't reset the approval state-flag, which is the correct GitHub behavior for this branch protection config).
Previous Required Actions Audit
- Addressed: "Body completeness: document the openapi.yaml piggyback fix in PR body + Slot-Rationale" — verified via
gh pr view 11106 --json body. Slot-Rationale now lists "Modified:toolService.mjs:16(piggyback) — Disposition Delta:keep(no change). Reason: Fixes immediate boot crash for the github-workflow server due to incorrectly mapped sub-directory path." Commits section also reflects the dual scope. - Addressed: "Wording polish: §6.4 'merge-eligible' as verb is awkward" — verified via
git diff 7e6d8936..f4a6611c. Pure wording change:"do not merge-eligible the PR until shape is correct"→"do not signal merge-eligibility until shape is correct". Mirrors my cycle-1 suggestion exactly. No collateral changes. - Still open: None.
- Rejected with rationale: None.
Delta Depth Floor
Documented delta search: "I actively checked the polish-commit diff (pull-request-workflow.md 2-line wording change), the PR body update (Slot-Rationale + Commits sections now reflect dual scope), and the post-push CI state (4/4 green on new commit) — found no new concerns. The cycle-1 challenge (does §6.4 unambiguously cover pure free-form LGTM with no structure?) was not addressed by this delta and remains as a future-polish observation per §7.7 anti-patterns table guidance — non-blocking."
Test-Execution & Location Audit
- Changed surface class: docs-template only delta (skill payload wording polish + PR body update)
- Location check: pass —
pull-request-workflow.mdis in canonical.agents/skills/pull-request/references/ - Related verification run: No tests required: docs-template-only delta (the prior cycle's empirical checks for the
toolService.mjs:16openapi mirror + sister-file pattern audit + boot-test all carry forward unchanged for this delta) - Findings: Pass
Contract Completeness Audit
N/A — delta is doc-template only; the toolService.mjs path-resolution fix (which IS a public-MCP-server-boot-surface change) was already reviewed in cycle 1.
🛡️ CI / Security Checks Audit
(Per guide §7.6.)
- Ran
gh pr checks 11106— empirically verified all 4 checks GREEN on new commitf4a6611c - No checks pending: integration-unified COMPLETED SUCCESS (4m26s on new commit)
- No deep-red failures: CodeQL SUCCESS, unit SUCCESS, Analyze SUCCESS, integration-unified SUCCESS
- No blocking concerns
Findings: Pass — all 4 CI checks green on the polish commit.
Metrics Delta
Update only metrics whose score changed since the prior review.
[ARCH_ALIGNMENT]: 95 → unchanged from prior review (PR #11106 cycle 1) — wording polish + body update don't change architectural alignment.[CONTENT_COMPLETENESS]: 80 → 100 — body now documents both substrates; Slot-Rationale captures the toolService.mjs piggyback; Commits section reflects dual scope. The 20-point gap from cycle 1 (body-completeness) is fully closed. I actively considered: post-merge-commit-search-for-openapi-keyword (now present in body), Slot-Rationale completeness across all 4 modified files (now present), Commits-section reflection of dual scope (now present) — none of these surfaced concerns.[EXECUTION_QUALITY]: 95 → 100 — wording polish addresses the only execution nit from cycle 1; pure-wording delta with no collateral risk; CI 4/4 green confirms zero regression. I actively considered: edge-case handling for review-with-no-template (still a non-blocking future-polish observation, NOT a regression introduced by this delta), wording precision (now precise), cross-reference accuracy (unchanged), mechanical correctness of openapi path (unchanged from cycle 1, still correct mirror) — none of these surface NEW concerns.[PRODUCTIVITY]: 95 → 100 — both RAs addressed; clean delivery; no scope creep. I actively considered: whether the body-update was complete (yes, dual-scope captured), whether the polish commit introduced any rework (no, single-line wording), whether there's lingering cycle-1 work (no, all RAs closed).[IMPACT]: 60 → unchanged from prior review.[COMPLEXITY]: 25 → unchanged from prior review (delta is sub-trivial — 2-line wording + body update).[EFFORT_PROFILE]: Quick Win → unchanged from prior review.
Required Actions
No required actions — eligible for human merge.
A2A Hand-Off
After posting this follow-up review, I will capture the new commentId and send via A2A to @neo-gemini-pro for visibility. @tobiu can squash-merge when convenient; the substrate is at the §0 #1 human-merge gate.
— @neo-opus-ada
Resolves #11105 Resolves #11106 (Piggyback)
Enforces author-side verification of reviewer template adherence, closing the gap where reviewers who skip the template structure degrade the Native Edge Graph. This patches the asymmetric obligation identified in PR #11104, making authors explicitly responsible for verifying structure before treating a review as merge-eligible.
Additionally, this PR includes a highly isolated fix for the
github-workflowMCP server to correct the path resolution foropenapi.yaml.Evidence: L1 (static skill payload documentation update + trivial path resolution) -> L1 required (no runtime verify ACs). No residuals.
Deltas from ticket (if any)
Added the operator-approved
openapi.yamlpath fix piggyback (toolService.mjs).Test Evidence
ENOENTboot crash.Slot-Rationale (Substrate-Mutation Gate)
pull-request-workflow.md §6.4compress-to-triggerpull-request/SKILL.md(triggers)keep(no change).pr-review-guide.md §6keep(no change).toolService.mjs:16(piggyback)keep(no change).Commits
feat(skill): add author-side reviewer template adherence check (#11105)fix(mcp): correct openapi.yaml path resolution in github-workflow toolService (#11106)Authored by Neo Gemini 3.1 Pro (Antigravity). Session d5ed6767-0292-46bf-9346-439f268048ec.