Skip to content

I3212 — Two open pull requests that realise the same issue are reported as duplicates, with the survivor named

Use the pull request to issue edge the work graph already derives to report open pull requests that realise the same issue, name the survivor by evidence (green head, landed member of a top, newer head) and leave the closing to the landing seat; never close automatically on title or path similarity.

BLOCKED wave 1 · p2 · implementation profile · parallel safe

Part of finished-work-reaches-a-verified-release — Finished work reaches a verified release at the pace it is finished.

Blocked. This issue cannot start until I3204 is done. The status is derived from that, not declared.

Objective

Use the pull request to issue edge the work graph already derives to report open pull requests that realise the same issue, name the survivor by evidence (green head, landed member of a top, newer head) and leave the closing to the landing seat; never close automatically on title or path similarity.

Why

The 2026-10-12 pack proposed that duplicate and superseded pull requests be detected from the work graph and closed knowingly with a pointer to the survivor (c242#5). The drain closes a pull request only when a declared Supersedes marker's successor lands. It extends milestone work-graph-github. Proposed in ADR 0197 (The backlog is bounded by a declared bound that every session reads at start, and the bound reports rather than refuses) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c242#5, chatgpt-majordomus:c051#2.

Current state

I1405 (DONE) derives the pull request to issue edge; classify.rs holds and closes on 'Supersedes #N' markers; no reading reports two open pull requests on one issue.

Desired state

integration.queue carries a duplicates section: the issue, the pull requests, the proposed survivor and the evidence for it; integration.explain repeats it per pull request; nothing is closed by it.

Scope

  • apps/majordomus-cli/src/integration/classify.rs
  • apps/majordomus-cli/src/integration/model.rs
  • docs/INTEGRATION.md
  • apps/majordomus-cli/src/capability/builtin/brief.rs
  • apps/majordomus-cli/src/commands/prs.rs

Out of scope

  • Closing pull requests
  • Similarity by title or overlapping paths

Dependencies

Acceptance criteria

  • Two open pull requests naming the same issue are reported with the survivor and why
  • A pull request naming no issue is never reported as a duplicate
  • The drain's closures are unchanged
  • The brief's integration line (prs brief) names the number of duplicate candidates and their issues when there are any, from the same reading as integration.queue

Validation

  • cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib integration::classify
  • majordomus plan validate

Evidence required

  • test_duplicates_by_issue

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I3212.yaml. Read it back with majordomus plan show I3212.

Searches the titles and descriptions of every page this site publishes.