Repository navigation
Add a local duplicate-resource review canvas - #5253
Conversation
Add persistent report triage, background-only comparisons, and confirmed GitHub acceptance and consolidation actions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
🚦 Submission status: 👀 Ready for reviewRisk tier: Why this tier
Automated checks
Review
Commands
Updated for |
|
🟡 Contributor Reputation Check: MEDIUM risk
Maintainers: please review this contributor before merging. |
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved source-validation and concurrent-state failures can compromise review decisions and publication recovery.
10 open issues
Block duplicate consolidation writes across reports · New Allow uppercase and underscore agent filenames · New Reject resource tables containing unsupported rows · New Retain recovery records for removed groups · New Reject stale editor updates using revision checks · New Update report state after successful acceptance · New Reject reconciliation after concurrent group edits · New Hide only published groups · New Preserve focus when rendering updated controls · New Preserve edits made while save is pending · New
What changed in this PR
Adds a repository-local maintainer canvas for turning duplicate-resource reports into private triage and explicitly confirmed GitHub follow-up, reusing the Open PR Board server.
Changes:
- Adds persistent kanban decisions, notes, consolidation drafts, and read-only background comparisons.
- Introduces publication previews, confirmation, freshness checks, and reconciliation.
- Documents the workflow and adds focused regression tests.
| File | Description |
|---|---|
eng/duplicate-review-board.test.mjs |
Tests parsing, persistence, background dispatch, publication, and authentication. |
.github/extensions/duplicate-review-board/README.md |
Documents usage, safeguards, recovery, and validation. |
.github/extensions/duplicate-review-board/public/styles.css |
Styles the board, controls, and dialogs. |
.github/extensions/duplicate-review-board/public/index.html |
Defines report controls, the editor, and publication confirmation. |
.github/extensions/duplicate-review-board/public/app.js |
Implements interactive triage and live board updates. |
.github/extensions/duplicate-review-board/lib/state.mjs |
Persists reports, decisions, review tokens, and publication records. |
.github/extensions/duplicate-review-board/lib/review.mjs |
Builds bounded, read-only background comparison prompts. |
.github/extensions/duplicate-review-board/lib/report.mjs |
Parses groups, fingerprints evidence, and updates acceptance checkboxes. |
.github/extensions/duplicate-review-board/lib/publish.mjs |
Manages previews, confirmed writes, and reconciliation. |
.github/extensions/duplicate-review-board/lib/github.mjs |
Provides fixed-repository GitHub CLI operations. |
.github/extensions/duplicate-review-board/extension.mjs |
Connects canvas actions, session state, background agents, and HTTP routes. |
Review effort: Max
Preserve recovery records and cross-report locks, validate complete resource tables, and protect concurrent editors and keyboard focus. Include the requested in-canvas resource viewer. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Regarding #5253 (comment): Acknowledged; this is an automated merge gate rather than a code-change request, and the required maintainer approval remains in place. The review fixes are pushed in 64ba48a, with all 41 focused tests and npm run build passing locally. |
|
Regarding #5253 (comment): Acknowledged; contributor reputation is a maintainer review signal, not a source-code defect, so no code change is appropriate. The linked workflow completed successfully, and the maintainer review requirement remains unchanged. |
There was a problem hiding this comment.
🟡 Changes recommended
Acceptance reconciliation can bypass evidence-freshness checks and allow stale maintainer decisions to be published.
5 open issues
10 resolved since last review
Reject stale editor updates using revision checks Retain recovery records for removed groups Reject resource tables containing unsupported rows Allow uppercase and underscore agent filenames Block duplicate consolidation writes across reports Preserve edits made while save is pending Preserve focus when rendering updated controls Hide only published groups Reject reconciliation after concurrent group edits Update report state after successful acceptance
Review effort: Max
Guard acceptance source adoption against changed group evidence, bound client caching to pending reads, and preserve keyboard focus and report-scoped drafts. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Regarding #5253 (comment): No source change is needed for the automated submission gate, and its maintainer approval requirement remains unchanged. This batch is pushed in 5677372; all 54 focused tests and npm run build passed locally. |
|
Regarding #5253 (comment): This is a historical acknowledgment, not a new code-change request, so no additional source change is needed. The latest batch is 1d313b0; existing maintainer approval and merge requirements remain unchanged. |
|
Regarding #5253 (comment): This is a historical acknowledgment, not a new code-change request, so no additional source change is needed. The latest batch is 1d313b0; existing maintainer approval and merge requirements remain unchanged. |
|
Regarding #5253 (comment): This is a historical acknowledgment, not a new code-change request, so no additional source change is needed. The latest batch is 1d313b0; existing maintainer approval and merge requirements remain unchanged. |
|
Regarding #5253 (comment): This is a historical acknowledgment, not a new code-change request, so no additional source change is needed. The latest batch is 1d313b0; existing maintainer approval and merge requirements remain unchanged. |
|
Regarding #5253 (comment): This is a historical acknowledgment, not a new code-change request, so no additional source change is needed. The latest batch is 1d313b0; existing maintainer approval and merge requirements remain unchanged. |
|
Regarding #5253 (comment): This is a historical acknowledgment, not a new code-change request, so no additional source change is needed. The latest batch is 1d313b0; existing maintainer approval and merge requirements remain unchanged. |
| ...identity, path: { type: "string", minLength: 1, maxLength: 300 }, | ||
| }, ["number", "id", "path"]), operations.resource), | ||
| action("select_report", "Switch to a previously imported local report, without accessing GitHub. Private notes and issue drafts are omitted.", object({ number: identity.number }, ["number"]), async (input) => agentSnapshot(await operations.select(input))), | ||
| action("start_review", "Dispatch a read-only comparison through a background agent only; never review in the foreground.", object({ |
There was a problem hiding this comment.
🔵 Needs a closer look
Unresolved editor-state defects and untested live GitHub publication and background-agent paths require maintainer review.
7 open issues
An agent action arriving beforeBoardStore.load()finishes receivesduplicate_board_error… · New Align linked asset instructions with listed resource boundaries · New If a queued comparison finishes just before the Cancel request arrives,cancel()still sets… · New Changing a card's decision callsrun(select, ...), which disables the focused selector before the… · New Prevent concurrent saves from overwriting request bookkeeping · New [P2] Reconciliation can run with unsaved notes or drafts, and it leaves the form editable during… · New [P2] The editor andBoardStore.update()accept 24,000-character drafts, but the reused server… · New
6 resolved since last review
Reject unsupported nonempty rows instead of ending resource parsing Verify trusted provenance before accepting stable marker matches Reject stale card-move responses using monotonic snapshot ordering Skip updates when dropping a card in its current column Implement complete accessible tab keyboard navigation and associations Preserve saved consolidation drafts when refreshing reports
Review effort: Max
| handler: async (ctx) => { | ||
| try { | ||
| if (!store) throw new Error("The duplicate review board is still starting."); | ||
| return await handler(ctx.input ?? {}, ctx); | ||
| } catch (error) { | ||
| throw new CanvasError("duplicate_board_error", error.message); | ||
| } | ||
| }, |
| return [ | ||
| "You are a background comparison agent for the Duplicate Review Board. Complete this bounded task yourself; do not launch more agents.", | ||
| `Compare the resources in group ${item.number} of duplicate-review report #${number} in ${REPO}.`, | ||
| "Read-only evidence gathering: read the listed resource files and linked assets, compare purpose, instructions, scope, and unique value.", |
| const item = this.item(number, id, state); | ||
| item.queueId = null; | ||
| item.reviewError = "Review cancelled locally. Late results will be rejected."; |
| select.setAttribute("aria-label", `Local decision for group ${item.number}`); | ||
| columns(select, item.column); | ||
| select.disabled = Boolean(item.publication); | ||
| select.addEventListener("change", () => run(select, () => move(item, select.value))); |
| let savingEdit; | ||
|
|
||
| async function save() { | ||
| requireEditorItem(); |
| requireEditorItem(); | ||
| receive(await api("reconcile", opened)); | ||
| message("GitHub result verified; local receipt updated.", false, "detail-message"); |
| <label>Local notes <textarea id="note" rows="3" maxlength="8000"></textarea></label> | ||
| <fieldset id="draft"><legend>Consolidation issue draft</legend> | ||
| <label>Title <input id="draft-title" maxlength="256" required></label> | ||
| <label>Body <textarea id="draft-body" rows="8" maxlength="24000"></textarea></label> |
|
No code change is needed for this automated status notice. The current gate reports all automated checks passing for 1d313b0, with the required maintainer approval still outstanding. |
|
No source change is warranted for this contributor-reputation notice; it is a maintainer review signal, not a code defect. The linked workflow completed successfully, and the required maintainer approval remains in place. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
|
Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required. |
There was a problem hiding this comment.
🔵 Needs a closer look
Native background dispatch and credentialed GitHub publication still need live integration validation and human review.
9 open issues
Every consolidation publish or reconciliation downloads full bodies for the repository's entire… · New After a completed comparison, a failed or cancelled re-review leavesitem.reviewintact but hides… · New [P2] The editor andBoardStore.update()accept 24,000-character drafts, but the reused server… [P2] Reconciliation can run with unsaved notes or drafts, and it leaves the form editable during… Prevent concurrent saves from overwriting request bookkeeping Changing a card's decision callsrun(select, ...), which disables the focused selector before the… If a queued comparison finishes just before the Cancel request arrives,cancel()still sets… Align linked asset instructions with listed resource boundaries An agent action arriving beforeBoardStore.load()finishes receivesduplicate_board_error…
Review effort: Max
| const pages = JSON.parse(await run([ | ||
| "api", `repos/${REPO}/issues?state=all&per_page=100`, "--paginate", "--slurp", | ||
| ])); |
| $("review-result").textContent = item.queueId ? "Queued for a background agent. You can keep triaging." : | ||
| item.reviewError || (item.review ? `${item.review.recommendation}\n\n${item.review.rationale}` : "No comparison yet."); |


Pull Request Checklist
npm startand verified thatREADME.mdis up to date.mainbranch for this pull request.Description
The weekly duplicate-resource reports need an actionable review surface. This adds a repository-local maintainer canvas that imports existing reports and lets maintainers manage decisions privately before making any GitHub changes.
Type of Contribution
Additional Notes
This is a local maintainer extension under
.github/extensions/, following the existing review boards, not a marketplace plugin. It reuses the Open PR Board's authenticated loopback HTTP/SSE server. The detector's scope remains unchanged: agents, instructions, and skills only; plugins and canvases are not added to detection in this PR.Validation:
node --experimental-vm-modules --test eng\duplicate-review-board.test.mjs- passed, 19 tests covering parsing, persistence, background dispatch, publication safeguards, reconciliation, and HTTP authentication.npm start- passed afternpm cirestored missing dependencies; generated README and marketplace outputs remain unchanged. Existing external-plugin metadata warnings were reported.bash eng/fix-line-endings.sh- passed.git diff --cached --check- passed before committing.GitHub issue-body updates do not offer transactional compare-and-swap, so concurrent manual report editing should be avoided during publication. Runtimes without background-task support fail explicitly instead of falling back to foreground requests.
By submitting this pull request, I confirm that my contribution abides by the Code of Conduct and will be licensed under the MIT License.