implementation-open refuses a ticket-map run whose ticket lacks Owner sketch or Cases; ticket map becomes the implement default (ADR-0190) #587

Closed
opened 2026-09-15 13:37:27 +00:00 by jared · 2 comments
Owner

Context

Per ADR-0190, poodr-ticket-implementation.yaml becomes the implement skill's default implementation-open map. implementation-open must refuse a ticket-map run when the ticket body lacks ## Owner sketch or ## Cases, or when ## Cases lists no case.

Owner sketch

module OsSdlc
  class Runner
    class TicketShape
      SECTIONS = ["Owner sketch", "Cases"].freeze
      CASE_LINE = /^\s*(?:\d+\.|[-*])\s+\S/
      def initialize(body)
      def missing        # array of section names, plus "Cases (no listed case)"
      def complete?
    end
    class OpenImplementation
      def call           # when map is poodr-ticket-implementation.yaml, raise HarnessError listing TicketShape#missing
    end
  end
end

Cases

  1. Given a ticket body with both sections and one listed case, when implementation-open runs with the ticket map, then the run opens.
  2. Given a body missing ## Owner sketch, when implementation-open runs with the ticket map, then it raises HarnessError naming "Owner sketch" and no implementation row is created.
  3. Given a ## Cases section with prose and no numbered or bulleted line, when opened with the ticket map, then HarnessError names "Cases (no listed case)".
  4. Given the same incomplete body, when opened with poodr-implementation.yaml, then the run opens (gate keys on the map).
  5. Given the implement SKILL.md, when read, then the default open command names poodr-ticket-implementation.yaml and the per-increment map is described as an explicit deviation-reported override for docs/config/ADR-only/spike tickets.

Observed

plugins/os-sdlc/skills/implement/SKILL.md (lines ~52-54) currently reads:
"Pick maps/poodr-ticket-implementation.yaml when the ticket body carries a class sketch and an expected-test-case list; it runs one red round for all listed cases. Otherwise use poodr-implementation.yaml."
This makes the ticket map opt-in and leaves implementation-open (plugins/os-sdlc/lib/os_sdlc/runner/open_implementation.rb) silent about missing sections.

Reproduce

n/a: design/feature ticket, not a reproduced bug

Expected

implementation-open raises HarnessError listing missing sections when opening a ticket-map run against an incomplete ticket body. SKILL.md is updated to:
"This map runs one red round for all the ticket's listed cases. It requires ## Owner sketch and ## Cases in the ticket body; implementation-open refuses the run if either is missing. Use maps/poodr-implementation.yaml only for a ticket with no test-shaped increment: docs, config, an ADR-only change, or a spike. Report the substitution as a deviation."

Origin

  • Trigger: user decision 2026-09-15, ADR-0190 (being written)
  • Improvised this session: none
  • Chain: ticket-map default gap ← ADR-0190 decision ← DESIGN (ADR-0190)
  • Root candidate: this ticket
  • Where: plugins/os-sdlc/lib/os_sdlc/runner/open_implementation.rb
  • Session: b1c83b81-7be1-4f17-9e8e-cae36a934f25
  • Transcript: n/a

VERDICT: CREATE (ticket-skeptic, os-backlog:ticket-skeptic dispatch)

