fix(work-items): triage outcomes must clear the raw-intake marker - #527
Conversation
Step 5 "Apply outcome" listed the labels each outcome adds but never said to remove status:needs-triage, so applying an outcome stacked status:ready and the role label on top of the raw marker. The open-only attention view re-selects any item still carrying the marker, re-triaging the same items forever (silent-loop-kill class). Step 5 now frames every outcome as a transition off raw that replaces the marker, and a closing invariant forbids a raw marker alongside a briefed/ready or role label on an open item. Adds an eval asserting the marker-clearing behavior. Patch bump 0.12.1 -> 0.12.2. Closes #488 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011V31qpAHP3jfs76B9d5Rfo
|
Claude finished @kyle-sexton's task in 2m 9s —— View job PR Review
Summary: The fix is correct and well-scoped. The silent-loop bug is real — the outcome table was adding labels without clearing the raw marker, and the attention view's open-item + raw-marker query would re-select the item on every triage cycle. No blocking issues; one important observation about coverage and a couple of nits. Findings🟡 Nit — Eval covers briefed-delegable only; The closing invariant explicitly names
A fifth eval with 🟡 Nit — Lead-in paragraph position leaves a reading-order ambiguity for The lead-in (line 106) says "every outcome clears
✅ Fix logic — correct The "same edit" requirement in the lead-in paragraph handles atomicity correctly: if the remove and add were separate calls there would be a race window. Naming the simultaneous mutation collapses that window. The close branch being called out separately (raw marker becomes moot, item falls off the open-only frontier) is the right call — an absolute "no outcome ever leaves a raw marker" would be technically false for closes (closing doesn't strip labels), and the current invariant language is precise about why the close branch is safe. ✅ Triage state round-trip for Clearing ✅ Version bump — correctly scoped
✅ No security or blocking issues This is a documentation-only change to a Markdown skill file. None of the REVIEW.md blocking criteria (authorization checks, tenant scoping, secrets, injection, audit logging, atomicity across multiple state writes) apply here. Verdict: Approve with the eval gap noted as a follow-up suggestion. The fix is correct, the invariant language is precise, and the versioning is right. |
Eval #4 exercised only the briefed-delegable open outcome. The closing invariant names status:needs-info as the other open outcome that must clear status:needs-triage, and its re-entry path differs (attention-view needs-info bucket on reporter reply, not the raw-marker bucket). Add eval #5 to prove an agent clears the raw marker on the needs-info outcome without orphaning the item. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 13s —— View job PR Review
What changed since the last reviewThe latest commit ( Findings✅ Previous nit resolved — The new eval covers all four distinct aspects of the
The
🟡 Remaining nit — table-row scanability (still open, still non-blocking) The previous review noted that the ✅ Overall Both commits are correct. The fix is sound, the eval set now covers all open-outcome paths (briefed-delegable + needs-info), and no new issues were introduced. The second prior nit is the only open item and it is non-blocking. Verdict: ready to merge. |
|
Thanks for the review. Both items are non-blocking nits; classification below.
Verdict acknowledged as Approve. No blocking findings. |
Summary
The
work-items:triageskill's "Apply outcome" step (step 5) listed the labels each terminal outcome adds but never said to remove the raw-intake marker (status:needs-triage). Applying an outcome therefore stackedstatus:ready+ the role label on top ofneeds-triage. The attention view lists open items and re-selects anything still carrying the raw marker, so every triaged item re-entered triage forever — the silent-loop-kill class (#480).Fix
Two edits to
plugins/work-items/skills/triage/SKILL.md, plus an eval and the version/CHANGELOG bump. Marker clearing is stated once as a normalization principle covering all rows (rather than repeated per row).Step 5 lead-in (new — before the outcome table):
Closing invariant (new — end of step 5):
The close/open split is deliberate: an absolute "no outcome leaves a raw marker" is false for closes (closing does not strip labels), so the invariant names the mechanism that actually kills the loop for each branch.
The marker is unambiguously
status:needs-triage(Status axis —label-taxonomy.mdline 20; Triage states table line 46). The issue's "priority: needs-triage" is a misstatement (thepriority:axis encodes p0–p3 urgency), so no new label was invented and the existing state-machine vocabulary is used throughout.Also added eval #4 (
triage-outcome-clears-the-raw-intake-marker) asserting the marker is cleared in the same edit as the outcome labels. Patch bump0.12.1→0.12.2(docs/behavior fix) +### FixedCHANGELOG entry.Verification
Repo-pinned gates on the changed files, all green:
markdownlint-cli2(.markdownlint-cli2.jsonc) onSKILL.md+CHANGELOG.md—Summary: 0 error(s)typos(_typos.toml) on all changed files — exit 0editorconfig-checker(.editorconfig-checker.json) on all 4 changed files —0 errorsscripts/validate-plugins.sh—All plugin manifests and the catalog validatedscripts/validate-plugin-contracts.mjs—33 setup skills and 1586 plugin files checkedevals.json+plugin.jsonparse as valid JSONRelated
Closes #488
🤖 Generated with Claude Code