CHARACTER_PRACTICE_GAP_AUDIT.md

npcs/CHARACTER_PRACTICE_GAP_AUDIT.md

CHARACTER PRACTICE GAP AUDIT — the seven stages, scored against the practice

CANON SUBORDINATION — PROPOSAL TIER. This document serves canon and never outranks it.
Authority order: docs/DOC_MAP.md §0. If it disagrees with canon, CANON WINS and this document is
the defect. Nothing here is applied by this doc; it ranks work and names owners.
Canon served: THE JOSH GATE (the Prologue→Ch 13 slice must render a protagonist that survives
a sighted read) and the standing work order at build/3d/best_a14/records/ROUTE_A_RESIDUALS.md
OPEN-0 — Josh's grade of the in-game A14 figure, verbatim: *"He's not anatomically correct.
This is pretty bad. His body is all disjointed and deformed. Is shoulders and arms look disgusting.
Why is this so bad."*

Written 2026-08-08. This is the AUDIT phase the five craft-research documents were commissioned

to feed. Those documents asked *what does the industry do?* This one asks the adversarial question:

**at each of the seven stages of our character chain, what do we actually do, and how far is it from

the practice?** Josh's grade is the proof that the gaps are real, so this audit is written against

our own stack, not in its defence.

Evidence register. Every claim about OUR practice is read off a landed artifact and cites the

file, and where the file is large, the field. Every claim about published practice cites a URL or a

full title and author, with its verification state marked in §1. **Nothing in this document was run

on a GPU and nothing was run in Unreal**; the measurements quoted are ones the chain already emitted,

plus four cheap re-derivations this pass performed directly on the meshes (face counts, band

histograms) which are marked [MEASURED HERE].

---

0. THE HEADLINE — five findings, and the second one reframes the whole chain

1. The generator is not the defect, and our own ladder proves it with numbers.

build/3d/eval/likeness/LIKENESS_STAGE_LADDER_A14.json scores the whole ship chain on the one

lighting-immune channel (turning_distance). A1_GENERATE is the best row on the entire ladder

— front 0.23848, back 0.29316 — and A9_ASSEMBLE, the thing that ships, is front 0.34063 and back

0.41684. The chain's net effect on likeness is **+0.1022 front, +0.1237 back, +0.0399 side, every one

of them worse.** We have spent months improving a chain whose measured job, so far, has been to

degrade the best asset it ever held.

2. And the ladder names the stage: A3_FIT. The attribution leg is not ambiguous —

DELTA_LEG.status: "ATTRIBUTED", owning_stage: "A3_FIT" on both front and back, with the

arriving delta +0.09426 against a band of 0.09381 (front) and +0.11909 against 0.09125

(back). A3_FIT is build/3d/best_a14/bounded_fit.py / build/3d/hi3dgen/fit_a14.py — free

vertices driven to scalar girth targets, with no anatomical prior anywhere in the chain. That is

Doctrine A run as the primary shape operator, which is the one configuration the published literature

does not use (ICON; ECON;

arXiv 2605.04524).

3. The anatomy bar now exists, it is RED on four legs of five, and it gates nothing.

harness/asset_factory/anatomy_bar.py (1,712 lines) landed and ran:

build/3d/best_a14/anatomy/ANATOMY_BAR_A14.json reads A_plate_proportion RED (27 reds / 12 ambers

of 45 rows), C_shoulder_girdle RED (8 of 9), B_girth_and_breadth RED, E_surface_relief RED (8

of 23), D_mass_and_distribution GREEN, overall: RED — and SIGHTED_ANSWERS: null, so by its own

_incomplete_until clause the bar is not even finished. No stage consumes it. OPEN-0 ordered an

anatomy bar to gate every capture and every photobook entry; the instrument was built and the wire

was not run.

4. The bar's numbers give Josh's sentence an anatomical diagnosis nobody had written down.

From ANATOMY_BAR_A14.json leg B:

sitemeshreferenceresidualverdict
shoulder breadth at acromion33.557 cmplate V4 36.119 / V3 36.142−7.09%RED
the same, against the ladder33.557 cmbiacromial 42.029 / soft-tissue 42.925−20.2% / −21.8%published, not scored
neck_base girth29.362 cm32.272 / 33.627−9.02%AMBER
bicep_relaxed girth30.775 cm26.691 / 25.325+15.30%RED
underbust girth78.112 cm75.160+3.93%AMBER
waist_natural girth69.748 cm68.863 / 70.589+1.29%GREEN

A narrow shoulder yoke, a thin neck, and an over-thick upper arm on the same figure. That is

precisely what "disjointed" and "shoulders and arms look disgusting" describe, and it is the exact

inverse of the failure CRAFT_ANATOMY_STANDARDS.md §3.2 predicted (a small head making shoulders

*read* broad). Our shoulders are not reading broad. They are **measurably narrow, and the arm hanging

off them is fat.** Any fix aimed at the predicted defect would have been aimed wrong.

**5. The chest — the site that caused the original damage — is STILL unmeasured, and the reason

re-ranks a sibling doc's own recommendation.** CRAFT_AI_3D_GENERATION.md calls part-restriction

(R-3) *"the highest-value single change in this document."* We now have a part-restricted instrument:

anatomy_bar restricts the chest section to R05_PELVIC_GIRDLE/R06_ABDOMEN/R07_THORAX/

R14_NECK_SEAM. It still refuses, with angular_coverage: 0.0 and the note *"the restricted

section is in 2 separate pieces at this height — a single perimeter around them is not a girth."*

Part-restriction is necessary and not sufficient: on an arms-down mesh the thorax region's own

faces are cut by the arm root, so the restricted ring is broken. **Pose canonicalisation (R-5) is

what actually closes the chest, and it outranks R-3.** That is an adversarial correction to a sibling

craft document, grounded in our own newest measurement.

---

1. SOURCES

Provenance rule for this audit. The five craft documents each ran their own citation audit on

2026-08-08 and marked every source's verification state in place. This audit **inherits those states

rather than re-asserting them**, and marks each source:

change resting on one of these says so at the point of use.

Nothing below is cited for a claim its owning document marked unverified without that being stated.

1.1 Papers — priors, fitting, measurement

CVPR 2022, arXiv 2112.09127. The "broken or disembodied limbs… non-human shapes" diagnosis and the

SMPL-X-conditioned cure. <https://arxiv.org/abs/2112.09127>

