Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate non-pixel-art, horizontally repeatable platform strips from real image sources as fixed Texture2D cells or AtlasTexture regions.
.claude/skills/randallliuxin-platform-strip/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -53% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -22% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -31% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 77% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 5% | 0% |
Use for collision-aligned floors, bridges, rails, pipes, terrain ledges, and long horizontal hazards. Do not use for characters, UI, compact props, full backgrounds, or pixel art.
Accept the shared Asset Skill request schema at .godotmaker/asset-runtime/schema/asset-skill-request.schema.json with asset_type: "platform-strip". Use the shared result schema and checker. This skill can be invoked directly or by an orchestrator with the same contract. Do not read or write ASSETS.md, tags, stage state, or generated manifests.
spec must contain exactly:
json{ "kind": "single" | "atlas", "grid": {"columns": 3, "rows": 1, "cell_width": 160, "cell_height": 80}, "segments": [ {"name": "left_cap", "role": "left_cap", "slot": [0, 0]}, {"name": "repeat_middle", "role": "repeat_middle", "slot": [1, 0]}, {"name": "right_cap", "role": "right_cap", "slot": [2, 0]} ] }
The fixed grid dimensions are positive integers. This v1 family is one closed horizontal row: rows must be 1, columns must equal segments.length, and entries must be declared in left-to-right slot order as [0, 0] through [columns - 1, 0]. The first entry is the only left_cap, the last is the only right_cap, and every interior entry is repeat_middle. Empty slots, reordered entries, and a request without a repeatable middle segment are unsupported.
references is optional. With references, validate every path is readable, preserve each declared role, and pass the actual images to the selected provider. Do not replace image attachments with prompt text. If the pinned provider cannot accept the supplied images, return STOP. Without references, generate from the written brief.
Honor the requested provider exactly. native, codex, gemini, and openai never fall back to another provider. For Codex, call the image provider with referenced_image_paths containing each readable local reference image. If that attachment cannot be made, STOP. Record the provider, model, prompt, reference paths and roles, provider payload or trace, raw source path, and processing reports under .godotmaker/asset-generation/ using the provider's controlled report or claim tool; never hand-write provenance JSON.
tools/asset_layout_guide.py using the declared grid. The guide is not art and is not a runtime output.#FF00FF background, a shared walkable top height, no labels, UI, actors, text, props, or grid lines. Preserve the provider's returned pixels as the raw source even when its raster dimensions differ from the target grid..godotmaker/asset-generation/sources/<asset_id>_source.png. For codex, follow skills/core/gm-asset/references/providers/codex.md: write the planned generated-path record and the runtime generated-path record, then run python .godotmaker/asset-runtime/tools/codex_image_claim.py --plan <plan.json> --report <generated-paths.json> --project-root . --out-report .godotmaker/asset-generation/reports/<asset_id>_source.json. Use that claim result as the provenance record. For API-backed providers, use tools/asset_source_generate.py --spec with its report_path. The report must be generated by those controlled tools, not hand-written. Do not create, draw, or alter visual source art with temporary scripts, Pillow, System.Drawing, ImageMagick, SVG, canvas, Godot drawing, or placeholder generation.powershell python tools/asset_sheet_process.py --source <raw-source> --out-dir <sliced-dir> --grid <columns>x1 --names <segment-names-in-slot-order> --background magenta --snap-mode grid --preserve-cell-bounds --report .godotmaker/asset-generation/reports/<asset_id>_sheet.json
Use the report to reject missing art, opaque magenta pixels, edge-touching art that breaks the declared slot, or a cell that does not retain its fixed dimensions.
asset_sheet_process.py --grid 1x1 --background transparent --snap-mode grid without --preserve-cell-bounds to crop that cell's visible AABB. Then finalize that cropped cell independently with asset_image_finalize.py --resize <cell_width>x<cell_height> --no-origin. Save each output under <normalized-dir>/<segment>.png and each finalize report at .godotmaker/asset-generation/reports/<asset_id>_<segment>_normalize.json. Do not recombine or resize the raw sheet between slicing and this per-cell finalization.kind: "single", publish every normalized cell at res://assets/generated/platform-strip/<asset_id>/<segment>.png and return it as Texture2D.kind: "atlas", create an explicit fixed-slot declaration from the normalized cells. Assemble it only with tools/asset_atlas_assemble.py; publish <asset_id>.png and <asset_id>.json in the stable platform-strip directory. Each metadata region uses the declared slot rectangle, pivot: [0.5, 1.0], and nine_slice: null. Compile every logical region to res://assets/generated/platform-strip/<asset_id>/<segment>.tres as AtlasTexture with zero margin.standalone_validation.compile_and_validate() with exactly GM_EVAL_GODOT_PATH or GODOT_BIN when either is configured; do not search for or substitute another Godot executable. When retaining .godotmaker/asset-generation/reports/<asset_id>_validation.json, write the validator's actual result rather than a self-reported verdict. validation.levels in the generic result is optional; include it only when it is the direct validator output.Return exactly one shared generic result JSON object and no prose.
Before returning, persist the exact shared request/result pair at .godotmaker/asset-generation/<asset_id>-request.json and .godotmaker/asset-generation/<asset_id>-result.json.
For single, declare one sources entry with layout: "single" for every processed segment and one runtime Texture2D output per segment. For atlas, declare one sources entry for the physical atlas with layout: "region_atlas" and one runtime AtlasTexture output per segment. Use only stable platform-strip paths.
If the semantic strip contract, provider contract, source art, processing report, fixed slot assembly, compiler, or Godot check cannot complete, return the shared failed result with outputs: [], validation.passed: false, and explanatory notes. Do not publish partial runtime outputs.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | 38,345 | 6,139 | -84% | 1 | 1 | 0% | 6,169 | 2,869 | -53% | 0 | 0 | — |
case-01 | fail→fail | 32,992 | 10,044 | -70% | 1 | 1 | 0% | 6,205 | 2,487 | -60% | 0 | 0 | — |
case-02 | fail→fail | 35,773 | 25,007 | -30% | 1 | 1 | 0% | 6,190 | 5,713 | -8% | 0 | 0 | — |
case-03 | fail→fail | 16,084 | 24,817 | +54% | 1 | 1 | 0% | 2,171 | 5,117 | +136% | 0 | 0 | — |
case-05 | fail→pass | 19,751 | 6,037 | -69% | 1 | 1 | 0% | 3,639 | 2,835 | -22% | 0 | 0 | — |
case-06 | fail→pass | 23,171 | 7,268 | -69% | 1 | 1 | 0% | 4,340 | 2,990 | -31% | 0 | 0 | — |
case-07 | pass→pass | 8,896 | 5,032 | -43% | 1 | 1 | 0% | 1,456 | 2,715 | +86% | 0 | 0 | — |
case-08 | fail→fail | 15,667 | 2,107 | -87% | 1 | 1 | 0% | 2,457 | 2,048 | -17% | 0 | 0 | — |
case-09 | fail→fail | 14,306 | 2,140 | -85% | 1 | 1 | 0% | 2,011 | 2,121 | +5% | 0 | 0 | — |
case-10 | pass→pass | 9,097 | 1,654 | -82% | 1 | 1 | 0% | 1,265 | 1,982 | +57% | 0 | 0 | — |
case-11 | fail→fail | 7,662 | 1,538 | -80% | 1 | 1 | 0% | 1,071 | 1,990 | +86% | 0 | 0 | — |
case-12 | fail→fail | 11,371 | 4,563 | -60% | 1 | 1 | 0% | 1,496 | 2,498 | +67% | 0 | 0 | — |
case-13 | fail→pass | 24,666 | 1,903 | -92% | 1 | 1 | 0% | 1,144 | 2,022 | +77% | 0 | 0 | — |
case-14 | fail→fail | 35,959 | 2,496 | -93% | 1 | 1 | 0% | 3,123 | 2,146 | -31% | 0 | 0 | — |
case-15 | fail→pass | 12,703 | 2,322 | -82% | 1 | 1 | 0% | 2,006 | 2,098 | +5% | 0 | 0 | — |
case-16 | fail→pass | 10,958 | 1,642 | -85% | 1 | 1 | 0% | 1,986 | 1,973 | -1% | 0 | 0 | — |
case-17 | pass→pass | 11,219 | 2,543 | -77% | 1 | 1 | 0% | 1,992 | 2,115 | +6% | 0 | 0 | — |
case-18 | fail→fail | 16,741 | 1,685 | -90% | 1 | 1 | 0% | 2,725 | 2,027 | -26% | 0 | 0 | — |
case-19 | fail→pass | 9,137 | 1,723 | -81% | 1 | 1 | 0% | 1,465 | 2,021 | +38% | 0 | 0 | — |
case-20 | pass→pass | 10,522 | 4,287 | -59% | 1 | 1 | 0% | 1,621 | 2,475 | +53% | 0 | 0 | — |
case-21 | pass→pass | 8,085 | 1,998 | -75% | 1 | 1 | 0% | 1,249 | 2,019 | +62% | 0 | 0 | — |
case-22 | fail→pass | 6,686 | 2,010 | -70% | 1 | 1 | 0% | 971 | 2,047 | +111% | 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 20 counted toward the lift figure. The other 2 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 +36 percentage points is the difference between those two pass rates over the 20 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.