Skip to content

The hospital gown renders as shards on two stations, and it is the only garment 4-15x the fleet's triangle count #747

Description

@gidich

The hospital gown's surface renders as triangular shards wherever it appears — in the live ED room and
in an isolated bake capture of a different actor. It is also the only garment in the fleet whose
triangle count is an order of magnitude out of line.

MY GRADE, native resolution, no upscale

tools/openclinxr/evidence/issue-714/bodice-band-1to1.png, 1060x585, a 1:1 crop of a 4096 render of
mpfb-gown-adult-patient.glb through the model-vetting three.js path:

  • triangular sawtooth spikes running down both vertical seam lines
  • a shattered region at the sternum and upper chest
  • spikes along the shoulder and the lower hem
  • two orange-tan slivers mid-chest and one upper-left that are skin visible through the garment, so
    that region is open rather than merely faceted

#712's measurement found the same appearance in the live ed_chest_pain_priority_v1 capture, and
established what it is NOT: not skinning weights, not a bone transform, not a morph, not vertex
displacement. The mesh's current AABB sits within 1.25x of its bind AABB and the pixels land exactly
where the measured geometry is.

Measured 2026-08-28 across every shipped humanoid

asset gown/garment primitive triangles vertices
mpfb-gown-inspect ..._hospital_gown_phenotype_L0 57,073 28,852
mpfb-gown-adult-patient ..._hospital_gown_phenotype_L0 29,185 14,899
ed_chest_pain_spouse_adult open cardigan L1 7,829 4,468
ed_chest_pain_spouse_adult casual top L0 4,146 2,161
peds_anxious_parent open cardigan L1 8,009 4,506
peds_anxious_parent casual top L0 4,069 2,101
peds_fever_patient_child phenotype L0 4,883 2,565
peds_nurse_kevin scrub pocket L1 4,076 2,106
peds_nurse_kevin scrub top L0 4,170 2,158
peds_patient_child exam t-shirt L0 3,887 2,042

Every non-gown real garment falls between 3,887 and 8,009 triangles. The hospital gown carries 4x to
15x that, and it is the only one that renders as shards.

What is NOT established

That the triangle density is the cause. It is a correlation across nine primitives in seven
assets, and it is equally consistent with density being a symptom of the same fold generation that
produces the shards. CAUSE NOT DETERMINED — do not take the correlation as a mechanism.

The two obvious readings, unranked, and they may both be wrong: the fold wave
(_fold_amp686 = 0.034, _fold_k686 = 16 in automate_blender.py) subdivides the surface past what
the shell can carry; or the gown's shell is generated at a different base resolution from every other
garment and the wave merely makes the result visible.

The first measurement, before any product edit

Compare the hospital gown's surface against a garment that renders clean — peds_nurse_kevin's scrub
top at 4,170 triangles is the known-good column, same pipeline, same actor family. Report edge-length
distribution, triangle aspect ratios, normal discontinuity across adjacent faces, and boundary-edge
count for both. That says whether the gown's surface is degenerate or merely dense.

tools/openclinxr/evidence/gown-shard-mechanism-measure.ts already walks the gown asset and is the
instrument to extend rather than replace.

Do not

Report these

If any proof cannot pass as written, OR passes trivially against the ambient measured range, OR
asserts the opposite direction from the defect, say so in your first report, at the moment you find
it.

If the premise here turns out to be false, say so immediately. Never narrow or weaken a clause so that
it passes.

