LIDO Stage 2, proposal P01, asset tet bodies

Tet Null Space Plan

2026-10-14 Worktree lido-p01-tetmesh, diagnosis of 2026-10-13, Gate D record of 2026-10-14

This page explains why the asset tet bodies of P01 collapse, what the two fixes do, what the probes and the trained arms show, and what we decide next. Teal marks the tet mesh and its energy. Gray marks the hex carrier grid. Orange marks contact and constraints. Green marks a kept state, red a defect. Every number traces to a file listed in the footer. Where a figure is a sketch and not data, the caption says so.

1. The problem in one picture

An asset tet body rides on a hex carrier grid. Each tet vertex sits at fixed trilinear coordinates inside one cell. Its position is the weighted sum of that cell's eight corners, x_v = J x. The corners are the only degrees of freedom. The tet energy reads J x and nothing else. When the grid has more corners than the mesh has vertices, there are corner motions that move no vertex. These motions form the null space of J. The energy cannot see them.

v1 v2 v3 A: rest corners v1 v2 v3 B: corners moved in ker J, same vertices x_v = sum_k N_k x_k, the same weights in A and B x + d, J d = 0 8 corners, 3 vertices: 16 corner numbers, 6 vertex numbers, so 5 of the 8 corner modes per axis change no vertex. E_tet(J x): identical in A and B. Largest corner move in B: 0.20 cells. Largest vertex move: 2e-16 cells.
Figure 1. The null space in one picture, in 2D. A vertex position is the weighted sum of its cell's corners, x_v = J x. Panel B moves the corners along a direction d with J d = 0, computed for this very drawing. The corners move by up to 0.20 cells. The vertices do not move. The tet energy sees only the vertices, so it sees no difference between A and B. The real bodies are 3D with eight corners per cell; the mechanism is the same.

Only the inertia term touches the corners directly, and inertia resists only a change of velocity. Once a null-space velocity exists, nothing slows it down. Three sources feed it: the initial deformation velocity field, the contact forces of the voxel path, which act on the hex face samples and not on J x, and the network's per-query proposals, which no energy loss corrects in ker J. These three sources are the diagnosis report's, section "Summary".

2. Why assets and not lattice bodies

A lattice body puts a tet vertex on every grid corner. Its J is the identity. Nothing can move unseen. An asset mesh fills the cells with tets whose vertices sit inside the cells, so the grid has far more corners than the mesh has vertices.

Lattice body every corner is a vertex, J = I null space: none Asset body vertices inside cells, 12 corners for 7 vertices here null space: 3 (N - V) dimensions 0 2000 4000 6000 plate 353: 4675 hex corners plate 353: 2847 tet vertices 4675 2847 plate 353 dim ker J 5487 compact 145: 4256 hex corners compact 145: 2462 tet vertices 4256 2462 compact 145 dim ker J 5382 plate occupancy, lattice tets: 4675 hex corners plate occupancy, lattice tets: 4675 tet vertices 4675 4675 plate occupancy, lattice tets dim ker J 0 hex corners N tet vertices V
Figure 2. Why asset bodies and not lattice bodies. A lattice body puts a vertex on every corner, so J is the identity and nothing can move unseen. The asset plate 353 has 4675 hex corners for 2847 tet vertices, the compact body 145 has 4256 for 2462. The rank of J is 2846 and 2462, so dim ker J is 5487 and 5382. The same plate occupancy filled with lattice tets has 4675 vertices on 4675 corners and no null space. Counts from report.md section 2 and nullspace_check.md.

Measured for the two bodies of the soft well: the plate 353 has 2268 cells, 8090 tets, 2847 vertices and 4675 hex corners. The compact body 145 has 1994 cells, 7730 tets, 2462 vertices and 4256 corners. The rank of J is 2846 of 2847 rows for the plate and 2462 of 2462 for the compact body. So dim ker J is 5487 of 14025 corner degrees of freedom for the plate and 5382 of 12768 for the compact body. Across the library the surplus of corners over vertices is 1700 to 1800 per body for the three failing meshes 353, 145 and 485. The lattice arm has no surplus.

