| name | platform-strip |
| description | Generate non-pixel-art, horizontally repeatable platform strips from real image sources as fixed Texture2D cells or AtlasTexture regions. |
Platform Strip Asset
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.
Contract
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:
{
"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.
Produce
-
Reject pixel-art requests. Request non-pixel-art painted, illustrated, or rendered source art. Do not use nearest-neighbor scaling.
-
Create a layout-only guide with tools/asset_layout_guide.py using the declared grid. The guide is not art and is not a runtime output.
-
Request one real provider source sheet with one horizontal slot per declared segment. Require a solid #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.
-
Store the unmodified provider image at .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.
-
Split the raw provider sheet before any crop, resize, or padding. Never normalize the whole sheet as one image: doing so changes the declared grid coordinates. Use the owned deterministic tool with the declared source grid and names in declared slot order. It deterministically covers every source pixel even if the provider raster dimensions are not evenly divisible by the requested grid:
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.
-
For each already-sliced cell, use 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 and each finalize report at . Do not recombine or resize the raw sheet between slicing and this per-cell finalization.
Result
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.