* enhance(#4139): Phase 8 — the toggle becomes discoverable, and the ledger closes ADR-4139's final phase. workflow.compact_content already defaulted to false (Phase 1's buildNewProjectConfig hardcoded default), but nothing surfaced it: /gsd-new-project never asked, and /gsd-settings/config had no toggle path for an already-initialized project — config-set/config-get were the only route. new-project.md gains a fourth question in the existing Round 2 AskUserQuestion array (grouped with the other general-workflow-behavior toggles, not the per-agent capability questions above it) and threads compact_content into the config-new-project CLI JSON literal. settings.md mirrors the exact pattern every other non-capability workflow.* key already follows: read_current bullet, question block, update_config write, the safe-merge non-capability-keys list, save_as_defaults, and the confirm summary table — seven edits, zero new src/*.cts code, since Phase 1's merge logic is a generic passthrough. Its success_criteria question-count ("24 settings") is bumped to 25 to match the now-25-entry main AskUserQuestion batch. settings-advanced.md deliberately does NOT get a duplicate question: no other boolean toggle in this repo is asked in both settings.md and settings-advanced.md, and there's no reason to start with this one. docs/CONFIGURATION.md, docs/USER-GUIDE.md, and a new docs/features/4139-compact- content.md fragment (regenerated into docs/FEATURES.md) document the toggle. ADR-4139 itself: Status flips Proposed -> Accepted, the acceptance-criteria section becomes a guard ledger — a 13-row table covering all 12 of #4139's original checkboxes plus the shipped-content guard criterion, each with real evidence (the merged PR that satisfied it, fetched via `gh issue view --json closedByPullRequestsReferences` rather than asserted from phase numbers) — and both "Open questions for the implementation phases" are resolved rather than left dangling: discuss-phase was never converted to spine+detail shape (verified: no detail/ subdir exists) — a genuine gap, not a reasoned decline; the disjointness check is confirmed line-based by reading compact-content-split.cjs's normalizeNonTrivialLines directly. Orthogonal review (isolated Standards/Spec code-review + security-review sub-agents) found and this fixes two real defects: the changeset fragment's body didn't match CONTRIBUTING.md's single em-dash-sentence format (was multi-sentence prose naming implementation file paths); and settings.md's own success_criteria still said "24 settings" after the new question pushed the main batch to 25. Also fixed, found by the Spec pass while confirming commands/gsd/settings.md correctly needed no sync edit: that file and its skills/gsd-settings/SKILL.md twin both still described "Interactive 5-question prompt (model, research, plan_check, verifier, branching)", stale since long before this phase (the batch has had far more than 5 questions for a while) — replaced with a description that names the current set without hardcoding a count that will drift again. gsd-test (real run, sha 1da78fe2) caught a third real regression the local sweep missed: new-project.md is a registered spine+detail split for Phase 4's token-reduction benchmark (scripts/benchmark-compact-content.cjs), and the new question's +167 tokens drifted the committed baseline (tests/fixtures/compact-content-benchmark-baseline.json). The benchmark itself is designed never to fail CI on drift, but the test asserting the COMMITTED baseline is currently non-drifted correctly caught it. Regenerated via `node scripts/benchmark-compact-content.cjs --write`; re-verified --check now reports "up to date" and the test file passes 27/27. Closes #4408. Closes #4139. Emitted-Drift-Ack-Growth: new-project.md — new 4th Round-2 AskUserQuestion entry (Compact Content, #4139) plus the config-new-project CLI JSON field and explanatory sentence; a new opt-in toggle needs new prose. Emitted-Drift-Ack-Growth: settings.md — new workflow.compact_content read_current bullet, question block, update_config write, safe-merge key, save_as_defaults field, and confirm summary row (the same seven-edit pattern every other non-capability workflow.* toggle already follows), plus the 24->25 success_criteria count fix found in review. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(#4408): backfill changeset PR number pr:0 -> pr:4587 now that gh pr create has returned the real number. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: sim <sim@local> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
5
.changeset/mellow-koalas-frolic.md
Normal file
5
.changeset/mellow-koalas-frolic.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Added
|
||||
pr: 4587
|
||||
---
|
||||
**Compact content mode is now discoverable, not just settable.** `/gsd-new-project` asks about it at init time and `/gsd-settings`/`/gsd-config` toggle it on an already-initialized project, closing out the #4139 compact-content epic. (#4408)
|
||||
@@ -16,7 +16,7 @@ Interactive configuration of GSD workflow agents and model profile via multi-que
|
||||
Routes to the settings workflow which handles:
|
||||
- Config existence ensuring
|
||||
- Current settings reading and parsing
|
||||
- Interactive 5-question prompt (model, research, plan_check, verifier, branching)
|
||||
- Interactive multi-question prompt covering model profile and workflow toggles (research, plan_check, verifier, drift guard, TDD, code review, worktrees, compact content, and more — see `gsd-core/workflows/settings.md` for the current set)
|
||||
- Config merging and writing
|
||||
- Confirmation display with quick command references
|
||||
</objective>
|
||||
|
||||
@@ -517,7 +517,7 @@ All workflow toggles follow the **absent = enabled** pattern. If a key is missin
|
||||
| `workflow.text_mode` | boolean | `false` | Replaces AskUserQuestion TUI menus with plain-text numbered lists. Required for Claude Code remote sessions (`/rc` mode) where TUI menus don't render. Can also be set per-session with `--text` flag on discuss-phase. Added in v1.28 |
|
||||
| `workflow.use_worktrees` | boolean | `true` | When `false`, disables git worktree isolation for parallel execution. Users who prefer sequential execution or whose environment does not support worktrees can disable this. Added in v1.31. **Branch-divergence note:** when your branch has diverged from `origin/HEAD`, GSD auto-degrades to sequential and prints a warning. See [`worktree.baseRef`](#worktree-settings) to restore parallel execution on a diverged branch. **Per-runtime note:** whether this key can be honored depends on the runtime's declared `dispatch.isolation` capability, not on its name (#2584). Runtimes whose own harness isolates each executor (**Claude Code**, **Cursor**) run parallel worktrees natively; runtimes exposing a headless exec with an explicit working directory (**Codex**, **OpenCode**, **Kimi**, **Kimi Code**) get worktrees GSD itself creates and merges — where a dispatch site can only drive the harness model, those hosts degrade to sequential with a warning rather than aborting. Every other runtime declares no isolation primitive, and forcing `use_worktrees: true` there still fails closed before any executor dispatch. `/gsd-health` reports such a value as warning `W025` (#2486). **Default on a non-Claude install:** if a worktree-capable non-Claude host is not isolating as described above, check whether the install stamped this key's default to `false` and set an explicit `use_worktrees: true`. See [Executor isolation per runtime](#executor-isolation-per-runtime). |
|
||||
| `workflow.agent_hint_routing` | boolean | `true` | Per-plan specialist executor routing (#1689). When `true`, a plan whose `agent_hint:` frontmatter names a subagent that resolves on the active runtime is dispatched to that specialist instead of `gsd-executor`. Default `true` — a no-op for plans without `agent_hint:`, so existing dispatch is unchanged. Set `false` to disable. See [PLAN.md `agent_hint`](reference/plan-md.md#per-plan-executor-routing). |
|
||||
| `workflow.compact_content` | boolean | `false` | Compact content mode (#4139, [ADR-4139](adr/4139-compact-content-seam.md)). Per-project boolean selecting the terser form of GSD's own shipped prompt content (workflows, templates, agent-skill payloads). Two mechanisms exist, chosen per stream. **Spine + detail** (top-level, eagerly-`@`-included workflows): six workflows branch on it today — `plan-phase` (#4402, the pilot), `execute-phase`, `docs-update`, `new-project`, `verify-work`, and `complete-milestone` (#4405) — each split into a spine plus a deferred `<workflow>/detail/*.md` elaboration: with the key off, the spine reads its own elaboration back in before continuing (byte-identical instruction set to before); with it on, that read is skipped. The remaining eagerly-`@`-included workflows were reviewed and recorded as not worth splitting (see `docs/PARTITION-RULES.md` § "Deciding whether a file is worth splitting") — either their size comes from safety-critical orchestration logic rather than deferrable narrative (`review.md`), or they're small enough that a split's fixed structural overhead would exceed the savings. **Variant swap** (#4406 — lazily-`Read` workflow subdirectory files and `gsd-core/templates/**` planning-artifact templates, which have no eager window to shrink): a `.compact.md` sibling next to the canonical file, resolved at the point of the existing `Read` per `gsd-core/references/compact-content-gate.md` § "Streams 1b and 4". Three call sites are wired today — `help --full`'s reference doc (`gsd-core/workflows/help/modes/full.md`) and the sequential-execution `SUMMARY.md`/`USER-SETUP.md` template reads in `execute-plan.md` — after a per-candidate reachability audit found most other size-based candidates were either genuinely unreferenced (deleted), reached only through an eager `@`-include or orchestrator build-time embed (left unconverted, same reasoning as the eagerly-included workflows above), or consumed only by a test fixture or a parser's documented grammar rather than a runtime `Read`. **Agent-skill payloads** (#4407 — the `gsd_run query agent-skills` CLI seam, `cmdAgentSkills` in `src/init.cts`): a `.compact.md` sibling next to each canonical `agents/<name>.md`, selected the same way as variant swap but resolved in code instead of prose, because this seam already runs through a real function call rather than an eagerly-loaded file — see `gsd-core/references/compact-content-gate.md` § "Stream 2". It fires only inside the `#2454` persona fallback for non-Claude, AGENTS-native runtimes with no named-subagent dispatch; Claude Code's own subagent dispatch never reaches this path, unchanged from today. An agent with no compact sibling registered falls back to the canonical persona and discloses the fallback inside the served payload itself. The token reduction each mechanism actually achieves is measured, not asserted: `npm run benchmark:compact-content` (spine/detail) and `npm run benchmark:compact-content-variants` (variant-swap) each report per-item and aggregate on/off token counts (a proxy-tokenizer delta — Anthropic publishes no tokenizer for Claude 3+, so the comparison is exact under a pinned tokenizer even though the absolute counts are not Claude's real ones) against their own committed baseline (`tests/fixtures/compact-content-benchmark-baseline.json`, #4404; `tests/fixtures/compact-content-variant-benchmark-baseline.json`, #4406). Both are reporting-only — neither ever fails CI. |
|
||||
| `workflow.compact_content` | boolean | `false` | Compact content mode (#4139, [ADR-4139](adr/4139-compact-content-seam.md)). Per-project boolean selecting the terser form of GSD's own shipped prompt content (workflows, templates, agent-skill payloads). Two mechanisms exist, chosen per stream. **Spine + detail** (top-level, eagerly-`@`-included workflows): six workflows branch on it today — `plan-phase` (#4402, the pilot), `execute-phase`, `docs-update`, `new-project`, `verify-work`, and `complete-milestone` (#4405) — each split into a spine plus a deferred `<workflow>/detail/*.md` elaboration: with the key off, the spine reads its own elaboration back in before continuing (byte-identical instruction set to before); with it on, that read is skipped. The remaining eagerly-`@`-included workflows were reviewed and recorded as not worth splitting (see `docs/PARTITION-RULES.md` § "Deciding whether a file is worth splitting") — either their size comes from safety-critical orchestration logic rather than deferrable narrative (`review.md`), or they're small enough that a split's fixed structural overhead would exceed the savings. **Variant swap** (#4406 — lazily-`Read` workflow subdirectory files and `gsd-core/templates/**` planning-artifact templates, which have no eager window to shrink): a `.compact.md` sibling next to the canonical file, resolved at the point of the existing `Read` per `gsd-core/references/compact-content-gate.md` § "Streams 1b and 4". Three call sites are wired today — `help --full`'s reference doc (`gsd-core/workflows/help/modes/full.md`) and the sequential-execution `SUMMARY.md`/`USER-SETUP.md` template reads in `execute-plan.md` — after a per-candidate reachability audit found most other size-based candidates were either genuinely unreferenced (deleted), reached only through an eager `@`-include or orchestrator build-time embed (left unconverted, same reasoning as the eagerly-included workflows above), or consumed only by a test fixture or a parser's documented grammar rather than a runtime `Read`. **Agent-skill payloads** (#4407 — the `gsd_run query agent-skills` CLI seam, `cmdAgentSkills` in `src/init.cts`): a `.compact.md` sibling next to each canonical `agents/<name>.md`, selected the same way as variant swap but resolved in code instead of prose, because this seam already runs through a real function call rather than an eagerly-loaded file — see `gsd-core/references/compact-content-gate.md` § "Stream 2". It fires only inside the `#2454` persona fallback for non-Claude, AGENTS-native runtimes with no named-subagent dispatch; Claude Code's own subagent dispatch never reaches this path, unchanged from today. An agent with no compact sibling registered falls back to the canonical persona and discloses the fallback inside the served payload itself. The token reduction each mechanism actually achieves is measured, not asserted: `npm run benchmark:compact-content` (spine/detail) and `npm run benchmark:compact-content-variants` (variant-swap) each report per-item and aggregate on/off token counts (a proxy-tokenizer delta — Anthropic publishes no tokenizer for Claude 3+, so the comparison is exact under a pinned tokenizer even though the absolute counts are not Claude's real ones) against their own committed baseline (`tests/fixtures/compact-content-benchmark-baseline.json`, #4404; `tests/fixtures/compact-content-variant-benchmark-baseline.json`, #4406). Both are reporting-only — neither ever fails CI. Discoverable, not just settable: `/gsd-new-project` asks a Compact Content question at init time, and `/gsd-settings`/`/gsd-config` toggle it on an already-initialized project (#4408) — `config-set`/`config-get` remain the direct route for scripting. |
|
||||
| `workflow.worktree_skip_hooks` | boolean | `false` | When `true`, executor agents in worktree mode pass `--no-verify` (skipping pre-commit hooks) and post-wave hook validation runs against the merged result instead. Opt-in escape hatch for projects whose hooks cannot run in agent worktrees. Default `false` runs hooks on every commit (#2924). |
|
||||
| `workflow.code_review` | boolean | `true` | Enable `/gsd-code-review` and `/gsd-code-review --fix` commands. When `false`, the commands exit with a configuration gate message. Added in v1.34 |
|
||||
| `workflow.code_review_point` | string | `execute:post` | Loop point at which the code-review capability's step registers: `execute:post` reviews once, after every wave in a phase has landed (default — unchanged behavior); `execute:wave:post` reviews once per completed wave instead, scoped to what changed since the phase's prior review (the whole phase's diff on the first wave, each subsequent wave's own diff thereafter). Manual `/gsd-code-review <phase>` invocation is unaffected by this key — it is gated by `workflow.code_review` alone and runs regardless of which point is configured. `/gsd-autonomous` and `/gsd-quick` have no wave granularity of their own, so setting this to `execute:wave:post` means code review does not run automatically inside those two flows (consistent with how every other `execute:wave:post`-only capability already behaves for them). Added in #3661 |
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
- [Session Reporting](#24-session-reporting)
|
||||
- [Multi-Agent Orchestration](#25-multi-agent-orchestration)
|
||||
- [Model Profiles](#26-model-profiles)
|
||||
- [Compact Content Mode](#4139-compact-content-mode)
|
||||
- [Brownfield Features](#brownfield-features)
|
||||
- [Codebase Mapping](#27-codebase-mapping)
|
||||
- [Existing Codebase Onboarding](#27b-existing-codebase-onboarding)
|
||||
@@ -911,6 +912,46 @@ phase of the same epic.
|
||||
| gsd-integration-checker | Sonnet | Sonnet | Haiku | Inherit |
|
||||
| gsd-nyquist-auditor | Sonnet | Sonnet | Haiku | Inherit |
|
||||
|
||||
---
|
||||
|
||||
### 4139. Compact Content Mode
|
||||
|
||||
**Config:** `workflow.compact_content: false`
|
||||
|
||||
**Purpose:** Per-project opt-in to token-minimized variants of GSD's own shipped prompt
|
||||
content — workflow instructions, planning-artifact templates, and non-Claude agent-persona
|
||||
payloads — so the always-loaded instruction window leaves more of the model's attention on
|
||||
the developer's own code (ADR-4139 Decision 2: finite attention, not per-invocation price,
|
||||
since prompt caching already discounts the latter).
|
||||
|
||||
Nothing is compressed at runtime. Compact variants are hand-authored, reviewed files sitting
|
||||
beside their canonical siblings; the config key only chooses which one gets read. With the
|
||||
key off (the default), every covered workflow, template, and agent persona behaves exactly as
|
||||
it did before this feature existed.
|
||||
|
||||
**Requirements:**
|
||||
- REQ-COMPACT-01: System MUST default `workflow.compact_content` to `false` — off costs
|
||||
nothing and changes no existing behavior
|
||||
- REQ-COMPACT-02: Eagerly `@`-included workflow files MUST keep their host-guaranteed load;
|
||||
compactness on this stream comes from a spine + deferred `detail/*.md` elaboration, never
|
||||
from converting the `@`-include itself
|
||||
- REQ-COMPACT-03: A missed runtime `Read` of a deferred elaboration or compact variant MUST
|
||||
degrade to a complete, correct, terser state — never to a state with no instructions
|
||||
- REQ-COMPACT-04: No compact variant MAY weaken or remove protected content (guardrails,
|
||||
output-format contracts, few-shot examples, security language, structural headings)
|
||||
- REQ-COMPACT-05: An agent with no compact persona variant registered MUST fall back to its
|
||||
canonical persona and disclose the fallback inside the served payload, never fail or serve
|
||||
nothing
|
||||
- REQ-COMPACT-06: `/gsd-new-project` MUST ask the question and persist the answer;
|
||||
`/gsd-settings` and `/gsd-config` MUST toggle it on an already-initialized project
|
||||
|
||||
**Config:**
|
||||
| Setting | Type | Default | Description |
|
||||
|---------|------|---------|-------------|
|
||||
| `workflow.compact_content` | boolean | `false` | When `true`, loads token-minimized instruction/template/agent-persona variants wherever one is registered; falls back to canonical content everywhere else |
|
||||
|
||||
**See also:** [ADR-4139](../adr/4139-compact-content-seam.md), [CONFIGURATION.md](../CONFIGURATION.md#workflow-toggles), [USER-GUIDE.md](../USER-GUIDE.md)
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -567,6 +567,35 @@ Intel commands (`intel status`, `intel query`, `intel diff`, `intel snapshot`, `
|
||||
|
||||
For intel, conditions 1 and 2 are always satisfied (intel has no skill files). The effective gate is `intel.enabled` in config — the same behaviour as before, but now enforced through the shared `isCapabilityActive('intel', cwd)` resolver rather than a direct config read. This means intel honours the full capability-state pipeline, including any future install-profile or surface restrictions. If intel commands return `{ disabled: true }`, ensure `intel.enabled: true` is set in `.planning/config.json` and verify `gsd-tools capability state` shows intel as active.
|
||||
|
||||
### Compact content mode (`workflow.compact_content`, v4139+)
|
||||
|
||||
GSD's own workflow instructions, planning-artifact templates, and (for non-Claude runtimes)
|
||||
agent personas are prose — and a large eagerly-loaded instruction body is context the model
|
||||
spends on GSD's own orchestration rather than on your code. `workflow.compact_content` (default
|
||||
`false`) opts a project into token-minimized variants of that content wherever one has been
|
||||
authored, without changing what GSD actually does.
|
||||
|
||||
**Why turn it on: finite attention, not price.** The point of this key is not a cheaper
|
||||
invocation — with prompt caching, the per-request cost of re-sending a large instruction file
|
||||
is already small. The point is what a large always-loaded instruction body costs in *attention*:
|
||||
every byte of GSD's own prose sitting in context is a byte not spent reasoning about your
|
||||
codebase. That cost is paid whether or not the tokens were cheap to transport. Turn it on when
|
||||
you're running long sessions, working in a large codebase that already competes for context, or
|
||||
on a runtime with a small context window; leave it off (the default) if you'd rather have every
|
||||
elaboration and worked example available up front, or you're evaluating GSD for the first time
|
||||
and want full detail while you learn how it thinks.
|
||||
|
||||
**What actually changes.** Nothing is compressed at runtime. Every compact variant is a
|
||||
hand-authored, reviewed file sitting beside its canonical sibling — the key only chooses which
|
||||
one GSD reads. Guardrails, output-format contracts, few-shot examples, and security language are
|
||||
never shortened or dropped in a compact variant; only rarely-needed elaboration and restatement
|
||||
are. With the key off, behavior is unchanged from before this feature existed.
|
||||
|
||||
**How to turn it on:** answer "Yes" to the Compact Content question during `/gsd-new-project`,
|
||||
or run `/gsd-settings` (or `/gsd-config` with no flag) on an existing project and toggle
|
||||
Compact Content. See [`docs/CONFIGURATION.md`](CONFIGURATION.md#workflow-toggles) for the
|
||||
mechanics and [ADR-4139](adr/4139-compact-content-seam.md) for the full design rationale.
|
||||
|
||||
---
|
||||
|
||||
## Usage Examples
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Status** | Proposed |
|
||||
| **Status** | Accepted |
|
||||
| **Date** | 2026-09-06 |
|
||||
| **Issue** | [#4139](https://github.com/open-gsd/gsd-core/issues/4139) |
|
||||
| **Phase-0 sub-issue** | [#4400](https://github.com/open-gsd/gsd-core/issues/4400) |
|
||||
@@ -425,40 +425,70 @@ expanded today because the file is `@`-included. They **stay in the spine** and
|
||||
one into a detail part would silently turn a working import into dead text, which is exactly the
|
||||
class of failure the #3324 sub-guard catches.
|
||||
|
||||
### 7. Acceptance criteria — satisfied, and reconciled
|
||||
### 7. Acceptance criteria — the guard ledger
|
||||
|
||||
`CI.GATE.acceptance-criteria-required` treats an unmet must-have as a failed deployment, so the
|
||||
criteria are reconciled here explicitly rather than reinterpreted quietly at ship time.
|
||||
criteria are reconciled here explicitly rather than reinterpreted quietly at ship time. This
|
||||
section was written as a forward-looking reconciliation when only Phase 0 existed; #4408 (the
|
||||
closing phase) converts it into a ledger against #4139's own 12 acceptance-criteria checkboxes,
|
||||
quoted verbatim, each with the evidence that closed it. "Satisfied" means literally true;
|
||||
"Reconciled" means the criterion's *purpose* was met by a structurally different mechanism than
|
||||
the one the criterion's wording assumed, argued below.
|
||||
|
||||
**Satisfied as written**, by the phase named: config key registration and validation (#4401);
|
||||
`/gsd-new-project` question and `/gsd-settings` + `/gsd-config` toggles (#4408); gate logic in
|
||||
exactly one file (#4402); corpus coverage with no unpaired canonical file (#4405, #4406, #4407);
|
||||
`agent-skills` serving the compact payload (#4407); golfed spawn patterns (#4405, carried inside
|
||||
the workflow splits); identical behavior under global and local installs (structural — the key is
|
||||
per-project and no file is selected at install time); the compression-rules document and its
|
||||
denylist (#4403); the drift check naming a stale pair (#4403, in its partition form — see below);
|
||||
the offline reporting-only benchmark with a committed baseline (#4404); the full suite green with
|
||||
the key on and off (#4408); all shipped-content guards passing (every phase).
|
||||
| # | Criterion (verbatim from #4139) | Verdict | Evidence |
|
||||
|---|---|---|---|
|
||||
| 1 | `workflow.prompt_golf` is registered in the config schema; `config-set`/`config-get` persist and read it, invalid value rejected | Satisfied — key renamed to `workflow.compact_content` (Decision 1) | #4401 → [PR #4441](https://github.com/open-gsd/gsd-core/pull/4441) |
|
||||
| 2 | `/gsd-new-project` asks a Prompt Golf question and writes the answer | Satisfied | #4408 → this PR, `gsd-core/workflows/new-project.md` Round 2 |
|
||||
| 3 | `/gsd-settings` and `/gsd-config` can toggle the key on an already-initialized project | Satisfied | #4408 → this PR, `gsd-core/workflows/settings.md` (`/gsd-config` routes here with no flag) |
|
||||
| 4 | With golf on, workflows load golfed variants via a single shared gate reference file; gate logic exists in exactly one file | Satisfied | #4402 → [PR #4471](https://github.com/open-gsd/gsd-core/pull/4471), `gsd-core/references/compact-content-gate.md` |
|
||||
| 5 | Every shipped workflow instruction file and planning-artifact template has a golfed variant registered with the parity check — no unpaired canonical file remains | Reconciled (#1 below) | #4402/#4403/#4405/#4406 |
|
||||
| 6 | `gsd_run query agent-skills <agent>` returns the golfed payload for every agent when on, canonical when off | Reconciled (#2 below) | #4407 → [PR #4553](https://github.com/open-gsd/gsd-core/pull/4553) |
|
||||
| 7 | Subagent prompts emitted by orchestrators follow golfed spawn patterns when golf is on | Satisfied — carried inside the workflow spine/detail splits, no separate mechanism needed | #4405 → [PR #4536](https://github.com/open-gsd/gsd-core/pull/4536) |
|
||||
| 8 | Behavior identical under global and local installs — per-project config decides, never install-time file selection | Satisfied — structural: the config key is read at runtime from `.planning/config.json`; no phase added install-time file selection | Design invariant, unchanged across all 8 phases |
|
||||
| 9 | A committed compression-rules document defines a protected-content denylist; no golfed variant weakens protected content | Satisfied | #4403 → [PR #4497](https://github.com/open-gsd/gsd-core/pull/4497), Decision 5 above |
|
||||
| 10 | Editing a canonical file without updating its golfed variant fails the drift-parity check, naming the stale pair | Reconciled (#3 below) | #4403 → PR #4497 |
|
||||
| 11 | The benchmark runs fully offline, reports per-file/aggregate reduction as a labeled proxy-tokenizer delta, reproduces its committed baseline deterministically, is reporting-only | Satisfied | #4404 → [PR #4502](https://github.com/open-gsd/gsd-core/pull/4502) |
|
||||
| 12 | The full existing test suite passes with golf enabled AND with golf disabled | Satisfied | Every phase's `gsd-test` run covers the key off (default, unset); `tests/agent-skills.test.cjs`'s stream-2 fixtures (#4407) and Phase 2's live end-to-end dogfooding (#4402 — a real phase planned twice against this repo, once with the key false, once true) cover it on |
|
||||
| 13 | All golfed and gate-bearing shipped content passes the existing shipped-content guards: size budgets, emitted-attribution, `commit-files-pathspec`, `commit-docs-bypass` | Satisfied — ongoing, every phase | Recorded per-phase in each PR's own review artifact; no phase shipped with a red shipped-content guard |
|
||||
|
||||
**Reconciled, with the reasoning:**
|
||||
**Reconciled, with the reasoning** (numbered to match the ledger's "Reconciled (#N below)" cells):
|
||||
|
||||
1. *"With golf off they load canonical content"* — they do. The reconciliation is mechanical, not
|
||||
semantic: the canonical content arrives as spine plus detail rather than as one eager blob. The
|
||||
instruction set an orchestrator holds with the key off is the same instruction set it holds
|
||||
today.
|
||||
2. *"Editing a canonical file without updating its golfed variant fails the drift-parity check"* —
|
||||
under Decision 5 there is no variant to go stale, so this criterion's *purpose* (a canonical edit
|
||||
cannot silently leave a paired file behind) is met structurally rather than by a check. The check
|
||||
that remains enforces the invariant that makes it structural: disjointness plus registration.
|
||||
This is a stronger outcome than the criterion asked for, and #4403 must demonstrate it by proving
|
||||
each check can actually fail before it is trusted.
|
||||
3. *"With golf off, GSD behaves exactly as it does today"* (user story 3) — **not fully achievable,
|
||||
by any design that delivers stream-1 savings.** Decision 4(a) states the residual: an opted-out
|
||||
project's elaborations arrive by a runtime `Read` that could be missed, and a miss yields the
|
||||
compact behavior. The deviation is bounded to a state the project deliberately supports and
|
||||
validates in #4402. This is recorded as a knowing, argued deviation. It is the item on this list
|
||||
a maintainer may reasonably want to overturn, and if it is overturned the consequence is
|
||||
automatic: stream 1 becomes uncoverable and the epic reduces to streams 2 and 4.
|
||||
1. *(criterion 5)* "No unpaired canonical file remains" reads as "every file has a golfed twin."
|
||||
What shipped instead, deliberately: streams 1/1b/4 use a **partition** (spine + detail, or a
|
||||
variant swap), not a duplicate-and-maintain pair, and the eagerly-`@`-included corpus was
|
||||
individually reviewed — some files split (#4402/#4405/#4406), others were **recorded as not
|
||||
worth splitting** (`docs/PARTITION-RULES.md`) because their size is safety-critical
|
||||
orchestration logic rather than deferrable narrative, or because a split's fixed overhead
|
||||
would exceed the savings. "No unpaired canonical file" is true of every file this epic
|
||||
*covers*; it was never true, nor intended to be, of files the epic explicitly declined to
|
||||
cover with a stated reason — which is the criterion's own spirit (a reviewed decision, not a
|
||||
silent gap).
|
||||
2. *(criterion 6)* "For every agent" reads as literally all 35. #4407 shipped 29 — six
|
||||
(`gsd-debugger`, `gsd-executor`, `gsd-phase-researcher`, `gsd-plan-checker`, `gsd-planner`,
|
||||
`gsd-verifier`) exceed the hard, non-ackable `NEW_FILE_CAP` even after aggressive compaction,
|
||||
a structural constraint the seam's single-file read has no mechanism to route around without
|
||||
building a second spine/detail-style partition mechanism scoped for agents — out of proportion
|
||||
to #4407's own "the code delta is small" framing. The criterion's *purpose* — never fail or
|
||||
serve nothing — holds for all 35: the `#2454` fallback discloses the substitution inside the
|
||||
payload itself for the six uncovered agents, exactly the behavior criterion 6 and #4139's
|
||||
Alternative-5 rejection ("golfing in place forfeits the side-by-side comparison") both protect
|
||||
against losing.
|
||||
3. *(criterion 10)* Under Decision 5's partition shape there is no variant to go stale — a
|
||||
canonical edit and its elaboration are pieces of ONE document, not two. The criterion's
|
||||
*purpose* (a canonical edit cannot silently leave a paired file behind) is met structurally
|
||||
rather than by a drift check catching it after the fact. What #4403 built instead —
|
||||
disjointness (no line duplicated) plus registration (no orphaned or dangling part) — is a
|
||||
stronger invariant than "the parity check fails," and #4403's own failing-first fixtures prove
|
||||
each check can actually fail before either was trusted.
|
||||
|
||||
**One item this ledger overturns rather than reconciles:** user story 3 ("with golf off, GSD
|
||||
behaves exactly as it does today") is **not fully achievable by any design that delivers
|
||||
stream-1 savings** — Decision 4(a) states the residual plainly: an opted-out project's
|
||||
elaborations arrive by a runtime `Read` that could be missed, and a miss yields the compact
|
||||
behavior rather than a crash. This was accepted knowingly at Phase 0 and validated in #4402's
|
||||
live dogfooding rather than fixed, because the alternative (converting the `@`-includes) has an
|
||||
unbounded failure mode instead of a bounded one (see §Context). It is recorded here, not buried,
|
||||
as the one criterion whose letter was traded for its spirit.
|
||||
|
||||
## Consequences
|
||||
|
||||
@@ -507,22 +537,22 @@ the key on and off (#4408); all shipped-content guards passing (every phase).
|
||||
|
||||
## Phase plan
|
||||
|
||||
| Phase | Issue | Delivers | Depends on |
|
||||
|---|---|---|---|
|
||||
| 0 | [#4400](https://github.com/open-gsd/gsd-core/issues/4400) | this ADR | — |
|
||||
| 1 | [#4401](https://github.com/open-gsd/gsd-core/issues/4401) | `workflow.compact_content` end to end | 0 |
|
||||
| 2 | [#4402](https://github.com/open-gsd/gsd-core/issues/4402) | shared gate + pilot split + accuracy spot-check | 1 |
|
||||
| 3 | [#4403](https://github.com/open-gsd/gsd-core/issues/4403) | partition rules + the five checks | 2 |
|
||||
| 4 | [#4404](https://github.com/open-gsd/gsd-core/issues/4404) | offline benchmark + committed baseline | 3 |
|
||||
| 5 | [#4405](https://github.com/open-gsd/gsd-core/issues/4405) | stream 1 corpus coverage (carries stream 3) | 3, 4 |
|
||||
| 6 | [#4406](https://github.com/open-gsd/gsd-core/issues/4406) | stream 1b subdirectories + stream 4 templates | 5 |
|
||||
| 7 | [#4407](https://github.com/open-gsd/gsd-core/issues/4407) | stream 2 agent-skill payloads via the CLI seam | 6 |
|
||||
| 8 | [#4408](https://github.com/open-gsd/gsd-core/issues/4408) | user surfaces, docs, guard ledger — closes #4139 | 7 |
|
||||
| Phase | Issue | Delivers | Depends on | PR |
|
||||
|---|---|---|---|---|
|
||||
| 0 | [#4400](https://github.com/open-gsd/gsd-core/issues/4400) | this ADR | — | — |
|
||||
| 1 | [#4401](https://github.com/open-gsd/gsd-core/issues/4401) | `workflow.compact_content` end to end | 0 | [#4441](https://github.com/open-gsd/gsd-core/pull/4441) |
|
||||
| 2 | [#4402](https://github.com/open-gsd/gsd-core/issues/4402) | shared gate + pilot split + accuracy spot-check | 1 | [#4471](https://github.com/open-gsd/gsd-core/pull/4471) |
|
||||
| 3 | [#4403](https://github.com/open-gsd/gsd-core/issues/4403) | partition rules + the five checks | 2 | [#4497](https://github.com/open-gsd/gsd-core/pull/4497) |
|
||||
| 4 | [#4404](https://github.com/open-gsd/gsd-core/issues/4404) | offline benchmark + committed baseline | 3 | [#4502](https://github.com/open-gsd/gsd-core/pull/4502) |
|
||||
| 5 | [#4405](https://github.com/open-gsd/gsd-core/issues/4405) | stream 1 corpus coverage (carries stream 3) | 3, 4 | [#4536](https://github.com/open-gsd/gsd-core/pull/4536) |
|
||||
| 6 | [#4406](https://github.com/open-gsd/gsd-core/issues/4406) | stream 1b subdirectories + stream 4 templates | 5 | [#4540](https://github.com/open-gsd/gsd-core/pull/4540) |
|
||||
| 7 | [#4407](https://github.com/open-gsd/gsd-core/issues/4407) | stream 2 agent-skill payloads via the CLI seam | 6 | [#4553](https://github.com/open-gsd/gsd-core/pull/4553) |
|
||||
| 8 | [#4408](https://github.com/open-gsd/gsd-core/issues/4408) | user surfaces, docs, guard ledger — closes #4139 | 7 | this PR |
|
||||
|
||||
Guards land before content proliferates (Phases 3 and 4 precede Phase 5), satisfying approval
|
||||
condition 2. The pilot's end-to-end accuracy spot-check is Phase 2's, satisfying condition 3.
|
||||
|
||||
## Open questions for the implementation phases
|
||||
## Open questions for the implementation phases — resolved at close
|
||||
|
||||
- Whether `discuss-phase` — the one command that already reaches its workflow by runtime `Read` —
|
||||
should be brought onto the spine shape too. It is the sole existing instance of the substitutive
|
||||
@@ -532,6 +562,14 @@ condition 2. The pilot's end-to-end accuracy spot-check is Phase 2's, satisfying
|
||||
Giving it a spine would remove that residual entirely, and it is the one place in the tree where
|
||||
this ADR's mechanism would be a strict safety improvement rather than a token trade. Scoped to
|
||||
Phase 5 (#4405) to decide with the rest of stream 1 in view.
|
||||
**Resolved: not converted.** `gsd-core/workflows/discuss-phase/` carries no `detail/`
|
||||
subdirectory as of #4408; the prose-only mitigation quoted above is unchanged. This was not
|
||||
revisited with an explicit for/against argument in #4405 — recorded here as a genuine gap in
|
||||
the epic's own closure, not a reasoned decline. A future phase wanting the safety improvement
|
||||
this question identifies starts from a clean slate, not from an argued rejection.
|
||||
- Whether the disjointness check should compare normalized sentences rather than normalized lines.
|
||||
Lines are cheaper and catch copy-paste; sentences catch reflowing. Decided in #4403 against real
|
||||
splits rather than in the abstract here.
|
||||
**Resolved: lines.** `tests/helpers/compact-content-split.cjs`'s `normalizeNonTrivialLines`
|
||||
is the shipped comparison unit — confirmed against the real implementation, not asserted from
|
||||
the plan.
|
||||
|
||||
@@ -267,6 +267,7 @@ These govern the system as it stands. Cite these.
|
||||
| [ADR-3626](3626-context-md-seam-claim-gate.md) | CONTEXT.md seam claims carry a checkable enforcement pointer | Accepted | — |
|
||||
| [ADR-3660](3660-runtime-artifact-layout-module.md) | Runtime Artifact Layout Module owns per-runtime artifact placement | Accepted | [ADR-1239](1239-gsd-embeddable-orchestration-engine.md) |
|
||||
| [ADR-3806](3806-review-dispositions-ledger.md) | Review Dispositions Ledger canonizes where and how reviews-mode records incorporate/defer decisions in PLAN.md | Accepted | — |
|
||||
| [ADR-4139](4139-compact-content-seam.md) | The compact-content seam — shrink the eager window, never the guarantee | Accepted | — |
|
||||
|
||||
### Proposed
|
||||
|
||||
@@ -286,7 +287,6 @@ Decided in principle, not yet ratified. Do not cite as settled architecture.
|
||||
| [ADR-3646](3646-per-task-content-resolution-seam.md) | Per-task external-tracker content-resolution seam | Proposed | — |
|
||||
| [ADR-3889](3889-process-exit-contract.md) | One exit-code registry — 0 and 1 are free, everything else is allocated | Proposed | — |
|
||||
| [ADR-3942](3942-emitted-drift-ack-commit-trailer.md) | The emitted-drift acknowledgment is PR-lifetime data — it belongs in a commit trailer, not the working tree | Proposed | — |
|
||||
| [ADR-4139](4139-compact-content-seam.md) | The compact-content seam — shrink the eager window, never the guarantee | Proposed | — |
|
||||
|
||||
### Superseded, Retired, and Legacy
|
||||
|
||||
|
||||
41
docs/features/4139-compact-content.md
Normal file
41
docs/features/4139-compact-content.md
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
id: 4139
|
||||
title: Compact Content Mode
|
||||
group: Context Engineering Features
|
||||
---
|
||||
|
||||
**Config:** `workflow.compact_content: false`
|
||||
|
||||
**Purpose:** Per-project opt-in to token-minimized variants of GSD's own shipped prompt
|
||||
content — workflow instructions, planning-artifact templates, and non-Claude agent-persona
|
||||
payloads — so the always-loaded instruction window leaves more of the model's attention on
|
||||
the developer's own code (ADR-4139 Decision 2: finite attention, not per-invocation price,
|
||||
since prompt caching already discounts the latter).
|
||||
|
||||
Nothing is compressed at runtime. Compact variants are hand-authored, reviewed files sitting
|
||||
beside their canonical siblings; the config key only chooses which one gets read. With the
|
||||
key off (the default), every covered workflow, template, and agent persona behaves exactly as
|
||||
it did before this feature existed.
|
||||
|
||||
**Requirements:**
|
||||
- REQ-COMPACT-01: System MUST default `workflow.compact_content` to `false` — off costs
|
||||
nothing and changes no existing behavior
|
||||
- REQ-COMPACT-02: Eagerly `@`-included workflow files MUST keep their host-guaranteed load;
|
||||
compactness on this stream comes from a spine + deferred `detail/*.md` elaboration, never
|
||||
from converting the `@`-include itself
|
||||
- REQ-COMPACT-03: A missed runtime `Read` of a deferred elaboration or compact variant MUST
|
||||
degrade to a complete, correct, terser state — never to a state with no instructions
|
||||
- REQ-COMPACT-04: No compact variant MAY weaken or remove protected content (guardrails,
|
||||
output-format contracts, few-shot examples, security language, structural headings)
|
||||
- REQ-COMPACT-05: An agent with no compact persona variant registered MUST fall back to its
|
||||
canonical persona and disclose the fallback inside the served payload, never fail or serve
|
||||
nothing
|
||||
- REQ-COMPACT-06: `/gsd-new-project` MUST ask the question and persist the answer;
|
||||
`/gsd-settings` and `/gsd-config` MUST toggle it on an already-initialized project
|
||||
|
||||
**Config:**
|
||||
| Setting | Type | Default | Description |
|
||||
|---------|------|---------|-------------|
|
||||
| `workflow.compact_content` | boolean | `false` | When `true`, loads token-minimized instruction/template/agent-persona variants wherever one is registered; falls back to canonical content everywhere else |
|
||||
|
||||
**See also:** [ADR-4139](../adr/4139-compact-content-seam.md), [CONFIGURATION.md](../CONFIGURATION.md#workflow-toggles), [USER-GUIDE.md](../USER-GUIDE.md)
|
||||
@@ -516,6 +516,10 @@ These spawn additional agents during planning/execution. They add tokens and tim
|
||||
|
||||
All recommended for important projects. Skip for quick experiments.
|
||||
|
||||
A fourth question in this same round covers Compact Content (#4139) — not a spawned agent,
|
||||
but grouped here because it's the last general workflow-behavior toggle before the more
|
||||
involved AI-models round below.
|
||||
|
||||
```
|
||||
questions: [
|
||||
{
|
||||
@@ -544,6 +548,15 @@ questions: [
|
||||
{ label: "Yes (Recommended)", description: "Confirm deliverables match phase goals" },
|
||||
{ label: "No", description: "Trust execution, skip verification" }
|
||||
]
|
||||
},
|
||||
{
|
||||
header: "Compact Content",
|
||||
question: "Use token-minimized instruction content where available? (smaller context footprint)",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "No (Recommended)", description: "Full instruction detail loaded every time. Best while evaluating GSD or on a large context window." },
|
||||
{ label: "Yes", description: "Terser instructions where a compact variant exists; canonical detail loads only when actually needed. Frees up context for long sessions or large codebases." }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -605,7 +618,7 @@ Create `.planning/config.json` with all settings (CLI fills in remaining default
|
||||
|
||||
```bash
|
||||
mkdir -p .planning
|
||||
gsd_run query config-new-project '{"mode":"[yolo|interactive]","granularity":"[selected]","parallelization":true|false,"commit_docs":true|false,"model_profile":"quality|balanced|budget|adaptive|inherit","workflow":{"research":true|false,"plan_check":true|false,"verifier":true|false,"nyquist_validation":[false if granularity=coarse, true otherwise]},"plan_review":{"source_grounding":true|false},"ship":{"pr_body_sections":[{"heading":"User Stories & Acceptance Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria","fallback":"- Acceptance criteria are covered by the linked requirements and verification evidence."},{"heading":"Risks & Dependencies","enabled":true|false,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."},{"heading":"Success Metrics & Release Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria","fallback":"- Release when automated verification and required manual checks pass."},{"heading":"Stakeholder Review & Approval","enabled":true|false,"template":"- Product owner approval pending for {phase_name}."}]}}'
|
||||
gsd_run query config-new-project '{"mode":"[yolo|interactive]","granularity":"[selected]","parallelization":true|false,"commit_docs":true|false,"model_profile":"quality|balanced|budget|adaptive|inherit","workflow":{"research":true|false,"plan_check":true|false,"verifier":true|false,"compact_content":true|false,"nyquist_validation":[false if granularity=coarse, true otherwise]},"plan_review":{"source_grounding":true|false},"ship":{"pr_body_sections":[{"heading":"User Stories & Acceptance Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## User Stories || REQUIREMENTS.md ## Acceptance Criteria","fallback":"- Acceptance criteria are covered by the linked requirements and verification evidence."},{"heading":"Risks & Dependencies","enabled":true|false,"source":"PLAN.md ## Risks || PLAN.md ## Dependencies","fallback":"- No known high-risk rollout dependencies."},{"heading":"Success Metrics & Release Criteria","enabled":true|false,"source":"REQUIREMENTS.md ## Definition of Done || VERIFICATION.md ## Release Criteria","fallback":"- Release when automated verification and required manual checks pass."},{"heading":"Stakeholder Review & Approval","enabled":true|false,"template":"- Product owner approval pending for {phase_name}."}]}}'
|
||||
```
|
||||
|
||||
**Note:** Run `/gsd:settings` anytime to update model profile, workflow agents, branching strategy, and other preferences.
|
||||
|
||||
@@ -60,6 +60,7 @@ Parse current values (default to `true` if not present):
|
||||
- `model_profile` — which model each agent uses (default: `balanced`)
|
||||
- `git.branching_strategy` — branching approach (default: `"none"`)
|
||||
- `workflow.use_worktrees` — whether parallel executor agents run in worktree isolation (honored when the runtime declares a `dispatch.isolation` primitive — `harness-worktree` or `orchestrator-worktree`; runtimes declaring `none` default it to `false` and fail closed on an explicit `true` — #1521, #2486, #2584)
|
||||
- `workflow.compact_content` — load token-minimized instruction variants where they exist, trading rarely-needed elaboration for a smaller always-loaded instruction window (default: false if absent; #4139)
|
||||
- `model_policy.provider` — provider slug for model policy (default: `null`; known values: anthropic, openai, google, qwen; set via /gsd:config --advanced)
|
||||
- `model_policy.budget` — budget level for model policy (default: `null`; known values: high, medium, low; set via /gsd:config --advanced)
|
||||
- `model_policy.high` — model ID for high-cost tier (default: `null`; set via /gsd:config --advanced)
|
||||
@@ -131,7 +132,7 @@ Intel, Graphify, Graph auto-update _(conditional — only when graphify=on)_
|
||||
Model Profile, Auto-Advance, Branching
|
||||
|
||||
### Misc
|
||||
Context Warnings, Research Qs
|
||||
Context Warnings, Compact Content, Research Qs
|
||||
|
||||
**Conditional visibility — code_review_depth:** This question is shown only when the user's chosen `code_review` value (after they answer that question, or the pre-selected value if unchanged) is on. If `code_review` is off, omit the `code_review_depth` question from the AskUserQuestion block and preserve the existing `workflow.code_review_depth` value in config (do not overwrite). Implementation: ask the Model + Planning + Execution-up-to-Code-Review questions first; if `code_review=on`, include `code_review_depth` in the same batch; otherwise skip it. Conceptually this is a one-branch split on the `code_review` answer.
|
||||
|
||||
@@ -382,6 +383,15 @@ AskUserQuestion([
|
||||
{ label: "No", description: "Disable warnings. Allows Claude to reach auto-compact naturally. Good for long unattended runs." }
|
||||
]
|
||||
},
|
||||
{
|
||||
question: "Use token-minimized instruction content where available? (smaller context footprint)",
|
||||
header: "Compact Content",
|
||||
multiSelect: false,
|
||||
options: [
|
||||
{ label: "No (Recommended)", description: "Full instruction detail loaded every time." },
|
||||
{ label: "Yes", description: "Terser instructions where a compact variant exists; canonical detail loads only when actually needed." }
|
||||
]
|
||||
},
|
||||
{
|
||||
question: "Research best practices before asking questions? (web search during new-project and discuss-phase)",
|
||||
header: "Research Qs",
|
||||
@@ -475,7 +485,8 @@ Merge new settings into existing config.json:
|
||||
"research_before_questions": true/false,
|
||||
"discuss_mode": "discuss" | "assumptions",
|
||||
"skip_discuss": true/false,
|
||||
"use_worktrees": true/false // never written as true when the runtime's dispatch.isolation is none; omitted entirely when the user chose "Leave unchanged" (#2486)
|
||||
"use_worktrees": true/false, // never written as true when the runtime's dispatch.isolation is none; omitted entirely when the user chose "Leave unchanged" (#2486)
|
||||
"compact_content": true/false
|
||||
},
|
||||
"plan_review": {
|
||||
"source_grounding": true/false
|
||||
@@ -532,7 +543,7 @@ Merge new settings into existing config.json:
|
||||
|
||||
`code_review_depth` is written only if the `code_review` question was answered `on`; otherwise leave the existing value in place.
|
||||
|
||||
- **Non-capability keys** (`model_profile`, `commit_docs`, `workflow.plan_check`, `workflow.verifier`, `workflow.auto_advance`, `workflow.text_mode`, `workflow.research_before_questions`, `workflow.discuss_mode`, `workflow.skip_discuss`, `workflow.use_worktrees`, `plan_review.source_grounding`, `graphify.auto_update`, `git.*`, `hooks.*`, `model_policy.*`): write via `gsd_run query config-set <key.path> <value>` as before.
|
||||
- **Non-capability keys** (`model_profile`, `commit_docs`, `workflow.plan_check`, `workflow.verifier`, `workflow.auto_advance`, `workflow.text_mode`, `workflow.compact_content`, `workflow.research_before_questions`, `workflow.discuss_mode`, `workflow.skip_discuss`, `workflow.use_worktrees`, `plan_review.source_grounding`, `graphify.auto_update`, `git.*`, `hooks.*`, `model_policy.*`): write via `gsd_run query config-set <key.path> <value>` as before.
|
||||
|
||||
`model_profile` is written on Q1 "Adaptive (Recommended)" (→ adaptive) or Q1 "Inherit" (→ inherit) immediately; for Q1 "Standard tier…", `model_profile` is written from Q2's answer. If Q1 = "Standard tier…" but Q2 is cancelled, leave the existing `model_profile` value unchanged — do not write any new value.
|
||||
|
||||
@@ -586,7 +597,8 @@ Write `~/.gsd/defaults.json` with:
|
||||
"code_review": <current>,
|
||||
"code_review_depth": <current>,
|
||||
"ui_review": <current>,
|
||||
"skip_discuss": <current>
|
||||
"skip_discuss": <current>,
|
||||
"compact_content": <current>
|
||||
},
|
||||
"plan_review": {
|
||||
"source_grounding": <current>
|
||||
@@ -632,6 +644,7 @@ Display:
|
||||
| Git Tagging | {On/Off} |
|
||||
| Skip Discuss | {On/Off} |
|
||||
| Context Warnings | {On/Off} |
|
||||
| Compact Content | {On/Off} |
|
||||
| Saved as Defaults | {Yes/No} |
|
||||
|
||||
These settings apply to future /gsd:plan-phase and /gsd:execute-phase runs.
|
||||
@@ -650,7 +663,7 @@ Quick commands:
|
||||
|
||||
<success_criteria>
|
||||
- [ ] Current config read
|
||||
- [ ] User presented with 24 settings (profile + workflow toggles + features + git branching + git tagging + ctx warnings), grouped into six sections: Planning, Execution, Docs & Output, Features, Model & Pipeline, Misc. `code_review_depth` is conditional on `code_review=on`. Model profile uses a two-question split (Q1: Adaptive / Standard tier / Inherit; Q2: Quality / Balanced / Budget — only when Standard tier chosen) to stay within the 4-option AskUserQuestion cap while exposing all 5 valid profiles (#3784). Drift Guard (`plan_review.source_grounding`) is in the Planning section.
|
||||
- [ ] User presented with 25 settings (profile + workflow toggles + features + git branching + git tagging + ctx warnings + compact content), grouped into six sections: Planning, Execution, Docs & Output, Features, Model & Pipeline, Misc. `code_review_depth` is conditional on `code_review=on`. Model profile uses a two-question split (Q1: Adaptive / Standard tier / Inherit; Q2: Quality / Balanced / Budget — only when Standard tier chosen) to stay within the 4-option AskUserQuestion cap while exposing all 5 valid profiles (#3784). Drift Guard (`plan_review.source_grounding`) is in the Planning section.
|
||||
- [ ] Config updated with model_profile, workflow, and git sections
|
||||
- [ ] User offered to save as global defaults (~/.gsd/defaults.json)
|
||||
- [ ] Changes confirmed to user
|
||||
|
||||
@@ -16,7 +16,7 @@ Interactive configuration of GSD workflow agents and model profile via multi-que
|
||||
Routes to the settings workflow which handles:
|
||||
- Config existence ensuring
|
||||
- Current settings reading and parsing
|
||||
- Interactive 5-question prompt (model, research, plan_check, verifier, branching)
|
||||
- Interactive multi-question prompt covering model profile and workflow toggles (research, plan_check, verifier, drift guard, TDD, code review, worktrees, compact content, and more — see `gsd-core/workflows/settings.md` for the current set)
|
||||
- Config merging and writing
|
||||
- Confirmation display with quick command references
|
||||
</objective>
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
"reductionPct": 8.78
|
||||
},
|
||||
"new-project": {
|
||||
"offTokens": 14112,
|
||||
"onTokens": 12168,
|
||||
"reductionPct": 13.78
|
||||
"offTokens": 14279,
|
||||
"onTokens": 12335,
|
||||
"reductionPct": 13.61
|
||||
},
|
||||
"plan-phase": {
|
||||
"offTokens": 27637,
|
||||
@@ -39,8 +39,8 @@
|
||||
}
|
||||
},
|
||||
"aggregate": {
|
||||
"offTokens": 106923,
|
||||
"onTokens": 90275,
|
||||
"reductionPct": 15.57
|
||||
"offTokens": 107090,
|
||||
"onTokens": 90442,
|
||||
"reductionPct": 15.55
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user