CVPR 2023, arXiv 2212.07422. The parametric model as a "canvas" for stitching surface patches.

<https://ar5iv.labs.arxiv.org/html/2212.07422>

for deep learning*, arXiv 2003.00834. Re-fetched this pass; the chest region is bounded by

skeleton joints, the axilla found by casting a ray from the shoulder joint toward "the middle left

inferior edge of the bounding box", and the circumference is the summed segment length of the

intersection polygon. <https://ar5iv.labs.arxiv.org/html/2003.00834>

Consistent Body Shapes* (A2B), CVSports@CVPR'25, arXiv 2409.17671. Measurements enter as **shape

parameters**, not displacement. <https://arxiv.org/abs/2409.17671>

arXiv 2605.04524. The three-stage order rig → joint → vertex, user-validated by 22 professional

technical artists. <https://arxiv.org/abs/2605.04524>

Prediction*, arXiv 2604.21575. Exists because scale distortion is "common" for AI-generated assets.

<https://arxiv.org/abs/2604.21575>

arXiv 2402.17214. Pose canonicalisation as a first-class stage.

<https://zjp-shadow.github.io/publications/charactergen>

models still fail on morphologies that deviate from the training prior. <https://arxiv.org/pdf/2601.06035>

Cracow, Poland*, PLOS ONE, DOI 10.1371/journal.pone.0122274. n=121 boys at 14: BMI 20.1 ± 3.0,

body fat 20.0 ± 11.6 %, the four skinfolds. <https://pmc.ncbi.nlm.nih.gov/articles/PMC4376782/>

1.2 Papers — binding, skinning, deformation

DOI 10.1145/2485895.2485919. Built for meshes that are non-manifold, non-watertight,

self-intersecting or multi-component. <https://dl.acm.org/doi/10.1145/2485895.2485919>

DOI 10.1145/344779.344862. The canonical shoulder/elbow corrective.

<https://dl.acm.org/doi/10.1145/344779.344862>

Preserving Detail*, DigiPro 2014, DOI 10.1145/2633374.2633376. Its own thesis: it lets riggers use

"simpler binds and coarser deformers". <https://dl.acm.org/doi/10.1145/2633374.2633376>

*Geometric Skinning with Approximate Dual Quaternion Blending*, ACM TOG 2008.

<https://users.cs.utah.edu/~ladislav/kavan07skinning/kavan07skinning.pdf>

course. The candy-wrapper / joint-collapse / volume-loss artifact taxonomy. <https://skinning.org/>

Deformation*, SIGGRAPH 2011. <https://igl.ethz.ch/projects/bbw/>

Inpainting*, SIGGRAPH Asia 2023 TC, DOI 10.1145/3610543.3626180.

<https://www.dgp.toronto.edu/~rinat/projects/RobustSkinWeightsTransfer/index.html>

Registration*, CVPR 2007, DOI 10.1109/CVPR.2007.383165. Paper/venue/DOI verified; the abstract

wording was not retrievable, so it is paraphrased wherever used.

(SIGGRAPH Asia 2015). <https://igl.ethz.ch/projects/instant-meshes/>

1.3 Engine, DCC and vendor manuals

pass**: the tool accepts "custom sculpts, 3D scans, AI-generated meshes, and other sources that do

not follow MetaHuman topology", and "The result is always standard MetaHuman topology in the

MetaHuman A pose."

<https://dev.epicgames.com/documentation/metahuman/metahuman-creator-from-custom-mesh-tool-in-unreal-engine>

"capped to 12" ceiling, the recommended Unlimited Bone Influences Threshold of 8, the 75-bone

mobile cap.

<https://dev.epicgames.com/documentation/unreal-engine/skeletal-mesh-rendering-paths-in-unreal-engine>

UEditorValidatorSubsystem.AddValidator, -run=DataValidation).

<https://dev.epicgames.com/documentation/unreal-engine/data-validation-in-unreal-engine>

2020.2; Update Skeleton Reference Pose; Convert Scene / Convert Scene Unit).

<https://dev.epicgames.com/documentation/en-us/unreal-engine/fbx-import-options-reference-in-unreal-engine>

one virtual texture asset; vertical flip on import; Tile Border default 4).

<https://dev.epicgames.com/documentation/en-us/unreal-engine/streaming-virtual-texturing-in-unreal-engine>

distance"; Dual Specular for "subpixel micro frequencies"; Metallic unavailable).

<https://dev.epicgames.com/documentation/en-us/unreal-engine/subsurface-profile-shading-model-in-unreal-engine>

specular 0.5 modulated; the lacrimal/caruncle/eyelid-occlusion meshes).

<https://dev.epicgames.com/documentation/en-us/unreal-engine/digital-humans?application_version=4.27>

Framework*. <https://docs.unrealengine.com/5.2/en-US/pose-driver-in-unreal-engine/>

Quaternion / Weight Blended) and *Geodesic Voxel binding* (joints inside the volume; normals

outward). <https://help.autodesk.com/cloudhelp/2022/ENU/Maya-CharacterAnimation/files/GUID-CF2C698A-44BB-4CA0-BCB9-DB36500DA812.htm>

Weight, Inward/Outward constraints).

<https://help.autodesk.com/cloudhelp/2027/ENU/Maya-Modeling/files/GUID-A66E942B-D757-42FF-A36B-F366E31047C2.htm>

returned 403 to the owning doc's audit, so the parameter list is unverified and must be read off

the DCC before a script depends on it.

<https://docs.blender.org/manual/en/latest/modeling/modifiers/deform/corrective_smooth.html>

"converts the non-seamless character into a solid statue"). <https://www.mesh-online.net/voxel.html>

Baking Tutorial* (padding auto-scales to output resolution; "extreme" fill for finals).

<https://helpx.adobe.com/substance-3d-painter/technical-support/workflow-issues/export-issues/texture-dilation-or-padding.html> ·

<https://marmoset.co/posts/toolbag-baking-tutorial/>

tiers 50k/18k/8k/4k and raw tiers 500k/150k/20k/2k).

<https://developer.hyper3d.ai/api-specification/rodin-generation-gen2_reset_v.md>

1.4 Licences read for the parametric-prior ruling

Re-fetched this pass: "Apache 2.0 license" with "no registration or gated downloads"; covers

"the full human lifespan – from infants to the elderly"; built from "anthropometric and statistical

