# Lane finish hooks

No live lane code was changed. The lane owners can append the common importer after their final GLB and thumbnail exist.
Use a rendered model thumbnail, not the generation prompt or the input photograph, for the embedding description.

## TRELLIS.2 and Pixal3D

Completed comparison files were found by reading immutable gallery directories on prod, not by testing their websites:

* `/home/forge/adkit-gallery/gpu-3d-trellis-fixed-20261017/m/`: final `*.pm.glb`, their model `*.pm.jpg`, source `*.in.jpg`.
* `/home/forge/adkit-gallery/gpu-3d-ab-20261017/m/`: `out-t2-1024-*.glb`, `out-pixal3d-*.glb`, matching rendered JPGs.
* `/home/forge/adkit-gallery/gpu-3d-batch-20261017/m/`: final Pixal3D GLBs and model JPGs.

All 48 final outputs were imported. Raw colour-transfer trials and rejected seed variants are intermediate experiments,
not additional finished objects. The 48 cards retain lane/model/source/date evidence and guessed native physical scale.
Five ambiguous front orientations are marked candidates. The frame audit and contact sheets are retained in the repo.

```sh
python3 /absolute/forge-assets/tools/ingest_photo_object.py "$FINAL_GLB" \
  --photo "$SOURCE_PICTURE" --thumbnail "$MODEL_THUMBNAIL" --provenance "$PROVENANCE_JSON" \
  --class "$TAXONOMY_CLASS" --slug "$STABLE_ASSET_SLUG" --name "$DISPLAY_NAME" \
  --metres-per-unit "$METRES_PER_UNIT" --yaw "$DEGREES_TO_PLUS_Z"
python3 /absolute/forge-assets/tools/build_index.py
python3 /absolute/forge-assets/tools/enrich_library.py
python3 /absolute/forge-assets/tools/classify_library_reuse.py
python3 /absolute/forge-assets/tools/build_index.py
```

For opt-out add `--no-reuse`. A person or third-party wall artwork is blocked without needing that flag.
State rights in the provenance JSON. Generator software licences do not clear a third-party reference image.
The importer rejects external texture/buffer URIs, retains textures inside the GLB, caps their size and measures the result.

The backfill command is `python3 tools/backfill_photo_lanes.py /tmp/wlib-lanes`. Its scratch layout is `fixed/`, `ab/`,
`batch/` containing the files above. It compares input hashes and skips unchanged finished objects, including ones whose
frames were corrected afterward. It does not call or restart the running generation lanes.

## Blender plus paint

The 32 existing spacecraft already had game cards, named parts and release pins. Their active GLBs remain unchanged.
The common importer attached the original `jobs/<job>/sheet.jpg`, model-thumbnail descriptions, reuse flags and lane
provenance through `--existing-id`. Source jobs live in the canonical local checkout's `jobs/` directory.

```sh
python3 /absolute/forge-assets/tools/ingest_photo_object.py "$PINNED_GLB" \
  --existing-id "$ASSET_ID" --photo "$JOB/sheet.jpg" --thumbnail "$MEASURED_MODEL_THUMBNAIL" \
  --provenance "$PROVENANCE_JSON" --class "$TAXONOMY_CLASS" --slug "$SLUG" --name "$NAME"
```

`python3 tools/backfill_blender_photos.py` performs that attachment for the completed existing local spacecraft.
No live Blender author, paint finisher, GPU VM, Factory or tenant app was changed.

## Room pipeline

Exact finish step, without editing `finish.py`:

```sh
python3 /home/claude-agent/forge-build/spatial-rebuild-20261013/tools/library_ingest.py \
  "$ROOM_OUT/walk" --library "$ASSET_LIBRARY" --out /tmp/wlib-room-finish \
  --licence-evidence 'Owner attests that the source photographs may be used for this library'
```

Only run it after the walk is complete. Nineteen living-room objects were kept: sectional sofa, two tables, six chairs,
sideboard, four lamps, mirror and four wall pictures. The four pictures are not reusable. Chandelier, built-in alcove
cabinet, radiator and fireplace were excluded as attached or not clean standalone objects. Doors, windows, walls and
mouldings never entered the object-group selection. The bedroom did not meet the required post-01:30 CET freshness
condition when inspected, so it was not ingested.
