RC1_CHAIN_MEASURES_NUMBERS_NOT_LOOK.md

pipelines/RC1_CHAIN_MEASURES_NUMBERS_NOT_LOOK.md

RC1 POST-MORTEM LANE — THE CHAIN OPTIMIZES NUMBERS, NOT LOOK

Read-only audit of the assembled-character pipeline (CHAR_0001 age 14) as it stood at the

2026-08-07 night turntable Josh graded. Every claim carries file:line or a JSON key path.

Nothing in either repo was created, modified or deleted by this lane.

---

0. DERIVATION

python harness/route.py has no work-kind for a pipeline post-mortem (the router covers canon

work kinds: region-page, spine-chapter, boss-design, etc.). Named substitute read-set, read in

full:

DERIVED FROM

eight-lens acceptance harness; §"THE LENS BATTERY" L46-51, the per-lens functions L1040-1883,

the per-view comparator L1887-2001, the plate palette router L2004-2077, the face lens

L2140-2191.

20:45, on the assembled textured asset) and

build/3d/eval/thousand_point/A14_CLAY_BASELINE/EVAL_A14_CLAY_BASELINE.json (18:59, clay).

build/3d/cage/cage_source/CAGE_SOURCE_RECORD.json,

build/3d/cage/cage_source/BASELINE_UNWRAPPED_A7.json.

build/3d/finish_a14/v3/graft/GRAFT_A14_V3B_SKIRT_BALD.json.

build/3d/finish_a14/retopo/FIT_CLOSED_A14_V3B.json,

build/3d/finish_a14/retopo/FIT_AFTER_RETOPO_REJECTED.json,

build/3d/finish_a14/retopo/CLOSE_A14_V3B.json,

build/3d/finish_a14/retopo/MEASURE_QUAD_A14_V3B.json,

build/3d/finish_a14/retopo/AUTOREMESHER_REPORT_V3B.txt.

build/3d/finish_a14/renders/textured_tt/TURNTABLE_TEX_A14_TEX_V3.json,

build/3d/finish_a14/render_textured.py (header + render block).

harness/check_art_pointers.py + harness/check_asset_budgets.py (headers).

(L4965-5082), §ROUND 2 (L5908-end), §THE SEAM REBUILD (L4511-4614).

(D-POLY-BUDGETS).

build/3d/finish_a14/renders/textured_tt/A14_TEX_V3_az000.png (2026-08-07 21:12) and its

reference plate E:/art/boards/D1-09/CHAR_0001/CHAR_0001_EXEMPLAR_BODY_14_V3_BALD_W1344.png.

NOT DERIVED (authored judgment, and why it had no canon home)

plate. It had no canon home because no artifact on disk contains a render-vs-plate comparison —

which is itself the finding.

emitted record and code; the stages state what they measure, none states what it omits.

---

1. THE ASSEMBLED-CHARACTER CHAIN, END TO END, AS BUILT

Order reconstructed from the stage records' own mesh_in/in/body fields and mtimes.