data (MakeHuman, WHO), without using scans"; ships "precise mappings to and from SMPL-X and

HumGen3D". *(The page carries no licence statement for the topology variants or those mappings —

the sibling doc's warning that the optional smplx topology variant is non-commercial is NOT

confirmed on this page and must be read off the repository before selection.)*

<https://europe.naverlabs.com/blog/anny-a-free-to-use-3d-human-parametric-model-for-all-ages/>

sibling documents did not record: alongside "Any other use, in particular any use for commercial

purposes, is prohibited. This includes, without limitation, incorporation in a commercial product…"

the page also states **"This license also prohibits the use of the Software to train

methods/algorithms/neural networks/etc. for commercial use of any kind."** The commercial route is

named on the same page — "also available for commercial licensing through Meshcapade.com" and the

contact smpl@max-planck-innovation.de. <https://smpl.is.tue.mpg.de/modellicense.html>

online platforms have been shut down"; its licensing page 403s. So the commercial *route* is

verified and its *terms are unknown*. <https://meshcapade.com/>

permitted; every earlier FLAME remains non-commercial.

<https://flame.is.tue.mpg.de/modellicense.html>

1.5 Practitioner material, playbooks and talks

first, muscles by origin/insertion/surface effect). <https://www.scott-eaton.com/anatomy-for-artists>

· reference library <https://www.bodiesinmotion.photo/>

Proportions Calculator* (the construction order; the age HU ladder; the 60/40 vault-to-face).

<https://anatomy4sculptors.com/blog/forming-the-head-simple-to-complex/> ·

<https://anatomy4sculptors.com/blog/about-human-proportions-calculator/>

"Primary>Secondary>Tertiary"; Marshall Vandruff's "work small to fix big problems and work big to

fix small problems". <https://80.lv/articles/001agt-studying-organic-character-art-anatomy-skin>

three-gate review protocol (blockout / high-poly / final-bake) and the three test distances

(5 m / 15 m / 50–100 m) with five canonical poses at the recognition threshold. **A practitioner

blog, not a first-party studio document** — adopted on merit, never quoted as an industry standard.

<https://nastyrodent.com/stylized-3d-characters-art-direction-principles/>

of a working character validator, including "no overlapping vertices", bind-pose identity, joint

labelling and symmetry. <https://zewt.github.io/zMayaTools/tool-character-validation.html>

deforming-joint names; all GEO must be skinned).

<https://help.wonderdynamics.com/character-validation-messages/maya-specific-messages/character-rig-validation/>

<https://github.com/Allar/ue5-style-guide>

between the elbow and wrist"; "full rotation at each joint should produce natural deformation, not

collapse or intersect"; "The best stress test for any rig is applying motion capture data."

<https://mocaponline.com/blogs/mocap-news/character-rigging-game-dev-guide>

Setups*. <https://www.3dfiggins.com/writeups/forearmTwist/> · <https://www.3dfiggins.com/writeups/corrective/>

your Deformations* (RBF as "the big daddy… an industry standard"; 4 joints/vertex AAA norm,

pushable to 8).

<https://sol-g-brennan.medium.com/rigging-tips-methods-for-extra-character-deformation-in-game-dev-e4c0e89e7b00>

(3–5 loops minimum at the knee; hero tier 6–8 at the elbow; asymmetric density about the bend;

poles off the bend). <https://cgtyphoon.com/topology/human-knee-topology/> ·

<https://cgtyphoon.com/topology/elbow-topology-explained-for-character-modeling/>

exactly what animation needs"; "Uneven polygon density gives you lumpy deformations at joints when

a character bends"; eye/mouth loop placement attributed to *manual* retopology.

<https://www.meshy.ai/tutorials/ai-retopology-guide>

models become increasingly prevalent in the industry". <https://faceform.com/wraporiginal/> ·

<https://magazine.reallusion.com/2026/04/08/reallusion-announces-2026-vision-redefining-3d-production-through-the-power-of-hybrid-ai/>

objects; the chart is an exposure/white-balance check, not a colour-correction tool).

<https://caveacademy.com/wiki/onset-production/data-acquisition/data-acquisition-training/the-grey-the-chrome-and-the-macbeth-chart/>

convention. <https://minecraft.wiki/w/Missing_textures_and_models>

2010) and *Building Champions: Character Art Pipeline for 'Rumbleverse'*, Kosanovich (Iron Galaxy,

GDC 2023). **Verified to exist; neither talk was watched, and no claim in this audit is sourced to

either.** <https://gdcvault.com/play/1012552/Uncharted-2-Character-Pipeline-An> ·

<https://www.gdcvault.com/play/1028733/Building-Champions-Character-Art-Pipeline>

1.6 The five craft documents this audit consumes

docs/pipeline_review/tech_research/CRAFT_ANATOMY_STANDARDS.md ·

CRAFT_TOPOLOGY_DEFORMATION.md · CRAFT_AI_3D_GENERATION.md ·

CRAFT_TEXTURE_LOOKDEV_GROOM.md · CRAFT_RIGGING_PIPELINE.md. Their sibling dossiers

PIPE_CHARACTER_MODELS_2026-08-06.md and PIPE_3D_2026-07-29.md are the incumbent routing law.

---

2. THE PER-STAGE AUDIT

2.1 The table

