# LANE E — ASSETS (skins, GLBs, the depot manifest) > **Prompt for Opus 4.8.** You are working in `/Users/jing/Documents/PROCITY` with SSH access > to **ultra** (`ssh johnking@100.91.239.7`, key auth works non-interactively — mind: no GNU > coreutils/timeout/setsid, system python 3.9, Homebrew at /opt/homebrew). Read > `docs/CITY_SPEC.md` and `docs/RESEARCH.md` first. You own `pipeline/*`, `web/assets/*`, and > `web/assets/manifest.json`. Do not touch other lanes' files. **Spending rule: fal/MeshGod > generations cost real money — batch nothing without listing it in a plan file first and > keeping v1 to the shortlist below. Prompt-pack image gen is near-free but still list counts.** > Verify every visual result with your own eyes (render thumbnails / open in browser) — never > "should look right". Commit in small, described steps on `main`. ## Mission Feed the other lanes: audit what exists, normalize the best of it into a PROCITY asset set, publish it (3GOD depot + local), and ship the **manifest** that Lanes B/C/D consume. Then the gap-fill generation passes (facade skins first, GLB props second). Everything optional at runtime — the game must run asset-free — so this lane is about making it *gorgeous*, not making it *work*. ## Step 1 — Audit (no generation yet) - On ultra, read `~/Documents/3D=models/MANIFEST.md` + `CH_MAPPING.md`, then inventory `shop-fittings/`, `street-furniture/`, `furniture/`, `props-scenes/` against the fittings needs in CITY_SPEC's shop-type table and LANE_C's fittings list. Note tri counts, scale sanity, licensing zone (🟢 web-ok only — anything unclear goes in a QUARANTINE list, not the manifest). - Hit `https://digalot.fyi/3god/api/list` — some of this may already be uploaded. - Output: `pipeline/AUDIT.md` — table of candidate GLBs → PROCITY fitting/furniture id, status (ready / needs-normalize / missing / quarantined-licence). ## Step 2 — Normalize & publish GLBs - `pipeline/normalize.py` — runs **on ultra** against Blender + the existing MESHGOD scripts (`~/Documents/MESHGOD/scripts/finish_glb.py`, `render_glb.py` — read them, extend, don't fork): enforce house GLB law (metres, +Y up, origin at base, facing −Z, ≤5k tris props, webp textures ≤1024, no Draco), name as `procity___01.glb`, render a 256px thumbnail per asset. - Upload to 3GOD (`POST /api/upload?name=.glb`), thumbnails into `web/assets/thumbs/`. - Priority order (what Lanes B/C actually place first): record crate + record bin, clothes rack, metal wire shelf, garage shelves, bookshelf, cube shelf, glass case, counter (balcao), trestle table, bench + longbench + park bench, market stall, food cart, streetlight, fridge. ## Step 3 — The manifest (`web/assets/manifest.json`) The single contract file other lanes read: ```json { "version": 1, "depot": "https://digalot.fyi/3god", "fittings": { "record_bin": {"file":"procity_fit_record_bin_01.glb", "footprint":[1.2,0.8], "thumb":"…"}, … }, "furniture": { "bench": {…}, "streetlight": {…}, … }, "skins": { "facade": {"weatherboard":{"file":"gen/facade-weatherboard.jpg","types":["opshop"]}, …}, "sky": [...], "ground": {...}, "wall": [...], "interior": {...} } } ``` Catalogue the 69 skins already in `web/assets/gen/` (they came from thriftgod + 90sDJsim — map them to shop types per the registry table). Add a `pipeline/validate_manifest.py` (plain python3) that checks every referenced file exists locally or HEADs OK on the depot, footprints are sane, and JSON parses — this runs in Lane F's gate. ## Step 4 — Facade skin expansion (prompt-pack pass) The 18+7 existing facades are the style anchor. Gaps for a whole town: **toy shop, book shop, video store, milk bar variants (2–3), arcade interior frontage, dept-store anchor (wide), warehouse/roller-door, residential terrace/cottage fronts (3–4), corner-lot two-face, market-square edge**. Two routes, in order: 1. Port thriftgod's `gen_assets.py` (OpenRouter `google/gemini-3.1-flash-image`, ~$0.004/img, resumable `.genraw/` — see `thriftgod/gen_assets.py`) into `pipeline/gen_skins.py` with the **same style bible prefix** and the **blank-signboard facade template** (`gen_assets.py:69-86`). ~30 images ≈ 12¢. Needs the OpenRouter key (`thriftgod/.env` pattern) — if absent, route 2. 2. Emit `pipeline/SKIN_PROMPTS.md` in the house FLOW_PROMPTS.md format (POLY lock, save-as filenames) for John to run through the manual flow. Also: **corner buildings need a second facade face** — add a `-side` variant convention (`facade-X-side.jpg`) or document that Lane B reuses the front skin on corners (decide, write it in the manifest README). ## Step 5 — Bespoke hero props (MeshGod, budget-gated) Shortlist ONLY (≈10 solids ≈ $3): listening booth, till/cash register, VHS rewinder, glass counter case (if audit finds none), spinner rack, milkshake mixer, arcade cabinet shell, band-poster easel, giant novelty record (roof ornament), bus stop shelter. Write `pipeline/MESHGOD_BATCH.md` (manifest-style, the `djsim_home.json` pattern) — **do not run the batch without John's go**; everything has a primitive fallback anyway. Remember the MeshGod gotcha: thin wires and flat discs reconstruct badly — those stay in-engine primitives. ## Acceptance - `pipeline/AUDIT.md` complete; ≥15 normalized GLBs live on 3GOD with thumbnails. - `web/assets/manifest.json` validates green; Lanes B/C load fittings from it untouched. - Facade coverage: every shop type in the registry has ≥2 skins mapped; new skins indistinguishable in style from the originals (side-by-side contact sheet in `docs/shots/laneE/`). - A one-page `pipeline/README.md`: how to re-run each step, what it costs, where creds live.