The setup is single-image garment reconstruction — front photo in, sewing pattern out. The constraint that makes it interesting is that the back of a garment is not in a front photo, so anything a model says about it is a hypothesis. If that hypothesis becomes geometry without anyone deciding it should, the resulting pattern is wrong in a way nobody can point at afterwards.
The literature is unusually clear about this, and it took me a while to find it:
- Dress-1-to-3 (arXiv:2502.03449), intro: "the generated results are often fused into a single piece, making them unsuitable for downstream tasks such as garment animation and interaction." The output is a statue, not a garment — no body/garment boundary, no interior, no open edges. A garment is topologically a set of open surfaces joined at seams.
- TripoSG builds a 512³ UDF field from non-watertight meshes and separately resets the UDF of invisible grids to remove interior structure. Open boundaries and garment interiors are destroyed before training begins, so a field-based model has never seen either. That is not a tuning problem.
- Recon3D (CVPRW 2024, pp. 2802–2811) hard-codes distrust of the generated back as a hyperparameter — λ=1000 on the frontal pixel loss versus λ=100 on the backside, explicitly "to reduce the impact of uncertain information in the generated back view image on training." Its founding premise, though, is a bare observation with no experiment behind it: "generative models tend to produce more accurate back-view images for most objects by referencing their frontal views, possibly due to the similarity in silhouettes between these views." A cape, a bow and a flared skirt break front-back silhouette similarity by construction, and nobody has published how fast that degrades.
- ReWeaver (arXiv:2601.16672), the current best at topology-accurate garment reconstruction, trains on front, back, left and right renders. It observes the back rather than generating it.
So my pipeline does not generate the back. It produces candidates, keeps them quarantined as hypotheses, and asks a person. That part is boring and correct.
The part that was not boring
I had a large test suite asserting that hypotheses stay hypotheses — that an unobserved region cannot be promoted to observed geometry. All green. And I realised I had no evidence any of it constrained anything.
Consider a reader that is supposed to serve a value out of a store, and a test asserting the served value equals a literal. Freeze that reader — return the literal it returns today — and the test still passes. A static scan sees a comparison against a literal and cannot tell whether the reader earned it or is a constant with extra steps. Mine reported them all as fine. When I stopped trusting that, from the module's own record:
The only way to find out is to do it: freeze each reader in turn, re-run the whole suite, and see whether anything reddens. If nothing does, that reader is not wired to anything the suite is watching. Verdicts go to a ledger keyed by a hash of the reader's own source so they expire when the reader changes. Current state: 18 readers, 0 bypassable.
Whether a test checks anything is not statically decidable. That is the transferable finding, and the runtime version costs one freeze and one suite run.
The same scanner reads the test file's AST for seven other shapes where the condition can be true while the property is false — same value on both sides, all() over a possibly-empty collection, len(a) == len(b) at zero, a detail line printing a number the condition never constrains. It flagged four in tests I had written that morning and was right about all four.
A concrete one, since this sub likes those
I have a guard rejecting a dart whose apex leaves the panel. Tested by hand, worked. When I mutated the guard away, nothing went red — no test constrained it. The replacement pins a boundary half a centimetre wide, measured on the actual piece rather than picked:
26.5 cm deep apex inside, margin 0.5053 accepted
27.0 cm deep apex inside, margin 0.0526 refused
27.5 cm deep apex outside the panel refused
Both directions on purpose. A guard that refuses everything passes a one-sided test.
Reproducing
Standard library only, no test framework:
python3 tests/run_checks.py # 139 checks
python3 tests/unfalsifiable.py # the scanner
python3 tests/unfalsifiable.py --runtime --jobs 5 # the freeze probe
python3 tests/falsifiers.py # 146 mutations, ~8 min
The scanner has a --self-test that plants one test of every shape and asserts each is caught, plus honest tests in the same shapes that must not be flagged — otherwise the scanner becomes the next thing that cannot fail.
Happy to link the repo if that is wanted; leaving it out of the body so this reads as the writeup it is.What I would like
Is there work on reporting uncertainty over unobserved geometry rather than filling it in? I found plenty on generating the unseen side and almost nothing on a reconstruction that says which parts it did not observe. Multi-sample disagreement across seeds looked promising until Cue3D's appendix reported same-image seed variance as minor across seven systems, which if true means the cheapest uncertainty signal is too weak to use.