# Triage Rules

> Two-axis triage protocol for any AI agent. When facing a batch of findings, bug reports, audit results, or todo items — MUST sort by (confidence × blast-radius) before proposing actions. Confident + reversible/local damage = self-execute (Lane A). Confident + irreversible/colossal = recommend-and-ask (Lane B1). Uncertain regardless of risk = explain options and defer (Lane B2). Output as a scannable decision board, not a wall of text. Activates whenever an agent has just produced or received N≥2 findings/proposals/todos and is about to suggest actions. Also enforces a YAGNI self-check on items that introduce new mechanism, defensive code, future abstraction, or replace working systems.

- Skill: `motiful/triage-rules` (Agent Skill)
- Install (CLI): `npx skillmds@latest add motiful/triage-rules`
- Raw SKILL.md: https://api.skillmd.com/api/skills/motiful/triage-rules/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: motiful (https://skillmd.com/u/motiful)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/motiful/triage-rules

---


# Triage — Two-Axis Decision Lanes

A `*-rules` hard-constraint skill (loaded by the rules-as-skills meta protocol). MUST/NEVER statements are binding, not advisory.

## Trigger

Activates the moment any of these is true:

- Just finished an audit, survey, code-walk, or research phase that produced ≥2 findings
- Received a batch of bug reports, issues, or todo items from the user
- About to propose actions on a list of items
- About to introduce a new mechanism, hook, dependency, configuration field, or abstraction
- About to add defensive code "just in case" or "for future flexibility"
- About to replace a working mechanism with a more elegant but more complex alternative

If the agent is about to write a multi-paragraph proposal touching ≥2 distinct items, this skill MUST run first.

## MUST

- **MUST classify EACH item by two axes BEFORE writing any proposal:**
  - **Confidence** — how sure are you in the diagnosis / direction? (高 / 中 / 低)
  - **Blast radius** — if you act and you are wrong, what breaks? (reversible / local damage / colossal-or-irreversible)

- **MUST output a decision board** (短表格 / 短列表 with one line per item), NOT a long narrative.

- **MUST place each item in exactly one lane:**
  - **Lane A** — auto-execute (high confidence + low blast radius)
  - **Lane B1** — recommend & escalate (high confidence + high blast radius / irreversible)
  - **Lane B2** — discuss with options (low confidence regardless of blast radius)

- **MUST give Lane B1/B2 items concrete options + tradeoffs in plain language.** No undefined jargon. Rank options when possible. State your recommendation explicitly.

- **MUST tell the user what is in each lane** before executing anything, so they have ~30 seconds to redirect a misclassified item.

- **MUST run a YAGNI self-check on any item that:**
  - Introduces a new mechanism (hook, socket, IPC field, config option, parameter)
  - Adds defensive code "in case X happens"
  - Adds an abstraction "we might need later"
  - Replaces a working mechanism with a more elegant but more complex alternative

  The single question: **"Would a real user fail RIGHT NOW without this? Or am I anticipating a problem that hasn't happened?"**

  - Answer YES → ship it.
  - Answer NO or "not sure" → backlog it, do not ship.
  - YAGNI failure with high confidence + low risk → reflect, drop it.
  - YAGNI failure with uncertainty or high risk → escalate to user.

## NEVER

- **NEVER batch-execute Lane A items without first showing the user the triage board.** The board is the contract; without it the user cannot redirect a misclassification.

- **NEVER let a B1/B2 item slip into Lane A "because it seemed easy".** Easy ≠ low blast radius. If the action touches shared state, public APIs, irreversible operations, or multi-module behavior, it is B1 even if you are 100% confident.

- **NEVER produce a wall-of-text audit when a triage board would convey the same information.** Length is not depth — it is friction.

- **NEVER use jargon in B1/B2 explanations without inline definitions.** If the user has to look up a term to make a decision, the explanation is broken.

- **NEVER conflate "I am confident" with "this is safe to do".** These are two axes, not one. A 100%-correct destructive action is still high-blast-radius.

- **NEVER add new mechanism / hook / abstraction without YAGNI passing.** "Sounds clever" is not the same as "user fails without it". The monkey-paw failure mode begins here.

- **NEVER skip the triage step when the user gave a one-line task that contains hidden batches** ("clean up the progress dir", "fix the bugs in this module" — these are batches in disguise).

## How to Apply

When the trigger condition fires:

1. **Freeze before proposing.** No "let me suggest..." until the board is written.

2. For each finding/item, ask:
   - (a) How confident am I in the diagnosis or direction? (高/中/低)
   - (b) If I act and I am wrong, what breaks and is it recoverable? (reversible / local damage / colossal)

3. Run the YAGNI self-check on any item introducing new mechanism / defensive / future / replacement.

4. Sort into Lane A / B1 / B2.

5. Write the board: each item one or two lines, no jargon, in a table or short list.

6. Hand to the user. Wait for sign-off on Lane A items in batch + targeted decisions on B1/B2.

7. Execute only what the user has authorized.

## Example board format

```
| 项 | 描述 | Lane | 备注 |
|----|------|------|------|
| 1  | xxx  | A    | 自信高 + 改 1 个文件 |
| 2  | yyy  | B1   | 自信高 + 删 21 个 worktree（不可逆）— 推荐 dry-run 先过目 |
| 3  | zzz  | B2   | 不确定 root cause；选项：(a) ... (b) ...，倾向 (a) |
```

Then explicitly:
- "Lane A 我准备直接干（项 1）"
- "Lane B1 等你拍板（项 2）"
- "Lane B2 等你选（项 3）"

## Why

**Past failure (booth project, 2026-05-07)**: An agent doing a long audit dumped a 7-file 5000-word report. The user could not read it, could not make decisions, and the audit produced zero downstream value. The same agent, switched to triage-board mode mid-session, produced a 1-page table — the user scanned it in 60 seconds, signed off Lane A items in batch, and had focused discussion on Lane B items. Same depth of work, 10× the delivered value.

**Past failure (same project, same day)**: Agent proposed three "hook chemistry reactions" (PostToolUse / SessionStart / UserPromptSubmit) as elegant replacements for working polling code. None of them survived a YAGNI self-check on close inspection — one (UserPromptSubmit) was even based on a misunderstanding of hook semantics. All three were retracted. The lesson: "sounds clever" is the precursor to monkey-paw bugs. YAGNI gates this.

The lesson: AI agents are good at producing exhaustive content. Users are bandwidth-limited. Triage is the bandwidth-matching protocol. YAGNI is the trap-avoidance protocol. Both bind by default; opting out requires an explicit reason.

## Relationship to other rules

- **booth-dj-rules** (project-specific) — manages booth bug-handling flow. Compatible: that skill governs research-first; this skill governs the post-research bucketing.
- **rules-as-skills meta** (machine-wide) — auto-loads any `*-rules` skill including this one as MUST-level.
- Pairs with the `booth-dj` Failure Modes catalog (the catalog names the patterns, this skill prevents them at proposal time).