#StageScriptInput → outputRecord
02D plate ladderbuild/3d/characters/body_specs/body_ladder_v3.pyprompts → V3 exemplar platesBODY_LADDER_V3_KILLS.jsonl
1Head cage pinbuild/3d/cage/pin_cage_source.pyauthored head assembly (110,840 v, 11 shells) → CAGE_SOURCE.obj (15,969 v = the skin shell only)CAGE_SOURCE_RECORD.json
2Cage wrap racebuild/3d/cage/bench_cage.py + solver_nricp/nricp_wrap.pycage + generated head → WRAP_A14_V3B_SKIRT.objCAGE_PICK.json, THE_RACE_UNDER_ONE_RULE.json
3Neck gatebuild/3d/cage/neck_gate.pywraps → PASS/FAIL on neck lengthv3/metrics/NECK_GATE_A14_SKIRT.json
4Body generateHi3DGen / TRELLIS.2 multi-viewV3 plates → A14V3_V3MV_s42.objv3/metrics/RUN_V3_HI3DGEN.json
5Shell cleanclean_shells.pystrip stray internal shellsCLEAN_A14V3_*.json
6FITbuild/3d/hi3dgen/fit_a14.pydrive every spec girth onto the meshFIT_A14V3_*.json, retopo/FIT_CLOSED_A14_V3B.json
7Aperture sealfinish_a14/seal_apertures.pycap eye apertures so the head enclosesseam/SEALED_A14_V3B.obj
8CLOSEfinish_a14/close_shell.pyvoxelise 0.15 cm, fill, marching cubes, decimate, taubinretopo/CLOSE_A14_V3B.json
9GRAFTfinish_a14/graft_a14.pywrap head + closed body across a Hermite neck bridgev3/graft/GRAFT_A14_V3B_SKIRT_BALD.json
10RETOPOAutoRemesherFINAL_A14_V3B.objQUAD_A14_V3B.obj (10,530 quads)AUTOREMESHER_REPORT_V3B.txt, MEASURE_QUAD_A14_V3B.json
11Partition + UVfinish_a14/partition_and_uv.pyFINAL_A14_V3B.obj (dense) → 15 slots, 4 UDIMsuv/PARTITION_UV_A14.json
12Basecolor bakefinish_a14/bake_plates.pyplates projected through the harness's own camera solvetexture/BASECOLOR_BAKE_A14.json
13Assemblefinish_a14/assemble_asset.pybody + trousers, two o blocksuv/A14_ASSET.json
14Turntablefinish_a14/render_textured.pyEEVEE, 8 ortho azimuthsrenders/textured_tt/TURNTABLE_TEX_A14_TEX_V3.json
15Acceptanceharness/asset_factory/thousand_point_eval.py8 lenses, 16,288 pointsbuild/3d/eval/thousand_point/EVAL_A14_ASSET_TEXTURE_LEG.json

Stage 10 output is not stage 11's input. PARTITION_UV_A14.json body =

build/3d/finish_a14/retopo/FINAL_A14_V3B.obj (the dense sealed graft), not QUAD_A14_V3B.obj.

The shipped/graded asset therefore carries 183,460 vertices and 362,119 triangles

(A14_ASSET.json vertices.total, EVAL_*.json subject.triangles), while the ledger's own

chain summary table advertises "quad triangles 21,215 — inside the Steam-Deck LOD0 floor"

(docs/PIPELINE_LEDGER.md L5030). The retopo stage produced a number, not the asset.

---

2. EVERY GATE, WHAT IT MEASURES, WHAT IT NEVER MEASURES

2.1 The 2D plate ladder (BODY_LADDER_V3_KILLS.jsonl, 111 kills)

MEASURES (per killed row, failed[] + measured{}): garment contrast, dark_frac,

min_row_frac, frame_fill, figure_area_frac, head_units_proxy, chest_waist_silhouette,

w_chest_px/w_waist_px/w_shoulder_px/w_hip_px, hip_fraction_measured, row_gaps,

micro_texture, chroma_mean. Verdicts: 104 KILLED, 5 REJECTED, 2 NO_OUTPUT.

NEVER MEASURES: whether the plate looks like CHAR_0001. That job belongs to a sibling instrument,

copy_index (build/art/characters/face_overcopy_g4.py:74) — a 64×64 grey Pearson correlation of

two frames, i.e. the ONE whole-frame similarity instrument this repository owns.

2.2 The head cage race (CAGE_BENCH_SPEC.md)

HARD GATES (L41-55): G1 topology identity (byte-identical vertex count + face array), G2 sanity

(no NaN/Inf, non-manifold not increased), G3 self-intersection (delta form: pair count not

increased vs the cage's own 1,124), G4 inversion (zero flipped faces), G5 determinism (<1e-6 of

bbox diagonal on re-run), G6 both targets converge.

RANKED METRICS (L57-64), and the pick is made on them: p95_surface_frac, mean_surface_frac,

landmark_max_frac, wall clock. CAGE_PICK.json REASONING.2_METRIC_1_DECIDES_AND_IT_IS_NOT_CLOSE:

