Fix release for 1.1.2: the 14 longest skills keep their later phases after a compaction, a question nobody answered is never taken as an answer, settings read the same from a subfolder, the commit check works for a project in a subfolder of a larger repository, every skill opens with a title, and the shipped allow rules no longer approve deleting a branch or writing files without asking. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.2 → v1.1.3). Refs #83 Refs #133 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0185en4t76fPn7315q4c3nko
12 KiB
/design-system — Phase 2: Gather Context
Part of
/design-system.SKILL.mdnames when to read this file; the settings it resolved and the rules under its later headings still apply here.
2. Gather Context (Read Phase)
In this file:
- 2a: Required Reads
- 2b: Dependency Reads
- 2c: Optional Reads
- 2d: Present Context Summary
- 2e: Technical Feasibility Pre-Check
Read all relevant context before asking the user anything. This is the skill's primary advantage over ad-hoc design — it arrives informed.
2a: Required Reads
At
minimal(design-system is voluntary at this tier): readdesign/game-brief.mdin place of the game concept, and skip the systems-index read — neithergame-concept.mdnorsystems-index.mdexists atminimal. Author from the brief's relevant MVP feature and its core loop.This callout keys on the PROJECT tier, not this system's effective tier. The two differ whenever
workflow_overrides.system_overridesbumps one system above aminimalproject — the configuration.claude/docs/settings-guidance.mdadvertises as the reason the override exists ("bump one deep system"). Those two files are absent because the project isminimal; raising this system tostandardorfulldoes not create them. So on aminimalproject, take this branch even for an overridden system, and read the brief.The effective tier still governs everything downstream — the required section set (§1), the skeleton (§3), the section cycle (§4) and §5a. Only the required-reads branch here follows the project tier.
Then derive
Category,LayerandPriorityfrom the brief, once, here. Six later steps are keyed on the systems index you just skipped — §2e's engine domain, Section A's and Section B's recommended options, the Visual/Audio REQUIRED table, §6 specialist routing, and §5-pre's Quick reference — and none of them has an absent-index branch. An overridden system reaches all six atstandardorfull, so "skip the index" leaves them with no input at all. Derive from the brief instead:
Category— one of the nine intemplates/systems-index.md(Core · Gameplay · Progression · Economy · Persistence · UI · Audio · Narrative · Meta), chosen from what the brief says the system does.Layer—Foundationif other systems depend on it, elseFeature.Priority—MVPif the brief's build order lists it, elsePost-MVP.Carry all three for the rest of the run and treat them as the index's answer. Mark them inferred in §5-pre's Quick reference ("Category: Gameplay (inferred from the brief — no systems index at this tier)") so a later reader does not mistake a derivation for an indexed fact. Do not write a systems index to hold them:
/map-systemsowns that file (§5d).Read literally without this rule, an overridden system resolves to
full, falls through to the fail-fast reads below, and aborts with "No game concept found. Run/brainstormfirst" — killing the escape hatch on step one of the very configuration it was built for.
- Game concept: Read
design/gdd/game-concept.md— fail if missing:"No game concept found. Run
/brainstormfirst." - Systems index: Read
design/gdd/systems-index.md— fail if missing:"No systems index found. Run
/map-systemsfirst to map your systems." - Target system: Find the system in the index. If not listed, warn:
"[system-name] is not in the systems index. Would you like to add it, or design it as an off-index system?"
- Entity registry: If
design/registry/entities.yamlexists, grep it for the entries this system owns and the entries that reference it:Grep pattern="source: design/gdd/[system-name].md" path="design/registry/entities.yaml" output_mode="content" -A 6 Grep pattern="design/gdd/[system-name].md" path="design/registry/entities.yaml" output_mode="content" -B 8referenced_by:is a block list (the key and its paths are on separate lines), so match the path with-B 8context to see the owning entry; areferenced_by.*[system-name]one-liner never matches it. Hold these in context as known facts — values that other GDDs have already established and this GDD must not contradict. - Reflexion log: Read
docs/consistency-failures.mdif it exists. Extract entries whose Domain matches this system's category. These are recurring conflict patterns — present them under "Past failure patterns" in the Phase 2d context summary so the user knows where mistakes have occurred before in this domain.
2b: Dependency Reads
From the systems index, identify:
- Upstream dependencies: Systems this one depends on (decisions this system must respect).
- Downstream dependents: Systems that depend on this one (expectations this system must satisfy).
For each dependency GDD that exists, read only the four sections that carry the cross-system contract — not the whole GDD:
Grep pattern="^## ([0-9]+\. )?(Dependencies|Formulas|Edge Cases|Tuning Knobs)" glob="design/gdd/[dep].md" output_mode="content" -A 20
- Key interfaces and data flow (from Dependencies)
- Formulas that reference this system's outputs
- Edge cases that assume this system's behavior
- Tuning knobs that feed into this system
Much of this is already in entities.yaml (loaded in 2a) — the registry's
formula_map/constant_map carry the owned values with their source:. Use the
registry first; the section grep fills what it does not hold.
2c: Optional Reads
- Game pillars: Read
design/gdd/game-pillars.mdif it exists - Existing GDD: Read
design/gdd/[system-name].mdif it exists (resume, don't restart from scratch) - Related systems: do not glob-and-read
design/gdd/*.mdhunting for "thematically related" systems — there is no deterministic proxy for that and it is the read the registry exists to replace.entities.yaml(2a) already holds the cross-system facts a related GDD would supply. If a specific overlap is known, treat it as a dependency above and section-grep it; otherwise rely on the registry.
2d: Present Context Summary
Before starting design work, present a brief summary to the user:
Designing: [System Name]
- Priority: [from index] | Layer: [from index]
- Depends on: [list, noting which have GDDs vs. undesigned]
- Depended on by: [list, noting which have GDDs vs. undesigned]
- Existing decisions to respect: [key constraints from dependency GDDs]
- Pillar alignment: [which pillar(s) this system primarily serves]
- Known cross-system facts (from registry):
- [entity_name]: [attribute]=[value], [attribute]=[value] (owned by [source GDD])
- [item_name]: [attribute]=[value], [attribute]=[value] (owned by [source GDD])
- [formula_name]: variables=[list], output=[min–max] (owned by [source GDD])
- [constant_name]: [value] [unit] (owned by [source GDD]) (These values are locked — if this GDD needs different values, surface the conflict before writing. Do not silently use different numbers.)
If no registry entries are relevant: omit the "Known cross-system facts" section.
If any upstream dependencies are undesigned, warn:
"[dependency] doesn't have a GDD yet. We'll need to make assumptions about its interface. Consider designing it first, or we can define the expected contract and flag it as provisional."
2e: Technical Feasibility Pre-Check
Before asking the user to begin designing, load engine context and surface any constraints or knowledge gaps that will shape the design.
Step 1 — Determine the engine domain for this system: Map the system's category (from systems-index.md) to an engine domain:
Keyed on the Category column of systems-index.md. All nine categories
templates/systems-index.md defines appear here; where a category spans several
engine domains, pick the row matching what the system actually does and say
which you picked.
Category |
Engine Domain |
|---|---|
Gameplay |
Physics for combat / collision / movement; Navigation for AI and pathfinding; Scripting for rule-only systems with no engine surface |
Core |
Core — scene management, state, resource loading; Input for controls and keybinding |
UI |
UI |
Audio |
Audio |
Narrative |
Scripting — dialogue, quests, cutscenes |
Progression |
Scripting — save-adjacent rule logic, no dedicated domain |
Economy |
Scripting — data and rule logic, no dedicated domain |
Persistence |
Core — save/load, settings, serialization |
Meta |
Core — analytics, tutorials, accessibility plumbing |
Animation, Rendering and Networking are engine domains with no category of their own: a system needing them will be
GameplayorCore. Name the domain you read the reference for, whichever row you came in on.
Step 2 — Read engine context (if available):
-
Identify the engine and version: read
engine.nameandengine.versionfromproject.yaml. Resolve each field independently — if its key is absent or empty (including whenproject.yamlhas noengine:block), fall back to.claude/docs/technical-preferences.md(a[TO BE CONFIGURED]value means not set) -
If engine is configured, read
docs/engine-reference/[engine]/VERSION.md -
Read
docs/engine-reference/[engine]/modules/[domain].mdif it exists. If it does not exist, say so by name — "no engine reference for[domain]underdocs/engine-reference/[engine]/modules/; feasibility not checked against the pinned engine" — and carry that into §5-pre. A silent skip here is indistinguishable from a feasibility check that ran and found nothing wrong, which is the failure.claude/rules/skill-authoring.mdobligation 3 exists to stop.This is not a rare branch. The domain table above names
ScriptingandCorefor five of the nine categories (Narrative,Progression,Economy→ Scripting;Persistence,Meta→ Core), plus a sub-row each underGameplayandCore. The Godot reference shipsanimation, audio, input, navigation, networking, physics, rendering, ui— there is noscripting.mdand nocore.md. So the majority of non-Gameplaysystems hit the absent branch every time, andif it existsturned that into silence. Either the reference gains those two files or the check reports it; until the former, do the latter. -
Read
docs/engine-reference/[engine]/breaking-changes.mdfor domain-relevant entries -
Find the domain-matching ADRs without reading every ADR to learn the field you filter on — grep the Domain field first, then read only the matches:
Grep pattern="\*\*Domain\*\*" glob="docs/architecture/adr-*.md" output_mode="content"Read only the ADRs whose Domain matches this system's category (its
## Decisionand## Engine Compatibilitysections); skip the rest.
Step 3 — Present the Feasibility Brief:
If engine reference docs exist, present before starting design:
## Technical Feasibility Brief: [System Name]
Engine: [name + version]
Domain: [domain]
### Known Engine Capabilities (verified for [version])
- [capability relevant to this system]
- [capability 2]
### Engine Constraints That Will Shape This Design
- [constraint from engine-reference or existing ADR]
### Knowledge Gaps (verify before committing to these)
- [post-cutoff feature this design might rely on — mark HIGH/MEDIUM risk]
### Existing ADRs That Constrain This System
- ADR-XXXX: [decision summary] — means [implication for this GDD]
(or "None yet")
If no engine reference docs exist (engine not yet configured), show a short note:
"No engine configured yet — skipping technical feasibility check. Run
/setup-enginebefore moving to architecture if you haven't already."
Step 4 — Ask before proceeding:
Use AskUserQuestion:
- "Any constraints to add before we begin, or shall we proceed with these noted?"
- Options: "Proceed with these noted", "Add a constraint first", "I need to check the engine docs — pause here"
Use AskUserQuestion:
- "Ready to start designing [system-name]?"
- Options: "Yes, let's go", "Show me more context first", "Design a dependency first"