npcs/CHARACTER_PRACTICE_GAP_AUDIT.md
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].
---
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
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:
| site | mesh | reference | residual | verdict |
|---|---|---|---|---|
| shoulder breadth at acromion | 33.557 cm | plate V4 36.119 / V3 36.142 | −7.09% | RED |
| the same, against the ladder | 33.557 cm | biacromial 42.029 / soft-tissue 42.925 | −20.2% / −21.8% | published, not scored |
neck_base girth | 29.362 cm | 32.272 / 33.627 | −9.02% | AMBER |
bicep_relaxed girth | 30.775 cm | 26.691 / 25.325 | +15.30% | RED |
underbust girth | 78.112 cm | 75.160 | +3.93% | AMBER |
waist_natural girth | 69.748 cm | 68.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.
---
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.
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/>
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/>
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>
UEditorValidatorBase, 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>
BaseName.####.ext UDIM set imports asone 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>
docs.blender.orgreturned 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/>
TAPose humanoid flag; quadtiers 50k/18k/8k/4k and raw tiers 500k/150k/20k/2k).
<https://developer.hyper3d.ai/api-specification/rodin-generation-gen2_reset_v.md>
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>
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/>
SK_/SKEL_/PHYS_; meshes scaled correctly).<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/>
#000000/#f800f8), the loud-failureconvention. <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>
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.
---
| Stage | Expert practice | Our practice | Verdict | Adopted change (source) |
|---|---|---|---|---|
| generate | Parametric body as conditioning + completion prior; canonical T/A pose emitted; part separation; skeletal/volumetric control channel beyond the image | TripoSG single-image, no prior at any stage; arms against the flanks; one fused implicit shell; 0 quads | NOT the likeness defect (best row on the ladder) / DEFECT of class | Add a fitted parametric body as prior + canonicalise pose before anything measures the mesh (ICON; CharacterGen; Rodin TAPose) |
| fit | rig → joint → vertex; anthropometry as shape parameters; free vertices only as a bounded detail pass | bounded_fit.py / fit_a14.py = free vertices to scalar girths, as the primary operator; chest read 110.85 cm against an 81.93 target | DEFECT — the largest measured one, A3_FIT ATTRIBUTED as the look-loss stage | Demote free-vertex fit; solve in parameter space; part-restrict + canonicalise before measuring (arXiv 2605.04524; A2B; CALVIS) |
| partition / UV | Quads 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 asset | Ship 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 Texture2D | DEFECT, structural — no weighting method recovers it | Conform 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 / texture | Padding is a bake-time invariant scaled to resolution; source sufficiency is a precondition; Subsurface Profile + dual-lobe specular + micro-normal + cavity; measured px/m | Tile 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 wide | DEFECT — half the shipped albedo is invented and the bake publishes anyway | Source-sufficiency refusal per region; padding into the bake; Subsurface Profile + dual lobe (Substance/Marmoset; Epic Subsurface Profile + Digital Humans) |
| rig / skin | Geodesic 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 scored | geodesic_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_moved | DEFECT 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) |
| import | Influence + 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 CI | 172,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 checks | PART WIN, PART DEFECT — the scale proof and the material-substitution tooth are genuine; the contract layer is absent | Declare the contracts as machine-readable fields; register a UEditorValidatorBase validator (Epic Data Validation; zMayaTools; Allar) |
| capture | Black-silhouette recognition at three distances × five poses; two-rotation turntable; calibration objects every frame; review at ship LOD in engine; publication discipline | silhouette_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 nothing | DEFECT of wiring, not of instruments | Make 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) |
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.
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:
| view | A1_GENERATE | A3_FIT | arriving delta | delta band | attribution |
|---|---|---|---|---|---|
| front | 0.23848 | 0.33274 | +0.09426 | 0.09381 | ATTRIBUTED → A3_FIT |
| back | 0.29316 | 0.41225 | +0.11909 | 0.09125 | ATTRIBUTED → A3_FIT |
| side | 0.61199 | 0.62952 | +0.01753 | 0.06838 | CLEAN |
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.**
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:
| mesh | verts | tris | quads | ngons |
|---|---|---|---|---|
build/3d/best_a14/uv_ap/A14_PARTITIONED.obj (ships) | 86,375 | 172,398 | 0 | 0 |
build/3d/best_a14/uv/A14_PARTITIONED.obj | 83,714 | 167,468 | 0 | 0 |
build/3d/finish_a14/retopo/FINAL_A14_V3B.obj | 151,928 | 303,860 | 0 | 0 |
build/3d/finish_a14/retopo/QUAD_A14_V3B.obj (not shipped) | 10,749 | 30 | 10,530 | 125 |
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.
build/3d/best_a14/texture_ap/BASECOLOR_BAKE_A14.json:
| tile | faces | texels covered | observed fraction | nearest-valid filled | invented share |
|---|---|---|---|---|---|
| 1001 (body) | 139,216 | 2,239,277 | 0.45579 | 1,218,640 | 54.4 % |
| 1002 (head) | 17,310 | 2,847,550 | 0.48878 | 1,455,721 | 51.1 % |
| 1003 (garment) | 15,872 | 2,718,075 | 1.0 | — | 0 % |
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.
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.
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.
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.
---
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.
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.
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.
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.
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.
---
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.
anatomy_bar implements). Widen to 36.1 cm.*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.
---
Recorded so the audit is honest in both directions, and because these are the assets the ten changes
should be built *on*.
bl_pose_mesh_to_rig.py::seam_check refuses a hard-1 seed vertex sharing anedge 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.
fit_a14.py's confound control, anatomy_bar's per-site 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.
PLATE_VS_LADDER_DISAGREEMENTS is a first-class field, not afootnote. 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.
---
Ranked by measured consequence against Josh's grade, not by ease. Each names its owning file, its
evidence, and its source.
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 ·
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.
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 ·
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.
Owner: build/3d/best_a14/rig/bl_skin_to_mannequin_BOUNDED.py. Evidence:
CENSUS_V21_BARE3.json — upperarm_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/) ·
**No corrective, filter or algebra change matters while the joints the animation rotates are not
attached to the skin** — and Josh named the shoulders.
anatomy_bar as a hard refusal on capture and publish, and answer its sighted rubricOwner: harness/asset_factory/anatomy_bar.py → GAME: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.**
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."**
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.**
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).
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.
ROM_RESULT a real deformation scoreOwner: 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).
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) ·
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.**
---
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.
LIKENESS_STAGE_LADDER_A14.json carries 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.
anatomy_bar is itself incomplete by its own declaration, and change 5 says its leg-A bandsare 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.