enhance(#4139): Phase 8 — the toggle becomes discoverable, and the ledger closes (#4587)

* 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:
Tom Boucher
2026-09-10 00:04:51 -04:00
committed by GitHub
parent 9770258558
commit 2cefa5a5ac
12 changed files with 238 additions and 58 deletions

View File

@@ -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