# job.json schema

`schema` is `job/1`. `units` is `m`. `fromExample` is required.

```json
{
  "schema": "job/1",
  "id": "collar-01",
  "version": 1,
  "fromExample": "collar-01",
  "units": "m",
  "stage": "export",
  "brief": { "title": "Collar on housing", "collection": "COLLAR" },
  "block": {
    "groups": ["BASE", "HOUSING"],
    "axial_stack": ["foot_ring", "body", "collar"],
    "seam_target_mm": 0.7,
    "parts": [
      { "id": "foot_ring", "prim": "cylinder", "group": "BASE", "r": 0.041, "h": 0.003, "material": "foot_rubber" }
    ]
  },
  "lookdev": { "materials": ["foot_rubber"] },
  "light": { "environment": "broad", "exposure": 0.05, "ground": true },
  "prove": { "views": ["hero", "side", "front"] },
  "export": { "glb": true, "blend": true, "stills": true, "yUp": true, "draco": false }
}
```

Stages: `brief` → `block` → `lookdev` → `light` → `prove` → `export`.

z is computed from `stack(h)` plus `seam_target_mm`. Do not type world z. Do not pass camera eye vectors, hex colours, or wattage.

`cut` on a part is a catalog prim subtracted via the guarded `difference()`.
