feat(review): pattern column on the close-out acceptance-criteria rollup - #3904
Conversation
Close-out mode's acceptance-criteria rollup already gives every criterion a verdict of delivered, partial, missing or unverifiable, and already renders unconditionally. What it lacked was any awareness of a criterion's requirement pattern, so a tagged set's shape (every unwanted-behaviour criterion unverifiable while the event-driven ones all delivered) was discarded. The rollup now gains one column naming each criterion's pattern when any criterion retrieved in Step 2 opens with a bracketed EARS tag. The cell carries one of exactly five names, ubiquitous, event-driven, state-driven, unwanted-behaviour, optional-feature, matching what the planning surfaces emit; a bracket holding anything else leaves the cell empty. Detection is that bracket's presence, so no flag, lever, or convention key is read and no resolution ladder is restated. Every criterion still gets a row, so a partially tagged set shows untagged rows with an empty pattern cell, and an untagged set renders exactly as before with no extra column. Step 2's extraction bullet now says to keep the criterion line whole so the tag survives the read. The verdict vocabulary and the blocking rule (missing or wrong keeps the container open) are unchanged. Closes #3824 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012jiwedVq2GxuzN7siXQbr4
The detection sentence said "that bracket's presence", which read in isolation makes a bare `[` the trigger. The repo's own Agent Brief template emits acceptance criteria as `- [ ] <criterion>`, so a checkbox-shaped set could be read as tagged and render an empty pattern column on every row. Detection is now stated as a leading bracket holding one of the five names, and the checklist marker is named as the case it excludes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012jiwedVq2GxuzN7siXQbr4
|
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 3m 20s —— View job
|
|
Claude finished @kyle-sexton's task in 1m 3s —— View job Security review (
|
|
Last security-reviewed head: |
|
Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
|
PR body contract — issue linkage This PR body does not yet satisfy the issue-linkage contract:
Edit the body and this comment updates itself on the next run. |
Closes #3824
What changed
Close-out mode's acceptance-criteria rollup already anchors the pass on the container's criteria,
already gives every criterion a verdict of
delivered/partial/missing/unverifiable,and already renders unconditionally. What it lacked was any awareness of a criterion's requirement
pattern, so the shape of a tagged set (every
unwanted-behaviourcriterionunverifiablewhilethe
event-drivenones were alldelivered) was discarded.The rollup now gains one conditional column naming each criterion's requirement pattern when
any criterion retrieved in Step 2 opens with a bracketed EARS tag.
ubiquitous,event-driven,state-driven,unwanted-behaviour,optional-feature, the vocabulary the writing side (planning/interview+prd: unwanted-behaviour coverage prompt always on, EARS format opt-in via convention doc #3821 / feat(planning): always-on unwanted-behaviour coverage prompt, EARS tags under the convention #3882) emits.A bracket holding anything else leaves the cell empty rather than echoing raw text.
convention key, and no resolution ladder. A checklist marker (
- [ ]) is named explicitly as thebracket that is not a tag, because the repo's own Agent Brief template emits criteria that way.
empty pattern cell rather than dropping them, which is the invisibility the rollup exists to
remove. A set carrying no tag renders exactly as it does today, with no extra column.
read.
What deliberately did not change
met, nonot-met.missingorwrongfinding keeps the container open.That rule is co-owned by the work-items container lifecycle and changing it is a container-level
decision, not a side effect of adding a column.
plugins/work-items/is not in this diff.Verification
A fresh-context verifier that did not write the change confirmed all nine checked points with no
CRITICALs: no second verdict vocabulary, blocking rule unchanged,
plugins/work-items/untouched,one row per criterion on a partially tagged set, the five names verbatim (including British
-behaviour), unchanged rendering with no tags, no flag/lever/convention key, scope held to onecolumn, and house mechanics (em-dash purge on the README, changelog order, version parity). Its one
non-blocking tightening (the checklist-marker ambiguity) is applied as the second commit.
Gates run locally:
check-changelog-parity.sh --check-bump main(pass),check-purged-em-dashes.sh(pass),validate-plugin-contracts.mjs(pass),markdownlint-cli2on the changed markdown (0 issues).Review plugin bumped 0.26.19 to 0.26.20.
Note: #3821 / #3882 (the writing side that emits the tags) is still open, so this reader lands
before its writer. The vocabulary is pinned to that PR's stated contract.
🤖 Generated with Claude Code
https://claude.ai/code/session_012jiwedVq2GxuzN7siXQbr4