"p95_surface_frac, max over both targets: S2 0.01749, S1 0.04965".

NEVER MEASURES: anything about how the wrapped head reads. CAGE_BENCH_SPEC.md:39 requires

"EVERY pass imaged" — images are produced and nothing scores them.

THE EAR MOVE, which is the single sharpest RC1 artefact. CAGE_SOURCE_RECORD.json

excluded_shells.available shows the authored assembly carried ear_l (720 v) and ear_r

(720 v), eye_l/eye_r/cornea_l/cornea_r, scalp (15,697 v), hair (29,760 v, 1,488 cards),

lashbrow. excluded_shells.reasons["ear_l/ear_r"]: *"EXCLUDED ON CANON GROUNDS … The ears ride

the wrap as a rigid follower keyed to the skull, or they get their own cage instance — that is a

director call, not a solver default. NAMED OWED for the pick wave."* Then the instrument was

patched so the absence stops costing: bench_cage.py:82 **"FIX 4 — EAR LANDMARKS ON A BARE

SKULL"**, and BASELINE_UNWRAPPED_A7.json _landmark_ear_note: *"The companion above excludes

ear_right, ear_left, because the cage is a bare skull with no ears by ruled canon … so that pair

measures the cage's declared scope rather than the wrap's quality."*

CHAR_0001_CANON_SHEET.md:105 rules that *"a small, clean, swept-back pointed ear is the only

morphological elven marker on the base"* — so the metric was narrowed away from the character's

single ruled identity marker, and no later stage re-attached it or scored its absence.

2.3 The neck gate (neck_gate.py, NECK_GATE_A14_SKIRT.json)

MEASURES: NECK_ABOVE_BULGE_CM — the height between a wrap's collar bulge and its jaw. Floor

NECK_GATE_MIN_CM = 1.0, derivation on the record: *"V2B measures 1.55 and GRAFTS; V3Q measures

0.60 and REFUSES … A floor on a measurement, never a tolerance on quality."* Ground-truth control

against the two heads whose real graft outcome is known.

NEVER MEASURES: quality. Its own _why field states the gap plainly: *"the wrap bench scores

surface conformance and cannot see a head with no neck."* This gate exists precisely because the

preceding numeric bench was blind to a structural fact — and it is itself another number.

2.4 FIT (fit_a14.py)

MEASURES: VERDICT = sites_in_spec, sites_scored, sites_not_scored,

worst_scored_residual_frac, mean_abs_residual_frac, worst_bilateral_spread_frac.

Landed run FIT_CLOSED_A14_V3B.json: 14 sites, 11 scored, worst 8.878 %, mean 0.939 %.

The docstring's own framing (L1): *"THE FITTING STAGE — every spec girth driven onto a mesh nobody

modelled."*

NEVER MEASURES: what the deformation did to the surface between sites. The chain ORDER was chosen

on this number too — FIT_AFTER_RETOPO_REJECTED.json VERDICT.worst_scored_residual_frac 0.59084

and worst_bilateral_spread_frac 0.81635 is why fitting was moved before retopo.

2.5 CLOSE (close_shell.py, CLOSE_A14_V3B.json)

MEASURES: out_topology.area_cm2 15,955.77 against BSA_control.expected_bsa_cm2 15,800;

volume_cm3 49,171.45; watertight true; arm_separation_tooth.sites_where_a_limb_loop_was_lost

0 → PASS.

NEVER MEASURES: surface fidelity to the generated sculpt. The record's own numbers show what the

stage does to it: input 91,510 v / 183,060 tris → voxel_grid at pitch_cm 0.15 →

marching_cubes_tris 2,016,684decimate_target 300,000 → taubin_steps 4. The

generated surface is resampled through a voxel grid and smoothed, and the ledger records that the

smoothing amount was picked to make a visual artefact go away — *"sigma 3.0 / taubin 8 removes it

entirely and the anatomy reads"* (PIPELINE_LEDGER.md L5014-5015). Detail was traded for a clean

read, and no instrument scored the trade.