3. What happens in a rollout

The diagnosis probe rolls the T1 epoch 20 checkpoint on the demo scene voxel_well_soft exactly as the renderer does: 8 queries per step, no noise, 450 steps. It records the carrier's lattice edge ratio and the tet edge ratio per body and per step. Both are the current edge length over the rest edge length, maximum over the body.

body-body pairs from step 257, 174 plate pairs at step 294 0 50 100 150 200 250 300 350 400 450 1 2 5 10 20 50 100 200 500 1000 2000 step, 8 queries each, dt 1/300 s edge ratio, log plate carrier: current over rest edge length, max compact carrier: current over rest edge length, max plate tets: current over rest edge length, max compact tets: current over rest edge length, max step 40: first hex cell inverts step 294: first tet inverts compact carrier 7.7 at step 60 plate carrier 4.6 tets 1.00 to 1.08 until step 60, below 1.4 until step 250 plate carrier compact carrier plate tets compact tets 1548 1936 286 446
Figure 3. The rollout of T1 epoch 20 on the soft well, 450 steps, 8 queries per step, no noise. Gray: the hex carrier's maximal edge ratio. Teal: the tet edge ratio. Solid: plate 353. Dashed: compact body 145. The carrier drifts from step 0 with no contact pair until step 22. Hex cells invert from step 40. The tets stay at 1.00 to 1.08 until step 60 and below 1.4 until step 250. A few body-body pairs appear from step 257. The scrambled hex surfaces of the two bodies meet in force around step 290, and the first tet inverts at step 294, when the plate owns 174 body pairs. Data: runs/T1_soft_baseline.json.

The order of events, all from the per-step record. The carrier drifts from step 0. After the 8 queries of step 0 the plate's longest hex edge is already 1.4 percent long and the compact body's 6 percent. No contact pair exists before step 22 in the per-step record; the report rounds this to the first 25 steps. The lattice edge ratio reaches 4.6 for the plate and 7.7 for the compact body by step 60. In free flight alone, with no plane and no walls, the drift rate is 0.16 to 0.19 edge-length units per step, which is 0.020 to 0.024 cells per query, about one step cap of 0.01625 cells per query. The first hex cell inverts at step 40 for the compact body and step 44 for the plate. The tet edge ratio stays at 1.00 to 1.08 until step 60. The scrambled hex surfaces produce spurious contacts and energy: the plate's kinetic energy is 13 J at step 275 and 637 J at step 300. The two hex surfaces meet around step 290. The first tet inverts at step 294, when the plate owns 174 body pairs. At step 449 the plate has 4063 inverted tets and the compact body 3874.

stepplate carrier edge maxcompact carrier edge maxplate tet edge maxcompact tet edge maxplate inverted hex cellscompact inverted hex cellsplate inverted tetscompact inverted tetsplate body pairscompact body pairs
01.011.061.001.03000000
101.131.871.021.04000000
201.382.891.021.06000000
301.873.951.021.05000000
402.574.821.031.06010000
452.945.561.041.06210000
604.587.741.051.08620000
10010.3811.451.171.3020880000
20017.0033.531.381.872652160000
27548.8186.151.351.364303770005
29070.87135.691.921.5444840700365
29580.91156.632.862.8149741618319818
30090.27179.804.375.10557413132844027
350280.45494.1626.0971.838905691610103316721000
4491548.171936.33285.66446.1013061215406338741982888

The training runs show the same collapse. The cheap validation of one physical step cannot see a drift that needs advance to turn a displacement into a velocity, so it reported 8 of 8 survivors for T1. The full-horizon validation of 8 queries by 128 steps on 4 held-out scenes reports 0 of 4 survivors for T1, T2 and T2_hand at every epoch from epoch 4 on, all collapsed with hex penetration above 3 r and 592 to 1327 inverted hex cells. The training guard replaced 45 to 78 scenes per epoch from epoch 6 on. T0, the lattice arm, keeps 4 of 4 and replaces 0 to 3 scenes per epoch.

