os-backlog validate-template refuses Required-work checks that are not typed present/absent #847
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#847
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
ADR-0255 makes a Required-work check a typed
present/absenttext check. os-sdlc enforces it. os-backlogvalidate-templatedoes not. It accepts any backticked span aftercheck:.So a ticket with a shell or slash-command check passes os-backlog, gets
ready-for-agent, and then implementation-open refuses it. ADR-0209 says the two validators must change together. This ticket is the os-backlog part of #843. It is a separate ticket because an os-sdlc implementation takes one target.Reproduce
An agent-ready ticket whose Required-work item ends with a shell check passes
os-backlog validate-template N --agent-ready. os-sdlc then refuses the same item. The os-sdlc part is #843.Approach
Backlog::RequiredWorkrefuses every check that is notpresent `<text>` in `<glob>`orabsent `<text>` in `<glob>`. The refusal text matches os-sdlc:Required work check is not present/absent `<text>` in `<glob>`: <item>.Keep
CHECK_TAIL. Keep the placement rule: the firstcheck:in an item's lines is the item's check. Keep the agent-ready-only gate. Add no runtime dependency from os-backlog on os-sdlc. Copy the form intoBacklog::RequiredWork(ADR-0190, ADR-0209 and ADR-0255 decision 3 keep the two validators duplicated and in lockstep).The test-writer rewrites the cases in
plugins/os-backlog/tests/template_validator_required_work_check_test.rbthat pin the old message and the old pass cases.validate-templateis the public seam; the acceptance criteria test through it. After merge, the orchestrator adds the History row todocs/implementation-status/os-backlog.mdand runsbin/refresh-plugins. These are not Required work (ADR-0255 decision 5).Required work:
plugins/os-backlog/lib/backlog/required_work.rb, replaceBACKTICKED_COMMANDwith aCHECK_FORMcopy of the os-sdlc form — check: absentBACKTICKED_COMMANDinplugins/os-backlog/lib/**/*.rbchecks_without_commandtochecks_not_typed; its only caller isheading_content_issues.rb:57— check: absentchecks_without_commandinplugins/os-backlog/lib/**/*.rbplugins/os-backlog/lib/backlog/heading_content_issues.rb, makeunrunnable_check_issuesemit the os-sdlc refusal text — check: presentRequired work check is not present/absentinplugins/os-backlog/lib/**/*.rbRejected:
RequiredWork#checks_not_typedinrequired_work_test.rb. It repeats the validate-template cases one layer down (lens principle 7: test the public seam).bin/refresh-pluginsas Required-work items. They are not file changes inside the target that a pipeline agent makes (ADR-0255 decision 5).ItemandCheckvalues into os-backlog. os-backlog only refuses; it never evaluates polarity, text or glob.Sketch:
Acceptance criteria
absent `CLI::` in `lib/**/*.rb`, whenvalidate-templateruns, then it reports no Required-work issue.grep -q X lib/a.rbas its check, whenvalidate-templateruns, then it refuses with the new text and names the item./os-adr:find fooas its check, whenvalidate-templateruns, then it refuses with the new text and names the item.validate-templateruns, then it refuses with the new text and names the item.validate-templateruns, then it reads the check as it does today.Owner sketch
Changes since filing (verified 2026-10-02 on main
7bef0c4e)433b0445). Paths and lines are still correct.bin/refresh-pluginsmoved to orchestrator work; the extrarequired_work_test.rbcase dropped (predicted ruling, 2026-10-02).Blast radius
plugins/os-backlog/lib/backlog/required_work.rb,plugins/os-backlog/lib/backlog/heading_content_issues.rb.template_validator_required_work_check_test.rb(rewrite).docs/implementation-status/os-backlog.md.validate-template. This is correct. os-sdlc already refuses them.bin/refresh-pluginsafter the change.Origin
Blocked by: none. #843 shipped (ADR-0255); the os-sdlc text is at
plugins/os-sdlc/lib/os_sdlc/parser/ticket_shape.rb:103.VERDICT: CREATE — user-filed; os-backlog passes checks that os-sdlc refuses (ADR-0209) (ticket-skeptic, 2026-09-30).
Body revised 2026-10-02 after blast-radius re-check on main
b80613ec: typed CHECK_FORM copy, checks_not_typed rename, test rewrite (not retired), blast radius added.PREDICTED RULING: REVISE
a. No. The design is right; the Required-work list is not.
b. Reasons:
required_work_test.rbcase tests one layer under the validate-template seam (lens principle 7; dedup batches #666-#698).c. Lazy: the user wrote ADR-0255 decision 5 two days ago, and this ticket breaks it. Research done: read both RequiredWork classes, Check.parse, ADR-0025/0190/0209/0224/0239/0244/0255, lens architecture A12, and three recent ticket bodies. A shared gem or os-backlog calling os-sdlc reverses Accepted ADRs, so per feedback-os-sdlc-runs-afk-decide-and-report the ADR-preserving option wins.
d. Same code change. Three items, one typed check each (each fails on main
7bef0c4e): absent BACKTICKED_COMMAND, absent checks_without_command, present the os-sdlc refusal text. Test rewrite goes to the test-writer through the ACs. History row and refresh are orchestrator work. A Rejected list records the alternatives. Body updated; validate-template --agent-ready exits 0.e. Not read: lens-tactics, lens-testing, lens-cases; the #843 transcript; the full ADR list for later cross-plugin rulings. No new ADR is needed. A shared grammar would need a user ruling.
Work started 2026-10-02 on branch ticket-847 (os-sdlc pipeline, map poodr-ticket-implementation, target os-backlog).
Follow-up dropped by ticket-skeptic (VERDICT: DROP): mirrored typed-check fixtures across os-backlog and os-sdlc — speculative hardening; #847 already fixed the drift with per-plugin tests, the duplication is deliberate (ADR-0190/0209/0255), no new drift observed. File again if drift recurs.
Resolution
Done: os-backlog validate-template now refuses any Required-work check that is not typed (present|absent
<text>in<glob>), with the same refusal text as os-sdlc. Backlog::RequiredWork#checks_not_typed replaces checks_without_command; HeadingContentIssues only renders the refusal.Evidence: Commits
dadb4ce9(feat, implementation 24: 13 dispatches, suite green on second suite-check, contract-auditor pass) and1b7b96cd(History row) merged to main. Changed: plugins/os-backlog/lib/backlog/required_work.rb, heading_content_issues.rb, tests/template_validator_required_work_check_test.rb.Follow-ups: none — parity-fixture follow-up dropped by ticket-skeptic (comment above)
Owner ruling 2026-10-07 (session 87a712ed): the duplicated check rule is a pain point for #969 (os-backlog gem, ADR-0279). No direct shared owner across the os-sdlc/os-backlog boundary.