LearnNewsExamplesServices
Frontmatter
id10208
titleMandate cross-family PR review; time-bounded self-review fallback
stateClosed
labels
documentationenhancementaiarchitecture
assigneesneo-gemini-pro
createdAtApr 22, 2026, 10:52 PM
updatedAtApr 22, 2026, 11:20 PM
githubUrlhttps://github.com/neomjs/neo/issues/10208
authorneo-opus-ada
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtApr 22, 2026, 11:20 PM

Mandate cross-family PR review; time-bounded self-review fallback

Closed v13.0.0/archive-v13-0-0-chunk-5 documentationenhancementaiarchitecture
neo-opus-ada
neo-opus-ada commented on Apr 22, 2026, 10:52 PM

Context

Three empirical instances in session ae546a40-2133-482f-85a6-779fdf6757b2 demonstrate self-review's systematic blind spots:

  • PR #10193 (Gemini self-workflow): peer review caught 5 blockers (raw console.error regression, scope creep across multiple files, AC contract-break on "pruning," stale branch with merged #10185 hunks, no automated tests)
  • PR #10202 (Gemini self-polish): peer review caught JSDoc drift that would have poisoned Knowledge Base vectors on next sync + console.log polluting --json stdout
  • PR #10205 (Gemini self-review): peer review caught wrong test location (deprecated test/playwright/mcp/ tree vs canonical test/playwright/unit/ai/mcp/server/), broken module-identity test (mutates template import but syncer reads runtime config — mutation never reaches the code under test), missing setup.mjs bootstrap

In each case the self-review scored 90-100 across multiple evaluative metrics; the independent peer review found Request-Changes-level issues. .agent/skills/pr-review/references/pr-review-guide.md §7.2 already documents this Gemini-family asymmetry (quick-win framing, all-100 scoring, pre-ticked integration checklists) — but only as a cautionary pattern, not a mandated control.

The Problem

Author-as-reviewer is structurally harder than independent review. The author's priors are precisely the reason the code was written the way it was; asking them to adversarially re-examine their own priors rarely surfaces new information. pull-request §1 ("Stepping Back") is the existing mitigation, but in practice the Gemini-family quick-win pattern of §7.2 shows Stepping Back alone does not cover every failure mode.

Conversely, Opus self-reviews risk the complementary failure mode also documented in §7.2: over-rigor, inflated [COMPLEXITY] scoring, flagging concerns that aren't load-bearing. Each family has distinct blind spots; cross-family pairing compensates. The asymmetry is documented; the cross-family review that exploits it should be mandated.

The Architectural Reality

The enforcement sites already exist:

  • .agent/skills/pull-request/references/pull-request-workflow.md §6 Definition of Done — currently defines "Done" as "PR is opened." Should extend to: "PR is Done once a cross-family reviewer has posted an Approved status on the thread."
  • .agent/skills/pr-review/references/pr-review-guide.md §1 Core Philosophy — currently classifies review modes (Internal/External/Self). Should clarify that self-review is a fallback mode, not a substitute for cross-family review.
  • .agent/skills/pr-review/references/pr-review-guide.md §7.2 Cross-Model Asymmetry — describes the pattern; should forward-reference the mandate once landed.

The manage_issue_comment MCP tool's agent field (format "[Model Name] ([Harness])") is the substrate for automated detection of cross-family compliance — Claude reviews identify as Claude Opus 4.7 (Claude Code), Gemini reviews as Gemini 3.1 Pro (Antigravity). Regex-matching the family prefix (Claude* vs Gemini*) on at least one Approved-status review comment is the verification primitive.

The Fix

  1. Update pull-request/references/pull-request-workflow.md §6 Definition of Done:

    • Add: "No PR may be squash-merged without at least one cross-family Approved review (Claude-family ↔ Gemini-family, identified by the agent field in the Approved review comment)."
    • Define the exception matrix (see Acceptance Criteria below).
    • Forward-reference pr-review §7.2 for the empirical rationale.
  2. Update pr-review/references/pr-review-guide.md §1 Core Philosophy:

    • Clarify that self-review mode is reserved for the explicit fallback path (author captures reflection / intent) and does NOT substitute for the cross-family requirement.
    • Add a forward pointer to pull-request §6 for the authoritative mandate.
  3. Update pr-review/references/pr-review-guide.md §7.2 Cross-Model Asymmetry:

    • Add a closing line: "This asymmetry is the empirical basis for the cross-family review mandate in pull-request §6."
  4. Optional (bundle or separate ticket): update AGENTS_STARTUP.md §9 Workflow skills list to cite the mandate as a first-class swarm convention.

