Route behavior-verifier error to a bounded self-retry in poodr-ticket-implementation.yaml #623

Closed
opened 2026-09-22 18:40:41 +00:00 by jared · 1 comment
Owner

Context

/os-sdlc:implement 621 (implementation 11) ended implementation_failed at behavior-verifier after one verdict:error. #618 (ADR-0204) made the behavior-verifier error edge a bounded self-retry, but only in poodr-implementation.yaml. The ticket map that /os-sdlc:implement uses by default still routes error to the terminal node.

Observed

Dispatch 140 (behavior-verifier) settled in 9 s with no model call. Its handoff said the brief was empty. The Runner returned implementation_failed with no retry.

os-sdlc-runner subagent-stop  # dispatch 140, behavior-verifier
summary: 'Cannot verify: ticket_brief and code_changes were not delivered in the dispatch prompt (SubagentStart context was truncated to a persisted file; preview shows brief: null).'
verdict: error
{"type":"implementation_failed","node":"implementation-failed","reason":"verdict:error","implementation_id":11}

Map edges under behavior-verifier in plugins/os-sdlc/maps/poodr-ticket-implementation.yaml:

edges:
  pass: suite-check
  fail: { to: test-writer, bound: 2, progress_reset: true, note: "add every missing behavioral example in one round" }
  error: error

git show --stat b7db834f lists plugins/os-sdlc/maps/poodr-implementation.yaml and two tests. It does not list the ticket map.

Reproduce

grep -n -A6 "^  behavior-verifier:" plugins/os-sdlc/maps/poodr-ticket-implementation.yaml | grep "error:"

Prints error: error. The same grep on poodr-implementation.yaml prints the self-edge with bound: 1.

Expected

def test_ticket_map_behavior_verifier_error_retries_once
  # arrange: load poodr-ticket-implementation.yaml
  # assert: behavior-verifier edges[:error] targets behavior-verifier with bound 1
end

The map invariant tests that #618 extended for poodr-implementation.yaml cover the ticket map too.

Illustration

# illustration, not spec
behavior-verifier:
  edges:
    error: { to: behavior-verifier, bound: 1, note: "one retry on an empty or truncated brief" }

Second observation, same run: the harness persisted the SubagentStart hook output to a file because it was too large, and the persisted preview carried brief: null. The Runner-side change in #618 (never truncate code_changes) does not prevent this. The retry alone will hit the same truncation if the payload size is the cause. Measure the enrich payload for dispatch 140 and decide whether to split ticket_brief and code_changes into a file the agent reads.

Origin

  • Trigger: /os-sdlc:implement 621, implementation 11, dispatch 140
  • Improvised this session: none; run left failed, #621 labelled waiting
  • Chain: implementation_failed ← ticket map routes verifier error to terminal (poodr-ticket-implementation.yaml, DESIGN under ADR-0160 map-as-configuration) ← #618 patched one map of two (commit b7db834f) ← verifier saw brief: null because the harness persisted an oversized SubagentStart context (UPSTREAM-TOOL, Claude Code hook output persistence, version unknown)
  • Root candidate: this ticket for the map; the payload-size question may need its own ticket after measurement
  • Where: plugins/os-sdlc/maps/poodr-ticket-implementation.yaml, plugins/os-sdlc/tests/poodr_implementation_map_test.rb
  • Session: 25bd05eb-9741-472e-99df-9994fc28e69e
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/25bd05eb-9741-472e-99df-9994fc28e69e.jsonl

VERDICT: CREATE — root cause: #618 patched poodr-implementation.yaml only; this names the remaining map gap with a real failure (dispatch 140) and a concrete test.

