Commit graph

1332 commits

Author SHA1 Message Date
Lex Christopherson
5b36754a19 fix(ci): remove @latest npm promotion from pipeline
Dev-stamped versions (2.28.0-dev.xxx) should never be promoted to
@latest on npm. Stable releases are handled by the publish-version
workflow. The pipeline promotes @dev → @next only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:45:39 -06:00
Lex Christopherson
119c8d74b4 fix(ci): skip GitHub release creation when tag already exists
Multiple pipeline runs for the same base version produce identical
release tags, causing E422. Check if release exists before creating.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:27:48 -06:00
Tom Boucher
4c98d3e708 fix: handle Windows non-ASCII paths in cpSync with copyFileSync fallback (#1181)
Node.js's cpSync fails on Windows when the path contains non-ASCII
characters (e.g. C:\Users\Görloff) due to the \\?\ extended-length path
prefix not handling Unicode correctly. This affects both the build
script (copy-assets.cjs) and the runtime resource sync (resource-loader.ts).

Added a try/catch fallback: when cpSync throws, fall back to a manual
recursive copy using copyFileSync which handles non-ASCII paths correctly.

Changed files:
- src/resource-loader.ts: syncResourceDir() catches cpSync failure and
  falls back to copyDirRecursive()
- packages/pi-coding-agent/scripts/copy-assets.cjs: all cpSync calls
  wrapped in safeCpSync() with the same fallback

Fixes #1178
2026-03-18 10:13:37 -06:00
TÂCHES
58903093cd fix: non-blocking verification gate for auto-discovered commands (#1177)
* fix: make package-json discovered verification commands non-blocking (advisory only)

Auto-discovered commands from package.json scripts (typecheck, lint, test) are
advisory: their failures are logged as warnings but do not block the gate or
trigger retries. Only explicitly configured preference commands and task-plan
verify commands remain blocking.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: add missing blocking field to verification-evidence test fixtures

The previous commit added `blocking: boolean` to VerificationCheck but
only updated verification-gate.test.ts. The evidence test file had 26
VerificationCheck literals missing the new required field.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:13:28 -06:00
Tom Boucher
8d04ec19fd fix: add defensive guards against undefined .filter() in auto-mode dispatch/recovery (#1180)
Auto-mode crashed with 'Cannot read properties of undefined (reading
filter)' during partial execute-task recovery when derived state was
structurally incomplete.

Added ?? [] fallback guards on all .filter()/.find()/.map() calls
that access state.registry, roadmap.slices, or similar derived arrays
in the dispatch and recovery paths:

- auto.ts: 3 state.registry.filter() calls
- auto-recovery.ts: 1 roadmap.slices.find() call
- auto-start.ts: 1 state.registry.filter() call

These are belt-and-suspenders guards — the parsers always return arrays,
but crash recovery can encounter partially written or corrupt state files
where the parsers return unexpected shapes.

Fixes #1176
2026-03-18 10:07:22 -06:00
Tom Boucher
8281a2ea75 fix: sync living docs (DECISIONS/REQUIREMENTS/PROJECT/KNOWLEDGE) between worktree and project root (#1173)
syncStateToProjectRoot() copied STATE.md, milestone directories,
completed-units.json, and runtime records — but not the four root-level
living documents. When agents updated these during slice execution in a
worktree, a new session would read stale copies from the project root,
losing decisions, requirement status changes, project descriptions, and
accumulated knowledge.

Added bidirectional sync for DECISIONS.md, REQUIREMENTS.md, PROJECT.md,
and KNOWLEDGE.md:
- Worktree → project root: in syncStateToProjectRoot() after runtime records
- Project root → worktree: in syncProjectRootToWorktree() before milestone sync

Fixes #1168
2026-03-18 10:07:06 -06:00
Tom Boucher
a1ef04a5f3 fix: route needs-discussion phase to interactive flow instead of stopping (#1175)
When a milestone has CONTEXT-DRAFT.md (phase: needs-discussion), the
dispatch table returned 'stop' — which made auto-mode exit. Running
/gsd again would re-enter auto → dispatch → stop → loop indefinitely.

The guided-flow already has a complete interactive handler for
needs-discussion (discuss from draft / start fresh / skip), but it was
never reached from the auto-mode entry path.

Added an early check in dispatchNextUnit: if phase is needs-discussion,
stop auto-mode gracefully and route to showSmartEntry() which handles
the discussion flow correctly.

Fixes #1170
2026-03-18 10:06:48 -06:00
Copilot
0a974c9765 Fix validate-milestone skip loop: align artifact check with state machine (#1113)
* Initial plan

* Fix validate-milestone skip loop: verify terminal verdict in artifact check

When verifyExpectedArtifact checked validate-milestone units, it only
verified the VALIDATION file existed on disk. But deriveState requires the
verdict to be terminal (pass/needs-attention/needs-remediation) before
advancing past validating-milestone. If the file existed with malformed
frontmatter or an unrecognized verdict, the artifact check passed (causing
skip) while deriveState stayed in validating-milestone, creating a hard
skip loop that hit the lifetime cap.

Now verifyExpectedArtifact reads the VALIDATION file content and calls
isValidationTerminal() to confirm the verdict matches what deriveState
expects. Non-terminal validations are treated as incomplete artifacts,
triggering re-run instead of skip.

Adds 3 new tests for the tightened verification.

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

* Address review feedback: clarify comments and add unrecognized verdict test

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-18 10:05:29 -06:00
Lex Christopherson
43634c4ba3 fix: run resource-skew check before early TTY gate
The early TTY check blocked the resource-skew detection test which
runs gsd with piped stdin. Move exitIfManagedResourcesAreNewer()
before the TTY gate so version mismatch errors surface in non-TTY
environments.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:01:01 -06:00
Lex Christopherson
7cf97bcd98 fix: move TTY check before heavy initialization to prevent process hang
The no-TTY check at the end of cli.ts ran after full session/extension
initialization, which opens handles that prevent process.exit(1) from
completing promptly (15s hang on Node 24). Move the check right after
arg parsing, before any heavy initialization.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 09:54:19 -06:00
TÂCHES
06508b3666 fix(ci): skip init smoke test in non-TTY CI environments (#1172)
The init command requires interactive/TTY mode which isn't available
in CI containers. Skip the test with a clear message when both
stdin is not a TTY and CI env var is set.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 09:44:42 -06:00
Jeremy McSpadden
880d9ced3a feat: auto-open HTML reports in default browser on manual export (#1164)
When running /gsd export --html, the generated report now automatically
opens in the user's default browser. Uses platform-specific commands
(open/xdg-open/start). Only applies to manual exports — auto-mode
milestone completion reports do not auto-open.
2026-03-18 09:29:04 -06:00
Tom Boucher
6bf15b44f3 feat: upgrade to Node.js 24 LTS across CI, Docker, and package config (#1165)
Node.js 24.11.0 entered LTS (Krypton) with support through April 2028.
This upgrades all CI pipelines, Docker images, and package metadata
from Node 22 to Node 24.

Changes:
- ci.yml: node-version 22 → 24 (build + windows-portability jobs)
- pipeline.yml: node-version 22 → 24 (dev-publish, test-verify, prod-release)
- build-native.yml: node-version 22 → 24, actions/checkout@v4 → v6,
  actions/setup-node@v4 → v6
- cleanup-dev-versions.yml: node-version 22 → 24
- Dockerfile: node:22-bookworm → node:24-bookworm,
  node:22-slim → node:24-slim
- package.json: engines.node >=20.6.0 → >=22.0.0 (supports both 22 and 24)
- @types/node: ^22.0.0 → ^24.0.0

Verified: tsc --noEmit passes, 1729 unit tests pass on Node 24.14.0.
2026-03-18 09:28:49 -06:00
TÂCHES
6eccae3b4b fix(ci): skip publish when version already exists on npm (#1166)
Multiple CI completions on the same commit trigger duplicate Pipeline
runs. The second run fails with E403 because the version was already
published. Fix by checking npm registry before attempting publish, and
enable cancel-in-progress to avoid redundant runs.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 09:26:38 -06:00
TÂCHES
fb350c270d fix(ci): use local binary for pipeline smoke test (#1163)
The local smoke test runs npx gsd-pi which fails in the container
because the gsd bin isn't on PATH. Point GSD_SMOKE_BINARY at the
built dist/loader.js directly with an absolute path so smoke tests
work from any cwd.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 09:11:26 -06:00
Jeremy McSpadden
34c56cc284 fix: prevent concurrent GSD sessions from overlapping on same project (#1154)
Adds OS-level exclusive session locking via proper-lockfile to prevent
multiple GSD auto-mode processes from running simultaneously on the
same project. Previously, the advisory JSON lock file had a TOCTOU race
condition where two processes could both read "no lock" before either
wrote one.

Changes:
- New session-lock.ts module with acquireSessionLock/releaseSessionLock/
  validateSessionLock using proper-lockfile for OS-level file locking
- Lock acquired at the START of bootstrapAutoSession (before any state
  mutation), not after initialization as before
- Periodic lock validation in dispatchNextUnit detects if another
  process has taken over, triggering graceful shutdown
- Session lock released on both stop and pause
- Resume path re-acquires lock before reactivating
- DB module tracks owner PID for diagnostic purposes
- 16 new tests covering acquire/release/validate/lifecycle scenarios
2026-03-18 09:10:56 -06:00
Tom Boucher
22f2f452b9 fix: exclude completion-transition errors from health escalation at task level (#1157)
When the last task in a slice completes, the doctor detects expected
completion-transition issues (missing slice summary, unchecked roadmap)
that will be resolved by the upcoming complete-slice dispatch. These
were being counted as real errors in the proactive health tracker,
inflating consecutiveErrorUnits and potentially triggering misleading
heal escalation or verification-failure warnings.

Changes:
- Export COMPLETION_TRANSITION_CODES from doctor-types.ts (was local
  to doctor.ts)
- doctor.ts uses the shared constant instead of its local copy
- auto-post-unit.ts filters out completion-transition codes from the
  error count and health snapshot when fixLevel is 'task'

Existing doctor-fixlevel tests confirm the doctor still detects and
reports (but does not fix) these issues at task level.

Fixes #1155
2026-03-18 09:10:43 -06:00
Jeremy McSpadden
8b70fc03f6 feat: add /gsd logs command to browse activity, debug, and metrics logs (#1162)
Adds a new /gsd logs command for browsing and inspecting GSD's existing
logging infrastructure. Users can now discover and review activity logs,
debug logs, and metrics without navigating the filesystem manually.

Subcommands:
  /gsd logs           — List recent activity + debug logs with metrics summary
  /gsd logs <N>       — Show summary of activity log #N (tool calls, files, errors)
  /gsd logs debug     — List debug log files
  /gsd logs debug <N> — Show debug log summary (events, duration, errors)
  /gsd logs tail [N]  — Show last N activity log summaries (default 5)
  /gsd logs clear     — Remove old activity and debug logs (keeps recent 5)

Addresses #1161 — users needed a way to understand what happened during
auto-mode sessions for debugging.
2026-03-18 09:10:11 -06:00
TÂCHES
e5d40a2591 fix(ci): skip git-diff guard in prepublishOnly during CI (#1160) 2026-03-18 08:53:35 -06:00
Tom Boucher
974a5f361a fix: /gsd quick respects git isolation: none preference (#1156)
When git.isolation is set to 'none' in preferences, /gsd quick now
stays on the current branch instead of creating a gsd/quick/<n>-<slug>
branch. The branch creation logic is skipped entirely, matching the
behavior users expect from isolation: none.

The 'branch' and 'worktree' modes continue to create branches as before.

Fixes #1153
2026-03-18 08:40:09 -06:00
Copilot
05beb9cba7 fix: text-based fallbacks for RPC mode where TUI widgets produce empty turns (#1112)
* Initial plan

* fix: add text-based fallbacks for RPC mode where TUI widgets produce empty turns

- rpc-mode.ts: Emit placeholder widget event instead of silently dropping factory-based setWidget calls
- commands.ts: handleStatus() falls back to text-based status summary when custom() returns undefined
- commands.ts: handleVisualize() notifies that TUI is required when custom() returns undefined
- auto-dashboard.ts: updateProgressWidget() emits string-array fallback before factory widget
- queue-reorder-ui.ts: showQueueReorder() notifies with current order when custom() returns undefined
- index.ts: Dashboard shortcut handler falls back to text status in RPC mode

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-18 08:34:49 -06:00
Tom Boucher
54d662f17f fix(headless-query): use jiti to load extension .ts modules (#1143)
headless-query.ts imported extension modules with .js extensions, but
those files only exist as .ts (never compiled). Other code paths work
because they go through the extension loader's jiti setup, but
headless-query bypasses that as a performance optimization.

Fix: use createJiti() to dynamically import the 4 extension modules,
matching the pattern used by the extension loader. The modules are
loaded lazily in handleQuery() so the jiti overhead only applies when
the query command is actually used.

Fixes #1137
2026-03-18 08:34:18 -06:00
Jeremy McSpadden
45af9f7f9d feat(browser-tools): configurable screenshot resolution, format, and quality (#1152)
Add environment variable overrides for screenshot capture settings so
users can opt into full-resolution output for human review while keeping
the Anthropic vision-optimized defaults:

- SCREENSHOT_MAX_WIDTH (default 1568, set 0 to uncap)
- SCREENSHOT_MAX_HEIGHT (default 8000, set 0 to uncap)
- SCREENSHOT_FORMAT (default jpeg for viewport / png for crops)
- SCREENSHOT_QUALITY (default 80, range 1-100)

Also fixes:
- Integration test viewport/scale mismatch: was 1280x720 scale 1,
  now 1280x800 scale 2 to match production browser context
- Unit test height-limit assertion: test expected <= 1568 but
  MAX_SCREENSHOT_HEIGHT is 8000 — corrected test image and assertions
2026-03-18 08:33:40 -06:00
Jeremy McSpadden
d24095971c feat: add pre-commit secret scanner and CI secret detection (#1148)
* feat: add pre-commit secret scanner and CI secret detection

Add a comprehensive secret scanning system to prevent accidental
credential leaks in commits and pull requests:

- scripts/secret-scan.sh: ERE-based scanner (macOS/Linux compatible)
  that detects AWS keys, API tokens, private keys, database URLs,
  GitHub/GitLab/Slack/Stripe/Google/npm tokens, and hardcoded passwords
- scripts/install-hooks.sh: one-command git pre-commit hook installer
- .secretscanignore: allowlist for known false positives (test fixtures,
  env var references, placeholder values)
- CI job: secret-scan step in ci.yml scans PR diffs against origin/main
- npm scripts: test:secret-scan, secret-scan, secret-scan:install-hook
- 17 tests covering detection, non-detection, binary skipping, CI mode

* fix: exclude secret-scan test file from CI scanning

The test file contains intentional fake secrets as test inputs.
Add it to .secretscanignore so CI doesn't flag them.

* fix: skip secret-scan tests on Windows (requires bash/POSIX grep)
2026-03-18 08:33:17 -06:00
Jeremy McSpadden
d834d7be41 fix: pause auto-mode when env variables needed instead of blocking (#1147)
* fix: pause auto-mode instead of blocking when env variables needed (#1146)

When gsd auto encounters pending secrets in the SECRETS.md manifest,
it now pauses the session with a clear notification listing the missing
keys, instead of blocking the entire auto loop with an interactive TUI
prompt. On resume (/gsd auto), secrets are re-collected via the TUI —
if all are skipped, the session re-pauses to prevent broken task runs.

* feat: notify remote channels (Slack/Discord/Telegram) on secrets pause

Sends a one-way notification to the configured remote channel when
auto-mode pauses for missing env variables. The notification directs
the user back to the terminal — secrets are never collected through
remote channels for security reasons.
2026-03-18 08:32:46 -06:00
Tom Boucher
ea42db9a1f fix(ci): fix dev-publish version stamp and platform sync (#1145)
Two bugs in the Dev Publish job:

1. node -p with escaped double-quotes broke on Node 22's eval mode
   (SyntaxError: Invalid or unexpected token). Switched to node -e
   with process.stdout.write and unescaped inner quotes.

2. version-stamp updated root package.json but not platform packages.
   When npm publish triggered prepublishOnly, sync-platform-versions
   dirtied 5 platform package.json files and git diff --exit-code
   failed. Added sync-platform-versions to the stamp step so
   prepublishOnly finds everything already in sync.

Fixes: https://github.com/gsd-build/gsd-2/actions/runs/23233857718
2026-03-18 08:32:03 -06:00
Tom Boucher
556443b6e3 docs: comprehensive documentation update (#1142)
README.md:
- Updated 'What's New' section with CI/CD, Docker, /gsd keys, milestone
  parking, Studio, per-project MCP config
- Added CI/CD pipeline doc link
- Added /gsd keys to commands table

docs/commands.md:
- Added /gsd keys, /gsd config, /gsd new-milestone commands
- Added Milestone Management section with park/unpark/discard/skip/undo

docs/troubleshooting.md:
- Added Windows-specific issues (LSP ENOENT, EBUSY file locks)
- Added database initialization troubleshooting
- Added verification gate syntax error troubleshooting
2026-03-18 08:31:09 -06:00
Tom Boucher
fedfbcd255 feat(mcporter): add .gsd/mcp.json per-project MCP config support (#1141) 2026-03-18 08:26:02 -06:00
Tom Boucher
b1ce681803 feat(metrics): add API request counter for copilot/subscription users (#1140) 2026-03-18 08:25:41 -06:00
Tom Boucher
65fe3c2adc fix(google-search): add 30s timeout to Gemini API call (#1139) 2026-03-18 08:25:24 -06:00
Tom Boucher
62a8be03da fix(verification-gate): sanitize preference commands with isLikelyCommand (#1138) 2026-03-18 08:25:08 -06:00
Tom Boucher
308e328c66 fix(auto-dashboard): show trigger task label for hook units (#1136) 2026-03-18 08:24:39 -06:00
Tom Boucher
ce3dc6ce7b fix(auto-worktree): detect worktree structurally when originalBase is null (#1135) 2026-03-18 08:24:14 -06:00
Tom Boucher
fa39a87465 fix(model-resolver): prefer provider's recommended variant over saved base model (#1131) 2026-03-18 08:23:56 -06:00
Tom Boucher
03caf9c958 fix(auto-worktree): auto-commit project root dirty state before milestone merge (#1130) 2026-03-18 08:23:39 -06:00
Tom Boucher
3c0125555b fix(guided-flow): support re-discuss flow for already-discussed slices (#1129) 2026-03-18 08:23:23 -06:00
deseltrus
1410aa597b fix: dispatch guard skips parked milestones — they no longer block later milestone dispatch (#1126) 2026-03-18 08:22:58 -06:00
deseltrus
9b3f1ea261 fix: worktree reassess-roadmap loop — existsSync fallback in checkNeedsReassessment (#1117) 2026-03-18 08:22:32 -06:00
deseltrus
0e4de6fff8 feat: per-milestone depth verification + queue-flow write-gate (#1116) 2026-03-18 08:22:19 -06:00
Vedant
3f9085a588 feat: add OSC 8 clickable hyperlinks for file paths in export notifications (#1114) 2026-03-18 08:21:56 -06:00
Tom Boucher
85642bbb6d fix(lsp): use where.exe on Windows to resolve command paths (#1134) 2026-03-18 08:21:33 -06:00
Tom Boucher
b2ea63a214 fix(gsd-db): auto-initialize database when tools are called (#1133) 2026-03-18 08:21:15 -06:00
Rytis Lukosevicius
33f04df029 fix: inline preferences path to fix remote questions setup (#1110) (#1111)
`remote-questions-config.ts` was extracted in #592 to avoid crossing
the compiled/uncompiled boundary. However, it still imported
`getGlobalGSDPreferencesPath` from `preferences.ts` via a `.js`
extension — which fails at runtime because `preferences.ts` is
loaded via jiti and never compiled to `.js` in dist/.

This caused remote questions setup (Telegram/Slack/Discord) to fail
during `gsd config` with:

  Cannot find module '.../preferences.js' imported from
  .../remote-questions-config.js

Fix: inline the path constant directly. It's a single `join()` call
with no logic, so duplicating it is cleaner than adding a build step
or creating a separate compiled module just for this one export.
2026-03-18 01:24:43 -06:00
TÂCHES
920f1bed9a fix(ci): add safe.directory for containerized pipeline job (#1108)
* feat(S01/T01): Scaffolded the `studio` Electron workspace with a workin…

- package.json
- studio/package.json
- studio/electron.vite.config.ts
- studio/src/main/index.ts
- studio/src/preload/index.ts
- studio/src/renderer/src/styles/index.css
- studio/src/renderer/src/App.tsx

* chore: init gsd

* fix(ci): add safe.directory for containerized pipeline job

The Dev Publish job runs inside a Docker container where the checkout
user differs from the container user (root), causing git's dubious
ownership check to reject git operations in version-stamp.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ci): remove .gsd/.gitignore from tracking

The no-gsd-dir CI check fails when .gsd/ exists as a directory, even
if only .gitignore is tracked inside it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 01:11:52 -06:00
Copilot
1020c140af Fix Codex server_error handling: extraction, retry matching, escalating backoff (#1106)
* Initial plan

* Fix OpenAI Codex error handling: proper error extraction, retry matching, and escalating backoff

- Fix mapCodexEvents to extract error details from nested event.error object
  (Codex API returns {type:"error", error:{type:"server_error", message:"..."}})
- Fix _isRetryableError regex: server.?error matches both server_error and server error
- Add escalating backoff for repeated transient auto-resumes (30s→60s→120s→240s→480s)
- Cap consecutive transient auto-resumes at 5 before pausing indefinitely
- Reset counter on successful unit completion

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

* Improve regex test to be behavioral instead of structural

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-18 01:10:55 -06:00
deseltrus
51da6c4f74 feat: park/discard actions for in-progress milestones (#1107)
* feat: add park/discard actions for in-progress milestones

Users could not discard, park, or skip milestones once work had begun.
The wizard only offered "Go auto" and "View status" for milestones with
a roadmap, trapping users with stale or deprioritized milestones.

This adds:

- Park mechanism: PARKED.md marker file in milestone directory.
  deriveState() transparently skips parked milestones when finding the
  active one. Parked milestones do NOT satisfy depends_on for downstream
  milestones, preventing accidental unblocking.

- "Milestone actions" submenu in all four active-milestone wizard
  branches (roadmap-exists, planning, summarizing, executing). Offers
  Park / Discard / Skip / Back with clean navigation.

- /gsd park [id] and /gsd unpark [id] CLI subcommands for direct access.

- New module milestone-actions.ts with parkMilestone(), unparkMilestone(),
  discardMilestone(), isParked(), getParkedReason() — keeps guided-flow
  and commands thin.

- 14 tests (36 assertions) covering state derivation, dependency
  semantics, park/unpark round-trip, discard with queue-order pruning,
  and edge cases (all-parked, no-roadmap park, progress counts).

Files changed:
  types.ts           — Add 'parked' to MilestoneRegistryEntry.status
  milestone-actions.ts — NEW: park/unpark/discard core logic
  state.ts           — Skip parked in getActiveMilestoneId + deriveState
  guided-flow.ts     — Milestone actions submenu in 4 wizard branches
  commands.ts        — /gsd park and /gsd unpark subcommands + help
  guided-flow-queue.ts — Parked count in queue summary
  visualizer-data.ts — Add 'parked' to VisualizerMilestone.status
  park-milestone.test.ts — NEW: comprehensive test suite

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test: add edge case tests for park/discard milestone interactions

Covers 9 critical scenarios (31 assertions):
- Discard breaks depends_on chain → system correctly blocks
- Park blocks depends_on chain
- Queue order survives discards (QUEUE-ORDER.json pruned)
- Park all + discard all → clean pre-planning state
- Mixed states coexist (complete + parked + active + pending)
- Park then discard same milestone
- Discard milestone that has deps on others

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address critical review findings for park/discard feature

Fixes 7 issues found by adversarial code review:

1. CRITICAL: auto-mode crashed with "Unexpected: N incomplete" error when
   all milestones were parked. Filter now excludes 'parked' status, and
   pre-planning phase is recognized as a valid stop condition.

2. Merge-to-main was skipped when parked milestones existed — same
   incomplete filter now excludes parked.

3. Completed milestones could be parked, corrupting depends_on
   satisfaction. parkMilestone() now guards against SUMMARY.md existence.

4. Escape during park reason picker silently parked with literal
   "not_yet" as reason. Now properly cancels the operation.

5. Parked milestones lost their human-readable title in registry
   (showed ID instead). Phase 1 now caches roadmap for parked
   milestones too, for title extraction.

6. GSD_MILESTONE_LOCK bypassed parked check — parallel workers locked
   to a parked milestone now correctly return null.

7. Parked milestones were eligible for parallel execution, wasting
   worker slots. parallel-eligibility now skips parked milestones.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: complete parked status display across all surfaces

- Visualizer: parked milestones show pause glyph (yellow) instead of
  pending dot
- Doctor: parked milestones show pause emoji in registry report
- HTML export: add .dot-parked CSS (yellow), parked legend entry,
  collapse parked milestone details by default
- Queue reorder: exclude parked milestones from movable list

Closes all remaining cosmetic findings from adversarial review.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 01:03:00 -06:00
TÂCHES
6f410a0041 feat(ci): implement three-stage promotion pipeline (Dev → Test → Prod) (#1098)
* feat(ci): add version stamp script for dev publishes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add CLI smoke tests for pipeline test stage

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add FixtureProvider for LLM conversation recording and replay

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add fixture test runner and sample recordings

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add live test stubs and pipeline npm scripts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add three-stage promotion pipeline workflow

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add weekly cleanup workflow for stale dev versions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add fixture recording helper stub

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 00:40:06 -06:00
Lex Christopherson
f28feaed36 fix: remove .gsd/ from tracking, ignore entire directory
.gsd/ contains per-worktree project state (milestones, db, decisions)
that should never be committed. Auto-commits were leaking these files
into the repo, causing the no-gsd-dir CI check to fail.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 00:33:35 -06:00
Lex Christopherson
2d974dfb59 chore: update state — S01 planned, ready for execution 2026-03-18 00:25:26 -06:00
Lex Christopherson
26451ffc2f docs(S01): add slice plan 2026-03-18 00:24:33 -06:00