Acceptance Criteria

  • pull-request §6 Definition of Done carries the cross-family mandate
  • pr-review §1 clarifies self-review as fallback mode only
  • pr-review §7.2 forward-references the mandate
  • Exception matrix codified in pull-request §6:
    • micro-change exemption: commit type chore AND < 20 lines changed, OR pure documentation with no runtime impact
    • 7-day-open fallback: the PR itself has been OPEN for ≥ 7 days AND no cross-family reviewer has engaged on the thread (no review or comment posted by a login whose identity maps to the opposite family). Deterministically verifiable via get_conversation(pr_number): (a) now - createdAt ≥ 7 days, (b) comments.nodes contains no entry whose author.login resolves to the cross-family pattern. Fallback invocation MUST include the PR's createdAt timestamp + explicit confirmation that no cross-family engagement has occurred, embedded in the self-review comment. Rationale: PR open-time is a deterministic GitHub-native substrate. An earlier draft proposed query_raw_memories for this check; rejected because semantic top-K-by-relevance retrieval isn't time-windowed and can't reliably answer "has no one of family X been active recently?"
    • emergency hotfix escalator: priority: P0 label OR an explicit Tobi-override comment on the PR; post-merge cross-family retrospective review REQUIRED within 7 days
  • Existing assignee convention (manage_issue_assignees add @me per ticket-intake §3a) unchanged — this ticket adds a gate, not new ownership semantics

Out of Scope

  • CI / GitHub Actions automated enforcement — follow-up ticket after empirical adoption period
  • Formal compliance metrics dashboard — follow-up
  • Extension to a hypothetical third model family — Claude ↔ Gemini is today's reality; premature to generalize
  • Changes to ticket-review / epic-review protocols — they already implicitly support cross-family via manage_issue_comment's agent field
  • Retroactive application to already-merged PRs

Avoided Traps

  • "Same-family reviewer suffices" — rejected. §7.2's asymmetry is family-level; Opus reviewing Sonnet inherits the same priors. The cross-family requirement is the substrate the rule rests on.
  • "Blanket block until cross-family reviews every PR" — rejected. Emergency hotfixes can't wait 7 days; typos don't warrant the overhead. Exception matrix is load-bearing.
  • "Manual Tobi enforcement only" — rejected as the primary mechanism (lossy, doesn't scale across the swarm). Skill-level mandate via pull-request §6 is the agent-discipline substrate; Tobi-override remains as emergency escalator.
  • "Go straight to CI enforcement" — rejected as over-engineering for the adoption phase. Empirical data over a few weeks of skill-level discipline will show whether CI is needed.
  • "Self-review is inherently invalid" — rejected. Self-review captures author reflection and intent that cross-family review can't (no one knows the author's priors better than the author). The rule reserves self-review for the fallback / intent-capture role, not for sole approval.

Related

  • #10109 — PR comment hygiene (update-vs-new-comment per lifecycle stage). Adjacent scope in the PR-workflow space; orthogonal to this mandate.
  • PR #10193, PR #10202, PR #10205 — empirical evidence anchoring the Context section
  • pr-review-guide.md §7.2 Cross-Model Asymmetry — the documented pattern this mandate operationalizes

Handoff Retrieval Hints

  • query_raw_memories(query="cross-family PR review mandate Gemini Claude asymmetry")
  • query_raw_memories(query="self-review 100s metrics pre-ticked integration audit")
  • query_summaries(query="PR review cross-model enforcement")
  • Commit-range anchor: PR #10205 (the session's third empirical data point)

Known contributing sessions (partial, restart-fragmented):

  • ae546a40-2133-482f-85a6-779fdf6757b2 (authoring session; contains #10193, #10202, #10205 review history)
tobiu referenced in commit bc33eb0 - "docs(workflow): mandate cross-family PR reviews (#10208) (#10211) on Apr 22, 2026, 11:20 PM
tobiu closed this issue on Apr 22, 2026, 11:20 PM
tobiu referenced in commit 48269c3 - "feat(ai): codify ticket-triage skill for unlabeled tickets (#10216) (#10415) on Apr 27, 2026, 1:37 PM
tobiu referenced in commit 2e1de8a - "feat(github-workflow): add manage_pr_reviewers MCP tool (#10217) (#10417) on Apr 27, 2026, 1:55 PM