Build #438 slice 3: subagent-stop records handoff + produces gate verdict #442
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#442
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?
Parent
#438 (map-driven os-sdlc runner build spec). Design: docs/os-sdlc-rebuild/map-runner-design.md. Settled decisions + guard-manifest process: docs/os-sdlc-rebuild/interface-sketches.md.
Pre-build gate
First step before any code: run the seam-design pass per docs/os-sdlc-rebuild/seam-design-prompt.md to produce this slice's interface sketch. The sketch is the guard manifest: any class, public method, or signature change beyond it → stop, comment on this ticket, do not write it.
What to build
The E3 entrypoint takes the stopping agent's JSON on stdin, validates the structured YAML handoff (verdict when the node's verdict source is agent, summary, optional items), rejects malformed content loudly at intake — exit 3, never stored — and runs GateVerdict for gate-sourced nodes producing pass/fail. The verdict persists on dispatches.verdict (settled decision D6 — slice 4 reads it there). CompletionIntake keeps terminal stamping until slice 4 replaces it. Handoffs record created_by as an FK; agent_type derives via the creator, never a denormalized string; the writer never addresses a target.
Acceptance criteria
Blocked by
Origin
Work started: building slice 3 via the TDD loop on branch build/438-slice-3. Sketch approved with D17-B (enrich-driven brief facts), D18 (created_by + target_agent_type split), D19 (parse handoff before first write), D20 (schema 8 incl. approved D12 exception for target_agent_type).
Resolution
Done: Slice 3 built TDD-first on build/438-slice-3, merged to main at
87ff85d. E3 subagent-stop parses/validates handoff content before any write (D19: malformed → named defect, exit 3, zero rows, unstamped dispatch), splits handoff producer/target as created_by + target_agent_type (D18, schema 8 with dispatches.verdict per D20 incl. the user-approved D12 exception), records gate verdicts via GateVerdict/Verdict, and briefs are enrich-driven per D17-B. A concurrent Map::Loader namespace refactor from peer session os-sdlc-76 was sequenced as its own commit3fbe518with ADR-0136.Evidence: ruby -Ilib tests/all.rb: 833 runs, 2137 assertions, 0 failures (verified by orchestrator; 16 new tests incl. malformed-first-red, claim-scoping, agent-sourced verdict). rubocop zero offenses on all dirty files, no disables. Zero stale MapLoader/MapValidator references at the refactor commit.
Follow-ups: Sdlc/Structural/PrimitiveObsessedIvar cop crashes on masgn-to-ivar patterns (lib/os_sdlc/cops/primitive_obsessed_ivar.rb:85) — same cop crash family as the already-ticketed node.rb crash; noted on that existing ticket's scope, no new ticket filed. E3 payload still emits round_complete/round_failed types; their retirement is owned by slice 4's approved sketch (existing ticket #443).