Files
Claude-Code-Game-Studios/.claude/docs/code-root-resolution.md
T
DonchitosandClaude Opus 5.5 be8993bbc5 Release 1.1.3 — long skills keep their later steps
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
2026-10-08 17:52:48 +11:00

3.3 KiB

Code Root Resolution

Shared procedure for any skill that reads, scans, counts or writes game source files. An unresolved code root means the check did not run. This file gives the resolution order.

.claude/docs/directory-structure.md is the authority for which directory holds code. This file is the procedure for applying it.

The roots

engine.name Code root Why it cannot be src/
Godot src/ No constraint; Godot loads from res:// anywhere under the project root
Unity Assets/ Unity compiles only Assets/ and Packages/
Unreal Source/<Module>/ UnrealBuildTool discovers modules under Source/; content lives in Content/

src/ is the Godot row of that table, not a universal path.

Resolution order

  1. engine.name from project.local.yaml, then project.yaml.
  2. The legacy mirror: an Engine: line in .claude/docs/technical-preferences.md. A value of [TO BE CONFIGURED] does not count.
  3. Derivation from the tree, but only when it is unambiguous. Exactly one of src/, Assets/ or Source/ present means that is the root. Two or more present means the project is genuinely undecidable — do not guess. Compare the names exactly as the directory listing spells them: on Windows and default macOS an existence test for Assets/ also succeeds on Godot's own assets/, which would make src/ + assets/ look ambiguous and a lone assets/ look like Unity.
  4. Otherwise: unresolved.

The hooks already implement exactly this as resolve_code_root() in .claude/hooks/yaml-helper.sh. Skills must match its semantics so that a hook and a skill never disagree about where the code lives.

Unresolved does not default to src/

This is the rule the whole file exists for, and it is obligation 2 of .claude/rules/skill-authoring.md: an absent value may not default to the permissive one.

For a read or scan: report NOT ASSESSED — code root unresolved and say which check did not run. Never report zero hits.

A scan anchored to a root the project does not use matches nothing, and nothing is indistinguishable from a clean result. A localization check finds no hardcoded strings; a security scan finds no secrets; a content audit counts no implemented content; a stage detector counts no source files and calls a finished project greenfield. Every one of those reads as a pass. This has been found repeatedly across skills and hooks, which is why the resolution lives in one place now.

For a write: do not write. Report the unresolved root and stop.

Writing game code to the wrong root is worse than a false pass, because it produces a project that cannot build: on Unity, source placed outside Assets/ is never compiled and never appears in the editor, so the work is silently inert. Resolving the engine in order to pick a specialist agent is not the same as resolving the code root — a skill can do the first correctly and still write to the wrong directory.

Applying it

Where a skill says src/, read it as the code root and substitute the table above. Where a skill greps, glob the resolved root. Where a skill writes, write under the resolved root and use the engine's own conventions beneath it (Assets/Scripts/<System>/ on Unity, Source/<Module>/<System>/ on Unreal).