Skip to content

feat(release): v1.45.0 — Vertical MVP Slice mode (#2826)#3676

Open
trek-e wants to merge 8 commits into
mainfrom
release/1.45.0-mvp
Open

feat(release): v1.45.0 — Vertical MVP Slice mode (#2826)#3676
trek-e wants to merge 8 commits into
mainfrom
release/1.45.0-mvp

Conversation

@trek-e
Copy link
Copy Markdown
Collaborator

@trek-e trek-e commented May 17, 2026

Feature PR

Linked Issue

Closes #2885
Closes #2875
Closes #2877
Closes #2879
Closes #2882
Refs #2826

All five sub-issues carry approved-feature. The umbrella PRD (#2826) is the spec.


Feature summary

Release-cut PR for v1.45.0 — Vertical MVP Slice mode (umbrella PRD #2826). The five implementation sub-phases (#2885, #2875, #2877, #2879, #2882) already landed on main via #3206 — squash-merged under an unrelated PR title ("fix(plan-phase): remove agent: directive"). This PR makes the feature shippable by:

  1. Surfacing the feature in the CHANGELOG under a proper [1.45.0] section (main's [Unreleased] was empty despite the code being merged).
  2. Bumping the version from 1.50.0-canary.0 to 1.45.0 across the four version files.
  3. Closing the user-docs gap — cherry-picking the USER-GUIDE.md / COMMANDS.md / CLI-TOOLS.md MVP entries from docs(canary.2): user-facing MVP feature docs + canary.2 release notes #3180. Before this PR, the headline feature had zero mentions in the user-facing docs.
  4. Adding docs/RELEASE-v1.45.0.md so the release has notes (currently only canary.1 has them).

No feature-code changes — the implementation is already on main.

What changed

New files

File Purpose
docs/RELEASE-v1.45.0.md Release notes for v1.45.0 — headline MVP feature + install/upgrade + how-to-test
.changeset/release-mvp-v1-45-0.md Changeset fragment for the release-cut (required by lint:changeset since CHANGELOG.md is touched)

Modified files

File What changed
CHANGELOG.md New [1.45.0] section with the five MVP sub-phase entries plus the user-facing docs entry; [Unreleased] compare URL re-pointed to v1.45.0...HEAD
package.json version 1.50.0-canary.0 → 1.45.0
package-lock.json matching version bumps
sdk/package.json version 1.50.0-canary.0 → 1.45.0
sdk/package-lock.json matching version bumps
docs/USER-GUIDE.md +MVP Mode section (when to pick MVP vs Horizontal Layers, 5-row diff table, worked webhook-validator example, configuration knob reference)
docs/COMMANDS.md +/gsd-mvp-phase entry, --mvp flag on /gsd-plan-phase, Vertical MVP / Horizontal Layers prompt on /gsd-new-project
docs/CLI-TOOLS.md +MVP Commands section (phase.mvp-mode, task.is-behavior-adding, user-story.validate SDK query verbs)

Implementation notes

Spec compliance

The umbrella PRD (#2826) lists acceptance criteria for the feature itself. Those are met by the code that's already on main; this PR only verifies the release contract:

  • [1.45.0] exists in CHANGELOG.md with all five sub-phases attributed
  • package.json version field reads 1.45.0
  • sdk/package.json version field reads 1.45.0
  • docs/RELEASE-v1.45.0.md exists with install / upgrade / what's-new sections
  • User-facing docs (USER-GUIDE.md, COMMANDS.md, CLI-TOOLS.md) document the headline feature
  • .changeset/*.md fragment present (lint:changeset gate)

Testing

Test coverage

No new product tests — all behavior tests for the MVP feature are already on main (cherry-pick verified: tests/plan-phase-mvp-flag.test.cjs, tests/mvp-phase-command.test.cjs, tests/execute-mvp-tdd-gate.test.cjs, tests/verifier-mvp-section.test.cjs, tests/graphify-mvp-viz.test.cjs, etc., all present and passing on main).

This PR was validated end-to-end with the full gsd-test-summary docker run before push.

Platforms tested

  • macOS (gsd-test-summary docker run on macOS host)
  • Linux (gsd-test docker container runs Linux Node 22/24)
  • Windows — N/A; release-machinery PR has no Windows-specific code paths

Runtimes tested

  • N/A — release-machinery PR only (no runtime-specific behavior added/changed)

Scope confirmation

  • The implementation matches the scope approved in the linked issue exactly
  • No additional features, commands, or behaviors were added beyond what was approved
  • If scope changed during implementation, I updated the issue spec and received re-approval — N/A, no scope change

Documentation

  • Updated the relevant file(s) under docs/ to reflect this feature
  • All docs/ content added in this PR is written in English

Checklist

  • Issue linked above with Closes #NNN — five Closes lines, plus Refs #2826
  • Linked issue has the approved-feature label — verified on all five sub-issues
  • All acceptance criteria from the issue are met (listed above)
  • Implementation scope matches the approved spec exactly
  • All existing tests pass (verified via gsd-test-summary)
  • New tests cover the happy path, error cases, and edge cases — covered by existing MVP test suite on main
  • .changeset/ fragment added with a user-facing description
  • No unnecessary external dependencies added
  • Works on Windows (backslash paths handled) — N/A (no path-handling code changes)

Breaking changes

None. The MVP feature is purely additive — the --mvp flag, **Mode:** mvp roadmap field, and /gsd mvp-phase command are opt-in. Existing projects and workflows are unaffected unless they explicitly enable MVP mode.

The version bump from 1.50.0-canary.01.45.0 is a deliberate version-line correction: the canary suffix on main was placeholder pending the actual MVP release. Downstream consumers should observe a clean 1.42.3 → 1.45.0 minor-version jump.

Discovery context

The premise that led to this PR ("MVP PRs stuck on dev, need rebasing onto main") turned out to be incorrect: PR #3206 already squash-merged the entire MVP feature into main on May 6 under the title "fix(plan-phase): remove agent: directive that caused OpenCode subagent dispatch." The commit contains 62 files across 47 squashed sub-commits, of which most are MVP work; the title only describes one of them. As a result:

This PR closes the loop by surfacing the feature for users and tagging the release line at v1.45.0.


🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Vertical MVP mode (v1.45.0): plan vertical slices via a --mvp flag and per-phase MVP marking
    • New gsd mvp-phase command to convert/frame phases as Vertical MVP slices
    • MVP+TDD execution gate: test commits required before feature commits; verification runs UAT before technical checks
    • MVP-aware outputs in new-project, plan, execute, verify, progress, stats, and graph surfaces
  • Documentation

    • Updated user guide, command and CLI references, ADRs, and release notes with MVP workflows, prompts, validation, and testing guidance
  • Chores

    • Project released as v1.45.0 (version bump and release notes)

Review Change Stack

trek-e and others added 4 commits May 17, 2026 12:18
…LI-TOOLS)

The MVP umbrella (#2826) shipped to main via #3206 with zero entries in
USER-GUIDE.md, COMMANDS.md, or CLI-TOOLS.md. Users had to read CHANGELOG
entries and grep references/ to learn the feature exists. Closes that gap
ahead of the v1.45.0 release.

USER-GUIDE.md gains an MVP Mode section with when-to-pick guidance, a
5-row diff table vs the standard walkthrough, a worked example, and
configuration knob reference.

COMMANDS.md gains /gsd-mvp-phase + --mvp flag documentation and the
Vertical MVP / Horizontal Layers prompt on /gsd-new-project.

CLI-TOOLS.md gains an MVP Commands section documenting phase.mvp-mode,
task.is-behavior-adding, and user-story.validate SDK query verbs.

Cherry-picked from ee3d930 (#3180), minus the canary.2-specific
release-notes file and changeset.

Closes #2885 #2875 #2877 #2879 #2882 (release-machinery portion)
Refs #2826

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Bumps package.json and sdk/package.json from 1.50.0-canary.0 to 1.45.0
(GA release for the MVP umbrella feature #2826).

Headline:
- Vertical MVP Slice mode end-to-end across plan / execute / verify
- /gsd mvp-phase command (#2875)
- --mvp flag on /gsd plan-phase (#2885)
- MVP+TDD runtime gate in /gsd execute-phase (#2877)
- MVP-mode UAT framing in /gsd verify-work (#2879)
- Discovery & progress surfaces in new-project / progress / stats / graphify (#2882)

The MVP feature code itself was squash-merged via #3206 (under an
unrelated PR title); this release surfaces it with a proper CHANGELOG
[1.45.0] entry, user-facing docs cherry-picked from #3180, and a
RELEASE-v1.45.0.md notes file.

Refs #2826

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Required by lint:changeset since the PR touches user-facing CHANGELOG.md.
The pr: field is a placeholder (0) until the PR number is assigned by
GitHub; will be updated in a follow-up amendment.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
The MVP user-facing docs cherry-picked from #3180 referenced
/gsd-add-phase and /gsd-edit-phase, but main consolidated phase CRUD
into a single /gsd-phase command with --insert / --remove / --edit
flags. The bare /gsd-phase form is the add path.

Fixes the docs-parity-live-registry assertion that every slash-command
token in docs/*.md must resolve to a live registered command. Three
sites updated:

- docs/COMMANDS.md:211 — SPIDR splitting offer line
- docs/USER-GUIDE.md:300 — mode opt-in/out reference (→ /gsd-phase --edit)
- docs/USER-GUIDE.md:367 — SPIDR splitting offer line

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@trek-e trek-e requested a review from glittercowboy as a code owner May 17, 2026 16:28
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 17, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 853b1499-c9e1-49fa-94fe-7fd24f17fe06

📥 Commits

Reviewing files that changed from the base of the PR and between 911682f and ff03a2d.

📒 Files selected for processing (1)
  • .gitignore
✅ Files skipped from review due to trivial changes (1)
  • .gitignore

📝 Walkthrough

Walkthrough

Publishes v1.45.0 and adds release artifacts and documentation for Vertical MVP Slice mode: changeset and package version bumps, CHANGELOG and release notes, USER-GUIDE MVP section, COMMANDS updates, and new CLI/SDK MVP command reference entries.

Changes

v1.45.0 Release Documentation

Layer / File(s) Summary
Release metadata and version updates
.changeset/release-mvp-v1-45-0.md, package.json, sdk/package.json
Adds a changeset describing the v1.45.0 release and updates package versions from 1.50.0-canary.01.45.0 in root and SDK manifests.
Changelog and release notes
CHANGELOG.md, docs/RELEASE-v1.45.0.md
Updates the Unreleased compare base and inserts a v1.45.0 release section describing Vertical MVP Slice mode; adds docs/RELEASE-v1.45.0.md with feature overview, how-to test, install/upgrade, and references.
User guide for MVP mode workflow
docs/USER-GUIDE.md
Adds an “MVP Mode” section explaining Vertical MVP vs Horizontal Layers, mode selection at init, Phase 1 planning output (SKELETON.md), MVP+TDD execution gating, verification ordering, mode confirmation query, and configuration toggles.
Command and SDK reference documentation
docs/COMMANDS.md, docs/CLI-TOOLS.md
Documents the project mode prompt and /gsd plan-phase --mvp semantics, adds /gsd mvp-phase command reference, and introduces three SDK-only queries: phase.mvp-mode, task.is-behavior-adding, and user-story.validate with their precedence/validation and response shapes.
Docs indexing and ADR
docs/adr/2826-vertical-mvp-slice-planning-mode.md, docs/adr/README.md, docs/README.md
Adds the ADR for Vertical MVP Slice planning mode and updates ADR index and docs index to reference v1.45.0 release notes.
Installer migrations metadata updates
get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs, .../001-legacy-orphan-files.cjs, .../002-codex-legacy-hooks-json.cjs
Bumps introducedIn metadata in installer migration descriptors from 1.50.01.45.0.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

documentation, size/L

Suggested reviewers

  • glittercowboy

🐰
In docs we hop, a vertical trail so clear,
User stories first, then features appear.
A walking skeleton leads the way,
v1.45.0 — hop forward today! 🥕

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly describes the primary change: a release cut for v1.45.0 featuring Vertical MVP Slice mode, linking to the umbrella issue #2826.
Description check ✅ Passed The PR description is comprehensive, follows the feature template structure, and thoroughly documents the release machinery changes, scope, testing, and linked issues.
Linked Issues check ✅ Passed The PR successfully closes five approved sub-issue requirements (#2885, #2875, #2877, #2879, #2882) through release machinery only; feature code already landed on main. CHANGELOG, version bumps, user docs, and release notes satisfy the acceptance criteria from all linked issues.
Out of Scope Changes check ✅ Passed All changes are tightly scoped to release machinery: CHANGELOG updates, version bumps, user-facing documentation, release notes, and changeset fragment. No feature code modifications or unrelated enhancements introduced.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/1.45.0-mvp

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Updates pr: 0 → pr: 3676 now that GitHub has assigned a number to the
release PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@github-actions github-actions Bot added size/L and removed size/L labels May 17, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Line 17: The changelog line uses the spaced command form `/gsd mvp-phase <N>`
which is inconsistent with the canonical slash-command spelling; update the
entry to use `/gsd-mvp-phase <N>` everywhere in that paragraph (including any
references to invoking the command and examples) while leaving other tokens like
`MVP_MODE`, `gsd-planner`, `ROADMAP.md`, `PLAN.md`, and file references
unchanged.
- Line 23: The inline code span used in the CHANGELOG entry for the `/gsd
graphify` output contains a leading space inside the backticks around the label
`(MVP)`, which triggers markdownlint MD038; locate the phrase that describes
"MVP-mode phase nodes with a distinct green fill (`#22c55e`) and a ` (MVP)`
label suffix" and remove the inner leading space inside the inline code span so
the code span is ``(MVP)`` (no leading space) while preserving the green fill
`#22c55e` and the `(MVP)` label text.

In `@docs/RELEASE-v1.45.0.md`:
- Line 19: Replace the spaced slash-command examples with the shipped hyphenated
form so they match the rest of the docs: change occurrences like "/gsd
plan-phase --mvp" and "/gsd mvp-phase" to "/gsd-plan-phase --mvp" and
"/gsd-mvp-phase" respectively (also update the other reported occurrences to use
"/gsd-plan-phase" and "/gsd-mvp-phase"); update the strings in
RELEASE-v1.45.0.md where these command examples appear to ensure consistency and
prevent copy-paste "unknown command" errors.

In `@docs/USER-GUIDE.md`:
- Around line 329-365: Several fenced code blocks (the ones showing the command
"/gsd-new-project", the interactive prompt blocks following it, the
"/gsd-mvp-phase 1" block, and the ROADMAP.md output block) lack language tags
and trigger markdownlint MD040; update each fence to include an appropriate
language identifier (e.g., ```bash for commands like /gsd-new-project and
/gsd-mvp-phase, ```text for prompt/CLI conversational output, and ```json or
```text for ROADMAP.md snippets) so all fenced blocks have explicit language
annotations.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 10a65c32-81d2-4f8f-8ccf-efc95269304b

📥 Commits

Reviewing files that changed from the base of the PR and between f970c09 and a5d8380.

⛔ Files ignored due to path filters (2)
  • package-lock.json is excluded by !**/package-lock.json
  • sdk/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (8)
  • .changeset/release-mvp-v1-45-0.md
  • CHANGELOG.md
  • docs/CLI-TOOLS.md
  • docs/COMMANDS.md
  • docs/RELEASE-v1.45.0.md
  • docs/USER-GUIDE.md
  • package.json
  • sdk/package.json
Comment thread CHANGELOG.md Outdated
Comment thread CHANGELOG.md Outdated
Comment thread docs/RELEASE-v1.45.0.md Outdated
Comment thread docs/USER-GUIDE.md
Comment on lines +329 to +365
```
/gsd-new-project
```

```
> What are you building?
A webhook signature validator middleware for Express apps.

[...]

> Choose project mode:
> Vertical MVP — each phase delivers an end-to-end user capability (recommended for new products)
Horizontal Layers — build complete technical layers, assemble at the end

[Roadmap generated with `**Mode:** mvp` on every initial phase.]
```

#### 2. Frame the phase as a user story

```
/gsd-mvp-phase 1
```

```
> As a [user role]?
Backend developer

> I want to [capability]?
validate incoming webhook signatures

> So that [outcome]?
malicious requests are rejected before reaching my handlers

[ROADMAP.md updated:
**Mode:** mvp
**Goal:** As a backend developer, I want to validate incoming webhook signatures, so that malicious requests are rejected before reaching my handlers.]
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add fence language tags to the new code blocks (MD040).

Several new fenced blocks in this section are missing a language identifier, and markdownlint flags them (MD040). Please annotate them (e.g., text, bash, json) to keep docs lint green.

Also applies to: 375-379, 396-410

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 329-329: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 333-333: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 348-348: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 352-352: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/USER-GUIDE.md` around lines 329 - 365, Several fenced code blocks (the
ones showing the command "/gsd-new-project", the interactive prompt blocks
following it, the "/gsd-mvp-phase 1" block, and the ROADMAP.md output block)
lack language tags and trigger markdownlint MD040; update each fence to include
an appropriate language identifier (e.g., ```bash for commands like
/gsd-new-project and /gsd-mvp-phase, ```text for prompt/CLI conversational
output, and ```json or ```text for ROADMAP.md snippets) so all fenced blocks
have explicit language annotations.
…ace)

Codex stop-time review flagged 5 instances in CHANGELOG.md and 13 in
docs/RELEASE-v1.45.0.md of the invalid `/gsd <name>` (space) form. Repo
canonical slash-command syntax is `/gsd-<name>` (hyphen) per every
command file in commands/gsd/.

Token-by-token replacement (replace_all):
- /gsd plan-phase     → /gsd-plan-phase
- /gsd mvp-phase      → /gsd-mvp-phase
- /gsd execute-phase  → /gsd-execute-phase
- /gsd verify-work    → /gsd-verify-work
- /gsd new-project    → /gsd-new-project
- /gsd progress       → /gsd-progress
- /gsd stats          → /gsd-stats
- /gsd graphify       → /gsd-graphify
- /gsd add-phase      → /gsd-phase  (no add-phase command exists; phase
                                     is the unified CRUD verb)

Verified zero remaining /gsd-space tokens in any PR-touched file.
docs-parity-live-registry test still passes. Full docker test suite
re-run: 11741 passed / 0 failed.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@github-actions github-actions Bot added size/L and removed size/L labels May 17, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Line 7: The footer `[Unreleased]` compare URL is inconsistent with the
heading: replace the footer occurrence of "v1.42.1...HEAD" with "v1.45.0...HEAD"
so it matches the heading link `##
[Unreleased](https://github.com/gsd-build/get-shit-done/compare/v1.45.0...HEAD)`
and ensure the only `[Unreleased]` compare target in CHANGELOG.md is
"v1.45.0...HEAD".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c03c8671-6e68-4833-82da-61bbf8c08cbd

📥 Commits

Reviewing files that changed from the base of the PR and between a5d8380 and d274c6d.

📒 Files selected for processing (2)
  • CHANGELOG.md
  • docs/RELEASE-v1.45.0.md
✅ Files skipped from review due to trivial changes (1)
  • docs/RELEASE-v1.45.0.md
Comment thread CHANGELOG.md
BLOCKERS (Codex):
- docs/RELEASE-v1.45.0.md:34 — corrected delegation form. Release notes
  said `/gsd-plan-phase --mvp <N>` but the actual mvp-phase workflow at
  get-shit-done/workflows/mvp-phase.md:198 delegates `/gsd-plan-phase
  ${PHASE}` (no flag). MVP_MODE is auto-detected from the `**Mode:** mvp`
  line that mvp-phase just wrote to ROADMAP.md.
- docs/README.md — added v1.45.0 release-notes row to the docs index
  and updated the "What's new" Quick Link to point at v1.45.0 (latest)
  with v1.42.3 as prior hotfix. Established release shape — see
  beb7e05 (v1.42.3) for precedent.

WARN (Codex):
- CHANGELOG.md:13 + docs/RELEASE-v1.45.0.md:15 — "four sub-phases" →
  "five sub-phases". The five PRs were enumerated correctly; only the
  count claim was wrong.
- get-shit-done/bin/lib/installer-migrations/{000,001,002}.cjs —
  `introducedIn: '1.50.0'` → `'1.45.0'`. The migrations were authored
  when 1.50.0-canary was the planned next stable; the 1.45.0 backport
  shifts the actual ship version, so the introducedIn invariant must
  match. Regression: tests/installer-migration-authoring.test.cjs +
  tests/installer-migrations.test.cjs both green (41 pass, 0 fail) —
  the test fixtures use their own inline introducedIn values, not the
  on-disk migration constants.

MINOR (Codex):
- docs/RELEASE-v1.45.0.md:54 — `/gsd-stats` output was described as
  `MVP phases: N` but the actual workflow at
  get-shit-done/workflows/stats.md:67 emits `Phases: ${TOTAL_COUNT}
  total | ${MVP_COUNT} MVP | $((TOTAL_COUNT - MVP_COUNT)) standard`.
  Aligned release notes to the actual output contract.

Claude code-review (post-/gsd-space cleanup):
- docs/COMMANDS.md:47 — `(v1.50.0+)` → `(v1.45.0+)` (stale from canary
  cherry-pick).
- docs/CLI-TOOLS.md:183 — same `(v1.50.0+)` → `(v1.45.0+)`.
- CHANGELOG.md:2771 — `[Unreleased]` footer link still pointed to
  `v1.42.1...HEAD`; updated to `v1.45.0...HEAD` and added the
  `[1.45.0]: ...v1.42.3...v1.45.0` footer entry.
- CHANGELOG.md:23 — MD038 leading-space inside `` ` (MVP)` `` code span;
  removed the space.

ADR:
- docs/adr/2826-vertical-mvp-slice-planning-mode.md — accepted ADR
  documenting the single-mode-switched-agent decision (vs parallel
  gsd-vertical-planner / executor / verifier), the resolution chain
  (CLI → ROADMAP → config → false), MVP+TDD-gate-blocks-by-default,
  Walking-Skeleton-lives-in-planner-not-new-project, and the four
  rejected alternatives from the PRD Q&A. Added to docs/adr/README.md
  index. File named per the `<issue#>-<slug>.md` convention.

Full docker test suite: 11742 passed / 0 failed.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@github-actions github-actions Bot added size/XL and removed size/L labels May 17, 2026
@trek-e
Copy link
Copy Markdown
Collaborator Author

trek-e commented May 17, 2026

Code review

No issues found at HEAD (911682f4). Pre-merge multi-pass audit complete:

Claude 5-agent review (CLAUDE.md compliance, shallow bug scan, git history, prior PR comments, code-comment compliance) — surfaced 4 high-confidence issues, all fixed in 911682f4:

Codex adversarial review (second-opinion pass) — surfaced 5 issues, 2 BLOCKERS, all fixed in the same commit:

  • BLOCKER: release notes claimed /gsd-plan-phase --mvp <N> delegation but mvp-phase.md workflow actually delegates /gsd-plan-phase ${PHASE} with no flag — fixed in docs/RELEASE-v1.45.0.md#L33-L36
  • BLOCKER: docs/README.md docs index still presented v1.42.x as latest → added v1.45.0 row + repointed "What's new"
  • WARN: "four sub-phases" but five PRs enumerated → fixed in CHANGELOG and release notes
  • WARN: installer-migrations/{000,001,002}.cjs hardcoded introducedIn: '1.50.0' → corrected to '1.45.0' (regression: tests/installer-migration-authoring.test.cjs + tests/installer-migrations.test.cjs 41 pass / 0 fail)
  • MINOR: /gsd-stats output description didn't match actual workflow output → aligned

ADR: docs/adr/2826-vertical-mvp-slice-planning-mode.md records the single-mode-switched-agent decision (vs parallel gsd-vertical-planner/executor/verifier), resolution chain, MVP+TDD-blocking default, Walking-Skeleton trigger placement, and four rejected alternatives.

Full docker test suite: 11742 passed / 0 failed.

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Line 9: The compare baseline for the 1.45.0 release is inconsistent: update
both occurrences of the header link string "##
[1.45.0](https://github.com/gsd-build/get-shit-done/compare/v1.42.3...v1.45.0)"
(the top release header and the duplicate near the end) to use the correct
previous tag so both use the same baseline (e.g., replace v1.42.3 with v1.42.1
if the intended previous release is 1.42.1), ensuring the URL follows the
pattern .../compare/<correct-previous-tag>...v1.45.0.

In `@docs/COMMANDS.md`:
- Line 210: The user-story prompt wording and the documented validator are
inconsistent: change either the prompt example in the AskUserQuestion sequence
("As a [role] / I want to [capability] / so that [outcome]") or the canonical
regex in the gsd-sdk query user-story.validate example so both use the same
casing (preferably lowercase "so that"); update the displayed prompt text and
the regex example (/^As a .+, I want to .+, so that .+\.$/) so they match
exactly to avoid confusion and possible validation mismatches.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d499e10e-8301-4ecf-87b9-2bf62a718dc2

📥 Commits

Reviewing files that changed from the base of the PR and between d274c6d and 911682f.

📒 Files selected for processing (10)
  • CHANGELOG.md
  • docs/CLI-TOOLS.md
  • docs/COMMANDS.md
  • docs/README.md
  • docs/RELEASE-v1.45.0.md
  • docs/adr/2826-vertical-mvp-slice-planning-mode.md
  • docs/adr/README.md
  • get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs
  • get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs
  • get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs
✅ Files skipped from review due to trivial changes (5)
  • docs/adr/README.md
  • docs/README.md
  • docs/adr/2826-vertical-mvp-slice-planning-mode.md
  • docs/CLI-TOOLS.md
  • docs/RELEASE-v1.45.0.md
Comment thread CHANGELOG.md
## [Unreleased](https://github.com/gsd-build/get-shit-done/compare/v1.42.1...HEAD)
## [Unreleased](https://github.com/gsd-build/get-shit-done/compare/v1.45.0...HEAD)

## [1.45.0](https://github.com/gsd-build/get-shit-done/compare/v1.42.3...v1.45.0) - 2026-05-17
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the v1.45.0 compare baseline link.

Line 9 and Line 2772 compare v1.42.3...v1.45.0, but the previous release listed in this changelog is 1.42.1 (Line 29). Please confirm the intended baseline and align both links so the release diff scope is accurate.

Also applies to: 2772-2772

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CHANGELOG.md` at line 9, The compare baseline for the 1.45.0 release is
inconsistent: update both occurrences of the header link string "##
[1.45.0](https://github.com/gsd-build/get-shit-done/compare/v1.42.3...v1.45.0)"
(the top release header and the duplicate near the end) to use the correct
previous tag so both use the same baseline (e.g., replace v1.42.3 with v1.42.1
if the intended previous release is 1.42.1), ensuring the URL follows the
pattern .../compare/<correct-previous-tag>...v1.45.0.
Comment thread docs/COMMANDS.md
| `--force` | Override the status guard. Required when the target phase is `in_progress` or `completed` — converting an active phase to MVP mode invalidates existing plans/summaries. |

**What it does:**
1. **User-story prompts** — three sequential `AskUserQuestion` calls capture an `As a [role] / I want to [capability] / So that [outcome]` story. Validated by `gsd-sdk query user-story.validate` (canonical regex `/^As a .+, I want to .+, so that .+\.$/`); empty fields are re-prompted.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Align user-story prompt wording with the documented validator pattern.

This line shows So that in the prompt format but the regex example requires lowercase so that, which can cause avoidable confusion (or false rejections if interpreted literally). Make the prompt and regex docs use the same casing rule.

Suggested doc tweak
-1. **User-story prompts** — three sequential `AskUserQuestion` calls capture an `As a [role] / I want to [capability] / So that [outcome]` story. Validated by `gsd-sdk query user-story.validate` (canonical regex `/^As a .+, I want to .+, so that .+\.$/`); empty fields are re-prompted.
+1. **User-story prompts** — three sequential `AskUserQuestion` calls capture an `As a [role] / I want to [capability] / so that [outcome]` story. Validated by `gsd-sdk query user-story.validate` (canonical regex `/^As a .+, I want to .+, so that .+\.$/`); empty fields are re-prompted.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
1. **User-story prompts** — three sequential `AskUserQuestion` calls capture an `As a [role] / I want to [capability] / So that [outcome]` story. Validated by `gsd-sdk query user-story.validate` (canonical regex `/^As a .+, I want to .+, so that .+\.$/`); empty fields are re-prompted.
1. **User-story prompts** — three sequential `AskUserQuestion` calls capture an `As a [role] / I want to [capability] / so that [outcome]` story. Validated by `gsd-sdk query user-story.validate` (canonical regex `/^As a .+, I want to .+, so that .+\.$/`); empty fields are re-prompted.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/COMMANDS.md` at line 210, The user-story prompt wording and the
documented validator are inconsistent: change either the prompt example in the
AskUserQuestion sequence ("As a [role] / I want to [capability] / so that
[outcome]") or the canonical regex in the gsd-sdk query user-story.validate
example so both use the same casing (preferably lowercase "so that"); update the
displayed prompt text and the regex example (/^As a .+, I want to .+, so that
.+\.$/) so they match exactly to avoid confusion and possible validation
mismatches.
Adds `dev-tests/` to .gitignore so devs can keep heavy on-demand E2E
validation suites (e.g. the v1.45.0 MVP-path validation at
dev-tests/mvp-e2e/ — 1285 LOC, 53 tests, ~3s local) outside the CI
test surface.

These suites live in `dev-tests/` rather than `tests/` because:

- They're invoked on demand by developers validating cross-cutting
  feature work, not on every push.
- Some exercise long-running flows that would balloon CI wall time
  if run on every PR.
- Some validate cross-agent integration paths that can't be exercised
  by the headless tools layer alone — they need to be re-run when the
  workflow .md files or agent prompts change, not when arbitrary code
  changes.

The convention is set by PR #3676 — see that PR's discussion for
context on the MVP path validation suite and its honesty refactor
(synthetic surface assertions removed per Codex review).

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@github-actions github-actions Bot added size/XL and removed size/XL labels May 17, 2026
@trek-e
Copy link
Copy Markdown
Collaborator Author

trek-e commented May 17, 2026

MVP E2E one-off validation run

End-to-end validation against three example MVP user stories — done as a dev-only validation, not added to CI. Files live under dev-tests/ (added to .gitignore in ff03a2d4).

Run outcome

Run Result
node --test dev-tests/mvp-e2e/e2e-mvp-*.test.cjs (macOS local) tests 53 / pass 53 / fail 0 in 3.0–3.4 s
gsd-test-summary dev-tests/mvp-e2e/e2e-mvp-*.test.cjs (host cartographer, Linux) Passed: 75 / Failed: 0, exit 0
Full baseline gsd-test-summary (host plex2) 11742 pass / 0 fail — unaffected

(Docker reports 75 because each suite's "completed" marker is counted separately by the gsd-test event parser; node:test reports 53 unique test() calls.)

Three scenarios

  1. Slack Webhook Receiver (e2e-mvp-slack-webhook.test.cjs, 16 tests) — Phase 1 of new project with MVP mode → Walking Skeleton emission, slice-first PLAN ordering (failing test → thinnest E2E → real persistence → validation → polish), MVP+TDD gate triplet (pass/block-on-missing_red_commit/exempt-test-only), user-flow-first UAT with expected mentioning "real time", malformed-Goal guard refusing Receive Slack events.
  2. CSV → JSON Data Pipeline (e2e-mvp-csv-to-json.test.cjs, 17 tests) — load-bearing mixed-mode roadmap (Phase 1 standard, Phase 2 MVP); proves SKELETON.md does NOT emit outside Phase 1 of new project, surfaces differentiate (mvp count === 1, total phases === 2), config-only task exempt from MVP+TDD gate, malformed Goal Make CSV faster correctly flagged.
  3. CLI Tool Config Loader (e2e-mvp-cli-config-loader.test.cjs, 17 tests) — >120-char user story round-trip through ROADMAP writer; feat_before_test gate variant (the third reason code in execute-mvp-tdd.md untested on main); curly-apostrophe Unicode round-trip; malformed-Goal As a developer I want config (missing "so that") guard.

Honesty refactor — Codex stop-hook finding

Initial helper synthesized /gsd-stats mvp_phase_count + total_phases and entire graphify.nodes from roadmap analyze data, overriding whatever the real verb returned. Codex correctly flagged this as silent over-claim: tests passed while real surface code paths could be broken.

What I found while fixing it: neither gsd-tools stats json nor gsd-tools progress json actually emits MVP fields. The MVP summary line in /gsd-stats (Phases: N total | M MVP | K standard) and the "User-flow next up" panel in /gsd-progress are computed by the agent reading workflows/stats.md and workflows/progress.md against roadmap analyze data — not by the headless tool layer. gsd-tools graphify build is also disabled by default in test environments (requires the graphviz binary).

Refactor: helper now returns raw roadmap analyze, raw stats JSON, and raw progress JSON without override. Surface tests renamed to discovery-surface DATA and check roadmap_analyze.phases[].mode directly. Agent-level rendering remains exercised by the workflow-contract tests on main (tests/{stats,progress,graphify}-mvp-display.test.cjs).

The helper's getProjectSurfaces now carries an explicit comment block documenting this seam and what it does not cover, so future devs running the suite know the gap.

Files (local-only)

dev-tests/mvp-e2e/
├── README.md                              (run instructions + when to re-run)
├── helpers/
│   └── mvp-e2e.cjs                        (8 typed-IR orchestrators, 511 LOC)
├── e2e-mvp-slack-webhook.test.cjs         (16 tests, 248 LOC)
├── e2e-mvp-csv-to-json.test.cjs           (17 tests, 263 LOC)
└── e2e-mvp-cli-config-loader.test.cjs     (17 tests, 277 LOC)

Total: 1299 LOC, 53 tests, ~3 s local / ~1 min docker.

Pipeline

1 Opus architect (plan in .scratch/MVP-E2E-PLAN.md) → 1 Haiku scout (example MVP candidates) → 4 parallel Sonnet coders (helpers + 3 scenarios) → 1 round of 8 orchestrator fixes (path mismatches, regex shape, runGsdTools argv shape, UAT verb heuristics) → Codex stop-hook honesty refactor.

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

1 participant