StageExpert practiceOur practiceVerdictAdopted change (source)
generateParametric body as conditioning + completion prior; canonical T/A pose emitted; part separation; skeletal/volumetric control channel beyond the imageTripoSG single-image, no prior at any stage; arms against the flanks; one fused implicit shell; 0 quadsNOT the likeness defect (best row on the ladder) / DEFECT of classAdd a fitted parametric body as prior + canonicalise pose before anything measures the mesh (ICON; CharacterGen; Rodin TAPose)
fitrig → joint → vertex; anthropometry as shape parameters; free vertices only as a bounded detail passbounded_fit.py / fit_a14.py = free vertices to scalar girths, as the primary operator; chest read 110.85 cm against an 81.93 targetDEFECT — the largest measured one, A3_FIT ATTRIBUTED as the look-loss stageDemote free-vertex fit; solve in parameter space; part-restrict + canonicalise before measuring (arXiv 2605.04524; A2B; CALVIS)
partition / UVQuads at deforming zones, 6–8 placed loops at hero elbow/knee, poles off the bend; conform an authored topology onto the generated shape; UDIM set = one VT assetShip mesh 86,375 v / 172,398 tris / 0 quads / 0 ngons [MEASURED HERE]; 15 region slots; quad branch exists and is unconsumed; UDIM imported as N Texture2DDEFECT, structural — no weighting method recovers itConform a loop-correct base (MetaHuman From Custom Mesh, verified: AI meshes in, standard topology out); import the UDIM set as one VT asset (Epic SVT)
bake / texturePadding is a bake-time invariant scaled to resolution; source sufficiency is a precondition; Subsurface Profile + dual-lobe specular + micro-normal + cavity; measured px/mTile 1001 observed 0.45579 with 1,218,640 of 2,239,277 covered texels nearest-valid filled (54.4 % invented); tile 1002 observed 0.48878, 51.1 % filled; worst region palette delta 136 sRGB8 (R11_FOREARM); de-light ran (1.09 stops, 1291×); no material sets a shading model; MAP_ROLES is 3 wideDEFECT — half the shipped albedo is invented and the bake publishes anywaySource-sufficiency refusal per region; padding into the bake; Subsurface Profile + dual lobe (Substance/Marmoset; Epic Subsurface Profile + Digital Humans)
rig / skinGeodesic voxel binding; primary joints carry flexion and twists distribute roll; PSD correctives; a smoothing filter; declared influence contract; ROM exercises the failure axis and is scoredgeodesic_bounded_inverse_distance; bone heat solved 0.0000 of vertices; upperarm_l/r, thigh_l/r, spine_05 at max_weight 0.0; all shoulder weight on upperarm_twist_01_l (0.961, 8,262 v); clavicle_l 0.236 on 2,232 v past the midline; no corrective, no smoothing, no DQS; ROM has zero roll poses; ROM_RESULT scores only verts_movedDEFECT on five axes, with one real repair banked (leg bleed 0.33 → 0.0000; clavicle 0.9257 → 0.2364)Weight the primary joints first, then a true voxel-geodesic bind, then Corrective Smooth baked, then PSD correctives; arm the ROM (Dionne & de Lasa; Figgins/MoCap Online; Delta Mush; Lewis PSD; Kavan course)
importInfluence + unit contracts declared at bind, export and import; never write the shared skeleton ref pose; FBX 2020.2 pinned; validation runs on save and in CI172,464 tris / 122,555 v / 1 LOD / 89 bones / max_bone_influences 8; binder defaults 4, bl_skin_rebuilt_to_shipped defaults 8, shipped 8 — nothing asserts; V2.1 manifest turned max_influences from a field into prose; update_skeleton_reference_pose FALSE (correct); run_gates.py has zero rig/skin/FBX checksPART WIN, PART DEFECT — the scale proof and the material-substitution tooth are genuine; the contract layer is absentDeclare the contracts as machine-readable fields; register a UEditorValidatorBase validator (Epic Data Validation; zMayaTools; Allar)
captureBlack-silhouette recognition at three distances × five poses; two-rotation turntable; calibration objects every frame; review at ship LOD in engine; publication disciplinesilhouette_overlay.py = one framing; LOOKDEV_STANDARD §4 = environments × 8 views, subject turns, rig fixed (better specified than most) but no HDRI-rotation axis; photobook landed and NOT cleared to publish; anatomy_bar RED on 4 legs of 5 and consumed by nothingDEFECT of wiring, not of instrumentsMake anatomy_bar RED a hard refusal on capture and publish; add the second rotation axis and the three-distance/five-pose silhouette test (§5 protocol; CAVE Academy)

2.2 GENERATE — the stage we have been blaming, and the ladder exonerates it

Expert practice is unanimous that a generative process free to invent surface needs a parametric

human present to say what a body is — ICON's abstract names our exact symptom ("broken or disembodied

limbs, missing details, or non-human shapes") and prescribes SMPL-X conditioning; ECON treats the

parametric body as the canvas. Rodin ships a TAPose flag *for humanoids* because pose

canonicalisation is a production prerequisite, and CharacterGen exists entirely to solve it.

Our practice runs none of it. And yet: **A1_GENERATE scores 0.23848 front and 0.29316 back on

turning distance — the best rows on a 63-stage ladder across three arms.** A2_CLEAN is identical to

eight decimals, which is a genuinely good precedent (a cleanup that proves it is free). The whole

+0.10 to +0.12 loss arrives downstream.

Adversarial reading. This is the most uncomfortable finding in the audit, because the lane's

instinct after Josh's grade was to reach for a better generator — and

POSTMORTEM_LIKENESS_2026-08-08.md FORK 1 proposes exactly that, at $20–40 plus an IP-out of

unreleased protagonist plates. **The ladder says the money would buy nothing we are currently able to

keep.** A better mesh feeds the same assembly, and the assembly is where the loss is. That is the

postmortem's own strongest objection, and our own measurement now confirms it rather than balancing

it.

2.3 FIT — Doctrine A as the primary operator, and the attribution that names it

The literature's stage order is rig → joint → vertex (arXiv 2605.04524, user-validated by 22

professional technical artists), with anthropometry entering as shape parameters (A2B) so that a

35 %-oversized chest on a 14-year-old is not representable. Free-vertex displacement appears in the

published pipelines only as a final detail-transfer layer.

Ours inverts it. bounded_fit.py's own docstring records the shipped A3_FIT run measuring a chest

of 110.85 cm against an 81.93 cm target (+35.3 %) from "1 axis-spanning cluster", and its verdict

on the consequence: *"Driving that loop to 81.93 cm does not slim a chest; it squeezes a torso and

two arms together by a quarter, and the silhouette pays."*

And the silhouette did pay, by a measured amount. LIKENESS_STAGE_LADDER_A14.json:

viewA1_GENERATEA3_FITarriving deltadelta bandattribution
front0.238480.33274+0.094260.09381ATTRIBUTED → A3_FIT
back0.293160.41225+0.119090.09125ATTRIBUTED → A3_FIT
side0.611990.62952+0.017530.06838CLEAN

Adversarial reading. bounded_fit.py is genuinely well-built — per-site attribution, a greedy

accumulation gated on a mutation-proven sensitivity floor, a published alpha ladder, a confound

control on every rejection. It is an excellent instance of the wrong stage position, and its own

record's conclusion ("accept almost nothing") is the correct answer to the wrong question. The lane

should take no comfort from the quality of the engineering: **the ladder attributes the single

