validate-template --agent-ready catches a missing Required work header and a literal none in Retired tests before decompose applies ready-for-agent #732
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#732
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The "Ticket body style" rules preloaded into /os-backlog:ticket-decompose and /os-backlog:capture say Approach lists are numbered lines.
They do not say the Approach must contain a
Required work:header, or the none-lineRequired work: none beyond the acceptance criteria..They do not say
## Retired testsentries are parsed as paths, so a literalnonefails implementation-open withRetired tests (not found: none).Only references/templates/capture.md carries the header.
os-backlog validate-template Ncannot catch either gap beforeready-for-agentis applied.HeadingContentIssueschecks the Required work header only when the issue already carriesready-for-agent(plugins/os-backlog/lib/backlog/heading_content_issues.rb:50), andRetiredTestLines::LINE_PATTERNaccepts the wordnone(plugins/os-backlog/lib/backlog/retired_test_lines.rb:5).The decompose skill never runs validate-template before applying
ready-for-agent.On 2026-09-25 four procman tickets were decomposed to ready-for-agent and every one failed implementation-open with
ticket body missing: Approach has no "Required work:" list; ... Retired tests (not found: none).Reproduce
Observed: implementation-open refuses with both gaps. Expected: validate-template reports both gaps before the label is applied.
Approach
validate-template Ngains an--agent-readyflag that runs the ready-for-agent checks as if the label were present.RetiredTestLinesrejects the literal linenone, so the validator agrees with the os-sdlc parser, which rejects any entry that is not a path on disk.The decompose skill runs
os-backlog validate-template N --agent-readyand appliesready-for-agentonly on exit 0.The body-style rules name the
Required work:header, the exact none-line, and the rule to omit## Retired testswhen there is nothing to retire.Prose edits (no test):
Required work:header rule with the exact none-line, and the rule "omit## Retired testswhen there is nothing to retire; never writenone; each line is a test path checked on disk by implementation-open".ready-for-agent, run${CLAUDE_PLUGIN_ROOT}/bin/os-backlog validate-template <n> --agent-readyand apply the label only on exit 0.Required work:
--agent-readytovalidate-templateso the Required work check runs without the label — check:os-backlog validate-template N --agent-readyon an unlabeled body with noRequired work:exits nonzero and names the header.RetiredTestLinesreject the literal linenone— check:os-backlog validate-template Non a body whose## Retired testsholdsnoneexits nonzero and names the entry.Rejected: checking each Retired tests entry against the filesystem in validate-template — the validator runs from any cwd and has no repo root parameter; the literal
noneis the observed failure.Rejected: shortening the ticket to prose only — the four failures show prose rules alone do not hold.
Acceptance criteria
## Approachhas noRequired work:header, whenos-backlog validate-template N --agent-readyruns, then it exits nonzero and reports the missingRequired work:list.os-backlog validate-template Nruns without--agent-ready, then the Required work check does not run, as today.## Retired testssection contains the linenone, whenos-backlog validate-template Nruns, then it exits nonzero and reports thenoneentry as invalid.## ApproachhasRequired work:with numbered items and no## Retired testssection, whenos-backlog validate-template N --agent-readyruns, then it exits 0.Owner sketch
Origin
VERDICT: CREATE — real observed failure on four tickets with clear provenance; validate-template exists but is not wired into decompose and cannot run the check before the label; distinct from #727/#728/#730.
Work started 2026-09-27 on branch ticket-732 via /os-sdlc:implement.
Implementation 51 failed at seam-designer (dispatch 528, verdict fail). Gate details: validate-template runs the Required work check only when the issue already has ready-for-agent (heading_content_issues.rb:50), and RetiredTestLines::LINE_PATTERN accepts the literal none (retired_test_lines.rb:5), so the ticket's acceptance criteria 2 and 3 cannot be observed without a validator change. Reshaping the ticket to add --agent-ready and the none rejection, then re-opening on branch ticket-732.
ticket-decompose runs validate-template before ready-for-agent and its body rules state the Required work headerto validate-template --agent-ready catches a missing Required work header and a literal none in Retired tests before decompose applies ready-for-agentResolution
Done: validate-template accepts --agent-ready so the Required work check runs before the label is applied; RetiredTestLines rejects the literal line none; body-style.md names the Required work header, the exact none-line, and the omit-Retired-tests rule; ticket-decompose runs validate-template --agent-ready before both points that apply ready-for-agent.
Evidence: Implementation 52 on branch ticket-732, 8 dispatches, zero retries, all gates green; tests in plugins/os-backlog/tests/template_validator_test.rb; os-backlog suite green. Implementation 51 (first attempt) failed at seam-designer because the original ticket premise was false: validate-template ran the Required work check only when ready-for-agent was already set, so the ticket was reshaped to add the validator changes.
Follow-ups: none