## Context `/os-sdlc:implement 621` (implementation 11) ended `implementation_failed` at behavior-verifier after one `verdict:error`. #618 (ADR-0204) made the behavior-verifier error edge a bounded self-retry, but only in `poodr-implementation.yaml`. The ticket map that `/os-sdlc:implement` uses by default still routes `error` to the terminal node. ## Observed Dispatch 140 (behavior-verifier) settled in 9 s with no model call. Its handoff said the brief was empty. The Runner returned `implementation_failed` with no retry. ``` os-sdlc-runner subagent-stop # dispatch 140, behavior-verifier ``` ``` summary: 'Cannot verify: ticket_brief and code_changes were not delivered in the dispatch prompt (SubagentStart context was truncated to a persisted file; preview shows brief: null).' verdict: error {"type":"implementation_failed","node":"implementation-failed","reason":"verdict:error","implementation_id":11} ``` Map edges under `behavior-verifier` in `plugins/os-sdlc/maps/poodr-ticket-implementation.yaml`: ``` edges: pass: suite-check fail: { to: test-writer, bound: 2, progress_reset: true, note: "add every missing behavioral example in one round" } error: error ``` `git show --stat b7db834f` lists `plugins/os-sdlc/maps/poodr-implementation.yaml` and two tests. It does not list the ticket map. ## Reproduce ``` grep -n -A6 "^ behavior-verifier:" plugins/os-sdlc/maps/poodr-ticket-implementation.yaml | grep "error:" ``` Prints `error: error`. The same grep on `poodr-implementation.yaml` prints the self-edge with `bound: 1`. ## Expected ```ruby def test_ticket_map_behavior_verifier_error_retries_once # arrange: load poodr-ticket-implementation.yaml # assert: behavior-verifier edges[:error] targets behavior-verifier with bound 1 end ``` The map invariant tests that #618 extended for `poodr-implementation.yaml` cover the ticket map too. ## Illustration ```yaml # illustration, not spec behavior-verifier: edges: error: { to: behavior-verifier, bound: 1, note: "one retry on an empty or truncated brief" } ``` Second observation, same run: the harness persisted the SubagentStart hook output to a file because it was too large, and the persisted preview carried `brief: null`. The Runner-side change in #618 (never truncate `code_changes`) does not prevent this. The retry alone will hit the same truncation if the payload size is the cause. Measure the enrich payload for dispatch 140 and decide whether to split `ticket_brief` and `code_changes` into a file the agent reads. ## Origin - Trigger: `/os-sdlc:implement 621`, implementation 11, dispatch 140 - Improvised this session: none; run left failed, #621 labelled `waiting` - Chain: `implementation_failed` ← ticket map routes verifier `error` to terminal (`poodr-ticket-implementation.yaml`, DESIGN under ADR-0160 map-as-configuration) ← #618 patched one map of two (commit b7db834f) ← verifier saw `brief: null` because the harness persisted an oversized SubagentStart context (UPSTREAM-TOOL, Claude Code hook output persistence, version unknown) - Root candidate: this ticket for the map; the payload-size question may need its own ticket after measurement - Where: `plugins/os-sdlc/maps/poodr-ticket-implementation.yaml`, `plugins/os-sdlc/tests/poodr_implementation_map_test.rb` - Session: 25bd05eb-9741-472e-99df-9994fc28e69e - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/25bd05eb-9741-472e-99df-9994fc28e69e.jsonl VERDICT: CREATE — root cause: #618 patched poodr-implementation.yaml only; this names the remaining map gap with a real failure (dispatch 140) and a concrete test.
Author
Owner

Resolution

Done: Superseded by #627. The map retry resends the same oversized payload and cannot fix the verifier error; the root cause is Claude Code's 10,000-character hook additionalContext cap (no override). All ten ticket-map nodes route error to the terminal node, and a deterministic error should fail loudly, so the retry edge is not added.

Evidence: Cap documented at https://code.claude.com/docs/en/hooks.md (Hook input and output). Map survey 2026-09-22: every node in poodr-ticket-implementation.yaml routes error: error; only the #618 self-edge in poodr-implementation.yaml differs. Session bcd41422-a277-439c-b169-4fbfa8560ee3.

Follow-ups: #627 delivers oversized briefs through os-sdlc-runner brief --dispatch-id. Whether to remove the #618 self-retry edge (ADR-0204) is a user decision, unticketed.

## Resolution **Done:** Superseded by #627. The map retry resends the same oversized payload and cannot fix the verifier error; the root cause is Claude Code's 10,000-character hook additionalContext cap (no override). All ten ticket-map nodes route error to the terminal node, and a deterministic error should fail loudly, so the retry edge is not added. **Evidence:** Cap documented at https://code.claude.com/docs/en/hooks.md (Hook input and output). Map survey 2026-09-22: every node in poodr-ticket-implementation.yaml routes error: error; only the #618 self-edge in poodr-implementation.yaml differs. Session bcd41422-a277-439c-b169-4fbfa8560ee3. **Follow-ups:** #627 delivers oversized briefs through os-sdlc-runner brief --dispatch-id. Whether to remove the #618 self-retry edge (ADR-0204) is a user decision, unticketed.
jared closed this issue 2026-09-22 20:42:35 +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#623
No description provided.