fix(#3532): warn when global defaults keys are shadowed by a project config

This commit is contained in:
sim
2026-08-15 01:48:41 -04:00
parent 4fe072283d
commit 129871a8be
3 changed files with 82 additions and 0 deletions

View File

@@ -1744,6 +1744,22 @@ Save settings as global defaults for future projects:
When `/gsd-new-project` creates a new `config.json`, it reads global defaults and merges them as the starting configuration. Per-project settings always override globals.
### What a global file can and cannot set at runtime
Two different rules apply, and the difference is deliberate ([#3532](https://github.com/open-gsd/gsd-core/issues/3532)):
- **In a directory with no `.planning/` at all**, `~/.gsd/defaults.json` is the active
configuration — model resolution reads it directly.
- **In a real project (`.planning/config.json` present, even if empty)**, the global file is
**not read for model resolution** — every model-side key it sets (`model_profile`,
`model_overrides`, `models`, `dynamic_routing`, `runtime`, and the rest of the resolution
set) is inert there. GSD prints a one-time stderr warning naming the shadowed keys when it
detects this, instead of failing silently. To apply a global model setting to a project,
put it in that project's `.planning/config.json`.
- **`effort` is the exception**: the install-time effort channel always merges
`~/.gsd/defaults.json` with the project config (that is how `effort sync` works), so a
global `effort` block keeps working in projects and does not trigger the warning.
---
## Observability