From 93d6534efe477d3947b4b874ea9fa93e49618da6 Mon Sep 17 00:00:00 2001 From: claude-re Date: Thu, 30 Jul 2026 17:01:32 +0000 Subject: [PATCH] docs/re: open a backlog, first item = capital ships assemble wrong in the viewer The runtime-capture write-up declares static ship assembly exact, but its test covers exactly one ship (e106). Records what is suspect (engine-cluster rig, the X-reflect twin heuristic, cross-id turrets), and that the F10 capture is already the oracle to settle it on a second class. --- docs/re/BACKLOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 docs/re/BACKLOG.md diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md new file mode 100644 index 0000000..49017f1 --- /dev/null +++ b/docs/re/BACKLOG.md @@ -0,0 +1,46 @@ +# RE backlog + +Open items that are *not* being worked right now. Each entry says what is wrong or +unknown, what evidence exists, and what the first step would be. Move an item into +`INDEX.md` (with a `structures/…md` or a parser + test) once it is actually settled. + +--- + +## Capital ships assemble wrong in the viewer + +**Reported:** 2026-07-30, by the user. **Status:** ❔ open, not investigated. + +The reborn viewer builds capital ships from the split XBG7 parts via +`sylpheed-formats::ship::assemble_ship`, and they come out **wrong** — parts in the +wrong place / wrong orientation. + +**Why this is a real finding and not a known limitation:** the RE write-up +[`ship-placement-runtime-capture.md`](ship-placement-runtime-capture.md) declares +static assembly ✅ **exact** as of 2026-07-26 — 9-channel joint tables +`[TX TY TZ RY RX RZ SX SY SZ]`, Euler `Ry·Rx·Rz`, with +`ship::tests::static_assembly_matches_runtime_capture` asserting static == runtime +capture (T < 1.0, R < 0.02). So either the viewer is not using that path, or the +claim generalises worse than the test suggests. + +**The likely gap:** that test is **one ship** — the `e106` destroyer, 8 parts plus +two nacelles, two turrets and the hull mirror. Nothing pins the other classes. +Rules that were derived from `e106` and could easily be `e106`-specific: + +- the engine cluster rig mounted at `GN_Engine_01` (two mirrored nacelles + centre); +- "X-reflect the shared-geometry twin whose lateral offset opposes the geometry's + dominant side" — a heuristic, not a decoded flag; +- cross-id turret instancing (×2). + +**First step (the oracle already exists):** re-run the runtime capture on a *different* +capital ship and diff static vs captured, exactly as `e106` was done — F10 in the +`capture-ship-placement` build of `xenia-canary-native` dumps the ship shader's +`c0..c2` WorldViewProjection rows per part; `WV_ref⁻¹ · WV_p` is the ship-space rigid +transform, which is ground truth. Pick a class whose rig differs from `e106` +(different engine count, a ship with no `sld`, a carrier). Then extend +`static_assembly_matches_runtime_capture` into a per-ship table so a regression in one +class cannot hide behind `e106` passing. + +**Also worth ruling out first, cheaply:** that the viewer's own transform stack (scale, +handedness, node-instance recursion) is not re-breaking a correct assembly — compare +the viewer's placement against `assemble_ship`'s output directly before blaming the +format layer.