0 4 8 12 16 full-horizon survivors of 16, last 4 epochs x 4 scenes T0 lattice T0 lattice: 16 of 16 16 of 16 D1L lattice D1L lattice: 16 of 16 16 of 16 K1L lattice K1L lattice: 16 of 16 16 of 16 T1 asset 0 of 16 no carrier fix T2 asset 0 of 16 no carrier fix T2_hand asset 0 of 16 no carrier fix
Figure 4. Training evidence from the Gate D record. The validation rolls 4 held-out scenes for 128 steps of 8 queries; the count sums the last 4 epochs. Every lattice arm with its contact path survives 16 of 16. Every asset arm without a carrier fix survives 0 of 16. The same record notes that T1 has 0 of 4 at every epoch from epoch 4 on. Data: p01_gateD_20261014/README.md and validation_summary.json.

4. The controls that rule out other causes

Each control changes one thing on the same scene seed. The first inverted tet moves by a few steps at most. Only the lattice representation removes the failure. The table lists the step of the first inverted tet, the step of the first inverted hex cell, and the inverted tets at the end of 450 steps. Each cell reads plate / compact body.

kappa 191.15 first inverted tet 301 / 289 end 4104 / 3819: same failure inversion factor 0 first inverted tet 295 / 295 end 3354 / 3859: same failure inversion factor 30 first inverted tet 260 / 286 end 3212 / 3876: same failure zero velocity, zero drift first inverted tet 261 / 250 end 4006 / 3919: same failure at rest on the floor first inverted tet 216 / 236 earlier: contact drives the carrier 1 query per step first inverted tet 348 / 124 end 156 / 1578: slower, same drift lattice tets, same cells no inverted tet or cell in 450 steps edge max 2.59 / 1.84: stable Newton VBD, bare tets plate 4 inverted at impact, 0 at end compact never: the mesh is fine the collapse stays, plate / compact body no collapse
Figure 5. The controls in one view. Each box reads plate / compact body. Only the two representation controls, lattice tets on the same occupancy and Newton VBD on the bare tet mesh, remove the collapse. Numbers from report.md sections 3 and 4.
controlfirst inverted tetfirst inverted hex cellinverted tets at the endreading
T1 baseline, 8 queries294 / 29444 / 404063 / 3874the failure
T0 checkpoint, lattice bodies of the same seed, 7 bodiesnever / nevernever0max edge ratio 1.70; one body has 5 inverted tets at step 193 under contact, 0 at the end
kappa raised to 191.15301 / 28961 / 524104 / 3819contact stiffness changes nothing of substance
inversion factor 0295 / 29546 / 373354 / 3859the inversion rule is not the cause
inversion factor 30260 / 28645 / 363212 / 3876same
zero body velocity and zero drift261 / 25041 / 404006 / 3919velocity is not the cause
at rest on the floor, no deformation field216 / 23625 / 53966 / 3904fails earlier: contact on the hex surface drives the carrier too
1 query per step instead of 8348 / 12480 / 29156 / 1578slower damage, same drift
plate alone, free flight, no plane, no walls341 / -51 / -3160 / -no contact at all, same drift and collapse
compact body alone, free flight- / 305- / 40- / 3805same
same occupancies with lattice tetsnever / nevernever0 / 0max edge ratio 2.59 and 1.84; the problem is gone
Newton SolverVBD on the bare tet mesh, 10 iterations, dt 1/300 s, 450 substeps4 at substep 150 / never-0 / 0plate: transient at the floor impact, final tet edge ratio max 1.12; the mesh and the material are fine

Thinness and sliver content do not separate the failing bodies from the rest: 82 to 84 percent of the library has a median voxel thickness of 2 cells or less in every split, and all four inspected meshes have a minimum dihedral angle of 7 to 9 degrees. What the failing bodies share and the lattice bodies lack is the surplus of corners over vertices.

5. Every candidate, one picture each

Six ways to close the null space are on the table. Each panel uses the toy of Figure 1: three grey cells, teal tet vertices, dark corner dots. The purple arrows are the null-space corner motion of Figure 1, the same vector d with J d = 0. Orange marks the element that pins that motion. The chip gives the status and the measured number when one exists. Sections 6 to 8 give the details of the first three.

1. Carrier weight, fix 1 w E_hex(x) on every carrier cell: every corner gets a restoring force bias: about w times the material stiffness on the filled part of a cell implemented and trained T1_c20 14 of 16, D1_c05 16 of 16 2. Minimal-norm reset, fix 2 after each step: rigid pose plus the smallest corner fix that keeps J x no bias, 2.7 ms per step; a bent sheet still distorts the carrier, see Figure 10 implemented and probed, arms hung 0 inverted tets, plate carrier 10.7 3. Hex F at the tet quadrature points the cell's F at each tet centroid, weighted by the tet volume, reads all its corners F no null space in practice; gives up the exact VBD equality on lattice tets in reserve, not built Option B of ADR 0003, no number yet 4. Refine the mesh more vertices than corners in every cell, so no corner motion is invisible 15 vertices on 8 corners: J injective, no d trials on 24 meshes: edge 1.0 14 ok, 17.6 min; edge 0.5 9 ok, 74.9 min, 28.7 tets per cell considered, rejected 4.3x time, 2 corner-coverage rejects 5. Kernel-only penalty, smooth target penalise the ker J part of the corner motion measured from a per-cell affine fit of J x a softer cousin of the reset; aims at the bent-sheet artefact; inferred, not measured not built, inferred suggestion in p01_carrier.md 4.3 6. Tet vertices as the unknowns the solver moves the vertices themselves; the grid only routes features between cells nodes route features; no corners, no J out of scope for P01: the cell-graph network, fusion and inertia read corners, ADR 0003 out of scope architectural alternative, no number
Figure 6. Every candidate, one picture each, on the toy of Figure 1. Purple: the same null vector d as in Figure 1, J d = 0. Orange: the element that pins that motion. Panels 1 and 2 are implemented; their numbers are the Gate D record's and the probes'. Panel 3 is the ADR 0003 fallback. Panel 4's numbers are the asset-library builder trials a to d on the same 24 source meshes, totals computed from the per-entry seconds and the rejection reasons in their index.json: edge 1.0 accepts 14 of 24 in 17.6 min at a median 4.8 tets per cell; edge 0.7 accepts 14 of 24 in 31.6 min at 9.8 tets per cell; edge 0.5 accepts 9 of 24 in 74.9 min at 28.7 tets per cell, 4.3 times the time of edge 1.0, and still rejects 2 meshes for corner coverage; a second edge 1.0 run, trial d, accepts 15 of 24 in 10.3 min. Panel 5 is the follow-up suggestion recorded in p01_carrier.md section 4.3, not measured. Panel 6 is out of scope because ADR 0003 keeps the corners as the only degrees of freedom and leaves the network and the fusion unchanged.

6. Fix 1: the carrier weight

Switch carrier_hex_weight = w. With w > 0 the potential of a tet batch is

Phi(x) = E_tet_elastic(J x) + E_tet_damping(J x) + w E_hex_elastic(x) + inertia + contact

E_hex_elastic is the hex Neo-Hookean elastic energy of the carrier cells: eight Gauss points per cell, the body's own lam and mu_scale, the inversion rule of stable_neo_hookean, no hex damping. In code it is physics.carrier_hex_elastic: scale * (hc.weights * stable_neo_hookean(F, lam)).sum(-1) per cell, with F the Gauss-point deformation gradient of the cell's eight corners, then w times the per-object sum. The term is zero at the rest lattice and depends on x itself, so a ker J displacement costs energy and gets a restoring force in every direction. The price is a bias: the body as a whole is stiffer by about w times the material's stiffness on the filled part of each cell, because a deformation of J x deforms the carrier too. On lattice tets the hex and tet energies agree on affine deformations, so the term would only stiffen the body uniformly; the lattice arms stay at w = 0 and are bitwise unchanged.

