gsdd-cli 0.16.1 → 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.
- package/README.md +111 -61
- package/agents/README.md +1 -1
- package/bin/adapters/claude.mjs +8 -1
- package/bin/adapters/codex.mjs +5 -1
- package/bin/adapters/opencode.mjs +7 -1
- package/bin/gsdd.mjs +25 -20
- package/bin/lib/evidence-contract.mjs +112 -0
- package/bin/lib/health-truth.mjs +29 -31
- package/bin/lib/health.mjs +61 -106
- package/bin/lib/init-flow.mjs +91 -34
- package/bin/lib/init-runtime.mjs +46 -25
- package/bin/lib/init.mjs +3 -7
- package/bin/lib/lifecycle-preflight.mjs +333 -0
- package/bin/lib/lifecycle-state.mjs +476 -0
- package/bin/lib/manifest.mjs +24 -20
- package/bin/lib/phase.mjs +81 -26
- package/bin/lib/provenance.mjs +295 -54
- package/bin/lib/rendering.mjs +70 -12
- package/bin/lib/runtime-freshness.mjs +264 -0
- package/bin/lib/session-fingerprint.mjs +106 -0
- package/distilled/DESIGN.md +707 -13
- package/distilled/EVIDENCE-INDEX.md +166 -1
- package/distilled/README.md +44 -28
- package/distilled/SKILL.md +4 -4
- package/distilled/templates/agents.block.md +1 -1
- package/distilled/workflows/audit-milestone.md +50 -0
- package/distilled/workflows/complete-milestone.md +38 -2
- package/distilled/workflows/execute.md +16 -3
- package/distilled/workflows/map-codebase.md +15 -4
- package/distilled/workflows/new-milestone.md +53 -24
- package/distilled/workflows/new-project.md +44 -25
- package/distilled/workflows/pause.md +1 -1
- package/distilled/workflows/plan.md +187 -74
- package/distilled/workflows/progress.md +135 -31
- package/distilled/workflows/quick.md +20 -12
- package/distilled/workflows/resume.md +152 -65
- package/distilled/workflows/verify.md +55 -20
- package/docs/BROWNFIELD-PROOF.md +95 -0
- package/docs/RUNTIME-SUPPORT.md +77 -0
- package/docs/USER-GUIDE.md +443 -0
- package/docs/VERIFICATION-DISCIPLINE.md +59 -0
- package/docs/claude/context-monitor.md +98 -0
- package/docs/proof/consumer-node-cli/README.md +37 -0
- package/docs/proof/consumer-node-cli/ROADMAP.md +14 -0
- package/docs/proof/consumer-node-cli/SPEC.md +17 -0
- package/docs/proof/consumer-node-cli/brief.md +9 -0
- package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-PLAN.md +34 -0
- package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-SUMMARY.md +10 -0
- package/docs/proof/consumer-node-cli/phases/01-foundation/01-VERIFICATION.md +30 -0
- package/package.json +26 -20
package/distilled/DESIGN.md
CHANGED
|
@@ -50,6 +50,25 @@
|
|
|
50
50
|
37. [Mutability-Driven Workflow Classification](#37-mutability-driven-workflow-classification)
|
|
51
51
|
38. [Retroactive Artifact Enforcement](#38-retroactive-artifact-enforcement)
|
|
52
52
|
39. [Brownfield Entry Wiring](#39-brownfield-entry-wiring)
|
|
53
|
+
40. [Three-Layer Continuity Boundary](#d40---three-layer-continuity-boundary)
|
|
54
|
+
41. [Compressed Judgment Persistence Surface](#d41---compressed-judgment-persistence-surface)
|
|
55
|
+
42. [Session-Boundary Safety](#d42---session-boundary-safety)
|
|
56
|
+
43. [Resume Provenance Truth Split](#d43---resume-provenance-truth-split)
|
|
57
|
+
44. [Warning-First Transition Safety And Fail-Closed Terminal Writes](#d44---warning-first-transition-safety-and-fail-closed-terminal-writes)
|
|
58
|
+
45. [Fork-Honest Launch Posture Before Identity Migration](#d45---fork-honest-launch-posture-before-identity-migration)
|
|
59
|
+
46. [Archived Milestone Routing With Retained ROADMAP](#d46---archived-milestone-routing-with-retained-roadmap)
|
|
60
|
+
47. [Brownfield Quick-Win Repair](#d47---brownfield-quick-win-repair)
|
|
61
|
+
48. [Shared Lifecycle Evaluator And Dual-Canonical Runtime Boundary](#d48---shared-lifecycle-evaluator-and-dual-canonical-runtime-boundary)
|
|
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)
|
|
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)
|
|
53
72
|
|
|
54
73
|
---
|
|
55
74
|
|
|
@@ -841,7 +860,7 @@ Implementation lives under `bin/lib/`:
|
|
|
841
860
|
|
|
842
861
|
**GSDD (before this decision):** Codex CLI was a skills-first runtime at ~40% parity. It consumed the portable `.agents/skills/gsdd-*/SKILL.md` surface but had no native plan-checker, no orchestration loop, no model control, and no dedicated adapter module. `--tools codex` was deprecated and silently stripped. Every Codex plan ran in silent `reduced_assurance` mode.
|
|
843
862
|
|
|
844
|
-
**GSDD (after this decision):** Codex CLI is promoted to `native_capable` — same tier as Claude Code and OpenCode. A dedicated `bin/adapters/codex.mjs` generates `.codex/agents/gsdd-plan-checker.toml` (read-only TOML agent with the plan-checker delegate). Codex's entry surface is the portable skill at `.agents/skills/gsdd-plan/SKILL.md` — Codex auto-discovers it via its `.agents/skills/` skill scanning ([developers.openai.com/codex/skills](https://developers.openai.com/codex/skills)). The portable skill now contains vendor-neutral checker invocation instructions (JSON schema, max-3 cycle loop, escalation), so when Codex follows it, it spawns the native `gsdd-plan-checker` agent for fresh-context review. `--tools codex` is reinstated as an active adapter flag.
|
|
863
|
+
**GSDD (after this decision):** Codex CLI is promoted to `native_capable` — same tier as Claude Code and OpenCode. A dedicated `bin/adapters/codex.mjs` generates `.codex/agents/gsdd-plan-checker.toml` (read-only TOML agent with the plan-checker delegate). Codex's entry surface is the portable skill at `.agents/skills/gsdd-plan/SKILL.md` — Codex auto-discovers it via its `.agents/skills/` skill scanning ([developers.openai.com/codex/skills](https://developers.openai.com/codex/skills)). The portable skill now contains vendor-neutral checker invocation instructions (JSON schema, max-3 cycle loop, escalation) plus an explicit plan-only completion lock, so when Codex follows it, it spawns the native `gsdd-plan-checker` agent for fresh-context review and still requires a separate `$gsdd-execute` transition before implementation. `--tools codex` is reinstated as an active adapter flag.
|
|
845
864
|
|
|
846
865
|
**Why:** Codex CLI v0.115.0 (2026-03-16) stabilized its multi-agent system with `.codex/agents/*.toml` definitions, `spawn_agent` fresh-context invocation, per-agent `model` and `model_reasoning_effort` fields, and `sandbox_mode` access control. This provides structural parity with Claude's `.claude/agents/` and OpenCode's `.opencode/agents/`.
|
|
847
866
|
|
|
@@ -863,6 +882,7 @@ Implementation lives under `bin/lib/`:
|
|
|
863
882
|
- No deterministic spawn API — spawning is model-interpreted via natural language, not a programmatic `Task()` call
|
|
864
883
|
- GitHub issues #14719 (re-spawn failure) and #14841 (spawn loops with weaker models) are documented risks; GSDD's simple spawn-wait-pattern minimizes exposure, and the max-3 loop has escalation
|
|
865
884
|
- JSON schema duplication — the checker JSON schema is embedded in Claude, OpenCode orchestration prompts and the portable skill; tests guard drift across all surfaces
|
|
885
|
+
- Execution authorization must stay explicit — Codex and other runtimes must not infer implementation permission from generic imperative handoff text after `gsdd-plan`
|
|
866
886
|
- No Codex CLI in CI — future regressions still require disposable-fixture validation even though local live validation now exists
|
|
867
887
|
- Entry surface is shared — Codex uses the portable `.agents/skills/gsdd-plan/SKILL.md` as its entry surface (no vendor-specific skill path exists in Codex). The portable skill's checker invocation is vendor-neutral, but routing depends on Codex's implicit skill selection matching the task description
|
|
868
888
|
|
|
@@ -941,7 +961,9 @@ Implementation lives under `bin/lib/`:
|
|
|
941
961
|
| W7 | WARN | `distilled/DESIGN.md` health check table differs from implemented check IDs |
|
|
942
962
|
| W8 | WARN | `distilled/README.md` workflow inventory differs from `distilled/workflows/` |
|
|
943
963
|
| W9 | WARN | `.internal-research/gaps.md` references missing repo-local paths |
|
|
944
|
-
| W10 | WARN |
|
|
964
|
+
| W10 | WARN | ROADMAP/SPEC requirement status drift |
|
|
965
|
+
| W11 | WARN | Installed generated runtime surfaces drift from current render output |
|
|
966
|
+
| W12 | WARN | Planning state drifted since last recorded session (fingerprint mismatch) |
|
|
945
967
|
| I1 | INFO | Generation manifest `frameworkVersion` differs from current `FRAMEWORK_VERSION` |
|
|
946
968
|
| I2 | INFO | Phase completion count from ROADMAP |
|
|
947
969
|
| I3 | INFO | Which adapters are installed |
|
|
@@ -971,7 +993,7 @@ Implementation lives under `bin/lib/`:
|
|
|
971
993
|
|
|
972
994
|
**What was removed vs GSD:**
|
|
973
995
|
- `--repair` flag and associated repair actions
|
|
974
|
-
- Error codes E001-E005/W001-W007 (replaced with simpler E1-E8/W1-
|
|
996
|
+
- Error codes E001-E005/W001-W007 (replaced with simpler E1-E8/W1-W12/I1-I3)
|
|
975
997
|
- STATE.md checks (GSDD has no STATE.md per D7)
|
|
976
998
|
- PROJECT.md checks (GSDD uses SPEC.md, not checked by health — it's workflow-authored)
|
|
977
999
|
- Phase directory naming format checks (GSDD uses flat numbered files, not NN-name directories)
|
|
@@ -1245,7 +1267,7 @@ D12 established the session persistence design. D26 mechanically enforces the ro
|
|
|
1245
1267
|
|
|
1246
1268
|
**Problem:** Consumer testing (2026-03-21) revealed that AI agents completing a GSDD workflow go silent — the user must manually figure out which `/gsdd-*` command to run next. The lifecycle contract (`new-project → plan → execute → verify → [next phase]`) was correct in design but invisible in practice at each step boundary. GSD original solved this with explicit "Next Up" sections at the end of every workflow; GSDD lost this pattern during distillation.
|
|
1247
1269
|
|
|
1248
|
-
**Decision:** Add `<completion>` sections after `<success_criteria>` in all 9 terminal workflows. Add positional discipline gates (STOP instructions at exact deviation points) and mandatory persistence enforcement for critical artifacts.
|
|
1270
|
+
**Decision:** Add `<completion>` sections after `<success_criteria>` in all 9 terminal workflows. Add positional discipline gates (STOP instructions at exact deviation points) and mandatory persistence enforcement for critical artifacts. Preserve lifecycle order, but for `plan` make the boundary explicit: completion may name `/gsdd-execute` as the next workflow, while the current `gsdd-plan` run remains plan-only and does not authorize implementation.
|
|
1249
1271
|
|
|
1250
1272
|
**Changes:**
|
|
1251
1273
|
|
|
@@ -1277,7 +1299,7 @@ Consider clearing context before starting the next workflow for best results.
|
|
|
1277
1299
|
|
|
1278
1300
|
**Routing map (acyclic, complete):**
|
|
1279
1301
|
- `new-project` → `/gsdd-plan`
|
|
1280
|
-
- `plan` → `/gsdd-execute`
|
|
1302
|
+
- `plan` → separate `/gsdd-execute` run (routing only; no same-run execution authorization)
|
|
1281
1303
|
- `execute` → `/gsdd-verify` (if verifier enabled) or `/gsdd-progress`
|
|
1282
1304
|
- `verify` → `/gsdd-progress` (passed), `/gsdd-plan` (gaps), `/gsdd-verify` (human_needed)
|
|
1283
1305
|
- `audit-milestone` → `/gsdd-complete-milestone` (passed), `/gsdd-plan` (gaps/debt)
|
|
@@ -1713,18 +1735,20 @@ Sub-gap (b) was closed by D28's `<persistence>` mandate and guarded by G30. Sub-
|
|
|
1713
1735
|
|
|
1714
1736
|
**Problem:** The brownfield path was structurally incomplete. `map-codebase` generated useful orientation artifacts, but it routed users only toward full project initialization. `quick` remained blind to those same codebase maps, so brownfield users who wanted disciplined feature work without full roadmap ceremony had no first-class lane.
|
|
1715
1737
|
|
|
1716
|
-
**Decision:** Wire the existing brownfield lane instead of adding a new workflow.
|
|
1738
|
+
**Decision:** Wire the existing secondary brownfield lane instead of adding a new workflow.
|
|
1717
1739
|
|
|
1718
|
-
- `map-codebase` completion now offers two explicit next steps: `/gsdd-new-project` for full lifecycle setup and `/gsdd-quick` for brownfield feature work.
|
|
1719
|
-
- `
|
|
1740
|
+
- `map-codebase` completion now offers two explicit next steps: `/gsdd-new-project` for full lifecycle setup and `/gsdd-quick` for bounded brownfield feature work.
|
|
1741
|
+
- `map-codebase` completion now synthesizes an explicit brownfield routing summary from the existing 4 docs: safest next change lane, highest-risk zones, must-know traps, and the recommended workflow with rationale.
|
|
1742
|
+
- `quick` now reads `.planning/codebase/ARCHITECTURE.md`, `.planning/codebase/STACK.md`, `.planning/codebase/CONVENTIONS.md`, and `.planning/codebase/CONCERNS.md` when they exist and passes a summarized `$CODEBASE_CONTEXT` into the planner delegate.
|
|
1743
|
+
- `quick` stays structurally pure: it gains safer brownfield routing/context, not spec, roadmap, or research-lite behavior.
|
|
1720
1744
|
|
|
1721
|
-
**Why this shape:** The missing leverage was routing and context reuse, not another onboarding surface. Reusing the existing codebase map artifacts preserves the current workflow set, keeps quick mode lightweight, and gives brownfield users immediate architecture awareness without forcing full milestone ceremony.
|
|
1745
|
+
**Why this shape:** The missing leverage was routing and context reuse, not another onboarding surface. Reusing the existing codebase map artifacts preserves the current workflow set, keeps quick mode lightweight, and gives brownfield users immediate architecture, convention, and risk awareness without forcing full milestone ceremony.
|
|
1722
1746
|
|
|
1723
|
-
**Tradeoff:** This gives `quick` orientation, not full brownfield inference. It deliberately avoids turning quick mode into a lite `new-project`; the planner receives only a bounded summary from the codebase maps, not a new research phase.
|
|
1747
|
+
**Tradeoff:** This gives `quick` orientation, not full brownfield inference. It deliberately avoids turning quick mode into a lite `new-project`; the planner receives only a bounded summary from the codebase maps, not a new research phase and not a fifth persistent artifact. If the user cannot yet name the bounded change, the workflow should steer back to `new-project`.
|
|
1724
1748
|
|
|
1725
|
-
**GSD comparison:** GSD's brownfield posture is centered on the full project-initialization flow after mapping. GSDD keeps the full path available, but adds an explicit lighter-weight branch for feature-by-feature brownfield work.
|
|
1749
|
+
**GSD comparison:** GSD's brownfield posture is centered on the full project-initialization flow after mapping. GSDD keeps the full path available, but adds an explicit lighter-weight secondary branch for feature-by-feature brownfield work.
|
|
1726
1750
|
|
|
1727
|
-
**GSDD implementation:** `distilled/workflows/quick.md` (Step 2 codebase context, planner context), `distilled/workflows/map-codebase.md` (completion routing), `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
|
|
1751
|
+
**GSDD implementation:** `distilled/workflows/quick.md` (Step 2 codebase context, planner context, bounded-lane hardening), `distilled/workflows/map-codebase.md` (completion routing + brownfield routing summary), `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
|
|
1728
1752
|
|
|
1729
1753
|
**Evidence:**
|
|
1730
1754
|
|
|
@@ -1932,7 +1956,677 @@ Sub-gap (b) was closed by D28's `<persistence>` mandate and guarded by G30. Sub-
|
|
|
1932
1956
|
|
|
1933
1957
|
---
|
|
1934
1958
|
|
|
1935
|
-
##
|
|
1959
|
+
## D45 - Fork-Honest Launch Posture Before Identity Migration
|
|
1960
|
+
|
|
1961
|
+
**Decision (2026-04-15):** GSDD keeps a fork-honest launch posture until package, workspace, help, proof, and release surfaces are migrated together. `Workspine` is the active public-name target in planning truth, but do not present an independent product identity as already complete while the operative contracts remain `gsdd-cli`, `gsdd`, `gsdd-*`, and `.planning/`.
|
|
1962
|
+
|
|
1963
|
+
**Context:**
|
|
1964
|
+
- The v1.1 launch jury split repo truth into two layers: the core delivery kernel is real, but the public release surface still over-relied on internal and gitignored proof.
|
|
1965
|
+
- The next-milestone challenge pass found that `.planning/` is not a cheap cosmetic constant. It is a deep runtime, workflow, template, and test contract across the framework repo.
|
|
1966
|
+
- The same pass also found that a split public-name story layered on top of `gsdd-cli` / `gsdd` / `.planning` made the product look more independent than the install, workspace, and proof surfaces could honestly support.
|
|
1967
|
+
|
|
1968
|
+
**Decision:**
|
|
1969
|
+
- v1.2.0 is scoped as **fork-honest launch hardening**, not as an independent rename milestone.
|
|
1970
|
+
- `Workspine` is the primary public product name in planning truth for v1.2.0, but it is not yet a full package/workspace/help contract migration.
|
|
1971
|
+
- Keep `.planning`, `gsdd-cli`, `gsdd`, and `gsdd-*` intentionally in the active launch contract.
|
|
1972
|
+
- Remove or demote independent-brand assumptions from planning and public-surface truth until a dedicated migration milestone proves the full blast radius is handled.
|
|
1973
|
+
- Treat identity migration as real engineering work across code, docs, help text, generated surfaces, tests, and release packaging — not as copy cleanup.
|
|
1974
|
+
- Keep the release-floor packaging story repo-tracked and inspectable: package metadata, tarball audit, `SECURITY.md`, and repo-owned release automation must align without relying on unpublished release artifacts or broader runtime-parity claims.
|
|
1975
|
+
|
|
1976
|
+
**Why this fits the codebase:**
|
|
1977
|
+
- It preserves the already-shipped repo-native kernel and avoids turning a launch-hardening milestone into a hidden workspace/package migration.
|
|
1978
|
+
- It keeps product truth aligned with what the repo can actually prove today.
|
|
1979
|
+
- It narrows the next milestone to the highest-leverage launch debt: public identity coherence, public proof export, packaging truth, and post-archive routing integrity.
|
|
1980
|
+
|
|
1981
|
+
**Evidence:**
|
|
1982
|
+
- `.planning/SPEC.md` v1.2.0 active requirements and current-state posture
|
|
1983
|
+
- `.planning/ROADMAP.md` v1.2.0 Phase 23-27 ownership
|
|
1984
|
+
- `.internal-research/TODO.md` active milestone notes
|
|
1985
|
+
- `.internal-research/gaps.md` `I39`
|
|
1986
|
+
- `.internal-research/release-jury-verdict-2026-04-15.md`
|
|
1987
|
+
- `.internal-research/release-jury-public-truth-drift-2026-04-15.md`
|
|
1988
|
+
- `.internal-research/public-release-two-layer-brief-2026-04-15.md`
|
|
1989
|
+
- `get-shit-done/workflows/progress.md` (GSD's archived-state heuristic still assumes ROADMAP removal, which is one reason GSDD must be explicit when it diverges)
|
|
1990
|
+
|
|
1991
|
+
**Consequences:**
|
|
1992
|
+
- Public launch work must make proof inspectable from tracked/public artifacts instead of citing `.planning/` or `.internal-research/`.
|
|
1993
|
+
- `Northline` is retired as the default launch-facing brand direction; `Workspine` is the only active public-name target in planning truth until later phases prove the tracked public surface can support it honestly.
|
|
1994
|
+
- If a future session wants independent identity, it should open a dedicated migration milestone rather than sneaking the blast radius into generic launch cleanup.
|
|
1995
|
+
- Release packaging and repo-owner surfaces must stay aligned to current repo truth. If a package/help/release workflow change would reintroduce stale owner residue or parity overstatement, treat that as fork-honest launch drift rather than as harmless metadata cleanup.
|
|
1996
|
+
|
|
1997
|
+
**GSD comparison:** GSD keeps identity and workflow contracts coupled; its archived-state routing still assumes the active roadmap disappears. GSDD is diverging on archive-state persistence, so it must also stay explicit and conservative about identity/proof claims rather than layering a cosmetic product rename on top of unresolved contract differences.
|
|
1998
|
+
|
|
1999
|
+
**GSDD implementation:** `.planning/SPEC.md`, `.planning/ROADMAP.md`, `.internal-research/TODO.md`, `.internal-research/gaps.md`, `.internal-research/lessons-learned.md`
|
|
2000
|
+
|
|
2001
|
+
---
|
|
2002
|
+
|
|
2003
|
+
## D46 - Archived Milestone Routing With Retained ROADMAP
|
|
2004
|
+
|
|
2005
|
+
**Decision (2026-04-15):** `gsdd-progress` must treat a retained `ROADMAP.md` as historical archive state when the current roadmap milestone/version has both a shipped ledger entry in `.planning/MILESTONES.md` and the matching archived milestone audit artifact. In that state, the workflow routes to `/gsdd-new-milestone` rather than back to `/gsdd-audit-milestone`.
|
|
2006
|
+
|
|
2007
|
+
**Context:**
|
|
2008
|
+
- GSDD now retains `ROADMAP.md` after milestone completion as a historical shipped-summary surface instead of deleting it at archive time.
|
|
2009
|
+
- The older `progress.md` logic still treated "between milestones" as equivalent to "SPEC exists while ROADMAP is absent", which matched the stricter GSD archive model but no longer matched current repo truth.
|
|
2010
|
+
- That created I39: the same archived milestone could satisfy "all phases complete" and get routed back into audit even though `.planning/SPEC.md` and `.internal-research/TODO.md` already treated the milestone as archived.
|
|
2011
|
+
|
|
2012
|
+
**Decision:**
|
|
2013
|
+
- Keep the audit-ready branch for milestones whose phases are all complete but which do not yet have archive evidence.
|
|
2014
|
+
- Detect the archived-with-`ROADMAP.md` state from the current roadmap milestone/version plus:
|
|
2015
|
+
- a shipped ledger entry for that same milestone in `.planning/MILESTONES.md`
|
|
2016
|
+
- the matching archived milestone audit artifact for that same milestone/version
|
|
2017
|
+
- Only when both pieces of archive evidence exist does `progress.md` route to `/gsdd-new-milestone`.
|
|
2018
|
+
- Earlier archived milestones in the ledger must not satisfy the route for the current roadmap milestone/version.
|
|
2019
|
+
|
|
2020
|
+
**Why this fits the codebase:**
|
|
2021
|
+
- It preserves the retained `ROADMAP.md` design without pretending that "all phases complete" always means "run audit again".
|
|
2022
|
+
- It keeps the routing decision grounded in durable truth surfaces that already exist, rather than inventing a new milestone-state file.
|
|
2023
|
+
- It narrows the change to the high-frequency handoff seam and leaves milestone audit behavior intact for not-yet-archived milestones.
|
|
2024
|
+
|
|
2025
|
+
**Evidence:**
|
|
2026
|
+
- `.internal-research/gaps.md` `I39`
|
|
2027
|
+
- `.planning/MILESTONES.md`
|
|
2028
|
+
- `.planning/v1.1-MILESTONE-AUDIT.md`
|
|
2029
|
+
- `distilled/workflows/progress.md`
|
|
2030
|
+
- `tests/gsdd.guards.test.cjs`
|
|
2031
|
+
- `tests/gsdd.scenarios.test.cjs`
|
|
2032
|
+
- `tests/gsdd.health.test.cjs`
|
|
2033
|
+
- GSD comparison source: `get-shit-done/workflows/progress.md` (between-milestones routing still tied to ROADMAP absence)
|
|
2034
|
+
|
|
2035
|
+
**Consequences:**
|
|
2036
|
+
- Post-archive progress routing now depends on explicit archive evidence, not on `ROADMAP.md` deletion.
|
|
2037
|
+
- Health truth can stay strict: W9/W10 clear because repo truth is aligned, not because the checker semantics were weakened.
|
|
2038
|
+
- Future milestone-lifecycle changes that retain or restore historical roadmap files must preserve the current-milestone archive-evidence check.
|
|
2039
|
+
|
|
2040
|
+
**GSDD implementation:** `distilled/workflows/progress.md`, `.planning/MILESTONES.md`, `.planning/v1.1-MILESTONE-AUDIT.md`, `.internal-research/gaps.md`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`, `tests/gsdd.health.test.cjs`
|
|
2041
|
+
|
|
2042
|
+
---
|
|
2043
|
+
|
|
2044
|
+
## D47 - Brownfield Quick-Win Repair
|
|
2045
|
+
|
|
2046
|
+
**Decision (2026-04-16):** Keep the existing workflow set, but repair the brownfield contract end to end so the same story holds in docs, workflow routing, and progress reporting.
|
|
2047
|
+
|
|
2048
|
+
**Context:**
|
|
2049
|
+
- The earlier brownfield fix (D39) made `map-codebase -> quick` explicit, but the full user journey still had three contradictions:
|
|
2050
|
+
- public docs still over-taught `new-project` or implied users must always start brownfield work with `map-codebase`
|
|
2051
|
+
- `quick.md` depended on codebase maps when present but had no documented just-enough fallback when maps were absent
|
|
2052
|
+
- `progress.md` still treated codebase-only or quick-only repos as "no artifacts", so `map-codebase -> quick -> progress` was not a coherent lane
|
|
2053
|
+
- The user explicitly chose a quick win over a heavier product redesign: repair the existing lane now, and record the larger enterprise middle-lane question as follow-on work.
|
|
2054
|
+
|
|
2055
|
+
**Decision:**
|
|
2056
|
+
- `gsdd-new-project` remains the full initializer for greenfield work, fuzzy brownfield scope, or milestone-shaped work. It owns brownfield codebase mapping internally when the deeper baseline is needed.
|
|
2057
|
+
- `gsdd-quick` is now the documented bounded brownfield lane. It reuses `.planning/codebase/*` when present and otherwise builds a just-enough inline brownfield baseline from stable repo-root surfaces before planning.
|
|
2058
|
+
- `gsdd-map-codebase` remains the deeper orientation pass for unfamiliar or higher-risk brownfield repos. It is optional before `quick`, not a mandatory first step for every existing repo.
|
|
2059
|
+
- `gsdd-progress` keeps the same six route branches, but Branch F is broadened into a general non-phase state branch that covers:
|
|
2060
|
+
- between milestones
|
|
2061
|
+
- codebase-only brownfield state
|
|
2062
|
+
- quick-lane-only brownfield state
|
|
2063
|
+
- The heavier "durable enterprise middle lane" problem is explicitly deferred rather than being smuggled into `quick`.
|
|
2064
|
+
|
|
2065
|
+
**Why this shape:** The highest-leverage failure was contract drift, not missing workflow count. Repairing the existing lane preserves the current architecture, minimizes new surface area, and removes the onboarding contradiction without prematurely inventing a durable change-management workflow.
|
|
2066
|
+
|
|
2067
|
+
**Tradeoff:** This is intentionally not the full middle-lane redesign. `quick` is stronger and clearer now, but it still stays optimized for bounded work. Long-lived ticket/PBI continuity remains an explicit deferred product decision instead of silent scope creep inside `quick`.
|
|
2068
|
+
|
|
2069
|
+
**Evidence:**
|
|
2070
|
+
- `.planning/SPEC.md` `DX-03` and `BROWNFIELD-01`
|
|
2071
|
+
- `distilled/workflows/quick.md`
|
|
2072
|
+
- `distilled/workflows/progress.md`
|
|
2073
|
+
- `distilled/workflows/new-project.md`
|
|
2074
|
+
- `distilled/workflows/map-codebase.md`
|
|
2075
|
+
- `README.md`
|
|
2076
|
+
- `docs/USER-GUIDE.md`
|
|
2077
|
+
- `distilled/README.md`
|
|
2078
|
+
- `tests/gsdd.guards.test.cjs`
|
|
2079
|
+
- `tests/gsdd.scenarios.test.cjs`
|
|
2080
|
+
- `.internal-research/gaps.md` (`I43`)
|
|
2081
|
+
|
|
2082
|
+
**Consequences:**
|
|
2083
|
+
- New consumers no longer need to be told "always start with new-project, then maybe map-codebase, then maybe quick" for bounded brownfield work.
|
|
2084
|
+
- Brownfield onboarding, workflow routing, and status reporting now move together as one contract.
|
|
2085
|
+
- Any future change to brownfield entry must update the docs, workflow contracts, and status routing together instead of treating them as separate concerns.
|
|
2086
|
+
|
|
2087
|
+
**GSD comparison:** GSD keeps brownfield posture closer to the full initialization flow after mapping. GSDD now preserves that full path, but also treats bounded-change brownfield work as a first-class documented lane without adding a new workflow surface.
|
|
2088
|
+
|
|
2089
|
+
**GSDD implementation:** `distilled/workflows/quick.md`, `distilled/workflows/progress.md`, `distilled/workflows/new-project.md`, `distilled/workflows/map-codebase.md`, `README.md`, `docs/USER-GUIDE.md`, `distilled/README.md`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`, `.planning/SPEC.md`, `.internal-research/TODO.md`, `.internal-research/gaps.md`, `.internal-research/lessons-learned.md`
|
|
2090
|
+
|
|
2091
|
+
---
|
|
2092
|
+
|
|
2093
|
+
## D48 - Shared Lifecycle Evaluator And Dual-Canonical Runtime Boundary
|
|
2094
|
+
|
|
2095
|
+
**Decision (2026-04-16):** Phase and milestone posture should be derived through one shared evaluator over existing repo artifacts, while runtime-surface truth should use a dual-canonical contract that explicitly separates authored workflow source from the generated Codex-consumed surface until deterministic freshness checks exist.
|
|
2096
|
+
|
|
2097
|
+
**Context:**
|
|
2098
|
+
- v1.3.0 Phase 29 audited two different claim seams that had been conflated in planning truth:
|
|
2099
|
+
- lifecycle-state derivation from `SPEC.md`, `ROADMAP.md`, `MILESTONES.md`, phase artifacts, audit artifacts, and provenance
|
|
2100
|
+
- Codex/runtime-surface truth across `distilled/workflows/*` and generated `.agents/skills/*`
|
|
2101
|
+
- `bin/lib/health.mjs` and `bin/lib/health-truth.mjs` both carried overlapping lifecycle parsing logic, which made ENGINE-02 weaker than the docs suggested.
|
|
2102
|
+
- At the same time, the repo could not honestly keep saying there was one tracked canonical Codex/runtime surface, because `.agents/` is still ignored and the consumed runtime boundary can drift from the authored source boundary.
|
|
2103
|
+
|
|
2104
|
+
**Decision:**
|
|
2105
|
+
- Introduce one shared lifecycle evaluator seam for phase and milestone posture and make downstream health/reporting code consume it instead of maintaining competing parsers.
|
|
2106
|
+
- Keep lifecycle evaluation repo-truth-only: it reads existing planning artifacts plus provenance inputs and does not introduce a new project-scoped state file.
|
|
2107
|
+
- Narrow the runtime story to a **dual-canonical** contract:
|
|
2108
|
+
- `distilled/workflows/*` is the authored source contract
|
|
2109
|
+
- generated `.agents/skills/*` is the consumed Codex runtime surface
|
|
2110
|
+
- Treat deterministic freshness enforcement across authored and generated surfaces as later work, not as something Phase 29 can imply without proof.
|
|
2111
|
+
|
|
2112
|
+
**Why this fits the codebase:**
|
|
2113
|
+
- It matches the repo's existing architecture bias toward file-backed truth and shared helper enforcement instead of workflow-local prose.
|
|
2114
|
+
- It separates two different hardening seams cleanly: state derivation and runtime freshness.
|
|
2115
|
+
- It preserves the portable-core model without pretending generated runtime surfaces are already tracked or freshness-enforced when repo truth cannot prove that yet.
|
|
2116
|
+
|
|
2117
|
+
**Evidence:**
|
|
2118
|
+
- `.planning/SPEC.md` `ENGINE-01`, `ENGINE-02`, and `ENGINE-05`
|
|
2119
|
+
- `.planning/ROADMAP.md` Phases 29 and 32
|
|
2120
|
+
- `.internal-research/TODO.md`
|
|
2121
|
+
- `.internal-research/gaps.md` `I42`
|
|
2122
|
+
- `bin/lib/lifecycle-state.mjs`
|
|
2123
|
+
- `bin/lib/health.mjs`
|
|
2124
|
+
- `bin/lib/health-truth.mjs`
|
|
2125
|
+
- `tests/phase.test.cjs`
|
|
2126
|
+
- `tests/gsdd.health.test.cjs`
|
|
2127
|
+
- `tests/gsdd.guards.test.cjs`
|
|
2128
|
+
- GSD comparison source: `get-shit-done/workflows/progress.md` still assumes workflow-local routing logic rather than a shared lifecycle evaluator seam, so this is an intentional GSDD tightening.
|
|
2129
|
+
|
|
2130
|
+
**Consequences:**
|
|
2131
|
+
- Phase/milestone posture is now an engine seam with one evaluator, which later lifecycle gates can reuse directly.
|
|
2132
|
+
- Runtime-surface claims are more conservative immediately: the repo no longer needs to pretend one tracked canonical Codex surface exists before deterministic freshness enforcement is real.
|
|
2133
|
+
- Phase 32 now owns authored/generated freshness enforcement explicitly instead of inheriting that work as vague follow-through from Phase 29.
|
|
2134
|
+
|
|
2135
|
+
**GSDD implementation:** `bin/lib/lifecycle-state.mjs`, `bin/lib/health.mjs`, `bin/lib/health-truth.mjs`, `.planning/SPEC.md`, `.planning/ROADMAP.md`, `.internal-research/TODO.md`, `.internal-research/gaps.md`, `tests/phase.test.cjs`, `tests/gsdd.health.test.cjs`, `tests/gsdd.guards.test.cjs`
|
|
2136
|
+
|
|
2137
|
+
---
|
|
2138
|
+
|
|
2139
|
+
## D49 - Deterministic Lifecycle Preflight Gates
|
|
2140
|
+
|
|
2141
|
+
**Decision (2026-04-16):** Transition-sensitive lifecycle surfaces must derive eligibility from one deterministic preflight seam layered over the shared lifecycle evaluator, while `gsdd phase-status` remains the only explicit ROADMAP mutator and `progress` remains read-only.
|
|
2142
|
+
|
|
2143
|
+
**Context:**
|
|
2144
|
+
- Phase 29 centralized lifecycle posture into `bin/lib/lifecycle-state.mjs`, but the transition-sensitive workflows still described eligibility in workflow-local prose.
|
|
2145
|
+
- That left three risks open:
|
|
2146
|
+
- command entrypoints could grow a second lifecycle parser
|
|
2147
|
+
- transition-sensitive workflows could silently drift into inconsistent blockers or mutation rules
|
|
2148
|
+
- the read-only / owned-write / explicit-lifecycle-mutation split could blur again in docs or helpers
|
|
2149
|
+
- Phase 30 was explicitly scoped to turn the shared evaluator seam into deterministic preflight enforcement without widening into Phase 31 evidence typing or Phase 32 freshness enforcement.
|
|
2150
|
+
|
|
2151
|
+
**Decision:**
|
|
2152
|
+
- Add `bin/lib/lifecycle-preflight.mjs` as the single deterministic gate for lifecycle-sensitive workflow entry surfaces.
|
|
2153
|
+
- Keep the preflight seam descriptive and repo-truth-based:
|
|
2154
|
+
- it consumes the shared lifecycle evaluator
|
|
2155
|
+
- it reports blockers, owned writes, mutation expectations, and lifecycle posture
|
|
2156
|
+
- it does not mutate ROADMAP or milestone state itself
|
|
2157
|
+
- Keep `gsdd phase-status` as the only explicit ROADMAP mutator for phase-state transitions.
|
|
2158
|
+
- Require transition-sensitive workflow contracts to call the shared preflight seam instead of narrating their own lifecycle inference.
|
|
2159
|
+
- Preserve `progress` as read-only and make it explicitly defer any recommended transition back to the downstream workflow's own preflight gate.
|
|
2160
|
+
|
|
2161
|
+
**Why this fits the codebase:**
|
|
2162
|
+
- It extends the existing file-backed engine model rather than adding a new state artifact or hidden control plane.
|
|
2163
|
+
- It reuses the shared evaluator introduced in D48 instead of tolerating another lifecycle interpretation seam.
|
|
2164
|
+
- It keeps mutation boundaries honest: descriptive evaluation, owned artifact writes, and explicit lifecycle mutation remain separate responsibilities.
|
|
2165
|
+
|
|
2166
|
+
**Evidence:**
|
|
2167
|
+
- `.planning/SPEC.md` (`ENGINE-01`, `ENGINE-02`, `ENGINE-03`)
|
|
2168
|
+
- `.planning/ROADMAP.md` (Phase 30 success criteria)
|
|
2169
|
+
- `bin/lib/lifecycle-preflight.mjs`
|
|
2170
|
+
- `bin/lib/lifecycle-state.mjs`
|
|
2171
|
+
- `bin/gsdd.mjs`
|
|
2172
|
+
- `distilled/workflows/execute.md`
|
|
2173
|
+
- `distilled/workflows/verify.md`
|
|
2174
|
+
- `distilled/workflows/audit-milestone.md`
|
|
2175
|
+
- `distilled/workflows/complete-milestone.md`
|
|
2176
|
+
- `distilled/workflows/new-milestone.md`
|
|
2177
|
+
- `distilled/workflows/resume.md`
|
|
2178
|
+
- `distilled/workflows/progress.md`
|
|
2179
|
+
- `tests/phase.test.cjs`
|
|
2180
|
+
- `tests/gsdd.guards.test.cjs`
|
|
2181
|
+
- `tests/gsdd.scenarios.test.cjs`
|
|
2182
|
+
- GSD comparison source: `get-shit-done/workflows/progress.md` still keeps lifecycle routing inside the workflow surface rather than through a shared helper seam, so this is an intentional GSDD tightening.
|
|
2183
|
+
|
|
2184
|
+
**Consequences:**
|
|
2185
|
+
- Illegal transitions and missing prerequisite artifacts can now fail closed from one helper seam instead of from drifting prompt-local logic.
|
|
2186
|
+
- `progress` can continue reporting lifecycle posture without inheriting write authority or becoming a hidden transition surface.
|
|
2187
|
+
- Phase 31 can build evidence-gated closure on top of a stable deterministic preflight contract instead of competing lifecycle entry logic.
|
|
2188
|
+
|
|
2189
|
+
**GSDD implementation:** `bin/lib/lifecycle-preflight.mjs`, `bin/lib/lifecycle-state.mjs`, `bin/gsdd.mjs`, `bin/lib/init.mjs`, `distilled/workflows/execute.md`, `distilled/workflows/verify.md`, `distilled/workflows/audit-milestone.md`, `distilled/workflows/complete-milestone.md`, `distilled/workflows/new-milestone.md`, `distilled/workflows/resume.md`, `distilled/workflows/progress.md`, `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
|
|
2190
|
+
|
|
2191
|
+
---
|
|
2192
|
+
|
|
2193
|
+
## D50 - Evidence-Gated Closure Matrix
|
|
2194
|
+
|
|
2195
|
+
**Decision (2026-04-17):** Closure-sensitive lifecycle surfaces must share one compact evidence matrix keyed by workflow surface and delivery posture, using the fixed evidence kinds `code`, `test`, `runtime`, `delivery`, and `human`.
|
|
2196
|
+
|
|
2197
|
+
**Context:**
|
|
2198
|
+
- Phase 30 hardened lifecycle eligibility, but the closure surfaces still described proof in mismatched ways:
|
|
2199
|
+
- `verify.md` still used the older four-proof vocabulary
|
|
2200
|
+
- `audit-milestone.md` aggregated phase outcomes but did not record a shared closure posture
|
|
2201
|
+
- `complete-milestone.md` trusted a passed audit without checking whether the audit had actually proven the right kind of evidence for repo-only versus delivery-sensitive closeout
|
|
2202
|
+
- That created two opposite failure modes:
|
|
2203
|
+
- repo-only work could feel pressured to fabricate runtime or delivery proof just to satisfy prose
|
|
2204
|
+
- delivery-sensitive closure could pass on code inspection, tests, or human commentary alone even when the claim required runtime and delivery proof
|
|
2205
|
+
|
|
2206
|
+
**Decision:**
|
|
2207
|
+
- Add `bin/lib/evidence-contract.mjs` as the shared internal closure-evidence seam.
|
|
2208
|
+
- Fix the stable evidence kinds to `code`, `test`, `runtime`, `delivery`, and `human`.
|
|
2209
|
+
- Key the matrix by both:
|
|
2210
|
+
- closure surface (`verify`, `audit-milestone`, `complete-milestone`)
|
|
2211
|
+
- delivery posture (`repo_only`, `delivery_sensitive`)
|
|
2212
|
+
- Make `verify` record the selected delivery posture plus required, observed, and missing evidence kinds in its report contract.
|
|
2213
|
+
- Make `audit-milestone` aggregate the same evidence posture and fail closed when required kinds remain missing.
|
|
2214
|
+
- Make `complete-milestone` consume the audit's evidence contract instead of silently trusting a passed audit that lacks the required closure evidence.
|
|
2215
|
+
|
|
2216
|
+
**Why this fits the codebase:**
|
|
2217
|
+
- It follows the repo's existing pattern of small shared helpers plus file-backed workflow contracts instead of adding another freeform prompt convention.
|
|
2218
|
+
- It keeps repo-only work honest without pretending every closure needs runtime or delivery proof.
|
|
2219
|
+
- It raises the bar only where the claim itself is stronger: shipped or externally consumed outcomes now pay the stronger evidence cost explicitly.
|
|
2220
|
+
- It keeps the matrix internal and compact rather than inventing a second public mini-language for closure semantics.
|
|
2221
|
+
|
|
2222
|
+
**Evidence:**
|
|
2223
|
+
- `.planning/SPEC.md` (`ENGINE-04`, `VERIFY-01`)
|
|
2224
|
+
- `.planning/ROADMAP.md` (Phase 31 success criteria)
|
|
2225
|
+
- `bin/lib/evidence-contract.mjs`
|
|
2226
|
+
- `bin/lib/lifecycle-preflight.mjs`
|
|
2227
|
+
- `distilled/workflows/verify.md`
|
|
2228
|
+
- `distilled/workflows/audit-milestone.md`
|
|
2229
|
+
- `distilled/workflows/complete-milestone.md`
|
|
2230
|
+
- `tests/phase.test.cjs`
|
|
2231
|
+
- `tests/gsdd.guards.test.cjs`
|
|
2232
|
+
- `tests/gsdd.scenarios.test.cjs`
|
|
2233
|
+
- GSD comparison sources: `agents/_archive/gsd-verifier.md` and `agents/_archive/gsd-integration-checker.md` preserve outcome verification and integration audit, but they do not expose one typed closure matrix shared across phase verification, milestone audit, and milestone completion.
|
|
2234
|
+
|
|
2235
|
+
**Consequences:**
|
|
2236
|
+
- Closure-sensitive workflows now share one stable evidence vocabulary instead of drifting between proof synonyms.
|
|
2237
|
+
- Repo-only closures can stay repo-only without invented runtime theatrics.
|
|
2238
|
+
- Delivery-sensitive closure now has an explicit fail-closed bar: missing `runtime` or `delivery` evidence cannot be papered over by prose, code-only review, or human confirmation alone.
|
|
2239
|
+
- Milestone completion inherits the same evidence posture proven by audit, which reduces false-positive closure on technically incomplete release claims.
|
|
2240
|
+
|
|
2241
|
+
**GSDD implementation:** `bin/lib/evidence-contract.mjs`, `bin/lib/lifecycle-preflight.mjs`, `distilled/workflows/verify.md`, `distilled/workflows/audit-milestone.md`, `distilled/workflows/complete-milestone.md`, `.planning/SPEC.md`, `tests/phase.test.cjs`, `tests/gsdd.guards.test.cjs`, `tests/gsdd.scenarios.test.cjs`
|
|
2242
|
+
|
|
2243
|
+
---
|
|
2244
|
+
|
|
2245
|
+
## D51 - Deterministic Runtime Surface Freshness
|
|
2246
|
+
**Decision (2026-04-17):** Installed generated runtime-facing surfaces are trustworthy only through deterministic rendering from the authored workflow and delegate sources. When .agents/skills/, .claude/, .opencode/, or .codex/ exist locally, gsdd health must compare those generated files against current render output and route any drift back through gsdd update.
|
|
2247
|
+
**Context:**
|
|
2248
|
+
- Phase 29 narrowed the runtime story to a dual-canonical boundary: distilled/workflows/* is the authored source contract and generated runtime-facing files are the consumed local surfaces.
|
|
2249
|
+
- That narrowing was honest but still left I42 open because the repo could not yet prove that installed generated files stayed aligned with the current authored source without reviewer memory.
|
|
2250
|
+
- The framework repo also cannot fail closed on missing generated surfaces, because those directories are intentionally gitignored and may be absent even when the authored source is healthy.
|
|
2251
|
+
**Decision:**
|
|
2252
|
+
- Add one shared renderer-backed helper for runtime-surface freshness rather than per-test or per-runtime drift logic.
|
|
2253
|
+
- Compare only installed runtime surfaces; absent generated roots stay non-issues until the runtime surface actually exists locally.
|
|
2254
|
+
- Route drift through deterministic repair (gsdd update or a targeted gsdd update --tools <runtime>) instead of treating the fix as a manual review exercise.
|
|
2255
|
+
- Keep the public/runtime-facing wording brief: the authored source stays canonical, generated files are trusted because they are rendered and checked, and parity language remains narrow where live validation still does not exist.
|
|
2256
|
+
**Why this fits the codebase:**
|
|
2257
|
+
- It extends the existing render/update/health pattern instead of inventing a new state file or hidden synchronization layer.
|
|
2258
|
+
- It keeps the dual-canonical runtime contract honest: authored source and consumed generated files are distinct surfaces, but the boundary is now mechanically checked where the generated surface is actually installed.
|
|
2259
|
+
- It preserves framework-source honesty by warning only on installed drift, not on intentionally absent generated directories.
|
|
2260
|
+
**Evidence:**
|
|
2261
|
+
- .planning/SPEC.md (ENGINE-05)
|
|
2262
|
+
- .planning/ROADMAP.md (Phase 32)
|
|
2263
|
+
- .internal-research/gaps.md (I42 closure)
|
|
2264
|
+
- in/lib/runtime-freshness.mjs
|
|
2265
|
+
- in/lib/health.mjs
|
|
2266
|
+
- in/lib/health-truth.mjs
|
|
2267
|
+
- in/lib/rendering.mjs
|
|
2268
|
+
- in/adapters/claude.mjs, in/adapters/opencode.mjs, in/adapters/codex.mjs
|
|
2269
|
+
- README.md, docs/RUNTIME-SUPPORT.md, distilled/README.md
|
|
2270
|
+
- ests/phase.test.cjs, ests/gsdd.health.test.cjs, ests/gsdd.plan.adapters.test.cjs, ests/gsdd.guards.test.cjs, ests/gsdd.scenarios.test.cjs
|
|
2271
|
+
**Consequences:**
|
|
2272
|
+
- gsdd health can now surface installed generated-surface drift as deterministic workspace truth instead of relying on review discipline.
|
|
2273
|
+
- gsdd update becomes the explicit repair path for authored/generated runtime-surface drift.
|
|
2274
|
+
- Public support wording can stay compact without implying that generated files are trustworthy merely because they were generated once.
|
|
2275
|
+
- Claude Code and Codex CLI remain the mandatory live/native validation floor for the hardened runtime boundary, while other runtimes stay honest about their proof level.
|
|
2276
|
+
**GSD comparison:** GSD keeps runtime-facing workflow surfaces closer to the Claude-authored source and does not have to model a generated multi-runtime freshness boundary explicitly. GSDD does, because authored workflow source and consumed runtime surfaces are intentionally separated.
|
|
2277
|
+
**GSDD implementation:** in/lib/runtime-freshness.mjs, in/lib/health.mjs, in/lib/health-truth.mjs, in/lib/rendering.mjs, in/adapters/claude.mjs, in/adapters/opencode.mjs, in/adapters/codex.mjs, README.md, docs/RUNTIME-SUPPORT.md, distilled/README.md, .planning/SPEC.md, .internal-research/TODO.md, .internal-research/gaps.md, ests/phase.test.cjs, ests/gsdd.health.test.cjs, ests/gsdd.plan.adapters.test.cjs, ests/gsdd.guards.test.cjs, ests/gsdd.scenarios.test.cjs
|
|
2278
|
+
|
|
2279
|
+
---
|
|
2280
|
+
|
|
2281
|
+
## D52 - Generic Checkpoint Routing Ownership
|
|
2282
|
+
|
|
2283
|
+
**Decision (2026-04-17):** Generic checkpoints remain visible continuity artifacts, but they do not block read-only `progress` routing. `resume` owns checkpoint cleanup only when the user explicitly resumes from the checkpoint, while `progress` treats a surviving generic checkpoint as informational context and continues routing toward the real next lifecycle action.
|
|
2284
|
+
|
|
2285
|
+
**Context:**
|
|
2286
|
+
- Phase 19 intentionally allowed `resume` to preserve a generic checkpoint when the user chose a different path, because generic checkpoints can carry real context without pretending to be an active phase or quick-task execution surface.
|
|
2287
|
+
- That same flexibility exposed a later contradiction: `progress` still treated any `.continue-here.md` as a Branch A reroute back to `/gsdd-resume`, so a generic checkpoint could create a `resume -> progress -> resume` loop even after `resume` had already surfaced the checkpoint and routed the user onward.
|
|
2288
|
+
- Phase 33 was scoped narrowly to repair that control-plane seam without inventing a new checkpoint artifact, a broader checkpoint-consumption protocol, or a heavier brownfield/middle-lane redesign.
|
|
2289
|
+
|
|
2290
|
+
**Decision:**
|
|
2291
|
+
- Add one shared checkpoint-routing classification seam in `bin/lib/provenance.mjs`:
|
|
2292
|
+
- `phase` and `quick` checkpoints are routing blockers
|
|
2293
|
+
- `generic` checkpoints are informational for read-only `progress` routing
|
|
2294
|
+
- checkpoint cleanup remains resume-owned when the user explicitly resumes from the checkpoint
|
|
2295
|
+
- Keep `resume` behavior unchanged in one important respect: generic checkpoints still surface their `next_action` and let the user decide whether to resume from them.
|
|
2296
|
+
- Change `progress` behavior explicitly:
|
|
2297
|
+
- show a generic checkpoint in the status block
|
|
2298
|
+
- surface its `next_action`
|
|
2299
|
+
- continue evaluating Branch B-F for the primary recommendation instead of routing back through Branch A
|
|
2300
|
+
- Regenerate the consumed skill surfaces from the authored workflow source so the portable contract and local runtime surface stay aligned.
|
|
2301
|
+
|
|
2302
|
+
**Why this fits the codebase:**
|
|
2303
|
+
- It preserves the existing checkpoint artifact model and the three-layer continuity boundary instead of inventing another state file or destructive auto-cleanup step.
|
|
2304
|
+
- It keeps `progress` read-only and avoids pushing reporting semantics into lifecycle preflight, which would blur the distinction between routing/reporting and mutation authorization.
|
|
2305
|
+
- It moves the ownership split into one small shared seam plus tests, so the rule is no longer dependent on remembering two different workflow wordings.
|
|
2306
|
+
|
|
2307
|
+
**Evidence:**
|
|
2308
|
+
- `.planning/SPEC.md` (`ENGINE-01`, `ENGINE-03`)
|
|
2309
|
+
- `.internal-research/gaps.md` (`I45`)
|
|
2310
|
+
- `bin/lib/provenance.mjs`
|
|
2311
|
+
- `distilled/workflows/resume.md`
|
|
2312
|
+
- `distilled/workflows/progress.md`
|
|
2313
|
+
- `.agents/skills/gsdd-resume/SKILL.md`
|
|
2314
|
+
- `.agents/skills/gsdd-progress/SKILL.md`
|
|
2315
|
+
- `tests/phase.test.cjs`
|
|
2316
|
+
- `tests/gsdd.guards.test.cjs`
|
|
2317
|
+
- `tests/gsdd.scenarios.test.cjs`
|
|
2318
|
+
- GSD comparison source: GSD session-routing surfaces assume the checkpoint itself is the dominant continuity signal. GSDD now keeps that behavior only for real execution checkpoints (`phase`, `quick`) and treats generic checkpoints as context once the user has already been routed onward.
|
|
2319
|
+
|
|
2320
|
+
**Consequences:**
|
|
2321
|
+
- A surviving generic checkpoint can coexist with milestone-close or next-phase guidance without forcing the user back into `/gsdd-resume`.
|
|
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.
|
|
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.
|
|
2324
|
+
|
|
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
|
|
1936
2630
|
|
|
1937
2631
|
This document is updated when:
|
|
1938
2632
|
|