Skip to content

feat(skills): add apm-triage-panel for issue triage#915

Merged
danielmeppiel merged 2 commits intomainfrom
feat/apm-triage-panel-skill
Apr 24, 2026
Merged

feat(skills): add apm-triage-panel for issue triage#915
danielmeppiel merged 2 commits intomainfrom
feat/apm-triage-panel-skill

Conversation

@danielmeppiel
Copy link
Copy Markdown
Collaborator

Adds a new .apm/skills/apm-triage-panel/ bundle for triaging single newly opened, reopened, or status/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-panel orchestration on purpose:

  • Single-loop, in-context, progressive disclosure (no task tool dispatch).
  • Single-comment output discipline.
  • Pre-arbitration completeness gate.
  • Persona-pass procedure (open .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.md ends with a fenced json block named triage-decision so 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 via apm install --target copilot; byte-identical via diff -r)
  • CHANGELOG.md ## [Unreleased] ### Added entry
  • apm.lock.yaml reflects the new local skill

No new persona was added; existing devx-ux-expert, supply-chain-security-expert, apm-ceo, oss-growth-hacker are 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.md
  • diff -r .apm/skills/apm-triage-panel/ .github/skills/apm-triage-panel/ -> empty

Refs: #116 (issue-triage refactor discussion).

Copilot AI review requested due to automatic review settings April 24, 2026 20:21
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>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

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-panel skill bundle under .apm/skills/ and regenerated mirror under .github/skills/.
  • Added assets/triage-template.md with a required triage-decision JSON block contract.
  • Updated CHANGELOG.md and apm.lock.yaml to 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, and auto-handle, but the template's "Triage decision" placeholder uses colon forms like decline-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, and auto-handle, but the template's "Triage decision" placeholder uses colon forms like decline-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

Comment thread CHANGELOG.md
- `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)
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

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)").

Copilot generated this review using guidance from repository custom instructions.
Comment thread .apm/skills/apm-triage-panel/SKILL.md Outdated
Comment on lines +12 to +13
The panel is fixed at **3 mandatory specialist lenses + 1 conditional
growth lens + 1 arbiter lens = up to 5 persona sections in one triage
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

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.

Suggested change
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

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +13
The panel is fixed at **3 mandatory specialist lenses + 1 conditional
growth lens + 1 arbiter lens = up to 5 persona sections in one triage
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

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.

Suggested change
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

Copilot uses AI. Check for mistakes.

## Triage decision

<one of: `accept` | `needs-design` | `decline-with-reason: <text>` | `duplicate-of: #N` | `defer-later` | `auto-handle: <action>`>
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

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.

Suggested change
<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>`>

Copilot uses AI. Check for mistakes.

## Triage decision

<one of: `accept` | `needs-design` | `decline-with-reason: <text>` | `duplicate-of: #N` | `defer-later` | `auto-handle: <action>`>
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

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.

Suggested change
<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>`>

Copilot uses AI. Check for mistakes.
@danielmeppiel
Copy link
Copy Markdown
Collaborator Author

Tracking under epic #916 (PGS roadmap-management system: label taxonomy + discussion #116 refactor + this skill + 10-issue live triage cohort).

…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>
@danielmeppiel
Copy link
Copy Markdown
Collaborator Author

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:

  • Python Architect fires on type/architecture, breaking-change, new top-level CLI commands, schema changes to apm.yml / apm.lock.yaml / apm-policy.yml, or cross-cutting design keywords (refactor, new module, abstraction, schema change, pluggable, introduce X pattern). Pushes status/needs-design when warranted.
  • Doc Writer fires on type/docs, area/docs-site, doc-change proposals, or user-facing features that imply new doc pages; flags whether area/docs-site should ride as a secondary label so the implementing PR is reminded.

Both lenses feed the CEO arbiter as side-channels -- single-comment-per-issue discipline preserved. Each conditional persona records <Persona> inactive reason: <one sentence> when it does not activate, mirroring the existing OSS Growth Hacker pattern. Updated: roster, routing topology, conditional-panelist section, quality gates, execution checklist, completeness gate, and the triage template's Per-lens notes.

@danielmeppiel danielmeppiel merged commit f0379e7 into main Apr 24, 2026
7 checks passed
@danielmeppiel danielmeppiel deleted the feat/apm-triage-panel-skill branch April 24, 2026 21:51
@danielmeppiel danielmeppiel mentioned this pull request Apr 26, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants