WilD3DGen · Unified Geo-Tex DiT — the next architecture
one dual-stream DiT · five sampling modes by dialing two timesteps · deep-research-verified recipe · 2026-08-10
designarchitecturedeep-researchnext-arch
0 · TL;DR
Decision: keep the SS flow; merge shape-SLAT + tex-SLAT flows into ONE dual-stream DiT with per-modality timesteps. Joint generation, mesh-only, texture-given-mesh (exact geometry lock) and geo-given-tex all come from the same weights — just dial (t_shape, t_tex) at inference.
Novelty (verified): no published 3D method offers one DiT + switchable mesh-only/tex-only (8 searches + all 16 UniLat3D citations checked). The mechanism is de-risked in 2D: UniDiffuser (ICML'23) + JointDiT (ICCV'25).
Verification depth: a 103-agent deep-research pass extracted 100 claims from 21 sources and adversarially verified the top 25 with 3-vote panels — 24 confirmed / 1 refuted. All formulas below are verbatim-checked against the ICCV paper + supplement.
1 · The gap — why this is worth doing
Unified-latent camp (UniLat3D, 3DTopia-XL, TRELLIS v1): one DiT, but geo+tex are fused per-channel in a single latent → cannot hold geometry fixed while regenerating texture.
Cascade camp (TRELLIS.2 = our base, Hunyuan3D 2.x): mesh-only / tex-only exist, but as two separate 1.3B models with GT-shape teacher-forcing (exposure bias) and inference-only coupling.
Our shape/tex SLATs live on the same sparse voxel coords — a 1:1 per-voxel pairing neither camp has. Unify at the model level, keep the latents separate.
The literature quadrant: top-right (one DiT + iso-samplable) is empty — verified via citation sweep, not vibes.
2 · Architecture
SS flow untouched (defines the coords). The two SLAT specialists become two streams of one DiT: each keeps its own weights + AdaLN fed by its own timestep.
Warm start: shape stream ← fusion_shape ckpt, tex stream ← fusion_tex ckpt. Zero-init bridge ⇒ at step 0 the joint model exactly reproduces both production flows — training can only grow coupling, not break the specialists.
Cond path ([DINOv3 ; VLM hidden] read-once cross-attn) is unchanged; all caches and the S3 tri-modal data mixture are reused as-is.
Bonus: assets without tex (455k total vs 293k with tex) train the shape stream via modality masking — data utilization goes UP.
THE current architecture (Stage-1 final): both specialists stitched, geo frozen bit-exact, tex fully trained, dual attention borrows geo's K/V behind a λ gate, cond stays read-once. The gate matrix's ✗→λ' cell is the entire Stage-2 bidirectional upgrade.Left: today's 3-model cascade with teacher-forced tex. Right: SS kept, one unified DiT — everything downstream of SS becomes a single training job.Per-block wiring. The zero-init projection is the warm-start safety: step 0 ≡ the two specialists. Caveat (verified): JointDiT fused ONE frozen backbone + LoRA copy; fusing TWO independent checkpoints is our untested step.
3 · The mode dial — one model, five modes
① Joint (t_s = t_x): one pass produces geo+tex; tex sees the shape stream mid-denoise → the cascade's exposure bias disappears.
② Tex | mesh (t_s ≡ 0): shape tokens are clean encoder outputs, never integrated → geometry preservation is exact by construction. This natively covers E1a/E1b re-texturing and bypasses the SLAT-renorm locality trap.
③ Geo | tex (t_x ≡ 0): free reverse capability.
④ Mesh-only (t_x ≡ 1): tex branch FED pure noise (tokens present, not dropped) — UniDiffuser's marginal theorem; exact under rectified flow.
⑤ Tex-only (t_s ≡ 1): rarely useful alone, comes free.
The whole product surface is timestep geometry: joint = diagonal, conditioning = pin an axis at clean, marginal = pin at noise. No retraining between modes (JointDiT: verbatim-verified, 3-0).
4 · Verified training recipe (what we implement)
#
Trick
Exact form (verified)
Vote
T1
Timestep-pair sampling
50/50 mixture: half diagonal (one shared t ~ f), half independent (f × g, branches swapped). Transform t = 1−σ(z)·s/(1+(s−1)σ(z)), z~N(0,1); s=3.1582 (kohya Flux default, e^1.15) for f, s=0.25 for g. No explicit corner sampling (grep-verified negative).
3-0
T2
Adaptive scheduling weights
w_x = σ(α(t_y/(t_x+t_y)−½)), α=3 — multiplies the joint cross-attn OUTPUT (feature gate, NOT loss). Noisier stream listens more to the cleaner one. Ablation: both tricks needed (ImageReward Rank1 30.7% vs 21.2% weights-only).
Other modality fed pure noise at max-t (Algorithm-2-verified; tokens present, not dropped). Exact under RF where x₁=ε.
3-0
T5
Conditioning exactness
UniDiffuser theorem: t_cond=clean recovers q(x₀|y₀) at the population optimum — the geometry lock has a proof, not just intuition.
3-0
T6
Free modality-CFG
ε̂ = (1+s)·ε(x, y_clean) − s·ε(x, ε_y@max-t) — no null token, no condition-dropout. Composes with (does not replace) our existing DINO/VLM cond-dropout CFG.
3-0
Training coverage of the (t_s, t_x) square: the clean-heavy g (s=0.25) pushes one branch toward the conditional corners — that is why JointDiT needs no explicit corner sampling.Left: the gate — shape listens to tex only when shape is the noisy one. Right: the #1 porting hazard — papers use t=0-noise; TRELLIS uses t=0-clean. Re-derive (denominator becomes 2−t_x−t_y); do NOT sign-flip. JointDiT arXiv v1 even misprinted Eq.7.
5 · Corrections vs our first manual read + honest costs
Corrected: we initially planned explicit 4-corner sampling "per JointDiT" — verified: JointDiT uses none. But its conditional modes are side capabilities; ours are products → corner oversampling is our ablation #1, not an assumption.
Corrected: the convention flip is not a sign flip — the gate denominator changes t_x+t_y → 2−t_x−t_y. Unit-test (x_t, v-target) per branch before anything else.
Corrected: JointDiT warm-starts ONE frozen specialist + LoRA copy; our two-independent-checkpoint fusion is genuinely untested territory (the zero-init principle transfers; the rank numbers do not).
Honest cost (verified): JointDiT pays +19.8% params, 1.6s→4.7s sampling, and its joint depth still trails specialist estimators on ETH3D — gate experiments must show ≈ parity with the current fusion flows, not assume it.
Open design decisions (no verified evidence exists): ① RF velocity-target validity under mixed timesteps (Diffusion-Forcing-style ELBO not verified for flow matching); ② AdaLN vs prepended timestep-tokens injection; ③ whether shared-coordinate pairing lets per-voxel fusion replace/augment joint cross-attn — our novelty AND our risk; ④ corner-oversampling ratios for product-grade conditional modes.
6 · Gate experiments (round 1)
G0 sanity: zero-init assembled model at step 0 ≡ both fusion flows (bit-exact forward).
G1 joint: ≥ cascade baseline on the 14 clean held-out assets (same SS, same cond, same seeds).
G2 tex|mesh: material-L1 ≈ current tex flow; geometry bit-exactness checked at the decoder.
G3 mesh-only: geom metrics ≈ current shape flow.
A1 ablation: + explicit corner oversampling (10–20% t_other pinned) vs pure f/g — the open question the papers cannot answer.
Full adversarially-verified deep-research dossier (all claims, votes, verbatim evidence, 21 sources): deepresearch_full.json · also archived at BLIP3o/docs/UNIFIED_GEOTEX_DIT_deepresearch.json.
7 · Dual-mode implementation plan — both cond modes in one codebase
One flag:cond_mode ∈ {cross_attn (A), stream (B)} in unified_geotex.py — the Stage-2 A/B is a config change, not a rewrite.
A (default, Stage 1): cond stays read-once cross-attn (the June-ablation winner). New params ≈ +5M (+0.2%): λ gates (360 scalars) + zero-init t_s→tex mixer. Tex-attn keys ×2; shape stream untouched.
B (Stage-2 arm): cond promoted to a third stream — zero-init proj 1024→1536 + 30 cloned blocks (self-attn 9.45M + MLP 25.18M each) ≈ +1.06B trainable, no pretrained source. Cross-attn KEPT during transition (warm-start safety); pruned only if B wins. Default gate: cond never reads voxels → cond stream is sample-constant → per-block K/V cacheable across all ODE steps.
Evidence bar for B: it re-fights the June cond-injection ablation (read-once won, MMDiT-style worst, fairness-controlled) — B ships only if it beats A same-data-same-steps.
Both variants share the assembled 2-stream core; B adds a third (cond) stream behind λ gates while KEEPING cross-attn for warm-start safety. Param bars measured from checkpoint tensor shapes — B nearly doubles the trainable budget for a pathway our own June ablation voted against; it must earn its way in.
8 · Final decision log (2026-08-11, design frozen)
Decision
Verdict
Basis
Trainable set
FULL tex stream (1.30B), not tail-only
concat_cond distribution shift enters at input_layer; MF trains its appended stream fully; tail-only demoted to ablation A4
Dual attention weights
100% borrowed (tex Q · geo K/V), zero new projections, λ gates only (+360 scalars)
bilinear form needs one trainable side; standard MMDiT semantics (SD3/FLUX/MF add none); A2 bridges queued if the frozen-projection ceiling shows
Implementation of the masked union softmax
two standard attention calls + LSE merge
mathematically exact; reuses sparse kernels; λ=−∞ makes G0 identity EXACT
Attention budget
2L² (cascade) → 3L² (Stage-1 one-way) → 4L² only if bidirectional ever opens
block mask deletes the geo→tex quadrant from computation, not just from the softmax
Bidirectional (geo←tex)
default-permanent one-way; trigger-gated, not scheduled
chain rule: p(g,t|c)=p(g|c)·p(t|g,c) — one-way loses zero expressiveness for our mode set; MF's leader-first ablation; our negative-results record on speculative coupling. Trigger: G1 shows geo-tex misalignment the cascade lacks AND tex-side fixes fail → then bundle λ' + geo training + tri-modal data + self-distill
Cond injection
read-once cross-attn (A); cond-as-stream (B) only as Stage-2 A/B arm
June fairness-controlled ablation: read-once won; B must beat it same-data-same-steps
mass follows the product: corner = tex|mesh mode; band = exactly the schedule family inference will run (α stays a free knob); full square = robustness + t_s=1 edge for free shape-CFG. Fixed-lag rejected (kills the α knob, off-path = OOD); full-uniform rejected (below-diagonal is useless for our modes). Band-vs-triangle = ablation A6.
Is wide coverage inefficient?
second-order concern
standard diffusion already trains ALL t with one net (1-D "full coverage"); MF/JointDiT/DF all train wide and win — but we still bias 80% of mass onto product-relevant regions.
Timestep-aware MMDiT
per-stream AdaLN (own t) [standard] · zero-init t_s→tex mixer [verified: MF] · bridge = borrowed-K/V attention → output projection with zero-init (free initialization, NOT a runtime gate)
"Why a gate at all" audit: the projection is needed anyway (basis adapter, UniCon has it); zero-init costs nothing and buys G0-as-assembly-test (strict=False misload history) + no init loss spike (why ControlNet/UniCon/JointDiT/LLaMA-Adapter all zero-init). The true runtime gate w(t) is demoted to A7: JointDiT's "gates needed" evidence predates corner sampling — MF beat it 57% with NO attention gate using corner sampling + modulation mixers, both of which we adopt. A8 = shared-softmax λ variant.
Inference schedule
t_x = f_α(t_s), α∈[1,16] sweepable, α→∞ ≡ cascade
MF-verified leader-first ("geo as scratch pad"); the trained band makes the whole family in-distribution without retraining.
full tex stream 1.30B + λ(t) + t_s mixer; geo frozen, no geo loss
§8 decision log.
Step cost
≈1.3–1.5× a current tex-stage step
tex fwd+bwd (attn +50%) + geo fwd (no_grad).
Extras
bridge-dropout p≈0.1 · (x_t, v-target) convention unit test
robustness + uncond branch; the #1 porting hazard.
Left: training mass follows the product — the corner edge IS mode ②, the α-band IS the inference schedule family, and only the 20% robustness component strays below the diagonal. Right: one trained model serves every α from sync to the cascade limit; 'geometry first' is a free inference dial, not a baked-in choice.
Where earlier sections and this one disagree, THIS section is current. Changes driven by: the variant-definition correction (the two first-class variants are COND-injection variants — "mmdit+cross" vs "mmdit joint"; geo↔tex coupling is MMDiT joint attention in both), the provenance audits (every self-invented mechanism deleted or demoted), and a blind line-by-line audit vs all three reference codebases (8 findings, all fixed).
Coupling (geo→tex): coupling="union" DEFAULT — MF-verbatim bare single-softmax over [K_x;K_s] (dit.py:137-148). coupling="gated" READY FALLBACK — in-house mmdit_slat.py:190-196 two-softmax + per-head zero-init gate. Decision is empirical: G0 measures the per-block cross/self logit ratio on the real checkpoints (mmdit_slat measured O(1e2-1e3) for its independently-trained pair; MF's clone streams are naturally matched) — O(1) clears union, pathological switches to gated before any training run is spent.
Sampler: 20% exact t_s=0 corner (MF-exact per-corner mass) + 80% independent uniform² — MF-adapted; the dropped d2i corner's budget folds into joint (that mode doesn't exist here). 40% corner and the α-band are ablations (A1/A6), not defaults.
Deleted after audits: zero-init bridge Linear (+71M), trained λ logit bias, runtime gates w(t), bridge-dropout, renorm adapter (the two norm-stat sets measured bit-identical — guarded by a unit test), tail-only training.
Blind-audit fixes: cond key-masks now consumed (drops were silent no-ops), autocast wrappers (bf16 TimestepEmbedder crash), EMA overlay on checkpoint loading (published-number parity), use_checkpoint honored, coords-parity asserts, t/target dtype discipline, alpha_lo bug, train() keeps geo eval, RoPE-parity asserts, stream-axis decision documented (we match JointDiT; MF's 4th RoPE axis is warm-start-incompatible with a pretrained 3-axis head_dim split).
Verification: CPU unit tests 6/6 · imports clean · G0 (GPU, queued) = dual-coupling identity + the [SCALE] measurement → 100-step sanity → 3k Stage-1 → G1/G2.
AS-BUILT: the implementation-accurate architecture. The coupling inset + [SCALE] decision diamond is the one open empirical question; everything else is frozen, line-annotated to its reference, and covered by the verification chain on the right. Invented-without-reference mechanisms in the model: zero.
11 · BIDIRECTIONAL PIVOT (2026-08-12) — final S1 topology, supersedes the one-way verdict of §4/§10
User topology decision: geo and tex MUTUALLY attend ("both read 2L") in the joint interior. The one-way analysis of §4 is retained above for the record but no longer describes the trained model.
Corner-masked bidirectionality (Diffusion-Forcing noise-conditioned-mask precedent): per-sample, geo's tex-read is HARD-disabled at the ts=0 corner — exactly the tex|mesh operating point — so geo stays time-invariant there: the 30-block K/V one-pass cache and the exact geometry lock survive bidirectionality. In the joint interior (ts>0) both streams read each other, standard-MMDiT phase order (both QKV from pre-update hiddens, then both advance).
Dual corners (full MF recipe restored): 40% ts=0 EXACT (flagship tex|mesh; user doubled MF's 20%) + 20% tx=1 EXACT (mesh-only MARGINAL — tex lane carries pure noise; diffuse at t=1 returns ε exactly, no leakage) + 40% independent uniform square. Hard unit-asserted: 4×4 occupancy of the joint square; both corners span the opposite axis.
Stream tag: TRELLIS RoPE pads 63 coord-driven pairs (21/axis) to 64 with polar(1,0) — an IDENTITY pair that is the 128/2/3 integer-division remainder (rope.py L47-51, code-verified). Foreign keys get that pair rotated by π/2 at the borrow site: float-EXACT (swap+negate), within-stream attention bit-identical, cross-stream logits gain an antisymmetric which-stream phase. Adapted from MF's stream-id RoPE axis (a literal 4th axis would re-split the pretrained head_dim = warm-start killer). Fallback if 2/128 dims prove weak: zero-init additive segment embedding.
Symmetric cross-t mixers: tex has the MF-v2 mixer (embed(tx) + α·mixer(ts)) since v1; geo now gets the mirror (embed(ts) + αs·mixers(tx)). Both gates zeros(1) (MF FSDP note), both mixers FRESH TimestepEmbedder instances (MF dit.py:277-288), mixed at the vec level once before the (frozen) adaLN. The gradient asymmetry is the LOSS's, not the architecture's: α has a direct path; αs reaches the tex loss only through the cross-stream read (in-graph frozen geo lane). Watch-trio at ckpt-1000: α, αs, b_gates opening.
S1 training unchanged in spirit: geo WEIGHTS frozen, loss = tex velocity only; the geo lane runs in-graph so the new zero-init parameters receive gradients. Whole block pair gradient-checkpointed (~92GB/GPU measured, below the one-way run's 137GB).
G0 re-certified after the pivot: 6 arms × (L1-tiny + L2-real 1.3B) all pass. One real catch fixed on the way: union-bidir corner rows must take the FLASH pure-self result — per-sample sdpa is 1-ULP-class off flash at real scale (measured 4.7e-2 over 30 blocks); corner rows are now kernel-identical to the cached inference path.
mesh-only in the bidirectional world: two implementations ship — (a) the pure geo specialist path (always available; geo weights untouched in S1), (b) the marginal (tex pinned at tx=1 with fresh noise per step, the trained corner2 config), primary once S2 trains geo.
The corner-masked bidirectional block, final S1 form: mutual K/V reads (std MMDiT) in the joint interior, one-way at the ts=0 corner (cache + geometry lock), stream identity via the float-exact π/2 rotation of RoPE's spare identity pair, and symmetric cross-t mixers so BOTH streams know BOTH timesteps.
G2 PASSED and beats the specialist: tex|mesh latent MSE 0.969 vs 1.021 (ratio 0.950, threshold 1.05), and the render grid agrees — one unified model matches specialist texture quality on the flagship mode while also carrying joint and mesh-only.
G1 joint FAILS at finite α: α=4/32 render nearly black on the hard asset, only α=∞ (the literal cascade dispatch) is correct. The bidirectional model is sound — what breaks is the interleaved integration. Open problem, does not block the products.
Run: runs/geotex_s1_v1, 3000 steps in 7h08m (avg 8.56 s/it), loss 0.7524 → 0.5295 (min 0.4808). Config: corner-masked bidirectional + fused MMDiT attention + absolute RoPE-pad stream tag + symmetric cross-t mixers + dual corners 0.4/0.2 + union coupling + FULL 30-block tex training (1301M trainable) + elastic GC + bf16 with fp32 grad accumulation + ZeRO-1, bs4×ga8.
The two zero-init gates both opened, monotonically: cross_alpha (tex knows ts) 0.0081 / 0.0153 / 0.0190 at ckpt 1k/2k/3k; cross_alphas (geo knows tx) 0.0114 / 0.0206 / 0.0231. The geo-side gate — whose gradient must cross the stream boundary through frozen weights — grew FASTER, so the starvation worry was unfounded. The bidirectional timestep awareness is genuinely used, not decorative.
Multi-seed: 3 seeds stay stable and diverse, and the warm-start union perturbation that was plainly visible at 3 steps (washed-out / green / dark textures) is fully absorbed by 3000 steps — the MF-faithful "stitch bare, let training absorb it" bet paid off at our scale too.
G1 hypotheses (ranked, to be diagnosed not guessed): (1) concat_cond distribution shift — joint feeds tex the NOISY geo state xts while 40% of training sits at the clean ts=0 corner, so raising the corner from MF's 0.2 to 0.4 may have starved joint-region coverage (A1 is the ready control arm); (2) the α-warped grid makes geo's early steps too coarse; (3) joint training covers the whole square, so any single α curve is thinly sampled; (4) geo reading high-noise tex pollutes it.
Methodology note worth keeping: every verdict here is a number AND my own image read. Latent MSE alone previously ranked a visually worse model higher (n=2), and G1's failure is invisible in the summary statistics — only the renders show the collapse.
G2 — tex|mesh with geometry locked. Unified (right) vs the tex specialist (middle) vs GT: indistinguishable on 5 of 6 assets. The thin-pole stand (row 1) loses its base in BOTH columns — an asset-level hard case, not a unified regression.G1 — the α sweep exposes the open problem: α=4 and α=32 collapse to near-black on the hard asset while α=∞ (cascade dispatch) is correct. Since α=∞ uses the same trained weights, the failure is in the interleaved integration, not in the bidirectional architecture.Multi-seed tex|mesh: stable and diverse across seeds, with the 3-step warm-start artifacts (compare the earlier smoke grid) fully gone.
13 · TIMESTEP SAMPLING CORRECTED (2026-08-13) — the interior 40% was aimed where inference never goes
The shipped sampler drew the non-corner 40% independently over the FULL (tgeo, ttex) square, so 20% of every batch trained texture AHEAD of geometry — a configuration none of the three product modes ever visits. Corrected mid-S2b: that mass now covers the upper triangle, and only the one useful lower-triangle edge is kept.
The whole argument in one picture. Every inference mode lives in tgeo ≤ ttex: tex|mesh is the left edge, mesh-only is the top edge, and joint rides an α-warp curve between the diagonal and the cascade limit. BEFORE, a fifth of every batch (red) sat below the diagonal where nothing ever runs. AFTER, the interior is uniform over the union of ALL α trajectories, and the only surviving lower-triangle mass is the tgeo=1 edge — which is not waste: it is the uncond branch of UniDiffuser's free modality-CFG.Both corners are untouched, so the flagship tex|mesh mode and the mesh-only marginal keep their exact training mass. Only the interior is re-aimed: 20% → 35% on the upper triangle, 20% → 0% below the diagonal, 5% reserved for the CFG edge.
How the deviation happened (on record): the design doc §5 specified 40% ts∼U[0,tx] as a lag regime. When the bidirectional topology added the second corner (20% at tx=1), the lag arm was displaced by an independent-square draw and the doc was never updated. Caught only because the owner asked whether the square wastes capacity — it does.
What the references actually do (re-verified, not recalled): MF = 60% joint with BOTH timesteps drawn independently (logit-normal μ=1.1) + 20% I2D + 20% D2I; JointDiT = 50% diagonal + 50% independent, no corners; UniDiffuser = 100% independent uniform. None restricts the joint region to a triangle, so the square was defensible — but none of them has our asymmetry either: all three of our modes are one-sided in the leader.
A claim retracted: an earlier verbal justification held that MF’s α=32 inference “works off the full-square coverage”. The papers say no such thing; that was an inference presented as provenance. The verified facts are the mass fractions above, nothing more.
Why uniform-over-triangle and not the α-band: the band arm draws α log-uniform and places ts on the exact fα-1 curve. For large α, ts ∝ 1/α, so log-uniform α gives density ∝ 1/ts — mass piles up next to the ts=0 corner that already holds 40%. Uniform over the triangle covers every α the inference sweep may pick without double-investing where we are already saturated.
Shipped as: p_lag=0.35, p_marg_s=0.05 in flow_heads.sample_timestep_pairs, both defaulting to 0 — the defaults were regression-tested bit-exact against the pre-change sampler, so no earlier run is retroactively altered. Measured over 200k draws: tgeo=0 40.1% / ttex=1 19.9% / upper-triangle interior 35.0% / tex-ahead 5.0% (all of it the tgeo=1 edge).
Cost of switching mid-run: S2b restarted at ~1.2 h in. The three S2b gates survive the change because none of them is an S1-vs-S2b comparison — G3 is against the shape specialist, G2 against the tex specialist, G1′ is joint-vs-mesh-only inside the same model. What the restart forfeits is the narrower question of how much the geo unfreeze contributed on its own.
14 · UNIFY DiT — FINAL ARCH / CONFIG (2026-08-15)
A from-scratch three-stream sparse MMDiT: geo · tex · cond, N double-stream blocks → merge → 2N shared blocks. Every module is TRELLIS.2’s own or a G0-certified stitching helper; every design choice below names the reference that made the same choice, or is flagged as a deliberate deviation with its reason.
The three streams enter with their own projections, run 8 blocks with their own weights but ONE joint attention, merge into a single sequence for 16 shared-weight blocks, then split. cond is never an output — it exists to be read and rewritten. Inside the shared stack nothing distinguishes a geo token from a tex token except the three per-token mechanisms listed at the bottom: geo and tex sit on identical voxel coordinates, so the segment tag is doing work FLUX and Hunyuan never needed.Provenance for every element. Blue = reused from TRELLIS.2 unchanged and verified BIT-EXACT against the block's own forward (max|diff| = 0.000e+00); green = matches a reference implementation read in source (Modality Forcing, Hunyuan3D-2.1, FLUX.2); orange = deliberate deviation. The rope row is now genuinely unchanged: TRELLIS's 3-axis config, 21 frequency pairs per spatial axis, freqs tensor bit-identical. An intermediate version of this design gave the segment its own 4th rope axis (Modality Forcing's time_id approach) and that cost each SPATIAL axis 5 of its 21 pairs — a certain loss traded for an ambiguous gain, since a segment-id difference of 1 turned only 3 of that axis's 16 pairs by more than 0.3 rad. Every deviation carries a stated reason — none of them is an accident.RoPE budget. TRELLIS ropes 63 of head_dim 128’s 64 pairs and leaves ONE unrotated; the segment tag spends exactly that spare pair, so the spatial ladder — which IS the geometry — keeps all 21 pairs per axis. Four segments are four quarter-turns of that pair, applied PER ROW so one cond stream can carry both its DINO and Qwen ids. Every turn is a swap and/or a sign flip: float-exact, and four turns return exactly to the identity (verified). This generalises the warm-started model’s own stream tag (_rotate_pad_pair, G0-certified and trained through S1 and S2b) from one whole-tensor turn to a per-token choice.
Config
knob
validation (297M)
production (1.03B)
note
dim / heads
768 / 6
1024 / 8
head_dim fixed at 128 — flash-friendly, and 64 rope pairs divide by 4 axes
double : single
8 : 16
16 : 32
1:2 (owner); MF uses 1:3, Hunyuan 1:2
params
298M
1.03B
double 57% / single 38%
latents
geo 32ch, tex 32ch (+32 concat_cond), cond 1024ch
SLAT widths, measured from the TRELLIS.2 flows
data
matclean v4: 397,235 + 397,156
the un-cleaned v4 the old runs used carried 5.4% / 5.9% material-bug assets
The four deliberate deviations
Segment tag on the spare rope pair, not on a rope axis of its own — MF gives the modality a 4th axis; measured, that would take each spatial axis from 21 pairs to 16. TRELLIS already leaves one pair unrotated, so the tag is free, and the pair's contribution to a cross-segment logit is cos(90°×Δid): adjacent ids null it, ids two apart negate it — either way a decisive mark, versus the ~1 rad a frequency ladder gives on its fastest pairs.
Ratio 1:2, not MF’s 1:3 — owner decision; Hunyuan3D-2.1 also uses 1:2 (16 double + 32 single), so both ratios have precedent.
Four segment ids, including DINO vs Qwen — MF gives txt the SAME time_id as img (0) and separates it by using a different RoPE axis (`_txt_ids` puts arange(seq) on axis 3, images put h,w on axes 1-2). We have three spatial axes in use and no free one, so separation has to happen on the segment axis itself. The DINO/Qwen split is free capacity: they are two different encoders concatenated into one sequence and nothing else told the model which was which.
cond carries no sequence position — MF’s txt does. Ours would have to borrow a spatial axis, colliding cond index 5 with voxel x=5. The bet is that ordering is already baked in by Qwen’s own RoPE and DINOv3’s position embeddings. One line to flip; deferred to an A/B.
cond modulation = sum of BOTH diffused streams’ timestep embeddings — all three references feed the condition stream the (single) diffused stream’s timestep through its own projection; we have two diffused streams, and summing keeps cond informed in every mode (tex|mesh moves tx, mesh-only moves ts) instead of picking one arbitrarily. Two SEPARATE embedders, so the sum is asymmetric — measured at init, the swapped pair (ts,tx)↔(tx,ts) sits 5× farther apart than the nearest legitimate neighbouring pair.
What the sparse latents force that FLUX / Hunyuan never had to solve
Varlen everything. Hunyuan3D’s latent is a fixed-length unordered vecset, which is why it can run dense sdpa with pe = None. Ours is SLAT: sparse voxels, 432–8013 per asset (median 2222), carrying real coords. The joint sequence is built per sample and fed to TRELLIS’s own varlen flash — the same kernel every SLAT block already uses. “Sparse” here means the TOKENS are the active voxels; attention among them is attn_mode="full".
Per-modality timestep in a shared stack. FLUX/Hunyuan broadcast one vec; our whole mode matrix (mesh-only / tex|mesh / joint) exists only because geo and tex carry independent timesteps. Shared blocks therefore share WEIGHTS but not MODULATION — which is exactly what MF’s _stack_per_token_mod does after its merge.
Two generated streams on identical coordinates. MF’s depth is spatially aligned with RGB and it needs a modality axis for that reason; ours is the stronger version of the same problem — geo and tex are not merely aligned, they are on the SAME voxels.
Sequence length. Joint sequence = 2×2222 + 2074 ≈ 6518 tokens at the median, 26,624 worst case. cond is 32% of it — FLUX/Hunyuan text is 77–512 tokens. Merging saves PARAMETERS, not compute: attention is identical in both regions, only the weights differ.
Bugs the audit caught (all fixed and re-tested)
🔴 No cond key mask at all. The pipeline marks padding AND the dropped-DINO curriculum (dino_drop_prob=0.3, flow_heads.py:212-225) in a key mask; the model took a dense cond tensor and would have packed those rows as real tokens. Fixed the varlen way — masked tokens are simply NOT PACKED, which is also cheaper than masking. Verified: a sample whose DINO segment is dropped contributes 60 tokens where an unmasked one contributes 90.
🔴 concat_src coordinate mismatch passed silently. The concat is positional, so a mismatch would have trained texture against the wrong geometry with no error anywhere. Now asserted.
🟡 t_cond missed the std=0.02 timestep-embedder init (measured 0.044 — it kept the generic xavier). TRELLIS re-initialises every timestep embedder; ours now does too.
🟡 A fully-masked cond sample produced a zero-length segment, silently turning that sample unconditional. Now an explicit assert — unconditional is a state to ask for, not to arrive at.
Process note: the first fix script aborted on an assert BEFORE writing, so two of the four fixes were never applied — caught only by re-running the verification (t_cond still read 0.044). A script that prints success is not evidence; the re-measurement is.
Verified by test, not by inspection
Zero-init start: out layers and adaLN zeroed → the model outputs exactly 0 velocity at step 0 (TRELLIS’s own initialisation recipe).
Varlen packing round-trips exactly with all three segments at different lengths AND different lengths per sample.
Backward reaches 465/465 parameters; gradient checkpointing at block level (the block’s own use_checkpoint is dead here because we call its pieces rather than its forward).
Every claim about a reference in this section was read from source: Modality Forcing at reference_repos/modality-forcing/flux_rgbd/, Hunyuan3D-2.1 at third_party_3d_gen/Hunyuan3D-2.1/. Three of my earlier statements about MF were wrong and are corrected above.
14.9 · Line-by-line audit (2026-08-15) — four parallel auditors + a full read
Nine defects, four of which stop the run on step 1 or corrupt it silently.
Four auditors with non-overlapping remits (codebase contract · TRELLIS.2 op-for-op equivalence ·
varlen packing and autograd · every reference claim re-read in source) plus my own read of all 476 lines.
Every finding below was reproduced before it was fixed, and re-measured after.
#
Defect
Effect if shipped
How it was caught
1
tex latent width was 64, not 32. The tex config's in_channels: 64 is tex(32)+concat shape(32); out_channels: 32 is the latent.
Crash on step 1 (96-wide weight, 64-wide input), and a 64-ch velocity against a 32-ch target.
Auditor checked the constant against the authoritative config. My own regression test fed 64-ch tex too, so it was green through every run.
2
Freeze audit's allow-list has no cond_flow./cond_t./shared_blocks. prefix.
AssertionError before step 1 (~200 names).
Contract auditor enumerated the real parameter names against the real allow-list.
3
The entry point froze geo_flow (right for a pretrained specialist), and unfreeze_geo() was a documented no-op.
Silent: a random geo tower with a zero-init out layer forever ⇒ v_s ≡ 0, geo and distill losses constant with no gradient. The freeze audit cannot see it — it only inspects params that still require grad.
Contract auditor traced the flag through to the model.
4
Two of three sampler modes called the geo tower as a standalone specialist.
Mesh-only and joint(α=∞) crash; G3 unmeasurable.
Contract auditor read every sampler call site.
5
No dtype/convert_to protocol (SLatFlowModel has one).
The sampler runs outside autocast on fp32 latents ⇒ FlashAttention only support fp16 and bf16.
Reproduced when the fixed sampler modes were first actually run.
6
Packing used new_empty + slice assignment.
24 chained CopySlices nodes per block, each cloning the whole packed gradient: measured 2.6× the fwd+bwd of torch.cat (86.4 s vs 33.1 s / 5 iters).
Packing auditor benchmarked both forms.
7
q, k, v packed separately, then stacked.
Four full-size buffers per block instead of one (~1.5 GB transient at B=8), paid twice under checkpointing.
Same auditor.
8
--geotex_gc wrote per-block flags this model never reads.
--geotex_gc 0 silently kept checkpointing all 24 blocks.
Contract auditor followed the knob to its consumer.
9
Six reference claims wrong or unverifiable: MF does keep a 4-block depth-only decoder; MF's text shares RGB's modality id (it separates by a per-token arange, not a stream id); zeroed adaLN does not make a share_mod block identity (each block adds a randn modulation); a FLUX.1 citation with no FLUX.1 source on this machine; three off-by-one line numbers.
Wrong rationale outlives wrong code.
Reference auditor re-read every cited file.
What the audit confirmed — measured, not asserted
The block is TRELLIS.2's, op for op._stream_pre+joint attention+_stream_post vs ModulatedSparseTransformerBlock._forward: max|diff| = 0.0 in float64. Modulation chunk order, which norm feeds the MLP, the rms-norm/rope placement inside QKV — all identical.
Init matchesstructured_latent_flow.py's vanilla branch item for item; initial velocity is exactly 0.
Packing round-trips bit-exact at three genuinely different per-sample lengths, with no cross-sample attention leak (verified row by row against cu_seqlens).
tag_rows is an exact rotation group: four turns return to the identity bit-exactly; each turn is a swap and/or sign flip.
Checkpointing is equivalent. Repeating the SAME configuration twice differs by 9.19e-3 relative; full-checkpoint vs no-checkpoint differs by 9.95e-3 — the same magnitude, so the gap is flash-attention's own atomicAdd backward nondeterminism, not the recompute. Forward is bit-identical.
The generalisable lesson: a test you wrote yourself, from your own idea of the contract, can only prove internal consistency. Defect 1 was green in my own harness through every run because the harness carried the same wrong number. Cross-module constants have to come from the authoritative source (config, checkpoint, or the calling code), never from the author's memory.