Accept drafted maps at the reroute gate with bounded validator feedback #881

Closed
opened 2026-10-01 15:26:46 +00:00 by jared · 3 comments
Owner

Problem

ADR-0258 decisions 4 and 9 let map-router draft a map when no approved map fits. A draft that fails Map::Loader or Map::Validator must reach map-router as feedback, bounded at 2 rounds (decision 4). The REROUTE block also does not show that the chosen map is a draft.

Reproduce

n/a: design change, nothing to reproduce.

Approach

Validator feedback for a drafted map surfaces at os-sdlc-implementation-map-update, per ADR-0260. Reroute::Draft#write already refuses a map that does not load and writes no reroute row. The reroute gate does not change: it still confirms that a pending reroute row exists (Reroute::Check#report).

  1. Reroute::Block prints map: NAME (drafted) when the proposed map is drafted (Map#drafted?), else map: NAME (selected).
  2. The map-router node fail edge becomes { to: map-router, bound: 2 } in plugins/os-sdlc/maps/poodr-ticket-implementation.yaml, plugins/os-sdlc/maps/poodr-guard-implementation.yaml, and plugins/os-sdlc/tests/fixtures/maps/reroute_waiting.yaml. The pass edge stays unchanged.
  3. A test pins that map-update with a drafted map that fails the validator exits nonzero with the validator message and writes no reroute row. The behavior exists; the test protects it.

Required work:

  1. Label drafted maps in the REROUTE block — check: present (drafted) in plugins/os-sdlc/lib/os_sdlc/presenter/reroute/block.rb
  2. Send map-router failures back to map-router in the ticket map — check: present to: map-router, bound: 2 in plugins/os-sdlc/maps/poodr-ticket-implementation.yaml
  3. Send map-router failures back to map-router in the guard map — check: present to: map-router, bound: 2 in plugins/os-sdlc/maps/poodr-guard-implementation.yaml
  4. Send map-router failures back to map-router in the reroute_waiting fixture — check: present to: map-router, bound: 2 in plugins/os-sdlc/tests/fixtures/maps/reroute_waiting.yaml

Acceptance criteria

  1. Given a reroute whose proposed map is drafted, when the REROUTE block prints, then it reads map: NAME (drafted); for an approved map it reads map: NAME (selected).
  2. Given map-router calls os-sdlc-implementation-map-update with a drafted map that fails Map::Validator, then the CLI exits nonzero naming the defect and writes no row.
  3. Given the map-router node in both approved maps and the reroute_waiting fixture, then its fail edge is { to: map-router, bound: 2 }.

Owner sketch

class OsSdlc::Reroute::Block
  def initialize(reroute, map)
  def to_s
end

Origin

  • Trigger: user ruling on the map reroute design, 2026-10-01 (ADR-0258 decisions 4, 9; ADR-0259 A3)
  • Improvised this session: none
  • Chain: an unmapped ticket shape is hand-finished ← the reroute gate accepts only approved maps ← DESIGN (docs/adr/0258)
  • Root candidate: #859
  • Where: plugins/os-sdlc/lib/os_sdlc/presenter/reroute/block.rb, plugins/os-sdlc/maps/poodr-ticket-implementation.yaml, plugins/os-sdlc/maps/poodr-guard-implementation.yaml, plugins/os-sdlc/tests/fixtures/maps/reroute_waiting.yaml
  • Session: 55a56279-83ee-47d5-a21e-ee67f9e28abd
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/55a56279-83ee-47d5-a21e-ee67f9e28abd.jsonl

Parent: #859
Blocked by: #880, #873, #876, #904

## Problem ADR-0258 decisions 4 and 9 let map-router draft a map when no approved map fits. A draft that fails `Map::Loader` or `Map::Validator` must reach map-router as feedback, bounded at 2 rounds (decision 4). The REROUTE block also does not show that the chosen map is a draft. ## Reproduce n/a: design change, nothing to reproduce. ## Approach Validator feedback for a drafted map surfaces at `os-sdlc-implementation-map-update`, per ADR-0260. `Reroute::Draft#write` already refuses a map that does not load and writes no reroute row. The reroute gate does not change: it still confirms that a pending reroute row exists (`Reroute::Check#report`). 1. `Reroute::Block` prints `map: NAME (drafted)` when the proposed map is drafted (`Map#drafted?`), else `map: NAME (selected)`. 2. The map-router node `fail` edge becomes `{ to: map-router, bound: 2 }` in `plugins/os-sdlc/maps/poodr-ticket-implementation.yaml`, `plugins/os-sdlc/maps/poodr-guard-implementation.yaml`, and `plugins/os-sdlc/tests/fixtures/maps/reroute_waiting.yaml`. The `pass` edge stays unchanged. 3. A test pins that map-update with a drafted map that fails the validator exits nonzero with the validator message and writes no reroute row. The behavior exists; the test protects it. Required work: 1. Label drafted maps in the REROUTE block — check: present `(drafted)` in `plugins/os-sdlc/lib/os_sdlc/presenter/reroute/block.rb` 2. Send map-router failures back to map-router in the ticket map — check: present `to: map-router, bound: 2` in `plugins/os-sdlc/maps/poodr-ticket-implementation.yaml` 3. Send map-router failures back to map-router in the guard map — check: present `to: map-router, bound: 2` in `plugins/os-sdlc/maps/poodr-guard-implementation.yaml` 4. Send map-router failures back to map-router in the reroute_waiting fixture — check: present `to: map-router, bound: 2` in `plugins/os-sdlc/tests/fixtures/maps/reroute_waiting.yaml` ## Acceptance criteria 1. Given a reroute whose proposed map is drafted, when the REROUTE block prints, then it reads `map: NAME (drafted)`; for an approved map it reads `map: NAME (selected)`. 2. Given map-router calls os-sdlc-implementation-map-update with a drafted map that fails Map::Validator, then the CLI exits nonzero naming the defect and writes no row. 3. Given the map-router node in both approved maps and the reroute_waiting fixture, then its `fail` edge is `{ to: map-router, bound: 2 }`. ## Owner sketch ```ruby class OsSdlc::Reroute::Block def initialize(reroute, map) def to_s end ``` ## Origin - Trigger: user ruling on the map reroute design, 2026-10-01 (ADR-0258 decisions 4, 9; ADR-0259 A3) - Improvised this session: none - Chain: an unmapped ticket shape is hand-finished ← the reroute gate accepts only approved maps ← DESIGN (docs/adr/0258) - Root candidate: #859 - Where: plugins/os-sdlc/lib/os_sdlc/presenter/reroute/block.rb, plugins/os-sdlc/maps/poodr-ticket-implementation.yaml, plugins/os-sdlc/maps/poodr-guard-implementation.yaml, plugins/os-sdlc/tests/fixtures/maps/reroute_waiting.yaml - Session: 55a56279-83ee-47d5-a21e-ee67f9e28abd - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/55a56279-83ee-47d5-a21e-ee67f9e28abd.jsonl Parent: #859 Blocked by: #880, #873, #876, #904
Author
Owner

Work started on branch ticket-881 (os-sdlc pipeline, map poodr-ticket-implementation).

Work started on branch ticket-881 (os-sdlc pipeline, map poodr-ticket-implementation).
Author
Owner

Re-scoped 2026-10-02 after implementation 10 escalation (change-auditor dispatch 75): validator feedback surfaces at map-update (Draft#write already refuses, no row); gate unchanged per ADR-0260. Remaining work: drafted label, map-router fail bound 2, pinning test.

Re-scoped 2026-10-02 after implementation 10 escalation (change-auditor dispatch 75): validator feedback surfaces at map-update (Draft#write already refuses, no row); gate unchanged per ADR-0260. Remaining work: drafted label, map-router fail bound 2, pinning test.
Author
Owner

Resolution

Done: Re-scoped after implementation 10 escalation (stale premise: gate cannot read the map-router handoff, ADR-0260). Validator feedback for a drafted map surfaces at map-update (Draft#write refuses, writes no row) and is now pinned by test. Reroute::Block prints (drafted)/(selected) via Map#drafted?. map-router fail edge loops to map-router at bound 2 in both approved maps and the reroute_waiting fixture.

Evidence: Branch ticket-881: 9bbc53ea (implementation 12), History row f212e32a. Suite-check dispatch 106 green incl. required-work; behavior-verifier dispatch 105 pass; contract-auditor dispatch 107 pass. Implementation 10 abandoned with reason.

Follow-ups: none

## Resolution **Done:** Re-scoped after implementation 10 escalation (stale premise: gate cannot read the map-router handoff, ADR-0260). Validator feedback for a drafted map surfaces at map-update (Draft#write refuses, writes no row) and is now pinned by test. Reroute::Block prints (drafted)/(selected) via Map#drafted?. map-router fail edge loops to map-router at bound 2 in both approved maps and the reroute_waiting fixture. **Evidence:** Branch ticket-881: 9bbc53ea (implementation 12), History row f212e32a. Suite-check dispatch 106 green incl. required-work; behavior-verifier dispatch 105 pass; contract-auditor dispatch 107 pass. Implementation 10 abandoned with reason. **Follow-ups:** none
jared closed this issue 2026-10-02 17:24:16 +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.

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