fix(work-items): clear raw-intake marker on every triage side-exit (#562)#728
Conversation
) The triage skill's closing invariant only named `status:ready` and the two role labels as contradictory with the raw-intake marker, and pinned the marker to a hardcoded `status:needs-triage` string. A status side-exit — `status:needs-decision`, `status:needs-info`, human-gated, or the terminal `status:ready` — could leave the raw marker attached, so an already-decided item (e.g. #505) resurfaced in the next cycle's needs-triage queue as unrouted intake, wasting a read-and-confirm pass every cycle. Make the invariant exhaustive across the routing space — every open-keeping outcome removes the raw marker in the same edit — and frame it around the abstract raw-intake marker resolved from the live label set rather than a hardcoded prefix, so it holds regardless of which axis a repo files `needs-triage` under. Doc-only; extends the #478 routing rules already absorbed into the triage SKILL.md. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 43s —— View job PR Review
Summary: Doc-only patch to One structural observation and two minor inconsistencies worth flagging:
The updated invariant at SKILL.md line 144 now explicitly names The invariant tells agents "if you applied this label, also clear the raw marker", which is correct. But without a table row, an agent has no signal for when this label is appropriate versus the existing Attention view and state table still hardcode The "Apply outcome" preamble now correctly abstracts the raw marker to "resolved from the live set (whichever axis the repo files it under)". But two other locations still reference it by name:
This is consistent with the PR description's acknowledgment that reconciling the axis mismatch ( Everything else looks good. The invariant rewrite at line 144 is substantially more correct than what it replaces: the previous version only named |
|
Post-green review pass complete (rule 8). Bot review classification:
Both are cosmetic-doc-consistency, not DEFER-FORBIDDEN classes (no data-loss/fail-open-gate/security-posture/silent-wrong-output). No inline threads, CI fully green (18/18). Flipping to ready for review; handing off to the babysit lane for merge. |
|
Claude finished @kyle-sexton's task in 1m 1s —— View job Babysit / Merge-Readiness Pass
Verdict: Ready to Merge ✅CI: All prerequisite checks green — Diff review (3 files):
Previous review findings: Both nits (# No new findings from this pass. The change is doc-only with no security surface, and the fix is substantively correct. |
Summary
The
/work-items:triageskill's closing invariant did not reliably clear the raw-intakeneeds-triagemarker when routing an item to a status side-exit. Its enumeration only namedstatus:readyand the two role labels as contradictory with the raw marker, omittingstatus:needs-decisionandstatus:needs-info, and it pinned the marker to a hardcodedstatus:needs-triagestring. As a result an already-decided item could keep the raw marker and resurface in the next cycle's needs-triage queue as if it were unrouted intake — wasting a read-and-confirm pass every cycle.Fix
Doc-only change to
plugins/work-items/skills/triage/SKILL.md:status:ready(briefed/ready and decision-defaulted), the autonomous-eligible role label, the human-gated role label (needs-human),status:needs-decision, andstatus:needs-info— removes the raw marker in the same edit that applies the outcome's labels; never leave both present.needs-triageunder (this repo deploys it aspriority: needs-triage; the plugin's own taxonomy grammar mandates reading members from the live set).Extends the
#478routing rules already absorbed into the triageSKILL.md(that issue is closed; the skill is now the invariant's natural home).Follow-up findings (non-blocking, out of this PR's charter)
priority: needs-triage, butSKILL.md(state table, attention view),evals.json, and the two reference docs snapshot it asstatus:needs-triage. The abstract framing here makes the fix correct regardless; reconciling the axis mismatch is a maintainer taxonomy decision spanning shared docs.status:needs-decisionis a live routing outcome (#505carries it) that the triage state machine does not model (its briefed exits are delegable / decision-defaulted / human-gated / needs-info). Worth a follow-up to align the state machine with the deployed label set.Verification
Branch fast-forwarded to current
origin/mainbefore verifying (it was 3 commits behind, which produced a falseskill-qualityparity flag until updated).scripts/validate-plugins.sh— all plugin manifests + catalog:Validation passedscripts/check-changelog-parity.sh --check-bump origin/main—Every plugin whose version changed vs origin/main has a '## [<version>]' CHANGELOG.md entry.scripts/check-skill-portability.sh origin/main—No unexcused coupling tokens in 1 skill file(s).scripts/check-changed-skills.sh origin/main—CHECK-SKILL triage: PASS — 0 errors, 1 warning(s)(pre-existing no-Gotchas warning)scripts/check-skill-leaf-names.sh --check—All 8 cross-plugin skill leaf-name collisions are registered.markdownlint-cli2on both changed markdown files —Summary: 0 error(s)plugin.json— valid JSON; version bumped0.16.0->0.16.1Closes #562
Related
status:needs-decisionbut still carried the raw marker)