Holistic cross-GDD review — contradictions between systems, dominant strategies, economic imbalance, cognitive overload, pillar drift.
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-review-all-gdds-0a99b3174fbe ,按照其中的说明把「review-all-gdds」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
!bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,system_overrides
This skill reads every system GDD simultaneously and performs two complementary reviews that cannot be done per-GDD in isolation:
This is distinct from /design-review, which reviews one GDD for internal
completeness. This skill reviews the relationships between all GDDs.
When to run:
/create-architecture begins (architecture built on inconsistent GDDs
inherits those inconsistencies)Every AskUserQuestion call follows .claude/docs/automation-modes.md
(collaborative asks always · guided major-only · autonomous logs and proceeds;
automation_always_ask categories always prompt).
Argument modes:
Focus: $ARGUMENTS[0] (blank = full)
full: Both consistency and design theory passesconsistency: Cross-GDD consistency checks only (faster)design-theory: Game design holism checks onlysince-last-review: Only GDDs modified since the last review report (git-based)workflow per GDD (per .claude/docs/workflow-modes.md): each GDD validates
against its effective tier — the project value, overridden per system by the
system_overrides row for that system when the block lists one. At full, validate all 8
sections across all GDDs. At standard, validate the 5 required sections;
optional sections (Player Fantasy, Tuning Knobs, conditional Formulas) are
surfaced as advisory only. At minimal, this skill is not applicable (no GDDs).
Before reading any full document, use Grep to extract ## Summary sections
from all GDD files:
Grep pattern="## Summary" glob="design/gdd/*.md" output_mode="content" -A 5
Fail open on a missing Summary. Establish the denominator: glob
design/gdd/*.md and count N. A scan matching fewer than N means those GDDs
predate ## Summary — never treat an absent Summary as a system out of scope.
A zero-match scan means "no GDD carries a Summary yet", not "nothing to review".
This review is holistic and loads its in-scope GDDs regardless (see Phase 1c);
the Summary scan only builds the manifest and narrows since-last-review, it
never shrinks the review set.
Display a manifest to the user:
Found [N] GDDs. Summaries:
• combat.md — [summary text]
• inventory.md — [summary text]
...
For since-last-review mode, compute the scope deterministically instead of
reasoning through git history:
Bash: bash .claude/scripts/review-scope.sh
It prints PRIOR_REVIEW:, a CHANGED: list, and a DEPS ...: list of each
changed GDD's declared dependencies. Use those lists as the scope — the
dependency lines are already the "Key deps" expansion, so no second pass is
needed. If PRIOR_REVIEW: NONE, a full review is required; fall back to full
mode.
Show the user which GDDs are in scope based on summaries before doing any full
reads. Only proceed to L1 for the CHANGED set plus the GDDs named on the
DEPS lines.
Before full-reading any GDD, check for the entity registry:
Read path="design/registry/entities.yaml"
If the registry exists and has entries, use it as a pre-built conflict baseline: known entities, items, formulas, and constants with their authoritative values and source GDDs. In Phase 2, grep GDDs for registered names first — this is faster than reading all GDDs in full before knowing what to look for.
If the registry is empty or absent: proceed without it. Note in the report:
"Entity registry is empty — consistency checks rely on full GDD reads only.
Run /consistency-check after this review to populate the registry."
Read whole (small, and every part is used):
design/gdd/game-concept.md — game vision, core loop, MVP definitiondesign/gdd/game-pillars.md if it exists — design pillars and anti-pillarsdesign/gdd/systems-index.md — authoritative system list, layers, dependencies, statusThen, for every in-scope system GDD, load the sections this review actually consumes — not the whole file:
Grep pattern="^## (Dependencies|Detailed Rules|Detailed Design|Formulas|Tuning Knobs|Acceptance Criteria|Player Fantasy)" glob="design/gdd/*.md" output_mode="content" -A 40
That list is not a guess — it is exactly the union the Parallel Execution
contract below already enumerates: Phase 2 needs Dependencies, Detailed
Design/Rules, Formulas, Tuning Knobs and Acceptance Criteria; Phase 3 needs
Player Fantasy and progression/reward structure. Overview is narrative restated
by the Summary this skill already scanned in Phase 1a, and Edge Cases feeds no
checklist item here (/design-review owns per-GDD completeness). Loading them
put content in three context windows — this one and both sub-agents' — that no
checklist item ever read.
Accept either ## Detailed Rules or ## Detailed Design; the design standard
and the GDD template disagree on the name and they denote the same section.
Escalate to a full read of one GDD when a scanned section cross-references material outside itself, or when a GDD matched zero sections — that GDD predates the template, and a zero-match there means "unstructured", not "empty". Never let a zero-match silently drop a system: the scan narrows the read, it never shrinks the review set.
Report: "Loaded [N] system GDDs covering [M] systems. Pillars: [list]. Anti-pillars: [list]."
If fewer than 2 system GDDs exist, stop:
"Cross-GDD review requires at least 2 system GDDs. Write more GDDs first, then re-run
/review-all-gdds."
Phase 2 (Consistency) and Phase 3 (Design Theory) are independent — they read
the same GDD inputs but produce separate reports. Spawn both as parallel Agent
agents simultaneously rather than waiting for Phase 2 to complete before
starting Phase 3. Collect both results before writing the combined report.
Spawn both as game-designer sub-agents (subagent_type: game-designer) — GDD
consistency and design-theory review is its domain.
When spawning the Phase 2 and Phase 3 agents, always pass:
engine.name and engine.version from project.yaml, resolving each field independently (if its key is absent or empty, use .claude/docs/technical-preferences.md) — plus docs/engine-reference/[engine]/VERSION.mdDo not rely on the subagent to re-read these files — it has its own context window and cannot access Phase 1 results unless they are explicitly passed in the Agent prompt.
Work through every pair and group of GDDs to find contradictions and gaps.
For every GDD's Dependencies section, check that every listed dependency is reciprocal:
⚠️ Dependency Asymmetry
[system-a].md lists: Depends On → [system-b].md
[system-b].md does NOT list [system-a].md as a dependent
→ One of these documents has a stale dependency section
For each game rule, mechanic, or constraint defined in any GDD, check whether any other GDD defines a contradicting rule for the same situation:
Categories to scan:
🔴 Rule Contradiction
[system-a].md: "Minimum [output] after reduction is [floor_value]"
[system-b].md: "[mechanic] bypasses [system-a]'s rules and can reduce [output] to 0"
→ These rules directly contradict. Which GDD is authoritative?
Start from the ## Cross-References table where a GDD has one. That table is
the document's own declaration of what it depends on — templates/game-design-document.md
tells authors it is machine-checked here, and /design-system requires it
whenever Dependencies names another GDD. For each row, confirm the Target GDD
exists and the Specific Element Referenced is still present in it under that
name, with the declared Nature still accurate.
A table that is absent, or still holding the template's bracketed examples, is itself reportable: say the GDD declares no cross-references and that the prose scan below was the only check applied. Do not treat an absent table as "no dependencies" — it far more often means the section was never authored.
Then scan the prose regardless, table or no table: a declared table catches what the author remembered, and the scan below catches what they did not.
For every cross-document reference (GDD-A mentions a mechanic, value, or system name from GDD-B), verify the referenced element still exists in GDD-B with the same name and behaviour:
⚠️ Stale Reference
inventory.md (written first): "Item weight uses the encumbrance formula
from movement.md"
movement.md (written later): Defines no encumbrance formula — uses a flat
carry limit instead
→ inventory.md references a formula that doesn't exist
Two GDDs should not both claim to own the same data or tuning knob. Scan all Tuning Knobs sections across all GDDs and flag duplicates:
⚠️ Ownership Conflict
[system-a].md Tuning Knobs: "[multiplier_name] — controls [output] scaling"
[system-b].md Tuning Knobs: "[multiplier_name] — scales [output] with [factor]"
→ Two GDDs define multipliers on the same output. Which owns the final value?
This will produce either a double-application bug or a design conflict.
For GDDs whose formulas are connected (output of one feeds input of another), check that the output range of the upstream formula is within the expected input range of the downstream formula:
Flag incompatibilities as CONCERNS (design judgment needed, not necessarily wrong):
⚠️ Formula Range Mismatch
[system-a].md: Max [output] = [value_a] (at max [condition])
[system-b].md: Base [input] = [value_b], max [input] = [value_c]
→ Late-[stage] [scenario] can resolve in a single [event].
Is this intentional? If not, either [system-a]'s ceiling or [system-b]'s ceiling needs adjustment.
Scan Acceptance Criteria sections across all GDDs for contradictions:
Review all GDDs together through the lens of game design theory and player psychology. These are issues that individual GDD reviews cannot catch because they require seeing all systems at once.
A game should have one dominant progression loop that players feel is "the point" of the game, with supporting loops that feed into it. When multiple systems compete equally as the primary progression driver, players don't know what the game is about.
Scan all GDDs for systems that:
⚠️ Competing Progression Loops
combat.md: Awards XP, unlocks abilities, is described as "the core loop"
crafting.md: Awards XP, unlocks recipes, is described as "the primary activity"
exploration.md: Awards XP, unlocks map areas, described as "the main driver"
→ Three systems all claim to be the primary progression loop and all award
the same primary currency. Players will optimise one and ignore the others.
Consider: one primary loop with the others as support systems.
Count how many systems require active player attention simultaneously during a typical session. Each actively-managed system costs attention:
More than 3-4 simultaneously active systems creates cognitive overload for most players. Present the count and flag if it exceeds 4 concurrent active systems:
⚠️ Cognitive Load Risk
Simultaneously active systems during [core loop moment]:
1. [system-a].md — [decision type] (active)
2. [system-b].md — [resource management] (active)
3. [system-c].md — [tracking] (active)
4. [system-d].md — [item/action use] (active)
5. [system-e].md — [cooldown/timer management] (active)
6. [system-f].md — [coordination decisions] (active)
→ 6 simultaneously active systems during the core loop.
Research suggests 3-4 is the comfortable limit for most players.
Consider: which of these can be made passive or simplified?
A dominant strategy makes other strategies irrelevant — players discover it, use it exclusively, and find the rest of the game boring. Look for:
⚠️ Potential Dominant Strategy
combat.md: Ranged attacks deal 80% of melee damage with no risk
combat.md: Melee attacks deal 100% damage but require close range
→ Unless melee has a significant compensating advantage (AOE, stagger,
resource regeneration), ranged is dominant — higher safety, only 20% less
damage. Consider what melee offers that ranged cannot.
Identify all resources across all GDDs (gold, XP, crafting materials, stamina, health, mana, etc.). For each resource, map its sources (how players gain it) and sinks (how players spend it).
Flag dangerous economic conditions:
| Condition | Sign | Risk |
|---|---|---|
| Infinite source, no sink | Resource accumulates indefinitely | Late game becomes trivially easy |
| Sink, no source | Resource drains to zero | System becomes unavailable |
| Source >> Sink | Surplus accumulates | Resource becomes meaningless |
| Sink >> Source | Constant scarcity | Frustration and gatekeeping |
| Positive feedback loop | More resource → easier to earn more | Runaway leader, snowball |
| No catch-up | Falling behind accelerates deficit | Unrecoverable states |
🔴 Economic Imbalance: Unbounded Positive Feedback
gold economy:
Sources: monster drops (scales with player power), merchant selling (unlimited)
Sinks: equipment purchase (one-time), ability upgrades (finite count)
→ After equipment and abilities are purchased, gold has no sink.
Infinite surplus. Gold becomes meaningless mid-game.
Add ongoing gold sinks (upkeep, consumables, cosmetics, gambling).
When multiple systems scale with player progression, they must scale in compatible directions and at compatible rates. Mismatched scaling curves create unintended difficulty spikes or trivialisations.
For each system that scales over time, extract:
Compare all scaling curves. Flag mismatches:
⚠️ Difficulty Curve Mismatch
combat.md: Enemy health scales exponentially with area (×2 per area)
progression.md: Player damage scales linearly with level (+10% per level)
→ By area 5, enemies have 32× base health; player deals ~1.5× base damage.
The gap widens indefinitely. Late areas will become inaccessibly difficult
unless the curves are reconciled.
Every system should clearly serve at least one design pillar. A system that serves no pillar is "scope creep by design" — it's in the game but not in service of what the game is trying to be.
For each GDD system, check its Player Fantasy section against the design pillars. Flag any system whose stated fantasy doesn't map to any pillar:
⚠️ Pillar Drift
fishing-system.md: Player Fantasy — "peaceful, meditative activity"
Pillars: "Brutal Combat", "Tense Survival", "Emergent Stories"
→ The fishing system serves none of the three pillars. Either add a pillar
that covers it, redesign it to serve an existing pillar, or cut it.
Also check anti-pillars — flag any system that does what an anti-pillar explicitly says the game will NOT do:
🔴 Anti-Pillar Violation
Anti-Pillar: "We will NOT have linear story progression — player defines their path"
main-quest.md: Defines a 12-chapter linear story with mandatory sequence
→ This system directly violates the defined anti-pillar.
The player fantasies across all systems should be compatible — they should reinforce a consistent identity for what the player IS in this game. Conflicting player fantasies create identity confusion.
⚠️ Player Fantasy Conflict
combat.md: "You are a ruthless, precise warrior — every kill is earned"
dialogue.md: "You are a charismatic diplomat — violence is always avoidable"
exploration.md: "You are a reckless adventurer — diving in without a plan"
→ Three systems present incompatible identities. Players will feel the game
doesn't know what it wants them to be. Consider: do these fantasies serve
the same core identity from different angles, or do they genuinely conflict?
Walk through the game from the player's perspective to find problems that only appear at the interaction boundary between multiple systems — things static analysis of individual GDDs cannot surface.
Scan all GDDs and identify the 3–5 most important player-facing moments where multiple systems activate simultaneously. Look specifically for:
List each identified scenario with a one-line description before proceeding.
For each scenario, step through the sequence explicitly:
Example walkthrough:
Scenario: Player kills elite enemy at level-up threshold during active quest
Trigger: Player lands killing blow on elite enemy
→ combat.md: awards kill XP (100 pts)
→ progression.md: XP total crosses level threshold → triggers level-up
Output: new level, stat increases, ability unlock popup
→ quest.md: kill-count criterion met → triggers quest completion event
Output: quest reward XP (500 pts), completion fanfare
→ progression.md (again): quest XP added → triggers SECOND level-up in same frame
⚠️ Data flow issue: quest.md awards XP without checking if a level-up
is already in progress. progression.md has no guard against concurrent
level-up events. Undefined behavior: does the player level up once or twice?
Does the ability popup fire twice? Does the second level use the updated or
pre-update stat baseline?
For each problem found during the walkthrough, categorize severity:
Add all findings to the output report under "Cross-System Scenario Issues". Each finding must cite: the scenario name, the specific systems involved, the step where the issue occurs, and the nature of the failure mode.
## Cross-GDD Review Report
Date: [date]
GDDs Reviewed: [N]
Systems Covered: [list]
---
### Consistency Issues
#### Blocking (must resolve before architecture begins)
🔴 [Issue title]
[What GDDs are involved, what the contradiction is, what needs to change]
#### Warnings (should resolve, but won't block)
⚠️ [Issue title]
[What GDDs are involved, what the concern is]
---
### Game Design Issues
#### Blocking
🔴 [Issue title]
[What the problem is, which GDDs are involved, design recommendation]
#### Warnings
⚠️ [Issue title]
[What the concern is, which GDDs are affected, recommendation]
---
### Cross-System Scenario Issues
Scenarios walked: [N]
[List scenario names]
#### Blockers
🔴 [Scenario name] — [Systems involved]
[Step where failure occurs, nature of the failure mode, what must be resolved]
#### Warnings
⚠️ [Scenario name] — [Systems involved]
[What the unintended outcome is, recommendation]
#### Info
ℹ️ [Scenario name] — [Systems involved]
[Minor ordering ambiguity or note]
---
### GDDs Flagged for Revision
| GDD | Reason | Type | Priority |
|-----|--------|------|----------|
| [system-a].md | Rule contradiction with [system-b].md | Consistency | Blocking |
| [system-c].md | Stale reference to nonexistent mechanic | Consistency | Blocking |
| [system-d].md | No pillar alignment | Design Theory | Warning |
---
### Verdict: [PASS / NOT ASSESSED / CONCERNS / FAIL]
PASS: No blocking issues. Warnings present but don't prevent architecture.
NOT ASSESSED: One or more review phases could not run — named below.
CONCERNS: Warnings present that should be resolved but are not blocking.
FAIL: One or more blocking issues must be resolved before architecture begins.
### If NOT ASSESSED — what could not be reviewed, and why:
[Name each phase that did not run and the input it needed]
### If FAIL — required actions before re-running:
[Specific list of what must change in which GDD]
NOT ASSESSED — a cross-review is only as wide as what it could read. Rank:
above PASS, below CONCERNS and FAIL. This skill's whole value is
comparing systems against each other, so it is unusually easy for it to look
thorough while covering a fraction of the surface. Emit it when any of:
Report the covered set explicitly either way: GDDs reviewed: [N] of [M] present.
A cross-review that silently skipped half the systems is indistinguishable from
one that found them consistent.
Use AskUserQuestion for write permission:
design/gdd/gdd-cross-review-[date].md?"[A] Yes — write the report / [B] No — skip
[date]here means ISO 8601 —YYYY-MM-DD, e.g.gdd-cross-review-2026-08-19.md. This is not a style preference..claude/scripts/review-scope.shpicks the prior review withsort | tail -1, so lexical order IS chronological order only for ISO dates. Written asaug-19-2026or19-08-2026, the wrong file is chosen as the baseline, the changed-set is computed from it, and GDDs modified since the real last review silently escape the next one. That is the same quiet-escape failure the three fixes documented at the top of that script exist to prevent.
If any GDDs are flagged for revision, use a second AskUserQuestion:
[A] Yes — update systems index / [B] No — leave as-isAfter writing the report (and updating systems index if approved), silently
append to production/session-state/active.md:
## Session Extract — /review-all-gdds [date]
- Verdict: [PASS / NOT ASSESSED / CONCERNS / FAIL]
- GDDs reviewed: [N of M present]
- Phases not run: [names, or "None"]
- Flagged for revision: [comma-separated list, or "None"]
- Blocking issues: [N — brief one-line descriptions, or "None"]
- Recommended next: [the Phase 7 handoff action, condensed to one line]
- Report: design/gdd/gdd-cross-review-[date].md ← only if user approved the write
- Report: (not written — user declined at [date]) ← only if user declined the write
Use the appropriate line based on the user's response to the write-permission widget in Phase 6.
If active.md does not exist, create it with this block as the initial content.
Confirm in conversation: "Session state updated."
After all file writes are complete, use AskUserQuestion for a closing widget.
Before building options, check project state:
Build the option list dynamically — only include options that apply:
Option pool:
[_] Apply quick fix: [W-XX description] in [gdd-name].md — [effort estimate] (one option per simple-edit warning; only for Warning-level, not Blocking)[_] Run /design-review [flagged-gdd-path] — address flagged warnings (one per flagged GDD, if any)[_] Run /design-system [next-system] — next in design order (always include, name the actual system)[_] Run /create-architecture — begin architecture (verdict is PASS/CONCERNS) (include if verdict is not FAIL)[_] Run /gate-check — validate Systems Design phase gate (include if verdict is PASS)[_] Stop hereAssign letters A, B, C… only to included options. Mark the most pipeline-advancing option as (recommended).
In collaborative and guided modes, never end the skill with plain text — always
close with this widget. In autonomous mode, print the verdict and recommended
next step, then record via log_decision (no widget).
First, verify the artifact. If the return contract named a path, check the path exists before treating the phase as done — a named artifact that is not on disk is a failed phase, however fluent the response reads. An agent can burn a full phase and return a plausible preamble having written nothing, which is neither BLOCKED nor an error nor "fails to complete", so the trigger below never fires. Resume it naming the unmet contract; the context is usually still there.
If any spawned agent returns BLOCKED, errors, or fails to complete: surface it
immediately, don't proceed past a dependency it blocks, and always produce a
partial report (retry scope here = fewer GDDs / single-system). Full procedure:
.claude/docs/error-recovery-protocol.md.
In collaborative mode (the default). For guided and autonomous modes,
see .claude/docs/automation-modes.md. In autonomous mode the
PASS/CONCERNS/FAIL verdict is still printed and logged — only the closing
handoff widget is skipped.