Phi(x) = E_tet(J x) + w E_hex(x) + inertia + contact E_tet reads the vertex: blind in ker J E_hex reads the 8 corners directly: every corner mode costs energy, ker J included price: about w times the material stiffness on the filled part of a cell w = carrier_hex_weight, 0 on lattice arms 1 2 5 10 20 carrier edge max at step 120, log weight 0, plate 353: 12.18 weight 0, compact 145: 13.63 12.18 13.63 w = 0 weight 0.02, plate 353: 1.60 weight 0.02, compact 145: 4.02 1.60 4.02 w = 0.02 weight 0.05, plate 353: 1.28 weight 0.05, compact 145: 3.37 1.28 3.37 w = 0.05 weight 0.1, plate 353: 1.28 weight 0.1, compact 145: 2.81 1.28 2.81 w = 0.1 weight 0.2, plate 353: 1.30 weight 0.2, compact 145: 2.22 1.30 2.22 w = 0.2 plate 353 compact 145 compact body at w > 0: a local dent at its floor impact, steps 60 to 90, not drift
Figure 7. Fix 1, the carrier weight. The hex Neo-Hookean elastic energy of the carrier cells is added at weight w. It depends on x itself, so a ker J displacement costs energy and gets a restoring force. Right: the inference probe on the T1 checkpoint, soft well, 120 steps. Weight 0 reproduces the drift. Every weight from 0.02 on removes it. At 0.02 the compact body still inverts one hex cell at step 106. From 0.05 on no hex cell and no tet inverts. Data: p01_carrier_20261013/runs/T1_soft_w*.json.

What the probe measures at step 120 of the soft well, plate and compact body: carrier edge max 12.18 and 13.63 at weight 0, 1.60 and 4.02 at 0.02, 1.28 and 3.37 at 0.05, 1.28 and 2.81 at 0.1, 1.30 and 2.22 at 0.2. The 60-step drift slope falls from 0.057 and 0.129 per step at weight 0 to at most 0.004 per step from 0.05 on. The maximal penetration falls from 1.28 and 2.24 r to 0.04 to 0.09 r. The tet edge max is 1.15 to 1.19 for the plate and 1.30 to 1.33 for the compact body at every weight, so the material is almost untouched at the probe. The network was trained without the term, so the probe is a stabilisation test, not an accuracy test.

0 4 8 12 16 full-horizon survivors of 16, last 4 epochs x 4 scenes T1 0 of 16 weight 0 T1_c05 T1_c05: 3 of 16 3 of 16 weight 0.05 T1_c20 T1_c20: 14 of 16 14 of 16 weight 0.2 D1_c05 D1_c05: 16 of 16 16 of 16 w 0.05, DAT planes D1_c20 D1_c20: 16 of 16 16 of 16 w 0.2, DAT planes K1_c05 K1_c05: 16 of 16 16 of 16 w 0.05, coupled C1_c05 0 of 16 w 0.05, pairs law, epoch 19
Figure 8. Training outcome of the weight arms, Gate D record, 20 epochs on 4 GPUs each, seed 73. On the voxel collision surface the weight 0.2 arm survives 14 of 16 and the weight 0.05 arm 3 of 16. On the tet collision surface with division planes or the coupled constraint both weights survive 16 of 16. The pairs law arm C1_c05 survives 0 of 16, as its lattice twin C1L does. Data: p01_gateD_20261014/README.md.

Inference from these numbers, not a measurement: on the voxel surface the contact forces act on the hex face samples, so the carrier has to carry the contact, and a weight of 0.05 is not enough there. On the tet surface the carrier carries only the network's features and frames, and both weights suffice. The accuracy cost of the bias is not measured yet.

7. Fix 2: the minimal-norm reset

