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
12 KiB
Skill Test Spec: /propagate-design-change
Skill Summary
/propagate-design-change handles GDD revision cascades into the architecture.
Given a changed GDD path, it asks git what changed (git diff HEAD, then the last
commit), summarises the changed sections, checks the entity registry for
downstream GDDs to re-check, then finds every ADR that references the GDD — by
scanning ## GDD Requirements Addressed tables plus a prose grep for the GDD's
basename — and reads only that affected set. Each affected ADR is classified
Still Valid / Needs Review / Likely Superseded and the full Design Change Impact
Report is shown before any action.
In full review mode the TD-CHANGE-IMPACT gate (technical-director) reviews the
report before resolution; in lean/solo it is skipped with a note. The user
then decides per ADR (Mark Superseded / Update in place / Keep as-is / Skip), and
every file change — an ADR status line, the traceability index, the
docs/architecture/change-impact-[date]-[system].md report — has its own ask.
The cascade scope follows the changed system's workflow tier (full all ADRs,
standard critical ADRs plus those referencing the GDD, minimal not applicable).
Verdicts: COMPLETE (impact report saved) or BLOCKED (user declined the write).
Static Assertions (Structural)
Checked against the SKILL.md by /skill-test spec — no fixture needed.
- Has required frontmatter fields:
name,description,argument-hint,user-invocable,allowed-tools - Has ≥2 phase headings
- Contains verdict keywords: COMPLETE, BLOCKED
- Contains "May I" ask-before-write language for each file it changes
- Has a next-step handoff at the end (
/architecture-decision,/architecture-review) - Documents that the impact report is shown before any change is made
- Documents gate TD-CHANGE-IMPACT: runs in full, skipped in lean/solo
Director Gate Checks
One gate: TD-CHANGE-IMPACT (technical-director,
.claude/docs/director-gates/td-change-impact.md), spawned after the Design
Change Impact Report is presented and before the per-ADR resolution workflow.
full→ spawned with the full impact report (change summary, classifications, recommended actions)lean→ skipped; output notes "TD-CHANGE-IMPACT skipped — Lean mode."solo→ skipped; output notes "TD-CHANGE-IMPACT skipped — Solo mode."
Verdict handling: APPROVE → resolution workflow; CONCERNS → AskUserQuestion with
Revise the impact assessment / Accept with noted concerns / Discuss further;
REJECT → no resolution; the impact is re-analysed first; NOT ASSESSED [missing
input] → never read as APPROVE: the input is supplied and the gate re-run, or the
run goes on with TD-CHANGE-IMPACT: NOT ASSESSED — [input] stated in the report
and the Verdict line.
Test Cases
Case 1: Happy Path — GDD formula change affects one of two referencing ADRs
Fixture:
project.yaml:modes.workflow: full,modes.review_mode: leandesign/gdd/combat.mdhas an uncommitted edit to a damage formula in its Formulas sectiondocs/architecture/has 4 ADRs; ADR-0003 and ADR-0005 listcombat.mdin## GDD Requirements Addressed; ADR-0003's decision assumed the old formula, ADR-0005's decision does not depend on itdocs/architecture/requirements-traceability.mdexists
Input: /propagate-design-change design/gdd/combat.md
Expected behavior:
- Verifies the file exists; runs
git diff HEAD -- design/gdd/combat.mdand derives the changed sections from the hunks - Prints the Change Summary (changed / unchanged sections, key changes)
- Globs the ADRs (N = 4), greps the requirement tables and the
combatbasename, and reports "Loaded 4 ADRs by scan. 2 reference combat.md (…)" - Reads ADR-0003 and ADR-0005 (size checked with
wc -cfirst) and classifies ADR-0003 Needs Review or Likely Superseded, ADR-0005 Still Valid - Presents the Design Change Impact Report
- Notes "TD-CHANGE-IMPACT skipped — Lean mode."
- Asks "ADR-0003 ([title]) — [status]. What would you like to do?" with the four options; no resolution ask for ADR-0005
- Asks "May I update the traceability index?" and "May I write the change impact
report to
docs/architecture/change-impact-[date]-combat.md?" - Verdict: COMPLETE — change impact report saved
Assertions:
- What changed is taken from
git diff, not from reading two whole documents - Only the 2 referencing ADRs are full-read; the other 2 are not described as verified unaffected
- The full impact report is shown before any resolution ask or write
- A resolution ask is made per Needs Review / Likely Superseded ADR, one at a time
- Each file change (ADR status, traceability index, impact report) has its own ask
- "TD-CHANGE-IMPACT skipped — Lean mode." appears
- Verdict is COMPLETE after the impact report is written
Case 2: Zero matches — "no impact" versus "cannot trace"
Fixture (tables present):
project.yaml:modes.workflow: fulldesign/gdd/combat.mdhas an uncommitted edit- 3 ADRs, each with a
## GDD Requirements Addressedsection, none namingcombat.mdin the table or in prose
Input (both fixtures): /propagate-design-change design/gdd/combat.md
Expected behavior (tables present):
- Both scans return 0 with N = 3
- The files-with-matches check for
## GDD Requirements Addressedis non-empty - Reports "No ADR references combat.md — no architecture impact."
Fixture (tables absent):
- Same GDD edit; 3 ADRs, none containing a
## GDD Requirements Addressedsection and none namingcombat.md
Expected behavior (tables absent):
- Both scans return 0 with N = 3; the section check is also empty
- Reports "3 ADRs found, none contains a 'GDD Requirements Addressed' section —
traceability cannot be computed (a
gate-pre-productionblocker). Run/architecture-decision retrofit [adr]."
Assertions:
- With tables present, the "no architecture impact" message is printed
- With tables absent, the skill does NOT report "no impact" — it reports that traceability cannot be computed and names
/architecture-decision retrofit [adr], the form that skill parses - No per-ADR resolution ask and no ADR edit happens in either fixture
- Skill does NOT error or crash when no references are found
Case 3: Edge Case — Empty diff on a GDD with history
Fixture:
project.yaml:modes.workflow: fulldesign/gdd/combat.mdis committed, has no uncommitted changes, and was not touched by the last commit
Input: /propagate-design-change design/gdd/combat.md
Expected behavior:
git diff HEAD -- design/gdd/combat.mdis emptygit diff HEAD~1 HEAD -- design/gdd/combat.mdis also empty- Reports "no uncommitted or last-commit changes to
design/gdd/combat.md" and asks which revision to propagate - Does not report "no impact" and does not scan ADRs before a revision is chosen
Assertions:
- Both diffs are tried, working tree first, then the last commit
- The "no uncommitted or last-commit changes" report is printed
- The user is asked which revision to propagate
- The empty diff is NOT reported as "no impact"
Case 4: Edge Case — No argument provided
Fixture:
- Multiple GDDs exist in
design/gdd/
Input: /propagate-design-change (no argument)
Expected behavior:
- Skill detects no argument is provided
- Skill fails with: "Usage:
/propagate-design-change design/gdd/[system].mdProvide the path to the GDD that was changed." - No diff, scan or analysis is performed
Assertions:
- Skill outputs the usage message when no argument is given
- The usage example shows the
design/gdd/[system].mdpath format - No
git diffor ADR scan is performed without a target GDD - Skill does NOT silently pick a GDD without user input
Case 5: Director Gate — TD-CHANGE-IMPACT returns CONCERNS in full mode
Fixture:
project.yaml:modes.workflow: full,modes.review_mode: full- A GDD edit that leaves one referencing ADR classified Needs Review
- TD-CHANGE-IMPACT returns CONCERNS: a second ADR was under-classified
Input: /propagate-design-change design/gdd/[system].md
Expected behavior:
- The Design Change Impact Report is presented
technical-directoris spawned viaAgentwith gate TD-CHANGE-IMPACT, passing the full report- CONCERNS are surfaced, naming the flagged ADR
AskUserQuestion:Revise the impact assessment/Accept with noted concerns/Discuss further- The per-ADR resolution workflow starts only after that answer
Assertions:
- TD-CHANGE-IMPACT is spawned after the impact report is shown and before any resolution ask
- The gate receives the full report (change summary, classifications, recommended actions)
- The CONCERNS name the flagged ADR and all three options are offered
- No ADR, traceability or report file is written before the CONCERNS are answered
- No "TD-CHANGE-IMPACT skipped" note appears in
fullmode
Case 6: Workflow tiers — minimal stops before the cascade; standard narrows it
Fixture (minimal):
project.yamlsets nomodeskeys —modes.rigordefaults tominimal, so the workflow resolves tominimaldesign/gdd/loot.mdhas an uncommitted edit
Fixture (standard):
project.yaml:modes.workflow: standard,modes.review_mode: solodesign/gdd/loot.mdhas an uncommitted edit- 4 ADRs, by their Engine Compatibility
Layer: ADR-0001 (Foundation, event bus, no mention ofloot.md), ADR-0002 (Foundation, save system, listsloot.mdin## GDD Requirements Addressed), ADR-0006 (Feature, loot tables, namesloot.mdin prose only), ADR-0007 (Feature, enemy AI, no mention)
Input (both fixtures): /propagate-design-change design/gdd/loot.md
Expected behavior (minimal):
- The diff and Change Summary run as usual
- At the ADR step: "No ADR cascade at minimal workflow — design change recorded; no architecture impact analysis." and the skill stops
Expected behavior (standard):
- The in-scope set is the Foundation ADRs plus any ADR referencing
loot.md: ADR-0001, ADR-0002 and ADR-0006, so N = 3; ADR-0007 is out of scope - Reports "Loaded 3 ADRs by scan. 2 reference loot.md (1 via requirements table, 1 via prose reference only)."
- Full-reads only ADR-0002 and ADR-0006; notes "TD-CHANGE-IMPACT skipped — Solo mode."
Assertions:
- Minimal: no ADR is globbed or read, no gate is spawned or noted, and no write ask is made
- Standard: ADR-0007 is not counted or read, and neither it nor ADR-0001 is described as verified unaffected
- Standard: the prose-only reference in ADR-0006 is caught by the basename grep
- Standard: the Foundation ADRs are found from the
**Layer**rows (Grep pattern="\*\*Layer\*\*" glob="docs/architecture/adr-*.md"), not guessed from titles - Variant — ADR-0007 has no
**Layer**row: it is treated as critical (when in doubt, critical) and joins the in-scope set, so N = 4
Protocol Compliance
- Diffs the GDD and scans ADRs before producing the impact report
- Impact report shown in full before any resolution ask
- Resolution asked per ADR — never one decision for the whole set
- "May I" asked before each file change; ADR content is never deleted, only marked Superseded
- TD-CHANGE-IMPACT runs in
full, skipped with a named note inlean/solo - Ends with follow-up actions matching the resolutions (
/architecture-decisionfor Superseded ADRs,/architecture-reviewwhen many are affected)
Coverage Notes
- A system pinned
minimalthroughsystem_overrideson astandardproject (its change is N/A) is not given its own fixture; Case 6 reachesminimalthrough the project default. - Downstream GDD impact via
design/registry/entities.yamlis not independently fixture-tested. - A GDD with no git history ("appears to be a new GDD, not a revision") and a path that does not exist are not separately tested.
- TD-CHANGE-IMPACT APPROVE, REJECT and NOT ASSESSED paths are not separately tested.
- Stories and epics are outside this skill's scope — it cascades into ADRs and the traceability index only.