Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Asset stage manager. Reads current-tag ASSETS.md gaps, accepts user-provided assets, plans visual production units, dispatches asset-producer subagents, collects reports, registers generated-asset stable entries, updates ASSETS.md. Explicit invocation only - use /gm-asset.
.claude/skills/randallliuxin-gm-asset/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 191% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 130% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 172% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 190% | 0% |
$ARGUMENTS
You manage the asset stage for the current tag. Read the tag from PLAN.md's **Tag:** header. Process only ASSETS.md rows whose Tag matches the current tag and whose Status is MISSING.
Write asset to .godotmaker/current_role before any other action.
Asset is re-runnable per tag. Use the current state of ASSETS.md, SCENES.md, references/, and .godotmaker/asset-generation/.
Stop when any required input is missing:
project.godot: tell user to run /gm-scaffold.ROADMAP.md, STYLE.md, ASSETS.md, SCENES.md, or PLAN.md: tell userto run /gm-gdd.
**Tag:** header in PLAN.md: tell user to re-run /gm-gdd.Proceed when either check has current-tag work:
ASSETS.md row, including an Audio table row, with statusMISSING. Under Manager Rule 9, mark unavailable audio rows deferred before considering the no-work path; only explicitly deferred audio is exempt from this check.
references/scene_{name}.png or reportis missing or stale against SCENES.md and the Visual Asset Contract.
If neither check has work — no current-tag row is MISSING, unavailable audio is explicitly deferred, and all current-tag scene references are current — record the completed asset stage before stopping:
bashpython tools/append_stage_event.py asset
Then stop with:
textNo MISSING assets and no missing scene references for the current tag. Recommended next: /gm-build. If you've added new art files or scenes since last run, just tell me and I'll re-scan.
ASSETS.md and .godotmaker/.assets/ or references/.analyst for user-provided asset inspection.asset-producer for generated visual production units.GDD.md, PLAN.md, GAP.md, STRUCTURE.md, SCENES.md, orSTYLE.md.
deferred unless the user provided matching files.Read .godotmaker/config.yaml and use asset_image_model.
| asset_image_model | Provider doc | | --- | --- | | native | references/providers/native.md | | codex | references/providers/codex.md | | gemini:<model> or gemini | references/providers/gemini.md | | openai:<model> or openai | references/providers/openai.md |
If the configured provider is unavailable, stop and ask the user to choose another asset_image_model.
Include the selected provider doc in every asset-producer brief.
Read asset_producer_model from .godotmaker/config.yaml and include it as model: in every asset-producer Agent call.
Use references/asset-planner.md for production-unit selection.
| Production unit | First entry document | | --- | --- | | screen-reference | First-class screen-reference Asset Skill | | character-bundle | First-class character-bundle Asset Skill | | fx-bundle | First-class fx-bundle Asset Skill | | ui-kit | First-class ui-kit Asset Skill | | card-kit | First-class card-kit Asset Skill | | compact-prop-pack | First-class compact-prop-pack Asset Skill | | background-map | First-class background-map Asset Skill | | platform-strip | First-class platform-strip Asset Skill | | scene-prop-set | First-class scene-prop-set Asset Skill | | tileset | First-class tileset Asset Skill |
ASSETS.md.PLAN.md, STYLE.md, SCENES.md, and STRUCTURE.md.generated visual production units.
Read references/analyst-dispatch.md.
Run:
bashpython tools/asset_user_preflight.py --project-root .
When image candidates exist:
analyst with only the candidate paths.assets/manifest.json.direct_runtime current-tag rows to provided, andfill Runtime Type and the res:// Runtime Path of the accepted file in the same edit. A provided row with incomplete runtime columns cannot be resolved into a worker snapshot.
source_for_processing rows in the generated visual production plan.For audio candidates:
provided.Read:
references/asset-planner.mdreferences/asset-runtime-pipeline.mdWrite plan artifacts under .godotmaker/asset-generation/work/.
Use references/asset-planner.md for grouping, dependencies, batch rules, and plan artifact fields.
Apply the Visual Anchor Gate from references/asset-planner.md before dispatching generated visual work.
Dispatch asset-producer for every generated visual production unit.
Agent call shape:
textAgent({ subagent_type: "asset-producer", description: "Asset Producer: {unit_id}", model: "{asset_producer_model from .godotmaker/config.yaml, default: sonnet}", prompt: "{brief below}" })
Read references/asset-curation.md when the selected production unit produces source sheets, candidates, extracted frames, or selected final assets.
Every family is a first-class Asset Skill. Put the named Skill in the brief; there is no production-unit document left to substitute for one:
| Family | Production contract in the brief | | --- | --- | | background-map | First-class Asset Skill: background-map | | character-bundle | First-class Asset Skill: character-bundle | | fx-bundle | First-class Asset Skill: fx-bundle | | platform-strip | First-class Asset Skill: platform-strip | | screen-reference | First-class Asset Skill: screen-reference | | ui-kit | First-class Asset Skill: ui-kit | | card-kit | First-class Asset Skill: card-kit | | scene-prop-set | First-class Asset Skill: scene-prop-set | | compact-prop-pack | First-class Asset Skill: compact-prop-pack | | tileset | First-class Asset Skill: tileset |
Brief shape:
text## Asset Production Unit: {unit_id} ### Objective {one concrete generated visual production unit} ### Production Contract - First-class Asset Skill: {background-map | character-bundle | fx-bundle | platform-strip | screen-reference | ui-kit | card-kit | compact-prop-pack | scene-prop-set | tileset} - Invoke that named Skill with one shared generic asset request. Every production unit is a first-class Skill; there is no production-unit document to read and no fallback contract for a family. ### First-Class Result Registration One production unit may return many outputs. Register all runtime outputs together or none through `tools/asset_result_registration.py`; do not choose an anchor output, create a stable entry, or write a family-specific entry draft. - Validate the generic result with `tools/asset_skill_contract_check.py`. - On a failed validation, report the failure and do not register it. - On success, retain sources and evidence in the producer report and send only the request/result to direct registration. Each runtime output needs a named logical asset row. For runtime families, reference outputs are validated evidence only and are not registered; only reference-only families register a `source_ready` reference row. - The manager consumes the validated result directly. It never reads or writes registration drafts, manifests, or family-specific adapter state. ### Provider - {references/providers/<provider>.md} - Configured provider: {provider from plan.provider} ### Shared Docs - `references/asset-result-registration.md` - {references/asset-runtime-pipeline.md} - {references/asset-curation.md when needed} ### Inputs - ASSETS.md rows: {row ids or names} - Style seed: STYLE.md - Scene docs: SCENES.md sections or references - Canonical references: {paths} ### Outputs - Generated output directory: `assets/generated/{asset_type}/{asset_id}/` - Raw source paths: {scratch paths under .godotmaker/asset-generation/sources/} - Runtime output paths: {final loadable Godot resources for the logical rows} - Reference paths: {paths under references/ for reference-only assets} - Prompt paths: {paths} - Report path: {path} ### Scope - Write only the listed outputs. - Use only the production contract and docs it references. - Return the required Asset Producer Report, ending with its machine outcome block.
Do not dispatch one subagent per ASSETS.md row when the work is one bundle. Dispatch one subagent per production unit.
Use this procedure for every production unit.
Resolve the configured Godot executable from .claude/godotmaker.yaml's godot_path; when it is absent, use godot from PATH.
unit. The request declares the complete logical output set; the result must match it exactly.
ASSETS.md uses the Runtime Type / Runtime Path runtime table. Everyworker-consumable logical output has one row. Sources, atlases, candidates, and curation evidence remain in production reports.
Godot before its row becomes generated:
bashpython tools/asset_result_registration.py --assets-md ASSETS.md --tag <tag> \ --request <validated-request.json> --result <validated-result.json> \ --godot-path <configured-godot-path>
Missing, duplicated, unexpected, out-of-project, missing, unloadable, or wrong-type runtime outputs fail closed and leave all rows unchanged. Runtime-family reference outputs remain validated evidence and do not create rows; a reference-only family output becomes source_ready and is never a worker runtime asset.
manifests, or family-specific entry drafts. Do not use an anchor output for a multi-output production unit.
result registration.
For current-tag rows only, use the result-registration command above. Runtime rows are complete only with Status: generated, an explicit Runtime Type, and a final loadable Runtime Path. Only reference-only family rows use Runtime Type: reference and Status: source_ready; they never enter a worker snapshot. Reference outputs returned by runtime families remain result evidence, not rows. Generation Params may retain production inputs and evidence links, but never runtime metadata or a manifest pointer.
ASSETS.md status transitions are forward-only:
textMISSING -> provided | generated | source_ready | deferred
If the user wants to regenerate an accepted prior asset, add a current-tag row or leave a fix task for a later role.
Runtime rows are complete at generated only after direct registration. Reference-only rows complete at source_ready; runtime-family reference outputs remain result evidence. If any output cannot be validated, report the failing production unit and leave its rows unchanged.
After ASSETS.md has no current-tag MISSING rows and all unavailable current-tag audio rows are explicitly deferred:
bashpython tools/append_stage_event.py asset
bashgit status --porcelain
bashgit add -A git commit -m "chore(asset): <Tag>"
textAsset complete. Recommended next: /gm-build
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,364 | 4,545 | +4% | 1 | 1 | 0% | 178 | 3,409 | +1815% | 0 | 0 | — |
case-02 | fail→fail | 4,230 | 5,189 | +23% | 1 | 1 | 0% | 206 | 3,475 | +1587% | 0 | 0 | — |
case-03 | fail→fail | 4,464 | 4,336 | -3% | 1 | 1 | 0% | 250 | 3,439 | +1276% | 0 | 0 | — |
case-04 | fail→fail | 11,480 | 2,115 | -82% | 1 | 1 | 0% | 1,824 | 3,622 | +99% | 0 | 0 | — |
case-05 | fail→pass | 7,999 | 3,674 | -54% | 1 | 1 | 0% | 1,330 | 3,864 | +191% | 0 | 0 | — |
case-06 | fail→fail | 9,354 | 5,229 | -44% | 1 | 1 | 0% | 1,435 | 3,484 | +143% | 0 | 0 | — |
case-07 | fail→fail | 8,061 | 6,770 | -16% | 1 | 1 | 0% | 1,252 | 3,674 | +193% | 0 | 0 | — |
case-08 | pass→pass | 10,909 | 3,095 | -72% | 1 | 1 | 0% | 1,737 | 3,720 | +114% | 0 | 0 | — |
case-09 | fail→pass | 11,095 | 3,026 | -73% | 1 | 1 | 0% | 1,982 | 3,756 | +90% | 0 | 0 | — |
case-10 | fail→pass | 10,231 | 4,791 | -53% | 1 | 1 | 0% | 1,548 | 3,567 | +130% | 0 | 0 | — |
case-11 | fail→fail | 8,007 | 2,791 | -65% | 1 | 1 | 0% | 1,295 | 3,789 | +193% | 0 | 0 | — |
case-12 | pass→pass | 12,319 | 7,224 | -41% | 1 | 1 | 0% | 2,049 | 3,936 | +92% | 0 | 0 | — |
case-13 | fail→fail | 11,081 | 3,932 | -65% | 1 | 1 | 0% | 1,699 | 3,925 | +131% | 0 | 0 | — |
case-14 | pass→pass | 9,791 | 2,732 | -72% | 1 | 1 | 0% | 1,794 | 3,754 | +109% | 0 | 0 | — |
case-15 | pass→fail | 10,266 | 7,550 | -26% | 1 | 1 | 0% | 1,718 | 3,752 | +118% | 0 | 0 | — |
case-16 | fail→pass | 9,605 | 3,717 | -61% | 1 | 1 | 0% | 1,419 | 3,864 | +172% | 0 | 0 | — |
case-17 | fail→pass | 7,343 | 4,138 | -44% | 1 | 1 | 0% | 1,356 | 3,937 | +190% | 0 | 0 | — |
case-18 | fail→fail | 3,745 | 4,994 | +33% | 1 | 1 | 0% | 589 | 3,637 | +517% | 0 | 0 | — |
case-19 | fail→pass | 8,693 | 3,210 | -63% | 1 | 1 | 0% | 1,442 | 3,767 | +161% | 0 | 0 | — |
case-20 | pass→pass | 11,689 | 3,227 | -72% | 1 | 1 | 0% | 1,864 | 3,832 | +106% | 0 | 0 | — |
case-21 | fail→pass | 6,409 | 2,944 | -54% | 1 | 1 | 0% | 1,027 | 3,705 | +261% | 0 | 0 | — |
case-22 | fail→pass | 11,086 | 2,375 | -79% | 1 | 1 | 0% | 1,779 | 3,635 | +104% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 17 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 17 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.