largest likeness loss in the chain to it, on two views of three, with the band derived rather than

typed.**

2.4 PARTITION / UV — 0 quads, and a quad branch nobody consumed

CGTyphoon's hero-tier budget is 6–8 concentric loops at the elbow, 3–5 minimum at the knee, with

density asymmetric about the bend and poles moved off it; Meshy states the mechanism ("when an elbow

bends, well-placed quad loops compress and stretch predictably") and attributes the placement a face

needs to *manual* retopology. The industrial answer to a generated mesh is not to demand loop-correct

input — it is to conform an authored topology onto the generated shape, which Epic documents

verbatim for AI-generated meshes and which Faceform Wrap and Reallusion CC Wrap sell as products.

[MEASURED HERE], directly on the ship path:

meshvertstrisquadsngons
build/3d/best_a14/uv_ap/A14_PARTITIONED.obj (ships)86,375172,39800
build/3d/best_a14/uv/A14_PARTITIONED.obj83,714167,46800
build/3d/finish_a14/retopo/FINAL_A14_V3B.obj151,928303,86000
build/3d/finish_a14/retopo/QUAD_A14_V3B.obj (not shipped)10,7493010,530125

Rules A1–A5 of CRAFT_TOPOLOGY_DEFORMATION.md are violated outright and A2–A5 vacuously — there are

no concentric loops at the knee, elbow or shoulder because there are no loops at all. And the honest

caveat the audit must carry forward: promoting the quad branch would not fix it either. It is a

field-based automatic remesh, which yields isotropic quads — quads everywhere, loops nowhere in

particular. The gap is two-layered.

2.5 BAKE / TEXTURE — 54 % of the shipped albedo is invented

build/3d/best_a14/texture_ap/BASECOLOR_BAKE_A14.json:

tilefacestexels coveredobserved fractionnearest-valid filledinvented share
1001 (body)139,2162,239,2770.455791,218,64054.4 %
1002 (head)17,3102,847,5500.488781,455,72151.1 %
1003 (garment)15,8722,718,0751.00 %

And the region palette check, which is the instrument that should have caught it:

worst_max_abs_channel_delta 136.0 on R11_FOREARM — baked sRGB8 [177,122,85] against a plate

mean of [41,40,43] at observed_fraction 0.5854, with R12_WRIST at 128.0. **Median across all

regions is 5.15**, which is genuinely good, and it is exactly why a median hides this: two regions

are more than half a channel range away from their own source and the summary statistic reads fine.

The de-light stage is a real win and should be said so: DELIGHT.1001.json reports a directional

reduction of 1.0923 stops, ratio 1291.6×, gain_clamped_fraction 0.0, with its own limits

declared in the record. That is the practice, done properly.

Adversarial reading. The bake publishes an observed_fraction and then fills the unobserved half

with nearest-valid colour and ships it under the same filename. Nothing refuses. bake_plates.py's

own comment diagnosed the resolution problem in prose before the postmortem did, and the number that

would let a gate act on it is still not a field any gate reads.

2.6 RIG / SKIN — the primary limb joints hold zero weight

build/3d/best_a14/rig/v21/CENSUS_V21_BARE3.json reads upperarm_l, upperarm_r, thigh_l,

thigh_r and spine_05 at verts_over_bar = 0 and max_weight = 0.0. All shoulder-region weight

sits on upperarm_twist_01_l (max 0.961 over 8,262 verts) and upperarm_twist_02_l (0.487); all hip

weight on thigh_twist_01_l (max 1.0 over 11,634 verts). On the UE5 Manny skeleton the twist bones

are partial-rotation children driven by the animation blueprint's twist correction — so **the deltoid

and the glute are currently deformed by a correction channel rather than by the joint whose rotation

the animation authors.** Figgins, Brennan and MoCap Online all state the inverse: twists *supplement*

the primary joint and distribute roll; the primary holds the majority weight in its own zone.

Alongside that: bone_heat_weighted_fraction = 0.0 (the mesh heat diffusion refuses entirely — the

exact case Dionne & de Lasa built geodesic voxel binding for); no PSD corrective, no shape-key

driver, no RBF helper anywhere under build/3d/best_a14/rig; no Delta Mush and no Corrective Smooth

in bl_skin_to_mannequin_BOUNDED.py, bl_unpose_and_export.py or prep_assembly.py; and

bl_rom_render.py's nine poses contain not one limb roll, so candy-wrapper — a twist artifact —

is untestable by the battery built to find it, on a rig whose twist bones carry nearly all the limb

weight.

The honest counterweight, because the V2.1 pass earned it. The segment-direction repair is real

and measured: every leg bone went from bleeding across the midline to exactly zero

(thigh_twist_01_l 0.5082 → 0.0000, calf_l 0.3284 → 0.0000, foot_l 0.2122 → 0.0000), and

clavicle_l fell from 0.9257 on 4,836 verts to 0.2364 on 2,232. The skeleton was deliberately not

touched. That is good work. It is also, per OPEN-0's own framing, preservation — it proves the

rig no longer destroys the mesh it was given, and says nothing about the mesh.

2.7 IMPORT — two real wins and an undeclared contract

The wins are worth naming precisely because this audit is otherwise unkind. The scale check is the

right *kind* of instrument (measured geometry bounds, 151.1438 against 151.1438 to four decimals),

update_skeleton_reference_pose is held FALSE against a shared skeleton, and the

material-substitution tooth in capture_char_0001_a14.py::scan_material_substitution carries the

engine's own reason line so that a grey character can no longer be reported green — that last one is

the loud-failure doctrine, implemented, before this research existed.

The defect is the contract. Three files carry two different influence defaults (BOUNDED 4,

ADAPTED 4, bl_skin_rebuilt_to_shipped 8), the shipped run recorded 8, the engine read 8, and

nothing asserts any of it. CHAR_0001_A14_V21_IMPORT_MANIFEST.json downgraded max_influences from

a structured field to a prose sentence across a schema revision that declared itself the same

version. No record states the FBX unit scale factor as written, or the four UE import toggles used.

run_gates.py contains zero rig, skin, FBX or skeletal checks. Nothing derives from

UEditorValidatorBase, so there is no validation on asset save and no -run=DataValidation CI pass.

2.8 CAPTURE — the newest stage, the right instrument, and no wire

anatomy_bar.py is the stage this whole exercise was for, and it does what OPEN-0 ordered: it scores

the SUBJECT rather than the transform, it takes the plate as the higher authority and publishes the

disagreement with the ladder rather than averaging it, it refuses sites it cannot honestly read, and

it declares itself INCOMPLETE while its sighted rubric is unanswered. It returns RED.

And nothing consumes it. No capture refuses on it, no photobook entry carries it, and

SIGHTED_ANSWERS is null. Meanwhile PHOTOBOOK_A14_V21_RECORD.json (six subjects, 36 frames) sits

landed-but-not-cleared, correctly, under OPEN-0.

Two adversarial findings on our own newest instrument, which are the sharpest in this audit:

generations' own disagreement at this same rung, floored at PROPORTION_FLOOR_FRAC". [MEASURED

HERE] across all 45 rows: 44 of 45 bands are exactly 0.02 — the floor — and the maximum

