feat(autopilot): maintainer canvas, panel-mode, and comment writer - #3024
Daniel Meppiel (danielmeppiel) merged 5 commits into
Conversation
Add the CODEOWNER Autopilot maintainer canvas, route GitHub comments through autopilot-comment, add review panel-mode (full/lean/delta), and make merge-worker plan before fold or CI. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
Critical lockfile, dependency, and roster-path issues remain unresolved, along with additional comment and canvas correctness findings.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
Adds a maintainer canvas, centralized comment writer, configurable review panels, bot-triage updates, and plan-first merge-worker orchestration.
Changes:
- Adds isolated canvas workflows and occupancy tracking.
- Routes autopilot comments through
autopilot-comment. - Adds panel modes, shared briefs, and merge planning.
- Updates skills, tests, documentation, and deployed copies.
File summaries
| File | Reviewed change / finding |
|---|---|
tests/unit/test_workflow_actor_contract.py |
Validates comment-writer contracts. |
tests/unit/test_triage_fetch_queue.py |
Covers bot-authored PR eligibility. |
tests/unit/test_triage_advisory.py |
Covers debug-card behavior. |
packages/autopilot/README.md |
Nit, 1 vote: sole-writer claim omits a direct gh pr comment path. |
packages/autopilot/autopilot-pr-triage-worker/apm.yml |
Adds autopilot-comment dependency; Critical, 1 vote: lockfile entry is missing. |
packages/autopilot/autopilot-pr-triage-worker/.apm/skills/autopilot-pr-triage-worker/SKILL.md |
Routes PR comments through the writer. |
packages/autopilot/autopilot-pr-triage-worker/.apm/skills/autopilot-pr-triage-worker/assets/pr-triage-template.md |
Updates triage rendering. |
packages/autopilot/autopilot-pr-triage-scheduler/.apm/skills/autopilot-pr-triage-scheduler/SKILL.md |
Updates bot and comment behavior. |
packages/autopilot/autopilot-pr-triage-scheduler/.apm/skills/autopilot-pr-triage-scheduler/scripts/fetch_queue.py |
Preserves eligible PR filtering. |
packages/autopilot/autopilot-pr-triage-scheduler/.apm/skills/autopilot-pr-triage-scheduler/assets/fan-out-pool.md |
Updates worker kickoff requirements. |
packages/autopilot/autopilot-pr-review-worker/evals/fixtures/03-panel-mode-walkthrough.md |
Adds a panel-mode fixture. |
packages/autopilot/autopilot-pr-review-worker/assets/shared-brief.example.json |
Adds a shared brief example. |
packages/autopilot/autopilot-pr-review-worker/assets/recommendation-template.md |
Adds panel-mode rendering. |
packages/autopilot/autopilot-pr-review-worker/assets/panelist-return-schema.json |
Updates panelist contract. |
packages/autopilot/autopilot-pr-review-worker/assets/panel-mode.md |
Defines panel modes and rosters. |
packages/autopilot/autopilot-pr-review-worker/assets/ceo-return-schema.json |
Adds panel metadata. |
packages/autopilot/autopilot-pr-review-worker/apm.yml |
Adds comment-writer dependency. |
packages/autopilot/autopilot-pr-review-scheduler/.apm/skills/autopilot-pr-review-scheduler/SKILL.md |
Requests full first-pass panels. |
packages/autopilot/autopilot-pr-review-scheduler/.apm/skills/autopilot-pr-review-scheduler/assets/fan-out-pool.md |
Updates review kickoff. |
packages/autopilot/autopilot-pr-merge-worker/SKILL.md |
Adds plan-first and CI rules. |
packages/autopilot/autopilot-pr-merge-worker/assets/worker-prompt.md |
Defines planning and panel iteration. |
packages/autopilot/autopilot-pr-merge-worker/assets/completion-schema.json |
Adds panel metadata. |
packages/autopilot/autopilot-pr-merge-worker/assets/ci-recovery-checklist.md |
Documents CI recovery. |
packages/autopilot/autopilot-pr-merge-worker/apm.yml |
Adds comment-writer dependency. |
packages/autopilot/autopilot-maintainer-canvas/tests/server.test.mjs |
Tests canvas server behavior. |
packages/autopilot/autopilot-maintainer-canvas/tests/logic.test.mjs |
Tests canvas logic and spawn contracts. |
packages/autopilot/autopilot-maintainer-canvas/README.md |
Documents canvas installation. |
packages/autopilot/autopilot-maintainer-canvas/apm.yml |
Defines canvas metadata. |
packages/autopilot/autopilot-maintainer-canvas/.gitignore |
Ignores generated files. |
packages/autopilot/autopilot-maintainer-canvas/.github/copilot-instructions.md |
Adds package instructions. |
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/server-handler.mjs |
Moderate, 1 vote: normalize null bodies, drain oversized requests, and add tests to CI. |
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/extension.mjs |
Moderate, 1 vote each: include comment-only receipts and paginate issue listings. |
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/copilot-sessions.mjs |
Critical, 2 votes: preserve occupancy when SQLite reads fail. |
packages/autopilot/autopilot-issue-triage-worker/SKILL.md |
Adds debug output and comment routing. |
packages/autopilot/autopilot-issue-triage-worker/assets/triage-template.md |
Updates triage output. |
packages/autopilot/autopilot-issue-triage-worker/apm.yml |
Critical, 1 vote: comment dependency is absent from the lockfile. |
packages/autopilot/autopilot-issue-triage-scheduler/.apm/skills/autopilot-issue-triage-scheduler/SKILL.md |
Updates worker kickoff. |
packages/autopilot/autopilot-issue-triage-scheduler/.apm/skills/autopilot-issue-triage-scheduler/scripts/fetch_queue.py |
Preserves issue filtering. |
packages/autopilot/autopilot-issue-triage-scheduler/.apm/skills/autopilot-issue-triage-scheduler/assets/fan-out-pool.md |
Adds comment-writer requirements. |
packages/autopilot/autopilot-comment/SKILL.md |
Adds centralized comment assembly and writing. |
packages/autopilot/autopilot-comment/apm.yml |
Defines comment-writer metadata. |
docs/src/content/docs/integrations/canvas.md |
Documents the maintainer canvas. |
CHANGELOG.md |
Nit, 3 votes: entries need PR-number suffixes and one line per PR. |
apm.lock.yaml |
Critical, 2 votes: missing review-worker files and autopilot-comment dependency must be regenerated. |
.github/workflows/triage-panel.md |
Moderate, 1 vote: direct safe-outputs.add-comment bypasses the sole writer. |
.agents/skills/autopilot-pr-triage-worker/SKILL.md |
Deploys PR-triage changes. |
.agents/skills/autopilot-pr-triage-worker/assets/pr-triage-template.md |
Deploys the updated template. |
.agents/skills/autopilot-pr-triage-scheduler/SKILL.md |
Deploys scheduler changes. |
.agents/skills/autopilot-pr-triage-scheduler/scripts/fetch_queue.py |
Deploys queue filtering. |
.agents/skills/autopilot-pr-triage-scheduler/assets/fan-out-pool.md |
Deploys fan-out rules. |
.agents/skills/autopilot-pr-review-worker/SKILL.md |
Moderate, 1 vote: workflow still writes directly; Critical, 1 vote: roster paths resolve incorrectly. |
.agents/skills/autopilot-pr-review-worker/evals/fixtures/03-panel-mode-walkthrough.md |
Deploys the panel fixture. |
.agents/skills/autopilot-pr-review-worker/assets/shared-brief.example.json |
Deploys the shared brief example. |
.agents/skills/autopilot-pr-review-worker/assets/recommendation-template.md |
Deploys recommendation changes. |
.agents/skills/autopilot-pr-review-worker/assets/panelist-return-schema.json |
Deploys schema changes. |
.agents/skills/autopilot-pr-review-worker/assets/panel-mode.md |
Deploys the panel-mode contract. |
.agents/skills/autopilot-pr-review-worker/assets/ceo-return-schema.json |
Deploys CEO schema changes. |
.agents/skills/autopilot-pr-review-worker/apm.yml |
Deploys dependency metadata. |
.agents/skills/autopilot-pr-review-scheduler/SKILL.md |
Deploys review scheduler changes. |
.agents/skills/autopilot-pr-review-scheduler/assets/fan-out-pool.md |
Deploys review fan-out rules. |
.agents/skills/autopilot-pr-merge-worker/SKILL.md |
Deploys merge-worker rules. |
.agents/skills/autopilot-pr-merge-worker/assets/worker-prompt.md |
Deploys merge planning. |
.agents/skills/autopilot-pr-merge-worker/assets/completion-schema.json |
Deploys completion schema. |
.agents/skills/autopilot-pr-merge-worker/assets/ci-recovery-checklist.md |
Deploys CI checklist. |
.agents/skills/autopilot-pr-merge-worker/apm.yml |
Deploys dependency metadata. |
.agents/skills/autopilot-issue-triage-worker/SKILL.md |
Deploys issue-worker changes. |
.agents/skills/autopilot-issue-triage-worker/assets/triage-template.md |
Deploys issue template changes. |
.agents/skills/autopilot-issue-triage-worker/apm.yml |
Deploys issue-worker metadata. |
.agents/skills/autopilot-issue-triage-scheduler/SKILL.md |
Deploys issue scheduler changes. |
.agents/skills/autopilot-issue-triage-scheduler/scripts/fetch_queue.py |
Deploys issue queue changes. |
.agents/skills/autopilot-issue-triage-scheduler/assets/fan-out-pool.md |
Deploys issue fan-out rules. |
.agents/skills/autopilot-comment/SKILL.md |
Deploys the comment writer. |
.agents/skills/autopilot-comment/apm.yml |
Deploys comment-writer metadata. |
Review details
Suppressed comments (8)
.github/workflows/triage-panel.md:255
- This step still instructs the workflow to emit the comment directly through
safe-outputs.add-comment, then separately says to post throughautopilot-comment. That bypasses the new assembler/footer and permits two competing write paths; make theautopilot-commentactivation the sole comment write instead of calling the safe output here.
no-op. Otherwise emit exactly one public comment through
`safe-outputs.add-comment`. Default `debug: off`: keep the filled
receipt line (`target` plus `watermark`) and the Suggested issue
comment body only (unwrap the markdown fence). Do not post
packages/autopilot/README.md:26
- This broad sole-writer claim is not true for all autopilot comments:
autopilot-issue-delivery-worker/.apm/skills/autopilot-issue-delivery-worker/references/strategic-alignment-gate.md:135still executesgh pr commentdirectly. That path bypasses the new footer and violates the stated ownership contract; route it throughautopilot-commentor narrow this claim.
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/extension.mjs:54 - Because comment-only advice has no
triage/recommendedlabel, this filter never fetches its comments, so the canvas can show an item as Not triaged even thoughapplyTriageAdvicesupports a comment-only receipt. Include all non-accepted items in this fetch (or otherwise detect comment-only receipts).
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/extension.mjs:87 - The canvas hard-caps the issue query at 100, but the repository currently has 154 open issues, so at least 54 never appear in the purported live GitHub queue. Paginate the issue/PR listings (or provide continuation) before shipping the maintainer surface.
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/server-handler.mjs:73 JSON.parse(raw)can returnnull;/labeland/spawnthen dereferencebody.isPayloadTooLargeoutside theirtryblocks. A valid JSONnullrequest therefore hangs or resets instead of returning the existing 400/409 error response. Normalize parsed bodies to a non-array object (or reject non-objects) here.
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/server-handler.mjs:5- These new canvas tests are not included in the repository's Node CI step:
.github/workflows/ci.yml:125-129enumerates only the contributor-dashboard tests. The extension therefore has no automated merge gate despite adding executable server/SQLite behavior; includepackages/autopilot/autopilot-maintainer-canvas/tests/*.test.mjsin the existing Node test commands.
packages/autopilot/autopilot-maintainer-canvas/.apm/extensions/autopilot-maintainer/server-handler.mjs:49 - When the request exceeds the limit, this path removes every request listener and rejects without draining the remaining body. On a keep-alive connection, unread bytes can leave the local server stalled or poison the connection for the next request. Drain the request before rejecting, as the existing dashboard handler does.
packages/autopilot/autopilot-pr-review-worker/SKILL.md:59 - The Agentic Workflow still tells this worker to emit its PR comment via
safe-outputs.add-comment(.github/workflows/pr-review-panel.md:230-236). With this new contract, that caller bypassesautopilot-commentand its required footer. Update the workflow caller so the worker activatesautopilot-commentrather than writing the safe output itself.
- Files reviewed: 76/76 changed files
- Comments generated: 5
- Review effort level: Lite
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Keep apm.lock.yaml content hashes aligned with deployed skill bytes after the maintainer-canvas skill edits, and recompile triage-panel so body_hash matches source. Retain existing gh-aw 0.87.8 action pins alongside 0.88.2. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Record autopilot-comment and new review-worker assets in apm.lock.yaml. Keep occupancy when Copilot data.db is unreadable. Point the review roster at .apm/agents. Number the Unreleased changelog lines for #3024. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Thank you for contributing this pull request. APM starts with an CODEOWNERS owners are Daniel Meppiel (@danielmeppiel) and Sergio Sisternes (@sergio-sisternes-epam). #3003 is a rebase note only, not a linked issue for This is advisory classification only. It is not merge approval, Generated by autopilot-pr-triage-worker. This comment is AI-generated and may contain errors. |
Stop skipping Bot authors in issue triage so Copilot/Dependabot/Actions issues enter the same queue as human work. Recompile triage-panel with gh-aw v0.87.8 so CI matches the repo pin. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
feat(autopilot): maintainer canvas, panel-mode, and comment writer
TL;DR
This adds a CODEOWNER Autopilot maintainer canvas, a sole GitHub comment writer (
autopilot-comment), cheaperpanel-modefor PR review, and plan-first merge-worker. The canvas never assigns, requests reviewers, merges, or runs autopilot skills in the parent session.Note
Rebased onto
mainafter #3003 merged (98c0ed6a). Unique commit is202d67662.Problem (WHY)
panel-reviewand spawn isolated schedulers/workers without running skills in the CODEOWNER session.gh issue/pr comment, so comments shipped without the AI footer (for example Docs: update stale README links #3017).autopilot-pr-review-workerspawned the full roster (including inactive stubs) on every merge-worker iteration, including terminal no-signal reruns.Why these matter: autopilot skills are supposed to be summoned by name and stay advisory, with a single comment writer. Agent Skills: "Add what the agent lacks, omit what it knows". PROSE: "Grounding outputs in deterministic tool execution transforms probabilistic generation into verifiable action.".
Approach (WHAT)
packages/autopilot/autopilot-maintainer-canvas-- live GitHub lanes, human labels vs advisory labels, isolatedcreate_sessionspawns, occupancy from Copilotdata.db.autopilot-comment-- one post/patch, AI footer, no labels/assign/merge. Triage workers and schedulers passcomment_via: autopilot-comment.panel-mode: full / lean / delta(unknown ->lean). Fast-path default include; orchestrator may add personas withadhoc_reason. Shared brief once. No inactive stubs.agent-mergewhen present). Canvas spawn useskickoff_mode: plan. Never merge. Never request the implementer as reviewer.Implementation (HOW)
packages/autopilot/autopilot-maintainer-canvas/-- Copilot canvas extension (ui.mjs,logic.mjs,server-handler.mjs). Parent only labels andcreate_session. Open usesghapp://sessions/<id>. No Archive control.packages/autopilot/autopilot-comment/-- sole comment assembler/writer;source_skillin the footer.packages/autopilot/autopilot-pr-review-worker/-- roster, shared brief, schemas,panel-mode.md.packages/autopilot/autopilot-pr-merge-worker/assets/worker-prompt.md-- Step 0.P plan-first; onefullpanel per run unlesspanel_escalation.comment_via; stop if the comment skill is missing; do not callgh issue/pr comment..agents/skills/-- deployed copies;apm.lock.yamlhashes refreshed for changed files.docs/src/content/docs/integrations/canvas.md-- maintainer canvas pointer.packages/autopilot/README.md-- map updated (autopilot-comment, panel-mode, plan-first merge). RootREADME.mduntouched.Diagrams
Legend: canvas clicks stay in the parent; schedulers and workers run isolated; only
autopilot-commentwrites GitHub comments.sequenceDiagram participant M as Maintainer participant C as autopilot-maintainer canvas participant P as CODEOWNER parent session participant S as Isolated scheduler participant W as Isolated worker participant AC as autopilot-comment participant GH as GitHub M->>C: Accept or spawn C->>P: spawn-isolated-session card Note over P: do_not_run_here P->>S: create_session coordinate_with_creator false S->>W: FANOUT 2 worker sessions rect rgb(255, 247, 200) Note over W,GH: NEW comments only via autopilot-comment W->>AC: load in same session AC->>GH: one comment plus footer end Note over P,S: never assign, request reviewers, or mergeLegend: merge-worker panel cost -- one
full(orleanif tiny), thendelta; terminal noop when head and watermark match.flowchart LR subgraph mergeWorker [autopilot-pr-merge-worker] P0[Plan vs original scope] I1[Iteration 1 panel-mode full or lean] D[Iteration 2 plus delta] T[Terminal delta or noop] CI[agent-merge or gh pr checks watch] end P0 --> I1 --> D --> T D --> CI T --> CI classDef new stroke-dasharray: 5 5 class P0,I1,D,T newTrade-offs
--onto origin/mainso this PR is one commit (202d67662), not a replay of the squash-merged stack..agentscopy, not yet a lock dependency. Workers branched from default still miss the file until this lands; kickoff cards carrycomment_viaas a standing override.data.db. Chose live session names over GitHub issue state so Refresh does notsession.send.lean. Fail cheap, not fail heavy.Out of scope
This PR does not edit the root
README.md, does not resurrect deleted alias packages, and does not let the parent session run autopilot skills. Merge-worker still never callsgh pr merge.Benefits
panel-reviewand spawn FANOUT=2 isolated workers without running skills in this session.Generated by <source_skill>. This comment is AI-generated and may contain errors.Validation
Lint (CI-mirror subset that applies):
Canvas and unit tests
Scenario Evidence
create_sessionand never merge/assignpackages/autopilot/autopilot-maintainer-canvas/tests/logic.test.mjsspawn contract;tests/server.test.mjshas no archive endpointpanel-mode: fulllogic.test.mjsstarts the merge worker in plan mode; asks the review worker for panel-mode fullautopilot-comment; schedulerwrite: off, workerswrite: onlogic.test.mjsroutes triage comments through autopilot-comment;tests/unit/test_workflow_actor_contract.pytests/unit/test_triage_advisory.py::test_installed_skill_files_and_recorded_hashes_match_sourcesHow to test
Issue triage schedulerorPR triage schedulerstarts; this parent does not run the skill. Occupancy shows Working.Generated by autopilot-*-triage-worker. This comment is AI-generated and may contain errors.--add-reviewerof the implementer.mainand the diff is the canvas/comment/panel-mode commit only (not a replay of feat(autopilot): origin-aware skills with CODEOWNERS-safe review #3003).Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com