## Context Per ADR-0190, `poodr-ticket-implementation.yaml` becomes the implement skill's default `implementation-open` map. `implementation-open` must refuse a ticket-map run when the ticket body lacks `## Owner sketch` or `## Cases`, or when `## Cases` lists no case. ## Owner sketch ```ruby module OsSdlc class Runner class TicketShape SECTIONS = ["Owner sketch", "Cases"].freeze CASE_LINE = /^\s*(?:\d+\.|[-*])\s+\S/ def initialize(body) def missing # array of section names, plus "Cases (no listed case)" def complete? end class OpenImplementation def call # when map is poodr-ticket-implementation.yaml, raise HarnessError listing TicketShape#missing end end end ``` ## Cases 1. Given a ticket body with both sections and one listed case, when implementation-open runs with the ticket map, then the run opens. 2. Given a body missing `## Owner sketch`, when implementation-open runs with the ticket map, then it raises HarnessError naming "Owner sketch" and no implementation row is created. 3. Given a `## Cases` section with prose and no numbered or bulleted line, when opened with the ticket map, then HarnessError names "Cases (no listed case)". 4. Given the same incomplete body, when opened with poodr-implementation.yaml, then the run opens (gate keys on the map). 5. Given the implement SKILL.md, when read, then the default open command names poodr-ticket-implementation.yaml and the per-increment map is described as an explicit deviation-reported override for docs/config/ADR-only/spike tickets. ## Observed `plugins/os-sdlc/skills/implement/SKILL.md` (lines ~52-54) currently reads: "Pick `maps/poodr-ticket-implementation.yaml` when the ticket body carries a class sketch and an expected-test-case list; it runs one red round for all listed cases. Otherwise use `poodr-implementation.yaml`." This makes the ticket map opt-in and leaves `implementation-open` (`plugins/os-sdlc/lib/os_sdlc/runner/open_implementation.rb`) silent about missing sections. ## Reproduce n/a: design/feature ticket, not a reproduced bug ## Expected `implementation-open` raises HarnessError listing missing sections when opening a ticket-map run against an incomplete ticket body. SKILL.md is updated to: "This map runs one red round for all the ticket's listed cases. It requires `## Owner sketch` and `## Cases` in the ticket body; `implementation-open` refuses the run if either is missing. Use `maps/poodr-implementation.yaml` only for a ticket with no test-shaped increment: docs, config, an ADR-only change, or a spike. Report the substitution as a deviation." ## Origin - Trigger: user decision 2026-09-15, ADR-0190 (being written) - Improvised this session: none - Chain: ticket-map default gap ← ADR-0190 decision ← DESIGN (ADR-0190) - Root candidate: this ticket - Where: plugins/os-sdlc/lib/os_sdlc/runner/open_implementation.rb - Session: b1c83b81-7be1-4f17-9e8e-cae36a934f25 - Transcript: n/a VERDICT: CREATE (ticket-skeptic, os-backlog:ticket-skeptic dispatch)
Author
Owner

Work started via /os-sdlc:implement on branch ticket-587 (worktree .claude/worktrees/ticket-587), map poodr-ticket-implementation.yaml.

Work started via /os-sdlc:implement on branch ticket-587 (worktree .claude/worktrees/ticket-587), map poodr-ticket-implementation.yaml.
Author
Owner

Resolution

Done: Runner::TicketShape + OpenImplementation#check_ticket_shape! refuse a poodr-ticket-implementation run whose body lacks '## Owner sketch' or '## Cases' or lists no case; implement SKILL.md opens with the ticket map by default and reports the per-increment map as a deviation. ADR-0190.

Evidence: Branch ticket-587 commit 01cd658; 4 new Minitest cases in tests/runner/open_implementation_ticket_shape_test.rb; suite 1194 runs 0 failures; rubocop clean on changed files. Pipeline implementation 17: 7 dispatches, 752 s, escalated with unexpected_pass after behavior-verifier failed a documentation-only case; orchestrator hand-finished: deleted a raw-text SKILL.md test (3 RawFileContentAssertion offenses), moved TicketShape above the OpenImplementation comment and dropped a what-comment. refactorer, suite-check, and contract-auditor nodes did not run.

Follow-ups: Escalation cause captured as its own ticket (documentation-only case under ## Cases); #588 os-backlog validator side is the sibling ticket; none other.

## Resolution **Done:** Runner::TicketShape + OpenImplementation#check_ticket_shape! refuse a poodr-ticket-implementation run whose body lacks '## Owner sketch' or '## Cases' or lists no case; implement SKILL.md opens with the ticket map by default and reports the per-increment map as a deviation. ADR-0190. **Evidence:** Branch ticket-587 commit 01cd658; 4 new Minitest cases in tests/runner/open_implementation_ticket_shape_test.rb; suite 1194 runs 0 failures; rubocop clean on changed files. Pipeline implementation 17: 7 dispatches, 752 s, escalated with unexpected_pass after behavior-verifier failed a documentation-only case; orchestrator hand-finished: deleted a raw-text SKILL.md test (3 RawFileContentAssertion offenses), moved TicketShape above the OpenImplementation comment and dropped a what-comment. refactorer, suite-check, and contract-auditor nodes did not run. **Follow-ups:** Escalation cause captured as its own ticket (documentation-only case under ## Cases); #588 os-backlog validator side is the sibling ticket; none other.
jared closed this issue 2026-09-15 13:54:59 +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#587
No description provided.