* docs(en): update FEATURES/USER-GUIDE/COMMANDS for v1.40.0 surface - FEATURES.md: append v1.40.0 section (#122 skill consolidation, #123 namespace meta-skills, #124 context-window guard, #125 phase-lifecycle status-line read-side); add to TOC. - USER-GUIDE.md: add slash-command form (hyphen vs colon) primer and namespace routing primer; replace deleted slash forms in walkthroughs (`/gsd-add-backlog`, `/gsd-plant-seed`, `/gsd-add-phase`, `/gsd-set-profile`, `/gsd-list-workspaces`, etc.) with consolidated forms (`/gsd-capture --backlog`, `/gsd-phase --insert`, `/gsd-config --profile`, `/gsd-workspace --list`, etc.); fix `/gsd-spike-wrap-up` and `/gsd-sketch-wrap-up` to flag form. - COMMANDS.md: clarify Command Syntax (Gemini = colon form, others = hyphen form); add Namespace Meta-Skills section with all six routers; add `--context` to /gsd-health flag table. Refs #3047 * docs(en): refresh INVENTORY/CLI-TOOLS/STATE-MD-LIFECYCLE for v1.40.0 - INVENTORY.md: workflow-row "Invoked by" column updated to point at consolidated commands (`/gsd-phase` family, `/gsd-workspace --list`, `/gsd-config --advanced/--integrations/--profile`, `/gsd-sketch --wrap-up`, `/gsd-spike --wrap-up`); CLI-modules row for `secrets.cjs` updated to `/gsd-config --integrations`. Command count and namespace meta-skills section already reflect 65 shipped (= 59 consolidated sub-skills + 6 ns-* routers). - CLI-TOOLS.md: add `validate context` row under Validation Commands with the 60 %/70 % threshold envelope used by `/gsd-health --context`. - STATE-MD-LIFECYCLE.md: flip status header from "proposed" to "shipped in v1.40.0" since `parseStateMd()` and `formatGsdState()` now read and render `active_phase`, `next_action`, `next_phases`, and `progress`. `docs/AGENTS.md` audited and verified clean — `gsd-code-fixer` row already lists the correct `/gsd-code-review --fix` spawner; no deleted-skill references found. `docs/INVENTORY-MANIFEST.json` audited and verified clean — already enumerates the 65 commands (including six ns-* routers) and contains no deleted slash forms. Refs #3047 * docs(en): cleanup ARCHITECTURE/CONFIGURATION for v1.40.0 - ARCHITECTURE.md: split Commands install-target list to call out the Gemini colon form (`/gsd:command-name`) vs hyphen form for every other runtime. Add a new subsection covering two-stage hierarchical routing via the six namespace meta-skills (#2792) and a paired note on the MCP token-budget interaction so readers see the two big per-turn cost levers in one place. - CONFIGURATION.md: rewrite three references to the deleted `/gsd-settings-advanced` and `/gsd-settings-integrations` slash forms to use the consolidated `/gsd-config --advanced` / `/gsd-config --integrations` invocations. Add a new "STATE.md Frontmatter (Phase Lifecycle)" section documenting the four optional fields (`active_phase`, `next_action`, `next_phases`, `progress`) read by the v1.40 status-line, with a pointer to STATE-MD-LIFECYCLE.md for the full reference. `docs/manual-update.md` audited and verified clean — already documents `/gsd-update --reapply` (the consolidated form), no reference to the deleted `/gsd-reapply-patches`. Refs #3047 * docs(i18n): mirror v1.40.0 slash-command rename into ja-JP/ko-KR/zh-CN/pt-BR Mechanical token-level renames only — every reference to a deleted micro-skill slash form is rewritten to the consolidated form on the matching parent skill. No prose was machine-translated; new prose sections (slash-form primer, namespace routing primer, v1.40 feature entries, STATE.md frontmatter) were left for human translator follow-up. Renames applied uniformly across all four trees: /gsd-add-todo, /gsd-add-note, /gsd-add-backlog, /gsd-plant-seed, /gsd-check-todos → /gsd-capture[ --note| --backlog|--seed|--list] /gsd-add-phase, /gsd-insert-phase, /gsd-remove-phase, /gsd-edit-phase → /gsd-phase[ --insert| --remove|--edit] /gsd-new-workspace, /gsd-list-workspaces, /gsd-remove-workspace → /gsd-workspace[ --new| --list|--remove] /gsd-settings-advanced, /gsd-settings-integrations, /gsd-set-profile → /gsd-config[ --advanced| --integrations|--profile] /gsd-sketch-wrap-up → /gsd-sketch --wrap-up /gsd-spike-wrap-up → /gsd-spike --wrap-up /gsd-reapply-patches → /gsd-update --reapply /gsd-code-review-fix → /gsd-code-review --fix /gsd-plan-milestone-gaps → /gsd-audit-milestone Refs #3047 * docs(changelog): regroup [Unreleased] under Feature/Enhancement/Fix Replace the existing Keep-a-Changelog \`Added\` / \`Changed\` / \`Performance\` / \`Removed\` / \`Fixed\` sub-headers in the [Unreleased] block with the issue/PR template taxonomy: Added → Feature Changed / Performance → Enhancement Removed → Enhancement Fixed → Fix Order within the release: Feature → Enhancement → Fix. Every bullet preserved verbatim — only headers and grouping changed; the awkward inline-versioned headers (\`### Added — 1.40.0-rc.1\`, \`### Changed — 1.40.0-rc.1\`, \`### Fixed — 1.40.0-rc.1\`) folded into the same buckets with the \`— 1.40.0-rc.1\` suffix dropped, since the [Unreleased] block IS 1.40.0-rc.1. The [1.39.2] hotfix block called out in #3047's spec does not yet exist in CHANGELOG.md (the previously released hotfix is [1.39.1]), so this commit only regroups [Unreleased]. Older release blocks ([1.39.1] and earlier) are frozen and untouched. Refs #3047 * docs(changeset): add fragment for v1.40.0 doc audit Refs #3047 * docs(en): strip leading / from deleted slash-command tokens in FEATURES REQ-CONSOLIDATE-03 and REQ-CONSOLIDATE-04 listed deleted commands by their `/gsd-foo` form for the historical record. The docs-parity tests in bug-3010, bug-3029-3034, and bug-3042-3044 use the regex `/\/gsd-[a-z0-9][a-z0-9-]*/g` to scan user-facing surfaces for any remaining mention of removed slash forms — they cannot tell prose about a deleted command from a live recommendation. Strip the leading slash from the bare-name references (preserve the historical text otherwise). Tests now require a `/` prefix to match, so `gsd-add-todo` reads identically to a human but no longer trips the parser. Verified locally: 65/65 tests pass across the three docs-parity suites that were red on CI run 25270072600. Refs #3047 * docs(en): fix CR feedback + drop literal /gsd:plan-phase from USER-GUIDE CI: tests/bug-2543-gsd-slash-namespace.test.cjs flagged docs/USER-GUIDE.md:35 for embedding the literal `/gsd:plan-phase` token in the parenthetical Gemini-form example. The test scans every .md under docs/ for `/gsd:<live-cmd>` because non-Gemini surfaces must not advertise the colon form. Replaced the literal example with a prose substitution rule. CR: docs/ARCHITECTURE.md:125 — the namespace meta-skills were listed by file-prefix (`gsd-ns-workflow`) but the invocable frontmatter `name:` is the bare form (`gsd-workflow`). Verified against the six `commands/gsd/ns-*.md` files. Replaced with the canonical names and noted the file/name disagreement in-line. CR: docs/COMMANDS.md:723 — `v1.40` aligned to canonical `v1.40.0`. CR: docs/FEATURES.md:2679 — REQ-CTX-GUARD-02 advertised the wrong invocation (`gsd-tools validate context`). The shipped handler is exposed via `gsd-sdk query validate.context` and requires explicit `--tokens-used <int>` + `--context-window <int>` flags (verified against sdk/src/query/validate.ts:849-882 and get-shit-done/bin/lib/validate-command-router.cjs:19-36). CR: docs/zh-CN/README.md:533 — added `inherit` to the profile-options parenthetical to match the canonical set (verified against model-profiles.cjs:29 `VALID_PROFILES = […MODEL_PROFILES['gsd-planner'], 'inherit']`). Verified locally: 74/74 tests pass across the four docs-parity suites that were red on CI runs 25270072600 and 25270182903. Refs #3047
7.5 KiB
STATE.md Phase Lifecycle Frontmatter
Status: Read-side shipped in v1.40.0 (issue #2833).
parseStateMd()reads the four frontmatter fields below andformatGsdState()renders the in-flight / idle / progress scenes. SDK write-side support to maintain the fields automatically is tracked separately.
GSD's STATE.md carries YAML frontmatter that the status-line hook reads on
every render. This document describes the phase-lifecycle fields and the
rendering scenes they trigger.
All four lifecycle fields are optional and additive. Existing STATE.md
files (without these fields) keep rendering exactly as they did before — no
visual change, no migration required.
Frontmatter fields
---
gsd_state_version: 1.0
milestone: v2.0 # existing
milestone_name: Code Quality # existing
status: in_progress # existing — see "status semantics" below
# Phase-lifecycle additions (issue #2833) — all optional
active_phase: null # phase number when an orchestrator is in flight
next_action: execute-phase # next recommended command when idle
next_phases: ["4.5"] # phases that next_action applies to (1-2 ids)
progress: # nested block (existing key, percent now opt-in for the bar)
total_phases: 17
completed_phases: 10
percent: 59
---
Field reference
| Field | Type | When populated | When null/absent |
|---|---|---|---|
active_phase |
string (e.g. "4.5") |
An orchestrator command is in flight on this phase | Idle between phases |
next_action |
string | Idle, with a recommended command (discuss-phase / plan-phase / execute-phase / verify-phase) |
An orchestrator is in flight, OR no recommendation available |
next_phases |
YAML flow array (e.g. ["4.5"]) |
Goes with next_action — phases the action applies to |
Same as above |
progress.percent |
integer 0-100 | Milestone progress in phase dimension (completed_phases / total_phases) |
Bar rendering is opt-in — absent → no bar |
next_phases parser scope
Only single-line YAML flow is parsed: next_phases: ["4.5", "4.6"].
Block sequences over multiple lines (- 4.5\n - 4.6) are intentionally
not parsed — the status-line only needs the primary recommendation, and a
single-line array keeps the regex-based parser predictable. If a project needs
to track many candidate next phases for documentation purposes, store the
extra ones in the STATE.md body.
progress.percent dimension
The bar rendered next to the milestone version reflects phase completion
(completed_phases / total_phases), not plan completion.
Plan dimension (completed_plans / total_plans) trends optimistic for any
project where future phases haven't been planned yet — total_plans only
counts plans inside already-planned phases, so the denominator is
structurally smaller than reality. Reporting that number to stakeholders
overstates progress.
If a project wants to show plan-level progress somewhere, store it elsewhere
in frontmatter or the body — the status-line bar is reserved for the
phase-dimension number that matches ROADMAP.md progress tables and
MILESTONES.md.
Status-line rendering scenes
formatGsdState() checks the lifecycle fields in the order below and emits
the first matching scene. If none match, the renderer falls through to
the original <status> · <phase> format (byte-for-byte unchanged from
v1.38.x).
| Scene | Trigger | Display |
|---|---|---|
| 1. Phase active | active_phase populated |
v2.0 [██░░░] X% · Phase 4.5 executing |
| 2. Idle, next recommended | active_phase null AND next_action + next_phases populated |
v2.0 [██░░░] X% · next execute-phase 4.5 |
| 3. Milestone complete | percent: 100 OR completed_phases == total_phases |
v2.0 [██████████] 100% · milestone complete |
| 4. Default fallback | None of the above | v1.9 Code Quality · executing · ph (1/5) (existing format) |
Scene priority example
When both active_phase and next_action are populated, Scene 1 wins —
an orchestrator is in flight, so any "next recommendation" would be misleading.
This is enforced by check order in formatGsdState() and by tests in
tests/enh-2833-phase-lifecycle-statusline.test.cjs (suite "scene priority").
Stage labels in Scene 1
In Scene 1, the second part of Phase 4.5 <stage> is whichever value is in
the status field at that moment. The convention proposed in issue #2833
is to use the lifecycle stage:
| Command | status value while in flight |
|---|---|
/gsd-discuss-phase |
discussing |
/gsd-plan-phase |
planning |
/gsd-execute-phase |
executing |
/gsd-verify-phase |
verifying |
If status is left at in_progress (the milestone-level value), Scene 1
renders just Phase 4.5 without the stage suffix.
Frontmatter parsing constraints
The status-line hook uses regex-based parsing (no full YAML library), so a few constraints apply:
-
Frontmatter must start at the very first character of the file. Anything (including comments) above the opening
---invalidates the match. The opening---line must be exactly that — no trailing spaces. -
Comments inside nested blocks are not supported. The parser for
progress:requires the next line to be[ \t]+\w+:— inserting# commentbetweenprogress:and the first key breaks the match and the bar disappears. Put any documentation in the body ofSTATE.md, not inside frontmatter blocks. -
next_phasesaccepts only single-line flow format. See the parser scope note above.
These constraints are tested in
tests/enh-2833-phase-lifecycle-statusline.test.cjs. If a future change
swaps the regex parser for a real YAML library, the constraints can be
relaxed and the tests updated accordingly.
Backward compatibility
This document describes additive fields. The promise is:
- A
STATE.mdfile with none of the lifecycle fields populated renders byte-for-byte identically to v1.38.x and earlier. - Adding any lifecycle field is opt-in per project — the renderer falls through to the existing format when fields are absent.
- The progress bar is opt-in even when
progressblock exists — onlyprogress.percenttriggers the bar;total_phases/completed_phasesalone don't.
The formatGsdState #2833 backward compatibility test suite locks this
guarantee in: any change that breaks legacy STATE.md rendering will fail
the suite.
Related issues / PRs
- #1989 — enhancement: surface GSD state in statusline. The foundation
this proposal extends. Established that
STATE.mdfrontmatter drives the status-line. - #2833 — enhancement: phase-lifecycle status-line — auto-rotate STATE.md frontmatter as phase orchestrators progress. This document describes the read-side spec from that issue. Write-side SDK / workflow changes to auto-maintain the fields are tracked separately so each piece can be reviewed independently.
Companion read-side issues this proposal also helps close (each fixed a specific symptom of the same gap):
- #1102 — STATE.md frontmatter plan counts only update on plan completion
- #1103 — STATE.md status / last_activity not updated when a phase starts
- #1446 / #1572 — phase complete doesn't update Plans column
- #612 — ROADMAP.md not updating
- #956 — planning document drift across core workflows
- #2018 — verify-work doesn't auto-transition (fixed for verify only)