Report any out-of-scope wrongness you saw and are not fixing, naming the object and what is wrong. The
detached trouser waistband (#320) and the unlit room (#526) are already carded.

Write your report with the section headers IN-SCOPE:, OUT-OF-SCOPE:, CLAIM: and NOT TESTED: in
that colon form.

factory_step: clothing_consume

The RED is planted at 006bac1a

tools/openclinxr/evidence/the-hospital-gown-surface-is-as-smooth-as-a-garment-that-renders.test.ts.
Clause (1) is it.fails and reds on the real defect; three counterweights are green.

The metric is the share of interior edges whose two faces meet past 60 degrees, from GEOMETRIC face
normals derived from positions, after welding vertices by position at 5 decimal places. It is immune
to shading and to index splits at material or UV seams, and it is what "a field of triangular spikes"
means numerically. It deliberately does NOT bound the triangle count — a count is a quantity and
shards are a shape, so a count clause greens the moment the mesh is decimated while the surface stays
shredded.

Clause (1)'s threshold is measured at test time from the non-gown population rather than chosen here.
It resolves today to 3.47% against the gown's 19.32%, a 5.6x margin.

Destructive probes, all three fired and all three reverted, recorded in the plant commit:
pointing both gown subjects at clean geometry makes clause (1) pass; tightening the comparator ceiling
to 2.0% reds counterweight (3); lowering _fold_amp686 to 0.010 reds counterweight (2).

If the surface cannot be fixed inside this slice

Report the measurement and stop. That closes this card successfully.

The live: rule requires clause (1) to be flipped, and a clause you cannot honestly flip will fail
it. That is a defect in my contract, not in your work, and I will resolve it the way #714 was: the
unmet clause is relocated verbatim to a new card with an inverted guard at the origin. Do not flip
the clause to make the proof pass, and do not weaken it.

CORRECTED 2026-08-28 (second pass) — read this before the sections above

Three candidate causes are measured dead. Do not re-derive them.

candidate verdict evidence
the C0 wave corner contributes 0.65 of 16 points a phase-matched C1 cosine at the same amplitude and wave count moved the adult gown 19.32% → 18.67% and inspect 21.08% → 20.70%; gathers survived exactly
aliasing REFUTED two horizontal rings carry 315 and 197 distinct azimuth columns with phase concentration R = 0.067 and 0.034 — ~19 samples per period. torso_cols = 16 is the parametric grid, NOT the exported azimuthal count
slivers REFUTED sharp fraction against a minimum triangle area of 0 / 1e-8 / 1e-6 / 1e-5 m²: gown 19.32 / 18.01 / 16.98 / 11.58%, scrub top flat at 1.29%. At 1e-6 the gown is still 13x

The C1 attempt is preserved at branch salvage/issue-747-c1-wave (bb461d64). It is NOT landed: it
changes shipped GLB bytes for 0.65 points, changes nothing a grader can see, and raises the
near-zero-area triangle count from 483 to 2,636 on the adult gown. Read it if useful; do not assume it.

What survives, as a HYPOTHESIS and not a measurement: the wave is too deep for its wavelength. At
k = 16 on a ~2.2 m chest circumference a half period is ~69 mm, and a 34 mm excursion gives a crest
dihedral near 90 degrees — which is the measured p90 of 86–90. CAUSE STILL NOT DETERMINED. The
arithmetic fits; nothing has tested it.

Counterweight (2) was amended at 6ffa5977 because it bounded the fix out

It pinned _fold_amp686 = 0.034 AND _fold_k686 = 16 as literal equalities, so every remaining
candidate was refused by the clause meant to stop one specific cheat. That was my defect.

It now bounds the property those constants stood in for: the gather's DEPTH, as an amplitude FLOOR at
0.030 — 88% of the shipped 0.034, so a trim is allowed and a flattening is not. The wave count is
unpinned on purpose
: lowering k lengthens the wavelength and reduces the crest slope while leaving
depth untouched, which is the opposite of flattening.

Probes, all three fired and reverted: _fold_amp686 = 0.010 reds it; _fold_k686 = 8 stays green, so
the wavelength fix is legal; _fold_amp686 = 0.029 reds it.

The work is a SWEEP, and you do not pick the value

Do not choose an amplitude and a wave count and defend them. Produce a variant sweep and let the
orchestrator grade it.

Sweep _fold_k686 across at least four values spanning a real range (something like 4, 6, 8, 12) and
_fold_amp686 across at least two at or above the 0.030 floor. For each cell, rebake
mpfb-gown-adult-patient from current main and record the sharp fraction, the near-zero-area triangle
count, and the peak radial excursion into gown-vs-clean-surface.json beside the existing rows.

Then produce ONE labelled contact sheet of the rendered bodice band across the cells, native
resolution, on a TRACKED path under tools/openclinxr/evidence/issue-747/. Label every cell with its
k and amplitude. The orchestrator grades the sheet and picks the cell; you do not need clause (1) to
go green to succeed.

If no cell clears the ceiling, that is a finding and it closes the slice. Report the table and
stop. Do not chase the threshold, do not go below the amplitude floor, and do not decimate — #695 owns
decimation and clause (1) bounds a shape precisely so decimation cannot green it.

Duration is not a constraint here. A multi-hour bake sweep is acceptable and preferred over a guess.

done_when

  • run:pnpm exec vitest run tools/openclinxr/evidence/the-hospital-gown-surface-is-as-smooth-as-a-garment-that-renders.test.ts
  • live:tools/openclinxr/evidence/the-hospital-gown-surface-is-as-smooth-as-a-garment-that-renders.test.ts
  • exists:tools/openclinxr/evidence/issue-747/gown-vs-clean-surface.json

gown-vs-clean-surface.json is the pre-fix comparison, written on a TRACKED path BEFORE any product
edit — a deliverable under a gitignored path has no land path. One row per garment primitive carrying
edge-length distribution, triangle aspect ratio, the dihedral distribution, and boundary-edge count,
so the question "is the gown's surface degenerate or merely dense" is answered from data rather than
from the triangle count.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions