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
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.
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.
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."
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
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)
Context
Three empirical instances in session
ae546a40-2133-482f-85a6-779fdf6757b2demonstrate self-review's systematic blind spots:console.errorregression, scope creep across multiple files, AC contract-break on "pruning," stale branch with merged #10185 hunks, no automated tests)console.logpolluting--jsonstdouttest/playwright/mcp/tree vs canonicaltest/playwright/unit/ai/mcp/server/), broken module-identity test (mutates template import but syncer reads runtime config — mutation never reaches the code under test), missingsetup.mjsbootstrapIn 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.2already 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.2shows 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_commentMCP tool'sagentfield (format"[Model Name] ([Harness])") is the substrate for automated detection of cross-family compliance — Claude reviews identify asClaude Opus 4.7 (Claude Code), Gemini reviews asGemini 3.1 Pro (Antigravity). Regex-matching the family prefix (Claude*vsGemini*) on at least one Approved-status review comment is the verification primitive.The Fix
Update
pull-request/references/pull-request-workflow.md §6 Definition of Done:agentfield in the Approved review comment)."pr-review §7.2for the empirical rationale.Update
pr-review/references/pr-review-guide.md §1 Core Philosophy:pull-request §6for the authoritative mandate.Update
pr-review/references/pr-review-guide.md §7.2 Cross-Model Asymmetry:pull-request §6."Optional (bundle or separate ticket): update
AGENTS_STARTUP.md §9Workflow skills list to cite the mandate as a first-class swarm convention.Acceptance Criteria
pull-request §6 Definition of Donecarries the cross-family mandatepr-review §1clarifies self-review as fallback mode onlypr-review §7.2forward-references the mandatepull-request §6:micro-change exemption: commit typechoreAND< 20 lineschanged, OR pure documentation with no runtime impact7-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 viaget_conversation(pr_number): (a)now - createdAt ≥ 7 days, (b)comments.nodescontains no entry whoseauthor.loginresolves to the cross-family pattern. Fallback invocation MUST include the PR'screatedAttimestamp + 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 proposedquery_raw_memoriesfor 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: P0label OR an explicit Tobi-override comment on the PR; post-merge cross-family retrospective review REQUIRED within 7 daysmanage_issue_assignees add @meperticket-intake §3a) unchanged — this ticket adds a gate, not new ownership semanticsOut of Scope
ticket-review/epic-reviewprotocols — they already implicitly support cross-family viamanage_issue_comment'sagentfieldAvoided Traps
§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.pull-request §6is the agent-discipline substrate; Tobi-override remains as emergency escalator.Related
#10109— PR comment hygiene (update-vs-new-comment per lifecycle stage). Adjacent scope in the PR-workflow space; orthogonal to this mandate.#10193, PR#10202, PR#10205— empirical evidence anchoring the Context sectionpr-review-guide.md §7.2 Cross-Model Asymmetry— the documented pattern this mandate operationalizesHandoff 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")#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)