Friction Source
Surfaced 2026-05-13 by @tobiu after observing swarm PR distribution skew (Gemini 5 / Opus 2 / GPT 1 across 8 same-session PRs):
"checking if there are lanes without a risk for merge conflicts would be smarter. so a skills double-check feels needed."
Empirical anchor (same session, 2026-05-13):
- 8 swarm PRs open simultaneously
- GPT self-parked at 11:50Z with: "I remain available for a separate lane after any operator merge events settle"
- Distribution skew: Opus + Gemini kept self-claiming lanes; GPT chose to wait
- Root: existing post-review-pickup substrate covers halt vs next-lane but is silent on the "wait for conditions to settle" soft-park intermediate state
The Substrate Audit (V-B-A 2026-05-13)
Existing skills DO encode self-select-don't-park discipline:
.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md §4 — "Legitimate Halt States" criterion 1 requires explicit backlog self-survey; §4.5 names v13 project board (300+ items) as the substrate-evolution-flywheel supply
.agents/skills/peer-role/references/peer-role-mode.md line 48 — "Self-select lanes; resist 'wait for assignment'"; line 98 — "Discipline-dressed-deference" anti-pattern
The MISSING dimension is merge-conflict-safe lane audit — the discipline of checking touched-files-in-open-PRs before claiming a next lane, to avoid creating a PR that will conflict with peer in-flight work.
The Problem
Without merge-conflict-safe audit, two failure modes recur:
- Soft-park as cover — peer chooses to wait for "merge events to settle" because it's safer than claiming a potentially-conflicting lane. The discipline says "self-select" but is silent on how to select safely under high open-PR count.
- Branch coupling — peer claims a lane, branches off
dev cleanly, then later discovers a peer's pending PR touches overlapping files, creating cascading conflict cycles (empirical: PR #11299 substrate-coupling from earlier session — feedback_branch_from_origin_dev_explicitly memory).
The Architectural Reality
The audit is mechanical:
gh pr list --state open --json number,files --jq '[.[] | .files[]?.path] | unique'
This produces the "touched-by-open-PRs" file-set. Any candidate lane that:
- Modifies files in this set → high merge-conflict risk → reconsider lane choice
- Touches files NOT in this set → low merge-conflict risk → safe self-claim
For ticket-level lanes (no candidate PR diff yet), the heuristic is "tickets whose AC names files in the touched-by-open-PRs set" = high-risk lane.
The Fix
Add a new section to .agents/skills/post-review-pickup/references/post-review-pickup-workflow.md between current §4 (Legitimate Halt States) and §5 (Integration Points):
<h2 class="neo-h2" data-record-id="7">4.5 Merge-Conflict-Safe Lane Audit (pre-selection discipline)</h2>
Before claiming the next lane via §2 Reviewer Pickup Matrix or §3 Author Pickup Matrix, run:
\`\`\`bash
gh pr list --state open --json number,files --jq '[.[] | .files[]?.path] | unique'
\`\`\`
This produces the touched-by-open-PRs file-set. Filter your candidate lanes:
- **Low-risk lane:** touches files NOT in the open-PR set → safe to self-claim
- **High-risk lane:** modifies files IN the open-PR set → reconsider; prefer a parallel-safe lane to keep merge cadence clean
This audit short-circuits the "soft-park / wait for merge events" anti-pattern: instead of waiting, peer scans the touch-file landscape and finds an orthogonal lane.
**Exception:** if every candidate lane is high-risk, the legitimate-halt criterion 2 ("Every candidate lane is blocked on human-only action") DOES apply — but the survey + finding must be named in the halt declaration per §4.
Also add to .agents/skills/peer-role/references/peer-role-mode.md near line 48 (Self-select lanes section):
**Merge-conflict-safe audit:** when ≥3 peer PRs are open simultaneously, before claiming a lane, run the touched-by-open-PRs audit (see `post-review-pickup-workflow.md §4.5`) and prefer orthogonal lanes. Avoid soft-parking ("I'll wait for merges to settle") — that's discipline-dressed-deference per §98.
Acceptance Criteria
Out of Scope
- Mechanical CI enforcement of the audit — peer agency intent; CI rejection of "conflicting branches" before review would over-rotate
- Automated lane-suggestion engine — substrate is human-judgment + tool-output, not auto-routing
- Lane reassignment of in-flight PRs that already conflict — handled organically via rebase or human-mediated
Avoided Traps
- Forcing the audit into AGENTS.md §21 routing table — the audit is post-review-pickup-skill-internal, not a new top-level skill trigger
- Hardcoding "≥3 open PRs" threshold — sometimes 1 open PR is enough to gate; the discipline should be "if any open PR" with author judgment on cost/benefit
- Adding the audit to ticket-intake — too early; ticket-intake claims a ticket before any branch exists. Merge-conflict-safe applies at branch-from-dev moment, which is post-review-pickup territory
- Substrate accretion bypass: this PR is net-expansion to always-loaded substrate. Per AGENTS.md §13 +
pull-request-workflow.md §1.1, future-decay-mitigation rationale must be cited in PR body (preventive against future GPT-soft-park-class friction)
Related
- Origin friction: @tobiu observation 2026-05-13 during 8-PR swarm distribution audit
- Empirical anchor: @neo-gpt soft-park A2A 2026-05-13T11:50:36Z
- Existing substrate (the audit gap):
.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md, .agents/skills/peer-role/references/peer-role-mode.md
- Pattern precedent:
feedback_branch_from_origin_dev_explicitly memory + PR #11299 substrate-coupling incident
Friction Source
Surfaced 2026-05-13 by @tobiu after observing swarm PR distribution skew (Gemini 5 / Opus 2 / GPT 1 across 8 same-session PRs):
Empirical anchor (same session, 2026-05-13):
The Substrate Audit (V-B-A 2026-05-13)
Existing skills DO encode self-select-don't-park discipline:
.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md §4— "Legitimate Halt States" criterion 1 requires explicit backlog self-survey; §4.5 names v13 project board (300+ items) as the substrate-evolution-flywheel supply.agents/skills/peer-role/references/peer-role-mode.mdline 48 — "Self-select lanes; resist 'wait for assignment'"; line 98 — "Discipline-dressed-deference" anti-patternThe MISSING dimension is merge-conflict-safe lane audit — the discipline of checking touched-files-in-open-PRs before claiming a next lane, to avoid creating a PR that will conflict with peer in-flight work.
The Problem
Without merge-conflict-safe audit, two failure modes recur:
devcleanly, then later discovers a peer's pending PR touches overlapping files, creating cascading conflict cycles (empirical: PR #11299 substrate-coupling from earlier session —feedback_branch_from_origin_dev_explicitlymemory).The Architectural Reality
The audit is mechanical:
gh pr list --state open --json number,files --jq '[.[] | .files[]?.path] | unique'This produces the "touched-by-open-PRs" file-set. Any candidate lane that:
For ticket-level lanes (no candidate PR diff yet), the heuristic is "tickets whose AC names files in the touched-by-open-PRs set" = high-risk lane.
The Fix
Add a new section to
.agents/skills/post-review-pickup/references/post-review-pickup-workflow.mdbetween current §4 (Legitimate Halt States) and §5 (Integration Points):<h2 class="neo-h2" data-record-id="7">4.5 Merge-Conflict-Safe Lane Audit (pre-selection discipline)</h2> Before claiming the next lane via §2 Reviewer Pickup Matrix or §3 Author Pickup Matrix, run: \`\`\`bash gh pr list --state open --json number,files --jq '[.[] | .files[]?.path] | unique' \`\`\` This produces the touched-by-open-PRs file-set. Filter your candidate lanes: - **Low-risk lane:** touches files NOT in the open-PR set → safe to self-claim - **High-risk lane:** modifies files IN the open-PR set → reconsider; prefer a parallel-safe lane to keep merge cadence clean This audit short-circuits the "soft-park / wait for merge events" anti-pattern: instead of waiting, peer scans the touch-file landscape and finds an orthogonal lane. **Exception:** if every candidate lane is high-risk, the legitimate-halt criterion 2 ("Every candidate lane is blocked on human-only action") DOES apply — but the survey + finding must be named in the halt declaration per §4.Also add to
.agents/skills/peer-role/references/peer-role-mode.mdnear line 48 (Self-select lanes section):**Merge-conflict-safe audit:** when ≥3 peer PRs are open simultaneously, before claiming a lane, run the touched-by-open-PRs audit (see `post-review-pickup-workflow.md §4.5`) and prefer orthogonal lanes. Avoid soft-parking ("I'll wait for merges to settle") — that's discipline-dressed-deference per §98.Acceptance Criteria
post-review-pickup-workflow.md §4.5added with the merge-conflict-safe audit shell command + low-risk/high-risk filter logicpeer-role-mode.mdSelf-select-lanes section gains 1-2 line cross-reference to §4.5 audit + names soft-park as discipline-dressed-deference variantpull-request-workflow.md §2.3.1(Branch Freshness Check) optionally cross-refs §4.5 so authors verify lane-selection before first commit (not just first push)post-review-pickup-workflow.md §6: "Soft-park ('I'll claim a lane later, once merges settle') without running §4.5 audit first" — names this as a discipline-dressed-deference variant per AGENTS.md §15.6Out of Scope
Avoided Traps
pull-request-workflow.md §1.1, future-decay-mitigation rationale must be cited in PR body (preventive against future GPT-soft-park-class friction)Related
.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md,.agents/skills/peer-role/references/peer-role-mode.mdfeedback_branch_from_origin_dev_explicitlymemory + PR #11299 substrate-coupling incident