feat(skills): add apm-triage-panel for issue triage#915
Conversation
New skill bundle that mirrors apm-review-panel's single-loop, single-comment orchestration shape but is scoped to single-issue triage. Three mandatory persona lenses (DevX UX, Supply Chain Security, APM CEO) plus a conditional OSS Growth Hacker for first-time / low-interaction contributors. Output: one synthesized comment containing a triage decision (accept / needs-design / decline-with-reason / duplicate-of / defer-later / auto-handle), the proposed label set drawn from the new theme/area/type/status/priority taxonomy, a milestone assignment, a suggested next action, and a fenced ```json triage-decision``` tail so an orchestrator can apply labels and post the reply without parsing prose. No new persona was added: the existing devx-ux-expert, supply-chain-security-expert, apm-ceo, and oss-growth-hacker agents plus the README + new label taxonomy + CEO arbiter are sufficient grounding (per the apm-review-panel design verdict). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
132e68a to
5a0e34d
Compare
There was a problem hiding this comment.
Pull request overview
Adds a new apm-triage-panel skill bundle to support consistent, single-comment issue triage (decision + labels + milestone + next action) using a structured JSON tail for downstream automation, following the same orchestration pattern as apm-review-panel.
Changes:
- Added new
apm-triage-panelskill bundle under.apm/skills/and regenerated mirror under.github/skills/. - Added
assets/triage-template.mdwith a requiredtriage-decisionJSON block contract. - Updated
CHANGELOG.mdandapm.lock.yamlto reflect the new local skill deployment.
Show a summary per file
| File | Description |
|---|---|
apm.lock.yaml |
Registers .github/skills/apm-triage-panel in local_deployed_files. |
CHANGELOG.md |
Adds an Unreleased entry documenting the new triage skill. |
.apm/skills/apm-triage-panel/SKILL.md |
Defines the triage panel orchestration, routing, rubric, and output contract. |
.apm/skills/apm-triage-panel/assets/triage-template.md |
Provides the single-comment output skeleton + JSON tail contract. |
.github/skills/apm-triage-panel/SKILL.md |
Regenerated Copilot-target mirror of the triage skill. |
.github/skills/apm-triage-panel/assets/triage-template.md |
Regenerated mirror of the triage template. |
Copilot's findings
Comments suppressed due to low confidence (2)
.apm/skills/apm-triage-panel/SKILL.md:100
- The rubric outcomes here use
decline-with-reason,duplicate-of #N, andauto-handle, but the template's "Triage decision" placeholder uses colon forms likedecline-with-reason: <text>,duplicate-of: #N,auto-handle: <action>. Since the skill says the CEO picks exactly one outcome from the rubric, please standardize the decision string format across SKILL.md + triage-template.md (and rely on the JSON tail for details).
- `decline-with-reason` -- out of scope for APM as positioned by the
README spine. Suggest an alternative tool, a workaround, or the
upstream project. Always courteous, always concrete.
- `duplicate-of #N` -- propose the canonical issue. The orchestrator
must verify the link resolves before posting.
.github/skills/apm-triage-panel/SKILL.md:100
- The rubric outcomes here use
decline-with-reason,duplicate-of #N, andauto-handle, but the template's "Triage decision" placeholder uses colon forms likedecline-with-reason: <text>,duplicate-of: #N,auto-handle: <action>. Since the skill says the CEO picks exactly one outcome from the rubric, please standardize the decision string format across SKILL.md + triage-template.md (and rely on the JSON tail for details).
- `decline-with-reason` -- out of scope for APM as positioned by the
README spine. Suggest an alternative tool, a workaround, or the
upstream project. Always courteous, always concrete.
- `duplicate-of #N` -- propose the canonical issue. The orchestrator
must verify the link resolves before posting.
- Files reviewed: 6/6 changed files
- Comments generated: 5
| - `policy.manifest.require_explicit_includes` policy field enforces explicit `includes` lists (rejects `auto` + undeclared). (#887) | ||
| - `includes-consent` advisory appears in `apm audit` CLI/JSON output when local content is deployed without an explicit `includes:` declaration (#887) | ||
| - `apm-primitives-architect` agent: reusable persona for designing and critiquing `.apm/` skill bundles. (#882) | ||
| - `apm-triage-panel` skill: three-persona panel (DevX UX, Supply Chain Security, APM CEO; conditional OSS Growth Hacker) for issue triage producing single labelled-decision comment with structured JSON tail. Mirrors `apm-review-panel` orchestration model. (#915) |
There was a problem hiding this comment.
Changelog entry still uses the placeholder "(#TBD)". Per the project's changelog format, each Unreleased bullet should end with the actual PR number before merge (e.g., "(#915)").
| The panel is fixed at **3 mandatory specialist lenses + 1 conditional | ||
| growth lens + 1 arbiter lens = up to 5 persona sections in one triage |
There was a problem hiding this comment.
The intro claims "3 mandatory specialist lenses ... + 1 arbiter lens = up to 5 persona sections", but the roster/template actually have 2 mandatory specialists (DevX UX, Supply Chain Security) + 1 conditional (OSS Growth Hacker) + 1 arbiter (APM CEO) = up to 4 sections. Please update the count so the roster invariant is accurate.
This issue also appears on line 96 of the same file.
| The panel is fixed at **3 mandatory specialist lenses + 1 conditional | |
| growth lens + 1 arbiter lens = up to 5 persona sections in one triage | |
| The panel is fixed at **2 mandatory specialist lenses + 1 conditional | |
| growth lens + 1 arbiter lens = up to 4 persona sections in one triage |
| The panel is fixed at **3 mandatory specialist lenses + 1 conditional | ||
| growth lens + 1 arbiter lens = up to 5 persona sections in one triage |
There was a problem hiding this comment.
The intro claims "3 mandatory specialist lenses ... + 1 arbiter lens = up to 5 persona sections", but the roster/template actually have 2 mandatory specialists (DevX UX, Supply Chain Security) + 1 conditional (OSS Growth Hacker) + 1 arbiter (APM CEO) = up to 4 sections. Please update the count so the roster invariant is accurate.
This issue also appears on line 96 of the same file.
| The panel is fixed at **3 mandatory specialist lenses + 1 conditional | |
| growth lens + 1 arbiter lens = up to 5 persona sections in one triage | |
| The panel is fixed at **2 mandatory specialist lenses + 1 conditional | |
| growth lens + 1 arbiter lens = up to 4 persona sections in one triage |
|
|
||
| ## Triage decision | ||
|
|
||
| <one of: `accept` | `needs-design` | `decline-with-reason: <text>` | `duplicate-of: #N` | `defer-later` | `auto-handle: <action>`> |
There was a problem hiding this comment.
The "Triage decision" placeholder uses colon formats like decline-with-reason: <text> / duplicate-of: #N / auto-handle: <action>, but SKILL.md's rubric lists the outcomes without colons (and with duplicate-of #N). Please pick one canonical decision string format and use it consistently across the template + rubric to avoid confusing panel output and any downstream automation.
| <one of: `accept` | `needs-design` | `decline-with-reason: <text>` | `duplicate-of: #N` | `defer-later` | `auto-handle: <action>`> | |
| <one of: `accept` | `needs-design` | `decline-with-reason <text>` | `duplicate-of #N` | `defer-later` | `auto-handle <action>`> |
|
|
||
| ## Triage decision | ||
|
|
||
| <one of: `accept` | `needs-design` | `decline-with-reason: <text>` | `duplicate-of: #N` | `defer-later` | `auto-handle: <action>`> |
There was a problem hiding this comment.
The "Triage decision" placeholder uses colon formats like decline-with-reason: <text> / duplicate-of: #N / auto-handle: <action>, but SKILL.md's rubric lists the outcomes without colons (and with duplicate-of #N). Please pick one canonical decision string format and use it consistently across the template + rubric to avoid confusing panel output and any downstream automation.
| <one of: `accept` | `needs-design` | `decline-with-reason: <text>` | `duplicate-of: #N` | `defer-later` | `auto-handle: <action>`> | |
| <one of: `accept` | `needs-design` | `decline-with-reason <text>` | `duplicate-of #N` | `defer-later` | `auto-handle <action>`> |
…ses to apm-triage-panel Extends the triage panel from one conditional lens (OSS Growth Hacker) to three (adds Python Architect and Doc Writer). Mandatory roster is unchanged: DevX UX Expert, Supply Chain Security Expert, APM CEO. Activation rules are explicit and testable: - Python Architect fires on type/architecture, breaking-change, new top-level CLI command, schema change to apm.yml/apm.lock.yaml/ apm-policy.yml, or cross-cutting design keywords; otherwise records an inactive reason. Contributes feasibility, cross-cutting impact, and a status/needs-design recommendation when warranted. - Doc Writer fires on type/docs, area/docs-site, doc-change proposals, or user-facing features that imply new doc pages; otherwise records an inactive reason. Contributes a docs-implication call and a check that the suggested comment uses README/guide vocabulary. Single-comment-per-issue discipline preserved -- conditional lenses feed the CEO arbiter; they do not add public per-persona sections. Maximum lenses per triage = 6 (3 mandatory + 3 conditional). Updates: roster table, routing topology, conditional-panelist section (now covers all three), quality gates checklist, execution checklist, completeness gate, anti-patterns, gotchas, and the triage template's Per-lens notes (adds collapsible sub-blocks for Python Architect and Doc Writer parallel to the OSS Growth Hacker pattern). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Added two conditional persona lenses to apm-triage-panel: Python Architect (Architecture Reviewer) and Doc Writer (Documentation Reviewer). Mandatory roster unchanged (DevX UX, Supply Chain Security, APM CEO); OSS Growth Hacker remains conditional. Max lenses per triage now 6 (3 mandatory + 3 conditional). Activation rules are explicit and testable:
Both lenses feed the CEO arbiter as side-channels -- single-comment-per-issue discipline preserved. Each conditional persona records |
Adds a new
.apm/skills/apm-triage-panel/bundle for triaging single newly opened, reopened, orstatus/needs-triage-labelled issues.Why
Per the apm-review-panel design verdict (Deliverable F) on the issue-triage refactor (#116), we need a dedicated triage skill that produces ONE synthesized comment per issue containing a decision, label set from the new taxonomy, milestone assignment, and a suggested next action -- distinct from the PR-review panel.
Shape
Mirrors
apm-review-panelorchestration on purpose:tasktool dispatch)..agent.md, take lens, drop lens).Roster (3 mandatory + 1 conditional + 1 arbiter):
devx-ux-expert-- User-Need Reviewer (always)supply-chain-security-expert-- Risk-Surface Reviewer (always)apm-ceo-- Triage Arbiter (always)oss-growth-hacker-- Contributor-Tone Reviewer (conditional on first-time / low-interaction author)Skipped by default: Python Architect, CLI Logging Expert, Auth Expert -- those are PR-review concerns.
Decision rubric
accept|needs-design|decline-with-reason: <text>|duplicate-of: #N|defer-later|auto-handle: <action>Output contract
The template
assets/triage-template.mdends with a fencedjsonblock namedtriage-decisionso an orchestrator can mechanically apply labels, set the milestone, and post the reply without parsing prose.Files
.apm/skills/apm-triage-panel/SKILL.md(328 lines, ASCII-only).apm/skills/apm-triage-panel/assets/triage-template.md(ASCII-only).github/skills/apm-triage-panel/mirror (regenerated viaapm install --target copilot; byte-identical viadiff -r)CHANGELOG.md## [Unreleased]### Addedentryapm.lock.yamlreflects the new local skillNo new persona was added; existing
devx-ux-expert,supply-chain-security-expert,apm-ceo,oss-growth-hackerare sufficient.Verification
wc -l .apm/skills/apm-triage-panel/SKILL.md-> 328 (under the 500-line Agent Skills budget)python3 -c "open(p).read().encode('ascii')"passes for SKILL.md and triage-template.mddiff -r .apm/skills/apm-triage-panel/ .github/skills/apm-triage-panel/-> emptyRefs: #116 (issue-triage refactor discussion).