plate-generation disagreement anywhere on the leg is 0.02074. The derivation is technically honest

and operationally hollow: the floor decides 44 of 45 verdicts, so leg A is being scored against

a 2 % constant while the record describes it as derived. CRAFT_ANATOMY_STANDARDS.md R-7 condemns

exactly this class ("an acceptance band typed from taste is the same defect as a claim without a

citation") and its GAP-1 documents the same pattern at another site. We repeated it at a new one.

did not close it; the section is in two pieces because the arms hang against the flanks.

---

3. THE PARAMETRIC-PRIOR RULING — does an SMPL-X-class model become a fit bound?

YES — as a BOUND, never as a TARGET; and the model is Anny, not SMPL-X. Stated as a ruling

because it is a delegated engineering call inside a locked vision, with the path shown.

3.1 Why a prior at all

The evidence is not the literature's, it is ours. A3_FIT is the attributed look-loss stage on two

views (§2.3), it produced a 110.85 cm chest reading on a figure targeted at 81.93 cm, and the

operator that did it has nothing in it that knows what a body is. A parametric shape space **cannot

represent** a 35 %-oversized chest on a 14-year-old, so driving a measurement through it is safe by

construction; driving the same measurement through free vertices is safe only if the measurement is

right, and ours was not. ICON and ECON are the field's statement of the same thing.

3.2 Why NOT SMPL-X

Three reasons, in order of force.

1. The shape space is adult. Every off-the-shelf fitter (SMPLify-X, OmniFit) targets an

adult-trained PCA basis. Fitting a 14-year-old through it finds the nearest adult and pushes the

residual — short limbs, narrow shoulders, a large cranial fraction — into whatever free-form layer

sits on top. That is our current failure with a longer chain of custody. arXiv 2601.06035

measures the concern's shape on a strong 2026 model: it "struggles to reconstruct detailed

anthropometric deviations", and an adolescent is such a deviation from an adult prior.

2. The licence is a price with unknown terms, and it carries a clause we had not recorded. [RV]

this pass, the SMPL model licence prohibits commercial use *and* "prohibits the use of the Software

to train methods/algorithms/neural networks/etc. for commercial use of any kind." The commercial

route is real (smpl@max-planck-innovation.de), so the correct read is **licence-PAID, not

licence-dead** — the sibling PIPE dossier's "licence-dead for us" remains an over-conservative read

and its in-place correction is still owed. But Meshcapade, the named sublicensor, is now part of

Epic and its platforms are shut down, so the terms are genuinely unknown. **We would be buying an

adult prior for a child character at an unquoted price.**

3. We do not need it. [RV] this pass: Anny is Apache-2.0 with "no registration or gated

downloads", covers "the full human lifespan – from infants to the elderly", and is built from

"anthropometric and statistical data (MakeHuman, WHO), without using scans" — and it publishes

"precise mappings to and from SMPL-X", so the SMPL-X-targeting method literature remains reachable

without the SMPL-X licence. *Caveat recorded honestly: the Anny page carries no licence statement

for its topology variants or those mappings. The sibling doc's warning that the optional smplx

topology variant is non-commercial is not confirmed on that page and must be read off the

repository before any variant is selected.*

The counterweight the survey already carries, and this audit does not soften: Anny's base is an

artist mesh in the MakeHuman lineage, not a photogrammetric scan mesh. If scan-derived surface is

what makes skin read real, the child requirement and the photoreal requirement pull opposite ways.

That is a bake-off, not a reading, and it remains owed.

3.3 Why a BOUND and not a TARGET — the plate outranks the prior

This is the part a naive adoption would get wrong, and our own bar caught it.

ANATOMY_BAR_A14.json :: PLATE_VS_LADDER_DISAGREEMENTS records the plate-derived shoulder breadth at

the acromion as 36.119 cm against the ladder's 42.925 cm (across_shoulder_soft_tissue) and

42.029 cm (biacromial_breadth) — −15.9 % and −14.1 % — and rules THE PLATE WINS, because

the plate is Josh's graded exemplar of *this* subject and the ladder is a population derivation.

**A population prior driven to the ladder would widen this boy's shoulders by twenty percent away

from Josh's own plate.** So the contract is:

monotone age series, no proportion outside a human envelope.

possible, is *this* character.

anatomy_bar already implements and the rule thousand_point_eval's two-spec banding (GAP-1)

violates.

3.4 The concrete form

Anny solved to the plate-derived proportions as shape parameters (A2B pattern), posed

canonically, with TripoSG's high-frequency surface transferred on top as displacement, and

bounded_fit.py's alpha ladder repurposed to control that transfer's strength rather than a

girth drive. This keeps every strength of the current arm — the generator's detail (the ladder's best

row), the armed lens, the sensitivity-floor stop, the per-site attribution — and removes the one

property that makes a deformed body possible.

---

4. THE ONE GENUINE FORK — 36 cm or 42 cm at the acromion?

Surfaced with options and a recommendation, per the standing decision protocol; not as a bare

question.

The fact. The mesh measures 33.557 cm. Josh's graded V4 plate measures 36.119 cm (V3: 36.142 —

the two generations agree to 0.06 %). The anthropometric ladder says 42.029 cm biacromial for a

166.72 cm fourteen-year-old male. The mesh is short against both, by 7.1 % against the plate and

20.2 % against the ladder. **Whether the shoulder fix widens the mesh by 7 % or by 20 % is not a

tuning choice — it is a canon-adjacent question about who this character is**, and it changes every

downstream number in the girdle.

*For*: Josh authored the exemplar and graded it; the two plate generations agree closely; the bar

