Add os-sdlc-implementation-abandon to abandon one implementation by id #899
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
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
rule-proposal
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#899
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?
Problem
os-sdlc has no operator command to abandon an implementation.
Implementation#abandon!(model/implementation/lifecycle.rb) andImplementation.abandon_unfinished!(model/implementation.rb) exist, but the only caller isImplementation.open, which abandons the unfinished runs of one session.plugins/os-sdlc/skills/pipeline-state-investigate/SKILL.mdsays "there is no operator-initiated abandon path". Implementation 14 (#880, status needs-orchestrator, escalation 6) must be abandoned so that the schema bump in #895 is allowed, becauseDbrefuses a replacement while any implementation has no terminal stamp. Today the only way is to edit the database by hand. #895 is blocked by this ticket.Approach
Add
bin/os-sdlc-implementation-abandon <id> --reason <text>. It abandons one implementation by id, requires a reason, refuses an implementation that already has a terminal stamp, and reports what it stamped. Theabandoned_atcolumn has no reason column beside it, so the reason is echoed in the report and not stored; do not add a column (schema work belongs to #895).Required work:
implementation-abandoninplugins/os-sdlc/bin/os-sdlc-implementation-abandon"implementation-abandon"inplugins/os-sdlc/lib/os_sdlc/controller/boot/commands.rb--reasonin the Boot inputs — check: presentimplementation_abandoninplugins/os-sdlc/lib/os_sdlc/controller/boot/inputs.rbclass Abandoninginplugins/os-sdlc/lib/os_sdlc/controller/implementation/abandoning.rbabandoned_at, and builds the report — check: presentclass Abandoninplugins/os-sdlc/lib/os_sdlc/command/implementation/abandon.rbImplementation::NotActivefor an implementation that is not active — check: presentNotActiveinplugins/os-sdlc/lib/os_sdlc/command/implementation/abandon.rbthere is no operator-initiated abandon pathinplugins/os-sdlc/skills/pipeline-state-investigate/SKILL.mdos-sdlc-implementation-abandoninplugins/os-sdlc/skills/pipeline-state-investigate/SKILL.md--reasoninput toBoot::Inputsand theimplementation-abandonentry toBoot::Commands(controller/boot/) — check: presentimplementation-abandoninplugins/os-sdlc/lib/os_sdlc/controller/boot/commands.rbplugins/os-sdlc/references/escalation-procedure.md(line 12 says only a fresh implementation-open abandons a waiting run) — check: presentos-sdlc-implementation-abandoninplugins/os-sdlc/references/escalation-procedure.mdplugins/os-sdlc/skills/implement/SKILL.md— check: presentos-sdlc-implementation-abandoninplugins/os-sdlc/skills/implement/SKILL.mdScope: abandon means stamp only, the same as
Implementation.open(abandon_unfinished!updatesabandoned_atandupdated_at). Escalation rows stay as history (ADR-0165 derives state from implementation stamps). Handoffs and dispatches are not settled. Test patterns to copy: tests/model/implementation_report_cli_test.rb and tests/pipeline/cli_implementation_open_test.rb; check tests/cops/bin_script_load_in_test_test.rb. Add one History row to docs/implementation-status/os-sdlc.md and run bin/refresh-plugins.Acceptance criteria
os-sdlc-implementation-abandon <id> --reason "<text>"runs, thenabandoned_atis stamped,completed_atandfailed_atstay NULL, and the command exits 0.completed_at,failed_at, orabandoned_atset, when the command runs, then it exits non-zero, names the existing terminal stamp on stderr, and changes no row.--reasonor an empty one, when the command runs, then it exits non-zero with a usage message and changes no row.Dbchecks for a replacement, then that implementation no longer blocks it.Owner sketch
Abandonfinds the row, raises the existingImplementation::NotActiveunlessImplementation#active?, calls the existingImplementation#abandon!, and returns the report.abandon!andabandon_unfinished!stay as they are.Origin
Parent: #859
Blocked by: none
VERDICT: CREATE (ticket-skeptic 2026-10-02: user-directed; unblocks #895 schema bump)
Work started: /os-sdlc:implement on branch ticket-899 (worktree .claude/worktrees/ticket-899).
Resolution
Done: Added bin/os-sdlc-implementation-abandon --reason : Boot key implementation-abandon, controller Implementation::Abandoning, command Implementation::Abandon raising the existing Implementation::NotActive; it stamps abandoned_at only. Skill and escalation-procedure prose name the new operator path.
Evidence: Commit
7d985405on ticket-899 (implementation 15 complete, 14 dispatches, contract-auditor pass after 2 refactor rounds); suite-check green 3 times; new tests in plugins/os-sdlc/tests/pipeline/cli_implementation_abandon_test.rb.Follow-ups: History row in docs/implementation-status/os-sdlc.md added by the orchestrator after merge. Abandon reason is echoed, not stored: dropped, per ticket scope (no schema change).