Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugins/work-items/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "work-items",
"version": "0.12.2",
"version": "0.12.3",
"description": "Manages development work items through a provider-neutral tracker seam that ships with the plugin (bundled dispatcher plus github and local-markdown adapters; seam plugin-dir canonical, adapters consumer-local-first): dashboard, taxonomy-labeled creation, a race-safe assignee-plus-lease claim protocol, recurring-schedule checks, TODO scanning, stale-lease auditing, plan decomposition into vertical-slice items, and raw-intake triage (issues and unsolicited PRs through raw, verified, briefed, autonomous-eligible states). The re-runnable setup skill binds the provider (.work-item-tracker.json), seeds the recurring-schedule seam (.github/recurring-schedule.json), and remaps canonical role labels.",
"author": {
"name": "Melodic Software",
Expand Down
14 changes: 14 additions & 0 deletions plugins/work-items/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,20 @@
All notable changes to the `work-items` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.12.3]

### Fixed

- **Triage's step-2 wait-gate no longer contradicts its own autonomous mode.** The "Recommend
category + state" step ended with a flat "Wait for the user's direction before mutating anything,"
while the AI disclaimer section presupposed the opposite — autonomous/agent sessions that mutate
without a human turn. No branch selected between them, so an operator following step 2 could not triage
autonomously and an autonomous lane necessarily violated step 2. The gate is now an explicit
two-branch direction gate: interactive sessions (a human present, no standing lane rules) keep the
wait-gate; autonomous `/loop` / `/schedule` AFK lanes treat their standing rules as the direction
the gate requires and proceed without a human turn (the mode the AI disclaimer already anticipates),
so the gate is satisfied by the lane's mandate rather than silently ignored.

## [0.12.2]

### Fixed
Expand Down
7 changes: 6 additions & 1 deletion plugins/work-items/skills/triage/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,12 @@ Classify **bug vs enhancement** first — it steers the rest of the flow (bugs g
- **Priority label** (`priority:p0-critical` through `priority:p3-low`)
- **Target state** — from the state machine above: needs-info, briefed for human-gated, or on track to autonomous-eligible

Wait for the user's direction before mutating anything.
**Direction gate.** Recommending is read-only; the gate governs *mutation* — labels, comments, closes, item creation — and which side of it you are on is fixed by how triage was invoked:

- **Interactive session** — a human operator is present and no standing lane rules were supplied. Present the recommendation and **wait for the user's explicit direction** before mutating anything. This is the default whenever the invocation carries no autonomous mandate.
- **Autonomous lane** — triage is running unattended as a `/loop` or `/schedule` AFK session whose standing rules — the directive supplied with its `/loop` / `/schedule` invocation — already authorize triage mutations. Those standing rules **are** the direction this gate requires: treat the gate as satisfied and proceed through verification and outcome without a human turn, prefixing every comment and item you create with the AI disclaimer. There is no operator turn to wait for, so blocking here would deadlock the lane — the gate is met by the lane's mandate, not skipped.

The autonomous branch is the mode the AI disclaimer already anticipates: a session that mutates without a human turn. The two are one mode, not a contradiction.

### 3. Verify — BEFORE any interview

Expand Down
13 changes: 13 additions & 0 deletions plugins/work-items/skills/triage/evals/evals.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,19 @@
"Recognizes that clearing the raw marker does not orphan the item — it re-enters the attention view through the needs-info-with-reporter-activity bucket on reporter reply, not the raw-marker bucket",
"Distinguishes this desired re-entry (needs-info bucket on re-engagement) from the silent-loop re-selection that a leftover raw marker would cause every cycle"
]
},
{
"id": 6,
"name": "triage-autonomous-lane-treats-standing-rules-as-direction",
"prompt": "/work-items:triage 71 — running unattended as a /loop AFK lane whose standing rules authorize triage label and comment mutations; #71 is an external bug report you have just reproduced",
"expected_output": "Recognizes the autonomous branch of the direction gate: the lane's standing rules ARE the direction the gate requires, so it proceeds through verification and outcome without waiting for a human turn rather than blocking (which would deadlock the lane). Applies the outcome's label and comment writes and prefixes every comment and item it creates with the AI disclaimer. Does not fall back to the interactive wait-gate, which applies only when a human operator is present and no standing lane rules were supplied.",
"files": [],
"expectations": [
"Selects the autonomous-lane branch of the direction gate — the /loop standing rules satisfy the direction requirement, so mutation proceeds without a human turn",
"Does NOT wait for explicit user direction — that gate is the interactive-session default, not the autonomous-lane path; blocking here would deadlock the lane",
"Prefixes every comment and item it creates with the AI disclaimer during the autonomous session",
"Routes the label/comment writes through the bound adapter's mechanics and any item creation through the seam `create-item` — no inline provider commands"
]
}
]
}
Loading