Skip to content

Add a local duplicate-resource review canvas - #5253

Merged
aaronpowell merged 5 commits into
mainfrom
aaronpowell-duplicate-review-canvas
Oct 26, 2026
Merged

aaronpowell merged 5 commits into
mainfrom
aaronpowell-duplicate-review-canvas

Conversation

@aaronpowell

Copy link
Copy Markdown
Contributor

Pull Request Checklist

  • I have read and followed the CONTRIBUTING.md guidelines.
  • I have read and followed the Guidance for submissions involving paid services.
  • My contribution adds a new instruction, prompt, agent, skill, workflow, or canvas extension file in the correct directory.
  • The file follows the required naming convention.
  • The content is clearly structured and follows the example format.
  • I have tested my instructions, prompt, agent, skill, workflow, or canvas extension with GitHub Copilot.
  • I have run npm start and verified that README.md is up to date.
  • I am targeting the main branch 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.

  • Persist local triage, notes, and consolidation drafts across reloads, with searchable kanban cards and keyboard-operable decision controls.
  • Dispatch read-only comparisons exclusively to background agents. Queue tokens reject stale results, and AI recommendations never overwrite maintainer decisions.
  • Preview and explicitly confirm remote actions: mark intentionally separate groups as reviewed, or create consolidation tracking issues without modifying resource files.
  • Protect publication with expiring single-use previews, report freshness checks, persisted write intents, and read-only reconciliation after uncertain responses.

Type of Contribution

  • New instruction file.
  • New prompt file.
  • New agent file.
  • New plugin.
  • New skill file.
  • New agentic workflow.
  • New canvas extension.
  • Update to existing instruction, prompt, agent, plugin, skill, workflow, or canvas extension.
  • Other (please specify):

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 after npm ci restored 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.
  • Read-only browser smoke test against report 🔍 Duplicate Resource Review #5108 - passed for import, local decisions, saving, and action previews. The canvas also loaded in this Copilot session. Live background comparisons and GitHub publication were not exercised; automated tests use fake GitHub clients and SDK modules.

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.

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>
@aaronpowell
aaronpowell requested a review from a team as a code owner October 22, 2026 00:14
Copilot AI max review requested due to automatic review settings October 22, 2026 00:14
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

🚦 Submission status: 👀 Ready for review

Risk tier: merge-risk:high — Privileged execution, automation, or review-policy change
Required to merge: passing submission-gate checks plus 1 approval from reviewers with write access, including a maintainer with admin or maintain permission.

Why this tier
  • .github/extensions/duplicate-review-board/README.md is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/extension.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/lib/github.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/lib/publish.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/lib/report.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/lib/review.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/lib/state.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/public/app.js is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/public/index.html is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • .github/extensions/duplicate-review-board/public/styles.css is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • eng/duplicate-review-board-access.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • eng/duplicate-review-board-background.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • eng/duplicate-review-board-parser.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • eng/duplicate-review-board-provenance.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • eng/duplicate-review-board-state.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • …and 2 more

Automated checks

Check Status Details
Line endings ✅ Passed Passed · logs
Spelling ✅ Passed Passed · logs
Contributor reputation ✅ Passed Passed · logs
Duplicate resource scan ✅ Passed Passed · logs
PR quality signal ✅ Passed Passed · logs

Review

  • Approvals: 0/1
  • Assigned reviewer: not assigned yet — comment /request-review to ask for one
  • Review target date: not set
  • Still needed: 1 more approval(s); an approval from a maintainer with admin or maintain permission
  • The core-maintainers pool is not staffed yet; an approver with admin or maintain permission is required instead.

Commands

Command Who What it does
/rerun-checks PR author, maintainers Re-runs failed or incomplete checks and re-evaluates this gate
/request-review PR author, maintainers Asks the review rotation to assign a reviewer (adds needs-reviewer)

Updated for 1d313b0 · gate run · This comment is maintained automatically — see submission gate docs.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

🟡 Contributor Reputation Check: MEDIUM risk

Check Risk
Profile MEDIUM
Credential audit NONE

Maintainers: please review this contributor before merging.
See the workflow run for full details.
Automated check powered by AGT.

@github-actions github-actions Bot added needs-review:MEDIUM Contributor reputation check flagged MEDIUM risk ready-for-review Submission passed intake validation and is ready for maintainer review and removed awaiting-automation labels Oct 22, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Unresolved source-validation and concurrent-state failures can compromise review decisions and publication recovery.

10 open issues
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

Comment thread .github/extensions/duplicate-review-board/lib/publish.mjs
Comment thread .github/extensions/duplicate-review-board/lib/report.mjs Outdated
Comment thread .github/extensions/duplicate-review-board/lib/report.mjs Outdated
Comment thread .github/extensions/duplicate-review-board/lib/state.mjs
Comment thread .github/extensions/duplicate-review-board/lib/state.mjs
Comment thread .github/extensions/duplicate-review-board/lib/publish.mjs
Comment thread .github/extensions/duplicate-review-board/lib/publish.mjs Outdated
Comment thread .github/extensions/duplicate-review-board/public/app.js Outdated
Comment thread .github/extensions/duplicate-review-board/public/app.js
Comment thread .github/extensions/duplicate-review-board/public/app.js
@github-actions github-actions Bot added awaiting-automation ready-for-review Submission passed intake validation and is ready for maintainer review and removed ready-for-review Submission passed intake validation and is ready for maintainer review awaiting-automation labels Oct 22, 2026
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>
Copilot AI max review requested due to automatic review settings October 23, 2026 04:34
@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread .github/extensions/duplicate-review-board/lib/publish.mjs
Comment thread .github/extensions/duplicate-review-board/public/app.js
Comment thread .github/extensions/duplicate-review-board/public/app.js Outdated
Comment thread .github/extensions/duplicate-review-board/public/app.js Outdated
Comment thread .github/extensions/duplicate-review-board/public/app.js Outdated
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>
Copilot AI max review requested due to automatic review settings October 25, 2026 23:26
@github-actions github-actions Bot added awaiting-automation and removed ready-for-review Submission passed intake validation and is ready for maintainer review labels Oct 25, 2026
@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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({

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +74 to +81
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.",
Comment on lines +193 to +195
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();
Comment on lines +530 to +532
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>
Copilot AI max review requested due to automatic review settings October 26, 2026 01:15
@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

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.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell

Copy link
Copy Markdown
Contributor Author

Regarding #5253 (comment): Agreed; this is a historical acknowledgment rather than new source feedback, so no code change is needed. Maintainer approval remains required.

@aaronpowell
aaronpowell merged commit d1769fd into main Oct 26, 2026
31 of 33 checks passed
@aaronpowell
aaronpowell deleted the aaronpowell-duplicate-review-canvas branch October 26, 2026 01:28

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Comment on lines +54 to +56
const pages = JSON.parse(await run([
"api", `repos/${REPO}/issues?state=all&per_page=100`, "--paginate", "--slurp",
]));
Comment on lines +256 to +257
$("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.");

This branch was successfully deployed

1 active deployment
github-pages — 1d313b01 Deployed Oct 26, 2026 by aaronpowell via deploy #1110
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk:high needs-review:MEDIUM Contributor reputation check flagged MEDIUM risk ready-for-review Submission passed intake validation and is ready for maintainer review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants