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:
Freeze before proposing. No "let me suggest..." until the board is written.
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)
Run the YAGNI self-check on any item introducing new mechanism / defensive / future / replacement.
Sort into Lane A / B1 / B2.
Write the board: each item one or two lines, no jargon, in a table or short list.
Hand to the user. Wait for sign-off on Lane A items in batch + targeted decisions on B1/B2.
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).
1---2name: triage-rules3description: 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.4---56# Triage — Two-Axis Decision Lanes78A `*-rules` hard-constraint skill (loaded by the rules-as-skills meta protocol). MUST/NEVER statements are binding, not advisory.910## Trigger1112Activates the moment any of these is true:1314- Just finished an audit, survey, code-walk, or research phase that produced ≥2 findings15- Received a batch of bug reports, issues, or todo items from the user16- About to propose actions on a list of items17- About to introduce a new mechanism, hook, dependency, configuration field, or abstraction18- About to add defensive code "just in case" or "for future flexibility"19- About to replace a working mechanism with a more elegant but more complex alternative2021If the agent is about to write a multi-paragraph proposal touching ≥2 distinct items, this skill MUST run first.2223## MUST2425- **MUST classify EACH item by two axes BEFORE writing any proposal:**26 - **Confidence** — how sure are you in the diagnosis / direction? (高 / 中 / 低)27 - **Blast radius** — if you act and you are wrong, what breaks? (reversible / local damage / colossal-or-irreversible)2829- **MUST output a decision board** (短表格 / 短列表 with one line per item), NOT a long narrative.3031- **MUST place each item in exactly one lane:**32 - **Lane A** — auto-execute (high confidence + low blast radius)33 - **Lane B1** — recommend & escalate (high confidence + high blast radius / irreversible)34 - **Lane B2** — discuss with options (low confidence regardless of blast radius)3536- **MUST give Lane B1/B2 items concrete options + tradeoffs in plain language.** No undefined jargon. Rank options when possible. State your recommendation explicitly.3738- **MUST tell the user what is in each lane** before executing anything, so they have ~30 seconds to redirect a misclassified item.3940- **MUST run a YAGNI self-check on any item that:**41 - Introduces a new mechanism (hook, socket, IPC field, config option, parameter)42 - Adds defensive code "in case X happens"43 - Adds an abstraction "we might need later"44 - Replaces a working mechanism with a more elegant but more complex alternative4546 The single question: **"Would a real user fail RIGHT NOW without this? Or am I anticipating a problem that hasn't happened?"**4748 - Answer YES → ship it.49 - Answer NO or "not sure" → backlog it, do not ship.50 - YAGNI failure with high confidence + low risk → reflect, drop it.51 - YAGNI failure with uncertainty or high risk → escalate to user.5253## NEVER5455- **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.5657- **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.5859- **NEVER produce a wall-of-text audit when a triage board would convey the same information.** Length is not depth — it is friction.6061- **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.6263- **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.6465- **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.6667- **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).6869## How to Apply7071When the trigger condition fires:72731. **Freeze before proposing.** No "let me suggest..." until the board is written.74752. For each finding/item, ask:76 - (a) How confident am I in the diagnosis or direction? (高/中/低)77 - (b) If I act and I am wrong, what breaks and is it recoverable? (reversible / local damage / colossal)78793. Run the YAGNI self-check on any item introducing new mechanism / defensive / future / replacement.80814. Sort into Lane A / B1 / B2.82835. Write the board: each item one or two lines, no jargon, in a table or short list.84856. Hand to the user. Wait for sign-off on Lane A items in batch + targeted decisions on B1/B2.86877. Execute only what the user has authorized.8889## Example board format9091```92| 项 | 描述 | Lane | 备注 |93|----|------|------|------|94| 1 | xxx | A | 自信高 + 改 1 个文件 |95| 2 | yyy | B1 | 自信高 + 删 21 个 worktree(不可逆)— 推荐 dry-run 先过目 |96| 3 | zzz | B2 | 不确定 root cause;选项:(a) ... (b) ...,倾向 (a) |97```9899Then explicitly:100- "Lane A 我准备直接干(项 1)"101- "Lane B1 等你拍板(项 2)"102- "Lane B2 等你选(项 3)"103104## Why105106**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.107108**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.109110The 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.111112## Relationship to other rules113114- **booth-dj-rules** (project-specific) — manages booth bug-handling flow. Compatible: that skill governs research-first; this skill governs the post-research bucketing.115- **rules-as-skills meta** (machine-wide) — auto-loads any `*-rules` skill including this one as MUST-level.116- Pairs with the `booth-dj` Failure Modes catalog (the catalog names the patterns, this skill prevents them at proposal time).