Skip to content

Add a local duplicate-resource review canvas - #5253

Open
aaronpowell wants to merge 2 commits into
mainfrom
aaronpowell-duplicate-review-canvas
Open

aaronpowell wants to merge 2 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 <[email protected]>
@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-parser.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • eng/duplicate-review-board-ui.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)
  • eng/duplicate-review-board.test.mjs is a high-risk path (automation, scripts, MCP config, hooks, or review policy)

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 64ba48a · 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 <[email protected]>
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 on lines +6 to +8
const groups = parseReport(body);
report.body = body;
report.sourceHash = digest(body);
Comment on lines +16 to +20
if (!contents.has(key)) {
const request = api("resource", { number: board.selected, id: item.id, path: file });
request.catch(() => contents.delete(key));
contents.set(key, request);
}
tab.setAttribute("role", "tab");
tab.setAttribute("aria-selected", String(resource.path === viewing));
tab.title = resource.path;
tab.addEventListener("click", () => { viewing = resource.path; renderViewer(item); });
Comment on lines +354 to +357
const snapshot = await api("update", { ...edit, expectedRevision: edit.revision, ...values });
const updated = snapshot.items.find((item) => item.id === edit.id);
if (updated) savingEdit.responseRevision = updated.revision;
receive(snapshot, { ...edit, values });
if (item) renderViewer(item);
});
$("column").addEventListener("change", () => { $("draft").hidden = $("column").value !== "consolidate"; });
$("editor").addEventListener("input", (event) => { if (event.target.id !== "guidance") dirty = true; });

This branch was successfully deployed

1 active deployment
github-pages — 64ba48a3 Deployed Oct 23, 2026 by aaronpowell via deploy #1065
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.

2 participants