already rules this way. *Against*: it locks in a boy who is 14 % narrower at the shoulder than

measured fourteen-year-olds, and Josh's grade said the shoulders look wrong — if the plate itself

is narrow, we would be reproducing the complaint faithfully.

it is what an audience's eye is calibrated on. *Against*: it overrides Josh's own graded plate on

an identity-bearing silhouette, which is not the loop's call to make silently.

acromion height; the ladder figure is a beam-calliper skeletal span. Trap 2 of

CRAFT_ANATOMY_STANDARDS.md §2 is exactly this class of error, and a 14 % gap is the right

magnitude for a convention mismatch rather than a disagreement about the subject.

RECOMMENDATION: C, then A. Reconcile the two rulers before moving a vertex — establish whether

the plate's silhouette span at acromion height is measuring the same quantity as biacromial breadth,

and publish the answer as a convention field on both numbers (this is R-1 of the anatomy craft doc,

applied). If they are the same quantity and the gap survives, **the plate governs the identity and

the ladder governs the envelope**: widen to the plate, and let the prior's bound stop the figure from

leaving the human envelope in the process.

Strongest objection to the recommendation: the reconciliation is owed work with no owner and a

history of sliding, and meanwhile the shoulder Josh named stays wrong. If C stalls for more than one

sitting, take A on the plate and record the ladder residual on the face of the record — a figure that

matches Josh's exemplar is never the wrong answer to Josh's grade.

---

5. WHERE WE ARE AHEAD OF THE PUBLISHED PRACTICE

Recorded so the audit is honest in both directions, and because these are the assets the ten changes

should be built *on*.

edge with a hard-0 seed, on the argument that such an edge is a tear no field can soften. The first

run scored 137 such edges at the armpit and tore there. No equivalent was found in BBW, geodesic

voxel binding or the weight-inpainting paper — they sidestep the problem by construction rather than

checking for it. This is a genuine house contribution and it is armed only on the arm fields.

REFUSED rows, section_probe's positive control, and the ladder's CANNOT_GATE clause all

decline to answer rather than answering wrongly. Most published validators do not have this

posture.

footnote. That is better discipline than the two-spec banding it sits beside.

is stronger than any validator in §1.5.

incident, before this research named the doctrine.

---

6. THE TEN CHANGES THE CHARACTER CHAIN MUST CARRY

Ranked by measured consequence against Josh's grade, not by ease. Each names its owning file, its

evidence, and its source.

1 — Put a parametric body prior in the chain as a BOUND, and demote the free-vertex fit to a bounded detail pass

Owner: build/3d/best_a14/bounded_fit.py, build/3d/hi3dgen/fit_a14.py, plus a new Anny solve

stage. Evidence: LIKENESS_STAGE_LADDER_A14.json attributes the chain's largest likeness loss to

A3_FIT on front (+0.09426 vs band 0.09381) and back (+0.11909 vs 0.09125); bounded_fit.py's own

record of a 110.85 cm chest against an 81.93 cm target. Source: ICON ·

ECON · A2B ·

arXiv 2605.04524 ·

Anny, Apache-2.0.

The bound-not-target contract is §3.3 and is not optional — a prior driven to the ladder would

widen this boy 20 % away from Josh's plate.

2 — Canonicalise the pose before anything measures or fits the mesh

Owner: the whole build/3d/finish_a14/ chain; build/3d/hi3dgen/run_a14_arms.py.

Evidence: the chest is refused by *three independent instruments* — fit_a14's confound control,

thousand_point_eval L01, and now the part-restricted anatomy_bar leg B (angular_coverage: 0.0,

"the restricted section is in 2 separate pieces at this height"). Part-restriction alone did not

close it. Source: CharacterGen ·

Rodin TAPose.

This re-ranks CRAFT_AI_3D_GENERATION.md R-5 above its own R-3 — that document called

part-restriction its highest-value change; our measurement says pose canonicalisation is.

3 — Weight the primary limb joints; they currently hold zero

Owner: build/3d/best_a14/rig/bl_skin_to_mannequin_BOUNDED.py. Evidence:

CENSUS_V21_BARE3.jsonupperarm_l/r, thigh_l/r, spine_05 at max_weight 0.0, with all

shoulder weight on upperarm_twist_01_l (0.961, 8,262 verts) and all hip weight on

