From c5a506538967c6a395e45fe34014935c6e78bfe1 Mon Sep 17 00:00:00 2001 From: "Claude (auto-RE)" Date: Tue, 11 Aug 2026 23:15:22 +0000 Subject: [PATCH] re: the format layer is NOT exonerated -- assemble_ship draws a non-renderable volume Did the visual the backlog kept naming as the next step, and it overturns the conclusion. Rendering e106 from the static assembly and from the baked runtime capture: the capture has 8 placements, the static assembly 11 -- the same 8 plus e303_wep_01 x2 and a second e106_eng_01. In the render the destroyer sits inside a white slab that dwarfs it. That slab is e303_wep_01: 172 verts, 110 tris, bounds X[-1000,600] Y[-1050,1050] Z[-2400,2400] = 1600 x 2100 x 4800. A real e106 turret (wep_02_01) is 269x179x417 with 772 tris; the bridge is 105x76x305. So it is not a turret -- it reads as a collision/trigger volume, and whatever it is the game does not draw it: the e106 capture contains no e303_wep_01 at all. Why it was missed: assemble_ship treats every rou_* composite node as drawable, the cross-id mount is documented as intended, and the test asserts count("e303_wep_01") == 2. The capture's silence was explained as vbase dedup, but dedup would show one instance, not zero -- and the test walks capture parts looking them up in the static output, so EXTRA static placements cannot fail it. Same shape as the earlier include_external gap: a test that can only fail one way. Scope stated carefully: sweeping 335 ships for "ship-scale span with <400 tris" flags 20 ships and 58 placements over 28 resources, but ONLY the e106 case is proven (render + capture absence + geometry). Others may be legitimately large low-poly parts and need the same three checks. Co-Authored-By: Claude Opus 5 (1M context) --- docs/re/BACKLOG.md | 58 ++++++++++++++++++ .../e106-static-assembly-volume-bug.png | Bin 0 -> 15230 bytes 2 files changed, 58 insertions(+) create mode 100644 docs/re/captures/e106-static-assembly-volume-bug.png diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index b81f0bf..f50fdcd 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -150,3 +150,61 @@ comparison is no longer merely the next step — it is the only remaining one.** Render `e106` in the viewer beside `ship_render`'s output of the same `assemble_ship` result; if they agree, the bug is in neither and the original report needs re-grounding against a specific ship and a specific expectation. + +--- + +## ⚠️ The format layer is NOT exonerated — `assemble_ship` draws a non-renderable volume + +**Found 2026-08-11 by finally doing the visual**, which the notes above kept +naming as the next step. It overturns their conclusion. + +Render `e106` from the static assembly and from the baked runtime capture and +compare — `ship_render` does both: + +| | placements | parts | +|---|---|---| +| runtime capture (ground truth) | **8** | `bdy_01…04`, `brg_01`, `eng_01`, `eng_02`, `wep_02_01` | +| `assemble_ship(--static)` | **11** | the same 8, **plus `e303_wep_01` ×2** and a second `e106_eng_01` | + +The render makes it obvious: the destroyer sits inside a white slab that dwarfs +it ([capture](captures/e106-static-assembly-volume-bug.png)). That slab is +`e303_wep_01`, and its own geometry is: + +``` +e303_wep_01 172 verts, 110 tris bounds X[-1000, 600] Y[-1050, 1050] Z[-2400, 2400] 1600 x 2100 x 4800 +e106_wep_02_01 1002 verts, 772 tris 269 x 179 x 417 ← what a real e106 turret looks like +e106_brg_01 202 verts, 202 tris 105 x 76 x 305 +``` + +**110 triangles, perfectly round axis-aligned bounds, and bigger than the ship it +is mounted on.** That is not a turret. 🟡 It reads as a collision / trigger +volume, and ✅ whatever it is, **the game does not draw it**: the runtime capture +of e106 contains no `e303_wep_01` at all. + +### Why this was missed + +`assemble_ship` treats **every** `rou_*` node in the composite as a drawable +part, and the doc comment states the cross-id mount as intended behaviour — +`"INCLUDING repeated instances and cross-id turret mounts (rou_e303_wep_01_root +×2 on the e106 hull)"` — with +`ship::tests::static_assembly_matches_runtime_capture` asserting +`count("e303_wep_01") == 2`. The absence from the capture was explained away as +vbase dedup, but **dedup would show one instance, not zero**. + +The test cannot catch it either: it walks the capture's parts and looks each up +in the static output, so **extra** static placements are invisible to it. That is +the same shape of gap as the earlier `include_external` hypothesis — a test that +can only fail one way. + +### Scope, stated carefully + +Sweeping all 335 assembled ships for the signature *ship-scale span with under +400 triangles* flags **20 ships and 58 placements** over 28 distinct resources +(`e005_ant_*`, `f001_ant_*`, `f002_bdy_*`, `f301_barrel`, `f303_body`, +`e303_wep_01`, …). **Only the `e106`/`e303_wep_01` case is proven** — by render, +by capture absence, and by geometry. Some of the others may be legitimately large +low-poly parts, and each needs the same three checks before being called a bug. + +**Next:** decide the rule that separates drawable parts from volumes (candidates: +the node-name suffix, a descriptor flag, or the triangle-density heuristic), then +re-point `static_assembly_matches_runtime_capture` so it also fails on extras. diff --git a/docs/re/captures/e106-static-assembly-volume-bug.png b/docs/re/captures/e106-static-assembly-volume-bug.png new file mode 100644 index 0000000000000000000000000000000000000000..e44453c98b573b03afbd174637832a790f37e9fa GIT binary patch literal 15230 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 literal 0 HcmV?d00001