gsdd-cli 0.16.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +109 -60
  2. package/agents/README.md +1 -1
  3. package/bin/adapters/claude.mjs +8 -1
  4. package/bin/adapters/codex.mjs +5 -1
  5. package/bin/adapters/opencode.mjs +7 -1
  6. package/bin/gsdd.mjs +6 -4
  7. package/bin/lib/evidence-contract.mjs +112 -0
  8. package/bin/lib/health-truth.mjs +29 -31
  9. package/bin/lib/health.mjs +32 -80
  10. package/bin/lib/init-runtime.mjs +44 -24
  11. package/bin/lib/init.mjs +3 -7
  12. package/bin/lib/lifecycle-preflight.mjs +333 -0
  13. package/bin/lib/lifecycle-state.mjs +293 -0
  14. package/bin/lib/phase.mjs +81 -26
  15. package/bin/lib/provenance.mjs +20 -1
  16. package/bin/lib/rendering.mjs +8 -0
  17. package/bin/lib/runtime-freshness.mjs +239 -0
  18. package/bin/lib/session-fingerprint.mjs +106 -0
  19. package/distilled/DESIGN.md +398 -12
  20. package/distilled/EVIDENCE-INDEX.md +105 -0
  21. package/distilled/README.md +44 -28
  22. package/distilled/SKILL.md +4 -4
  23. package/distilled/templates/agents.block.md +1 -1
  24. package/distilled/workflows/audit-milestone.md +50 -0
  25. package/distilled/workflows/complete-milestone.md +38 -2
  26. package/distilled/workflows/execute.md +13 -0
  27. package/distilled/workflows/map-codebase.md +14 -3
  28. package/distilled/workflows/new-milestone.md +13 -0
  29. package/distilled/workflows/new-project.md +3 -1
  30. package/distilled/workflows/plan.md +3 -1
  31. package/distilled/workflows/progress.md +68 -13
  32. package/distilled/workflows/quick.md +15 -8
  33. package/distilled/workflows/resume.md +14 -1
  34. package/distilled/workflows/verify.md +52 -17
  35. package/docs/BROWNFIELD-PROOF.md +95 -0
  36. package/docs/RUNTIME-SUPPORT.md +77 -0
  37. package/docs/USER-GUIDE.md +439 -0
  38. package/docs/VERIFICATION-DISCIPLINE.md +59 -0
  39. package/docs/claude/context-monitor.md +98 -0
  40. package/docs/proof/consumer-node-cli/README.md +37 -0
  41. package/docs/proof/consumer-node-cli/ROADMAP.md +14 -0
  42. package/docs/proof/consumer-node-cli/SPEC.md +17 -0
  43. package/docs/proof/consumer-node-cli/brief.md +9 -0
  44. package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-PLAN.md +34 -0
  45. package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-SUMMARY.md +10 -0
  46. package/docs/proof/consumer-node-cli/phases/01-foundation/01-VERIFICATION.md +30 -0
  47. package/package.json +34 -27
package/README.md CHANGED
@@ -1,10 +1,8 @@
1
1
  <div align="center">
2
2
 
3
- # Northline
3
+ # Workspine
4
4
 
5
- **A repo-native workflow kernel for long-horizon AI software delivery.**
6
-
7
- Northline gives long-horizon AI-assisted software work one repo-native planning, execution, verification, and handoff spine so progress survives runtime switching and session loss. The package and CLI remain `gsdd-cli` / `gsdd`.
5
+ **AI development that stays consistent across agents and sessions.** Plans are checked, work is verified, and progress is tracked in the repo.
8
6
 
