docs(contributing): add self-collision preflight draft for intra-lane duplicate PRs - #1201
Conversation
… duplicate PRs The hold-gated preflight lists open PRs so a lane can prove its new filing is disjoint, yet the quality lane opened two duplicate pairs covering identical file clusters within three days (finpilot#285/projectbluefin#303, finpilot#296/projectbluefin#299). All four are resolved as of 2026-09-23 -- three merged, one closed -- so the queue absorbed the collision; no rule prevented the second filing. Re-auditing the 31 open app-authored PRs across the ten repositories tracked in common#1058 on 2026-09-23 found no confirmed intra-lane duplicate cluster. Every file-cluster intersection that exists is legitimate work: distinct Renovate digest bumps sharing image-versions.yml (bluefin#1227/projectbluefin#1310) and build.yml (server#238/projectbluefin#239), a cosign fix and an SSOT refactor both touching justfile (dakota-iso#142/projectbluefin#146), and two human PRs closing different issues that share Justfile (common#1186/projectbluefin#1187). The prohibition as filed -- no PR whose file cluster intersects the lane's own open PRs -- would therefore have blocked four legitimate filings while catching neither real duplicate. This draft proposes the evidenced alternative: intersect the lane's own open PRs before filing, compare hunks and closing-issue sets rather than shared paths, and either comment on the existing PR or disclose the overlap in the new body. Drafted rather than applied because it binds filing behavior org-wide, matching the precedent set for common#1043 (hold-gate-rubric.md) and common#1052 (agent-lane-throttle.md). Closes projectbluefin#1060 Hive-Run: projectbluefin#1060 Hive-Plan: docs/contributing/self-collision-preflight.md Hive-Spec: common#1060#proposed-next-step Assisted-by: deepseek/deepseek-v4.1-flash via Hive Signed-off-by: sramkrishna <sramkrishna@users.noreply.github.com>
castrojo
left a comment
There was a problem hiding this comment.
LGTM. Clear, evidenced planning draft for intra-lane duplicate PR preflight checks without adding CI overhead.
Danathar
left a comment
There was a problem hiding this comment.
This PR adds a draft proposal, docs/contributing/self-collision-preflight.md, and links to it from CONTRIBUTING.md, agentic-model.md and duplicate-cluster.md. I read the whole diff at a8fcea8. I checked the finpilot PR dates, outcomes and file clusters, the four intersecting pairs, the linked issues, and the internal links and anchors, and they all hold up. The gh pr list … --json number,title,files command also works as written. Locally, just check, tests/test_skill_docs.py, generate_skill_index.py --check and check-doc-links.sh all passed. Validate PR run 35929017936 is green, and Build is path-ignored for docs.
One sentence is wrong. The line added to agentic-model.md says "The topic search does not cover the lane's own open PRs". But gh pr list --state open --search "<topic>" has no author filter, so it does return the lane's own PRs. The real gap is that it matches on text, not on changed files.
Evidence: finpilot#296 and #299 both have "tag-images" in the title, so a topic search for it would have returned both.
Maybe something like: "The topic search matches on text, not on changed files, so it can miss the lane's own open PRs that touch the same files under a different title."
bluefin-common PR
What does this change?
Adds
docs/contributing/self-collision-preflight.md— a planning draft for apreflight step that intersects a lane's own open PRs before it files again — and
links it from
CONTRIBUTING.md,docs/factory/agentic-model.md, anddocs/skills/pr-review/references/duplicate-cluster.md.Why?
Closes #1060
The hold-gated protocol lists open PRs at kick time precisely so a lane can prove
its new filing is disjoint from work already in flight. Within one lane that
check failed: the quality lane opened two duplicate pairs covering identical file
clusters within three days (
finpilot#285/#303,finpilot#296/#299), costingfour review slots for two pieces of work.
All four named PRs are already resolved —
#285merged 2026-09-04,#296merged 2026-09-05,
#299merged 2026-09-06,#303closed 2026-09-06 withoutmerge. The queue adjudicated them rather than any rule preventing the second
filing, so the actionable remainder is the rule.
Why this is a draft and not a direct edit to the hard rules
The issue proposes "a lane may not open a PR whose file cluster intersects its own
open hold-gated PRs." I re-audited the 31 open app-authored PRs across the ten
repositories tracked in #1058 on 2026-09-23 and found no confirmed intra-lane
duplicate cluster. Every file-cluster intersection that exists is legitimate
work the prohibition would have blocked:
bluefin#1227/#1310app/mergeraptorprojectbluefin/common:latestvsublue-os/brew:latest) sharingimage-versions.ymlserver#238/#239app/mergeraptorprojectbluefin/actionsvstaiki-e/install-action) sharing.github/workflows/build.ymldakota-iso#142/#146app/hivecommons-hivejustfilecommon#1186/#1187repires)Justfileand.github/workflows/unit-tests.ymlA shared file is not proof of duplication — that is already the factory's rule at
review time (
common-rationalizations.md,duplicate-cluster.md).The real finpilot duplicates shared an intent and closing issue, not merely a
path. So the draft proposes the evidenced alternative: intersect, compare hunks
and closing-issue sets, then either comment on the existing PR or disclose the
overlap in the new body — a disclosure rule rather than a prohibition, which
keeps the judgment where the evidence is and makes it visible to the reviewer.
It is drafted rather than applied because it binds filing behavior org-wide. That
matches the precedent set for the sibling strategist findings: #1043 →
hold-gate-rubric.md(#1188) and #1052 →agent-lane-throttle.md(#1197), bothmerged as drafts pending a maintainer decision. Nothing in the draft changes agent
runtime behavior, adds a label, or adds a CI gate.
PR pipeline
Checklist
fix:,feat:,docs:,ci:,refactor:, etc.)just checkpassespre-commit run --all-filespasses (all 15 hooks green, including skill front-matter,docs/SKILL.mdindex, internal markdown links, and the generateddocs/skills/index.jsoncatalog)docs/skills/pr-review/references/duplicate-cluster.mdgained a prevention pointer to the draft;docs/factory/agentic-model.mdgained a pointer from the existing duplicate-PR ruleAGENTS.md/docs/SKILL.md/docs/skills/links remain valid (scripts/check-doc-links.shpasses)AI attribution
This change was not authored via GitHub Copilot, so the Copilot-specific
Co-authored-bytrailer is deliberately omitted rather than asserted. Theattribution trailer names the actual model:
— hive: backend=litellm model=deepseek/deepseek-v4.1-flash
🐝 Hive Agent:
contributor| SHA:a8fcea8