Implement GitOps workflows with ArgoCD and Flux for automated, declarative Kubernetes...
npx skills add miles-knowbl/orchestrator --skill "triage"
Install specific skill from multi-skill repository
# Description
Prioritize and re-prioritize work in the system queue based on changing conditions. Uses prioritization frameworks to order work by value, urgency, and dependencies. Responds to triggers like new requirements, blockers, and resource changes.
# SKILL.md
name: triage
description: "Prioritize and re-prioritize work in the system queue based on changing conditions. Uses prioritization frameworks to order work by value, urgency, and dependencies. Responds to triggers like new requirements, blockers, and resource changes."
phase: INIT
category: core
version: "1.0.0"
depends_on: []
tags: [planning, prioritization, queue, triage]
Triage
Decide what to work on next.
When to Use
- Initial prioritization — Order newly created queue
- New system discovered — Insert into existing queue
- Blocker identified — Re-prioritize around obstacle
- Blocker resolved — Unlock waiting work
- Scope change — Requirements shift
- Resource change — Team capacity changes
- Deadline change — Timeline pressure
- Strategic shift — Business priorities change
Reference Requirements
MUST read before applying this skill:
| Reference | Why Required |
|---|---|
prioritization-frameworks.md |
Methods for ordering work |
Read if applicable:
| Reference | When Needed |
|---|---|
triage-triggers.md |
When identifying what triggered re-triage |
Verification: Ensure system-queue.json is updated with clear priority rationale.
Required Deliverables
| Deliverable | Location | Condition |
|---|---|---|
Updated system-queue.json |
domain-memory/{domain}/ |
Always |
| Priority annotations | In queue or separate doc | When reordering |
Core Concept
Triage answers: "What should we work on next, and in what order?"
┌─────────────────────────────────────────────────────────────────────────────┐
│ TRIAGE │
│ │
│ INPUTS OUTPUTS │
│ ────── ─────── │
│ System Queue ─────────────────────▶ Reordered Queue │
│ New Information ─────────────────────▶ Priority Rationale │
│ Constraints ─────────────────────▶ Impact Assessment │
│ Dependencies ─────────────────────▶ Blocked Items Identified │
│ │
│ Triage is continuous — priorities evolve as conditions change │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Triage Triggers
| Trigger | Response |
|---|---|
| New system discovered | Score and insert into queue |
| Blocker identified | Mark blocked, adjust dependents |
| Blocker resolved | Unblock and re-prioritize |
| Scope change | Re-estimate, re-score |
| Deadline moved | Adjust urgency scores |
| Resource change | Adjust capacity assumptions |
| Dependency completed | Unlock waiting items |
| Strategic direction change | Re-score value alignment |
The Triage Process
┌─────────────────────────────────────────────────────────────────────────────┐
│ TRIAGE PROCESS │
│ │
│ 1. IDENTIFY TRIGGER │
│ └─→ What changed? │
│ └─→ What's affected? │
│ │
│ 2. GATHER CONTEXT │
│ └─→ Current queue state │
│ └─→ Dependencies │
│ └─→ Constraints (time, resources) │
│ │
│ 3. APPLY FRAMEWORK │
│ └─→ Choose appropriate prioritization method │
│ └─→ Score affected items │
│ └─→ Consider dependencies │
│ │
│ 4. REORDER QUEUE │
│ └─→ Update priorities │
│ └─→ Mark blocked items │
│ └─→ Identify newly ready items │
│ │
│ 5. DOCUMENT & COMMUNICATE │
│ └─→ Record rationale │
│ └─→ Note what changed │
│ └─→ Inform stakeholders │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Prioritization Frameworks
1. Dependency-First
Use when: Building a new domain with interdependent systems.
Order by dependency depth — foundations before dependents:
┌─────────────────────────────────────────────────────────────────────────────┐
│ DEPENDENCY-FIRST │
│ │
│ Priority 1: No dependencies (foundations) │
│ ┌────────────┐ ┌────────────┐ │
│ │ Auth │ │ Config │ │
│ └─────┬──────┘ └─────┬──────┘ │
│ │ │ │
│ Priority 2: Depend only on P1 │
│ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ │
│ │ Users │ │ Orders │ │
│ └─────┬──────┘ └─────┬──────┘ │
│ │ │ │
│ Priority 3: Depend on P1 or P2 │
│ └───────┬───────┘ │
│ ▼ │
│ ┌────────────┐ │
│ │ Analytics │ │
│ └────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Algorithm:
1. Build dependency graph
2. Topological sort
3. Same-level items ordered by value
2. Value/Effort (WSJF)
Use when: Maximizing value delivery with limited capacity.
Weighted Shortest Job First:
Priority Score = (Business Value + Time Criticality + Risk Reduction) / Effort
| Factor | Scale | Description |
|---|---|---|
| Business Value | 1-10 | Revenue, cost savings, strategic |
| Time Criticality | 1-10 | Urgency, deadline pressure |
| Risk Reduction | 1-10 | Removes uncertainty, enables learning |
| Effort | 1-10 | T-shirt size converted to number |
Example:
| System | Value | Time | Risk | Effort | Score | Rank |
|---|---|---|---|---|---|---|
| Payment integration | 9 | 8 | 6 | 8 | 2.9 | 2 |
| Mobile app | 8 | 5 | 4 | 10 | 1.7 | 4 |
| Reporting | 6 | 3 | 2 | 3 | 3.7 | 1 |
| Admin panel | 5 | 4 | 3 | 5 | 2.4 | 3 |
3. MoSCoW
Use when: Fixed deadline, need to define MVP.
| Category | Meaning | Action |
|---|---|---|
| Must | Critical for success | Do first, non-negotiable |
| Should | Important but not critical | Do if time permits |
| Could | Nice to have | Only if ahead of schedule |
| Won't | Explicitly out of scope | Document as deferred |
Example:
## Release 1.0 Scope
### Must Have
- User authentication
- Work order CRUD
- Basic assignment
### Should Have
- Notifications
- Status history
- Basic reporting
### Could Have
- Route optimization
- Offline mode
- Advanced filters
### Won't Have (This Release)
- Mobile app
- Analytics dashboard
- Third-party integrations
4. Eisenhower Matrix
Use when: Mixed bag of urgent vs important work.
┌─────────────────────────────────────────────────────────────────────────────┐
│ EISENHOWER MATRIX │
│ │
│ URGENT NOT URGENT │
│ ┌─────────────────────┬─────────────────────┐ │
│ │ │ │ │
│ IMPORTANT │ DO FIRST │ SCHEDULE │ │
│ │ │ │ │
│ │ • Critical bugs │ • Architecture │ │
│ │ • Deadline items │ • Tech debt │ │
│ │ • Blockers │ • Documentation │ │
│ │ │ │ │
│ ├─────────────────────┼─────────────────────┤ │
│ │ │ │ │
│ NOT │ DELEGATE │ ELIMINATE │ │
│ IMPORTANT │ │ │ │
│ │ • Nice-to-haves │ • Low-value items │ │
│ │ • Quick wins │ • Distractions │ │
│ │ │ │ │
│ └─────────────────────┴─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
5. RICE Scoring
Use when: Need quantitative comparison of many items.
RICE Score = (Reach × Impact × Confidence) / Effort
| Factor | Scale | Description |
|---|---|---|
| Reach | # users/period | How many people will this affect? |
| Impact | 0.25, 0.5, 1, 2, 3 | How much will it affect each person? |
| Confidence | 0-100% | How sure are we of estimates? |
| Effort | Person-months | How much work? |
Impact Scale:
- 3 = Massive (game-changer)
- 2 = High (significant improvement)
- 1 = Medium (noticeable)
- 0.5 = Low (minor)
- 0.25 = Minimal
Example:
| System | Reach | Impact | Confidence | Effort | Score |
|---|---|---|---|---|---|
| Mobile app | 5000 | 2 | 80% | 4 | 2000 |
| Admin panel | 50 | 1 | 90% | 1 | 45 |
| API v2 | 1000 | 1 | 70% | 2 | 350 |
→ See references/prioritization-frameworks.md
Handling Blockers
Blocker Identified
When a system becomes blocked:
┌─────────────────────────────────────────────────────────────────────────────┐
│ BLOCKER RESPONSE │
│ │
│ 1. MARK BLOCKED │
│ └─→ Update status: "blocked" │
│ └─→ Record blockedReason │
│ └─→ Note expected resolution │
│ │
│ 2. ASSESS IMPACT │
│ └─→ What depends on this? │
│ └─→ Are those items also effectively blocked? │
│ │
│ 3. FIND ALTERNATIVES │
│ └─→ Can we work on something else? │
│ └─→ Can we work around the blocker? │
│ └─→ Can we parallelize unblocked work? │
│ │
│ 4. ESCALATE IF NEEDED │
│ └─→ Is this blocking critical path? │
│ └─→ Who can unblock? │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Blocker Resolved
When a blocker is removed:
- Update status: "blocked" → "ready"
- Clear blockedReason
- Re-evaluate priority (may have shifted)
- Check if this unblocks other items
- Update queue order
Common Blockers
| Blocker Type | Response |
|---|---|
| Technical dependency | Work on other items or spike solutions |
| External team | Escalate, find workarounds |
| Information needed | Ask questions, make assumptions (document) |
| Resource unavailable | Reschedule, find alternatives |
| Approval pending | Escalate, work on non-blocked items |
Priority Factors
Factors to consider when scoring:
| Factor | Questions |
|---|---|
| Business Value | How much revenue/savings? Strategic alignment? |
| User Impact | How many users? How much does it help them? |
| Urgency | Hard deadline? Market window? Competitive pressure? |
| Dependencies | What does this unblock? What blocks it? |
| Risk | Does early work reduce uncertainty? |
| Effort | How much work? Do we have capacity? |
| Technical Foundation | Does this enable future work? |
| Learning | Will this teach us something valuable? |
Queue Reordering
Before/After Template
## Queue Reorder: [Date]
### Trigger
[What caused this reorder]
### Before
| Priority | System | Status |
|----------|--------|--------|
| 1 | Auth Service | complete |
| 2 | Work Orders | in-progress |
| 3 | Route Optimization | specified |
| 4 | Mobile App | specified |
### After
| Priority | System | Status | Change |
|----------|--------|--------|--------|
| 1 | Auth Service | complete | — |
| 2 | Work Orders | in-progress | — |
| 3 | Mobile App | specified | ↑ from 4 |
| 4 | Route Optimization | blocked | ↓ + blocked |
### Rationale
- Route Optimization blocked waiting for mapping API access
- Mobile App has no blockers and stakeholder requested acceleration
### Impact
- Mobile App accelerated by ~2 weeks
- Route Optimization delayed until blocker resolved (ETA: 1 week)
Integration with Queue
Updating system-queue.json
// Priority update
system.priority = newPriority;
// Blocking
system.status = "blocked";
system.blockedReason = "Waiting for DBA approval on schema";
// Unblocking
system.status = "ready"; // or previous status
delete system.blockedReason;
// Always update timestamp
queue.updatedAt = new Date().toISOString();
Finding Next Ready System
function getNextReady(queue) {
return queue.systems
.filter(s => s.status === "ready" || s.status === "specified")
.filter(s => allDependenciesMet(s, queue))
.sort((a, b) => a.priority - b.priority)[0];
}
function allDependenciesMet(system, queue) {
return system.dependencies.every(depId => {
const dep = queue.systems.find(s => s.id === depId);
return dep && dep.status === "complete";
});
}
→ See references/queue-operations.md
Triage Meeting Template
For regular triage sessions:
## Triage Session: [Date]
### Attendees
- [Names]
### Queue Status
- Total systems: X
- Complete: X
- In Progress: X
- Ready: X
- Blocked: X
### Review Blockers
| System | Blocker | Owner | ETA |
|--------|---------|-------|-----|
| [System] | [Blocker] | [Who] | [When] |
### New Items to Prioritize
| System | Proposed Priority | Discussion |
|--------|-------------------|------------|
| [System] | [Priority] | [Notes] |
### Priority Changes
| System | Old | New | Reason |
|--------|-----|-----|--------|
| [System] | X | Y | [Why] |
### Decisions
- [Decision 1]
- [Decision 2]
### Action Items
- [ ] [Action] — [Owner]
- [ ] [Action] — [Owner]
### Next Triage
[Date/Time]
Relationship to Other Skills
| Skill | Relationship |
|---|---|
entry-portal |
Creates items that triage prioritizes |
estimation |
Provides effort estimates for scoring |
loop-controller |
Uses triage output to select next system |
memory-manager |
Triage decisions recorded in domain memory |
Key Principles
Dependencies first. Can't build on missing foundations.
Value over effort. Prioritize impact, not ease.
Revisit regularly. Priorities change; triage is ongoing.
Document rationale. Future you will wonder "why?".
Communicate changes. Stakeholders need to know.
Avoid thrashing. Don't reprioritize constantly; batch changes.
Mode-Specific Behavior
Triage behavior differs by orchestrator mode:
Greenfield Mode
| Aspect | Behavior |
|---|---|
| Scope | Full systems in queue |
| Approach | Dependency-first prioritization |
| Patterns | Free choice—establish build order |
| Deliverables | Prioritized system queue |
| Validation | Dependencies ordered correctly |
| Constraints | Minimal—parallelize where possible |
Brownfield-Polish Mode
| Aspect | Behavior |
|---|---|
| Scope | Gaps by category |
| Approach | Value/effort quick-win prioritization |
| Patterns | Should group by existing categories |
| Deliverables | Prioritized gap queue |
| Validation | High-impact gaps first |
| Constraints | Deploy gaps often unblock others |
Polish considerations:
- Group by category (deploy, UI, data, test)
- Score each gap: Impact × Ease / Effort
- Deploy gaps often first (unblocks everything)
- Batch related changes together
Brownfield-Enterprise Mode
| Aspect | Behavior |
|---|---|
| Scope | Change steps within request |
| Approach | Risk-minimization prioritization |
| Patterns | Must conform to release windows |
| Deliverables | Risk-ordered change plan |
| Validation | Blast radius minimized |
| Constraints | Requires approval at each step |
Enterprise constraints:
- Minimize blast radius of each step
- Prefer reversible changes first
- Prioritize high-test-coverage areas
- Align with release windows and approvals
Mode-Aware Triage
function triageItems(items, mode) {
switch (mode) {
case 'greenfield':
return topologicalSort(items)
.thenBy(wsjfScore);
case 'brownfield-polish':
return sortByCategory(items)
.map(category => sortByQuickWins(category));
case 'brownfield-enterprise':
return sortByRisk(items, { ascending: true })
.filterByApprovalStatus();
}
}
References
references/prioritization-frameworks.md: Detailed framework guidancereferences/triage-triggers.md: Common triggers and responsesreferences/priority-scoring.md: Scoring worksheetsreferences/queue-reorder-template.md: Change documentation
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.