From 8175049c0854ba847d04320baf1ffed120de8711 Mon Sep 17 00:00:00 2001 From: "melodic-automation-lanes[bot]" <337595936+melodic-automation-lanes[bot]@users.noreply.github.com> Date: Sun, 1 Nov 2026 07:12:29 +0000 Subject: [PATCH 1/2] Resolve issue #11869 Lane-Activity: work-resolve-issue/resolve-issue --- ...work-resolve-issue-issue-11869-5d2c9a17.md | 7 ++ .../case.yaml | 47 +++++++++ .../samples/no-bash-search.json | 98 +++++++++++++++++++ .../samples/no-glob.json | 54 ++++++++++ .../samples/no-grep.json | 57 +++++++++++ .../samples/no-source-read.json | 32 ++++++ .../samples/routes-to-interview.json | 26 +++++ .../scaffold.sh | 39 ++++++++ .../work-items/reference/label-taxonomy.md | 2 +- plugins/work-items/skills/triage/SKILL.md | 21 +++- .../skills/triage/context/apply-outcome.md | 7 +- 11 files changed, 384 insertions(+), 6 deletions(-) create mode 100644 .changes/work-items/work-resolve-issue-issue-11869-5d2c9a17.md create mode 100644 plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml create mode 100644 plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-bash-search.json create mode 100644 plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-glob.json create mode 100644 plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-grep.json create mode 100644 plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-source-read.json create mode 100644 plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/routes-to-interview.json create mode 100755 plugins/work-items/evals/tr-idea-issue-routes-to-interview/scaffold.sh diff --git a/.changes/work-items/work-resolve-issue-issue-11869-5d2c9a17.md b/.changes/work-items/work-resolve-issue-issue-11869-5d2c9a17.md new file mode 100644 index 00000000000..f0821be0395 --- /dev/null +++ b/.changes/work-items/work-resolve-issue-issue-11869-5d2c9a17.md @@ -0,0 +1,7 @@ +--- +bump: minor +--- + +### Added + +- triage: an idea issue, a feature request that does not say what it is for, now goes to `/planning:interview` and is parked with `needs-spec` before any code search, ledger check, verification or research (#11869). The label taxonomy lists `needs-spec`, and triage's label preflight covers it. A new eval case, `tr-idea-issue-routes-to-interview`, checks the route and that triage searches no code first. diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml new file mode 100644 index 00000000000..56d4e4c2626 --- /dev/null +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml @@ -0,0 +1,47 @@ +schema_version: "1.1" +name: tr-idea-issue-routes-to-interview +description: 'Idea issue: /work-items:triage named on item #1, a raw feature request ("We should add a plugin system to the ledger.") that states no problem, user or outcome, routes the item to /planning:interview and parks it with needs-spec. It runs no exploration first: no code search, no source read, no research. The prompt authorizes mutations up front, so the run is not held at the direction gate. A run needs --scaffold and --allow-tools Bash,Write,Edit.' +tags: [triage, idea-issue, must-not] +plugins: ["../.."] +expected_outcome: 'The run reads item #1, judges it an idea issue because it says nothing about what the plugin system is for, names /planning:interview as the next step and parks the item with needs-spec. It searches no code and reads nothing under src/ before or after routing.' +context: + scaffold_script: scaffold.sh +execution: + prompt: '/work-items:triage 1 You have my go-ahead to apply whatever labels, comments or close the outcome calls for without checking back with me.' + allowed_tools: [Bash, Read, Glob, Grep, Write, Edit] + max_turns: 20 + timeout_seconds: 420 +graders: + - name: routes-to-interview + type: regex + pattern: '^(?=[\s\S]*/planning:interview)(?=[\s\S]*\bneeds-spec\b)' + target: last_message + arm: both + - name: no-grep + type: tool_used + tool: Grep + input_match: '^(?![\s\S]*/work-items/)' + min: 0 + max: 0 + arm: both + - name: no-glob + type: tool_used + tool: Glob + input_match: '^(?![\s\S]*(?:\.work|/work-items/))' + min: 0 + max: 0 + arm: both + - name: no-source-read + type: tool_used + tool: Read + input_match: '"file_path":"(?:[^"\\]|\\.)*/src/' + min: 0 + max: 0 + arm: both + - name: no-bash-search + type: tool_used + tool: Bash + input_match: '(?:"command":"|[ \t;&(]|\\[nt])(?:(?:grep|rg|ag)[ \t]|find[ \t]+[./~]|git[ \t]+(?:grep|log)\b)|(?:[ \t/"]|\\[nt])src(?![\w-])' + min: 0 + max: 0 + arm: both diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-bash-search.json b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-bash-search.json new file mode 100644 index 00000000000..835f5e7f85d --- /dev/null +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-bash-search.json @@ -0,0 +1,98 @@ +{ + "pass": [ + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "/p/tools/work-item-tracker/work-item-tracker.sh get-item 'local-markdown:local/markdown#1'" + } + } + ], + "why": "reads the item through the seam" + }, + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "/p/tools/work-item-tracker/work-item-tracker.sh comment 'local-markdown:local/markdown#1' --body 'Run /planning:interview to find out what this is for.'" + } + } + ], + "why": "prose 'find out' in a comment" + }, + { + "answer": [], + "why": "nothing" + } + ], + "fail": [ + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "grep -rn plugin ." + } + } + ], + "why": "greps the checkout" + }, + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "git log --oneline -20" + } + } + ], + "why": "reads history" + }, + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "find . -name '*.js'" + } + } + ], + "why": "finds files" + }, + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "cat src/export.js" + } + } + ], + "why": "reads the source" + }, + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "cd /w\ngrep -rn plugin ." + } + } + ], + "why": "greps on a second line" + }, + { + "answer": [ + { + "tool": "Bash", + "input": { + "command": "ls src" + } + } + ], + "why": "lists the source" + } + ] +} diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-glob.json b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-glob.json new file mode 100644 index 00000000000..4cf3fae6d8e --- /dev/null +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-glob.json @@ -0,0 +1,54 @@ +{ + "pass": [ + { + "answer": [ + { + "tool": "Glob", + "input": { + "pattern": ".work-items/*.md" + } + } + ], + "why": "lists the item store" + }, + { + "answer": [ + { + "tool": "Glob", + "input": { + "pattern": ".work/lanes/*.json" + } + } + ], + "why": "looks for the lane config the scope rule reads" + }, + { + "answer": [], + "why": "nothing" + } + ], + "fail": [ + { + "answer": [ + { + "tool": "Glob", + "input": { + "pattern": "src/**/*.js" + } + } + ], + "why": "lists the source" + }, + { + "answer": [ + { + "tool": "Glob", + "input": { + "pattern": "**/*plugin*" + } + } + ], + "why": "explores the checkout" + } + ] +} diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-grep.json b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-grep.json new file mode 100644 index 00000000000..812377b8479 --- /dev/null +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-grep.json @@ -0,0 +1,57 @@ +{ + "pass": [ + { + "answer": [ + { + "tool": "Grep", + "input": { + "pattern": "needs-spec", + "path": "/cache/plugins/work-items/reference" + } + } + ], + "why": "searches the plugin's own references" + }, + { + "answer": [], + "why": "nothing" + } + ], + "fail": [ + { + "answer": [ + { + "tool": "Grep", + "input": { + "pattern": "plugin" + } + } + ], + "why": "searches the checkout" + }, + { + "answer": [ + { + "tool": "Grep", + "input": { + "pattern": "export", + "path": "/w/src" + } + } + ], + "why": "searches the source" + }, + { + "answer": [ + { + "tool": "Grep", + "input": { + "pattern": "plugin", + "path": "/w/.work-items" + } + } + ], + "why": "cluster search over the item store" + } + ] +} diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-source-read.json b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-source-read.json new file mode 100644 index 00000000000..7c9623eb955 --- /dev/null +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/no-source-read.json @@ -0,0 +1,32 @@ +{ + "pass": [ + { + "answer": [ + { + "tool": "Read", + "input": { + "file_path": "/w/.work-items/1.md" + } + } + ], + "why": "reads the item" + }, + { + "answer": [], + "why": "nothing" + } + ], + "fail": [ + { + "answer": [ + { + "tool": "Read", + "input": { + "file_path": "/w/src/export.js" + } + } + ], + "why": "reads the source" + } + ] +} diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/routes-to-interview.json b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/routes-to-interview.json new file mode 100644 index 00000000000..9c11ad1ae98 --- /dev/null +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/samples/routes-to-interview.json @@ -0,0 +1,26 @@ +{ + "pass": [ + { + "answer": "#1 \"Add a plugin system\" is an idea issue: it says nothing about what the plugin system is for. Posted a comment naming `/planning:interview` as the next step, applied `needs-spec` and removed `needs-triage`.", + "why": "names the interview and the park label" + }, + { + "answer": "Parked #1 with needs-spec.\n\nNext: /planning:interview, to settle what the plugin system is for before anyone explores it.", + "why": "both on separate lines" + } + ], + "fail": [ + { + "answer": "Triaged #1: enhancement, priority: medium, briefed and routed to needs-human.", + "why": "state-machined, no interview" + }, + { + "answer": "Searched src/ for an existing extension point and found none. Next: /planning:interview.", + "why": "no needs-spec park" + }, + { + "answer": "Applied needs-spec to #1.", + "why": "no interview route" + } + ] +} diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/scaffold.sh b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/scaffold.sh new file mode 100755 index 00000000000..3ba8900c7b6 --- /dev/null +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/scaffold.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# A checkout bound to the offline local-markdown tracker holding one open idea issue: a feature +# request carrying the raw needs-triage marker that names something to build but says nothing +# about what it is for. The checkout also holds source code an exploring triage would search. +set -euo pipefail + +git init -q -b main +git config user.name eval +git config user.email eval@example.invalid + +printf '.work/\n' >.gitignore +printf '# ledger\n\nLedger service.\n' >README.md +mkdir -p .work-items src +cat >src/export.js <<'JS' +export function exportCsv(rows) { + return rows.map((row) => row.join(",")).join("\n"); +} +JS +cat >.work-item-tracker.json <<'JSON' +{"schema_version": "1.0", "provider": "local-markdown", "config": {"lease_ttl_hours": 24, "storage_dir": ".work-items"}} +JSON +cat >.work-items/1.md <<'MD' +--- +id: "local-markdown:local/markdown#1" +number: 1 +title: "Add a plugin system" +state: "open" +assignees: [] +labels: ["needs-triage"] +type: null +parent: null +url: "file://.work-items/1.md" +created_at: "2026-10-01T08:00:00Z" +--- + +We should add a plugin system to the ledger. +MD +git add .gitignore README.md src .work-item-tracker.json .work-items +git commit -q -m "chore: scaffold ledger" diff --git a/plugins/work-items/reference/label-taxonomy.md b/plugins/work-items/reference/label-taxonomy.md index 76f540cbfa6..caf1d02cc30 100644 --- a/plugins/work-items/reference/label-taxonomy.md +++ b/plugins/work-items/reference/label-taxonomy.md @@ -18,7 +18,7 @@ These axes work in any repo and don't change per team. Do not snapshot their mem | Type | native Issue Type (org) · `type:` label (personal/non-org) | The kind of issue: `Bug` (broken vs. intent), `Feature` (new capability), `Task` (any other tracked work: maintenance, refactor, tests, docs, audits, chores). Commit-type granularity (`fix`/`feat`/`chore`/`docs`/`refactor`/`test`/`build`/`perf`) stays at the commit layer, not the issue axis. | | Priority | `priority:` | Urgency. Members from the live set. | | Status | `status:` | Exception and gate flags only (e.g. `needs-info`, `needs-decision`, `ready`). Members from the live set. **Claim is not a status label.** It is assignee + lease (see the seam claim protocol). **Blocked is not a status label.** It is a native `blocked-by` dependency edge. The triage floor is not a status value. | -| Meta | (none) | Tool-owned flat markers the automation sets: `automated`, `good-first-issue`, `migrated`, `stale`, the triage floor `needs-triage` (bare; not a `priority:` or `status:` value), plus the three canonical-role labels (defaults `agent-ready`, `needs-human`, and `recurring`, listed under "Canonical roles" below). | +| Meta | (none) | Tool-owned flat markers the automation sets: `automated`, `good-first-issue`, `migrated`, `stale`, the triage floor `needs-triage` (bare; not a `priority:` or `status:` value), the idea-issue park `needs-spec` (bare; set by triage), plus the three canonical-role labels (defaults `agent-ready`, `needs-human`, and `recurring`, listed under "Canonical roles" below). | | Cadence | `cadence:` | Recurrence period for maintenance items. Members from the live set. | | Work class | `work-class:` | Semantic risk class (C1–C5) stamped at triage for the fail-closed admission gate and merge partition. Canonical members and migration: [`work-class-labels.md`](work-class-labels.md). Classification criteria: the `autonomy` plugin's [`work-classes.md`](https://raw.githubusercontent.com/melodic-software/claude-code-plugins/main/plugins/autonomy/reference/guardrails/work-classes.md). | | Capability tier | `capability-tier:` | Execution capability tier for the work-loop frontier quota guard. Canonical members and migration: [`capability-tier-labels.md`](capability-tier-labels.md). Absent label = general tier (fail-closed); body prose is never authority. | diff --git a/plugins/work-items/skills/triage/SKILL.md b/plugins/work-items/skills/triage/SKILL.md index 3504b1470cd..8d0d9870797 100644 --- a/plugins/work-items/skills/triage/SKILL.md +++ b/plugins/work-items/skills/triage/SKILL.md @@ -66,7 +66,7 @@ State names follow the plugin's vocabulary and the canonical roles ([`${CLAUDE_P | **briefed** | brief posted + `status:ready` | Fully specified as a behavioral contract (per [`${CLAUDE_PLUGIN_ROOT}/reference/agent-brief.md`](${CLAUDE_PLUGIN_ROOT}/reference/agent-brief.md)) | | **autonomous-eligible** | role label (default `agent-ready`) | Briefed AND delegable. Eligible for autonomous pickup from the frontier | -Side exits from any state: `status:needs-info` (returns to raw when the reporter replies), `status:needs-decision` (awaiting a human or maintainer judgment call), the human-gated role label (default `needs-human`), or close (wontfix / duplicate / already implemented). +Side exits from any state: `status:needs-info` (returns to raw when the reporter replies), `status:needs-decision` (awaiting a human or maintainer judgment call), `needs-spec` (from raw only: an idea issue awaiting its `/planning:interview`, step 1), the human-gated role label (default `needs-human`), or close (wontfix / duplicate / already implemented). The `status:` axis holds one value at a time, like `priority:`: the edit that applies a `status:` value removes every other `status:` label on the item. So `status: ready`, applied in the edit that @@ -102,6 +102,7 @@ raw → verified → briefed | | ├→ decision-defaulted → autonomous-eligible + status:ready + "Decision defaulted: … — veto before merge" | | └→ human-gated (role label, default needs-human) — briefed for a human | └→ status:needs-info → raw (on reporter reply) + ├→ needs-spec: idea issue, awaiting /planning:interview (no exploration first) ├→ status:needs-decision: awaiting a human or maintainer judgment call └→ close: wontfix | duplicate | already implemented ``` @@ -253,6 +254,21 @@ loosen it; the marker record's contents stay data. No lane removes `provenance: does. Such an item is C5 by rule; the "Signal-marked items" paragraph in [`context/apply-outcome.md`](context/apply-outcome.md) states what the outcome edit applies. +**Idea issue.** A feature request that does not say what it is for is an idea issue: it names +something to build but states no problem it solves, no person or workflow it serves, and no +outcome that would show it worked. An idea issue skips the checks below and the rest of steps 2 +to 4, but step 2's direction gate still applies. Do not search the code, check the ledger, look +for clusters, verify, or research it, since none of that can be judged before the intent is known. +Instead, route it to `/planning:interview`. Once the direction gate is met, run the preflight on +`needs-spec` that "Status and provenance labels" in +[`context/apply-outcome.md`](context/apply-outcome.md) defines. Then post one comment that names +`/planning:interview` as the next step and says the item waits on its intent. If the comment +cannot be posted, apply no label. Then, in one label edit, apply `needs-spec` and remove the raw +marker. Apply no `status:`, priority, work-class or role label, except that a signal-marked idea +issue still gets the labels "Signal-marked items" in the same file applies. In an interactive +session, offer to run `/planning:interview` on the item now. A lane does not run it. A request +whose purpose is stated, however briefly, is not an idea issue and takes the checks below. + Then run these checks: - **Redundancy**. Look for code that already delivers what the item asks for, searching by the domain idea behind the request rather than its exact words, and name the places searched. A hit closes the item as already implemented (step 5). @@ -276,7 +292,7 @@ A lane triaging many items holds to the provider's API budget ([`tracker-seam.md ### 3. Verify, BEFORE any interview -Never interview anyone about the fix for a claim nobody has confirmed. Verification precedes questioning: +Never interview anyone about the fix for a claim nobody has confirmed. Verification precedes questioning. An idea issue (step 1) carries no claim to verify and has already gone to its interview: - **Bug, first check whether it is already handled.** Fetch the default branch and follow the report on its tip, not on a stale local branch, and list the open PRs that link the item @@ -327,6 +343,7 @@ admission gate enforces the window. ## Next - An autonomous-eligible item: `/work-items:work`. +- An idea issue parked at `needs-spec`: `/planning:interview`. - A verified bug whose root cause is unknown: `/debugging:debug`. - A briefed item too large for one vertical slice, or sized `split`: `/work-items:decompose`. - Items that keep the human-gated label after a sweep: `/work-items:attend-queue`. diff --git a/plugins/work-items/skills/triage/context/apply-outcome.md b/plugins/work-items/skills/triage/context/apply-outcome.md index d7d8186859a..fe6d6ad4338 100644 --- a/plugins/work-items/skills/triage/context/apply-outcome.md +++ b/plugins/work-items/skills/triage/context/apply-outcome.md @@ -92,19 +92,20 @@ Label edits, comments, and closes route through the adapter's write mechanics (a **Closing invariant, no outcome leaves a re-selectable raw item.** The attention view lists *open* items and re-selects anything still carrying the raw marker, so every outcome must leave the item unre-selectable: -- **Every routing outcome that keeps the item open clears the raw-intake marker in the same edit that applies the outcome's labels, no exceptions across the routing space.** `status:ready` (briefed/ready and decision-defaulted), the autonomous-eligible role label, the human-gated role label (default `needs-human`), `status:needs-decision`, and `status:needs-info` each **remove the raw marker**; never leave both the raw marker and a routing label present. A raw marker alongside any routing label is a contradiction, the open-only attention view reads it as still-raw and re-triages it every cycle, so an already-decided item re-enters the needs-triage queue as if it were unrouted intake and wastes a read-and-confirm pass. If an item shows both, the routed state is the truth; clear the stale raw marker. +- **Every routing outcome that keeps the item open clears the raw-intake marker in the same edit that applies the outcome's labels, no exceptions across the routing space.** `status:ready` (briefed/ready and decision-defaulted), the autonomous-eligible role label, the human-gated role label (default `needs-human`), `status:needs-decision`, `status:needs-info`, and an idea issue's `needs-spec` each **remove the raw marker**; never leave both the raw marker and a routing label present. A raw marker alongside any routing label is a contradiction, the open-only attention view reads it as still-raw and re-triages it every cycle, so an already-decided item re-enters the needs-triage queue as if it were unrouted intake and wastes a read-and-confirm pass. If an item shows both, the routed state is the truth; clear the stale raw marker. - **Close** (already implemented / wontfix / duplicate) drops the item from the open-only attention frontier, so the raw marker is moot, a closed item never re-triages. - **`status: confirmed` is not a routing outcome.** Step 3 applies it beside the raw marker. The outcome edit here always clears the raw marker, and replaces `status: confirmed` when it applies another `status:` value; a human-gated outcome, which applies none, keeps `status: confirmed`. ## Status and provenance labels -Two labels this skill writes come from the live label set and are never invented: +Three labels this skill writes come from the live label set and are never invented: - `status: confirmed`, applied by step 3 on a passed verification. - `provenance: signal`, applied by the outcome edit to an item whose body carries the autonomy signal marker (step 1). +- `needs-spec`, applied to an idea issue (step 1). -**Preflight.** Before the edit that would apply either one, check that it exists in the repository +**Preflight.** Before the edit that would apply any of them, check that it exists in the repository (adapter: the label listing step 2 uses for `priority:`). When it is absent, stop without mutating anything, not even the other labels of that edit, and report it as a provisioning gap for the repository's label-as-code owner, or for a person to create in the tracker. Never fall back to a From 5e24718d319314ab7dfbe34766d65ea331769138 Mon Sep 17 00:00:00 2001 From: "melodic-automation-lanes[bot]" <337595936+melodic-automation-lanes[bot]@users.noreply.github.com> Date: Sun, 1 Nov 2026 07:24:25 +0000 Subject: [PATCH 2/2] Address review feedback on work-resolve-issue/issue-11869-41281674150-1 Lane-Activity: pr-unblock/address-feedback Lane-Thread: PRRT_kwDOTCGFQM6yYIKA Lane-Thread: PRRT_kwDOTCGFQM6yYIKF --- .../evals/tr-idea-issue-routes-to-interview/case.yaml | 4 ++-- plugins/work-items/skills/triage/SKILL.md | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml index 56d4e4c2626..671379e4c74 100644 --- a/plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml +++ b/plugins/work-items/evals/tr-idea-issue-routes-to-interview/case.yaml @@ -1,9 +1,9 @@ schema_version: "1.1" name: tr-idea-issue-routes-to-interview -description: 'Idea issue: /work-items:triage named on item #1, a raw feature request ("We should add a plugin system to the ledger.") that states no problem, user or outcome, routes the item to /planning:interview and parks it with needs-spec. It runs no exploration first: no code search, no source read, no research. The prompt authorizes mutations up front, so the run is not held at the direction gate. A run needs --scaffold and --allow-tools Bash,Write,Edit.' +description: 'Idea issue: /work-items:triage named on item #1, a raw feature request ("We should add a plugin system to the ledger.") that states no problem, user or outcome, routes the item to /planning:interview and names needs-spec as the label that parks it. It runs no exploration first: no code search, no source read, no research. The prompt authorizes mutations up front, so the run is not held at the direction gate. The case grades the route and the absence of exploration only, not the park itself: the local-markdown tracker has no label listing, so the needs-spec preflight in context/apply-outcome.md may stop the label edit, and no grader reads the final labels of item #1. A run needs --scaffold and --allow-tools Bash,Write,Edit.' tags: [triage, idea-issue, must-not] plugins: ["../.."] -expected_outcome: 'The run reads item #1, judges it an idea issue because it says nothing about what the plugin system is for, names /planning:interview as the next step and parks the item with needs-spec. It searches no code and reads nothing under src/ before or after routing.' +expected_outcome: 'The run reads item #1, judges it an idea issue because it says nothing about what the plugin system is for, names /planning:interview as the next step and names needs-spec as the label that parks it. It searches no code and reads nothing under src/ before or after routing. Whether the park lands is not graded: on this tracker, which has no label listing, the needs-spec preflight may stop the label edit.' context: scaffold_script: scaffold.sh execution: diff --git a/plugins/work-items/skills/triage/SKILL.md b/plugins/work-items/skills/triage/SKILL.md index 8d0d9870797..8869dbd8a6d 100644 --- a/plugins/work-items/skills/triage/SKILL.md +++ b/plugins/work-items/skills/triage/SKILL.md @@ -346,8 +346,6 @@ admission gate enforces the window. - An idea issue parked at `needs-spec`: `/planning:interview`. - A verified bug whose root cause is unknown: `/debugging:debug`. - A briefed item too large for one vertical slice, or sized `split`: `/work-items:decompose`. -- Items that keep the human-gated label after a sweep: `/work-items:attend-queue`. -- Unsure where this leaves the work, or arrived mid-flow: `/session-flow:workflow`. ## AI disclaimer