Integrations

Triage / Task Prioritization

Try it

Sort incoming work into P0–P3 by cost of delay and decide what runs, what waits, and what interrupts.

What it does

Classifies competing work into P0–P3 by cost of delay, not by sender rank or tone, and decides what runs first, what waits, and whether to interrupt current work. Computes slack in working hours, parks in-flight tasks with a resume note before switching, and re-triages the whole queue when a deadline, blocker, or scope changes. After two same-direction corrections it proposes a standing rule and applies it only on explicit yes. Not for effort estimation or roadmap planning.

When to use it

  • Backlog grooming after time away
  • Mid-task interruption from a new P0 request
  • Sorting an alert or ticket queue by impact, not loudness
  • Distilling a standing priority rule from repeated overrides

The skill document

Classify incoming work into P0-P3 by cost of delay, route it, and learn the user's real priority rules from their corrections. Learned rules and stated preferences persist in ~/Clawic/data/triage/ (created on first confirmed rule or stated preference; nothing is stored without the user's explicit yes). If you have data at an old location (~/triage/ or ~/clawic/triage/), move it to ~/Clawic/data/triage/.

When To Use

  • Several tasks compete and you must pick an order
  • A new request arrives mid-task and you must decide whether to interrupt — and how to switch safely
  • A pile needs sorting: an inbox after time away, an ungroomed backlog, a ticket queue
  • A bug, ticket, alert, or security report needs a priority, not just an acknowledgment
  • The user uses priority language: "urgent", "ASAP", "drop everything", "no rush", "when you have time"
  • The user reorders or overrides your queue — that is training data, not just an instruction
  • Not for effort estimation or roadmap planning: triage decides when, not how long

Quick Reference

