- Promote CHANGELOG [Unreleased] → [1.41.0] - 2026-05-07; add fresh [Unreleased] header - Fix CONFIGURATION.md version labels: 'added in v1.40' → 'added in v1.41' for models and dynamic_routing - Create docs/RELEASE-v1.41.0.md in compact v1.39.0 bullet format - Rewrite docs/RELEASE-v1.40.0-rc.1.md to compact bullet format (removes wall-of-text entries) - Add docs/FEATURES.md v1.41.0 section (features 126–131: per-phase models, dynamic routing, update banner, issue-driven orchestration, graphify staleness, MVP SDK verbs) - Update docs/FEATURES.md TOC - Trim README "Notable extras" table (highlight page, not a command menu) Fixes #3218 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
10 KiB
v1.41.0 Release Notes
Stable release. Published to npm under the latest tag.
npx get-shit-done-cc@latest
What's in this release
1.41.0 is a quality and infrastructure release. The headline additions are per-phase-type model selection and dynamic routing — two new config blocks that give you granular cost control without learning the agent taxonomy. The release also ships the MVP mode SDK resolution layer (three canonical query verbs replacing per-workflow bash duplication), the optional update banner for non-statusline users, and the issue-driven orchestration guide. Underneath that, 25+ correctness fixes cover Homebrew node path stability, planner directive fidelity, secure-phase retroactive audit, cross-runtime installs, and statusline parsing.
Added
-
Per-phase-type model selection (
modelsblock) — express "Opus for planning, Sonnet for the rest" in two config lines without learning the agent taxonomy. Six named slots (planning/discuss/research/execution/verification/completion) accept tier aliases (opus/sonnet/haiku/inherit). Fully backward compatible. (#3023) -
Dynamic routing with failure-tier escalation (
dynamic_routingblock) — start cheap, escalate only when the orchestrator detects a soft failure (inconclusive verification, plan-check FLAG). Disabled by default; composes withmodel_overridesandmodels.<phase_type>via the same precedence chain. (#3024) -
Optional update banner for non-GSD statusline users — when the installer detects no GSD statusline, it offers an opt-in
SessionStarthook that surfaces update availability via the existing~/.cache/gsd/gsd-update-check.jsoncache. Silent when up-to-date; removed cleanly by--uninstall. (#2795) -
Issue-driven orchestration guide — new
docs/issue-driven-orchestration.mdrecipe that maps tracker issues (GitHub / Linear / Jira) onto existing GSD primitives: workspace → discuss → plan → execute → verify → review → ship. (#2840)
Changed
-
MVP mode SDK resolution layer — three canonical query verbs — three new verbs centralize the MVP-mode predicates previously duplicated across workflows:
gsd-sdk query phase.mvp-mode <N>(precedence resolver),task.is-behavior-adding(Behavior-Adding Task predicate), anduser-story.validate(User Story regex). All consuming workflows now call the verb instead of inlining 4–8 bash lines each. Also fixes a silent SDK bug whereroadmap.get-phase --pick modereturnednullfor phases with**Mode:** mvpset. (#3178) -
/gsd-graphify statussurfaces commit-based staleness — readsbuilt_at_commitfrom graphify v0.7+ graphs, compares againstgit HEAD, and adds four new fields (built_at_commit,current_commit,commits_behind,commit_stale). Pre-v0.7 graphs returncommit_stale: nulland fall back to the existing mtime-based signal. (#3170) -
MVP concept index and domain glossary — seven MVP-related terms added to
CONTEXT.md; newreferences/mvp-concepts.mdindexes the six MVP reference files. No behavior change. (#3176)
Fixed
-
Stable node path on Homebrew —
resolveNodeRunner()now maps versioned Cellar paths to the stable Homebrew symlinks. Preventsdyld: Library not loadederrors afterbrew upgrade node. (#3181) -
Milestone-archive layout support —
validate consistency,validate health, andfind-phasenow scan.planning/milestones/v*-phases/in addition to the flat.planning/phases/layout, eliminating spurious W006 warnings. (#3164) -
/gsd-graphify buildruns inline instead of spawning a sub-agent — the post-extraction clustering phase was SIGTERM'd when the sub-agent exited, leaving nograph.json/graph.html/GRAPH_REPORT.mdartifacts. (#3166) -
Planner directive language restored — 10
CRITICAL/MANDATORY/MUSTemphasis markers were silently removed fromgsd-planner.mdin v1.38.4, weakening planner adherence to user decisions and requirement coverage. All restored. (#3138) -
secure-phaseretroactive-STRIDE mode for legacy phases — phases with no<threat_model>blocks no longer rubber-stamp a cleanSECURITY.md; the auditor now builds a register from implementation files before verifying mitigations. (#3142) -
Global skills resolution now uses the correct runtime home directory —
buildAgentSkillsBlock()hardcoded~/.claude/skillsfor all runtimes. The newruntime-homes.cjsmodule maps all 15 supported runtimes to their canonical skills directory. (#3126) -
state.begin-phaseis now idempotent — wave-resume calls no longer overwriteCurrent Plan,stopped_at, orLast Activity Descriptionwith stale values from the lastplan-phaserun. (#3127) -
gsd-validate-commit.shhook catches all git commit forms — the previous bash regex missedgit -C /path commit,GIT_AUTHOR_NAME=x git commit, and/usr/bin/git commit. Newhooks/lib/git-cmd.jstoken-walk classifier handles all forms correctly. (#3141) -
/gsd-plan-phaseno longer auto-dispatches to a subagent on OpenCode — theagent: gsd-plannerfrontmatter directive caused OpenCode to run the orchestrator in a context where theAgenttool is unavailable. Directive removed. (#3156) -
/gsd-quickworktree-merge resurrection guard — the invertedPRE_MERGE_FILESgrep that deleted freshly-created files (includingSUMMARY.md) is replaced with the git-history check used byexecute-phase.md. (#3195) -
gsd-healthno longer raises W019 forRETROSPECTIVE.md— registered inCANONICAL_EXACTinartifacts.cjsto match its established status as a milestone completion artifact. (#3200) -
--sdkflag now wired into SDK deployment —hasSdkwas parsed but never passed toinstallSdkIfNeeded, so--sdksilently skipped deployment. (#3033) -
Installer shell-path probe for SDK shim — no longer prints "✓ GSD SDK ready" when the shim is unreachable from the user's interactive shells; probes
$SHELL -lc 'printf %s "$PATH"'instead of the installer subprocess PATH. (#3028) -
Windows update-check no longer silently fails — passes
shell: trueon Windows sonpm.cmdresolves via PATHEXT; without this the statusline "⬆ /gsd-update" indicator never rendered on Windows. (#3102) -
Community
.shhooks use#!/usr/bin/env bash— the previous#!/bin/bashshebang fails on NixOS, minimal Alpine images, and some container runtimes. (#3194) -
Gemini local install no longer duplicates
/gsd:*commands — when GSD is already installed at user scope, a subsequent--gemini --localinstall skips the workspace scope. Previously both scopes received all 65 command files and Gemini's conflict detector renamed everything. (#3037) -
Workstream resolution in
init.milestone-opandroadmap.analyze— both handlers now respect--ws,GSD_WORKSTREAM, and.planning/active-workstream. Workstream-scoped repos no longer exit with "Nothing left to do" from reading the root.planning/directory. (#3196, #3207) -
gsd-tools config-set workflow._auto_chain_activeno longer rejected — the key was added to the SDK schema but not mirrored toconfig-schema.cjs; users routed throughgsd-toolssaw "Unknown config key." (#3197) -
Statusline state rendering is type-robust and YAML-list compatible — milestone completion renders for numeric and string
percentvalues;next_phasesparses both flow-array and block-list YAML. (#3153) -
Codex SessionStart hook uses absolute Node binary path — bare
nodeinconfig.tomlfailed with exit 127 under GUI/minimal-PATH runtimes. (#3022) -
config-set resolve_model_idsandworkflow._auto_chain_activeaccepted — both keys were documented or written by internal workflows but missing from the allowlists. (#3162)
What was in 1.40.0
RELEASE-v1.40.0-rc.1.md — skill-surface consolidation
(86 → 59, #2790), six
namespace meta-skills (#2792),
/gsd-health --context utilization guard, phase-lifecycle status-line read-side
(#2833), and Gemini
colon-form slash-command conversion.
Installing
# npm (global)
npm install -g get-shit-done-cc@latest
# npx (one-shot)
npx get-shit-done-cc@latest
# Pin to this exact version
npm install -g get-shit-done-cc@1.41.0
The installer is idempotent — re-running on an existing install updates in-place,
preserving your .planning/ directory and local patches.