thigh_twist_01_l (1.0, 11,634 verts). Source: [Figgins, forearm

twist](https://www.3dfiggins.com/writeups/forearmTwist/) ·

MoCap Online ·

Brennan.

**No corrective, filter or algebra change matters while the joints the animation rotates are not

attached to the skin** — and Josh named the shoulders.

4 — Wire anatomy_bar as a hard refusal on capture and publish, and answer its sighted rubric

Owner: harness/asset_factory/anatomy_bar.pyGAME:Tools/char/capture_char_0001_a14.py and

the photobook emitter. Evidence: ANATOMY_BAR_A14.json overall: RED, four legs of five red,

SIGHTED_ANSWERS: null, consumed by nothing. Source: OPEN-0's own work order, which specified

that the bar "gates every capture and every photobook entry BEFORE Josh's eyes"; publication

discipline ruled as RC6 in POSTMORTEM_LIKENESS_2026-08-08.md. **An instrument that is red and

unwired is the same defect as no instrument.**

5 — Re-derive the bar's own acceptance bands from a population SD, not from our own files' floor

Owner: harness/asset_factory/anatomy_bar.py leg A; harness/asset_factory/thousand_point_eval.py.

Evidence [MEASURED HERE]: 44 of 45 leg-A rows carry acceptance_band_frac exactly 0.02 — the

floor — with a maximum plate-generation disagreement of 0.02074, so the stated derivation decides one

verdict in forty-five. The sibling defect is worse: thousand_point_eval bands biiliac_breadth at

20.2 % and biacromial_breadth at 12.7 % because the band is the disagreement between

BODY_AGE_14.json and its _RESEARCH twin. Source: CRAFT_ANATOMY_STANDARDS.md R-7 and GAP-1;

population SDs published by Klimek-Piotrowska et al.

(BMI 20.1 ± 3.0, body fat 20.0 ± 11.6 %). **A mesh that may be 20 % wrong at the hips and score inside

band is a sufficient mechanism, on its own, for "shipped past every gate."**

6 — Conform an authored, loop-correct topology onto the generated shape

Owner: a retopology/conform stage that does not exist; build/3d/finish_a14/retopo/.

Evidence [MEASURED HERE]: the ship mesh is 172,398 triangles and zero quads; the quad branch

QUAD_A14_V3B.obj (10,530 quads) exists on disk and is not consumed — and would not satisfy the loop

rules anyway, being a field-based isotropic remesh. Source: [Epic, MetaHuman Creator From Custom

Mesh](https://dev.epicgames.com/documentation/metahuman/metahuman-creator-from-custom-mesh-tool-in-unreal-engine)

([RV]: accepts "custom sculpts, 3D scans, AI-generated meshes"; "The result is always standard

MetaHuman topology in the MetaHuman A pose") · [CGTyphoon elbow/knee loop

budgets](https://cgtyphoon.com/topology/elbow-topology-explained-for-character-modeling/) ·

Meshy · [Faceform

Wrap](https://faceform.com/wraporiginal/) · Amberg et al., CVPR 2007. **This is a pipeline-shape

decision above any single lane's authority and belongs in the character-model PIPE dossier.**

7 — Refuse the bake on source insufficiency, and move dilation into the bake

Owner: build/3d/finish_a14/bake_plates.py; harness/asset_factory/uv_pack_options.py.

Evidence: tile 1001 fills 1,218,640 of 2,239,277 covered texels (54.4 %) by nearest-valid and

publishes; R11_FOREARM is 136 sRGB8 off its own plate at observed_fraction 0.5854 while the

median reads 5.15; bake_plates.py writes only inside cover, leaving everything outside an island

black, with dilation downstream behind a --pad flag whose default is 0. Source: [Substance,

texture dilation](https://helpx.adobe.com/substance-3d-painter/technical-support/workflow-issues/export-issues/texture-dilation-or-padding.html) ·

Marmoset baking tutorial · [Epic

SVT](https://dev.epicgames.com/documentation/en-us/unreal-engine/streaming-virtual-texturing-in-unreal-engine)

(a UDIM set imports as one VT asset — the neck-ring discontinuity is the predicted symptom of

importing four).

8 — Add a smoothing filter and PSD correctives at shoulder, elbow, hip and knee

Owner: a deformation stage between rig/ and characters/. Evidence: no corrective, no

shape-key driver, no RBF helper and no smoothing filter exists anywhere under

build/3d/best_a14/rig; ROUTE_A_RESIDUALS.md OPEN-2 still carries the armpit-to-flank fold

collapse at 55° abduction, which no weight redistribution can fix. Source: [Delta Mush, DigiPro

2014](https://dl.acm.org/doi/10.1145/2633374.2633376) — its published purpose is to make bad

deformations good, which is precisely our situation · [Lewis, Cordner & Fong, SIGGRAPH

2000](https://dl.acm.org/doi/10.1145/344779.344862) · [UE Pose

Driver](https://docs.unrealengine.com/5.2/en-US/pose-driver-in-unreal-engine/). **Our ROM set already

defines the poses to sculpt at**, so the corrective programme is scoped by an artifact we own.

9 — Arm the ROM: add the roll axes and give ROM_RESULT a real deformation score

Owner: build/3d/best_a14/rig/bl_rom_render.py. Evidence: none of the nine poses rolls a

limb about its own axis (09_wrist_both is a flexion; 08_spine_twist twists the spine), so

candy-wrapper is untestable — on a rig whose twist bones carry nearly all limb weight (change 3).

ROM_RESULT.json records only verts_moved, verts_moved_frac and max_displacement_over_stature

— quantities that measure that a pose moved something, not that it moved it well — and nothing gates

on it. Source: Kavan et al., SIGGRAPH 2014 skinning course (candy-wrapper

is a twist artifact) · MoCap Online

("full rotation at each joint should produce natural deformation, not collapse or intersect"; mocap

as the strongest stress test).

10 — Declare the influence, unit and shading-model contracts as machine-readable fields, and register a UE validator

Owner: build/3d/characters/emit_a14_v21_manifest.py (schema v2 → v3);

build/3d/best_a14/rig/bl_verify_bind.py; a new UEditorValidatorBase subclass under

GAME:Tools/char/. Evidence: three of our own files carry two different influence defaults while

the shipped asset is a third state nobody asserts; the V2.1 manifest turned max_influences from a

field into prose across a same-version schema revision; no record states the FBX unit scale factor or

the four UE import toggles; run_gates.py has zero rig/skin/FBX checks; no character material sets a

shading model at all. Source: [Epic, Skeletal Mesh Rendering

Paths](https://dev.epicgames.com/documentation/unreal-engine/skeletal-mesh-rendering-paths-in-unreal-engine)

(4→8→12, threshold 8) · [Epic, Data

Validation](https://dev.epicgames.com/documentation/unreal-engine/data-validation-in-unreal-engine)

(AddValidator, -run=DataValidation) · [zMayaTools character

validation](https://zewt.github.io/zMayaTools/tool-character-validation.html) ·

Allar.

Ordering note. Changes 1–4 are the ones that answer Josh's sentence; 5 is the one that makes any

future green trustworthy; 6–10 are the chain becoming a chain. **Change 3 is the cheapest item on the

list and sits third only because 1 and 2 decide what body the rig is being asked to deform.**

---

7. HONEST LIMITS OF THIS AUDIT

the chain already emitted, except the four re-derivations marked [MEASURED HERE] (face and

quad counts on four meshes; the leg-A band histogram), which were computed directly on the landed

files this pass.

were re-verified by direct fetch (Anny, MetaHuman From Custom Mesh, CALVIS, the SMPL model

licence); every other source is inherited with its owning craft document's verification state,

marked in §1. No GDC talk was watched by this audit or by any of the five craft documents, and

no claim here is sourced to one.

ABSOLUTE_LEG.band_status: "VACUOUS" and status: "CANNOT_ATTRIBUTE" on every row — the C1

plate-twin corpus has 3 strict pairs on the face view and zero on every other view, against a

minimum of 8. **The A3_FIT attribution in §0 and §2.3 rests on the DELTA leg, whose band is

derived from the ladder's own P90, and it is stated as such.** It is strong evidence of *which

stage moved the number* and it is not an absolute quality verdict.

are not yet what the record says they are. Its RED verdicts are the best evidence we have and they

are not yet the bar OPEN-0 ordered.

Generated by harness/site/structure_site.py — the URL path is the repo path. review root