# Phase D.1 — staged ACE spawn records for the 13x13 Holtburg ring

Each `0xXXXX.spawns.jsonl` file contains the ACE `landblock_instance`
spawn records for one landblock, filtered from the world-wide dump at
`/home/wbterminal/projects/RetailSmoke/ace_spawn_records.jsonl`.

## Ring

13 x 13 landblocks centred on Holtburg (LB 0xA9B4 = cell_x 0xA9,
cell_y 0xB4). Mirrors the Phase C.1 scenery bake's ring.

## Schema (per JSONL line)

```jsonc
{
  "wcid":          7978,              // ACE weenie classification ID
  "name":          "Scrawed Grievver",
  "category":      "Creature",         // Creature, Object, NPC, ...
  "weenieType":    10,                // ACE WeenieType enum
  "landblockId":   43444,             // (cell_x << 8) | cell_y
  "cell":          0,                 // intra-LB cell index (0 = outdoor)
  "x":             130.239,           // LB-local metres
  "y":             104.9,
  "z":             46.005,
  "isServerManaged": true,            // ACE manages lifecycle (vs DAT static)
  "orientationIsIdentity": false      // true => use identity quat
}
```

## Notes

- **Orientation is dropped.** The source JSONL has only
  `orientation: {isIdentity: bool}` — no per-axis quaternion
  components. The injector emits identity quat (qw=1). A future
  re-run of the dumper can include full quaternion fields without
  schema breakage.
- **Empty files are intentional.** 125 of 169 LBs in the ring have
  zero spawns. The runtime treats "empty body" as
  "queried, zero spawns" (not 404 "not yet baked").
- **wcid alone doesn't render an entity.** The renderer needs a
  `setupDid` (`csetup_id`) — we resolve it via the weenie_index at
  injection time, not in this stage.
- **The wire-position injector mirrors handleEntitySpawn(upd).** See
  `scene3d/spawns.js::ensureSpawnsForLandblock`.

## Reproducibility

```sh
python3 stage-ring-spawns.py
```

Deterministic given the same input JSONL (records sorted by
`(cell, x, y, z, wcid)` within each LB). The output `source.sha256`
covers the input JSONL so a manifest consumer can verify it has the
same spawn snapshot.
