Skip to content

Release 6.1.0

Released 2026-10-03. A run now ends with the sprint report you sign, and that report states what it measured rather than what it could see. This page summarises the release notes, which name the units behind each passage; every change is in the CHANGELOG.

  • A run ends with its signed report. The handoff page is gone. sprint.py close files the sprint report and puts its rendered page in front of you before it asks for the signature, and sprint.py sign seals it. The report’s known-issues section lists every open finding raised in the run and every carried unit; the next sprint.py plan names the last signed report and its open items, and sprint.py plan --worklist RPTxxxx plans them. The HO files you already have stay readable, and handoff.py show still prints the remaining work without writing anything.
  • The report states what it measured. A unit built through a lane, sprint.py lane brief then lane return, is now measured: in RPT0014, 29 of 34 units read NOT MEASURED because lane-built units never opened a span. lane return --tokens N --minutes M records the builder agent’s own totals against its unit, so a delegated agent’s spend counts: RPT0014’s token actual was the main thread’s meter alone and read 0.2x of its forecast, where RPT0016’s adds 53 agent totals. The minutes ratio compares like with like, and a ratio the page cannot derive is withheld, naming the units that left it short.
  • A plain install is the latest verified release. install.sh with no --version installs the latest published release and checks it against its .sha256, instead of the unverified main branch. Copilot CLI installs globally, to the ~/.agents/skills folder it reads. Install and upgrade no longer damage a project’s own files.
  • migrate tells you more of what it leaves you. It names each line of your markdown docs that still names a retired command, with what replaced it. Its report agrees with the gate, names the engagement-floor and conformance cutoffs, seeds the .gitignore that init writes, and names a file it cannot read rather than stopping with a traceback.
  • Fewer hand moves at the close. sprint.py sign moves the approved units to Done or Fixed without invalidating the page it has just sealed. The reviewer whose REJECT carried a unit at the review cap can discharge it with an APPROVE, the carried bug is filed ready for the next plan, and a lesson class finishes its lifecycle at the close with no hand edit.

Reinstall, then carry each project across. From 6.0 to 6.1 has the pinned install command and each retired name beside its replacement.

/sdlc-studio migrate # a dry run: lists what it would change, writes nothing
/sdlc-studio migrate --apply # removes review.policy, restamps the project version

migrate --apply removes review.policy from sdlc-studio/.config.yaml, the one config key 6.1 retires, keeping every other byte. Both runs name each line of your markdown docs that uses a retired handoff command. Neither reads your CI files or scripts, so search those yourself.

What a 6.0 user meets by being refused or surprised:

  • handoff.py generate and artifact.py new --type handoff are gone, and so is gate.py --require-handoff: the signed report from sprint.py sign is the run’s hand-over.
  • The review.policy key is retired: every project carries a unit whose REJECT stands at the review cap, filing its findings as a bug.
  • A plain install no longer tracks main; pass --version main to keep the moving branch.
  • --target copilot writes ~/.agents/skills, where it wrote the current directory’s .github/skills; --local still writes the repository’s.
  • The release gate’s revert-check lane is gone; verify_ac.py revert-check --unit <id> stays, for one unit.
  • validate.py check exits 1 where there is no sdlc-studio/ workspace, and says so.
  • BG0940 (Medium). A ruling logged between the close and the sign changes the filed page, and the sign seals it without re-deriving.
  • BG0943 (Low). config.py show cannot see any review key declared after the severity_levels list.