Switch carrier_reset. It adds no energy. At the end of every committed physical step, in Step.advance after the DAT truncation and before the velocity update, every asset body's corners are rebuilt. From the docstring of carrier_reset.py:

v        = J x_committed                           the vertex positions the physics produced
x_rigid  = R (x_rest - rc) + vc                    the rest corners under the rigid transform that best fits
                                                   the vertex motion: vertex-mass weighted Procrustes fit
x_new    = x_rigid + J^T (J J^T)^-1 (v - J x_rigid) the minimum-norm corner correction that reproduces v

J x_new equals v to rounding. The material is unchanged. The carrier loses every accumulated component in ker J. V = X_new - X_prev sees the reset state. Pinned corners keep their positions and the least-squares runs on the free corners only. The system J_F J_F^T is fixed per mesh and pin set, assembled once, and solved per batch layout with one factorisation: dense Cholesky up to 1024 vertices per block, cuDSS above it, both in float64. Lattice bodies are skipped. The reset is not differentiable and never runs inside a query.

1. after the step: x_committed v = J x_committed carrier scrambled, ker J part 0.37 cells 2. rigid fit of the vertex motion x_rigid = R (x_rest - rc) + vc residual v - J x_rigid: what the material did 3. smallest correction: J x_new = v x_new = x_rigid + J^T (J J^T)^-1 (v - J x_rigid) vertices exact, ker J part 2e-16 cells
Figure 9. Fix 2, the minimal-norm reset, computed on the 2D toy of Figure 1. Panel 1: the committed state carries a scrambled carrier, a rigid motion and a real stretch of the material. Panel 2: the rest corners under the rigid transform that best fits the vertex motion, a vertex-mass weighted Procrustes fit. Panel 3: the smallest corner correction that reproduces the vertices exactly. The ker J component relative to the rigid pose drops from 0.37 cells to 2e-16 cells in this drawing. The formula is the one in carrier_reset.py. The reset runs on the committed state after each step, never inside a query, and adds no energy.

What the probe measures with the reset on, same scene, same checkpoint, weight 0. No tet inverts in 120 steps on either body. The compact body's tet edge max is 1.08, the best of all rows, against 1.30 at weight 0 and 1.32 at weight 0.05. Its elastic plus damping energy at step 120 is 0.39 J against 22.8 J at weight 0. But the plate's carrier edge ratio is still 10.7 at step 120 with 127 inverted hex cells, and the 60-step slopes fall only from 0.057 and 0.129 to 0.021 and 0.043 per step. The reason is in the per-corner dumps: the plate bends. Its vertices leave the rigid pose by 2.50 cells RMS and 8.90 cells max at step 119 at a tet edge ratio of 1.21. The minimum-norm reconstruction of that bend is not smooth.

weightresetbodycarrier edge max at 120inverted hex cells at 120inverted tets at 120tet edge max at 120max penetration, r
0offplate 35312.183201.151.28
0offcompact 14513.6311701.302.24
0.05offplate 3531.28001.190.04
0.05offcompact 1453.37001.320.06
0onplate 35310.7112701.210.38
0oncompact 1453.52001.081.57
rigid pose material: a bent two-cell sheet, the vertices follow it heavy corner: large weights, takes most of the correction, follows the material light corner: small weights, gets little correction, stays near the rigid pose stretched carrier edge between them: plate edge ratio 10.7 at step 120, 127 inverted hex cells
Figure 10. Why the reset leaves the plate's carrier distorted. This is a sketch of the mechanism read from dump_analysis.md, not a drawing of data. The 1.2 m plate bends by up to 8.9 cells while its tet edges stay at 1.21. The correction J^T (J J^T)^-1 r lands on each corner in proportion to its weights. Heavy corners follow the material, light corners stay near the rigid pose, and the carrier edges between them stretch: median incident edge ratio 1.91 for corners at 1 to 10 percent of the median mass against 1.36 for the heavy ones at step 119.