9
7
  [![npm version](https://img.shields.io/npm/v/gsdd-cli?style=for-the-badge&logo=npm&logoColor=white&color=CB3837)](https://www.npmjs.com/package/gsdd-cli)
10
8
  [![License](https://img.shields.io/badge/license-MIT-blue?style=for-the-badge)](LICENSE)
@@ -13,32 +11,74 @@ Northline gives long-horizon AI-assisted software work one repo-native planning,
13
11
  npx gsdd-cli init
14
12
  ```
15
13
 
16
- **Directly validated today:** Claude Code, Codex CLI, and OpenCode.
17
- **Qualified support:** Cursor, Copilot, and Gemini CLI use the same portable skill surfaces, but this launch does not present them as parity-validated runtimes.
14
+ **Directly validated today:** Claude Code, Codex CLI, and OpenCode.
15
+ **Qualified support:** Cursor, Copilot, and Gemini CLI support the same core workflow through the shared `.agents/skills/` surface; this release does not claim the same runtime proof or ergonomics.
18
16
 
19
17
  </div>
20
18
 
19
+ One repo-native spine for planning, checking, execution, verification, and handoff — so AI-assisted work survives cold starts, runtime switches, and session loss.
20
+
21
21
  ---
22
22
 
23
23
  ## What This Is
24
24
 
25
- Northline gives serious AI-assisted software work one repo-native planning, execution, verification, and handoff spine so progress survives long horizons, runtime switching, and session loss without turning into a dashboard or orchestration control plane.
25
+ Workspine is a repo-native delivery spine for long-horizon AI-assisted software work. It keeps planning, execution, verification, handoff, and progress state in the repo so work survives cold starts, runtime switches, and session loss.
26
+
27
+ Workspine is the product name. The package, CLI commands, workflow prefixes, and workspace directory remain `gsdd-cli`, `gsdd`, `gsdd-*`, and `.planning/` — these are retained technical contracts, not rename residue.
28
+
29
+ ### Lineage
30
+
31
+ Workspine began as a fork of [Get Shit Done](https://github.com/gsd-build/get-shit-done), whose long-horizon delivery spine proved the problem was real. Since the fork, upstream GSD has continued evolving into a broad multi-runtime framework — as of April 2026, GSD v1 documents 81 commands and 78 workflows across 33 agents. Workspine took a different path: 14 public workflow surfaces, generated runtime adapters from a portable core, evidence-gated closure, and provenance-aware continuity. The trade-off is deliberate: a narrower surface with stricter closure and fewer moving parts for the human operator.
32
+
33
+ ---
34
+
35
+ ## What's Different
36
+
37
+ ### Context survives cold starts, tool switches, and session loss
38
+
39
+ Planning, phase artifacts, verification reports, and handoff checkpoints live in `.planning/`. When you switch runtimes or come back after a week, the repo still knows what was planned, what was executed, what was verified, and where you stopped.
40
+
41
+ <details>
42
+ <summary>How it works</summary>
43
+
44
+ Three-layer continuity model: durable project truth (SPEC, ROADMAP, design decisions), live workflow state (phase plans, summaries, checkpoints), and compressed judgment (active constraints, anti-regression rules). Pause/resume workflows write and read these layers explicitly. No session memory required.
45
+
46
+ </details>
47
+
48
+ ### Done means verified, not merely generated
49
+
50
+ Verification is a separate workflow with a separate context window, not a checkbox at the end of execution. It checks three levels — do the files exist, is the code substantive (not stubs), and is it actually wired into the system — plus an anti-pattern scan.
51
+
52
+ <details>
53
+ <summary>How it works</summary>
54
+
55
+ `gsdd-verify` runs after execution and produces a typed verification report. `gsdd-audit-milestone` checks cross-phase integration, requirement coverage, and end-to-end flows. Evidence-gated closure prevents marking work done without the right evidence kinds (code, test, runtime, delivery, human).
26
56
 
27
- The current package and CLI stay `gsdd-cli` and `gsdd`. Northline is the public product brand layered on top of that stable install surface.
57
+ </details>
28
58
 
29
- It preserves the high-leverage parts of long-horizon AI-assisted development:
59
+ ### Rules that must be consistent are enforced by code, not by memory
30
60
 
31
- - **Persistent artifacts** SPEC.md, ROADMAP.md, and config.json as the durable workspace
32
- - **Codebase mapping** — 4 parallel mappers produce STACK, ARCHITECTURE, CONVENTIONS, CONCERNS
33
- - **Scoped planning** — research, backward planning, fresh-context adversarial plan checking
34
- - **Execution** — wave-based parallel execution with fresh context per plan
35
- - **Verification** — Exists/Substantive/Wired gate, anti-pattern scan
36
- - **Milestone audit** — cross-phase integration, requirements coverage, E2E flows
37
- - **Session management** — pause work with checkpoint, resume with context restoration and routing
61
+ 1,381 tests across 13 test files guard properties that PRs repeatedly broke: delegate-role reference integrity, workflow vendor-API cleanliness, artifact schema consistency, plan-checker dimension coverage, and cross-document drift.
38
62
 
39
- What it strips: GSD's broader operator surface (32 workflows, 11 agents, discovery modes, sprint ceremony, a settings flow, and additional operator ergonomics). Northline keeps 14 workflows and 10 roles.
63
+ <details>
64
+ <summary>How it works</summary>
40
65
 
41
- **Target user:** Developer or small team that wants a repo-native, spec-driven workflow kernel with durable proof and handoff, not a dashboard or orchestration control plane.
66
+ Invariant suites (I-series), guard suites (G-series), and scenario suites (S-series) run on every change. Each assertion includes a `FIX:` instruction so failures are actionable. 52 documented design decisions in `distilled/DESIGN.md` record the rationale with evidence trails.
67
+
68
+ </details>
69
+
70
+ ### Smaller surface, stricter closure
71
+
72
+ 14 workflows. 10 roles. One CLI. Lifecycle progression goes through deterministic preflight gates — not conversational inference. Plans are checked by a separate agent in a separate context before execution begins. Closure requires evidence, not just file existence.
73
+
74
+ <details>
75
+ <summary>How it works</summary>
76
+
77
+ `gsdd-plan` is terminal: it writes planning artifacts and stops. Execution requires an explicit `gsdd-execute` transition. `lifecycle-preflight` evaluates eligibility from repo artifacts before allowing state changes. `phase-status` is the only explicit ROADMAP mutator. `progress` is read-only.
78
+
79
+ </details>
80
+
81
+ **Target user:** Developer or small team that wants one durable delivery spine across coding runtimes, with explicit checks and repo-native proof instead of a dashboard or orchestration control plane.
42
82
 
43
83
  ---
44
84
 
@@ -63,27 +103,44 @@ In a terminal, `gsdd init` now opens a guided install wizard:
63
103
  - Step 3: configure planning defaults in the same guided flow
64
104
 
65
105
  Portable `.agents/skills/gsdd-*` skills are always generated. The wizard controls extra native adapters and optional governance, not the portable baseline.
106
+ When those generated surfaces exist locally, `gsdd health` checks them against current render output instead of asking you to trust manual review.
66
107
 
67
108
  ### Launch Proof Status
68
109
 
69
- - **Directly validated in this repo:** Claude Code, Codex CLI, and OpenCode have recorded `plan -> execute -> verify` evidence for the core lifecycle.
70
- - **Qualified support:** Cursor, Copilot, and Gemini CLI use the shared `.agents/skills/` surface plus optional governance, but this launch does not describe them as equally proven native runtimes.
110
+ - **Directly validated:** Claude Code, Codex CLI, and OpenCode have recorded `plan -> execute -> verify` evidence for the core lifecycle.
111
+ - **Qualified support:** Cursor, Copilot, and Gemini CLI support the same core workflow through the shared `.agents/skills/` surface; this release does not claim the same runtime proof or ergonomics.
112
+ - **Runtime-surface freshness:** Installed generated skills and native adapters are renderer-checked locally; repair stays deterministic through `npx gsdd-cli update`.
71
113
 
72
- ### Quickstart (after init)
114
+ Start with the public proof pack:
73
115
 
74
- Your tool determines how you invoke workflows:
116
+ - [Brownfield proof](docs/BROWNFIELD-PROOF.md)
117
+ - [Exported consumer proof pack](docs/proof/consumer-node-cli/README.md)
118
+ - [Runtime support matrix](docs/RUNTIME-SUPPORT.md)
119
+ - [Verification discipline](docs/VERIFICATION-DISCIPLINE.md)
120
+
121
+ ### Quickstart (after init)
122
+
123
+ Runtime floor: Node 20+.
124
+
125
+ Your tool determines how you invoke workflows:
75
126
 
76
127
  - **Claude Code / OpenCode / Cursor / Copilot / Gemini:** Use slash commands directly — `/gsdd-new-project`, `/gsdd-plan`, etc.
77
- - **Codex CLI:** Use skill references — `$gsdd-new-project`, `$gsdd-plan`, etc.
128
+ - **Codex CLI:** Use skill references — `$gsdd-new-project`, `$gsdd-plan`, etc. `$gsdd-plan` writes the plan and stops; start a separate `$gsdd-execute` run when you want implementation to begin.
78
129
  - **Other AI tools:** Open `.agents/skills/gsdd-<workflow>/SKILL.md` and follow the instructions.
79
130
 
80
- If you generate the root `AGENTS.md` block, it adds GSDD behavioral governance. For Cursor, Copilot, and Gemini, that governance is optional discipline on top of native skill discovery — not the mechanism that makes workflows discoverable.
131
+ If you generate the root `AGENTS.md` block, it adds the framework's behavioral governance. For Cursor, Copilot, and Gemini, that governance is optional discipline on top of native skill discovery — not the mechanism that makes workflows discoverable.
132
+
133
+ ### Choose Your Starting Workflow
81
134
 
82
- First workflow to run: **new-project** it asks about your goals, audits the codebase (if brownfield), and produces `.planning/SPEC.md` + `.planning/ROADMAP.md`.
135
+ | Situation | Start here | Why |
136
+ |----------|------------|-----|
137
+ | Greenfield project, or brownfield work that is fuzzy / broad / milestone-shaped | `gsdd-new-project` | This is the full initializer. On brownfield repos it will run codebase mapping internally when it needs it. |
138
+ | Brownfield repo and the bounded change is already concrete | `gsdd-quick` | This is the bounded-change lane. It can use existing codebase maps when present and otherwise builds a just-enough inline brownfield baseline. |
139
+ | Brownfield repo is unfamiliar, risky, or you want a deeper baseline before choosing the lane | `gsdd-map-codebase` | This is the deeper orientation pass. Use it when the inline quick baseline would be too weak, then continue with `gsdd-quick` or `gsdd-new-project`. |
83
140
 
84
141
  ### Platform Adapters
85
142
 
86
- GSDD generates adapters for whichever tools you use:
143
+ Workspine generates adapters for whichever tools you use:
87
144
 
88
145
  ```bash
89
146
  npx gsdd-cli init # Guided install wizard (detected runtimes preselected)
@@ -98,10 +155,10 @@ npx gsdd-cli init --tools all # All of the above
98
155
  | Platform | Public claim | What's generated |
99
156
  |----------|--------------|-----------------|
100
157
  | **All** (default) | Shared portable surface | `.agents/skills/gsdd-*/SKILL.md` — portable workflow entrypoints (always generated) |
101
- | **Claude Code** | Directly validated | `.claude/skills/`, `.claude/commands/`, `.claude/agents/` — native workflow surfaces |
102
- | **OpenCode** | Directly validated | `.opencode/commands/`, `.opencode/agents/` — native workflow surfaces |
103
- | **Codex CLI** | Directly validated | Portable skill entry plus `.codex/agents/gsdd-plan-checker.toml` |
104
- | **Cursor / Copilot / Gemini** | Qualified support | Skills-native discovery from `.agents/skills/`; optional root `AGENTS.md` block adds behavioral governance |
158
+ | **Claude Code** | Directly validated | `.claude/skills/`, `.claude/commands/`, `.claude/agents/` — native workflow surfaces, freshness-checked when generated locally |
159
+ | **OpenCode** | Directly validated | `.opencode/commands/`, `.opencode/agents/` — native workflow surfaces, freshness-checked when generated locally |
160
+ | **Codex CLI** | Directly validated | Portable skill entry plus `.codex/agents/gsdd-plan-checker.toml`; planning stays locked until explicit `$gsdd-execute`, and installed surfaces are freshness-checked locally |
161
+ | **Cursor / Copilot / Gemini** | Same core workflow | Skills-native discovery from `.agents/skills/`; optional root `AGENTS.md` block adds behavioral governance, and the generated skill surface is freshness-checked locally |
105
162
  | **Other AI tools** | Fallback only | Open `.agents/skills/gsdd-*/SKILL.md` directly |
106
163
 
107
164
  ### Updating
@@ -112,7 +169,7 @@ npx gsdd-cli update --tools claude # Update specific platform only
112
169
  npx gsdd-cli update --templates # Refresh .planning/templates/ and role contracts from framework source
113
170
  ```
114
171
 
115
- ### Headless Mode (CI / Automation)
172
+ ### Non-Interactive Mode (CI / Automation)
116
173
 
117
174
  For non-interactive environments:
118
175
 
@@ -121,7 +178,7 @@ npx gsdd-cli init --auto --tools claude
121
178
  npx gsdd-cli init --auto --tools claude --brief path/to/PRD.md
122
179
  ```
123
180
 
124
- `--auto` skips interactive prompts, uses smart defaults (`autoAdvance: true` in config). `--brief` copies a project document to `.planning/PROJECT_BRIEF.md` for `new-project` to consume.
181
+ `--auto` skips the interactive install wizard and uses default configuration. It does **not** run downstream workflows (`new-project`, `plan`, `execute`, `verify`) — those are always explicit. `--brief` copies a project document to `.planning/PROJECT_BRIEF.md` for `new-project` to consume.
125
182
 
126
183
  If you already know exactly what to generate, `--tools ...` remains the manual path. The wizard is the primary onboarding UX; flags remain the advanced/headless contract.
127
184
 
@@ -151,7 +208,7 @@ init → [plan → execute → verify] × N phases → audit-milestone → done
151
208
  Run the `gsdd-new-project` workflow. The system:
152
209
 
153
210
  1. **Questions** — asks until it understands your idea (goals, constraints, tech, edge cases)
154
- 2. **Codebase audit** — if brownfield, runs 4 parallel mappers (or prompts for `/gsdd-map-codebase` first)
211
+ 2. **Codebase map** — if brownfield and a deeper baseline is needed, maps the codebase across stack, architecture, conventions, and concerns; users do not need to pre-run `map-codebase` before `new-project`
155
212
  3. **Research** — spawns parallel researchers to investigate the domain (configurable depth: fast/balanced/deep)
156
213
  4. **Spec + Roadmap** — produces `SPEC.md` (living specification) and `ROADMAP.md` (phased delivery plan)
157
214
 
@@ -167,7 +224,9 @@ Run `gsdd-plan` for the current phase. The system:
167
224
  2. **Plans** — creates atomic task plans with XML structure
168
225
  3. **Checks** — a separate agent in a fresh context window reviews the plan against 7 dimensions (requirement coverage, task completeness, dependency correctness, key-link completeness, scope sanity, must-have quality, context compliance). If the plan fails, it revises and re-checks — up to 3 cycles before escalating to the human. Output is typed JSON so orchestration is machine-parseable, not prompt-dependent.
169
226
 
170
- Each plan is small enough to execute in a fresh context window. The checker runs in a separate context from the planner — this is the [ICLR-validated](https://arxiv.org/abs/2310.12397) pattern for catching blind spots the planner inherits from its own reasoning.
227
+ Each plan is small enough to execute in a fresh context window. The checker runs in a separate context from the planner — this is the [ICLR-validated](https://arxiv.org/abs/2310.01798) pattern for catching blind spots the planner inherits from its own reasoning.
228
+
229
+ `gsdd-plan` is terminal for the current run: it writes planning artifacts only. Execution begins only after an explicit `gsdd-execute` / `/gsdd-execute` / `$gsdd-execute` transition, depending on the runtime.
171
230
 
172
231
  **Creates:** Phase plans in `.planning/phases/`
173
232
 
@@ -234,12 +293,12 @@ Use for: bug fixes, small features, config changes, one-off tasks.
234
293
 
235
294
  ## Workflows
236
295
 
237
- GSDD has 14 workflows, run via generated skills or adapters:
296
+ Workspine has 14 workflows, run via generated skills or adapters:
238
297
 
239
298
  | Workflow | What it does |
240
299
  |----------|--------------|
241
- | `gsdd-new-project` | Full initialization: questioning, codebase audit, research, spec, roadmap |
242
- | `gsdd-map-codebase` | Map existing codebase with 4 parallel mappers |
300
+ | `gsdd-new-project` | Full initialization: questioning, brownfield audit when needed, research, spec, roadmap |
301
+ | `gsdd-map-codebase` | Deeper brownfield orientation and refresh before `quick` or `new-project` |
243
302
  | `gsdd-plan` | Research + plan + check for a phase |
244
303
  | `gsdd-execute` | Execute phase plan: implement tasks, verify changes |
245
304
  | `gsdd-verify` | Verify completed phase: 3-level checks, anti-pattern scan |
@@ -248,7 +307,7 @@ GSDD has 14 workflows, run via generated skills or adapters:
248
307
  | `gsdd-complete-milestone` | Archive shipped milestone, evolve spec, collapse roadmap |
249
308
  | `gsdd-new-milestone` | Start next milestone: gather goals, define requirements, create roadmap phases |
250
309
  | `gsdd-plan-milestone-gaps` | Create gap-closure phases from audit results |
251
- | `gsdd-quick` | Quick task: plan and execute sub-hour work outside the phase cycle |
310
+ | `gsdd-quick` | Quick task: bounded brownfield change lane with inline baseline when full mapping is unnecessary |
252
311
  | `gsdd-pause` | Pause work: save session context to checkpoint for seamless resumption |
253
312
  | `gsdd-resume` | Resume work: restore context from artifacts and route to next action |
254
313
  | `gsdd-progress` | Show project status and route to next action |
@@ -284,7 +343,7 @@ Workflows are agent skills or commands, not plain shell utilities. How you invok
284
343
 
285
344
  ### Roles (10 canonical)
286
345
 
287
- GSDD consolidates GSD's agent surface into 10 roles with durable contracts:
346
+ Workspine consolidates GSD's agent surface into 10 roles with durable contracts:
288
347
 
289
348
  | Role | Responsibility |
290
349
  |------|---------------|
@@ -296,6 +355,7 @@ GSDD consolidates GSD's agent surface into 10 roles with durable contracts:
296
355
  | **Verifier** | Phase verification — Exists/Substantive/Wired gate |
297
356
  | **Roadmapper** | Roadmap generation from spec |
298
357
  | **Integration Checker** | Cross-phase wiring, API coverage, auth protection, E2E flows |
358
+ | **Approach Explorer** | Implementation approach alignment before planning begins |
299
359
  | **Debugger** | Utility role for systematic debugging |
300
360
 
301
361
  ### Two-Layer Architecture
@@ -307,14 +367,14 @@ GSDD consolidates GSD's agent surface into 10 roles with durable contracts:
307
367
 
308
368
  ### Adapter Architecture
309
369
 
310
- GSDD generates vendor-specific files from vendor-agnostic markdown — it does not convert from one vendor format to another. This means every adapter gets first-class output shaped to its platform's native capabilities.
370
+ Workspine generates vendor-specific files from vendor-agnostic markdown — it does not convert from one vendor format to another. This means every adapter gets first-class output shaped to its platform's native capabilities.
311
371
 
312
372
  | Adapter | Evidence posture | Strategy |
313
373
  |---------|------------------|----------|
314
374
  | **Claude Code** | Directly validated | Skill-primary plan surface, thin command alias, native `gsdd-plan-checker` agent |
315
375
  | **OpenCode** | Directly validated | Specialized `/gsdd-plan` command (`subtask: false`), hidden `gsdd-plan-checker` subagent (`mode: subagent`) |
316
- | **Codex CLI** | Directly validated | Portable skill as entry surface, `.codex/agents/gsdd-plan-checker.toml` (read-only, high reasoning effort) |
317
- | **Cursor / Copilot / Gemini** | Qualified support | Runtime discovers `.agents/skills/` natively; optional root `AGENTS.md` block adds behavioral governance only |
376
+ | **Codex CLI** | Directly validated | Portable skill as entry surface, `.codex/agents/gsdd-plan-checker.toml` (read-only, high reasoning effort), explicit `$gsdd-execute` unlock |
377
+ | **Cursor / Copilot / Gemini** | Same core workflow | Runtime discovers `.agents/skills/` natively; optional root `AGENTS.md` block adds behavioral governance only |
318
378
  | **agents** (`--tools agents`) | Governance-only helper | Root `AGENTS.md` block for tools that benefit from governance or need open-standard fallback guidance |
319
379
 
320
380
  All adapters render the plan-checker from a single source (`distilled/templates/delegates/plan-checker.md`). Each adapter shapes the output to its platform's native mechanics, and the portable skill remains the shared workflow source.
@@ -338,7 +398,7 @@ Model IDs pass through a two-layer injection guard: a regex whitelist (`/^[a-zA-
338
398
 
339
399
  ### Advisory Git Protocol
340
400
 
341
- GSDD does not impose commit formats, branch naming, or one-commit-per-task rules. Git guidance is advisory — repository and team conventions take precedence:
401
+ Workspine does not impose commit formats, branch naming, or one-commit-per-task rules. Git guidance is advisory — repository and team conventions take precedence:
342
402
 
343
403
  - **Branching** — follow existing repo conventions
344
404
  - **Commits** — group changes logically, no framework-imposed format
@@ -390,8 +450,8 @@ Optional model-control keys:
390
450
 
391
451
  Runtime behavior:
392
452
  - Claude translates semantic tiers to native aliases for the checker agent.
393
- - OpenCode inherits its runtime model by default; GSDD only injects an exact OpenCode `model:` when you set an explicit runtime override.
394
- - Codex inherits its session model by default; GSDD only injects an explicit `model` in the TOML when you set an explicit runtime override.
453
+ - OpenCode inherits its runtime model by default; Workspine only injects an exact OpenCode `model:` when you set an explicit runtime override.
454
+ - Codex inherits its session model by default; Workspine only injects an explicit `model` in the TOML when you set an explicit runtime override.
395
455
 
396
456
  CLI:
397
457
  - `gsdd models show`
@@ -430,6 +490,7 @@ Advisory defaults, overridden by repo conventions:
430
490
  | Problem | What to do |
431
491
  |---------|------------|
432
492
  | Workspace feels broken | `gsdd health` — checks errors, warnings, info |
493
+ | `gsdd health` reports generated runtime-surface drift | `npx gsdd-cli update` (or `npx gsdd-cli update --tools <runtime>`) — regenerates installed skills/adapters from current render output |
433
494
  | Lost track of progress | Run `gsdd-progress` — reads artifacts, shows status |
434
495
  | Need context from last session | Run `gsdd-resume` — restores state, routes to next action |
435
496
  | Plans seem wrong | Check `workflow.research: true` in config |
@@ -443,7 +504,7 @@ For detailed troubleshooting and recovery procedures, see the [User Guide](docs/
443
504
 
444
505
  ## Design Decisions
445
506
 
446
- GSDD makes 39 documented design decisions relative to GSD, each with evidence from source files and external research. See [`distilled/DESIGN.md`](distilled/DESIGN.md) for the full rationale.
507
+ This repo records 52 documented design decisions relative to GSD, each with evidence from source files and external research. See [`distilled/DESIGN.md`](distilled/DESIGN.md) for the full rationale.
447
508
 
448
509
  Key choices:
449
510
  - **4-file codebase standard** — drop state that rots (STRUCTURE, INTEGRATIONS, TESTING), keep rules that don't
@@ -461,7 +522,7 @@ Key choices:
461
522
 
462
523
  ## Testing
463
524
 
464
- GSDD has 1228 structural assertions across 10 test files — named suites that guard properties PRs repeatedly fixed manually. These are not unit tests for application code; they are invariant checks on the specification itself.
525
+ The framework has 1,381 tests across 13 test files — named suites that guard properties PRs repeatedly fixed manually. These are not unit tests for application code; they are invariant checks on the specification itself.
465
526
 
466
527
  ### Invariant Suites (I-series)
467
528
 
@@ -538,21 +599,9 @@ npm test
538
599
 
539
600
  ---
540
601
 
541
- ## Relationship to GSD
542
-
543
- GSDD is a distilled fork of [Get Shit Done](https://github.com/gsd-build/get-shit-done). It is **not** a full replacement for current upstream GSD.
544
-
545
- **What GSDD preserves** (~76% of core method): the long-horizon delivery spine — persistent artifacts, codebase mapping, scoped planning, execution, verification, and milestone auditing.
546
-
547
- **What GSDD does not cover** (~44% of full upstream surface): GSD currently exposes 32 workflow files and 11 agent files including discovery modes, a settings flow, extra operator ergonomics, and broader session-management surface area. GSDD intentionally does not recreate this full surface.
548
-
549
- **The trade-off:** Fewer moving parts for the human operator. Cleaner role contracts and a simpler artifact model. But reduced operator comfort and limited control-plane features (no telemetry, no artifact linting). Health diagnostics are available via `gsdd health`.
550
-
551
- ---
552
-
553
602
  ## Credits
554
603
 
555
- GSDD is a distilled fork of [Get Shit Done](https://github.com/gsd-build/get-shit-done) by [Lex Christopherson](https://github.com/glittercowboy), licensed under MIT.
604
+ Workspine is a fork of [Get Shit Done](https://github.com/gsd-build/get-shit-done) by [Lex Christopherson](https://github.com/glittercowboy), licensed under MIT. Original git history is retained for attribution.
556
605
 
557
606
  ---
558
607
 
package/agents/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Canonical Role Library
2
2
 
3
- Vendor-agnostic role contracts for GSDD's agent architecture.
3
+ Vendor-agnostic role contracts for Workspine's agent architecture.
4
4
 
5
5
  ## Two-Layer Architecture
6
6
 
@@ -181,4 +181,11 @@ function createClaudeAdapter({ cwd, workflows, renderSkillContent, getDelegateCo
181
181
  };
182
182
  }
183
183
 
184
- export { createClaudeAdapter, CLAUDE_MODEL_PROFILES };
184
+ export {
185
+ createClaudeAdapter,
186
+ CLAUDE_MODEL_PROFILES,
187
+ renderClaudeApproachExplorer,
188
+ renderClaudePlanChecker,
189
+ renderClaudePlanCommand,
190
+ renderClaudePlanSkill,
191
+ };
@@ -78,4 +78,8 @@ function createCodexAdapter({
78
78
  };
79
79
  }
80
80
 
81
- export { createCodexAdapter };
81
+ export {
82
+ createCodexAdapter,
83
+ renderCodexApproachExplorer,
84
+ renderCodexPlanChecker,
85
+ };
@@ -269,4 +269,10 @@ function createOpenCodeAdapter({
269
269
  };
270
270
  }
271
271
 
272
- export { createOpenCodeAdapter, detectOpenCodeConfiguredModel };
272
+ export {
273
+ createOpenCodeAdapter,
274
+ detectOpenCodeConfiguredModel,
275
+ renderOpenCodeApproachExplorer,
276
+ renderOpenCodePlanChecker,
277
+ renderOpenCodePlanCommand,
278
+ };
package/bin/gsdd.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // gsdd - GSD Distilled CLI
3
+ // gsdd - Workspine CLI
4
4
 
5
5
  import { realpathSync } from 'fs';
6
6
  import { join, dirname } from 'path';
@@ -19,6 +19,7 @@ import { createCmdInit, createCmdUpdate, cmdHelp } from './lib/init.mjs';
19
19
  import { cmdFindPhase, cmdVerify, cmdScaffold, cmdPhaseStatus } from './lib/phase.mjs';
20
20
  import { cmdFileOp } from './lib/file-ops.mjs';
21
21
  import { createCmdHealth } from './lib/health.mjs';
22
+ import { cmdLifecyclePreflight } from './lib/lifecycle-preflight.mjs';
22
23
 
23
24
  const __filename = fileURLToPath(import.meta.url);
24
25
  const __dirname = dirname(__filename);
@@ -57,7 +58,7 @@ const WORKFLOWS = [
57
58
  defineWorkflow({ name: 'gsdd-progress', workflow: 'progress.md', description: 'Check progress - show project status and route to next action', mutatesArtifacts: false }),
58
59
  ];
59
60
 
60
- const FRAMEWORK_VERSION = 'v1.3';
61
+ const FRAMEWORK_VERSION = 'v1.4';
61
62
 
62
63
  function createCliContext(cwd = process.cwd()) {
63
64
  return {
@@ -87,7 +88,7 @@ const INIT_CONTEXT = createCliContext(CWD);
87
88
 
88
89
  const cmdInit = createCmdInit(INIT_CONTEXT);
89
90
  const cmdUpdate = createCmdUpdate(INIT_CONTEXT);
90
- const cmdHealth = createCmdHealth({ frameworkVersion: FRAMEWORK_VERSION });
91
+ const cmdHealth = createCmdHealth(INIT_CONTEXT);
91
92
 
92
93
  const COMMANDS = {
93
94
  init: cmdInit,
@@ -95,6 +96,7 @@ const COMMANDS = {
95
96
  models: cmdModels,
96
97
  health: cmdHealth,
97
98
  'file-op': cmdFileOp,
99
+ 'lifecycle-preflight': cmdLifecyclePreflight,
98
100
  'find-phase': cmdFindPhase,
99
101
  'phase-status': cmdPhaseStatus,
100
102
  verify: cmdVerify,
@@ -124,4 +126,4 @@ if (IS_MAIN) {
124
126
  await runCli();
125
127
  }
126
128
 
127
- export { cmdHelp, cmdInit, cmdUpdate, cmdModels, cmdHealth, cmdFileOp, cmdFindPhase, cmdPhaseStatus, cmdVerify, cmdScaffold, runCli, FRAMEWORK_VERSION, createCliContext };
129
+ export { cmdHelp, cmdInit, cmdUpdate, cmdModels, cmdHealth, cmdFileOp, cmdLifecyclePreflight, cmdFindPhase, cmdPhaseStatus, cmdVerify, cmdScaffold, runCli, FRAMEWORK_VERSION, createCliContext };
@@ -0,0 +1,112 @@
1
+ const EVIDENCE_KINDS = Object.freeze(['code', 'test', 'runtime', 'delivery', 'human']);
2
+ const DELIVERY_POSTURES = Object.freeze(['repo_only', 'delivery_sensitive']);
3
+ const CLOSURE_SURFACES = Object.freeze(['verify', 'audit-milestone', 'complete-milestone']);
4
+
5
+ const LEGACY_EVIDENCE_ALIASES = Object.freeze({
6
+ code: 'code',
7
+ test: 'test',
8
+ runtime: 'runtime',
9
+ delivery: 'delivery',
10
+ human: 'human',
11
+ 'code-evidence': 'code',
12
+ 'repo-test': 'test',
13
+ 'runtime-check': 'runtime',
14
+ 'user-confirmation': 'human',
15
+ });
16
+
17
+ const EVIDENCE_MATRIX = Object.freeze({
18
+ verify: Object.freeze({
19
+ repo_only: Object.freeze({
20
+ requiredKinds: Object.freeze(['code']),
21
+ recommendedKinds: Object.freeze(['test']),
22
+ blockedSoloKinds: Object.freeze(['human', 'delivery']),
23
+ }),
24
+ delivery_sensitive: Object.freeze({
25
+ requiredKinds: Object.freeze(['code', 'runtime']),
26
+ recommendedKinds: Object.freeze(['test', 'delivery', 'human']),
27
+ blockedSoloKinds: Object.freeze(['code', 'human']),
28
+ }),
29
+ }),
30
+ 'audit-milestone': Object.freeze({
31
+ repo_only: Object.freeze({
32
+ requiredKinds: Object.freeze(['code', 'test']),
33
+ recommendedKinds: Object.freeze(['runtime', 'human']),
34
+ blockedSoloKinds: Object.freeze(['human', 'delivery']),
35
+ }),
36
+ delivery_sensitive: Object.freeze({
37
+ requiredKinds: Object.freeze(['code', 'test', 'runtime', 'delivery']),
38
+ recommendedKinds: Object.freeze(['human']),
39
+ blockedSoloKinds: Object.freeze(['code', 'human']),
40
+ }),
41
+ }),
42
+ 'complete-milestone': Object.freeze({
43
+ repo_only: Object.freeze({
44
+ requiredKinds: Object.freeze(['code', 'test']),
45
+ recommendedKinds: Object.freeze(['runtime']),
46
+ blockedSoloKinds: Object.freeze(['human', 'delivery']),
47
+ }),
48
+ delivery_sensitive: Object.freeze({
49
+ requiredKinds: Object.freeze(['code', 'test', 'runtime', 'delivery']),
50
+ recommendedKinds: Object.freeze(['human']),
51
+ blockedSoloKinds: Object.freeze(['code', 'human']),
52
+ }),
53
+ }),
54
+ });
55
+
56
+ export { CLOSURE_SURFACES, DELIVERY_POSTURES, EVIDENCE_KINDS };
57
+
58
+ export function normalizeEvidenceKind(kind) {
59
+ if (!kind) {
60
+ return null;
61
+ }
62
+
63
+ return LEGACY_EVIDENCE_ALIASES[kind] ?? null;
64
+ }
65
+
66
+ export function normalizeEvidenceKinds(kinds = []) {
67
+ const normalized = [];
68
+ for (const kind of kinds) {
69
+ const resolved = normalizeEvidenceKind(kind);
70
+ if (resolved && !normalized.includes(resolved)) {
71
+ normalized.push(resolved);
72
+ }
73
+ }
74
+ return normalized;
75
+ }
76
+
77
+ export function isClosureSurface(surface) {
78
+ return CLOSURE_SURFACES.includes(surface);
79
+ }
80
+
81
+ export function getEvidenceContract(surface, deliveryPosture) {
82
+ const matrix = EVIDENCE_MATRIX[surface];
83
+ if (!matrix) {
84
+ throw new Error(`Unsupported closure evidence surface: ${surface}`);
85
+ }
86
+
87
+ const posture = matrix[deliveryPosture];
88
+ if (!posture) {
89
+ throw new Error(`Unsupported delivery posture for ${surface}: ${deliveryPosture}`);
90
+ }
91
+
92
+ return {
93
+ surface,
94
+ deliveryPosture,
95
+ supportedKinds: [...EVIDENCE_KINDS],
96
+ requiredKinds: [...posture.requiredKinds],
97
+ recommendedKinds: [...posture.recommendedKinds],
98
+ blockedSoloKinds: [...posture.blockedSoloKinds],
99
+ };
100
+ }
101
+
102
+ export function describeEvidenceSurface(surface) {
103
+ if (!isClosureSurface(surface)) {
104
+ return null;
105
+ }
106
+
107
+ return {
108
+ surface,
109
+ supportedKinds: [...EVIDENCE_KINDS],
110
+ deliveryPostures: DELIVERY_POSTURES.map((deliveryPosture) => getEvidenceContract(surface, deliveryPosture)),
111
+ };
112
+ }
@@ -1,9 +1,15 @@
1
1
  import { existsSync, readFileSync, readdirSync } from 'fs';
2
2
  import { join } from 'path';
3
+ import { evaluateLifecycleState } from './lifecycle-state.mjs';
4
+ import {
5
+ getRuntimeFreshnessRepairGuidance,
6
+ summarizeRuntimeFreshnessIssues,
7
+ } from './runtime-freshness.mjs';
8
+ import { checkDrift } from './session-fingerprint.mjs';
3
9
 
4
- export const TRUTH_CHECK_IDS = ['W7', 'W8', 'W9', 'W10'];
10
+ export const TRUTH_CHECK_IDS = ['W7', 'W8', 'W9', 'W10', 'W11', 'W12'];
5
11
 
6
- export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
12
+ export function runTruthChecks(planningDir, frameworkDir, actualCheckIds, options = {}) {
7
13
  const warnings = [];
8
14
  const designPath = join(frameworkDir, 'distilled', 'DESIGN.md');
9
15
  const readmePath = join(frameworkDir, 'distilled', 'README.md');
@@ -11,6 +17,7 @@ export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
11
17
  const gapsPath = join(frameworkDir, '.internal-research', 'gaps.md');
12
18
  const specPath = join(planningDir, 'SPEC.md');
13
19
  const roadmapPath = join(planningDir, 'ROADMAP.md');
20
+ const lifecycle = evaluateLifecycleState({ planningDir });
14
21
 
15
22
  if (existsSync(designPath)) {
16
23
  const documentedIds = extractHealthTableIds(readFileSync(designPath, 'utf-8'));
@@ -69,16 +76,7 @@ export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
69
76
  }
70
77
 
71
78
  if (existsSync(specPath) && existsSync(roadmapPath)) {
72
- const spec = readFileSync(specPath, 'utf-8');
73
- const roadmap = readFileSync(roadmapPath, 'utf-8');
74
- const checkedRequirements = extractCheckedRequirements(spec);
75
- const roadmapRequirements = extractRoadmapRequirements(roadmap);
76
- const mismatches = [];
77
- for (const [requirementId, roadmapStatus] of roadmapRequirements.entries()) {
78
- const specChecked = checkedRequirements.has(requirementId);
79
- if (roadmapStatus && !specChecked) mismatches.push(`${requirementId} phase complete but SPEC unchecked`);
80
- if (!roadmapStatus && specChecked) mismatches.push(`${requirementId} SPEC checked but phase incomplete`);
81
- }
79
+ const mismatches = lifecycle.requirementAlignment.mismatches;
82
80
  if (mismatches.length > 0) {
83
81
  warnings.push({
84
82
  id: 'W10',
@@ -89,6 +87,25 @@ export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
89
87
  }
90
88
  }
91
89
 
90
+ if (options.runtimeFreshnessReport?.issueCount > 0) {
91
+ warnings.push({
92
+ id: 'W11',
93
+ severity: 'WARN',
94
+ message: `Installed generated runtime surfaces drift from current render output (${summarizeRuntimeFreshnessIssues(options.runtimeFreshnessReport)})`,
95
+ fix: getRuntimeFreshnessRepairGuidance(options.runtimeFreshnessReport),
96
+ });
97
+ }
98
+
99
+ const drift = checkDrift(planningDir);
100
+ if (drift.drifted) {
101
+ warnings.push({
102
+ id: 'W12',
103
+ severity: 'WARN',
104
+ message: `Planning state drifted since last recorded session (${drift.details.join('; ')})`,
105
+ fix: 'Review the changes, then run a lifecycle workflow to update the fingerprint',
106
+ });
107
+ }
108
+
92
109
  return warnings;
93
110
  }
94
111
 
@@ -167,22 +184,3 @@ function extractSection(content, startMarker, endMarker) {
167
184
  function normalizeContent(content) {
168
185
  return content.replace(/\r\n/g, '\n');
169
186
  }
170
-
171
- function extractCheckedRequirements(content) {
172
- const checked = new Set();
173
- for (const result of content.matchAll(/- \[x\] \*\*\[([A-Z0-9-]+)]\*\*/g)) {
174
- checked.add(result[1]);
175
- }
176
- return checked;
177
- }
178
-
179
- function extractRoadmapRequirements(content) {
180
- const mapped = new Map();
181
- for (const result of content.matchAll(/- \[([ x-])] \*\*Phase\s+\d+[a-z]?:.*?\*\*\s+—\s+\[([^\]]+)]/g)) {
182
- const requirementIds = result[2].split(',').map((id) => id.trim());
183
- for (const requirementId of requirementIds) {
184
- mapped.set(requirementId, result[1].toLowerCase() === 'x');
185
- }
186
- }
187
- return mapped;
188
- }