fix(work-items): re-key triage scope on state, not authorship (#486)#802
Conversation
The triage skill defined raw intake as "items the team did not author," which contradicted the plugin's own self-observation filing contract: team-authored dogfood issues carry only the raw marker, surface in the same attention view, and genuinely need triage. Redefine raw intake as any untriaged item carrying the raw marker, whoever authored it, across the scope section, Purpose, and frontmatter description. Re-key the paired "never re-triage already-triaged output" exclusion on classification-labels-at-creation rather than track-add authorship, so a dogfood issue carrying only the raw marker is in scope while born-triaged items stay out. No routing-logic change. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
|
Claude finished @kyle-sexton's task in 1m 4s —— View job PR Review —
|
| Check | Result |
|---|---|
| Authorship contradiction resolved | ✅ |
| Three sites consistent with each other | ✅ |
Consistent with reference/dogfood-filing.md |
✅ |
| Born-triaged exclusion correctly re-keyed on state, not authorship | ✅ |
| No routing logic changed | ✅ |
| Version bump appropriate (patch) | ✅ |
| Changelog entry accurate and format-consistent | ✅ |
Trigger phrases / Use when: list untouched |
✅ (per verification run) |
|
Claude finished @kyle-sexton's task in 1m 1s —— View job Security Review — PR #802
No security issues found. This PR touches three files:
All changes are pure prose/documentation. I checked each relevant attack surface:
Verdict: clean. No findings to report. |
|
Post-green review classification (work lane):
No DEFER-FORBIDDEN class applies (no data-loss, no gate, no security-posture finding, no silently-wrong output — this is a prose-only scope-definition fix with zero routing-logic change, confirmed by both reviews). No inline review threads exist on this PR (GraphQL query returned empty) — nothing to resolve. Handing off to the babysit lane for ongoing watch. |
|
Claude finished @kyle-sexton's task in 1m 24s —— View job PR Review —
|
| Check | Result |
|---|---|
| Authorship contradiction resolved | ✅ |
| Three sites mutually consistent | ✅ |
Consistent with reference/dogfood-filing.md |
✅ |
| Born-triaged exclusion correctly re-keyed on state, not authorship | ✅ |
| No routing logic changed | ✅ |
${CLAUDE_PLUGIN_ROOT} reference follows existing plugin-form pattern |
✅ |
| Version bump appropriate (patch) | ✅ |
| Changelog entry accurate and format-consistent | ✅ |
Trigger phrases / Use when: list untouched |
✅ |
|
Claude finished @kyle-sexton's task in 1m 6s —— View job Security Review — PR #802
No security issues found. This PR modifies three files, all pure prose:
Each relevant attack surface checked:
Verdict: clean. No findings to report. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7c3265eba7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The re-keyed "never re-triage already-triaged output" exclusion turned on "classification labels at creation," but a `track add` dogfood item and a plain `track add` item both carry a default `priority:` label — the label's presence cannot discriminate them. Only the raw marker (`status:needs-triage`) does, and a dogfood item carries it alongside that default priority label, so the old wording could read a dogfood issue as already-triaged and exclude the very items this scope fix admits. Re-key the exclusion on absence of the raw marker: the raw marker (or being unlabeled) puts an item in scope even alongside default labels, while an item carrying classification labels but no raw marker is born-triaged and out. Drop the over-broad "role-labeled and briefed from birth" claim, which held only for decompose and `--agent-ready` output, not plain `track add`. Align the CHANGELOG entry. No routing-logic change. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fgx6EDAL4cGAFwTNgLpsus
|
Claude finished @kyle-sexton's task in 1m 37s —— View job PR Review —
|
| Check | Result |
|---|---|
| Authorship contradiction resolved (3 sites: frontmatter, Purpose, Scope) | ✅ |
| Three sites mutually consistent with each other | ✅ |
Consistent with reference/dogfood-filing.md filing sequence |
✅ |
| Exclusion keys on raw-marker absence, not authorship, not classification labels | ✅ (42cde3e) |
Dogfood item with default priority: label + raw marker explicitly called in-scope |
✅ |
| CHANGELOG updated to match final exclusion wording | ✅ |
| No routing logic changed | ✅ |
| Version bump appropriate (patch) | ✅ |
Trigger phrases / Use when: list untouched |
✅ |
|
Claude finished @kyle-sexton's task in 1m 15s —— View job Security Review — PR #802
No security issues found. This PR touches three files, all pure prose/documentation/configuration:
Each relevant attack surface checked:
Verdict: clean. No findings to report. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 42cde3ea00
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ope (#486) The `triage-never-reprocesses-decompose-output` eval still defined raw intake as "items the team did not author" and claimed "born-labeled items never land in the unlabeled or needs-triage buckets." Both are stale after the scope was re-keyed on triage state: a dogfood item is now born with a default `priority:` label AND the raw marker, so it does land in the needs-triage bucket — the same label-vs-marker confusion already fixed in the skill body. Re-key the eval's expected_output and expectations on absence of the raw marker rather than authorship or label presence. The scenario (decompose output declined) is unchanged; only the explanations align with the shipped behavior. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fgx6EDAL4cGAFwTNgLpsus
|
Claude finished @kyle-sexton's task in 1m 46s —— View job PR Review —
|
| Check | Result |
|---|---|
| Three SKILL.md sites mutually consistent | ✅ |
Consistent with reference/dogfood-filing.md |
✅ |
| Exclusion keys on raw-marker absence, not authorship, not label presence | ✅ |
Dogfood item with default priority: label + raw marker explicitly in scope |
✅ |
Stale eval triage-never-reprocesses-decompose-output updated (expected_output + exclusion + attention-view expectations) |
✅ |
| Other evals untouched (scenario prompts, not scope definitions) | ✅ |
| No routing logic changed | ✅ |
| Version bump appropriate (patch) | ✅ |
| Changelog entry accurate and format-consistent | ✅ |
Trigger phrases / Use when: list untouched |
✅ |
${CLAUDE_PLUGIN_ROOT} references follow existing plugin-form pattern |
✅ |
|
Claude finished @kyle-sexton's task in 1m 28s —— View job Security Review — PR #802
No security issues found. This PR touches four files, all pure prose / documentation / configuration:
Each relevant attack surface checked:
Verdict: clean. No findings to report. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3b5ff1a6f2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @kyle-sexton's task in 1m 19s —— View job Security Review — PR #802
No security issues found. This PR touches four files, all pure prose / documentation / configuration:
Each relevant attack surface checked:
Verdict: clean. No findings to report. |
|
Claude finished @kyle-sexton's task in 1m 45s —— View job PR Review —
|
| Check | Result |
|---|---|
| Authorship contradiction resolved (3 sites: frontmatter, Purpose, Scope) | ✅ |
| Three sites mutually consistent | ✅ |
Consistent with reference/dogfood-filing.md |
✅ |
| Exclusion keys on raw-marker absence, not authorship, not label presence | ✅ |
Dogfood item with default priority: label + raw marker explicitly in scope |
✅ |
Stale eval triage-never-reprocesses-decompose-output updated (3 fields) |
✅ |
| Other evals untouched (scenario prompts only — no scope definitions) | ✅ |
| No routing logic changed | ✅ |
| Version bump appropriate (patch) | ✅ |
| Changelog accurate and format-consistent | ✅ |
${CLAUDE_PLUGIN_ROOT} reference follows existing plugin-form pattern |
✅ |
| Merge commit introduced no conflicts or regressions | ✅ |
Unblock summary (tower-dispatched)Cleared the two remaining blockers (unresolved Codex threads + branch behind main) and merged. Review threads — 3 resolved after independent verification against files at PR head:
Branch: updated via GitHub Checks: all green after the re-run on the new merge commit ( Merge: squash auto-merge armed; all gates already satisfied, so it merged immediately (commit Refused/blocked: nothing. This was generated by AI (tower-dispatched unblock worker). |
…th live labels (#922) ## Summary `plugins/work-items/skills/triage/SKILL.md` had two docs-match-reality gaps against shipped state: - The "Attention view (no number)" bucket list named only the status-axis raw marker (`status:needs-triage`), leaving a repo that files raw intake on the priority axis (`priority:needs-triage`, per PR #802's already-merged dual-axis Scope wording) invisible to the no-arg attention view. - `status:needs-decision` is a live, actively-used label (e.g. issue #505, per CHANGELOG `[0.16.1]`/`#562`), and the closing invariant already referenced it as a routing outcome that clears the raw marker — but the state machine itself never introduced it as a side exit, unlike `needs-info`, human-gated, and close. ## Fix - Attention-view bucket 2 now reads "Raw marker — `status:needs-triage` / `priority:needs-triage`, whichever axis the repo files it under", mirroring the Scope section's exact dual-axis wording (SKILL.md line 35). - The "Side exits from any state" sentence and the state-machine ASCII diagram now name `status:needs-decision` ("awaiting a human or maintainer judgment call" — the label's live GitHub description) alongside the existing side exits. - Version-bumped `work-items` 0.21.0 → 0.21.1 (patch, matching the `#562` precedent for the same doc-only shape) with a matching CHANGELOG entry. Scope note: the raw-state table row (line 48, `unlabeled or status:needs-triage`) is intentionally left single-axis — broader raw-marker axis canonicalization across that table, evals, and reference docs is issue #818's job, not this one. Also intentionally out of scope: adding `needs-decision` to step 2's "Target state" list or step 5's outcome table — doing so would require defining when triage applies it vs. the human-gated role, which the label's live usage does not settle (it appears both with and without `needs-human` across open issues) and which this issue scoped as pure docs-match-reality, not a design decision. ## Verification - Confirmed PR #802's merged Scope-section wording verbatim (`gh pr view 802`): "carrying the raw marker (`status:needs-triage` / `priority:needs-triage`, whichever axis the repo files it under)" — the attention-view bucket now mirrors this exactly. - Confirmed `status:needs-decision` is a live label via `gh issue list --label "status: needs-decision"` (21+ open/closed issues, e.g. #881, #718, #664, #551) and confirmed its GitHub description ("Awaiting a human or maintainer judgment call") used verbatim in the new SKILL.md text. - Confirmed issue #505's prior routing to `status:needs-decision` via the plugin's own CHANGELOG `[0.16.1]` entry (`#562`), which already treated `needs-decision` as a routing outcome in the closing invariant — this PR closes the gap between that reference and the state machine's own introduction of the label. - Traced the ASCII diagram's pipe/branch alignment by hand to confirm the new `status:needs-decision` line reads correctly as a side exit at the same indentation level as `close`. Closes #817 ## Related - #817 (this fix) - #802 (source of the dual-axis raw-marker wording mirrored here) - #505 (live example of `status:needs-decision` usage; see also CHANGELOG `#562`) - #818 — separate, unopened-PR item covering raw-marker axis canonicalization across the state table, evals, and reference docs; deliberately not touched here to avoid overlap. Re-checked immediately before opening this PR: no PR exists yet for #818. - #853 — open draft PR (labeled `do-not-merge`, stale at plugin version 0.19.0) also touches `plugins/work-items/.claude-plugin/plugin.json` and `CHANGELOG.md` for an unrelated shell-test-helper doc change. Re-checked immediately before opening this PR: no version-bump collision — #853 is stale relative to current `main` (0.21.0) and will need to rebase regardless of this PR. Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…triage docs + evals (#923) ## Summary The live raw-intake marker is applied on whichever axis a consuming repo files it under — `priority: needs-triage` (the current live label, applied by `.github/workflows/issue-triage-label.yml`) or `status: needs-triage`. `SKILL.md`'s "Scope: raw intake only" section already documents this dual-axis treatment (landed in #802), but several other spots in the same skill, its evals, and reference docs still described or asserted the marker as status-axis-only — a priority-axis label documented as status-only. ## Fix Brought every remaining occurrence in line with #802's already-merged dual-axis wording (`status:needs-triage` / `priority:needs-triage`, whichever axis the repo files it under): - `plugins/work-items/skills/triage/SKILL.md` — Triage-states table (`raw` row) and Attention-view bucket 2, both previously `status:needs-triage` only. - `plugins/work-items/reference/dogfood-filing.md` — step 4 ("Label `needs-triage`, then hand off") previously instructed filers to always `Apply status:needs-triage`; now applies the raw marker on whichever axis the repo files it under, resolved from the live label set. - `plugins/work-items/reference/label-taxonomy.md` and `plugins/work-items/reference/tracker-seam.md` — the axis-grammar tables listed `needs-triage` as a Status-axis example only; added a note that it is dual-axis with a pointer to SKILL.md's "Scope: raw intake only". - `plugins/work-items/skills/triage/evals/evals.json` — evals 4 and 5 asserted "clears `status:needs-triage`" without acknowledging the marker's dual-axis nature; reworded to "clears the raw-intake marker (here `status:needs-triage`)" so the assertion doesn't imply that's the only valid axis. - Version bump `work-items` `0.21.0` → `0.21.1` + matching `CHANGELOG.md` entry. No routing logic changed — this is a doc/eval consistency fix matching an already-ratified decision. ## Verification - `skill-quality:check` static contract gate (18 checks) over the `triage` skill: **PASS — 0 errors, 1 warning** (pre-existing "no Gotchas surface" warning, unrelated to this change). All 9 base-ref trigger phrases preserved; markdownlint clean. - `check-jsonschema` against the bundled `evals.schema.json`: `ok -- validation done`. - Manually cross-checked every edit against PR #802's diff to confirm the dual-axis phrasing (`status:needs-triage` / `priority:needs-triage`, whichever axis the repo files it under) is reused verbatim, not reinvented. - Confirmed the live label is priority-axis via `.github/workflows/issue-triage-label.yml` ("Applies the `priority: needs-triage` floor label..."). Closes #818 ## Related - #818 — this fix. The issue body already carries a ratified/defaulted decision (dual-axis treatment, maintainer-vetoable alternative was single-canonical-axis migration — not implemented here per the issue's explicit instruction), satisfying rule 4d's citation requirement. - #802 — the ratifying source for the dual-axis wording; this PR's phrasing is copied verbatim from its already-merged "Scope: raw intake only" section. - **Version-bump collision with PR #922 (issue #817):** #922 also bumps `work-items` `0.21.0` → `0.21.1` and touches `SKILL.md`'s state-machine/attention-view sections — the same lines this PR's dual-axis fix touches, since the marker lives in those sections. Both PRs are currently open against the same `0.21.0` base. Opening this PR as **draft + `do-not-merge`** until the version numbers and any overlapping `SKILL.md` lines are reconciled by whoever merges second (normal git-merge conflict resolution, per the collision-serialization protocol). - PR #853 (issue #820, unrelated) also touches `work-items/plugin.json` and `CHANGELOG.md` with a stale bump (`0.19.0` → `0.20.1`, already behind current `origin/main`) — noted for visibility, not a live collision with this change. Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
Summary
plugins/work-items/skills/triage/SKILL.mdscoped raw intake as "items the team did not author (bug reports, incoming feature requests, unsolicited PRs)." That authorship-based boundary contradicted the plugin's own self-observation / dogfood filing contract (reference/dogfood-filing.md): the team files issues it notices while operating with only the raw marker (needs-triage), and the attention view surfaces every raw-marker item regardless of author. Read literally, the scope prose excluded exactly the items the queue is built from — a self-contradiction surfaced by a real cycle holding 7 team-authored dogfood issues (#459, #475, #477, #478, #479, #480, #481) that needed the same triage treatment as external intake.Fix
Re-key the scope definition on triage state, not authorship, in three places that carried the same defining phrase — the "Scope: raw intake only" section, the Purpose, and the frontmatter
description:track additems born labeled) rather thantrack addauthorship. The prior blanket "team-authoredtrack additems are born triaged" was itself part of the contradiction — dogfood items are filed throughtrack addyet carry only the raw marker. The exclusion now correctly keeps born-triaged items out while admitting raw-marker-only dogfood items.No triage routing logic changed — this is a scope-prose consistency fix. The external "raw intake" framing is preserved for genuinely external items; only the authorship-based contradiction is removed.
Verification
skill-quality:checkstatic contract gate (18 checks) over the edited skill, run from the worktree against the plugin's skills root:Use when:list was untouched).Commit is SSH-signed (verified) and messaged via
git commit -F -.Closes #486
Related
🤖 Generated with Claude Code
https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o