gsdd-cli 0.18.0 → 0.18.1

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.
@@ -60,9 +60,15 @@
60
60
  47. [Brownfield Quick-Win Repair](#d47---brownfield-quick-win-repair)
61
61
  48. [Shared Lifecycle Evaluator And Dual-Canonical Runtime Boundary](#d48---shared-lifecycle-evaluator-and-dual-canonical-runtime-boundary)
62
62
  49. [Deterministic Lifecycle Preflight Gates](#d49---deterministic-lifecycle-preflight-gates)
63
- 50. [Evidence-Gated Closure Matrix](#d50---evidence-gated-closure-matrix)
64
- 51. [Deterministic Runtime Surface Freshness](#d51---deterministic-runtime-surface-freshness)
65
- 52. [Generic Checkpoint Routing Ownership](#d52---generic-checkpoint-routing-ownership)
63
+ 50. [Evidence-Gated Closure Matrix](#d50---evidence-gated-closure-matrix)
64
+ 51. [Deterministic Runtime Surface Freshness](#d51---deterministic-runtime-surface-freshness)
65
+ 52. [Generic Checkpoint Routing Ownership](#d52---generic-checkpoint-routing-ownership)
66
+ 53. [Fail-Closed Milestone And Phase Contracts](#d53---fail-closed-milestone-and-phase-contracts)
67
+ 54. [Bounded Brownfield Change Folder Contract](#d54---bounded-brownfield-change-folder-contract)
68
+ 55. [Brownfield Continuity Anchor And Mismatch Split](#d55---brownfield-continuity-anchor-and-mismatch-split)
69
+ 56. [Executable Brownfield Routing And Widen-Only Escalation](#d56---executable-brownfield-routing-and-widen-only-escalation)
70
+ 57. [Bounded Brownfield Growth And Context-Preserving Milestone Handoff](#d57---bounded-brownfield-growth-and-context-preserving-milestone-handoff)
71
+ 58. [Local Workflow Helper Launcher](#d58---local-workflow-helper-launcher)
66
72
 
67
73
  ---
68
74
 
@@ -2316,9 +2322,311 @@ Sub-gap (b) was closed by D28's `<persistence>` mandate and guarded by G30. Sub-
2316
2322
  - `resume` still owns the destructive checkpoint-cleanup step, which keeps cleanup tied to an explicit user choice rather than to a read-only reporter.
2317
2323
  - Future checkpoint lifecycle edits must update the shared provenance helper, the authored workflow contracts, the regenerated skill surfaces, and the regression suites together or the repo truth will drift immediately.
2318
2324
 
2319
- **GSDD implementation:** `bin/lib/provenance.mjs`, `distilled/workflows/resume.md`, `distilled/workflows/progress.md`, `.agents/skills/gsdd-resume/SKILL.md`, `.agents/skills/gsdd-progress/SKILL.md`, `.planning/SPEC.md`, `.internal-research/TODO.md`, `.internal-research/gaps.md`, `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
2320
-
2321
- ## Maintenance
2325
+ **GSDD implementation:** `bin/lib/provenance.mjs`, `distilled/workflows/resume.md`, `distilled/workflows/progress.md`, `.agents/skills/gsdd-resume/SKILL.md`, `.agents/skills/gsdd-progress/SKILL.md`, `.planning/SPEC.md`, `.internal-research/TODO.md`, `.internal-research/gaps.md`, `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
2326
+
2327
+ ---
2328
+
2329
+ ## D53 - Fail-Closed Milestone And Phase Contracts
2330
+
2331
+ **Decision (2026-04-21):** Active milestone roadmaps and new phase plans must carry explicit anti-drift contract fields so agents stop and challenge ambiguity instead of inferring scope or overclaiming closure.
2332
+
2333
+ **Context:**
2334
+ - v1.5.0 milestone-init truth correctly identified the brownfield middle-lane gap, but the active roadmap was still too weak at the phase-contract layer: one-line phase goals without assigned requirements, explicit out-of-scope, or stop/replan conditions.
2335
+ - The repo already had stronger anti-drift rules in `AGENTS.md`, `.internal-research/lessons-learned.md`, and the existing plan/execution/verification skills, but they were fragmented across governance and postmortems rather than enforced by the roadmap and `PLAN.md` schema themselves.
2336
+ - Cross-SOTA research converged on the same pattern: OpenSpec/Spec Kit/LeanSpec/Task Master all keep stronger `what / not this / done means` boundaries than the old GSDD roadmap shape, while Anthropic/OpenAI/GitHub guidance all push pause-on-ambiguity, explicit evidence, and approval gates near side effects.
2337
+
2338
+ **Decision:**
2339
+ - Harden active roadmap phases into compact execution contracts:
2340
+ - requirement assignments
2341
+ - success criteria
2342
+ - out-of-scope
2343
+ - stop/replan conditions
2344
+ - Harden `PLAN.md` into a fail-closed anti-drift contract with explicit:
2345
+ - `non_goals`
2346
+ - `hard_boundaries`
2347
+ - `escalation_triggers`
2348
+ - `approval_gates`
2349
+ - `anti_regression_targets`
2350
+ - `closure_claim_limit`
2351
+ - `parallelism_budget`
2352
+ - `leverage` (`lost / kept / gained`)
2353
+ - Upgrade planner checking to block missing anti-drift contract fields instead of treating them as optional prose quality.
2354
+ - Thread the new contract through execution and verification so the fields constrain what execution may do and what closure may claim.
2355
+
2356
+ **Why this fits the codebase:**
2357
+ - It keeps the existing Workspine lifecycle intact instead of inventing a new workflow family.
2358
+ - It codifies rules the repo already depends on, rather than adding another layer of planning ceremony.
2359
+ - It raises rigor where the failure mode actually lives: weak roadmap and plan contracts, not missing abstract governance prose.
2360
+ - It stays compact and checkable, following the repo's “rigor that pays rent” principle rather than adopting heavier spec-framework ceremony wholesale.
2361
+
2362
+ **Evidence:**
2363
+ - `.planning/SPEC.md` (`PLAN-03`, v1.5.0 Current State, key decision on anti-drift planning contract)
2364
+ - `.planning/ROADMAP.md` (v1.5.0 Phases 39-43)
2365
+ - `.internal-research/TODO.md` (active v1.5.0 objective and next-step reconciliation)
2366
+ - `.internal-research/lessons-learned.md` (`LL-PLANS-MUST-CARRY-THE-ANTI-DRIFT-CONTRACT`, `LL-ACTIVE-MILESTONE-TRUTH-MUST-STAY-SYNCHRONIZED`, `LL-AMBIGUITY-ABOUT-INTENT-MUST-STOP-EXECUTION`)
2367
+ - `.agents/skills/gsdd-new-milestone/SKILL.md`
2368
+ - `.agents/skills/gsdd-plan/SKILL.md`
2369
+ - `.agents/skills/gsdd-execute/SKILL.md`
2370
+ - `.agents/skills/gsdd-verify/SKILL.md`
2371
+ - GSD comparison source: `get-shit-done/workflows/new-milestone.md` and `get-shit-done/workflows/plan.md` preserve stronger planning discipline than the weakened one-line GSDD roadmap shape had drifted into.
2372
+ - External comparison sources: OpenSpec concepts/workflows, LeanSpec guide/limits, OpenAI practical guide to building agents, Anthropic effective/trustworthy agents, GitHub Copilot task best practices.
2373
+
2374
+ **Consequences:**
2375
+ - Active milestone phases are no longer loose roadmap themes; they are the minimum durable contract needed for safe planning.
2376
+ - `gsdd-plan` now fails closed when the roadmap phase contract is too weak or self-contradictory.
2377
+ - Execution and verification inherit explicit anti-drift boundaries instead of reconstructing them from memory or postmortems.
2378
+ - The active milestone truth now needs to stay synchronized across the planning surfaces that drive work, or the contradiction itself becomes a blocker.
2379
+
2380
+ ---
2381
+
2382
+ ## D54 - Bounded Brownfield Change Folder Contract
2383
+
2384
+ **Decision (2026-04-21):** The medium-scope brownfield lane should use one dedicated `brownfield-change/` folder family with three files (`CHANGE.md`, `HANDOFF.md`, `VERIFICATION.md`) instead of stretching `quick` or reusing milestone phases outside `ROADMAP.md`.
2385
+
2386
+ **Context:**
2387
+ - D47 intentionally repaired the existing quick brownfield lane without turning it into a hidden middle lane. That left `I43` open on purpose: bounded quick work was cleaner, but ticket/PBI-sized brownfield work still had no durable repo-native contract outside milestones.
2388
+ - Phase 39 then hardened the anti-drift planning contract so Phase 40 could define the lane shape under a stronger control surface instead of improvising another loose planning artifact.
2389
+ - Phase 40 research converged on the same tradeoff from both repo truth and adjacent systems: one-file brownfield state collapses scope, live status, and proof into a conflict-prone hotspot, while reusing phase artifacts outside milestones either becomes milestone-lite or demands a second planning system.
2390
+
2391
+ **Decision:**
2392
+ - Introduce one dedicated medium-scope change-folder family under `.planning/templates/brownfield-change/`:
2393
+ - `CHANGE.md` is the canonical active change contract
2394
+ - `HANDOFF.md` carries rolling decision context and anti-regression judgment
2395
+ - `VERIFICATION.md` carries the bounded closeout proof
2396
+ - Keep the lane explicitly bounded:
2397
+ - one active medium-scope change stream at a time
2398
+ - no phase numbering or roadmap semantics inside the change folder
2399
+ - multiple PR slices are allowed only when write ownership is explicitly disjoint and every slice still rolls up to one shared goal and closeout path
2400
+ - Keep routing, resume continuity, and milestone handoff out of this phase. The contract lands first; Phases 41-43 own continuity, deterministic routing, and promotion behavior.
2401
+
2402
+ **Why this fits the codebase:**
2403
+ - It preserves the existing milestone-owned lifecycle engine instead of creating a second roadmap system.
2404
+ - It keeps the new lane repo-native and file-backed, which matches the rest of Workspine's continuity model.
2405
+ - It separates active scope, rolling handoff, and closeout proof without exploding into milestone ceremony.
2406
+ - It turns the middle lane into an explicit product contract rather than quiet scope creep inside `quick`.
2407
+
2408
+ **Evidence:**
2409
+ - `.planning/SPEC.md` (`BROWNFIELD-01` through `BROWNFIELD-05`, Current State, key decision row)
2410
+ - `.planning/ROADMAP.md` (Phase 40 success criteria and follow-on Phases 41-43)
2411
+ - `.planning/templates/brownfield-change/CHANGE.md`
2412
+ - `.planning/templates/brownfield-change/HANDOFF.md`
2413
+ - `.planning/templates/brownfield-change/VERIFICATION.md`
2414
+ - `.internal-research/TODO.md` (active v1.5.0 order after Phase 40 execution)
2415
+ - `.internal-research/gaps.md` (`I43`, `I46`)
2416
+ - `SPEC.md` (bounded brownfield lane product contract)
2417
+ - `tests/gsdd.guards.test.cjs`
2418
+ - GSD comparison source: `get-shit-done/workflows/quick.md` and `get-shit-done/workflows/new-project.md` keep brownfield work closer to the lightweight quick lane or to full project/milestone planning; they do not define a distinct medium-scope change-folder family.
2419
+ - External comparison sources: OpenSpec concepts/getting-started docs, Task Master docs, BMAD workflow map, GitHub Copilot coding-agent best practices.
2420
+
2421
+ **Consequences:**
2422
+ - The medium-scope lane now has a concrete artifact contract instead of an open-ended "maybe deepen quick later" gap.
2423
+ - Future continuity and routing work must build on this folder family rather than inventing a different middle-lane shape.
2424
+ - `quick` remains the sub-hour lane, and milestones remain the only roadmap-owned lifecycle.
2425
+ - If future work weakens the one-active-stream or disjoint-write-ownership boundaries, the repo should treat that as contract drift, not as harmless copy edits.
2426
+
2427
+ ---
2428
+
2429
+ ## D55 - Brownfield Continuity Anchor And Mismatch Split
2430
+
2431
+ **Decision (2026-04-21):** Active medium-scope brownfield continuity should use one operational anchor plus one judgment surface: `CHANGE.md` owns status, integration surface, and next action; `HANDOFF.md` owns the cold-start judgment layer. `progress` stays warning-only, while `resume` requires acknowledgement when live git/worktree truth materially conflicts with the active change artifact.
2432
+
2433
+ **Context:**
2434
+ - D54 defined the bounded `brownfield-change/` 3-file family, but it deliberately left continuity, resume behavior, and drift handling for the next phase.
2435
+ - Existing repo continuity already had the right primitives in separate places: provenance split in Phase 19, shared lifecycle derivation in Phase 29, deterministic preflight in Phase 30, and generic-checkpoint ownership repair in Phase 33.
2436
+ - Without an explicit anchor split, the new lane risked recreating the same ambiguity the milestone hardening had just removed: two files that both looked like status truth, plus git/worktree drift that could remain visible only to whichever session happened to notice it.
2437
+
2438
+ **Decision:**
2439
+ - Treat `.planning/brownfield-change/CHANGE.md` as the canonical operational continuity anchor for:
2440
+ - current posture
2441
+ - integration surface
2442
+ - owner/runtime
2443
+ - next action
2444
+ - declared write scope when PR slices exist
2445
+ - Treat `.planning/brownfield-change/HANDOFF.md` as the judgment-only cold-start surface for:
2446
+ - active constraints
2447
+ - unresolved uncertainty
2448
+ - decision posture
2449
+ - anti-regression
2450
+ - context behind the next action
2451
+ - Add one helper-backed continuity seam:
2452
+ - `bin/lib/lifecycle-state.mjs` reconstructs the active brownfield state from repo artifacts
2453
+ - `bin/lib/provenance.mjs` classifies material mismatch between the artifact and live git/worktree truth
2454
+ - Keep the mismatch split asymmetric:
2455
+ - `progress` warns but remains read-only
2456
+ - `resume` requires acknowledgement before continuing from materially misleading brownfield continuity state
2457
+
2458
+ **Why this fits the codebase:**
2459
+ - It extends the existing repo-truth continuity model instead of inventing a second hidden state system or a new user-facing brownfield command.
2460
+ - It preserves the earlier checkpoint-ownership rule: read-only reporting should not silently become a gating/mutating control surface.
2461
+ - It keeps cold-start judgment available without turning the operational artifact into a second copy of the judgment layer.
2462
+ - It narrows `I46` honestly: the repo can now detect more drift deterministically, but it still does not pretend gitignored `.planning/` persistence is solved.
2463
+
2464
+ **Evidence:**
2465
+ - `.planning/SPEC.md` (`BROWNFIELD-02`, `BROWNFIELD-05`, Current State, key decision row)
2466
+ - `.planning/phases/41-brownfield-continuity-and-resume/41-PLAN.md`
2467
+ - `.planning/templates/brownfield-change/CHANGE.md`
2468
+ - `.planning/templates/brownfield-change/HANDOFF.md`
2469
+ - `bin/lib/lifecycle-state.mjs`
2470
+ - `bin/lib/provenance.mjs`
2471
+ - `distilled/workflows/progress.md`
2472
+ - `distilled/workflows/resume.md`
2473
+ - `tests/phase.test.cjs`
2474
+ - `tests/gsdd.guards.test.cjs`
2475
+ - `tests/gsdd.scenarios.test.cjs`
2476
+ - GSD comparison sources: `get-shit-done/workflows/resume.md` and `get-shit-done/workflows/progress.md` keep continuity centered on session checkpoints and roadmap state; they do not define a separate medium-scope brownfield continuity anchor with explicit artifact-versus-worktree mismatch handling.
2477
+
2478
+ **Consequences:**
2479
+ - The medium-scope lane now has a deterministic repo-truth continuity floor rather than only a static artifact family.
2480
+ - `CHANGE.md` and `HANDOFF.md` no longer compete implicitly for authority; future edits must preserve the one-anchor split.
2481
+ - `progress` can report the active brownfield state without widening into a mutating workflow.
2482
+ - `resume` can restore brownfield continuity honestly while still stopping short of the broader routing and promotion work reserved for Phases 42-43.
2483
+
2484
+ ## D56 - Executable Brownfield Routing And Widen-Only Escalation
2485
+
2486
+ **Decision (2026-04-21):** Brownfield routing should treat `CHANGE.md` as the default operational anchor and allow a surviving `phase` or `quick` checkpoint to outrank it only when one strict-match rule proves the checkpoint is still the active execution surface. From concrete brownfield state, `/gsdd-new-project` remains available only as an intentional widen path into full milestone setup, not as an accidental fallback recommendation.
2487
+
2488
+ **Context:**
2489
+ - D54 defined the bounded `brownfield-change/` contract and D55 established its continuity floor, but the routing matrix above those artifacts was still inconsistent: `progress` could still route back through stale checkpoint residue, `resume` could still make a non-matching checkpoint primary, and `quick` / `map-codebase` / `new-project` still risked implying that full lifecycle initialization was the normal fallback from already-concrete bounded work.
2490
+ - The repo already had the right raw pieces in place: checkpoint-class ownership from D52, one-anchor continuity from D55, non-phase state derivation in `lifecycle-state.mjs`, and generated-surface freshness via `gsdd update`.
2491
+ - Phase 42 was intentionally scoped to validity of next-step routing only. It did not reopen growth policy, add a new command, or weaken the one-active-stream contract.
2492
+
2493
+ **Decision:**
2494
+ - Add one shared routing seam in `bin/lib/provenance.mjs`:
2495
+ - `generic` checkpoints never outrank an active brownfield change
2496
+ - `phase` and `quick` checkpoints outrank `CHANGE.md` only when branch alignment, scope alignment, and still-active execution state all hold at once
2497
+ - otherwise the checkpoint stays visible context, but the brownfield operational anchor remains primary
2498
+ - Apply that same rule across the authored `progress` and `resume` contracts instead of letting each workflow invent its own checkpoint-versus-change exception.
2499
+ - Keep `/gsdd-new-project` available from brownfield surfaces only as an explicit widen path:
2500
+ - `quick` uses it when the bounded change is still undefined or when the user intentionally widens scope
2501
+ - `map-codebase` frames it as full lifecycle setup only when the user wants to widen beyond bounded brownfield work
2502
+ - `new-project` itself recognizes existing `CHANGE.md` continuity and treats invocation from that state as deliberate promotion, not mistaken routing
2503
+ - Lock the contract with helper, guard, and generated-surface scenario coverage.
2504
+
2505
+ **Why this fits the codebase:**
2506
+ - It extends the existing provenance helper and generated-surface workflow model instead of inventing another routing registry or hidden state store.
2507
+ - It preserves the D55 one-anchor split: checkpoints stay visible and resume-owned, but they do not silently demote the active brownfield contract unless the repo can prove the checkpoint is still current.
2508
+ - It keeps the brownfield lane bounded by removing accidental fallback escalation while still preserving an intentional route into milestone planning.
2509
+ - It matches the repo's anti-drift posture: ambiguous or weak routing proof fails closed in favor of the current operational anchor.
2510
+
2511
+ **Evidence:**
2512
+ - `.planning/SPEC.md` (`BROWNFIELD-03`, Current State, key decision row)
2513
+ - `.planning/phases/42-executable-brownfield-routing/42-PLAN.md`
2514
+ - `bin/lib/provenance.mjs`
2515
+ - `distilled/workflows/progress.md`
2516
+ - `distilled/workflows/resume.md`
2517
+ - `distilled/workflows/quick.md`
2518
+ - `distilled/workflows/map-codebase.md`
2519
+ - `distilled/workflows/new-project.md`
2520
+ - `.internal-research/TODO.md`
2521
+ - `.internal-research/gaps.md` (`I43`, `I46`)
2522
+ - `tests/phase.test.cjs`
2523
+ - `tests/gsdd.guards.test.cjs`
2524
+ - `tests/gsdd.scenarios.test.cjs`
2525
+ - `get-shit-done/workflows/progress.md`, `get-shit-done/workflows/resume.md`, `get-shit-done/workflows/quick.md`, `get-shit-done/workflows/new-project.md`
2526
+
2527
+ **Consequences:**
2528
+ - Brownfield next-step routing now has one deterministic precedence rule instead of five workflow-local interpretations.
2529
+ - A stale or unrelated `phase` / `quick` checkpoint can remain reviewable without automatically hijacking the current brownfield lane.
2530
+ - `/gsdd-new-project` remains part of the system, but as deliberate promotion from concrete brownfield work rather than as a generic fallback.
2531
+ - Phase 43 can now focus on bounded growth and milestone handoff instead of first repairing invalid routing recommendations.
2532
+
2533
+ ## D57 - Bounded Brownfield Growth And Context-Preserving Milestone Handoff
2534
+
2535
+ **Decision (2026-04-22):** When bounded brownfield work widens into milestone planning, keep the lane explicit and case-by-case. Reuse `CHANGE.md`, `HANDOFF.md`, and `VERIFICATION.md` directly as the promotion input surface through `/gsdd-new-project` (first milestone) or `/gsdd-new-milestone` (subsequent milestone) instead of inventing another artifact family or silently widening the lane.
2536
+
2537
+ **Context:**
2538
+ - D54 established the bounded brownfield artifact family, D55 gave it a continuity floor, and D56 repaired routing precedence. That still left the final growth seam open: how the bounded lane should widen without becoming milestone-lite or forcing rediscovery.
2539
+ - The risk was architectural, not cosmetic. Without an explicit handoff rule, future work could either accrete ad hoc behavior into `quick`-style lanes or create a second "promotion" artifact that duplicated state the brownfield family already carried.
2540
+ - Phase 43 was deliberately scoped to finish that seam inside the current architecture: no new workflow family, no hidden state store, and no automatic promotion.
2541
+
2542
+ **Decision:**
2543
+ - Keep widening explicit and structural, not automatic:
2544
+ - stay in the bounded lane by default
2545
+ - widen only when the work no longer fits one active stream, needs milestone-owned lifecycle state, or needs broader requirement/phase tracking
2546
+ - Reuse the existing brownfield artifact family directly during widening:
2547
+ - `CHANGE.md` remains the operational summary of goal, scope, next action, and write scope
2548
+ - `HANDOFF.md` remains the preserved judgment surface
2549
+ - `VERIFICATION.md` remains the carried-forward proof and gap surface, including partial validation
2550
+ - Split the milestone-init paths honestly:
2551
+ - `/gsdd-new-project` is the widen path when no shipped milestone history exists yet
2552
+ - `/gsdd-new-milestone` is the widen path when the repo already has shipped milestone history
2553
+ - Keep `progress` and `resume` explicit about this boundary so widening remains a deliberate user choice rather than a default fallback.
2554
+
2555
+ **Why this fits the codebase:**
2556
+ - It completes the brownfield lane using the existing artifact family rather than adding another continuity surface.
2557
+ - It preserves the one-active-stream posture by making growth structural and case-by-case instead of opening the lane into silent multi-stream sprawl.
2558
+ - It keeps first-milestone and subsequent-milestone initiation aligned without pretending they are the same lifecycle posture.
2559
+ - It avoids rediscovery debt: milestone setup inherits current scope, judgment, and proof from repo truth rather than from chat memory.
2560
+
2561
+ **Evidence:**
2562
+ - `.planning/SPEC.md` (`BROWNFIELD-04`, Current State, key decision row)
2563
+ - `.planning/phases/43-bounded-growth-and-milestone-handoff/43-PLAN.md`
2564
+ - `.planning/templates/brownfield-change/CHANGE.md`
2565
+ - `.planning/templates/brownfield-change/HANDOFF.md`
2566
+ - `.planning/templates/brownfield-change/VERIFICATION.md`
2567
+ - `distilled/workflows/progress.md`
2568
+ - `distilled/workflows/resume.md`
2569
+ - `distilled/workflows/new-project.md`
2570
+ - `distilled/workflows/new-milestone.md`
2571
+ - `.internal-research/TODO.md`
2572
+ - `.internal-research/gaps.md` (`I43`, `I46`)
2573
+ - `.internal-research/lessons-learned.md`
2574
+ - `tests/phase.test.cjs`
2575
+ - `tests/gsdd.guards.test.cjs`
2576
+ - `tests/gsdd.scenarios.test.cjs`
2577
+ - `get-shit-done/workflows/new-project.md`, `get-shit-done/workflows/quick.md`
2578
+
2579
+ **Consequences:**
2580
+ - The bounded lane now has an explicit growth contract instead of a hand-wavy "promote later" escape hatch.
2581
+ - Milestone initiation can inherit real brownfield context without adding a second handoff file or restarting discovery.
2582
+ - `progress` and `resume` can present widening as a deliberate choice while keeping `CHANGE.md` primary until the user intentionally crosses the lifecycle boundary.
2583
+ - Phase 43 can now verify one concrete seam: bounded growth and context-preserving milestone handoff from repo truth.
2584
+
2585
+ ## D58 - Local Workflow Helper Launcher
2586
+
2587
+ **Decision (2026-04-22):** Workflow-embedded CLI helper commands must run through a generated local launcher at `.planning/bin/gsdd.mjs` instead of assuming a bare `gsdd` binary is available on the consumer repo's PATH.
2588
+
2589
+ **Context:**
2590
+ - Public onboarding already leads with `npx gsdd-cli init`, which works even when the package is not globally installed.
2591
+ - The authored workflow surfaces had drifted into a different assumption: embedded helper commands such as `lifecycle-preflight`, `file-op`, and `phase-status` were written as bare `gsdd ...` invocations.
2592
+ - That split contract caused consumer friction in the exact place the deterministic helper seam was supposed to help: a workflow could initialize successfully, then fail later because the repo did not have a global `gsdd` on PATH.
2593
+ - The launcher must stay out of `.agents/` ownership so it does not pollute unrelated `.agents` folders or leak into generated governance.
2594
+
2595
+ **Decision:**
2596
+ - Generate `.planning/bin/gsdd.mjs` on `gsdd init` for every initialized workspace.
2597
+ - Regenerate that launcher on `gsdd update` whenever `.planning/` exists.
2598
+ - Keep the launcher machine-independent by resolving back to the published `gsdd-cli` package version used for generation rather than embedding framework checkout paths.
2599
+ - Route workflow-embedded helper commands through `node .planning/bin/gsdd.mjs ...` for the deterministic helper seam:
2600
+ - `lifecycle-preflight`
2601
+ - `file-op`
2602
+ - `phase-status`
2603
+ - Keep `.agents/skills/` as the canonical portable workflow discovery surface and keep generated `AGENTS.md` governance-only. No `.agents/bin` surface is introduced.
2604
+
2605
+ **Why this fits the codebase:**
2606
+ - It preserves the existing skills-first architecture instead of inventing a second discovery or governance path.
2607
+ - It fixes the actual consumer DX failure at the point where workflows invoke deterministic helper commands.
2608
+ - It keeps ownership aligned with `.planning/`, which already holds the other local runtime mechanics and generation-manifest state.
2609
+
2610
+ **Evidence:**
2611
+ - `bin/lib/init-flow.mjs`
2612
+ - `bin/lib/rendering.mjs`
2613
+ - `bin/lib/runtime-freshness.mjs`
2614
+ - `bin/lib/manifest.mjs`
2615
+ - `bin/lib/health.mjs`
2616
+ - `distilled/workflows/execute.md`
2617
+ - `distilled/workflows/verify.md`
2618
+ - `distilled/workflows/resume.md`
2619
+ - `tests/gsdd.init.test.cjs`
2620
+ - `tests/gsdd.health.test.cjs`
2621
+ - `tests/gsdd.manifest.test.cjs`
2622
+ - `tests/gsdd.scenarios.test.cjs`
2623
+
2624
+ **Consequences:**
2625
+ - Consumer repos no longer need a global `gsdd` binary for workflow-embedded helper mechanics after init.
2626
+ - Helper-command freshness is now owned under `.planning/` without widening `.agents` install detection.
2627
+ - Generated governance remains compact and routing-focused because launcher instructions stay out of `AGENTS.md`.
2628
+
2629
+ ## Maintenance
2322
2630
 
2323
2631
  This document is updated when:
2324
2632
 
@@ -382,16 +382,76 @@
382
382
  - `tests/phase.test.cjs`, `tests/gsdd.health.test.cjs`, `tests/gsdd.plan.adapters.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
383
383
  - `get-shit-done/workflows/progress.md`
384
384
 
385
- ## D52 — Generic Checkpoint Routing Ownership
386
- - `.planning/SPEC.md` (`ENGINE-01`, `ENGINE-03`)
387
- - `.internal-research/gaps.md` (`I45`)
388
- - `bin/lib/provenance.mjs`
389
- - `distilled/workflows/resume.md`, `distilled/workflows/progress.md`
390
- - `.agents/skills/gsdd-resume/SKILL.md`, `.agents/skills/gsdd-progress/SKILL.md`
391
- - `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
392
- - `get-shit-done/workflows/progress.md`
393
-
394
- ---
385
+ ## D52 — Generic Checkpoint Routing Ownership
386
+ - `.planning/SPEC.md` (`ENGINE-01`, `ENGINE-03`)
387
+ - `.internal-research/gaps.md` (`I45`)
388
+ - `bin/lib/provenance.mjs`
389
+ - `distilled/workflows/resume.md`, `distilled/workflows/progress.md`
390
+ - `.agents/skills/gsdd-resume/SKILL.md`, `.agents/skills/gsdd-progress/SKILL.md`
391
+ - `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
392
+ - `get-shit-done/workflows/progress.md`
393
+
394
+ ## D53 — Fail-Closed Milestone And Phase Contracts
395
+ - `.planning/SPEC.md` (`PLAN-03`, v1.5.0 Current State, key decision on anti-drift milestone/phase contracts)
396
+ - `.planning/ROADMAP.md` (v1.5.0 Phases 39-43 with requirement assignments, success criteria, out-of-scope, and stop/replan conditions)
397
+ - `.internal-research/TODO.md` (active milestone reconciliation and next-step truth)
398
+ - `.internal-research/lessons-learned.md` (`LL-PLANS-MUST-CARRY-THE-ANTI-DRIFT-CONTRACT`, `LL-ACTIVE-MILESTONE-TRUTH-MUST-STAY-SYNCHRONIZED`, `LL-AMBIGUITY-ABOUT-INTENT-MUST-STOP-EXECUTION`)
399
+ - `.agents/skills/gsdd-new-milestone/SKILL.md`, `.agents/skills/gsdd-plan/SKILL.md`, `.agents/skills/gsdd-execute/SKILL.md`, `.agents/skills/gsdd-verify/SKILL.md`
400
+ - `get-shit-done/workflows/new-milestone.md`, `get-shit-done/workflows/plan.md`
401
+ - OpenSpec concepts/workflows, LeanSpec guide/limits, OpenAI practical guide to building agents, Anthropic effective/trustworthy agents, GitHub Copilot task best practices
402
+
403
+ ## D54 — Bounded Brownfield Change Folder Contract
404
+ - `.planning/SPEC.md` (`BROWNFIELD-01` through `BROWNFIELD-05`, v1.5.0 Current State, key decision row)
405
+ - `.planning/ROADMAP.md` (Phase 40 success criteria plus follow-on Phases 41-43)
406
+ - `.planning/templates/brownfield-change/CHANGE.md`
407
+ - `.planning/templates/brownfield-change/HANDOFF.md`
408
+ - `.planning/templates/brownfield-change/VERIFICATION.md`
409
+ - `.internal-research/TODO.md` (Phase 40 execution handoff and Phase 41 next-step ordering)
410
+ - `.internal-research/gaps.md` (`I43`, `I46`)
411
+ - `SPEC.md` (bounded brownfield lane product contract)
412
+ - `tests/gsdd.guards.test.cjs`
413
+ - `get-shit-done/workflows/quick.md`, `get-shit-done/workflows/new-project.md`
414
+ - OpenSpec concepts/getting-started docs, Task Master docs, BMAD workflow map, GitHub Copilot coding-agent best practices
415
+
416
+ ## D55 — Brownfield Continuity Anchor And Mismatch Split
417
+ - `.planning/SPEC.md` (`BROWNFIELD-02`, `BROWNFIELD-05`, Current State, key decision row)
418
+ - `.planning/phases/41-brownfield-continuity-and-resume/41-PLAN.md`
419
+ - `.planning/templates/brownfield-change/CHANGE.md`
420
+ - `.planning/templates/brownfield-change/HANDOFF.md`
421
+ - `bin/lib/lifecycle-state.mjs`
422
+ - `bin/lib/provenance.mjs`
423
+ - `distilled/workflows/progress.md`, `distilled/workflows/resume.md`
424
+ - `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
425
+ - `get-shit-done/workflows/resume.md`, `get-shit-done/workflows/progress.md`
426
+
427
+ ## D56 — Executable Brownfield Routing And Widen-Only Escalation
428
+ - `.planning/SPEC.md` (`BROWNFIELD-03`, Current State, key decision row)
429
+ - `.planning/phases/42-executable-brownfield-routing/42-PLAN.md`
430
+ - `bin/lib/provenance.mjs`
431
+ - `distilled/workflows/progress.md`, `distilled/workflows/resume.md`, `distilled/workflows/quick.md`, `distilled/workflows/map-codebase.md`, `distilled/workflows/new-project.md`
432
+ - `.internal-research/TODO.md`, `.internal-research/gaps.md`
433
+ - `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
434
+ - `get-shit-done/workflows/progress.md`, `get-shit-done/workflows/resume.md`, `get-shit-done/workflows/quick.md`, `get-shit-done/workflows/new-project.md`
435
+
436
+ ## D57 — Bounded Brownfield Growth And Context-Preserving Milestone Handoff
437
+ - `.planning/SPEC.md` (`BROWNFIELD-04`, Current State, key decision row)
438
+ - `.planning/phases/43-bounded-growth-and-milestone-handoff/43-PLAN.md`
439
+ - `.planning/templates/brownfield-change/CHANGE.md`
440
+ - `.planning/templates/brownfield-change/HANDOFF.md`
441
+ - `.planning/templates/brownfield-change/VERIFICATION.md`
442
+ - `distilled/workflows/progress.md`, `distilled/workflows/resume.md`, `distilled/workflows/new-project.md`, `distilled/workflows/new-milestone.md`
443
+ - `.internal-research/TODO.md`, `.internal-research/gaps.md`, `.internal-research/lessons-learned.md`
444
+ - `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
445
+ - `get-shit-done/workflows/new-project.md`, `get-shit-done/workflows/quick.md`
446
+
447
+ ## D58 — Local Workflow Helper Launcher
448
+ - `bin/lib/rendering.mjs` (`renderPlanningCliLauncher` for a machine-independent local helper launcher)
449
+ - `bin/lib/init-flow.mjs` (`gsdd init` / `gsdd update` generation of `.planning/bin/gsdd.mjs`)
450
+ - `bin/lib/runtime-freshness.mjs`, `bin/lib/manifest.mjs`, `bin/lib/health.mjs`, `bin/lib/health-truth.mjs`
451
+ - `distilled/workflows/execute.md`, `distilled/workflows/verify.md`, `distilled/workflows/resume.md`, `distilled/workflows/progress.md`
452
+ - `tests/gsdd.init.test.cjs`, `tests/gsdd.health.test.cjs`, `tests/gsdd.manifest.test.cjs`, `tests/gsdd.scenarios.test.cjs`
453
+
454
+ ---
395
455
 
396
456
  ## Maintenance
397
457
 
@@ -77,7 +77,7 @@ Use the same three-way routing everywhere:
77
77
  - `gsdd-quick` is the bounded brownfield lane when the change is already concrete. It uses existing codebase maps when present and otherwise builds a just-enough inline baseline.
78
78
  - `gsdd-map-codebase` is the deeper orientation pass for unfamiliar or higher-risk repos before choosing between `quick` and `new-project`.
79
79
 
80
- ## Workflow Surface (updated 2026-04-19)
80
+ ## Current Status (updated 2026-04-21)
81
81
 
82
82
  | Workflow | What ships |
83
83
  |----------|------------|
@@ -164,7 +164,7 @@ Note: `parallelization: false` keeps the same mapper/researcher set but runs the
164
164
 
165
165
  ```
166
166
  distilled/
167
- DESIGN.md # design decisions and rationale (52 decisions, evidence-backed)
167
+ DESIGN.md # design decisions and rationale (58 decisions, evidence-backed)
168
168
  EVIDENCE-INDEX.md # source-to-decision index for durable research-backed claims
169
169
  SKILL.md # primary entry point (plain markdown)
170
170
  workflows/
@@ -16,7 +16,7 @@ Before starting, read these files:
16
16
  <lifecycle_preflight>
17
17
  Before determining milestone scope or spawning the integration checker, run:
18
18
 
19
- - `gsdd lifecycle-preflight audit-milestone`
19
+ - `node .planning/bin/gsdd.mjs lifecycle-preflight audit-milestone`
20
20
 
21
21
  If the preflight result is `blocked`, STOP and report the blocker instead of inferring milestone eligibility from workflow-local prose.
22
22
 
@@ -28,7 +28,7 @@ Before starting, read these files:
28
28
  <lifecycle_preflight>
29
29
  Before verifying readiness or gathering archive stats, run:
30
30
 
31
- - `gsdd lifecycle-preflight complete-milestone`
31
+ - `node .planning/bin/gsdd.mjs lifecycle-preflight complete-milestone`
32
32
 
33
33
  If the preflight result is `blocked`, STOP and report the blocker instead of inferring milestone-close eligibility from workflow-local prose.
34
34
 
@@ -14,20 +14,20 @@ CRITICAL: Read every file below before performing any other actions. This is you
14
14
  4. Previous phase summaries beyond the immediately prior completed phase, if they are genuinely relevant
15
15
  5. Relevant source files listed in the plan's `<files>` sections
16
16
  6. `.planning/phases/*-SUMMARY.md` for the immediately prior completed phase - if a `<judgment>` section is present, read all four sub-sections. Honor `<anti_regression>` rules as execution constraints. Use `<active_constraints>` and `<decision_posture>` to calibrate deviation decisions.
17
- 7. **Session-boundary fallback:** If no prior completed phase SUMMARY.md with a `<judgment>` section was found in step 6, check whether `.planning/.continue-here.bak` exists. If it does, read its `<judgment>` section. Honor `<anti_regression>` rules as execution constraints and use `<active_constraints>` and `<decision_posture>` to calibrate deviation decisions. After reading, run `gsdd file-op delete .planning/.continue-here.bak --missing ok` (auto-clean).
17
+ 7. **Session-boundary fallback:** If no prior completed phase SUMMARY.md with a `<judgment>` section was found in step 6, check whether `.planning/.continue-here.bak` exists. If it does, read its `<judgment>` section. Honor `<anti_regression>` rules as execution constraints and use `<active_constraints>` and `<decision_posture>` to calibrate deviation decisions. After reading, run `node .planning/bin/gsdd.mjs file-op delete .planning/.continue-here.bak --missing ok` (auto-clean).
18
18
  </load_context>
19
19
 
20
20
  <lifecycle_preflight>
21
21
  Before implementing or mutating any lifecycle artifact, run:
22
22
 
23
- - `gsdd lifecycle-preflight execute {phase_num} --expects-mutation phase-status`
23
+ - `node .planning/bin/gsdd.mjs lifecycle-preflight execute {phase_num} --expects-mutation phase-status`
24
24
 
25
25
  If the preflight result is `blocked`, STOP and surface the blocker instead of inferring eligibility from workflow-local prose.
26
26
 
27
27
  Treat the preflight as an authorization seam over shared repo truth only:
28
28
  - it may authorize or reject execution
29
29
  - it does not mutate `.planning/ROADMAP.md` by itself
30
- - owned writes remain execution artifacts, and ROADMAP mutation stays explicit in `<state_updates>` via `gsdd phase-status`
30
+ - owned writes remain execution artifacts, and ROADMAP mutation stays explicit in `<state_updates>` via `node .planning/bin/gsdd.mjs phase-status`
31
31
  </lifecycle_preflight>
32
32
 
33
33
  <runtime_contract>
@@ -286,8 +286,8 @@ Keep the update factual and compact:
286
286
  ### 2. Update ROADMAP.md Phase Status
287
287
  Do not hand-edit the ROADMAP checkbox line. Use the status-aware helper instead:
288
288
 
289
- - Run `gsdd phase-status {N} done` when this plan completes the phase.
290
- - Run `gsdd phase-status {N} in_progress` when this plan completes but more plans remain in the phase.
289
+ - Run `node .planning/bin/gsdd.mjs phase-status {N} done` when this plan completes the phase.
290
+ - Run `node .planning/bin/gsdd.mjs phase-status {N} in_progress` when this plan completes but more plans remain in the phase.
291
291
 
292
292
  The helper owns the `[ ]` / `[-]` / `[x]` mutation for `.planning/ROADMAP.md`.
293
293
 
@@ -233,17 +233,17 @@ Report to the user what was accomplished, then present the next step:
233
233
  ---
234
234
  **Completed:** Codebase mapping — 4 documents written to `.planning/codebase/` (STACK.md, ARCHITECTURE.md, CONVENTIONS.md, CONCERNS.md).
235
235
 
236
- **Brownfield routing summary:** Synthesize this directly from the 4 generated documents before recommending the next workflow.
237
- - Safest next change lane — which module or surface looks cheapest and safest to modify first
238
- - Highest-risk zones — areas to avoid or isolate unless the task explicitly needs them
239
- - Must-know traps — convention, dependency, or architecture constraints likely to cause mistakes
240
- - Recommended next workflow — choose `/gsdd-quick` for bounded brownfield work or `/gsdd-new-project` for full lifecycle setup, and say why
241
-
242
- Use only the 4 generated documents for this synthesis. Do NOT create a fifth persistent artifact or write an additional routing-summary file.
243
-
244
- **Next step:** Choose based on what you need:
245
- - `/gsdd-new-project` — full project initialization (spec, roadmap, phased delivery), especially if you have not yet defined the bounded change
246
- - `/gsdd-quick` — bounded brownfield feature work without full ceremony (bug fixes, small features, one-off tasks)
236
+ **Brownfield routing summary:** Synthesize this directly from the 4 generated documents before recommending the next workflow.
237
+ - Safest next change lane — which module or surface looks cheapest and safest to modify first
238
+ - Highest-risk zones — areas to avoid or isolate unless the task explicitly needs them
239
+ - Must-know traps — convention, dependency, or architecture constraints likely to cause mistakes
240
+ - Recommended next workflow — choose `/gsdd-quick` for bounded brownfield work or `/gsdd-new-project` only when the user intentionally wants to widen into full lifecycle setup, and say why
241
+
242
+ Use only the 4 generated documents for this synthesis. Do NOT create a fifth persistent artifact or write an additional routing-summary file.
243
+
244
+ **Next step:** Choose based on what you need:
245
+ - `/gsdd-new-project` — full project initialization (spec, roadmap, phased delivery), especially when you intentionally want to widen beyond the current bounded brownfield lane
246
+ - `/gsdd-quick` — bounded brownfield feature work without full ceremony (bug fixes, small features, one-off tasks)
247
247
 
248
248
  Also available:
249
249
  - `/gsdd-map-codebase` — re-map if results need refinement