ember-forge — what each cast step is handed, and what it must write

One artefact per step. A step that exits 0 without writing its artefact is FATAL.

ember-forge — what each cast step is handed, and what it must write One artefact per step. A step that exits 0 without writing its artefact is FATAL. 01 / Identity 02 / The sheet, and its gates 03 / Two TRELLIS runs 04 / Post, rig, graft 05 / The game canonical.png · rpg-app characters · 01 / Identity · 512x768 canonical.png rpg-app characters 512x768 IDENTITY[<id>] · gen_turnaround.py · 01 / Identity · a code edit IDENTITY[<id>] gen_turnaround.py a code edit turnaround sheet · 5 painted views · 02 / The sheet, and its gates · one seed turnaround sheet 5 painted views one seed the sheet gates · measured, not seen · 02 / The sheet, and its gates · dE76 + luma the sheet gates measured, not seen dE76 + luma the head crop · TRELLIS 512 cubed · 03 / Two TRELLIS runs · RGB, not RGBA the head crop TRELLIS 512 cubed RGB, not RGBA TRELLIS.2 body · 1536 cubed, 4K · 03 / Two TRELLIS runs · 15.4 of 15.5 GB TRELLIS.2 body 1536 cubed, 4K 15.4 of 15.5 GB mesh-graft-head · graft, eyes, blink · 04 / Post, rig, graft · 5,474 lines mesh-graft-head graft, eyes, blink 5,474 lines rig-character · Make-It-Animatable · 04 / Post, rig, graft · 52 bones rig-character Make-It-Animatable 52 bones mesh-post.py · weld, decimate · 04 / Post, rig, graft · 60k at 1.75 m mesh-post.py weld, decimate 60k at 1.75 m the seam finish · albedo, split, neck · 05 / The game · one atlas the seam finish albedo, split, neck one atlas cast/<id>.glb · godot-3d-test · 05 / The game · + .glb.import cast/<id>.glb godot-3d-test + .glb.import canonical.png mode = edit the words 2 gated views PASS: the crop PASS: same view the face raw body mesh -body-post.glb -body-rigged -blink.glb accept-asset.sh Legend primary data policy / PII async batch data store data flow

The contract every step keeps

  • • One step writes ONE named artefact and is skipped when that file is newer than all of its inputs
  • • scripts/cast-recipe.sh --list prints the 15 steps; --from/--to run a slice; --dry-run writes nothing
  • • Per-subject facts are DECLARED, not detected: --facing, --eye-at, --iris-mm, --ring-skin-floor

A step that exits 0 without writing is FATAL

  • • mesh-post and mesh-graft-head never overwrite: they write '<name>-2' beside the file and exit 0
  • • The runner captures the output's mtime BEFORE the command and refuses to continue if it has not moved
  • • Before that check, a re-run installed the PREVIOUS model - byte-identical, exit 0, no warning

The gates come before the GPU

  • • Identity audit: median Lab, CIE dE76 against canonical.png, cap 10.0 on the two views the mesh is built from
  • • skin-tone-check: bare-limb luma <= 0.82 absolute - the hero's arms were 0.873 and his throat 0.871, so the RATIO passed
  • • Both cost seconds of numpy; a 1536 cubed body run costs minutes of exclusive GPU