diff --git a/.changeset/3638-bracket-display.md b/.changeset/3638-bracket-display.md deleted file mode 100644 index 46821f802..000000000 --- a/.changeset/3638-bracket-display.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Added -pr: 4111 ---- -**Opted-in bracket phase IDs now render consistently on progress surfaces** — `progress`, `stats`, manager init, and both statusline formats display canonical `[CODE.MM] NN` identities only when `phase_id_convention` is exactly `"bracket"`; other conventions retain their existing patterns and output shape. `config-set` now validates the convention's three supported values. (#3638) diff --git a/.changeset/4668-state-write-intent-surface.md b/.changeset/4668-state-write-intent-surface.md deleted file mode 100644 index 62ff14df8..000000000 --- a/.changeset/4668-state-write-intent-surface.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: Changed -pr: 4676 ---- - -Internal (ADR-4629 section 8.1, epic #4629 child C1): introduce the `StateWriteIntent` type, extending `StateTransaction`, and a `readModifyWriteStateMd` opaque-transform recognition capability in the STATE.md write-path drift guard. This is the foundation for verified, bounded STATE.md writes. No user-facing behavior changes and no caller is migrated (that is Phase 2 and later). diff --git a/.changeset/4683-threat-id-uniqueness.md b/.changeset/4683-threat-id-uniqueness.md deleted file mode 100644 index c5ebe6b8a..000000000 --- a/.changeset/4683-threat-id-uniqueness.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Fixed -pr: 4828 ---- -**Gap-closure plans can no longer silently reuse threat IDs that earlier plans in the same phase already assigned** — a `--gaps` re-plan numbered its `` registers from `T-{phase}-01` again, so the new plans claimed IDs that earlier plans had already given to different threats, and nothing detected it: `/gsd-secure-phase` builds `SECURITY.md` rows and `VALIDATION.md` carries a Threat Ref column keyed on that ID, leaving every consumer ambiguous. `init execute-phase` and `init plan-phase` now report cross-plan duplicates (`threat_id_duplicates` / `threat_id_duplicate_count` — register rows only, never prose; the reserved `T-{phase}-SC` row is exempt since every plan keeps it; superseded plans don't hold IDs against their replacements), execute-phase hard-stops on a non-empty list before dispatching any executor, and the planner (agent template + `planner-gap-closure.md` §9) is instructed to continue numbering after the phase's highest in-use `T-{phase}-NN`. (#4683) diff --git a/.changeset/4685-verify-artifacts-directory.md b/.changeset/4685-verify-artifacts-directory.md deleted file mode 100644 index aabc760ce..000000000 --- a/.changeset/4685-verify-artifacts-directory.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Fixed -pr: 4735 ---- -`verify.artifacts` no longer aborts a plan's whole artifact check when one listed path is a directory. Reading a directory raised `EISDIR` out of the per-artifact loop, so the command printed `Error: EISDIR: illegal operation on a directory, read` and reported nothing at all — neither the offending entry nor the plan's other, perfectly checkable artifacts. A directory now fails as its own entry, with an issue distinct from `File not found`, and every other artifact is still checked and reported independently. A path that stat or read fails on for any other reason (a permissions error, an unreachable mount, or an artifact that disappears mid-check) fails the same way, carrying its errno, instead of discarding the run. diff --git a/.changeset/4836-graphify-cli-first-graph-queries.md b/.changeset/4836-graphify-cli-first-graph-queries.md deleted file mode 100644 index 7781a5858..000000000 --- a/.changeset/4836-graphify-cli-first-graph-queries.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Changed -pr: 4874 ---- -**The planner and the phase researcher now query the knowledge graph through the `graphify` CLI when it is on `PATH`, falling back to the built-in reader otherwise** — the planner gets one graph query per phase and the researcher two or three, and that single shot decides which modules the plan treats as related, and therefore how tasks are ordered into waves. It was spent on `seedAndExpand`, which seeds by case-insensitive substring match over a node label and description and then expands a hardcoded two hops: the phase "User Authentication" seeds on `author`, `authoring` and `unauthorized` with the same weight as `authenticate`, and when the inflated payload exceeds `--budget` the trimmer drops edges by confidence tier. The CLI, already a hard dependency of `/gsd-graphify build`, ranks seeds (IDF weighting, trigram fuzzy matching) and context-filters before traversal; the planner additionally runs `graphify affected`, reverse traversal for the exact question its reference states as its own goal, which the built-in reader has no equivalent for and which is skipped on the fallback path. The branch is `command -v graphify`, the same degradation shape already used for Context7 to `ctx7` — no new config key (a graph can only exist if the binary built it, so binary presence is a self-satisfying gate) and no new tool grant (both agents already have `Bash`). `gsd-tools graphify status` now returns `graph_path`, the resolved absolute graph location, on both the present and the missing branch: the CLI takes the graph as `--graph`, and re-deriving `.planning/graphs/graph.json` would point it at a non-existent local mirror in exactly the umbrella multi-repo setup `graphify.graph_path` (#1825) exists to serve — for the same reason the presence gate in both prompts is now the `status` call rather than a bare `ls`, which was already blind to the override. Declared limit: the two paths return different shapes (CLI prose with no `--json`, built-in JSON with confidence tiers and `budget_met`/`budget_estimate`) and `--budget` counts rendered output on one and estimated payload bytes on the other; both prompts state this instead of implying a stable shape. With `graphify` absent from `PATH` the injected context is byte-identical to before. (#4836) diff --git a/.changeset/agile-cranes-bark.md b/.changeset/agile-cranes-bark.md deleted file mode 100644 index 1170670de..000000000 --- a/.changeset/agile-cranes-bark.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Fixed -pr: 4723 ---- -**Commits are no longer blocked when a project configures a large `commit_types` list** — the commit validator built one regular expression out of every configured type, and on macOS (bash 3.2 / BSD libc) that pattern stopped compiling past roughly 6,000 types. The validator reported the compile failure as "this message is not a Conventional Commit" — rejecting a valid `feat(auth): …` while listing `feat` among the valid types it printed. At the same payload the hook could also abort outright with a broken-pipe error instead of returning a verdict. Linux (glibc) has no comparable limit and was never affected by this half. Both paths are fixed and now covered by regression tests. (#4429) diff --git a/.changeset/agile-ibex-chatter.md b/.changeset/agile-ibex-chatter.md deleted file mode 100644 index d2165fd7a..000000000 --- a/.changeset/agile-ibex-chatter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Removed -pr: 4716 ---- -**Retired the Gemini CLI reviewer lane** — Google stopped serving Gemini CLI for free/Pro/Ultra on 2026-06-18, so `/gsd-review --gemini` spawned a binary that no longer answers for most users. The `--gemini` flag, its three `review.*.gemini` config keys, and its documentation in all five locales are gone; Antigravity's `--agy` lane already covers the Google slot. `gsd config-set review.models.gemini` now reports an unknown key — an existing key in `.planning/config.json` still parses and is simply never read. (#4709) diff --git a/.changeset/bold-badgers-march.md b/.changeset/bold-badgers-march.md deleted file mode 100644 index ac80a8b7f..000000000 --- a/.changeset/bold-badgers-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Fixed -pr: 4896 ---- -**verification status and frontmatter get distinguish unparseable YAML from a missing report** — a VERIFICATION.md whose frontmatter has a YAML syntax error was reported as status "missing" (sending the operator to re-run execute-phase, which cannot fix a YAML typo), and frontmatter get answered "Field not found"; both now report a distinct parse error. (#4806) diff --git a/.changeset/bold-bears-zip.md b/.changeset/bold-bears-zip.md deleted file mode 100644 index 623fc7df4..000000000 --- a/.changeset/bold-bears-zip.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: Changed -pr: 4912 ---- -**`checkpoint:decision` auto-selection is now opt-in via `auto_select`** — in auto-mode, a decision checkpoint with no `auto_select=""` attribute now escalates to a human instead of silently picking the first `