2.6 GRAFT (graft_a14.py, GRAFT_A14_V3B_SKIRT_BALD.json)

MEASURES: neck_plane.outer_section_cm 30.4061 (the body's own measured minimum),

head_taper.factor 0.87993, azimuth_monotone (both rings star-shaped),

figure.nonmanifold_edges 0, winding_defects 0, components 3, head_units 7.5593 against

spec 7.5592, neck_min_after_graft.residual_frac −0.07002.

NEVER MEASURES: likeness. It states the cost it pays in its own words —

HONEST_TIER: *"NO texture, NO hair, NO ears — the cage the head is wrapped on is a bare skull by

construction, and hair and ears are their own stages. NOT a photoreal pass."* And

PIPELINE_LEDGER.md L4600-4603: *"The taper still narrows sub-chin face material … factor 0.8343

at the cut … It is the price of a cage neck that arrives about a fifth too fat, and it is a cost,

not a free choice."* A girth number bought a shape cost, knowingly, with no lens on the other side.

2.7 The "eye gates"

Two candidate referents, both geometric, both stage-tier:

anatomy.self_intersection: 1,124 intersecting face pairs, `pair_classes {"main x annulus":

1124}, fraction_of_faces 0.0368, PASSES_THE_SPEC_G3_BAR: false`. The bar was re-ruled to the

DELTA form (CAGE_BENCH_SPEC.md:47-51) so the cage's own by-design pairs stop failing it.

six loops of 68, all at the two eye apertures; the capper REFUSES any loop wider than

--max-loop-cm — *"A capper that will close anything is a capper that will silently close a

torso."*

Both measure topology. Neither has any opinion about whether an eye reads as an eye. The shipped

figure's eye apertures are, by the ledger's own sighted note (L5077), *"centroid-fan caps that read

as spoked discs."*

2.8 RETOPO (AUTOREMESHER_REPORT_V3B.txt, MEASURE_QUAD_A14_V3B.json)

MEASURES: quads 10,530, non-quads 155, vertices 10,749, 13.688 s; then the fit measure re-run on

the quad: worst scored residual 1.892 %, mean 0.645 %.

NEVER MEASURES: whether the retopo held the sculpt. And its output was not carried forward (§1).

2.9 The eight acceptance lenses (thousand_point_eval.py) — the run Josh's turntable came from

Newest run EVAL_A14_ASSET_TEXTURE_LEG.json, 2026-08-07 20:45, subject

build/3d/finish_a14/uv/A14_ASSET.obj:

LensVerdictPoints scoredMeasuresNever measures
L01 proportionGREEN10exact section girth at 13 spec sites vs BODY_AGE_14.json, band = ladder-vs-research disagreement floored at 2 %anything between sites; anything above the chin
L02 silhouetteRED2,670per-row contour delta vs the plate's own contour, band = the plate's measured edge softness ×3/×8the head (excluded), the arms (unattributable), any interior form, colour, shading
L03 face structureRED (0.08825 vs 0.02 band)478full-Procrustes shape distance over MediaPipe landmarks, render vs face plateappearance, texture, ears, hair, head yaw (declared limitation)
L04 toneREFUSED(per-region value medians + Spearman ordering)
L05 colourREFUSED(per-region sRGB8 medians)
L06 seam continuityAMBER196second difference of the region radius profile vs that region's mediananything outside a radius profile; all 3 spikes self-flag likely_axis_jump: true
L07 anatomical plausibilityGREEN37mesh inside the interval the ladder spec and the research spec agree tothe plates entirely — this lens never looks at a plate
L08 equip readinessREADY_STATIC454 presence/absence preconditionslook, of any kind

No lens anywhere scores whole-figure or whole-head visual likeness to the plates. The closest

is L03, which reduces the face to 478 landmark COORDINATES with centroid, scale and in-plane

rotation removed — a shape test, not an appearance test — and it scores RED and is not a gate.

Three structural facts about the 16,288 points:

1. Only 3,436 of 16,288 (21.1 %) enter any verdict (POINT_COUNTS.lens_scored_points).

2. The 11,168 region-grid radii compare against nothing. Each row carries points, scored,

confounded, median_radius_cm, radius_p05_cm, radius_p95_cm,

median_left_right_asymmetry_frac — a self-description of the mesh, with no plate-side or

spec-side target. The dense half of the "thousand points" is not a comparison.

3. The head is exempt by construction. thousand_point_eval.py:1939-1943 and the emitted

head_band_NOT_SCORED_BECAUSE: *"the clay head is a bare skull by construction — no hair, no

ears, no eyes … while every authored plate carries ears and the face plate carries hair. These

points are measured and published; scoring them would charge this stage for stages that have not

run."* The bust and face views are additionally PUBLISHED_NOT_SCORED for silhouette

(SILHOUETTE_NOT_SCORED_BECAUSE, L142-147). So the surface partition_and_uv.py:26 itself

calls *"the most identity-bearing surface on the asset"* contributes **zero scored silhouette

points**.

2.10 The L01 GREEN is green because its reds are out of scope

From EVAL_A14_ASSET_TEXTURE_LEG.json LENSES[L01_proportion].sites:

siteSCOREDresidualverdict
hip_maxfalse+36.274 %RED
underbustfalse−21.204 %RED
chestfalse−2.054 %AMBER
waist_naturalfalse−0.244 %GREEN
thigh_proximaltruenull (no reading)
the other 8true≤2.02 %GREEN

Ten points scored, verdict GREEN. Every RED the lens found sits in the four torso sites it declines

to score, on the (locally correct) grounds that the arms lie against the flanks in this pose. The

exclusion is honest and documented; the consequence is that the lens reports GREEN on a figure

whose largest measured torso residual is +36 %.

2.11 The gate roster — none of this is armed

harness/gates_config.json carries 80 gates. Four touch art/assets: art_pointers (does a

plate row's sha256 resolve to the bytes it claims), asset_budgets (triangle/slot budgets vs

T1_Build_Pipeline_Contracts §1.7), d1_27_visual_law, lookdev_albedo.

grep -c thousand_point harness/gates_config.json0. The acceptance harness is an on-demand

instrument; it cannot block anything, and it did not.

docs/LOOKDEV_STANDARD.md:286-291 says the one look-adjacent gate deliberately gates nothing about

any asset: *"It does not gate any asset's actual albedo band … What the gate asserts is that the

instruments still fire."*

2.12 The rubric that was supposed to own LOOK says it does not measure look

docs/LOOKDEV_STANDARD.md:20-22: *"It is not a beauty rubric. Every instrument here measures light,

range and round-trip; not one of them measures whether an asset is good. The appeal rubric

(harness/qa/comparator_rubrics/character_appeal.json) and the cold judge keep that job."*

character_appeal.json known_limits[2]: *"There is no NUMERIC appeal score and this rubric

deliberately does not invent one. Appeal is read; what is measured here are its PRECONDITIONS —

authorship, aperture, transmission, coverage, band truth. **A build can pass every precondition and

still not be beautiful**, and the honest verdict for that is BELOW with the frame attached."*

And it was never triggered on this work. Gate 51 (comparator_rubric) parses ## entries of

docs/FACTORY_CONTINUATION.md and keeps only GAME-REPO WAVE-CLOSES;

harness/comparator_rubric_scorecard.json armed[] contains exactly one entry (WAVE 8, the world

wave), whose character_appeal verdict is NOT_APPLICABLE. The A14 finish chain lands through

canon commits and docs/PIPELINE_LEDGER.md, which gate 51 does not read. The only

COMPARATOR VERDICT - character_appeal on record (docs/FACTORY_CONTINUATION.md:4488) is BELOW,

and it is about the authored head (1,100 hair cards, 134 quads removed for the eye aperture,

transmissive cornea, subsurface, AUTHORED maps) — a different head from the bare cage wrap that is

actually in the graded figure.

2.13 The graded turntable was not a lookdev capture, and says so

renders/textured_tt/TURNTABLE_TEX_A14_TEX_V3.json render = `{"engine": "BLENDER_EEVEE",

"resolution": [868, 1400], "camera": "ORTHO"}; flat_slots = ["M_GARMENT_UNDERWEAR_TROUSERS"]`;

HONEST_TIER = *"a SIGHTING instrument. The lighting is a fixed studio and the basecolor carries

the plates' own baked lighting, so this is not a lookdev render and nothing here is evidence for a

lighting claim."*

Against LOOKDEV_STANDARD.md this is: not Cycles, no declared HDRI (render_textured.py:125-132

builds a (0.10, 0.10, 0.11) background plus area lamps), no grey/chrome/ColorChecker in frame

(§3, "Reviews arriving without them are returned before the asset is looked at"), and no de-light

(§5, mandatory — "there is no route in which it is skipped because a lane was busy"). De-light was

wired only in ROUND 2, after the grading (PIPELINE_LEDGER.md §5 of the ROUND 2 section), and that

work is still uncommitted in the working tree (bake_plates.py, A14_PARTITIONED.mtl,

TROUSERS_A14_MID_UV.mtl all modified per git status).

---

3. WHERE LOOKING DID HAPPEN — the honest counter-evidence

RC1's phrasing implies nobody looked. That is not what the record says, and the distinction matters

for the fix.

NUMBERS."** The two-surface morph *"measured better than the bridge and the eye refused it"*;

the body-continuation band had *"best lower-join numbers of the three, and the eye refused it

too."* The eye overruled the numbers, twice, at the neck seam.

CODE"** — the flipped UV v axis (*"Invisible in every number the bake emitted, because coverage,

observed fraction and palette medians are all computed in raster space and were all correct"*),

the black mannequin tone, a palette self-check comparing nothing, and backdrop painted onto the

silhouette edge.

away" section.

So the loop looks constantly. What it never does is **score a look, against the plate, at

whole-figure scale, in a way that can block a stage.** Every one of those sighted reads was

(a) local — a neck ring, a UV flip, a tone band; (b) against the asset alone or its own previous

version, never side by side with the plate; (c) performed by the lane that authored the thing; and

(d) narrative, not a verdict any gate could read.

---

4. RC1 ADJUDICATION

**RC1 as written: "fit/close/retopo/graft each preserve measurements while degrading the generated

sculpt's visual quality; the eye-gates passed stage-tier work but no stage owned 'does the WHOLE

read like the plate'."**

VERDICT: CONFIRMED on its second clause, PARTIAL on its first.

CONFIRMED, and this is the load-bearing half. No stage anywhere in the chain — and no lens in the

acceptance harness — scores whole-figure or whole-head likeness to the exemplar plate. Positive

control on that claim: copy_index, the only whole-frame similarity function in the repository

(face_overcopy_g4.py:74), appears in nine files, **all of them under

build/3d/characters/body_specs/ (the 2D plate lane)** and none of them on any 3D mesh render;

grep -rln "ssim|lpips|dreamsim|arcface|facenet|insightface" --include=*.py build/3d/ harness/

returns no 3D-lane hit. The 2D lane owned an identity instrument and the 3D lane never inherited

it. Three structural exclusions then guarantee the whole read cannot be scored even in principle:

the head band is unscored by rule (thousand_point_eval.py:1939-1943), the two head-bearing views

are unscored by rule (L142-147), and the ear landmarks were patched out of the cage metric

(bench_cage.py:82).

PARTIAL on the first clause, because "degrading" is asserted rather than measured, and this is

exactly the thing the chain cannot answer about itself. What IS on the record:

triangles decimated to 300,000, taubin_steps 4, smoothing amount chosen to kill a visible

artefact) with area/volume/watertight/limb-loop-count as its only controls.

