pipelines/RC1_CHAIN_MEASURES_NUMBERS_NOT_LOOK.md
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.
---
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
harness/asset_factory/thousand_point_eval.py (2,958 lines, read in full across pages) — theeight-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.
build/3d/eval/thousand_point/EVAL_A14_ASSET_TEXTURE_LEG.json (the newest run, 2026-08-0720: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_BENCH_SPEC.md (104 lines, full), build/3d/cage/CAGE_PICK.json, build/3d/cage/cage_source/CAGE_SOURCE_RECORD.json,
build/3d/cage/cage_source/BASELINE_UNWRAPPED_A7.json.
build/3d/finish_a14/v3/metrics/NECK_GATE_A14_SKIRT.json, build/3d/finish_a14/v3/graft/GRAFT_A14_V3B_SKIRT_BALD.json.
build/3d/hi3dgen/fit_a14.py (docstring L1-88 + verdict emission L580-660), 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/partition_and_uv.py (header L1-45), build/3d/finish_a14/uv/A14_ASSET.json, build/3d/finish_a14/renders/textured_tt/TURNTABLE_TEX_A14_TEX_V3.json,
build/3d/finish_a14/render_textured.py (header + render block).
build/3d/finish_a14/seal_apertures.py (header L1-27).build/art/characters/body_evidence/BODY_LADDER_V3_KILLS.jsonl (111 rows).build/art/characters/face_overcopy_g4.py L60-100 (copy_index, detail_index).docs/LOOKDEV_STANDARD.md (395 lines, full).harness/qa/comparator_rubrics/character_appeal.json (full).harness/gates_config.json (80 gates), harness/comparator_rubric_scorecard.json, harness/check_art_pointers.py + harness/check_asset_budgets.py (headers).
docs/PIPELINE_LEDGER.md §THE THOUSAND-POINT EVALUATION HARNESS (L4858-4964), §STAGE 3(L4965-5082), §ROUND 2 (L5908-end), §THE SEAM REBUILD (L4511-4614).
docs/HANDOFF_2026-08-05_ACCOUNT_SWITCH.md §8.14 (L2810-2848)._source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md L185-195(D-POLY-BUDGETS).
build/art/characters/CHAR_0001_CANON_SHEET.md L105 (the ruled elven ear).1de98b40 full message; git log tips. 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.
---
Order reconstructed from the stage records' own mesh_in/in/body fields and mtimes.
| # | Stage | Script | Input → output | Record |
|---|---|---|---|---|
| 0 | 2D plate ladder | build/3d/characters/body_specs/body_ladder_v3.py | prompts → V3 exemplar plates | BODY_LADDER_V3_KILLS.jsonl |
| 1 | Head cage pin | build/3d/cage/pin_cage_source.py | authored head assembly (110,840 v, 11 shells) → CAGE_SOURCE.obj (15,969 v = the skin shell only) | CAGE_SOURCE_RECORD.json |
| 2 | Cage wrap race | build/3d/cage/bench_cage.py + solver_nricp/nricp_wrap.py | cage + generated head → WRAP_A14_V3B_SKIRT.obj | CAGE_PICK.json, THE_RACE_UNDER_ONE_RULE.json |
| 3 | Neck gate | build/3d/cage/neck_gate.py | wraps → PASS/FAIL on neck length | v3/metrics/NECK_GATE_A14_SKIRT.json |
| 4 | Body generate | Hi3DGen / TRELLIS.2 multi-view | V3 plates → A14V3_V3MV_s42.obj | v3/metrics/RUN_V3_HI3DGEN.json |
| 5 | Shell clean | clean_shells.py | strip stray internal shells | CLEAN_A14V3_*.json |
| 6 | FIT | build/3d/hi3dgen/fit_a14.py | drive every spec girth onto the mesh | FIT_A14V3_*.json, retopo/FIT_CLOSED_A14_V3B.json |
| 7 | Aperture seal | finish_a14/seal_apertures.py | cap eye apertures so the head encloses | seam/SEALED_A14_V3B.obj |
| 8 | CLOSE | finish_a14/close_shell.py | voxelise 0.15 cm, fill, marching cubes, decimate, taubin | retopo/CLOSE_A14_V3B.json |
| 9 | GRAFT | finish_a14/graft_a14.py | wrap head + closed body across a Hermite neck bridge | v3/graft/GRAFT_A14_V3B_SKIRT_BALD.json |
| 10 | RETOPO | AutoRemesher | FINAL_A14_V3B.obj → QUAD_A14_V3B.obj (10,530 quads) | AUTOREMESHER_REPORT_V3B.txt, MEASURE_QUAD_A14_V3B.json |
| 11 | Partition + UV | finish_a14/partition_and_uv.py | FINAL_A14_V3B.obj (dense) → 15 slots, 4 UDIMs | uv/PARTITION_UV_A14.json |
| 12 | Basecolor bake | finish_a14/bake_plates.py | plates projected through the harness's own camera solve | texture/BASECOLOR_BAKE_A14.json |
| 13 | Assemble | finish_a14/assemble_asset.py | body + trousers, two o blocks | uv/A14_ASSET.json |
| 14 | Turntable | finish_a14/render_textured.py | EEVEE, 8 ortho azimuths | renders/textured_tt/TURNTABLE_TEX_A14_TEX_V3.json |
| 15 | Acceptance | harness/asset_factory/thousand_point_eval.py | 8 lenses, 16,288 points | build/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.
---
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.
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.
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.
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.
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,684 → decimate_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.
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.
Two candidate referents, both geometric, both stage-tier:
CAGE_SOURCE_RECORD.json 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.
seal_apertures.py L1-27: the graft carried 408 boundary edges insix 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."*
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).
thousand_point_eval.py) — the run Josh's turntable came fromNewest run EVAL_A14_ASSET_TEXTURE_LEG.json, 2026-08-07 20:45, subject
build/3d/finish_a14/uv/A14_ASSET.obj:
| Lens | Verdict | Points scored | Measures | Never measures |
|---|---|---|---|---|
| L01 proportion | GREEN | 10 | exact 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 silhouette | RED | 2,670 | per-row contour delta vs the plate's own contour, band = the plate's measured edge softness ×3/×8 | the head (excluded), the arms (unattributable), any interior form, colour, shading |
| L03 face structure | RED (0.08825 vs 0.02 band) | 478 | full-Procrustes shape distance over MediaPipe landmarks, render vs face plate | appearance, texture, ears, hair, head yaw (declared limitation) |
| L04 tone | REFUSED | — | (per-region value medians + Spearman ordering) | — |
| L05 colour | REFUSED | — | (per-region sRGB8 medians) | — |
| L06 seam continuity | AMBER | 196 | second difference of the region radius profile vs that region's median | anything outside a radius profile; all 3 spikes self-flag likely_axis_jump: true |
| L07 anatomical plausibility | GREEN | 37 | mesh inside the interval the ladder spec and the research spec agree to | the plates entirely — this lens never looks at a plate |
| L08 equip readiness | READY_STATIC | 45 | 4 presence/absence preconditions | look, 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**.
From EVAL_A14_ASSET_TEXTURE_LEG.json LENSES[L01_proportion].sites:
| site | SCORED | residual | verdict |
|---|---|---|---|
| hip_max | false | +36.274 % | RED |
| underbust | false | −21.204 % | RED |
| chest | false | −2.054 % | AMBER |
| waist_natural | false | −0.244 % | GREEN |
| thigh_proximal | true | null (no reading) | — |
| the other 8 | true | ≤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 %.
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.json → 0. 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."*
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.
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).
---
RC1's phrasing implies nobody looked. That is not what the record says, and the distinction matters
for the fix.
PIPELINE_LEDGER.md L4556: **"THREE CONSTRUCTIONS WERE BUILT AND THE EYE PICKED, NOT THENUMBERS."** 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.
1de98b40: **"FOUR DEFECTS, EVERY ONE FOUND BY LOOKING AT THE RENDER RATHER THAN AT THECODE"** — 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.
HONEST_TIER string and a "defects named, not describedaway" 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.
---
**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.
---
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.
---
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.
mesh_silhouette, L507-531): exact — an image row IS a horizontal plane atzero 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.
region_grid, L948+): per region, a (height × azimuth) grid of ray-cast 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.
region_bands, L906-945) are the 14 partitions expressed as (z_lo, z_hi, axis) 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:
region_label_buffer (L235-281) — the labelled mesh splatted into the plate's own solved frame,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.
read_asset_texture (L1249+) — self-describing texture discovery through mtllib → map_Kd →slot → region, UDIM-aware, v-axis flipped on read.
run_face_probe / lens_face (L2103-2191) — an out-of-process MediaPipe 478-landmark probe under 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.
render_head_for_face (L2264+) — already renders the mesh's head for the face lens, i.e. theharness 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.
--self-test (L2599+) — seven positive controls including recovery of a camera azimuth known by 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.
---
exists at fit, close, retopo or graft. Establishing it requires re-rendering intermediate meshes,
which is GPU/Blender work this lane is forbidden.
E:/pipe_archive/ and the rejected-output tree were not swept — only the plate directoryreferenced by the harness was read.
QA/lookdev/ sheets (the §9 proof: 4 sheets, 128 calibrated frames) were notread 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.
EVAL_A14_ASSET_TEXTURE_LEG.json (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.
FIT_A14V3_*.json (the pre-close per-arm fits, 6 files, ~50 KB each) were not read 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.