Fix release for 1.1.1: the minimal path end to end, engine commands that run on Godot, Unity and Unreal, hook warnings you can see, and verdicts that say when they could not check. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.1 → v1.1.2). Fixes #67 Fixes #131 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuJn2FdynEybfL5KC697nJ
16 KiB
Workflow Modes — Shared Skill Pattern
This document defines modes.workflow and workflow_overrides — how much
design documentation is REQUIRED before code can begin — for every skill that
authors, reviews, gates, or plans against project artifacts. Skills reference
this document instead of embedding the tier tables inline.
Companion spec: .claude/docs/effects-map.md
sections modes.workflow and workflow_overrides are the source of
truth for behavior. This document is the implementation pattern.
Do not read
effects-map.mdduring a skill run. It is ~2,150 lines (~110 KB) — about five times the size of everything CLAUDE.md loads per session combined — and it is a reference for authoring and changing the spec, not a runtime input. This document is self-sufficient for resolving the tier and applying it: the resolution chain, the three tiers, the required sections, and the override rules are all here. If you hit a case this document genuinely does not cover, read only the oneeffects-map.mdsection for the knob in question — never the file.
Related shared docs: .claude/docs/automation-modes.md (how skills prompt),
.claude/docs/director-gates.md (which reviewers spawn). workflow is
orthogonal to both — it controls what artifacts must exist, not how the
skill prompts or who reviews.
How to Use This Document
A skill that authors, reviews, or gates a design artifact resolves the effective workflow tier at startup, then applies the required-section / required-artifact set for that tier.
Resolution (per skill):
Resolve the workflow tier (store the result; see scope note below):
1. If the resolution is for a named system AND
`workflow_overrides.system_overrides.<system>` is set → use that tier
2. Else read `modes.workflow` from `project.yaml` → use that value
3. Else → use the tier implied by `modes.rigor`
(`minimal`→`minimal`, `standard`→`standard`, `full`→`full`;
`rigor` itself defaults to `minimal`)
modes.workflow has no terminal default — step 3 is the rigor expansion,
not a hardcoded standard. The resolved value is the same for an unconfigured
project, so nothing observable changed; but a skill that hardcodes standard as
its fallback will ignore rigor: minimal and rigor: full entirely.
What <system> is — one derivation, everywhere
<system> is the GDD filename stem: design/gdd/hammer-heat-system.md →
hammer-heat-system. That is the key to write under
workflow_overrides.system_overrides, and every skill must derive it the same
way.
A TR-[system]-NNN ID's [system] segment is an alias, not the key. Accept
it as a fallback match when the GDD stem yields nothing, but never derive the key
from it in preference to the stem.
Why this is stated here rather than per skill. Reading "the
[system]segment of itsTR-[system]-NNNID (else itsdesign/gdd/path)" — TR-ID first — is the wrong order. A system whose GDD ishammer-heat-system.mdand whose requirements areTR-heat-001then had two different override keys depending on whether a registry entry existed, and the documented remedy for a missing GDD section — "setworkflow_overrides.system_overrides.hammer-heat-system: full" — was looked up underheat, found nothing, and continued at the project tier silently. The escape hatch existed and could not be reached.
A key that matches no system is an error, not a no-op. If
workflow_overrides.system_overrides contains a key that resolves to no GDD stem
in design/gdd/, say so — naming the unmatched key and the stems available.
Silently ignoring it is how the above went unnoticed.
Checked where GDDs are expected to already exist — not by the skill that writes them.
/gate-checkis the single implementing site (see.claude/skills/gate-check/SKILL.md§"Per-system overrides"), and it runs at a phase boundary, by which point every in-scope GDD should be on disk. An unmatched key there is genuinely suspicious.
/design-systemcreatesdesign/gdd/<system>.md, so before its first run the override key matches no stem by definition — that is the healthy case, not an error. It must not report the key as orphaned, and must not refuse to apply the tier it names. The same holds for any other authoring skill running before the GDD exists. Applying this rule there would fire on exactly the configuration it was written to protect.
Step 1 (the per-system override) applies to skills that act on a named system:
- Single-system, resolve once per run:
design-system,design-review,dev-story,story-done,create-stories(one story/epic per invocation). - Multi-system, resolve once per item:
story-readiness(per story acrossall/sprintscope),qa-planandregression-suiteaudit (per GDD/system). These do NOT freeze a single tier for the run — different systems in one run may resolve to different tiers.
Skills that operate project-wide (gate-check, create-epics) use the
project-level workflow plus consider per-system overrides where the tier table
says so.
"Critical ADR" (used in the tier tables): an ADR governing a Foundation-layer system (scene management, event architecture, save/load, and the like — the systems whose decisions everything else depends on). At
standard, only critical ADRs are required/blocking; non-critical ADRs are advisory. When in doubt about an ADR's layer, treat it as critical (fail safe toward requiring it).
modes.workflow reads via resolve_config --keys workflow (or
resolve_setting modes.workflow), which applies the whole chain including the
rigor expansion. Do not use get_effective_yaml_key modes.workflow: it
reads the two YAML files only, so on a project that sets modes.rigor and not
modes.workflow it returns empty while the effective tier is whatever rigor
implies. (project.local.yaml is not allowed to override workflow — it is locked
to project.yaml per the whitelist — so the only sources are project.yaml and
the expansion.) Per-system overrides read via
get_yaml_key project.yaml workflow_overrides.system_overrides.<system>.
The Three Tiers
| Tier | Token/time cost | Required before code | Best for |
|---|---|---|---|
full |
High | All 8 GDD sections per system, full architecture, all ADRs, art bible, UX specs per screen | Teams, commercial titles, learning the full pipeline |
standard |
Balanced | 5 GDD sections per system, one architecture doc, critical ADRs, game concept, systems index | Projects that outgrew a brief - several interacting systems, or a design someone else implements |
minimal |
Low | One-page design/game-brief.md + engine choice (its build-order field is the plan — no separate sprint plan) |
Default. Jam projects, small scope, design already in your head |
Default: minimal (the rationale block above _yaml_helper_defaults in
.claude/hooks/yaml-helper.sh carries the reasoning and the ordering
constraint). Set by: /start (via modes.rigor), /settings. Locked to
project.yaml (not locally overridable — divergence would change which
artifacts must exist on disk).
Permissive, not restrictive.
workflowcontrols what is REQUIRED, not what is ALLOWED. Any skill can run at any tier. The setting changes whatgate-checkenforces and what completeness checks validate — never what the user can invoke.
minimalfloor. Even at minimal, engine choice and a filleddesign/game-brief.mdare required before code starts — the brief's build-order field is the plan, so there is no separatesprint-planstep. Everything else can be skipped.
"Game brief" is a real artifact at
minimal:design/game-brief.md./brainstormwrites it from the one-page template (.claude/docs/templates/game-brief.md) when the effective tier isminimal, in place of the full-lengthdesign/gdd/game-concept.mdit writes atstandard/full. The two are distinct files for distinct tiers: any check, gate, or glob for theminimaldesign artifact must targetdesign/game-brief.md;game-concept.mdremains thestandard/fullconcept doc.
GDD Required Sections per Tier
The 8 GDD sections: Overview, Player Fantasy, Detailed Rules, Formulas, Edge Cases, Dependencies, Tuning Knobs, Acceptance Criteria.
Section-name alias. "Detailed Rules" is the canonical name in the design standard, but the GDD template (
.claude/docs/templates/game-design-document.md) and/design-systemauthor this section under the heading## Detailed Design(with Core Rules / States / Interactions sub-headings). The two names denote the same required section — any skill that detects or validates section presence (design-review,gate-check,adopt,project-stage-detect) must accept either heading. Do not treat "Detailed Rules" as missing when## Detailed Designis present.
| Tier | Required GDD sections |
|---|---|
full |
All 8 |
standard |
5 required: Overview, Detailed Rules, Edge Cases, Dependencies, Acceptance Criteria. Conditional: Formulas — required when the system defines numeric rules (rates, curves, thresholds, costs, damage, drop weights — anything a balance pass would tune); optional only when it defines none. The Category column is a hint, not the test. Skipped: Player Fantasy, Tuning Knobs. |
minimal |
None — design/game-brief.md replaces GDDs. A GDD may still be authored voluntarily. |
Edge Cases is required at
standard(it was promoted from optional — skipping it produced "what happens if X is null?" debt during implementation).
Art bible is conditional at
standard— required only if visual asset stories exist in the project. Code-focused projects skip it. Atfull, all 9 art bible sections are required. (workflow_overrides.art_bible_strict: trueforces all 9 regardless of tier.)
workflow_overrides
This key holds two mechanisms with different directional rules. Read the one you are using — conflating them is a known and easy mistake.
workflow_overrides:
# --- the three boolean FLAGS: additive, stricter-only ---
edge_cases: false # force Edge Cases required (no-op at standard/full; relevant at minimal)
tuning_knobs: false # force Tuning Knobs required (relevant at standard, no-op at full)
art_bible_strict: false # force all 9 art bible sections regardless of asset stories
# --- system_overrides: replaces a tier, BOTH directions ---
system_overrides: {} # per-system tier overrides (see below)
The three boolean flags are additive on top of the chosen workflow level —
they make requirements STRICTER, never looser. Each one only ever forces a
requirement on; setting a flag cannot opt out of a requirement the tier
imposes. There is no value of edge_cases, tuning_knobs or art_bible_strict
that removes anything.
system_overrides is not a flag and is not additive. It replaces the
effective tier for one named system, in either direction — see the next
section. A loosening override genuinely loosens: on a full project,
system_overrides.inventory: minimal drops that system's required sections to
zero. That is the intended design (it is what makes "one trivial system inside a
serious project" expressible), but it means an override is not a safe
no-op — do not leave one in place assuming the stricter-only rule protects you.
Per-system overrides
workflow_overrides:
system_overrides:
combat: full # combat GDD requires all 8 sections regardless of project workflow
inventory: minimal # inventory needs no GDD — the game brief covers it (minimal = no required sections)
system_overrides is a map of system_name: workflow_level. The named system
uses the override tier; all other systems use the project-level workflow.
A skill acting on a named system resolves its effective tier via step 1 of the
resolution chain above.
Effective-Tier Resolution Worked Example
Project has modes.workflow: standard, workflow_overrides.system_overrides.combat: full.
/design-system combat→ effective tier full → requires all 8 sections/design-system inventory→ no override → effective tier standard → 5 sections + conditional Formulas/gate-check(Systems Design → Technical Setup) → requires the combat GDD at 8 sections AND every other MVP GDD at 5 sections before passing
Per-Skill Behavior (the working summary — sufficient at runtime)
Authoring — branch on the effective tier for required sections (and, for
brainstorm, for which design artifact is produced — design/game-brief.md at
minimal vs design/gdd/game-concept.md at standard/full):
brainstorm, design-system, art-bible, create-architecture, ux-design,
map-systems, architecture-decision.
Review/validation — validate against the effective tier; missing
required sections block, missing optional sections warn:
design-review, review-all-gdds, architecture-review, consistency-check,
content-audit.
Gate enforcement — gate-check uses a different artifact checklist per
stage per tier (the highest-visibility impact). Each gate's own checklist and
tier reductions live in .claude/skills/gate-check/references/gate-<phase>.md,
and /gate-check loads only the one gate it is running — that is the right
place to look, not effects-map.md.
Planning/implementation — adjust artifact prerequisites:
create-epics, create-stories, dev-story, story-readiness, story-done,
qa-plan, regression-suite.
Support — adjust "what's missing" expectations so optional docs aren't
flagged as gaps: project-stage-detect, adopt, reverse-document,
propagate-design-change, help.
Workflow Change Mid-Project
When workflow changes via /settings, emit an informational note:
"Workflow changed from [old] to [new]. Run
/content-auditto see what's now required or extra. No automatic migration — existing files stay in place."
No documents are auto-deleted, auto-generated, or blocked. The setting only affects new enforcement going forward.
Companion Settings
These are separate settings that compose with workflow. The summaries below
are what a skill needs at runtime; effects-map.md carries the exhaustive
per-skill tables for spec authors, and is not worth loading to apply a knob.
All four below are fronted by
modes.rigor(docs.density,modes.story_granularity,qa.level,team.size— along withworkflowitself, andmodes.review_mode, for six fronted knobs total). One question at/startsets all of them; setting any explicitly overrides just that one and leaves its siblings on the rigor level.team.sizeandmodes.review_modeare the two that also stay overridable fromproject.local.yaml(they are personal-experience knobs, not on-disk artifacts).
docs.density(terse|balanced|thorough) —workflowcontrols which sections exist;densitycontrols how deep each section goes.rigorsets the two together; overridedocs.densityalone to getfull+terse= "all 8 sections, each compact."modes.story_granularity(coarse|balanced|fine) — how big each story is and how many per epic/sprint.qa.level(minimal|standard|full) — what test evidence is required to mark stories Done. Composes withtesting.strict:qa.level= is evidence required;testing.strict= do failures block.team.size(individual|small|studio) — which agents are active by default. Different axis from workflow: workflow controls what docs are required, team.size controls which agents exist to make them.