Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Produce a complete reusable flat-first Godot UI Theme from a binding visual reference, with two provider-generated source sheets, fixed square nine-slice patches, stable AtlasTexture icons, and native Theme bindings.
.claude/skills/randallliuxin-ui-kit/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -9% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -34% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -37% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 39% | 0% |
Produce one reusable visual system, not a page layout. The result gives a worker a complete Godot Theme, named StyleBoxTexture resources, and named AtlasTexture icons. Its reusable art covers button states, panels, tabs, and semantic icons. It does not create a composite screen, readable UI copy, characters, logos, gameplay geometry, or final Control/Container layout. Do not use it for card frames. Do not use it for portrait frames.
Read references/theme-baseline.md and references/source-sheet-scheme.json before planning. They own the baseline controls, stable runtime names, two provider sheets, fixed patch geometry, and source-to-runtime reuse mappings. The caller's brief supplies visual direction; do not make it repeat this contract.
Accept the shared Asset Skill request schema at .godotmaker/asset-runtime/schema/asset-skill-request.schema.json; require asset_type: ui-kit, a pinned provider (native, codex, gemini, or openai), and at least one readable image in references. Preserve every reference role. Missing or unreadable references and pixel-art requests are input-gate STOP conditions.
Validate the returned document with the shared result schema and checker at .godotmaker/asset-runtime/schema/asset-skill-result.schema.json before family binding checks.
Attach every reference as real image input to both provider calls. The Codex route uses referenced_image_paths; other routes use their declared attachment mechanism. Never reduce a reference to prompt text or silently switch provider. Record provider, image model when exposed, coding model, reasoning, roles, absolute attached paths, call identity, prompt, and attempt in provenance. STOP before generation if the pinned route cannot attach every reference.
This skill can be invoked directly or by an orchestrator with the same contract. Do not read or write ASSETS.md, tags, stage state, generated manifests, stable entries, or worker dispatch state.
theme_plan.json before image generation.It contains:
rendering_medium such as bold comic-book game art,hand-painted fantasy illustration, or glossy mobile-game illustration;
asset_ui_theme_recipe.py:text, text_muted, text_outline, surface, surface_raised, input, primary, secondary, danger, success, border, focus, selection, and shadow;
corner_radius_small,corner_radius_medium, corner_radius_large, border_width, content_margin, shadow_size, shadow_offset, and font_size;
material language, plus the reference roles and paths used to derive them.
Use positive medium language. Do not put pixel-art negations into image prompts. The Theme plan is a deterministic visual-system specification, not generated art.
powershell python tools/asset_ui_source_sheet_plan.py --request ASSET_REQUEST.json --scheme .agents/skills/ui-kit/references/source-sheet-scheme.json --rendering-medium "<theme_plan rendering_medium>" --out source_sheet_plan.json
Use the plan prompts unchanged. Make exactly two provider calls, attaching every reference to each call:
surface_patches_source.png: eight 96x96 square runtime patches for buttonnormal/hover/pressed/disabled, base/raised panel, and selected/unselected tab treatment. Decoration stays inside the declared border band; the declared safe center remains continuous and undecorated.
icons_source.png: 24 unique semantic icons. The plan normalizes Themearrows to 32x32, checks and toggles to 40x40, slider grabbers to 48x48, and reusable action/status icons to 128x128. Its mappings expand to all stable runtime icon names.
Both images use only solid #FF00FF as background, with separated artwork that never touches canvas edges. Save each raw provider image and full provenance. Do not accept a screen mockup as either sheet.
Write source_sheet_provenance.json as an array with exactly one final record per sheet, in plan order. Each record contains sheet_id, final attempt, exact prompt, provider, image_model, coding_model, reasoning, tool_call_id, attached_references, and raw_source_path. Every attached reference entry preserves its request role and readable request-relative path. Keep earlier failed generation attempts under a retries array on that sheet's final record; never replace or conceal them.
the project:
asset_image_finalize.py --background magenta --no-origin creates thetransparent processing source and report.
asset_sheet_process.py --snap-mode autoslice receives the plan's orderedsource component names. Do not pass --grid.
edge, or transparency failure, preserve evidence and regenerate only that provider sheet with the same provider and attachments.
asset_image_finalize.py --resizeto its fixed plan size.
asset_atlas_assemble.py, preserving thefinal physical atlas, metadata, and processing reports.
Do not programmatically draw, replace, or repair art with Pillow, SVG, canvas, ImageMagick, Godot drawing, inline scripts, placeholders, or a new pixel tool. Do not pass raw provider rectangles directly to a compiler.
stylebox_plan.json:powershell python tools/asset_ui_stylebox_plan.py --source-sheet-plan source_sheet_plan.json --theme-plan theme_plan.json --asset-id <asset_id> --out stylebox_plan.json
The fixed profiles, not freehand agent guesses, own borders, content margins, safe centers, stretch modes, and preview sizes. The plan expands eight source patches into 23 stable StyleBoxTexture outputs. Base, Primary, Secondary, and Danger button families reuse the same state patches through deterministic modulate_color; popup and tooltip reuse panel patches. Copy stylebox_plan.styleboxes unchanged into the request at .godotmaker/asset-generation/<asset_id>-request.json under spec.styleboxes and compile every entry.
Compile 31 stable runtime AtlasTexture outputs from the icon metadata. Multiple names may intentionally share one of the 24 source rectangles. Bind only Godot-defined semantic icon slots in Theme; keep other utility icons as independently reusable named runtime resources.
powershell python tools/asset_ui_theme_recipe.py --theme-plan theme_plan.json --asset-id <asset_id> --out theme_recipe.json
The recipe uses native StyleBoxFlat/StyleBoxEmpty resources for input, text, progress, slider, scrollbar, option-button, focus, separator, and undrawn control backgrounds. It uses the compiled texture resources only for button, panel, tab, popup-panel, and tooltip surfaces. Compile the final Theme to res://assets/generated/ui-kit/<asset_id>/<asset_id>_theme.tres.
source_layout sources andgodot_artifact runtime outputs, all under res://assets/generated/ui-kit/<asset_id>/. Sources include theme/source plans, recipe, raw provenance, physical atlases, atlas metadata, and processing reports. Declare each raw provider sheet as grid_sheet, each physical final atlas as region_atlas, and plans/provenance/reports without an invented layout. Use stable report names surface_patches_finalize_report.json, icons_finalize_report.json, surface_patches_process_report.json, and icons_process_report.json. Runtime outputs include the Theme, 23 StyleBoxTexture resources, and 31 AtlasTexture resources.
Every runtime output has one required filename, derived from the name it serves: the Theme at <asset_id>_theme.tres, and every StyleBoxTexture and AtlasTexture at <output_name>.tres. One kit fills one directory, so this is what keeps each output separately bindable — two resources sharing a file would hand a worker the wrong Godot type. check_ui_card_handoff enforces it at L0, so a drifting filename is a repair, not a late failure. The family validator checks each output's declared path. Cross-output path uniqueness is enforced when the manager registers the completed result.
.godotmaker/asset-generation/<asset_id>-request.json and candidate result to .godotmaker/asset-generation/<asset_id>-result.json. Run the public validator after resources exist:
powershell python tools/asset_ui_card_validate.py --request .godotmaker/asset-generation/<asset_id>-request.json --result .godotmaker/asset-generation/<asset_id>-result.json --project-root . --godot-path <configured-godot-path> --allow-failure
It owns L0-L5 facts. L0-L4 check the closed contract, sources and trace, native compilation, Godot load, and structural bindings. L5 instantiates common controls at compact and expanded sizes. L6 is a separate private visual Eval.
Treat a failed level as repair input:
not regenerate valid art for a Godot schema error.
Record retries. STOP only for an input-gate failure or a pinned provider that cannot attach references. Never hand-write L-level values; do not STOP merely because a production validation attempt failed.
Resolve Godot from .claude/godotmaker.yaml's godot_path; when it is absent, use godot on PATH. Do not substitute another installation. If required validation cannot run, return a failed result rather than claiming readiness.
Finish with exactly one generic Asset Skill result JSON object. A successful result is validator-owned. A genuine input-gate STOP has the same generic keys, no outputs, and validation.passed: false with a concrete note. Do not replace the object with prose or Markdown.
The worker owns final page layout. The returned Theme, StyleBoxes, and AtlasTextures are reusable visual-system resources; a reference establishes visual language, not pixel-perfect screen layout.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 32,302 | 5,825 | -82% | 1 | 1 | 0% | 6,198 | 3,007 | -51% | 0 | 0 | — |
case-01 | fail→fail | 30,866 | 6,540 | -79% | 1 | 1 | 0% | 6,196 | 3,028 | -51% | 0 | 0 | — |
case-02 | fail→fail | 32,800 | 6,080 | -81% | 1 | 1 | 0% | 6,189 | 3,041 | -51% | 0 | 0 | — |
case-04 | fail→pass | 23,932 | 7,263 | -70% | 1 | 1 | 0% | 4,388 | 3,992 | -9% | 0 | 0 | — |
case-05 | fail→pass | 33,576 | 7,760 | -77% | 1 | 1 | 0% | 6,162 | 4,084 | -34% | 0 | 0 | — |
case-06 | fail→pass | 16,108 | 8,356 | -48% | 1 | 1 | 0% | 2,198 | 4,234 | +93% | 0 | 0 | — |
case-07 | fail→pass | 32,263 | 6,696 | -79% | 1 | 1 | 0% | 6,165 | 3,904 | -37% | 0 | 0 | — |
case-08 | fail→pass | 13,473 | 2,209 | -84% | 1 | 1 | 0% | 2,251 | 3,127 | +39% | 0 | 0 | — |
case-09 | fail→pass | 26,603 | 1,895 | -93% | 1 | 1 | 0% | 1,904 | 2,991 | +57% | 0 | 0 | — |
case-10 | fail→pass | 14,057 | 3,199 | -77% | 1 | 1 | 0% | 2,293 | 3,235 | +41% | 0 | 0 | — |
case-11 | fail→pass | 11,688 | 2,064 | -82% | 1 | 1 | 0% | 1,779 | 3,032 | +70% | 0 | 0 | — |
case-12 | fail→pass | 8,160 | 2,178 | -73% | 1 | 1 | 0% | 1,489 | 3,044 | +104% | 0 | 0 | — |
case-13 | pass→pass | 10,194 | 5,609 | -45% | 1 | 1 | 0% | 2,041 | 3,942 | +93% | 0 | 0 | — |
case-14 | pass→pass | 5,437 | 3,594 | -34% | 1 | 1 | 0% | 861 | 3,276 | +280% | 0 | 0 | — |
case-15 | fail→pass | 6,578 | 2,543 | -61% | 1 | 1 | 0% | 1,162 | 3,191 | +175% | 0 | 0 | — |
case-16 | fail→pass | 14,408 | 5,029 | -65% | 1 | 1 | 0% | 2,125 | 3,525 | +66% | 0 | 0 | — |
case-17 | pass→pass | 15,072 | 4,135 | -73% | 1 | 1 | 0% | 2,437 | 3,392 | +39% | 0 | 0 | — |
case-18 | fail→pass | 8,008 | 3,728 | -53% | 1 | 1 | 0% | 1,233 | 3,354 | +172% | 0 | 0 | — |
case-19 | fail→fail | 14,332 | 8,245 | -42% | 1 | 1 | 0% | 2,080 | 3,854 | +85% | 0 | 0 | — |
case-20 | fail→pass | 13,278 | 2,368 | -82% | 1 | 1 | 0% | 2,170 | 3,064 | +41% | 0 | 0 | — |
case-21 | fail→pass | 14,130 | 5,112 | -64% | 1 | 1 | 0% | 2,266 | 3,641 | +61% | 0 | 0 | — |
case-22 | pass→pass | 8,684 | 2,214 | -75% | 1 | 1 | 0% | 1,303 | 3,016 | +131% | 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 19 counted toward the lift figure. The other 3 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 +64 percentage points is the difference between those two pass rates over the 19 comparable cases.
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.