scalp shell from the head that is in the figure, each with a per-stage-correct reason.

No instrument compared before-and-after on look at any of those points, so the magnitude of the

degradation is not knowable from disk. The right correction to RC1's wording is: **the chain does

not degrade look secretly — it trades look for numbers explicitly, records each trade as a cost,

and then has nothing that ever sums the costs.**

The mechanism, stated once: every exclusion in this chain is locally correct and globally fatal.

Not scoring the arms-confounded torso sites is right. Not charging the graft stage for absent hair

is right. Not ranking a wrap on ear landmarks a bare skull cannot have is right. Every one of those

rulings is defensible on its own record. Their sum is an acceptance report that returns GREEN /

GREEN / READY_STATIC on a figure with no ears, no hair, a spoked-disc eye, a +36 % hip, a beige band

across the pelvis and an adult musculature the plate does not have — because each defect was ruled

out of some stage's scope and no stage's scope was the whole.

---

5. THE WHOLE READ, DONE ONCE, BY HAND

I read the graded frame A14_TEX_V3_az000.png (21:12) and its plate

CHAR_0001_EXEMPLAR_BODY_14_V3_BALD_W1344.png at full size, side by side. This comparison exists

nowhere on disk. What it returns:

1. No ears. The plate's pointed swept-back ears are the ruled sole elven marker