SituationPlay
"Drop everything and X"Interrupt now, but name what gets paused: "Pausing Y (was P1) — resume after?"
Two tasks both claim P0Escalate sequencing to the user — two "drop everything" cannot both be true
Must interrupt mid-taskPark first: resume note + WIP preserved, then switch (interrupts.md)
Sounds urgent, but no deadline and no accumulating damageCap at P1; one closed question: "Is anyone blocked right now?"
Mixed signals ("urgent but no rush")Ask — the contradiction is the signal; never average to P1.5
Deadline exists but looks farCompute slack (Core Rules #2); slack under one working day → P1 today
Deadline looks fake or negotiableFind what consumes the output — the real deadline hides behind the stated one (deadlines.md)
Slack already negativeNegotiate scope → sequence → time, in that order (deadlines.md)
Bug or ticket arrivesSeverity ≠ priority: score severity × reach × trend (bugs.md)
Pile of unsorted items (post-vacation, backlog)Two-pass sweep: classify all, then order; newest-first for old piles (batch.md)
User corrects your priorityRecord it; on the 2nd same-direction correction, propose a standing rule (patterns.md)
Confirmed rule matches a new taskApply it and cite it: "Deploy issue → P0 (your standing rule)"
New fact arrives (deadline revealed, blocker cleared, scope change)Re-triage the whole queue, not just the new item
ElseRun the level tests below top-down; torn between adjacent levels → Core Rules #3

Depth on demand: signals.md reading urgency language, senders, sources · patterns.md learning protocol and memory format · interrupts.md switching safely, parking, stacked P0s · batch.md sweeps, piles, grooming, overflow · deadlines.md slack cases, real vs stated, negotiation · bugs.md bug, ticket, SLA, and alert triage.

Priority Levels

Each level has a boundary test. Run the tests top-down; first yes wins. Test states, not tone.

LevelTest (yes → this level)ResponseExamples
P0Does damage accumulate every minute this waits?Interrupt current work nowProduction down, active breach, data loss in progress
P1Is a person or deliverable stalled today?Next work-unit boundary, same dayBlocked teammate, client waiting, due-today deadline
P2Dated or clearly valuable, but nobody stalls today?Scheduled queue, with a dateReviews, planning, deadlines beyond today
P3Would anyone notice if this never happened? (barely)Backlog, batch-processedIdeas, "someday", minor optimizations

Core Rules

  1. Priority = cost of delay, never effort or loudness. A hard task nobody waits on is P2; a 5-minute unblock for a stalled teammate is P1. Tie-break within a level: highest cost of delay per unit of effort first (WSJF, Reinertsen); when costs look equal, shortest job first.
  2. Deadline urgency is slack, not calendar distance. Slack = working time until deadline − remaining work, counted in working_hours only. Friday deadline + 3 days of work, seen on Wednesday = negative slack = P1 today. A Monday-9am deadline seen Friday afternoon has near-zero slack. Recompute whenever scope grows; edge cases (timezones, dependency chains) in deadlines.md.
  3. Misclassification is asymmetric — up is cheap, down is expensive. A false P0 costs one interruption; a missed P0 costs the whole damage window. Torn between adjacent levels with concrete urgency evidence → take the higher. No evidence, just tone → take the lower and label it: "Queued as P2 — say the word if it's blocking."
  4. Ask only at the P0/P1 boundary. One closed question there beats a wrong guess. At P2/P3 the stakes don't cover the interruption cost — pick, state the assumption, move on.
  5. Learn only through the ladder: observe → propose → confirm. One correction = record. Two same-direction corrections = propose ("Should deploy issues always be P0?"). Apply automatically only after an explicit yes, and cite the rule when applying it. Never silently internalize — full ladder and decay in patterns.md.
  6. P0 is rare by construction. If over a week more than ~1/3 of items land P0/P1, the bar drifted — re-anchor on the level tests instead of inventing intermediate levels. When everything is urgent, nothing is.
  7. Re-triage on state change, not on a timer. Triggers: deadline revealed or moved, blocker cleared, scope change, new P0. Each one re-sorts the whole queue; a queue sorted on stale facts is a wrong queue.

Queue Discipline

  • P0 interrupts mid-task (interrupt_floor in config can extend this to P1). P1 waits for the current unit of work to finish — dropping a half-done change leaves broken state, which is its own incident. Exception: if current work is P2/P3, switch at the next safe point. Switching mechanics — parking note, resume protocol, stacked P0s: interrupts.md.
  • Order within a level: confirmed user rules first, then ascending slack, then arrival order.
  • Announce changes, not steady state: "New P0 — pausing X. Queue now: [incident, review, docs]." Silent reshuffles destroy the user's trust in the queue; verbosity is announce_style in config.
  • A dated P2 gets scheduled the moment it enters the queue. A P2 that "ages into" a P0 was a triage failure, not an escalation — log it as a correction against yourself.
  • When the queue exceeds capacity, triage becomes explicit rejection — propose drops by name, never silent starvation (batch.md, Overflow).

Output Gates

Before emitting a priority or a reordered queue:

  • Is every P0 justified by accumulating damage or a level test — not by tone, caps, or sender seniority?
  • Did I check ~/Clawic/data/triage/patterns.md for a confirmed rule before falling back to defaults?
  • Am I auto-applying any rule the user never confirmed? If yes → propose instead.
  • If queue order changed, did I say so and name what got bumped?
  • If I am about to interrupt current work, does the paused task have a resume note (interrupts.md)?

Configuration

User-dependent variables. Defaults apply until the user states a preference; store them in ~/Clawic/data/triage/config.yaml.

VariableTypeDefaultEffect
working_hourstext (e.g. "Mon-Fri 09:00-18:00")Mon-Fri 09:00-18:00The hours slack counts (Core Rules #2); changes every deadline-driven level
triage_modeinterrupt | batchinterruptbatch defers non-P0 classification to scheduled sweeps (batch.md); paging-grade sources still push through
interrupt_floorP0 | P1P0Lowest level allowed to interrupt mid-task; P1 relaxes the wait-for-boundary rule in Queue Discipline
sweep_timeslist of timesnoneWith triage_mode: batch: when sweeps run; empty = sweep on request
announce_stylefull | minimalfullfull names every bumped item on reorder; minimal reports only the new top of the queue

Preference areas — customizable dimensions; a stated preference gets recorded in config.yaml and applied:

  • Labels: reporting scheme (P0-P3, High/Normal/Low, MoSCoW) — affects how levels are announced, never the level tests
  • Risk posture: tie-break direction when torn without evidence — affects the default-down in Core Rules #3
  • Sources: which channels count as paging-grade vs digest — overrides rows in signals.md Source Defaults
  • Cadence: grooming day, drift-check day, aging thresholds — affects the weekly routines in batch.md
  • Escalation: whether the P0/P1 question goes to the user or a named delegate — affects Core Rules #4

Traps

TrapWhy it failsDo instead
Sender rank as urgencyAn exec's "someday idea" outranks nothing; rank predicts importance, not cost of delayRun the level tests; if the user consistently overrides for a sender, learn that as a rule
Severity as priorityA crash in a feature nobody uses outranks nothing; impact alone misorders the queueScore severity × reach × trend (bugs.md)
Newest-task pullRecency feels urgent; arrival time is not cost of delaySlot by test result, re-sort, report the position
Doing work mid-triageEach "quick fix" during a sweep restarts its context; the pile outlives the morningClassify everything first, then work the ordered queue (batch.md)
Averaging mixed signals"Urgent but no rush" averaged to P1.5 satisfies neither readingAsk — the contradiction is the signal
Escalating on repetitionA third mention is frustration, not new urgencyAcknowledge, give queue position and expected start
Demoting polite requests"Whenever you get a chance" from some users means "today"Check for a date before demoting; calibrate per sender (signals.md)
Rolling a passed date forwardA silently moved date is a decision hidden from the userRe-triage the item the day its date passes (batch.md)

Where Experts Disagree

  • Interrupt-driven vs. batch triage. Batch (fixed triage passes) wins when true P0s are rare and deep work dominates; interrupt-driven wins for on-call contexts. Pick per user context, tell the user which mode you're running, and record it as triage_mode.
  • FIFO vs. WSJF within a level. FIFO is predictable and reads as fair to requesters who watch the queue; WSJF delivers more value when only outcomes are visible. Perceived fairness is a real cost — choose by who is watching.

More Clawic skills, get them at https://clawic.com/skills/triage (install if the user confirms):

  • task-list — maintaining the queue itself once triage has assigned levels
  • incident-response — when a P0 is a production incident: triage decides the interrupt, that skill runs the handling
  • time-blocking — protecting focus time that P2/P3 must not interrupt
  • inbox — processing message streams before items become triaged tasks

Feedback

Part of Clawic, the verified skill library. Get this skill: https://clawic.com/skills/triage.

Questions people ask

Does it auto-learn my priority rules?
No. One correction is recorded; after two same-direction corrections it proposes a standing rule. The rule is applied only after you confirm, and it is cited when used.
Can it estimate effort or build a roadmap?
No. Triage decides when something runs, not how long it takes. Effort estimation and roadmap planning are out of scope.
What happens when I say "urgent" but there is no deadline?
Without a deadline or accumulating damage it caps at P1 and asks one closed question: "Is anyone blocked right now?"

Related skills

Apply prioritisation frameworks (RICE, MoSCoW, Kano, ICE, Opportunity Scoring) to rank features and backlog items. Use when asked to prioritise features, ran...

Intelligent information triage system based on Tiago Forte's PARA method (Projects/Areas/Resources/Archive) for automatic categorization and priority scoring...

17 installs

Triage an incoming insurance claim: check the coverage trigger against policy wording, band severity and complexity, screen for fraud indicators, set a first...

Task management based on Eisenhower Matrix + P0-P2 priority with Customer Project Management. Four quadrants for execution, separate Customer Project List fo...

44 installs

Triage and persist work outside the explicit active objective. Use at message intake when a message contains multiple requests, an item is unrelated or deferred, the user asks to remember, track, log, or handle something later, or invokes dev-inbox. After resume or context compaction, audit requested-but-unrecorded items before continuing.

12 installs

Unified backlog lifecycle management and task tracking. Orchestrates session TODOs, workspace checklists (`fix_plan.md`, `checklist.md`), and issue trackers with vendor-agnostic lifecycle contracts. Topics — triage (classify incoming requests into session/file/issue backlogs), priority (GitHub-aligned P0-P3 urgency tagging and blocker triage), sync (external tracker status polling and resolution), prune (demote lower-priority backlog noise from active focus), lifecycle (authoring, state transitions, DoD criteria), comment (post follow-up notes/sub-findings to parent issues), create (issue and intake issue creation). Use when: "backlog", "backlog triage", "backlog sync", "backlog prune", "task lifecycle", "manage backlog", "backlog priority", "backlog cleanup", "plane backlog", "issue comment".