v0.3.4 — 2026-05-10¶
PATCH bump landing a batch of SKILL / tooling fixes plus a pipeline-wide
disable of gdtoolkit (gdlint + gdformat) due to recurring crashes on
ECS-style class shapes. See
docs/decisions/disable-gdtoolkit.md
for the full rationale and restore guide; tracked as ROADMAP R-112.
The godot-e2e SKILL is also synced to upstream v1.2.0 so projects on
Godot 4.5 get the new Locator / expect() / engine-log-capture API.
Projects on Godot 4.3 / 4.4 stay on godot-e2e v1.1.0 per
config/addon_versions.json — older SKILL revision required, do not mix.
No migration script is required — every change is either a runtime fix in
publish.py / migrate.py / check_project.py or a SKILL / agent / docs
revision. Existing target projects pick up the changes on the next
tools/publish.py invocation (or --force to refresh .claude/skills/).
Added¶
.worktreeincludewritten bypublish.py. New project-root file (gitignore syntax) carrying.claude/(minus.claude/worktrees/) into sub-agent worktrees so workers can readgodotmaker.yamlandskills/from their isolated cwd. Anthropic-documented mechanism — see https://code.claude.com/docs/en/worktrees.
Changed¶
godot-e2eSKILL synced to upstream v1.2.0 — addsLocator(semantic node queries),expect(locator)auto-retry assertions, and engine log capture (GodotE2EError.logs). Projects on Godot 4.3 / 4.4 stay on godot-e2e v1.1.0 perconfig/addon_versions.json— older SKILL revision required, do not mix.
Fixed¶
gm-verify,gm-evaluate,gm-finalizeassumedgodotwas onPATH. Each SKILL now readsgodot_pathfrom.claude/godotmaker.yaml(written bytools/publish.pyat first install) and substitutes it for<godot_path>in everygodot --headless …command. Falls back to plaingodotif the field is missing; STOPs and asks for re-publish if both fail.gm-verifygdUnit4 invocation was stale. Updated to gdUnit4 v4.x syntax:addons/gdUnit4/bin/GdUnitCmdTool.gd(capital U, different entry script) and--ignoreHeadlessMode(required under--headless).tools/check_project.pycheck_e2e()fallback misclassifiedconftest.py. Fallback now skipsconftest.py/__init__.pyand requirestest_*.py/*_test.pynaming before adding toe2e_files. Defense-in-depth alongside the--allremoval ingm-verify.tools/migrate.pyhalted on legacy targets it could deterministically resolve. Legacy targets (.godotmaker/versionpresent but noapplied_migrations.json) with migration scripts on disk previously raisedLegacyTargetWithMigrationsErrorand forced manual recovery. They couldn't have been applied yet (predate the migrations' introduction), somigrate.pynow auto-creates{"applied": []}and falls through to the pending-application path.migrate.py --baselineremains for the hand-applied edge case. DeadLegacyTargetWithMigrationsErrorclass + handlers + wiki entries removed.gm-verify"When Done" step 2 specified WHAT but not HOW for the stage event append — verifier pickedEdit(replace semantics), which silently no-op'd on non-matchingold_stringand stalled cli despite a passingverify_report.json. Aligned to the sibling SKILLs' explicit Read → append → write-back idiom plus aDo NOT use Editwarning.- Reviewer agent over-read context regardless of change size.
agents/reviewer.mdExecution Steps reordered: read deliverables FIRST, discover reviewer skills via directory pattern (glob.claude/skills/*/checklist.md— convention isSKILL.md+gotchas.md+checklist.mdtrio; reference skills likegecs/with onlygotchas.mdare excluded), match by evidence in the deliverables, load gotchas + checklist ONLY for matched domains. Hardcoded 8-reviewer list removed — the directory IS the catalog. New scope-size rule: skip ECS general review when all deliverables are test files (test_*.gd/*_test.gd) AND ≤3 of them.
Removed¶
- gdtoolkit (gdlint + gdformat) disabled across the pipeline. Recurring
gdtoolkit/linter/class_checks.py:144 NotImplementedErrorcrashes on ECS-style class shapes had zero project-code signal — value is style consistency only.verify_report.jsonlint schema preserved so consumers don't need to special-case. Tracked as ROADMAPR-112; rationale + restore guide indocs/decisions/disable-gdtoolkit.md. - Stale
--alle2e gating ingm-verifystatic check.python tools/check_project.py --allreplaced with--build --ecs --tests --plan --mcp. Thee2e/suite is owned by the Evaluator (pergm-buildHard Rule 2 /gm-evaluatePhase 2); gating it during verify caused phantom failures on every fresh tag's first verify.