(CHAR_0001_CANON_SHEET.md:105). The render has none — the cranium is smooth to the skull.

Scored by nothing.

2. Wrong build. The plate is a lean adolescent with soft, barely-emerging definition; the

render carries defined pecs, rectus, obliques, deltoids, forearm and quad separation — an adult

athletic read. The ledger already saw this and filed it as somebody else's problem:

*"at full height the fitted body reads more defined than the rung's own training_clock asks

for ('definition EMERGING and subtle'). Sighted, not measured here"* (PIPELINE_LEDGER.md

L4610-4612). Scored by nothing — L01 measures girths, and definition is not a girth.

3. Wrong garment. Plate: black short boxer briefs. Render: cream mid-thigh trousers, flat-shaded

(flat_slots: ["M_GARMENT_UNDERWEAR_TROUSERS"]). Not a defect of the body chain — the trousers

pick is a named open Josh item — but it is half the figure's value read.

4. A beige band across the pelvis. The doll-zone mannequin tone against skin, a hard horizontal

step the plate does not have. It is DOLL_ZONE_NOT_SCORED by rule

(thousand_point_eval.py:1241-1246).

5. Blue-grey chips down both flanks, the outer arms and inside the hands — the arm-flank

sampling defect, sighted in commit 1de98b40 and fixed only in the uncommitted round 2.

