Template validator CLI: tier computation + section check, with shared tracker lib (#186) #253
Labels
No labels
P0
P1
P2
P3
bug
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
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#253
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?
Spec: #250
Blocked by #251
Slice
Template validator in os-backlog's Ruby CLI surface: given an issue number, compute the structural tier (capture/ticket/map per ADR-0092) and report missing/malformed sections against the canonical templates. Build the shared lib this and
decision-sweepneed (tracker fetch, body/section parsing, label ops) — this lib implements #186's surface.Acceptance criteria
wayfinder:maplabel, when validated, then tier ismap.##headings exactly match the ticket template's (case-sensitive, any order, non-empty after stripping HTML comments/placeholders), when validated, then tier isticketand validation passes.capture.Blocked by #NNNreference that cannot be fetched, when validated, then validation fails naming the reference.Non-goals
No sweep logic (its own ticket), no label mutations, never runs at capture time.
Scope amendment from the 2026-08-04 review of #251/#257/#258:
Templates blocker (from #251):
plugins/os-backlog/references/templates/ticket.mdandspec.mdwere promoted as annotated section listings — headings carry inline annotations (e.g.## Slice — one sentence: ...) with no bodies.capture.mdhas the correct fill-in shape (bare canonical headings + placeholder body). Since the validator built here matches headings case-sensitively against the canonical templates, no real ticket — including #251–#258, which use bare## Slice— would validate against the current files.First slice of this ticket: reshape
ticket.mdandspec.mdto the fill-in shape (bare canonical headings, placeholder bodies) consistent withcapture.md, then build the validator and its fixtures against the reshaped files.Resolution
Done: Shipped Backlog::TemplateValidator + validate-template CLI + backend fetch surface
Evidence: 120-run minitest suite green, rubocop zero offenses, opus reviewer APPROVE, merged as
643da05Follow-ups: none