Context
@tobiu surfaced a workflow friction during GPT harness recovery on 2026-05-19: this is not a blame or under-target quota problem. The structural issue is trigger ordering. If an agent starts from a fresh boot, watchdog wake, or PR-review request, it can enter reviewer mode before the role/lane-pickup substrate fires. The existing CI-wait routing is useful after a PR exists, but it does not solve the earlier state where no author lane has been picked yet.
V-B-A performed before filing:
- Mailbox checked: 0 unread at the time of ticket drafting.
- Current role payloads already encode the desired behavior:
lead-role-mode.md says lead means pick own lane visibly + focus + V-B-A + challenge (.agents/skills/lead-role/references/lead-role-mode.md:7-13) and peer-role-mode.md says peer means proactive V-B-A/challenge, with self-selection instead of waiting for assignment (.agents/skills/peer-role/references/peer-role-mode.md:5-18, :46-48).
post-review-pickup/SKILL.md only invokes after review/review-response handoff (.agents/skills/post-review-pickup/SKILL.md:1-8). Its deeper workflow contains a hidden lane-discovery trigger for fresh-boot (.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md:56-60), but the router does not expose that trigger, so the payload is not guaranteed to be read before the first review.
fair-band-pre-flight-gate.md explicitly notes lane-discovery discipline is skill-invocation-dependent and that the PR-open gate only catches paths that reach PR authoring (.agents/skills/pull-request/references/fair-band-pre-flight-gate.md:1-4).
- Live distribution check over the last 200 merged PRs:
neo-gemini-pro=83, neo-opus-ada=68, neo-gpt=45, dependabot[bot]=4. Live last-30 check was effectively balanced: Gemini=10, GPT=10, Claude=9, dependabot=1. That means the ticket should not be framed as immediate quota correction; it is a decay-prevention trigger-ordering fix.
The Problem
The current substrate solves the author-after-review problem better than the pre-review intake problem:
- After a review is posted,
post-review-pickup can require a next lane or explicit halt.
- After a PR is opened, the FAIR-band PR-body gate can enforce author-lane stance.
- During lead-role or peer-role, the payloads already tell agents to self-select lanes.
But a fresh session can begin with live review requests and never cross the earlier lane-pickup surface. The agent can perform reviews, send review A2A, then continue to the next review because every local trigger points at review lifecycle work. The result is a reviewer-only cycle even though the correct mental model is: pick a lane, create a PR, then review peer PRs afterwards or while own CI is pending.
This is a trigger-ordering hole, not an individual performance target.
The Architectural Reality
The relevant surfaces are agent-skill routers and payload maps, not runtime framework code:
/lead-role already has the correct lane-selection primitive, but it only fires when lead-role is explicitly invoked or a baton/operator trigger is present.
/peer-role already says self-select lanes and resist waiting for assignment, but it is framed around substrate validation and convergence work, not ordinary review-queue intake.
/post-review-pickup contains the deeper lane-discovery hook, including fresh-boot, but its SKILL.md trigger is post-review only.
/pr-review is intentionally concrete-PR-focused. Adding a giant lane-management manual there would bloat the hot review path and violate progressive-disclosure discipline.
create-skill guidance requires lightweight routers and payload extraction; any fix must use a small map trigger and avoid stuffing workflow rationale into SKILL.md.
The Fix
Add a minimal, progressive-disclosure pre-review intake gate for agents that are about to enter review work with no active author lane in the current session.
Candidate shape:
- Add a small router-visible trigger to the appropriate skill surface, likely
post-review-pickup/SKILL.md or a narrow payload referenced from pr-review/SKILL.md, that fires before first review intake from fresh boot / watchdog / review-wake when no current author lane exists.
- The gate should require a quick lane-discovery check: open self-pickable tickets / assigned-to-me / recent operator focus / current public authority, then either pick an author lane or document why review-first is the positive-ROI move.
- If role context is active or explicitly named, read
/lead-role or /peer-role before lane choice, not after review work.
- Preserve the CI-wait routing: after opening a PR, peer review work is appropriate while own CI is pending, with a return-to-own-PR check.
- Keep top-level router changes tiny. Put rationale, examples, and exceptions in a payload file.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
| First review intake from fresh boot / watchdog / review wake |
AGENTS.md §15.6, lead-role §0, peer-role §6, post-review-pickup §4 |
Before accepting the review queue, check whether an author lane should be selected first |
If urgent review or human-directed review is the highest-ROI move, document review-first rationale and proceed |
Skill router + payload map |
Unit/lint evidence for skill manifest if touched; manual V-B-A with a fresh-session scenario |
| Role-triggered lane choice |
lead-role and peer-role payloads |
Read role payload before lane pickup when role is active or explicitly invoked |
If no role trigger exists, use the generic lane-discovery gate without pretending lead/peer role is active |
Role payload cross-reference |
Reviewers can verify no role-bloat or forced role activation |
| Reviewer-only cycle prevention |
post-review-pickup and FAIR-band gates |
Ensure author-lane discipline can fire before review-only loops begin |
Explicit halt only after backlog self-survey and blocker statement |
New or amended payload section |
A2A / PR body examples show lane picked before reviews or review-first rationale |
Acceptance Criteria
Out of Scope
- No change to human-only merge authority.
- No ranking scoreboard or author-count enforcement.
- No requirement that every review wait for an author PR.
- No new role hierarchy; maintain the flat peer-team model.
- No Body-layer runtime changes.
Avoided Traps
- Quota framing: the last-30 window is balanced, so this is not an immediate under-target correction. The long-window imbalance is only evidence that the decay mode matters.
- Forcing role-mode everywhere: lead-role and peer-role are not generic wrappers around every review. The fix should make role payloads fire when appropriate, not create synthetic role state.
- Stuffing
pr-review/SKILL.md: review template loading is already heavy. The right shape is a compact trigger plus payload pointer.
- Reviewer freeze: peer review remains valuable, especially while own CI is pending. The fix is to pick/justify lane order, not to block review work.
Related
- #11430 closed adjacent work: FAIR-band author-lane pickup discipline after PR review/response handoff.
- #11603 broad adjacent friction: substrate bandwidth and contribution distribution counter-bias.
- #11605 broad adjacent friction: skill baggage / decision-atom cleanup.
- Discussion #11206 / #11209 lineage via lead-role and peer-role coordination payloads.
Handoff Retrieval Hints
- Query Memory Core for:
role-first lane pickup before review intake, reviewer-only cycle fresh boot, post-review-pickup fresh-boot trigger hidden, lead-role peer-role lane self-select before review.
- Verify current facts with:
gh search prs --merged --repo neomjs/neo --limit 200 --sort updated --json author --jq 'map(.author.login) | group_by(.) | map({author: .[0], count: length}) | sort_by(.author)'.
Context
@tobiu surfaced a workflow friction during GPT harness recovery on 2026-05-19: this is not a blame or under-target quota problem. The structural issue is trigger ordering. If an agent starts from a fresh boot, watchdog wake, or PR-review request, it can enter reviewer mode before the role/lane-pickup substrate fires. The existing CI-wait routing is useful after a PR exists, but it does not solve the earlier state where no author lane has been picked yet.
V-B-A performed before filing:
lead-role-mode.mdsays lead means pick own lane visibly + focus + V-B-A + challenge (.agents/skills/lead-role/references/lead-role-mode.md:7-13) andpeer-role-mode.mdsays peer means proactive V-B-A/challenge, with self-selection instead of waiting for assignment (.agents/skills/peer-role/references/peer-role-mode.md:5-18,:46-48).post-review-pickup/SKILL.mdonly invokes after review/review-response handoff (.agents/skills/post-review-pickup/SKILL.md:1-8). Its deeper workflow contains a hidden lane-discovery trigger forfresh-boot(.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md:56-60), but the router does not expose that trigger, so the payload is not guaranteed to be read before the first review.fair-band-pre-flight-gate.mdexplicitly notes lane-discovery discipline is skill-invocation-dependent and that the PR-open gate only catches paths that reach PR authoring (.agents/skills/pull-request/references/fair-band-pre-flight-gate.md:1-4).neo-gemini-pro=83,neo-opus-ada=68,neo-gpt=45,dependabot[bot]=4. Live last-30 check was effectively balanced: Gemini=10, GPT=10, Claude=9, dependabot=1. That means the ticket should not be framed as immediate quota correction; it is a decay-prevention trigger-ordering fix.The Problem
The current substrate solves the author-after-review problem better than the pre-review intake problem:
post-review-pickupcan require a next lane or explicit halt.But a fresh session can begin with live review requests and never cross the earlier lane-pickup surface. The agent can perform reviews, send review A2A, then continue to the next review because every local trigger points at review lifecycle work. The result is a reviewer-only cycle even though the correct mental model is: pick a lane, create a PR, then review peer PRs afterwards or while own CI is pending.
This is a trigger-ordering hole, not an individual performance target.
The Architectural Reality
The relevant surfaces are agent-skill routers and payload maps, not runtime framework code:
/lead-rolealready has the correct lane-selection primitive, but it only fires when lead-role is explicitly invoked or a baton/operator trigger is present./peer-rolealready says self-select lanes and resist waiting for assignment, but it is framed around substrate validation and convergence work, not ordinary review-queue intake./post-review-pickupcontains the deeper lane-discovery hook, includingfresh-boot, but itsSKILL.mdtrigger is post-review only./pr-reviewis intentionally concrete-PR-focused. Adding a giant lane-management manual there would bloat the hot review path and violate progressive-disclosure discipline.create-skillguidance requires lightweight routers and payload extraction; any fix must use a small map trigger and avoid stuffing workflow rationale intoSKILL.md.The Fix
Add a minimal, progressive-disclosure pre-review intake gate for agents that are about to enter review work with no active author lane in the current session.
Candidate shape:
post-review-pickup/SKILL.mdor a narrow payload referenced frompr-review/SKILL.md, that fires before first review intake from fresh boot / watchdog / review-wake when no current author lane exists./lead-roleor/peer-rolebefore lane choice, not after review work.Contract Ledger Matrix
Acceptance Criteria
role activefromordinary review intake;/lead-roleand/peer-roleare read first only when their real triggers apply..agents/skills/skills.manifest.jsonis affected,node ai/scripts/lint-skill-manifest.mjs --base origin/devpasses.Out of Scope
Avoided Traps
pr-review/SKILL.md: review template loading is already heavy. The right shape is a compact trigger plus payload pointer.Related
Handoff Retrieval Hints
role-first lane pickup before review intake,reviewer-only cycle fresh boot,post-review-pickup fresh-boot trigger hidden,lead-role peer-role lane self-select before review.gh search prs --merged --repo neomjs/neo --limit 200 --sort updated --json author --jq 'map(.author.login) | group_by(.) | map({author: .[0], count: length}) | sort_by(.author)'.