6. A dark collar under the jaw and a pale cranium against a tan face — the head tile projected

from a plate whose camera only saw the face.

7. Mushy mouth and jaw, and eye apertures that read as caps rather than eyes.

Every item is a whole-read failure. Not one of them is a red in EVAL_A14_ASSET_TEXTURE_LEG.json

except indirectly through L02's thorax residual and L03's face RED, neither of which names any of

them.

---

6. THE THOUSAND-POINT HARNESS — ARCHITECTURE (RC5's wiring target)

File: harness/asset_factory/thousand_point_eval.py (2,958 lines). Ledger section:

docs/PIPELINE_LEDGER.md L4858-4964. Outputs: build/3d/eval/thousand_point/EVAL_<tag>.json,

POINTS_<tag>.json (1.5 MB per-point dump), SHEET_<tag>.html (self-contained, phone-first),

images/OVERLAY_<view>.png ×5, images/WORST_<view>_{1,2,3}.png.

Three instruments in dependency order (docstring L20-51):

1. CAMERA SOLVE (solve_camera, L771-902). Per plate: figure_mask segments the figure

(bicubic background surface fitted robustly on the outer 4 % ring, value + 3× chroma difference,

Otsu threshold, floored at 8× the fit's ring residual — L583-667). edge_softness measures the

plate's own boundary transition width (L670-701) — this becomes the acceptance band. Azimuth is

swept ±sweep_deg at 5° then refined at 1°, scored on SHAPE ONLY (_shape_terms, L742-768:

widths rescaled to the plate's mean half-width so a girth error cannot be absorbed as a

rotation). Crop plates additionally solve their band floor over 24 candidates (L1902-1912).

Refusal: camera_identifiable — the winning angle's shape residual must beat 0.85× the sweep

median. beats_featureless_column rides as a published diagnostic the silhouette lens reads as

RED. Solved on the shipped asset: front 4.0°, back 187.0°, side 84.0°.

2. DENSE POINT COMPARATOR.

zero elevation, so the extremes are the min/max of the rotated horizontal coordinate over the

exact planar cross-section (section_segments, L323-353, indexed by build_section_index,

positive-controlled against body_probe.cross_section). 1,024 per view × 5 views = 5,120.

surface radii from that region's own axis (ray_radii, L534-552). 11,168 on the shipped asset.

Confound rules stated not tuned: a torso ray >1.35× the ring median inside an arm band, or a

limb ray crossing the midline, is published and not scored.

from the spec's own landmark heights; partition_and_uv.py IMPORTS this function so asset and

report share intervals by construction.

3. LENS BATTERY — L01…L08 as tabulated in §2.9. Contract per lens: declare

measured_against, points_scored, the band and its derivation, and a verdict; REFUSE by name

rather than pass unearned; VACUOUS (zero points) is a failure, never a pass.

Band derivation law (docstring L52-62): silhouette band = the plate's own measured edge softness

× SIL_GREEN_MULT 3.0 / SIL_AMBER_MULT 8.0 (L151-152); proportion band = |ladder − research| at

that site floored at PROPORTION_FLOOR_FRAC 0.02 (L153); anatomical band = the interval the two

sources span; tone/colour band = the plates' own between-view half-range floored at 2 of 255

(_view_spread_band, L1335-1359).

Supporting machinery a likeness lens would inherit for free:

returning which region faces the camera at each pixel plus an optional depth buffer, with measured

coverage_of_figure. This already puts mesh and plate in one frame at pixel level. A

perceptual comparison needs exactly this and nothing more.

slot → region, UDIM-aware, v-axis flipped on read.

a pinned 3.12 interpreter (--face-python C:/dev/venvs/face312/Scripts/python.exe), with a

positive control on BOTH images before it will score.

harness already produces a render of the asset. It is compared by landmarks only; no pixel

comparison is made of an image it already has in hand.

construction and agreement of the fast indexed section with body_probe.cross_section.

Where a LIKENESS LENS plugs in, concretely. main() (L2711+) already holds, per view: the

plate RGB, the figure mask, the solved azimuth, the solved band, the horizontal offset, the figure

height in pixels, and (via region_label_buffer) a per-pixel region map of the mesh in that same

frame. A lens that renders the asset at the solved azimuth and compares it to the plate inside the

mask — pooled and per region, on a band derived the way every other band here is derived (the

plates' own between-view disagreement measured through the same comparator) — needs no new solve,

no new segmentation and no new frame. The one thing it does need that the file does not have is a

renderer call from inside the harness for the BODY (the head render already exists), and a

perceptual distance the repository does not currently own in the 3D lane.

What the harness is not, today: not a gate (grep -c thousand_point harness/gates_config.json

→ 0), not run between stages (one run on clay 18:59, one on the assembled asset 20:45 — both

AFTER assembly), and not consulted before the turntable was rendered at 21:12.

---

7. GAPS THIS LANE COULD NOT CLOSE

exists at fit, close, retopo or graft. Establishing it requires re-rendering intermediate meshes,

which is GPU/Blender work this lane is forbidden.

referenced by the harness was read.

read against the A14 asset, because no A14 lookdev sheet exists — the asset never went through

Tools/lookdev/run_lookdev.py. That absence is itself reported above; whether an A14 sheet was

attempted and failed is not knowable from the canon repo.

(20:45) still shows L04/L05 REFUSED, but A14_PARTITIONED.mtl (21:29) and bake_plates.py

(23:23) post-date it and are uncommitted. No eval run exists after 20:45. Re-running the harness

is cheap CPU work but writes into the repo, which this lane may not do.

individually** — the landed FIT_CLOSED_A14_V3B.json was taken as the chain's fit record on the

strength of its mesh_in/mesh_out lineage.

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