Build the map-driven os-sdlc runner (ADR-0133/0134/0135) #438
Labels
No labels
P0
P1
P2
P3
bug
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#438
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Build the map-driven os-sdlc runner [capture]
Context
Deep planning session 2026-08-19/20 produced the map-runner design (docs/os-sdlc-rebuild/map-runner-design.md) and ADRs 0133/0134/0135. This ticket captures the build. Spec below.
Origin
Tasks
Acceptance Criteria
Specification
Spec: Map-driven os-sdlc runner
Design record:
docs/os-sdlc-rebuild/map-runner-design.md. Decisions: ADR-0133, ADR-0134, ADR-0135 (with ADR-0130/0131/0132 as amended context).Problem Statement
The runner hardcodes its pipeline in Ruby. To change what happens after a gate fails, or to add a non-coding pipeline, the user must edit runner code. ADR-0130 removed the map-as-data layer by accident, so routing policy and process shape now live in the same place as the mechanism. Handoffs can also leak across implementations, and agents address their own handoffs, which lets a writer route work to the wrong place.
Solution
Reinstate maps as data. A map is a YAML file that declares agent nodes, verdict-routed edges, per-edge loop bounds, and an error node. The runner loads one map per implementation, proves at load time that the map terminates, and then only walks it: dispatch the node's agent, take the verdict, follow the edge. Process changes become map edits. The default coding map keeps today's behavior: a gate fail routes to the error node and the implementation fails loudly.
User Stories
Implementation Decisions
Testing Decisions
Out of Scope
Further Notes
Pre-flight grilling complete 2026-08-20. Approved interface sketches for slices 0 and 4 live in docs/os-sdlc-rebuild/interface-sketches.md (guard manifests: any class/public method/signature not in the sketch → implementing agent stops and surfaces). Settled decisions: D4 Router stays pure, NextStep applies the Decision; D5 state_machine.rb + test deleted at slice 4 (resolves this ticket's open state-machine question); D2 slice-0 tests outside tests/runner/; D3 routing-only nodes use a single default: edge; D6 verdict persists on dispatches.verdict at E3; D7 toy map is a test fixture, no maps/ until slice 6. Process: sequential build, one child ticket per slice, seam-design sketch produced just-in-time one slice ahead. Slice 0 captured as #439.
Resolution
Done: Map-driven os-sdlc runner built end to end across slices 0-7: map loading/validation, DB-backed rounds, gate and agent verdicts, router with bounded retry edges, hooks integration, real coding map, agents realigned to the handoff contract, close-out remediation complete (B1 prose + intake guard, doc sweep, D57, slice-0 history row)
Evidence: Suite 851 runs, 2146 assertions, 0 failures, 0 rubocop offenses on touched code; 9 of 10 acceptance criteria passed with evidence in the #447 review, AC10 doc sweep completed 2026-08-21; ADRs 0133-0137 record the decisions
Follow-ups: Live-run hook proof is explicitly NOT claimed and is captured as #454; #455/#456/#457 capture the remaining review notes; #452 round-vocabulary seams; #453 first official map and agent configuration