Commit graph

1155 commits

Author SHA1 Message Date
Lex Christopherson
7ca3ce04a4 fix(gsd): remove stale observability validator + fix greenfield worktree check
The observability validator checked for markdown headings (## Observability / Diagnostics,
## Observability Impact) that the DB-backed renderer never produces, causing false-positive
warnings on every dispatch. Removed entirely — the DB schema enforces structure at write time.

The worktree health check blocked execution in directories without recognized project files
(package.json, Cargo.toml, etc.), preventing greenfield projects from scaffolding. Downgraded
to a warning — .git check remains as the hard gate.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 07:27:48 -06:00
Lex Christopherson
c722442bb3 fix(gsd): keep params as any in db-tools executors (CI tsconfig is stricter)
Local tsconfig excludes src/resources/ but CI compiles everything.
Record<string, unknown> for params broke handler calls since handlers
expect typed params (validated at runtime). Keep params: any with
eslint-disable annotation, type all other executor params properly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 06:17:20 -06:00
Lex Christopherson
dc3fe88369 fix(gsd): replace any types in db-tools executor signatures
Tool executor lambdas now use proper types (string, Record<string, unknown>,
AbortSignal | undefined) instead of any for all parameters.
registerAlias toolDef param also properly typed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 06:06:51 -06:00
Lex Christopherson
2f7208150a fix(gsd): resolve 4 TS compilation errors from parser migration
- github-sync/sync.ts: import parseRoadmap/parsePlan from parsers-legacy
- auto-worktree.ts: replace dangling roadmap.title with getMilestone() DB query
- markdown-renderer.ts: add explicit type annotations on lazy-loaded parser callbacks

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 06:04:29 -06:00
Lex Christopherson
1194548d61 fix(gsd): wrap plan-task DB writes in transaction + untrack .gsd/ artifacts
plan-task.ts was the only planning tool handler not wrapping its
insertTask/upsertTaskPlanning calls in a transaction(), risking partial
DB state if the upsert failed after insert. Matches the pattern used by
plan-slice, replan-slice, reassess-roadmap, and plan-milestone.

Also removes 80 .gsd/ working artifacts that were force-added despite
being in .gitignore.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 13:42:38 -06:00
TÂCHES
108845dd4b chore(M001): auto-commit after complete-milestone 2026-03-23 13:32:31 -06:00
TÂCHES
dff941b1dc chore(M001): auto-commit after validate-milestone 2026-03-23 13:19:14 -06:00
TÂCHES
f76fe8ec1e feat(S06/T02): Strip all 16 lazy createRequire fallback paths from migr…
- src/resources/extensions/gsd/dispatch-guard.ts
- src/resources/extensions/gsd/auto-dispatch.ts
- src/resources/extensions/gsd/auto-verification.ts
- src/resources/extensions/gsd/parallel-eligibility.ts
- src/resources/extensions/gsd/doctor.ts
- src/resources/extensions/gsd/doctor-checks.ts
- src/resources/extensions/gsd/visualizer-data.ts
- src/resources/extensions/gsd/workspace-index.ts
2026-03-23 13:09:37 -06:00
TÂCHES
56efa72886 test(S06/T01): Extract parseRoadmap/parsePlan into parsers-legacy.ts, u…
- src/resources/extensions/gsd/parsers-legacy.ts
- src/resources/extensions/gsd/files.ts
- src/resources/extensions/gsd/state.ts
- src/resources/extensions/gsd/md-importer.ts
- src/resources/extensions/gsd/commands-maintenance.ts
- src/resources/extensions/gsd/markdown-renderer.ts
- src/resources/extensions/gsd/auto-recovery.ts
- src/resources/extensions/gsd/tests/parsers.test.ts
2026-03-23 12:53:49 -06:00
TÂCHES
460f6f3933 feat(S05/T04): Migrate remaining 6 callers (auto-prompts, auto-recovery…
- src/resources/extensions/gsd/auto-prompts.ts
- src/resources/extensions/gsd/auto-recovery.ts
- src/resources/extensions/gsd/auto-direct-dispatch.ts
- src/resources/extensions/gsd/auto-worktree.ts
- src/resources/extensions/gsd/reactive-graph.ts
- src/resources/extensions/gsd/markdown-renderer.ts
2026-03-23 12:17:23 -06:00
TÂCHES
06a876676a feat(S05/T03): Migrate 7 warm/cold callers (doctor, doctor-checks, visu…
- src/resources/extensions/gsd/doctor.ts
- src/resources/extensions/gsd/doctor-checks.ts
- src/resources/extensions/gsd/visualizer-data.ts
- src/resources/extensions/gsd/workspace-index.ts
- src/resources/extensions/gsd/dashboard-overlay.ts
- src/resources/extensions/gsd/auto-dashboard.ts
- src/resources/extensions/gsd/guided-flow.ts
2026-03-23 12:07:01 -06:00
TÂCHES
4d3ccb5b08 feat(S05/T02): Extend migrateHierarchyToDb to populate v8 planning colu…
- src/resources/extensions/gsd/md-importer.ts
- src/resources/extensions/gsd/tests/gsd-recover.test.ts
2026-03-23 11:52:46 -06:00
TÂCHES
64908fc822 feat(S05/T01): Schema v10 adds replan_triggered_at column; deriveStateF…
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/state.ts
- src/resources/extensions/gsd/triage-resolution.ts
- src/resources/extensions/gsd/tests/flag-file-db.test.ts
- src/resources/extensions/gsd/tests/derive-state-db.test.ts
2026-03-23 11:46:28 -06:00
TÂCHES
d7994a1538 fix(S04/T04): Add planning-crossval tests proving DB↔rendered↔parsed pa…
- src/resources/extensions/gsd/tests/planning-crossval.test.ts
- src/resources/extensions/gsd/markdown-renderer.ts
- .gsd/milestones/M001/slices/S04/tasks/T04-PLAN.md
2026-03-23 11:16:24 -06:00
TÂCHES
93e46c3712 feat(S04/T03): Migrate auto-dispatch.ts (3 rules), auto-verification.ts…
- src/resources/extensions/gsd/auto-dispatch.ts
- src/resources/extensions/gsd/auto-verification.ts
- src/resources/extensions/gsd/parallel-eligibility.ts
- .gsd/milestones/M001/slices/S04/tasks/T03-PLAN.md
2026-03-23 11:09:38 -06:00
TÂCHES
08c3fcc57c feat(S04/T02): Migrate dispatch-guard.ts to DB queries with isDbAvailab…
- src/resources/extensions/gsd/dispatch-guard.ts
- src/resources/extensions/gsd/tests/dispatch-guard.test.ts
- .gsd/milestones/M001/slices/S04/tasks/T02-PLAN.md
2026-03-23 11:03:42 -06:00
TÂCHES
f86882bde5 fix(S04/T01): Add schema v9 migration with sequence column on slices/ta…
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts
- .gsd/milestones/M001/slices/S04/S04-PLAN.md
- .gsd/milestones/M001/slices/S04/tasks/T01-PLAN.md
2026-03-23 10:57:27 -06:00
TÂCHES
356d54431e test(S03/T03): Register gsd_replan_slice and gsd_reassess_roadmap tools…
- src/resources/extensions/gsd/bootstrap/db-tools.ts
- src/resources/extensions/gsd/prompts/replan-slice.md
- src/resources/extensions/gsd/prompts/reassess-roadmap.md
- src/resources/extensions/gsd/tests/prompt-contracts.test.ts
2026-03-23 10:37:08 -06:00
TÂCHES
46c5d37a8d test(S03/T02): Implement reassess_roadmap handler with structural enfor…
- src/resources/extensions/gsd/tools/reassess-roadmap.ts
- src/resources/extensions/gsd/tests/reassess-handler.test.ts
- src/resources/extensions/gsd/gsd-db.ts
2026-03-23 10:33:13 -06:00
TÂCHES
1acf1a6f57 test(S03/T01): Implement replan_slice handler with structural enforceme…
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/markdown-renderer.ts
- src/resources/extensions/gsd/tools/replan-slice.ts
- src/resources/extensions/gsd/tests/replan-handler.test.ts
- .gsd/milestones/M001/slices/S03/S03-PLAN.md
2026-03-23 10:28:33 -06:00
TÂCHES
d53bf56bae test(S02/T03): Update plan-slice prompt to explicitly name gsd_plan_sli…
- src/resources/extensions/gsd/prompts/plan-slice.md
- src/resources/extensions/gsd/tests/prompt-contracts.test.ts
- src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts
- .gsd/milestones/M001/slices/S02/tasks/T03-PLAN.md
2026-03-23 10:08:44 -06:00
TÂCHES
a380b8ed77 test(S02/T02): Implement DB-backed gsd_plan_slice and gsd_plan_task han…
- .gsd/milestones/M001/slices/S02/S02-PLAN.md
- src/resources/extensions/gsd/tools/plan-slice.ts
- src/resources/extensions/gsd/tools/plan-task.ts
- src/resources/extensions/gsd/bootstrap/db-tools.ts
- src/resources/extensions/gsd/gsd-db.ts
- src/resources/extensions/gsd/tests/plan-slice.test.ts
- src/resources/extensions/gsd/tests/plan-task.test.ts
2026-03-23 10:05:11 -06:00
TÂCHES
752b26d542 test(S02/T01): Add DB-backed slice and task plan renderers with compati…
- src/resources/extensions/gsd/markdown-renderer.ts
- src/resources/extensions/gsd/tests/markdown-renderer.test.ts
- src/resources/extensions/gsd/tests/auto-recovery.test.ts
- .gsd/KNOWLEDGE.md
2026-03-23 09:58:52 -06:00
TÂCHES
ccb7b5d1ed test(S01/T04): Finalize S01 regression coverage and prove the DB-backed…
- .gsd/milestones/M001/slices/S01/tasks/T04-PLAN.md
- src/resources/extensions/gsd/tests/plan-milestone.test.ts
2026-03-23 09:43:39 -06:00
TÂCHES
04c6b79dac feat(S01/T03): Migrate planning prompts to DB-backed tool guidance and…
- src/resources/extensions/gsd/prompts/plan-milestone.md
- src/resources/extensions/gsd/prompts/guided-plan-milestone.md
- src/resources/extensions/gsd/prompts/plan-slice.md
- src/resources/extensions/gsd/prompts/replan-slice.md
- src/resources/extensions/gsd/prompts/reassess-roadmap.md
- src/resources/extensions/gsd/auto-post-unit.ts
- src/resources/extensions/gsd/tests/prompt-contracts.test.ts
- src/resources/extensions/gsd/tests/rogue-file-detection.test.ts
2026-03-23 09:39:24 -06:00
TÂCHES
b75183b642 test(S01/T02): Added the DB-backed gsd_plan_milestone handler, tool reg…
- src/resources/extensions/gsd/tools/plan-milestone.ts
- src/resources/extensions/gsd/bootstrap/db-tools.ts
- src/resources/extensions/gsd/markdown-renderer.ts
- src/resources/extensions/gsd/tests/plan-milestone.test.ts
2026-03-23 09:31:40 -06:00
TÂCHES
7c7616cb5c feat(S01/T01): Partially advanced schema v8 groundwork and documented t…
- .gsd/milestones/M001/slices/S01/S01-PLAN.md
- src/resources/extensions/gsd/gsd-db.ts
2026-03-23 09:25:42 -06:00
Lex Christopherson
f062c50e40 Merge branch 'feat/tool-driven-state-transitions' into next 2026-03-22 17:22:27 -06:00
Tom Boucher
615c6845b2 fix(web): kill stale server process before launch to prevent EADDRINUSE (#1934) (#2034)
When `gsd --web` exits uncleanly (terminal closed, crash), the spawned
server process survives as an orphan bound to port 3000. On re-launch,
the new server gets EADDRINUSE and the 3-minute boot-ready poll hangs.

Add `cleanupStaleInstance()` that checks the instance registry for a
previous entry matching the same cwd and kills its process before
reserving a port. This makes re-launches succeed immediately instead
of timing out after 180 seconds.

Fixes #1934

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:06:29 -06:00
Tom Boucher
a7cf125970 fix(git): force LC_ALL=C in GIT_NO_PROMPT_ENV to support non-English locales (#2035)
On non-English systems (e.g. LANG=de_DE.UTF-8), git produces localized
stderr output. GSD's stderr.includes() guards are hardcoded to English
strings and never match, causing every git add with exclusions to throw
GSD_GIT_ERROR and merge failures to be misclassified.

- Add LC_ALL: "C" to GIT_NO_PROMPT_ENV in git-constants.ts
- Add env: GIT_NO_PROMPT_ENV to nativeMergeSquash fallback execFileSync
- Add regression tests for both fixes

Fixes #1997

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:05:50 -06:00
Tom Boucher
8d5cadd53b fix(forensics): force gh CLI for issue creation to prevent misrouting (#2067) (#2094)
The forensics prompt suggested `gh issue create` but the agent's
system-level tool rules preferred the `github_issues` tool, which has
no repo parameter and always targets the user's current repository.
Add an explicit constraint forbidding `github_issues` and requiring
the `bash` tool with `gh issue create --repo gsd-build/gsd-2`.

Fixes #2067

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:05:26 -06:00
Tom Boucher
a6f8f77bbc fix: force-stage .gsd/milestones/ artifacts when .gsd is a symlink (#2104) (#2112)
When .gsd is a symlink (external state projects), autoCommit silently
drops new milestone artifacts because:
1. nativeAddAllWithExclusions falls back to plain `git add -A` (symlink
   pathspec rejection: "beyond a symbolic link")
2. `.gsd` is in .gitignore, so new .gsd/ files are invisible to git add

`git add -f` also fails through symlinks, so this fix uses
`git hash-object -w` + `git update-index --add --cacheinfo` to bypass
the symlink restriction entirely, staging each milestone artifact by
hashing its content and inserting the blob directly into the index.

Includes a reproduction test that creates a repo with .gsd as a symlink,
adds new files under .gsd/milestones/, and verifies they are staged.

Fixes #2104

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:05:05 -06:00
Lex Christopherson
547bffa6d8 fix(tests): update remediation step assertions and crossval fixture
- auto-recovery, idle-recovery, validate-milestone tests: assert
  gsd recover instead of gsd doctor in remediation steps
- derive-state-crossval test C: add task summary files so migration
  consistency check doesn't downgrade tasks to pending
- md-importer: slice auto-upgrade now requires slice summary to exist
  (all tasks done without slice summary = summarizing, not complete)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 17:01:10 -06:00
Lex Christopherson
85f849ab7b fix(gsd): address all 7 review findings from PR #2141
1. Pre-migration consistency check: migrateHierarchyToDb() validates
   task done+summary agreement and auto-upgrades slice status when all
   tasks are genuinely complete — prevents importing bad markdown state.

2. buildLoopRemediationSteps: all branches updated to reference
   gsd undo-task, gsd reset-slice, and gsd recover instead of manual
   checkbox editing and gsd doctor reconciliation.

3. DB/disk render split: complete-task and complete-slice handlers
   roll back DB status if disk render fails, keeping deriveState()
   and verifyExpectedArtifact() consistent.

4. Pre-upgrade worktree reconciliation: syncWorktreeStateBack() detects
   local gsd.db copies from pre-WAL worktrees and reconciles hierarchy
   data into the project root DB before file sync.

5. Dead COMPLETION_TRANSITION_CODES removed: empty Set export deleted
   from doctor-types.ts, dead guard in doctor.ts shouldFix() removed.

6. (Merged with fix 2 — all branches updated.)

7. Stale state.ts comment replaced: removed misleading "intentionally
   do NOT load from SQLite DB" note, replaced with accurate description
   of filesystem fallback role.

Test fixes: schema version assertions (6→7), tool count (10→12),
doctor behavior assertions updated to match new state-transition model.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 16:52:14 -06:00
Lex Christopherson
2611d2e35a fix(tests): remove invalid seq property from insertMilestone calls
The milestone type only accepts { id, title?, status?, depends_on?[] } —
`seq` is not a valid property and caused TS2353 typecheck failures in CI.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 16:31:05 -06:00
TÂCHES
df6800ec05 feat(gsd): tool-driven write-side state transitions (M001)
Replace markdown-mutation completion path with atomic SQLite tool calls.

- gsd_complete_task and gsd_slice_complete tool handlers with DB transactions
- Schema v5→v6→v7 with milestones/slices/tasks tables
- Standalone markdown-renderer engine (DB → disk)
- deriveState() SQL rewrite (<1ms from DB, filesystem fallback)
- Auto-migration from markdown-only projects
- Shared WAL DB for parallel worktrees
- Stale render detection and crash recovery
- Rogue file write detection safety net
- Doctor reconciliation removal (~800 lines deleted)
- CLI undo-task and reset-slice commands
- gsd recover for DB reconstruction
- Prompts rewritten for tool calls instead of checkbox mutation
- End-to-end integration proof covering all 13 requirements (R001-R013)

49 files changed, 8707 insertions, 1403 deletions
2026-03-22 16:15:32 -06:00
Lex Christopherson
e35bc2fe15 fix(tests): wrap rmSync cleanup in try/catch for Windows EPERM
maxRetries doesn't help with EPERM (only EBUSY/EMFILE/ENFILE).
Windows holds directory handles after close, making rmSync fail
in afterEach. Swallowing the error is safe — OS cleans temp dirs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 10:12:42 -06:00
Lex Christopherson
6923ddd519 fix(tests): add maxRetries to rmSync cleanup for Windows EPERM compatibility
Windows holds file handles briefly after close, causing EPERM on
rmSync in afterEach cleanup. Node's maxRetries/retryDelay options
handle this by retrying after a short delay.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 10:03:46 -06:00
Copilot
21b2b6c795 fix: recursive key sorting in tool-call loop guard hash function (#1962)
* Initial plan

* fix: use recursive-sort replacer in hashToolCall to preserve nested properties

The array replacer in JSON.stringify acted as a property-name whitelist at
every nesting level, stripping all nested object properties and causing
structurally different tool calls to produce identical hashes. This led to
false-positive loop detection for tools with nested/array arguments like
ask_user_questions, plan_clarify, browser_batch, etc.

Replace with a function replacer that recursively sorts object keys while
preserving array order and primitive values.

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
Agent-Logs-Url: https://github.com/gsd-build/gsd-2/sessions/c10384bc-a2f9-46b8-8380-43ea451ed39d

* fix: add missing codeFilesChanged to mergeMilestoneToMain mock in journal-integration test

Pre-existing typecheck failure: the mock was missing the codeFilesChanged
property added to the mergeMilestoneToMain return type.

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
Agent-Logs-Url: https://github.com/gsd-build/gsd-2/sessions/debb019f-2fc8-4c76-b809-ecfe48993eff

---------

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-22 09:54:03 -06:00
Lex Christopherson
17a2f55edb fix: use path.sep for cross-platform path traversal guards and test assertions
Path traversal guards used hardcoded "/" separator which fails on Windows
where resolve() produces backslash paths. Test assertions also used
forward-slash path fragments.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 09:39:21 -06:00
Lex Christopherson
97241ea19c fix(tests): use cross-platform path split in run-manager timestamp test
The test split on "/" which fails on Windows where paths use "\".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 09:31:08 -06:00
TÂCHES
2aa01b8a60 feat(gsd): declarative workflow engine — YAML-defined workflows through the auto-loop (#2024)
* docs(S01): add slice plan

* feat(S01/T01): Created four engine abstraction layer files: engine-type…

- src/resources/extensions/gsd/engine-types.ts
- src/resources/extensions/gsd/workflow-engine.ts
- src/resources/extensions/gsd/execution-policy.ts
- src/resources/extensions/gsd/engine-resolver.ts

* test(S01/T02): Added activeEngineId to AutoSession lifecycle (property,…

- src/resources/extensions/gsd/auto/session.ts
- src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts

* chore(M001/S02): auto-commit after research-slice

* docs(S02): add slice plan

* feat(S02/T01): Created DevWorkflowEngine and DevExecutionPolicy classes…

- src/resources/extensions/gsd/dev-workflow-engine.ts
- src/resources/extensions/gsd/dev-execution-policy.ts
- src/resources/extensions/gsd/engine-resolver.ts
- src/resources/extensions/gsd/auto.ts

* test(S02/T02): Added 18 contract tests for dev engine wrapper and updat…

- src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts
- src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts

* docs(S03): add slice plan

* chore(S03/T01): Added definition-loader.ts with V1 YAML schema validati…

- src/resources/extensions/gsd/definition-loader.ts
- src/resources/extensions/gsd/tests/definition-loader.test.ts

* feat(S03/T02): Added graph.ts with YAML I/O, DAG dependency queries, im…

- src/resources/extensions/gsd/graph.ts
- src/resources/extensions/gsd/tests/graph-operations.test.ts

* docs(S04): add slice plan

* test(S04/T01): Created run-manager with createRun/listRuns, CustomWorkf…

- src/resources/extensions/gsd/run-manager.ts
- src/resources/extensions/gsd/custom-workflow-engine.ts
- src/resources/extensions/gsd/custom-execution-policy.ts
- src/resources/extensions/gsd/tests/run-manager.test.ts
- src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts

* feat(S04/T02): Extended engine-resolver with custom engine branch, adde…

- src/resources/extensions/gsd/engine-resolver.ts
- src/resources/extensions/gsd/auto/session.ts
- src/resources/extensions/gsd/auto.ts
- src/resources/extensions/gsd/auto-dashboard.ts

* test(S04/T03): Added polymorphic custom engine dispatch path to autoLoo…

- src/resources/extensions/gsd/auto/loop.ts
- src/resources/extensions/gsd/auto/phases.ts
- src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts

* docs(S05): add slice plan

* feat(S05/T01): Created custom-verification.ts with four policy handlers…

- src/resources/extensions/gsd/custom-verification.ts
- src/resources/extensions/gsd/custom-execution-policy.ts
- src/resources/extensions/gsd/engine-resolver.ts
- src/resources/extensions/gsd/tests/custom-verification.test.ts

* feat(S05/T02): Created context-injector.ts with injectContext() that re…

- src/resources/extensions/gsd/context-injector.ts
- src/resources/extensions/gsd/custom-workflow-engine.ts
- src/resources/extensions/gsd/tests/context-injector.test.ts

* docs(S06): add slice plan

* test(S06/T01): Wired expandIteration() into resolveDispatch() with DEFI…

- src/resources/extensions/gsd/custom-workflow-engine.ts
- src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts
- src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts

* docs(S07): add slice plan

* feat(S07/T01): Added six `/gsd workflow` subcommands (new, run, list, v…

- src/resources/extensions/gsd/commands/handlers/workflow.ts
- src/resources/extensions/gsd/commands/catalog.ts
- src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts

* fix(S07/T02): Added updateProgressWidget call in custom engine path and…

- src/resources/extensions/gsd/auto/loop.ts
- src/resources/extensions/gsd/dashboard-overlay.ts
- src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts

* docs(S08): add slice plan

* docs(S08/T01): Created 7-file router-pattern skill for conversational Y…

- src/resources/skills/create-workflow/SKILL.md
- src/resources/skills/create-workflow/workflows/create-from-scratch.md
- src/resources/skills/create-workflow/workflows/create-from-template.md
- src/resources/skills/create-workflow/references/yaml-schema-v1.md
- src/resources/skills/create-workflow/references/verification-policies.md
- src/resources/skills/create-workflow/references/feature-patterns.md
- src/resources/skills/create-workflow/templates/workflow-definition.yaml

* test(S08/T02): Created 3 example workflow definitions (blog-post-pipeli…

- src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml
- src/resources/skills/create-workflow/templates/code-audit.yaml
- src/resources/skills/create-workflow/templates/release-checklist.yaml
- src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts

* docs(S09): add slice plan

* test(S09/T01): Comprehensive e2e integration test proving the full work…

- src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts

* chore: remove .gsd/ artifacts from tracking (already in .gitignore)

* fix(skills): resolve broken cross-references in create-workflow workflow files

Paths in workflows/ referenced references/ as siblings, but they need
../references/ since they're resolved relative to the workflows/ directory.

* fix: resolve typecheck failures — .ts→.js imports, MapIterator.some(), LoadedGSDPreferences unwrap, constructor args

- Convert .ts import extensions to .js in source files to match codebase
  convention (tests keep .ts since tsconfig.extensions allows it)
- Use [...idCounts.values()].some() instead of MapIterator.some()
- Unwrap LoadedGSDPreferences.preferences for DispatchContext.prefs
- Pass runDir to CustomExecutionPolicy constructor in tests

* fix: add codeFilesChanged to mergeMilestoneToMain mock (synced with main)

* fix(tests): write DEFINITION.yaml in integration tests, fix error message assertion

Root cause: S06 (iterate) added DEFINITION.yaml reading to
resolveDispatch(), but S04's integration tests only wrote GRAPH.yaml.
The missing file threw ENOENT, swallowed by the blanket catch, causing
steps to stay 'pending' silently.

Fixes:
- custom-engine-loop-integration: write DEFINITION.yaml in all 5 tests
- custom-workflow-engine: verify test creates temp dir with definition
- dev-engine-wrapper: update error regex — resolver validates activeRunDir
  before engine ID, so 'Unknown engine' is never reached

* fix: address 13 audit findings from self-review of workflow engine PR

Critical:
- Fix verify-before-reconcile ordering — verify step output before
  marking complete in GRAPH.yaml, so failed verification triggers retry
- Fix GSD_ENGINE_BYPASS kill switch — check env var in autoLoop before
  entering custom engine block instead of throwing from resolveEngine
- Add shell-command injection guard with suspicious pattern detection

High:
- Add ReDoS timeout guard (5s) for iterate regex patterns
- Centralize DEFINITION.yaml parsing into readFrozenDefinition() with
  schema: "core" restriction, eliminating 3 independent parse+cast sites
- Persist activeEngineId/activeRunDir in paused-session.json and restore
  on resume so custom workflows survive /exit
- Clean up engine state on startAuto failure in workflow run handler

Medium:
- Coerce params values to strings in definition-loader (YAML numbers/bools)
- Add path traversal guard (resolve + startsWith) in context-injector
  and custom-verification content-heuristic
- Use function replacer in expandIteration to prevent $ escaping bugs

Low:
- Fix skill docs CLI syntax (remove --param prefix)
- Use resolveProjectRoot instead of process.cwd() in catalog completions
- Rename isHookUnit → skipArtifactVerification for clarity

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-22 08:51:47 -06:00
Iouri Goussev
642c0f5a9e test: fix Assertion Roulette, Eager Test, and contract test regressions (#1938)
* test: add assertion messages to fix Assertion Roulette in GSD tests

Add descriptive messages to multi-assertion tests where a bare failure
output ("expected true, got false") wouldn't identify which assertion
broke. Affected tests: auto-secrets-gate, search-tavily, search-provider-
command, tavily-helpers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: fix Eager Test smell in captures and worktree-manager tests

- Split captures: loadPendingCaptures test — extracted loadAllCaptures
  assertion into its own focused test
- Refactor worktree-manager: replace monolithic main() script with 11
  isolated test() calls, each with its own repo setup via helpers

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: add assertion messages to remaining test files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: fix contract test gate, dynamic roots, and shared fetch helpers

- Fix reject-notice sub-test gated on outcome.kind (actual) instead of
  expectedKind (map value) in web-command-parity-contract.test.ts
- Restore dynamic loop over registered non-gsd passthrough roots with
  an explicit count assertion so new registrations fail loudly
- Extract normalizeHeaders/parseJsonBody to src/tests/fetch-test-helpers.ts
  and import in both search-tavily and llm-context-tavily tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 21:24:15 -06:00
Lex Christopherson
61e473b32c fix: add missing codeFilesChanged to journal integration test mock
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:12:38 -06:00
TÂCHES
d40ed851a2 fix(repo-identity): use native realpath on Windows to resolve 8.3 short paths (#1960)
Use realpathSync.native() on Windows in canonicalizeExistingPath to resolve
8.3 short names (RUNNER~1 → runneradmin). Fixes isInheritedRepo path
comparison failures on Windows CI.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:08:58 -06:00
Tom Boucher
09f3a5f970 fix(doctor): gate roadmap checkbox on summary existing on disk, not issue detection (#1915)
The roadmap-done condition checked whether the missing-summary issue was
detected in the issues array, but at fixLevel="task" the summary is
detected and never fixed (deferred via COMPLETION_TRANSITION_CODES).
This caused the roadmap checkbox to be marked without the summary on
disk, making deriveState() skip the summarizing phase and hard-stop at
validating-milestone.

Replace the issues.some() fallback with an existsSync re-check so the
roadmap is only marked when the summary actually exists — either
pre-existing or created earlier in the same doctor run.

Fixes #1910

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:06:53 -06:00
Tom Boucher
53d7350e0d fix: warn when milestone merge contains only metadata and no code (#1906) (#1927)
mergeMilestoneToMain now detects when the squash-merge commit contains
only .gsd/ metadata files and no actual code changes. The worktree
resolver surfaces a clear warning so users know the milestone summary
may describe planned work that was never implemented.

The complete-milestone prompt now requires the LLM to verify code
changes exist on the branch before declaring verification passed.

Fixes #1906

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:05:56 -06:00
TÂCHES
79e49aa413 fix(worktree): resolve 8.3 short paths and use shell mode for .bat hooks on Windows (#1956)
Resolve Windows 8.3 short paths (RUNNER~1 → runneradmin) via realpathSync.native()
and use shell mode for .bat/.cmd files in worktree post-create hooks. Fixes
pre-existing windows-portability CI failure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 20:52:30 -06:00
TÂCHES
60885610ac feat(gsd): unified rule registry, event journal, journal query tool, and tool naming convention (#1928)
Unify dispatch rules and hooks into a flat rule registry, add structured event journal with causal tracing, expose journal query as an LLM tool, and adopt gsd_concept_action tool naming.

- RuleRegistry class absorbs dispatch rules + hooks into UnifiedRule objects with common when/where/then shape
- post-unit-hooks.ts refactored from 524 lines → 90-line thin facade delegating to the registry
- Event journal emits structured JSONL events with per-iteration flowId grouping and causedBy chains
- gsd_journal_query LLM-callable tool for AI self-debugging of autonomous runs
- 4 DB tools renamed to gsd_concept_action pattern with backward-compatible aliases
- 164 new tests, zero regressions

Closes #1763, closes #1764, closes #1766

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 18:47:41 -06:00
Jeremy McSpadden
c1a35dd1b3 feat: ADR attribution — distinguish human vs agent vs collaborative decisions (#1830)
* feat: add made_by attribution field to decisions (human/agent/collaborative)

Add a 'made_by' field to the Decision type that tracks whether a
decision was made by the human, the agent, or collaboratively. This
enables ADR-style accountability — you can always tell who actually
made each call.

Schema:
- New DecisionMadeBy type: 'human' | 'agent' | 'collaborative'
- DB schema v3 → v4: ALTER TABLE decisions ADD COLUMN made_by
- Existing decisions default to 'agent' (backward compatible)
- DECISIONS.md gains a 'Made By' column
- Parser handles old 7-column format gracefully (defaults to 'agent')

Surfaces updated:
- gsd_save_decision tool accepts optional made_by parameter
- Markdown generator/parser round-trips the new column
- Prompt formatter shows attribution in LLM context
- Compact formatter includes made_by in pipe-separated output
- Worktree reconciliation includes made_by in conflict detection + merge

Tests: 476 assertions across 9 test suites, all passing.

* fix(gsd-db): resolve CI failures and address review findings

- Update memory-store.test.ts to expect schema version 4
- Recreate active_decisions view in v4 migration to pick up new made_by column
- Handle missing made_by column in older worktrees during reconciliation
- Optimize VALID_MADE_BY Set by moving it outside the parser loop

* fix(types): resolve missing made_by property errors in context-store and tests
2026-03-21 15:26:28 -06:00