v1.42.0-rc1 is a release candidate cutting forward from v1.41.0 with all the fixes that shipped in the v1.41.1 hotfix, plus a new security gate, two seam refactors, and additional state/workstream/docs corrections.
π New-features companion doc: docs/RELEASE-v1.42.0-rc.1.md β feature-scoped writeup of the package legitimacy gate and the two architecture deepenings, with link-outs to v1.41.1 / v1.41.0 for prior content. (Resolves once #3280 merges to main.)
Added
Security
- Package legitimacy gate against slopsquatting β three-layer defense across the research β plan β execute pipeline. Hallucinated package names that pre-register on npm/PyPI/crates.io with malicious post-install scripts no longer flow undetected through
gsd-executor. Integratesslopcheckat the research boundary, requires human-verify checkpoints in plans for suspicious packages, and tightens the executor's auto-fix scope. (#3215)
Changed
Architecture
- SDK package seam deepened; runtime-global skills policy converged β legacy package/install-layout compatibility (previously leaked across
state-project-load,verify,roadmap, prompt-loading paths,agent-skills,skill-manifest, andgenerateDevPreferences) is now centralized behind the SDK Package Seam Module, with a single runtime-global skills path policy shared by SDK and CJS callers. (#3238) - Phase lifecycle seams deepened β
phase-lifecycle.tsbecomes a thin public orchestrator. Three new modules extracted: Phase Numbering Policy, Phase Filesystem Adapter (directory listing, gitkeep, archive), and Phase Roadmap Mutation (replaceInCurrentMilestone+ atomic ROADMAP read-modify-write). Backward-compatible re-exports preserved. (#3267)
Fixed
Phase planning & state
- Wave 0 plans no longer collapse into wave 1, and
depends_onis honored βphase-plan-indexnow derives waves from a Kahn topological sort overdepends_on(with cycle detection) instead of trusting thewave:frontmatter alone, and a parsedwave: 0is preserved instead of being coerced byparseInt(...) || 1. A declaredwave:that disagrees with the computed level surfaces as a non-fatal warning. CJS and SDK twins fixed identically. (#3276) execute-phasestep 5.5 documents the cross-wave-deviation cleanup tail so deviation cleanup is no longer silently skipped between waves. (#3273)buildStateFrontmattercounts nestedplans/<N>-PLAN-<NN>-<slug>.mdfiles β repos using the post-#3139 nested layout no longer getprogress.*counters silently overwritten downward on every state mutation (the reporter'stotal_plans: 36 β 25regression is fixed). Flat-layout repos are unaffected. (#3261)state snapshotprefers YAML frontmatter for canonical fields β body table cells like**Status:** to β COMPLETEno longer override the correct frontmatter value. Numeric frontmatter scalars (current_phase: 19) are preserved instead of dropped. Falls back to body extraction only when the key is absent. (#3275)state.updateon body-only changes preserves curatedprogress.*frontmatter β a "Last Activity" edit no longer tramples manually-curated cross-milestone counters. The progress-percent formula now appliesmin(plan_fraction, phase_fraction), so 22/22 plans across 6/12 declared phases reports 50%, not a false 100%. (#3252)phase.addhonors--dry-runand rejects unknown flags β--dry-runwas silently absorbed into the phase description; it now returns{ dry_run: true, roadmap_entry }and skips disk writes. Any unrecognized--flagraises a validation error. (#3246)
Workstream
workstream create --migrate-namenormalizes through the canonical slug policy β raw values containing spaces or non-[a-z0-9-]characters no longer create migrated directories that later workstream commands reject. Empty post-normalization names fail fast. (#3269)
Query dispatch & CLI
- Native
--helpis non-mutating β a dispatcher-level guard short-circuits to a help stub whenever--help/-happears in args destined for a mutating handler, with defense-in-depth inmilestoneCompleterejecting--helpas a version value. (#3272) - CJS dispatcher accepts the canonical dotted command form β
state.update,roadmap.analyze,phases.list, etc. now resolve correctly when callers bypass the SDK. Unknown dotted commands suggest the spaced equivalent. (#3248) extractFrontmatteris anchored at file start β the regex no longer matches a frontmatter-shaped block later in the file, fixing fields read off the wrong block. (#3247)
Code review pipeline
code-reviewSUMMARY parser hardened;BL-/blocker:accepted as Critical-tier β fixes three cooperating bugs:compute_file_scopeno longer captures prose bullets as file paths (boundary regex widened to[\w-]+, with path-validity guard);present_resultsgrep accepts bothcritical:andblocker:keys (and### BL-headings);gsd-code-fixertreatsBL-*findings as Critical-tier-equivalent toCR-*instead of dropping them. POSIX[[:space:]]replaces\sso the grep works on BSDgrep(macOS). (#3274)
Install
- Codex install accepts TOML float values β
parseTomlValuenow reads TOML 1.0 floats (decimals, exponents, signed,_separators), sotool_timeout_sec = 20.0no longer triggers a fatal schema error. The Codex post-install rollback is unified and idempotent: it now revertsconfig.toml,skills/gsd-*,agents/gsd-*,get-shit-done/VERSION, and orphaned atomic-write temp files together, leaving no hybrid state behind. (#3254) β GSD SDK readyonly prints once SDK is genuinely reachable β install now requires a persistent cross-shell PATH probe and filters transient_npxentries from bothprocess.env.PATHand the login-shell PATH before declaring success. Eliminates false-ready signals on Linux. (#3249)config-set model_overrides.<agent-id>accepted β was previously rejected as an unknown key. (#3253)- Shared model catalog as the single source of truth for agent profiles and runtime tier defaults (ADR-0003) β replaces four drifting truths (CJS
model-profiles, SDKconfig-query,settings-advanced.md, session-runner) withsdk/shared/model-catalog.json, consumed by both packages via thin adapters.resolve-modelnow covers all 33 shipped agents; unknown-agent fallback is profile-semantic (qualityβopus,budgetβhaiku,balanced/adaptiveβsonnet) instead of hardcoded sonnet. (#3230)
Capture
/gsd-capture --seedone-shot contract restored β the workflow now defines$KEYWORDfrom$IDEAincollect-breadcrumbs, wires--enrichto skipparse-ideaand target the resolved seed, and adds language identifiers toplant-seedcode blocks. (#3250)
Documentation
- v1.41.0 release documentation β
CHANGELOG.mdpromoted from[Unreleased]β[1.41.0] - 2026-05-07;docs/CONFIGURATION.mdsection labels corrected ("added in v1.40" β "v1.41" formodelsanddynamic_routing); compactdocs/RELEASE-v1.41.0.mdadded;docs/FEATURES.mdv1.41.0 section (features 126β131) added; root README "Notable extras" command table trimmed (README is a highlight page, not a command reference). (#3219) /gsd-intelreferences replaced with/gsd-map-codebase --queryacrossworkflows/settings.md,references/planning-config.md,docs/INVENTORY.md,docs/USER-GUIDE.md,docs/FEATURES.md, andagents/gsd-intel-updater.md. Thegsd-intel-updateragent name and backendintel.*config keys are intentionally preserved β only the retired user-facing slash command is updated. (#3260)- FEATURES.md
/gsd-new-workspacereference replaced with/gsd-workspace --newin Feature 129 (Issue-Driven Orchestration Guide). (#3221)
This is a release candidate. Install for testing:
npx get-shit-done-cc@nextFull Changelog: v1.41.0...v1.42.0-rc1