Cost, measured with CUDA events: 2.94 ms per step on the two-body probe scene with 5309 vertices. On a D1 scene with 34135 cells, 22 bodies, 18 of them assets with 36002 vertices in total, the cuDSS reset costs 2.74 ms per step on average, median 2.62 ms, with 42 MB of device memory for the factor; the dense alternative costs 25.9 ms and 962 MB. One query of such a scene costs tens of milliseconds and the reset runs once per 8 queries.

Open problem of the reset path. The three cluster jobs with the reset, T1_p, D1_p and D1_pc05, failed twice each on 4 GPUs with an NCCL collective timeout at the first training update. One rank hangs. The copied logs of one attempt each show it: ranks 0, 2 and 3 report a watchdog timeout of the all-reduce with sequence number 101 after 10800000 ms, and rank 1 reports its last enqueued work as 100. progress.json of each job stops at epoch 1 with 1 completed update. The cause is not yet known. Two local smoke runs with the reset switch finished today without a hang: a two-rank run of 6000 cells completed 2 epochs and 31 updates, and a 32000-cell run completed 1 epoch and 6 updates. So the hang is not reproduced locally yet. Until the cause is found the reset has no training outcome.

8. Fix 3 in reserve: Option B of ADR 0003

ADR 0003 chose one deformation gradient per tet from the embedded vertices; the spec and the plan page call this Option A. The ADR kept one alternative as the fallback, in its words "the hex deformation gradient evaluated at tet quadrature points"; the spec calls it Option B. For linear tets the quadrature point is the tet centroid and its weight is the tet volume. The ADR says of it: it keeps the energy a function of the cell modes and cannot leave corners without weight. So there is no null space in practice. It is not Newton VBD's tet potential, so the lattice-tet fidelity gate would lose its exact reference. Spec section 12 records that Option B stays the fallback behind the two switches.

Fix 1: carrier weight energy: E_tet(J x) + w E_hex(x) lives on: tets and all hex cells constrains: vertices, and every corner mode through E_hex null space: closed by energy VBD equality on lattice: kept at w = 0 price: stiffness bias about w status: trained, see Figure 8 Fix 2: minimal-norm reset energy: E_tet(J x) only lives on: tets; a projection after each committed step constrains: vertices exactly; corners by minimum norm null space: emptied once per step VBD equality on lattice: kept, skipped price: 2.7 ms per step; bent sheets status: blocked by a 4-GPU hang Fix 3 in reserve: Option B energy: hex F at tet centroids, weighted by tet volumes lives on: every cell a tet touches constrains: the cell modes of every tet cell; no reset null space: none in practice VBD equality on lattice: given up price: new kernels, new reference status: ADR 0003 fallback, not built
Figure 11. The three approaches side by side. Option B, the spec's name for the ADR's fallback, evaluates the hex deformation gradient at the tet quadrature points, so the energy stays a function of the cell modes and cannot leave corners without weight. It is not Newton VBD's tet potential, so the lattice-tet fidelity gate would lose its exact reference. Source: ADR 0003 and spec section 12. The "price" and "status" lines are my summary, not quotes.

9. The plan

Now weight arms done: T1_c05 3, T1_c20 14, D1_c05 16, D1_c20 16, K1_c05 16 of 16 reset arms blocked: T1_p, D1_p, D1_pc05 hang at the first update Measure next beam error against VBD on asset meshes for the weight arms, 0.05 and 0.2 renders of the asset arms find the reset hang, which local smokes do not show, then rerun T1_p, D1_p, D1_pc05 Decision rule pick the fix whose asset arms match the lattice arms' survival, 16 of 16, and do not lose beam accuracy against VBD a combination is allowed else: Option B Question for Anka weight, reset or Option B? which bias do you accept: w times the stiffness on filled cells, a per-step projection with bent-sheet distortion, or a hex energy that is not VBD's?
Figure 12. The plan. The survival numbers are the Gate D record's. The beam error against VBD on asset meshes is not measured yet; it is the next measurement. The hang of the reset arms is the open problem of the reset path.