os-sdlc: absent Required-work check on an emptied glob can never pass #954

Open
opened 2026-10-05 13:19:35 +00:00 by jared · 0 comments
Owner

Problem

An absent Required-work check whose glob matches no file always fails. Check#reason returns "glob matched no file" before it reads the polarity. A ticket item that deletes the only file matching its own glob can never pass its check. implementation-open accepts such a ticket, so the harness fails late, after it spent programmer rounds.

Reproduce

  1. Write a ticket whose Required work item deletes plugins/os-sdlc/bin/lint-concept-cycles and whose check is check: absent `concept` in `plugins/os-sdlc/bin/lint-concept-cycles` .
  2. Run /os-sdlc:implement on that ticket. implementation-open accepts the body (see OsSdlc::Implementation::Open#check_ticket_shape!).
  3. After the programmer deletes the file, run the required-work check. It returns "glob matched no file" (plugins/os-sdlc/lib/os_sdlc/parser/ticket_shape/required_work/check.rb, Check#reason).

Approach

Decide one rule and state it in the body-style rules. Either implementation-open rejects an absent check whose glob its own item empties, or absent passes when the glob matches no file.

Required work:

  1. Make Check#reason return no reason for an absent check on an empty glob — check: absent return "glob matched no file" if matched.empty? in plugins/os-sdlc/lib/os_sdlc/parser/ticket_shape/required_work/check.rb
  2. State the chosen rule in the body-style rules of the capture template — check: present absent in plugins/os-backlog/references/templates/capture.md

Rejected: Reject the ticket at implementation-open — it must guess which item empties which glob, which is brittle.

Acceptance criteria

  1. Given an absent check whose glob matches no file, when the required-work check runs, then it passes.
  2. Given a present check whose glob matches no file, when the required-work check runs, then it fails with "glob matched no file".
  3. Given an absent check and a matching file that holds the text, when the check runs, then it fails with "text found in ".

Owner sketch

class OsSdlc::TicketShape::RequiredWork::Check
  def reason(matched:, holders:)
end

Origin

  • Trigger: os-sdlc implementation 32 of ticket #949. Item 4 deleted the only file that its absent glob matched. The run spent two programmer-repair rounds and escalated (bound_exhausted:suite-check/fail).
  • Where: plugins/os-sdlc/lib/os_sdlc/parser/ticket_shape/required_work/check.rb, Check#reason
  • Session: ab599e53-dbf5-4953-b8bf-c598a9c5c16e
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-os-adr-2026-10-04/ab599e53-dbf5-4953-b8bf-c598a9c5c16e.jsonl

VERDICT: CREATE

## Problem An `absent` Required-work check whose glob matches no file always fails. `Check#reason` returns "glob matched no file" before it reads the polarity. A ticket item that deletes the only file matching its own glob can never pass its check. `implementation-open` accepts such a ticket, so the harness fails late, after it spent programmer rounds. ## Reproduce 1. Write a ticket whose Required work item deletes `plugins/os-sdlc/bin/lint-concept-cycles` and whose check is ``check: absent `concept` in `plugins/os-sdlc/bin/lint-concept-cycles` ``. 2. Run `/os-sdlc:implement` on that ticket. `implementation-open` accepts the body (see `OsSdlc::Implementation::Open#check_ticket_shape!`). 3. After the programmer deletes the file, run the required-work check. It returns "glob matched no file" (`plugins/os-sdlc/lib/os_sdlc/parser/ticket_shape/required_work/check.rb`, `Check#reason`). ## Approach Decide one rule and state it in the body-style rules. Either `implementation-open` rejects an `absent` check whose glob its own item empties, or `absent` passes when the glob matches no file. Required work: 1. Make `Check#reason` return no reason for an `absent` check on an empty glob — check: absent `return "glob matched no file" if matched.empty?` in `plugins/os-sdlc/lib/os_sdlc/parser/ticket_shape/required_work/check.rb` 2. State the chosen rule in the body-style rules of the capture template — check: present `absent` in `plugins/os-backlog/references/templates/capture.md` Rejected: Reject the ticket at `implementation-open` — it must guess which item empties which glob, which is brittle. ## Acceptance criteria 1. Given an `absent` check whose glob matches no file, when the required-work check runs, then it passes. 2. Given a `present` check whose glob matches no file, when the required-work check runs, then it fails with "glob matched no file". 3. Given an `absent` check and a matching file that holds the text, when the check runs, then it fails with "text found in <path>". ## Owner sketch ```ruby class OsSdlc::TicketShape::RequiredWork::Check def reason(matched:, holders:) end ``` ## Origin - Trigger: os-sdlc implementation 32 of ticket #949. Item 4 deleted the only file that its `absent` glob matched. The run spent two programmer-repair rounds and escalated (bound_exhausted:suite-check/fail). - Where: plugins/os-sdlc/lib/os_sdlc/parser/ticket_shape/required_work/check.rb, `Check#reason` - Session: ab599e53-dbf5-4953-b8bf-c598a9c5c16e - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-os-adr-2026-10-04/ab599e53-dbf5-4953-b8bf-c598a9c5c16e.jsonl VERDICT: CREATE
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#954
No description provided.