the symptom, in your words

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

✓ verified on 26.07.08e
lane 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.08e: seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?

Want to know when new guides or fixes drop? Join the community to help build this out. Report gotchas, flag outdated fixes, or just lurk.

Join the Discord