Skip to content

review/quality-gate close-out: pattern column on the acceptance-criteria rollup #3824

Description

@kyle-sexton

Parent

Refs #3799

Agent Brief

Type: Feature
Summary: The close-out review's existing acceptance-criteria rollup gains a pattern column when the container's criteria carry EARS tags.

Amended 2026-09-06, second amendment. The first amendment moved this slice from slice-level verification to the close-out review, which was the right surface. It was still wrong about what was missing there. Review of the plan established that plugins/review/skills/quality-gate/context/close-out.md already does almost everything this issue asked for: it anchors the pass on the container's acceptance criteria, gives every criterion a verdict of delivered, partial, missing or unverifiable, states that unverifiable is "never quietly folded into delivered", and renders an acceptance-criteria rollup of every criterion with its verdict, unconditionally rather than behind any trigger.

So the original premise, that the close-out reports narrative prose and an unchecked criterion can pass unnoticed, is false. The rollup exists. What it lacks is any awareness of the EARS pattern a criterion carries. This slice is now that one column, and nothing else.

Two things the earlier version proposed are dropped outright. A second verdict vocabulary (met / not-met / unverifiable) alongside the existing four-value one would be a competing vocabulary for the same judgment. And a roll-up rule making unverifiable keep the container open would change a blocking contract that today fires only on missing or wrong, is co-owned by plugins/work-items/skills/decompose/context/container-lifecycle.md, and sits outside this slice's fence. Changing when a container closes is a container-level decision, not a side effect of adding a column.

Current behavior:
The close-out review's acceptance-criteria rollup lists every criterion with its verdict. It has no notion of the criterion's requirement pattern, so a reader cannot see at a glance that, for example, every unwanted-behaviour criterion in a container came back unverifiable while the event-driven ones were all delivered. That shape is exactly what an EARS-tagged criteria set makes visible, and the rollup currently discards it.

Desired behavior:
When the container's acceptance criteria carry EARS pattern tags, the rollup gains one additional column naming each criterion's pattern.

The five pattern names are exactly ubiquitous, event-driven, state-driven, unwanted-behaviour, and optional-feature, written as a bracketed prefix on the criterion line, as #3821 emits them:

- [event-driven] WHEN the upload completes, the manifest is rewritten
- [unwanted-behaviour] IF the upload fails, THEN the partial manifest is discarded

This vocabulary is the contract. A name that differs from #3821's breaks the match silently.

The existing verdict vocabulary is unchanged: delivered, partial, missing, unverifiable. The existing blocking rule is unchanged: missing or wrong keeps the container open. This slice adds a column and changes no judgment.

A partially tagged criteria set still yields one row per criterion, with an empty pattern cell for untagged ones. No criterion is dropped from the rollup for lacking a tag.

When no criterion carries a tag, the rollup renders exactly as it does today, without the column.

Key interfaces:

  • The close-out review's acceptance-criteria rollup — gains one conditional column.
  • The tag grammar — read, never written, and matched on bracket presence rather than on any convention key.

Acceptance criteria:

  • When the container's criteria carry bracketed EARS tags, the acceptance-criteria rollup carries a pattern column naming each criterion's pattern.
  • The five pattern names appear verbatim in the touched body.
  • The existing verdict vocabulary is unchanged: no met or not-met value is introduced.
  • The existing blocking rule is unchanged: the body does not make unverifiable keep the container open.
  • A partially tagged set yields one row per criterion, with an empty pattern cell for untagged ones.
  • With no tagged criteria, the rollup renders exactly as today, with no pattern column.
  • No flag, lever, or convention key is added, and no resolution ladder is restated, because detection is tag presence rather than a key read.
  • /skill-quality:check passes for the quality-gate skill.
  • markdownlint passes on the changed files.
  • The review plugin version is bumped per repo convention.
  • The review plugin README and any reference doc listing its skills reflect the change.

Out of scope:

  • Tagging criteria. That is planning/interview+prd: unwanted-behaviour coverage prompt always on, EARS format opt-in via convention doc #3821.
  • Introducing a second verdict vocabulary.
  • Changing when a container closes. That rule is co-owned with the work-items container lifecycle and any change to it belongs at container level.
  • Changing what counts as evidence, the basis resolution, or the cross-item findings pass.
  • The single-session flow that never decomposes. verification:confirm reads an approved plan's acceptance criteria directly, so tagged criteria can reach it with no pattern column. That gap is known, stated here, and deliberately not closed by this slice.

Blocked by

#3821

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: needs-triageDefault until a priority tier is assigned.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions