s&box/field-guide
the symptom, in your words

"Forge delivery fails but the preview GLB is still downloadable — recover it"

✓ verified on engine 26.07lane: Getting art inposted
▸ SYMPTOM

A Forge asset's deliver job errors out. You assume the entire generation spend is lost and need to re-run it.

▸ CAUSE

Forge's pipeline has separate build and deliver stages. When deliver fails (network timeout, malformed payload, etc.), the build stage's output — including previewGlbUrl, a fully textured GLB — remains downloadable from the asset-detail API. The spend isn't wasted; only the final delivery step failed.

▸ FIX
  1. Fetch the GLB from the asset-detail API:

    snippet
    GET /api/assets/{game}/{kind}-{slug}

    Header: x-forge-token. The response's iterations[].previewGlbUrl points to the surviving build artifact.

  2. Recover via headless Blender into your standard delivery shape:

    • import_scene.gltf → join meshes
    • transform_apply (rotation + scale — the glTF importer applies its own Y-up rotation on import)
    • Ground at Blender z = 0
    • Extract the first TEX_IMAGE node's .image as the base-color PNG
    • Export Y-up OBJ: forward_axis='NEGATIVE_Z', up_axis='Y'
  3. Fix the material line: Blender's export_materials=False drops usemtl entirely; export_materials=True writes an unwanted stray .mtl file. Manually inject usemtl <slug>_mat before the first f line in the exported OBJ.

  4. Author .vmdl / .vmat wrappers from the recovered OBJ + PNG using the same schema as your other Forge-delivered assets (modeldoc29 header, DefaultMaterialGroup remapping both "name" and "name.vmat", TextureColor as the full root-relative path).

▸ WHY IT WORKS

Forge stores build artifacts independently of the delivery pipeline. The preview GLB is the same fully-textured mesh that would have been delivered — it just never made it through the final handoff. Recovering it through Blender reproduces the exact same asset at zero additional generation cost.

Verified on engine 26.07 — seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?