Skip to content

REF-003: retire bash workflow dual path - #321

Merged
cursor[bot] merged 18 commits into
mainfrom
cursor/milestone-3-ref-003-b921
Sep 14, 2026
Merged

cursor[bot] merged 18 commits into
mainfrom
cursor/milestone-3-ref-003-b921

Conversation

@jmjava

@jmjava jmjava commented Sep 14, 2026

Copy link
Copy Markdown
Owner

Summary

REF-003 removes the duplicate bash workflow, gate, pointer, and registry implementations so Python sdlc_engine is the only lifecycle flow. Bash keeps install/upgrade packaging and a few retained utilities, which are now thin Python-engine clients.

All six operations (T01–T06) are complete and every acceptance criterion was executed rather than inferred.

What changed

  • Twin deleted. sdlc-workflow.sh, sdlc-team-registry.sh, and sdlc-pointer.sh are gone from templates/agent-context/ and sdlc-spdd/scripts/ — 3,100 shipped template LOC, 6,200 including the dogfood copies.
  • One mandatory engine. scripts/sdlc.sh requires Python 3.12 and an importable sdlc_engine, with no bash fallback. SDLC_ENGINE=shell and SDLC_GATE_ENGINE=shell exit non-zero; SDLC_ENGINE=python stays accepted as a no-op.
  • Retained utilities. start-agent-session.sh, capture-session-memory.sh, and accept-lessons.sh call the engine through SDLC_PY and no longer source a twin or shell out to bare python3 for engine behavior.
  • Shell bridge. sdlc-engine shell resolves helpers in both orchestrator scripts/ and installed sdlc-spdd/scripts/ layouts.
  • Packaging. Init and upgrade stop shipping the twins, upgrade backs up then deletes the exact retired paths, and install verification asserts their absence.
  • Harness matrix. test-sdlc-workflow.sh, test-sdlc-pointer.sh, and test-archive-work.sh are replaced by engine/tests_unit/ coverage; their CI workflows are removed.
  • Docs. Operator, testing, engine, template, and research docs describe one mandatory Python engine.

Defects found and fixed during review

  1. Complexity gate. Extending cmd_shell for installed targets raised its CCN from 4 to 6, and the gate fails on any rise in a touched function. Candidate enumeration and lookup moved into _shell_script_candidates and _resolve_shell_script.
  2. Harness Python resolution. Three migrated harnesses pinned ${REPO_ROOT}/.venv/bin/python, but CI installs the engine into the job interpreter and never creates a repo venv, so test-sdlc-workflow failed on a path that did not exist. Resolution now goes through one shared tests/lib/engine-python.sh, which test-integration-merge.sh and tests/live-consumer/lib.sh also use instead of their own copies of the same fallback chain.
  3. Misleading version error. resolve_engine_python parsed the version with read -r major minor <<<"$(...)". When the interpreter could not run at all, the here-string still supplied one empty line, so read returned 0 and the guard printed is 3. with an empty minor — which is how defect 2 surfaced in CI. It now detects the empty version string and reports an unrunnable interpreter, and prints the full major.minor for a wrong version.

REASONS Canvas

  • Work ID: REF-003-retire-bash-workflow-dual-path
  • Canvas: sdlc-spdd/spdd/canvas/REF-003-retire-bash-workflow-dual-path.md
  • Review: sdlc-spdd/spdd/reviews/REF-003-retire-bash-workflow-dual-path-review.md
  • Sync: sdlc-spdd/spdd/sync/REF-003-retire-bash-workflow-dual-path-sync.md

Checklist

  • Canvas updated or synced
  • One operation per coding session respected
  • Tests added or updated
  • Review completed
  • Safeguards respected
  • CI gates pass
  • If command/prompt adapter files changed, ran adapter parity validation

Test evidence

Check Result
Suite 1 — unit 288 passed
Suite 2 — integration 151 passed, coverage 91.58% (gate 90%)
Research suite 87 passed
Shell harnesses 24/25 passed; test-guide-stack-live.sh skipped (needs a live Guide + Neo4j stack)
Live-consumer shell matrix 113 passed, 0 failed, 1 skipped
Installed-target smoke 45/45 install checks, plus claim/pointer/next/status/gate/capture/accept and the shell bridge
ShellCheck bash -n clean; -S error clean
Complexity gate PASS against origin/main
Canvas / requirements / adapter / diagram validators PASS
Lifecycle gates (review, retro, sync) PASS

Not covered

  • test-guide-stack-live.sh needs a live Guide + Neo4j stack and was not run; it does not exercise the dispatcher contract this Work ID changed.
  • Manual chat smoke was not performed. The command adapters changed only in generated prose (removing "even when SDLC_ENGINE=shell"), and adapter parity plus spec generation are green.
Open in Web Open in Cursor 

cursoragent and others added 14 commits September 14, 2026 04:47
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
Co-authored-by: John Menke <jmjava@gmail.com>
@jmjava
jmjava marked this pull request as ready for review September 14, 2026 05:13
cursoragent and others added 4 commits September 14, 2026 05:24
Keeps cmd_shell within the diff complexity gate by moving candidate
enumeration and lookup into dedicated helpers.

Co-authored-by: John Menke <jmjava@gmail.com>
CI installs the engine into the job interpreter and never creates a repo
.venv, so harnesses pinning .venv/bin/python handed the dispatcher a path
that does not exist. Share one resolver across the shell harnesses and
make resolve_engine_python report an unrunnable interpreter instead of a
truncated version.

Co-authored-by: John Menke <jmjava@gmail.com>
REF-003 T05. Replace dual-engine prose in operator, testing, engine,
template, and research docs; drop the now-inert SDLC_ENGINE=python
prefixes from command examples; describe the pytest coverage that
replaced the retired twin harnesses. Route the last bare python3 calls
in the retained session/capture utilities through SDLC_PY.

Co-authored-by: John Menke <jmjava@gmail.com>
REF-003 T06. Add the review and sync artifacts, mark every acceptance
criterion and operation complete against a recorded run, reconcile the
stale shell-harness counts (30 -> 28 -> 25), and mark REF-003 Complete in
the requirement, Milestone 3, and the roadmap. Accept the four staged
lessons.

Co-authored-by: John Menke <jmjava@gmail.com>
@cursor
cursor Bot merged commit 1c9770b into main Sep 14, 2026
25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants