Groups related GitHub issues, fuses each group with the project's AGENTS.md northstar and session judgment, and composes a portable handoff for independent execution sessions.
How this skill is triggered — by the user, by Claude, or both
Slash command
/epistemic-cooperative:triageThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Form executable work units from GitHub issue substrate, handing execution — branches, PRs, applied fixes — to a normal session. It reads raw issues, groups related issues, fuses each group with the project's inscribed northstar and the user's current-session judgment, forms one or more focused work units, and — once the user routes a unit for handoff — composes `/distill` to emit it as a portab...
Form executable work units from GitHub issue substrate, handing execution — branches, PRs, applied fixes — to a normal session. It reads raw issues, groups related issues, fuses each group with the project's inscribed northstar and the user's current-session judgment, forms one or more focused work units, and — once the user routes a unit for handoff — composes /distill to emit it as a portable handoff for an independent session.
/triage owns work-unit formation:
BacklogIntake
-> RawIssueSet
-> IssueGroup
-> NormalizedProblemFrame
-> NorthstarFusion
-> FocusedWorkUnit
-> RouteChoice
-> independent session: [/distill] -> PortableHandoff
-> re-triage: back to the relevant earlier phase, no handoff composed
Execution is not /triage's. The receiving session consumes the portable handoff /distill composes — or a focused work unit directly — and does the branching, editing, and PR work itself. Arranging how several routed units run is likewise outside this skill: /triage emits one handoff per routed unit and stops.
| Type | Meaning |
|---|---|
BacklogIntake | The scale-aware intake step that binds an explicit issue scope or, when no scope is supplied, inspects the current repository's open GitHub issue backlog through lightweight metadata before deciding how much substrate to read. Scale is judged by triage load, not by a fixed issue-count threshold. |
RawIssueSet | The issue substrate read from GitHub: issue body, comments, labels, linked PRs, and explicitly cited blockers. Scope this narrowly to issues; do not call it external signals. |
IntakeIntent | The user-recognized purpose for the triage pass, explicitly stated in the current session. |
TriageLoad | A metadata-grounded composite judgment spanning IssueLoad, RepoLoad, MappingLoad, and IntentAmbiguity. |
IssueGroup | One or more raw issues that share a problem pressure: similar symptom, target behavior, conceptual request, affected surface, or blocked execution axis. |
NormalizedProblemFrame | A single problem statement reconstructed from the issue group, with duplicates collapsed and contradictions surfaced. |
Northstar | The inscribed direction line read from AGENTS.md or the active project guide, usually under ## Northstar. This may have been produced by /realign. |
NorthstarFusion | A session-text trace showing how the normalized problem frame preserves, transforms, or drops issue claims in light of the northstar and the user's current judgment. |
FocusedWorkUnit | The executable unit formed from one issue group after northstar fusion. Default cardinality is IssueGroup -> FocusedWorkUnit one-to-one. Split only when northstar fusion exposes distinct execution axes. |
RouteChoice | The user's current-session choice for a formed work unit: hand it off to an independent session, or re-triage it. |
PortableHandoff | The handoff artifact for an independent session, composed by /distill from a routed FocusedWorkUnit. /distill owns this type; /triage composes it rather than emitting its own handoff format. |
Accept one of:
gh issue list filterIf no scope is recoverable, default to the current repository's open GitHub issue backlog. First perform a lightweight metadata pass, not a full substrate read:
gh issue list --state open --json number,title,labels,state,createdAt,updatedAt,assignees,milestone
If GitHub access is unavailable or the current repository cannot be identified, ask for the issue scope or pasted issue list.
Classify the intake scale by TriageLoad before reading full issue bodies and comments:
| Load axis | Signals to inspect from metadata and repo shape |
|---|---|
IssueLoad | Open issue volume relative to the next checkpoint, recent arrival rate, title/body preview density when available, comment/dependency/link indicators, unlabeled or stale proportion, duplicate / needs-info candidates. |
RepoLoad | Repository surface area, number of independently deployable packages or runtime surfaces, verifier/test matrix breadth, known co-change requirements, ownership or component boundaries. |
MappingLoad | How clearly issue titles/labels map to code, docs, runtime, verifier, or protocol surfaces; whether many issues span several surfaces or lack enough metadata to map. |
IntentAmbiguity | Whether the current session has clarified the triage purpose: executable work selection, stale backlog reduction, milestone/release preparation, duplicate consolidation, blocker surfacing, or another explicit intent. |
Use the load axes to choose an intake posture:
| Posture | Intake path |
|---|---|
| Small | Full-scan the bound open issues into RawIssueSet, then group. Use this only when IssueLoad, RepoLoad, MappingLoad, and IntentAmbiguity are all low enough that full substrate reading fits the next checkpoint. |
| Medium | Build a metadata grouping map first. Surface candidate clusters in Phase 2 before the user confirms selection, then read full substrate only for confirmed clusters. Use this when full scan is plausible but one or more load axes would make silent reading too costly. |
| Large | Call /elicit to crystallize IntakeIntent, convert that intent into a GitHub query/filter or cluster selection, then read full substrate only for the resulting slice. Use this whenever full substrate reading would exceed the next checkpoint or the triage purpose is unclear. |
If the user explicitly asks for a full-backlog audit on a medium or large backlog, process metadata in checkpointed batches and surface progress between batches. Defer full body/comment reads until after the first grouping checkpoint.
Load is not legible from labels. TriageLoad sizes the intake (how much substrate to read now). It does not measure the deliverable load a unit imposes downstream — the human judgment its execution and review will demand. These are independent: a refactor/enhancement label does not imply low deliverable load. An audit or candidate-classification issue — one whose output is a decision (which candidates to act on, merge-vs-keep, discriminant-vs-removable) — carries high deliverable load because it spawns in-session judgment gates, even when its surface reads as mechanical. When ordering or routing units by reviewer cost, read deliverable load from what the issue produces (a mechanical edit vs a decision), not from its type label.
Read the full issue substrate for each issue in the bound scope or confirmed cluster:
depends on #NUse the available GitHub interface (gh, MCP, or pasted issue text). Preserve issue numbers in every downstream artifact.
For medium and large intake postures, metadata-only lists are provisional. They can seed IssueGroup candidates, but a candidate cannot become a NormalizedProblemFrame, FocusedWorkUnit, or distilled PortableHandoff until the relevant full issue substrate has been read.
Propose IssueGroup candidates by problem pressure, not by label alone.
Useful grouping signals:
Labels can seed grouping, especially type / priority / severity / component labels, but they do not replace problem-pressure grouping.
Surface the grouping map before moving to fusion. If grouping is contested, present 2-3 grouping alternatives with their downstream work-unit shape. The user may confirm, adjust, split, merge, or ask for re-triage.
For each confirmed IssueGroup, write a NormalizedProblemFrame:
This is not an implementation plan. It is the issue group's shared problem frame.
Read the active project northstar from AGENTS.md, CLAUDE.md, or the project guide. Prefer AGENTS.md when present in Codex contexts.
For each NormalizedProblemFrame, produce a NorthstarFusion trace:
The fusion happens in session text. GitHub may store the result later, but the user's route judgment is constituted in the Codex session.
Convert each fused frame into a FocusedWorkUnit.
Default rule: one confirmed IssueGroup becomes one FocusedWorkUnit.
Split the group only when:
Each work unit includes:
Present the work units and ask the user to choose a route for each:
The route choice is the input Phase 7 hands /distill: a unit routed to an independent session proceeds to Phase 7. Re-triage returns to the relevant earlier phase; no handoff is composed for that cycle.
For each work unit the user routed to an independent session, compose /distill to produce its PortableHandoff.
Hand /distill the work unit's own substrate as its working context: the FocusedWorkUnit, its NormalizedProblemFrame, its NorthstarFusion trace, and the included issue numbers with their per-issue contribution. /distill runs its own contract declaration against this substrate: the recipient is a fresh session with no access to the current one, so the handoff carries what that session cannot re-derive from the repository itself. /triage does not pre-classify durability or recipient profile; it supplies the work-unit substrate, and /distill resolves them at its own contract phase.
Re-triage does not reach this phase: revising grouping, fusion, or work-unit boundaries produces no handoff to distill.
/distill emits the PortableHandoff, including the activation edge that hands the artifact to the independent session as a copyable initial-prompt block.
/triage call defaults to the current repository's open GitHub issue backlog through a lightweight metadata pass. Ask for scope only when repository issue access is unavailable or ambiguous.RawIssueSet, not broad external-signal language, for the issue substrate. The concrete input is GitHub issues or pasted issue equivalents.TriageLoad, not by a fixed issue-count threshold. Issue count is only one signal inside IssueLoad.IntakeIntent via /elicit before full substrate reads./triage does not edit production files, create implementation branches, open PRs, or apply fixes.IssueGroup -> FocusedWorkUnit one-to-one. Split only with cited execution-axis evidence./distill composes, or a focused work unit directly, not a raw issue list./triage forms and routes focused work units; it does not hand-roll its own handoff template. The portable handoff — its zero-memory comprehension gate, leak lint, and durability classification — is /distill's owned contract, composed at Phase 7 rather than duplicated inline./triage reads GitHub issue substrate and emits focused work units. It may read the current northstar produced by /realign, but it does not rewrite the project guide. It composes /distill to hand selected work units' portable handoffs to independent sessions, but does not execute branches, PRs, or review compliance, and does not arrange the order or concurrency in which several routed units run.
Triage composes the following protocols at runtime:
/elicit (Euporia) — crystallizes IntakeIntent before full substrate reads/distill (Diylisis) — composes the routed work unit's portable handoffComposition is sequential — each phase consumes the previous phase's output. The re-triage route at Phase 6 does not reach Phase 7; that cycle composes no handoff.
TriageLoad./elicit-formed IntakeIntent.refactor/mechanical label when the issue's output is a decision or candidate-classification that will spawn in-session judgment gates./triage.FocusedWorkUnit handed to /distill must carry the fused problem frame, scope, exclusions, and verification expectations Phase 3 through 5 produced; it is not a pasted issue list./triage instead of composing /distill at Phase 7. The handoff's comprehension gate, leak lint, and durability classification live in /distill's contract; re-implementing them inline duplicates and drifts from it.TriageLoad records IssueLoad, RepoLoad, MappingLoad, and IntentAmbiguityTriageLoad before full substrate readsIntakeIntent crystallized through /elicit before filtered full-substrate reads/distill is composed per routed work unit, handed the FocusedWorkUnit/NormalizedProblemFrame/NorthstarFusion/issue-provenance substrate; re-triage skips this stepnpx claudepluginhub jongwony/epistemic-protocols --plugin epistemic-cooperativeClusters GitHub issue backlogs by root cause into plan-master issues, redirects children, and bundles architectural-fix PRs. Use for triage, consolidation, or roadmap creation.
Triage issues and external PRs through a state machine of roles: categorize, verify, request info, and write agent-ready briefs.
Triage GitHub issues and external PRs through a state machine of roles: categorize, verify, and prepare agent-ready briefs.