os-backlog body checker ignores a check: on its own line under a Required work item #821

Closed
opened 2026-09-28 22:20:29 +00:00 by jared · 2 comments
Owner

Problem

Backlog::RequiredWork#checks_without_command (#817) reads only the numbered line of each Required work item. A check: on a later line of the same item is never inspected, so a free-text check on its own line passes at write time. The os-sdlc parser reads every line of an item, and #820 keeps that rule. ADR-0209 and ADR-0244 decision 4 require both validators to refuse the same bodies. They now disagree:

Item form os-backlog os-sdlc after #820
1. X — check: `cmd` read read
1. X then check: grep foo on the next line ignored refused

Observed

The #817 contract-auditor (dispatch 728) named this disagreement as a GAP item.

Reproduce

n/a: design ticket. The table above gives the two forms.

Approach

An item is its numbered line plus the lines under it, up to the next numbered line or the end of the section. The item's check is the first check: anywhere in those lines. The command is backticked text after that check:. This is the rule in #820 for os-sdlc.

Decision record: ADR-0244.

Required work:

  1. Backlog::RequiredWork#checks_without_command reads every line of an item, not only the numbered line.

Acceptance criteria

  1. Given a ready-for-agent body whose Required work item 1. Delete the foo helper has check: grep foo prints nothing on the next line, when the os-backlog body checker runs, then it rejects the body and names the item.
  2. Given a ready-for-agent body whose Required work item has check: `grep -r foo lib` on the next line, when the checker runs, then it accepts the body.
  3. Given a ready-for-agent body whose Required work items have text on later lines and no check:, when the checker runs, then it accepts the body.

Owner sketch

class Backlog::RequiredWork
  def checks_without_command
end

Origin

  • Trigger: #817 contract-auditor, dispatch 728
  • Improvised this session: none
  • Chain: validators disagree <- os-backlog items are numbered lines only <- #817 implementation, whose acceptance criteria covered single-line items (plugins/os-backlog/lib/backlog/required_work.rb)
  • Root candidate: this ticket
  • Where: plugins/os-backlog/lib/backlog/required_work.rb
  • Session: 47a537c2-08a1-4d3c-9688-75df56dfdd3d
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-ticket-808/47a537c2-08a1-4d3c-9688-75df56dfdd3d.jsonl
  • Related: #817, #820

VERDICT: CREATE
REASON: The os-backlog and os-sdlc validators now disagree on own-line check: items, which violates the ADR-0209 and ADR-0244 decision 4 requirement that both refuse the same bodies. #817 is complete and no existing ticket covers the os-backlog side. The chain has no improvisation, so this is a validation gap and not a speculative one.

## Problem `Backlog::RequiredWork#checks_without_command` (#817) reads only the numbered line of each Required work item. A `check:` on a later line of the same item is never inspected, so a free-text check on its own line passes at write time. The os-sdlc parser reads every line of an item, and #820 keeps that rule. ADR-0209 and ADR-0244 decision 4 require both validators to refuse the same bodies. They now disagree: | Item form | os-backlog | os-sdlc after #820 | | --- | --- | --- | | ``1. X — check: `cmd` `` | read | read | | `1. X` then ` check: grep foo` on the next line | ignored | refused | ## Observed The #817 contract-auditor (dispatch 728) named this disagreement as a GAP item. ## Reproduce n/a: design ticket. The table above gives the two forms. ## Approach An item is its numbered line plus the lines under it, up to the next numbered line or the end of the section. The item's check is the first `check:` anywhere in those lines. The command is backticked text after that `check:`. This is the rule in #820 for os-sdlc. Decision record: ADR-0244. Required work: 1. `Backlog::RequiredWork#checks_without_command` reads every line of an item, not only the numbered line. ## Acceptance criteria 1. Given a ready-for-agent body whose Required work item `1. Delete the foo helper` has `check: grep foo prints nothing` on the next line, when the os-backlog body checker runs, then it rejects the body and names the item. 2. Given a ready-for-agent body whose Required work item has ``check: `grep -r foo lib` `` on the next line, when the checker runs, then it accepts the body. 3. Given a ready-for-agent body whose Required work items have text on later lines and no `check:`, when the checker runs, then it accepts the body. ## Owner sketch ```ruby class Backlog::RequiredWork def checks_without_command end ``` ## Origin - Trigger: #817 contract-auditor, dispatch 728 - Improvised this session: none - Chain: validators disagree <- os-backlog items are numbered lines only <- #817 implementation, whose acceptance criteria covered single-line items (plugins/os-backlog/lib/backlog/required_work.rb) - Root candidate: this ticket - Where: plugins/os-backlog/lib/backlog/required_work.rb - Session: 47a537c2-08a1-4d3c-9688-75df56dfdd3d - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-ticket-808/47a537c2-08a1-4d3c-9688-75df56dfdd3d.jsonl - Related: #817, #820 VERDICT: CREATE REASON: The os-backlog and os-sdlc validators now disagree on own-line check: items, which violates the ADR-0209 and ADR-0244 decision 4 requirement that both refuse the same bodies. #817 is complete and no existing ticket covers the os-backlog side. The chain has no improvisation, so this is a validation gap and not a speculative one.
Author
Owner

Work started on branch ticket-821 via /os-sdlc:implement, target os-backlog.

Work started on branch ticket-821 via /os-sdlc:implement, target os-backlog.
Author
Owner

Resolution

Done: Backlog::RequiredWork#checks_without_command groups each numbered item with its later lines; a free-text check: on its own line is refused, a backticked one accepted. Both validators now apply ADR-0244 decision 5.

Evidence: Implementation 74 complete: 8 dispatches, 5 min 34 s, all pass. os-backlog suite 271 runs, 0 failures. One body run through both parsers: items 2 and 3 refused by both, items 1 and 4 accepted/run by both.

Follow-ups: none

## Resolution **Done:** Backlog::RequiredWork#checks_without_command groups each numbered item with its later lines; a free-text check: on its own line is refused, a backticked one accepted. Both validators now apply ADR-0244 decision 5. **Evidence:** Implementation 74 complete: 8 dispatches, 5 min 34 s, all pass. os-backlog suite 271 runs, 0 failures. One body run through both parsers: items 2 and 3 refused by both, items 1 and 4 accepted/run by both. **Follow-ups:** none
jared closed this issue 2026-09-28 22:35:00 +00:00
jared referenced this issue from a commit 2026-09-29 13:12:09 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#821
No description provided.