pipelines/RC5_LIKENESS_LENS_PROPOSAL.md
Lane: RC5 of the §8.14 FIRST CHARTER post-mortem (docs/HANDOFF_2026-08-05_ACCOUNT_SWITCH.md
L2811-2843). Status: PROPOSAL. Nothing in either repo was written by this lane. The director
lands it.
The mandate, verbatim (docs/HANDOFF_2026-08-05_ACCOUNT_SWITCH.md L2838-2841):
*"the loop lacked a holistic likeness gate per stage. The thousand-point harness + a LIKENESS LENS
(whole-figure perceptual similarity to the plates) is the structural answer; build it before
regenerating anything."*
Authority note. This is 3D-pipeline TOOLING, not canon. python harness/route.py carries no
work-kind for a post-mortem instrument, so no canon node owns it. What binds it instead:
docs/LOOKDEV_STANDARD.md (read in full — the operational standard for how a look claim is
evidenced), the acceptance bar quoted inside
harness/asset_factory/thousand_point_eval.py (_bar, from Josh's own 3D ACCEPTANCE BAR ruling),
and the gate architecture in harness/gates_config.json + harness/gatelib.py.
---
Every design choice below answers one of these. Each is a fact on disk, not an opinion about the
turntable.
harness/asset_factory/thousand_point_eval.py ships eight lenses and the newest run
(build/3d/eval/thousand_point/EVAL_A14_ASSET_TEXTURE_LEG.json, emitted 2026-08-07 20:45)
scores six of them:
| lens | what it actually is | verdict on the graded asset |
|---|---|---|
| L01_proportion | 10 girth sites vs BODY_AGE_14.json | GREEN |
| L02_silhouette | 1-D contour distance per height, per view | RED |
| L03_face_structure | Procrustes shape distance, 478 mediapipe landmarks | RED |
| L04_tone | REFUSED — "the mesh carries no texture" | REFUSED |
| L05_colour | REFUSED — same | REFUSED |
| L06_seam_continuity | 2nd difference of the radius profile | AMBER |
| L07_anatomical_plausibility | ladder-vs-research interval | GREEN |
| L08_equip_swap_readiness | preconditions P1-P4 | READY_STATIC |
Every one of them is a local scalar over a measured primitive. Not one of them takes the
rendered figure and the plate and asks whether they are the same picture. **L01 and L07 are GREEN on
the asset Josh called pathetic.** That is RC1 stated in the harness's own units: the numbers the
chain optimizes are exactly the ones that stayed green.
thousand_point_eval.py L1985-1990 publishes head-band silhouette points and does not score them:
`"head_band_NOT_SCORED_BECAUSE": "the clay head is a bare skull by construction -- no hair, no
ears, no eyes (the graft record's own HONEST_TIER) -- 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 declaration is honest and correct at the clay tier. The defect is that it has **no expiry,
no owner and no arming condition**, so it silently survived into the textured tier. On the front
view the run publishes points_published_not_scored_head_band: 134 with
head_band_median_abs_frac: 0.003141.
I sighted both images (standing visual-verification directive):
E:/art/boards/D1-09/CHAR_0001/CHAR_0001_EXEMPLAR_BODY_14_V3_BALD_W1344.png — the plate carrieslarge pointed elven ears, the single most distinctive silhouette feature on the subject.
build/3d/finish_a14/renders/textured_tt/A14_TEX_V3_az000.png — the graded turntable has **noears at all**; the head is a smooth bald cap.
A head with no ears cannot fail any lens in the battery today. That is the structural hole, and
it is exactly where a whole-figure lens has to sit.
The chain's stages each write their own record with their own numbers (GRAFT_A14_*.json,
AUTOREMESHER_REPORT*.txt, PARTITION_UV_A14.json, BASECOLOR_BAKE_A14.json). No two stages
share a rendered frame under one rig, so "which stage lost the look" is currently **unanswerable by
construction**, not merely unanswered.
build/3d/finish_a14/renders/textured_tt/TURNTABLE_TEX_A14_TEX_V3.json:
"render": {"engine": "BLENDER_EEVEE", ...} — a fixed studio, not the declared HDRI set.the plates' own baked lighting, so this is not a lookdev render and nothing here is evidence for a
lighting claim."`
"flat_slots": ["M_GARMENT_UNDERWEAR_TROUSERS"] — the garment had no baked texture at all; build/3d/finish_a14/texture/ holds only tiles 1001/1002/1003, never 1021.
build/3d/finish_a14/delight_atlases.py is STAGE 4b, "RUN THE MANDATORY DE-LIGHT PASS" (LOOKDEV_STANDARD.md §5 L145-149: *"There is no route in which it is skipped because a lane was
busy"*). Its mtime is 21:30; the graded frames and every atlas in texture/ are 21:12. **No
*_DELIT* atlas exists under build/3d/finish_a14/.** The frames Josh graded were rendered from
basecolors that had not been through the mandatory de-light stage.
So the grading surface itself was a self-declared non-claim under LOOKDEV_STANDARD.md §1. This
does not excuse the result — Josh's eye outranks every number, and the standard says so (§Authority)
— but it dictates the render protocol in §4 below.
harness/asset_factory/age_anchors.py L589-591:
`"what_would_arm_it": "a face-identity embedding (ArcFace/InsightFace class). None is installed on
this box and this lane did not add one mid-wave; named as the next rung rather than skipped"`
The stand-in is copy_index — "Pearson r between plate and conditioning image at 64x64 grey"
(build/art/characters/face_overcopy_g4.py L74, L162). Its own arming record (age_anchors L560-585)
measured it to put a DIFFERENT child in the same register ABOVE the same child three years apart
— the ordering is wrong and no cut point recovers it, so it is declared "never a gate leg and never
an identity verdict".
Licence fact that constrains the fix (harness/asset_factory/age_keystones.py L168-174): the
lane already EXCLUDED InsightFace-class stacks because *"the pretrained recognition models are
non-commercial research-only, which is the load-bearing part"*. That is an explicit triggered
prohibition — the one case the licence-read law says to flag rather than wave through. Any identity
embedding this lens adopts must clear that bar on its own model card.
---
It is a whole-figure agreement instrument between a stage's rendered output and the authored
exemplar plates, run at EVERY stage of the chain, reporting two things per metric:
1. ABSOLUTE agreement to the plate — the acceptance number.
2. DELTA from the previous stage — the attribution number. This is what makes it a per-stage
lens rather than a final exam.
It is NOT a beauty rubric. LOOKDEV_STANDARD.md §"What this standard is NOT" (L20-25) already
draws this line and it is inherited verbatim: the appeal rubric
(harness/qa/comparator_rubrics/character_appeal.json) and the cold judge keep "is it good", and
Josh keeps the final one. The likeness lens measures whether the asset still reads as the thing
the plate showed. An asset can be fully green here and still be ugly; that is a correct outcome and
the record must say so on its face.
It is NOT a replacement for L01-L08. It is L09-L12, added beside them, sharing their frame,
their regions and their camera solve.
---
All four run on the SAME frame and the SAME region partition as the existing battery, by IMPORT and
never by re-derivation. The precedent is already law in this lane: bake_plates.py imports
solve_camera, figure_mask, load_plate, rotate_h and VIEWS from thousand_point_eval.py
because *"a projection solved by a second camera would put the texture and the measurement in
different frames, and the disagreement would be invisible"*. Same rule here —
region_bands() (L906), solve_camera() (L771), figure_mask() (L583) are imported.
rather than published-not-scored**, and split into three declared sub-bands: SCALP, EAR_LINE,
JAW_NECK. The ear line is a named sub-band because the ears are the identity feature the plate
carries and the current head does not.
So the exclusion becomes an ARMED/NOT-ARMED declaration with an owner and a condition (§6), and
L09 scores the head band against a HEAD-STATE declaration the stage record carries
(has_ears, has_hair, has_eyes). If the stage declares has_ears: false, the EAR_LINE
sub-band reports EXPECTED_ABSENT — which is a finding with a named owner, not a silent pass.
The actual "does it read like the plate" number, and the hardest one to get right. Two tiers,
because the honest posture is to ship what needs no download and to arm the learned leg only after
it passes its own control.
Tier A — the classical stack (ZERO new dependencies; runs on the box today).
System python already carries numpy 2.4.6 / scipy 1.18 / Pillow; the pinned C:/dev/venvs/face312
carries opencv-contrib-python 4.11.0.86 (verified: cv2.quality present, cv2.FaceRecognizerSF
and cv2.FaceDetectorYN present). Four channels, each computed on the **figure-masked,
level-matched luminance** (the plate's median luminance mapped onto the render's, so the metric does
not score exposure):
1. MS-SSIM on the masked figure — the structural channel.
2. GMSD (gradient-magnitude similarity deviation, cv2.quality) — the gradient channel. Its
*deviation* term is the one that catches "smooth where the plate has form", which is the
mushy-head complaint in a number.
3. Per-region appearance EMD — over each of the 14 partitions + HEAD, the earth-mover distance
between the plate's and the render's joint histogram of (luminance, local gradient magnitude,
local contrast). This is what localises a likeness loss to R07_THORAX or M_HEAD_FACE, so a
likeness finding and a proportion finding name the same region by construction.
4. Silhouette turning-function distance — a shape-only channel that is completely invariant to
lighting, so it can be trusted across the plate/render domain gap that poisons 1-3.
Tier B — a learned descriptor, REPORTED-ONLY until it arms.
onnxruntime 1.28.0 is already in system python (no torch needed). A permissively-licensed vision
backbone exported to ONNX gives a cosine-similarity channel that tracks human judgement far better
than 1-3. It is not a gate leg on day one. It becomes one only if it clears the C1/C2 separation
proof in §5, and if its model card's licence is verified at fetch and recorded per row. Every
downloaded weight is md5-pinned in a manifest on the hdri_set.json precedent
(LOOKDEV_STANDARD.md §2 L57-63: *"refuses any file whose md5 does not match the manifest"*, and
*"a licence with no source of record is not a licence"*).
What L10 cannot say, printed on every record. The plate is a **generated image under unknown
light**; it is not a basecolor and cannot be de-lit. So part of every residual is lighting, and
channels 1-3 carry that contamination while channel 4 does not. The record publishes all four
separately and never averages them into one number — an average would hide exactly the channel
that is trustworthy behind the three that are not.
asset's face, at the same crop and alignment L03 already produces
(render_head_for_face(), L2264-2280, which shells to render_zoom.py — the house instrument,
imported not copied).
face_recognition_sface_2021dec.onnx, OpenCV Zoo), driven by cv2.FaceRecognizerSF, detected by YuNet (cv2.FaceDetectorYN). Reasons, in
order: (a) the runtime is already installed in the pinned face312 venv that L03 already uses —
no new environment, no torch; (b) OpenCV Zoo publishes a per-model licence line and SFace is
listed permissive (Apache-2.0) rather than the research-only posture that got InsightFace excluded
— **this must be re-read at the model card on fetch and recorded, not assumed from this
proposal**; (c) it is a 128-d recognition embedding, which is the class age_anchors.py named as
the missing rung.
non-commercial term the lane already ruled on. Adopting them for an internal measurement would be
a licence judgement this lane is not making by default; SFace makes the question moot.
embedding alignment removes centroid, scale and in-plane rotation but not head YAW, and this
lane has already measured that a head turn and an age change are the same displacement in the
image plane. A yaw-contaminated distance is reported with yaw_unsolved: true and is
DESCRIPTIVE, not a gate leg, until the plate's yaw is solved and the render re-aimed.
(*"an undetected face scores nothing, and a score from one side alone would be a fabrication"*).
about pixels, and a 868×1400 turntable can neither make it nor refute it.
radially-averaged power spectrum slope, the high-frequency energy fraction above the scale at
which a pore/fabric weave lives, and the per-region local-contrast distribution — all against the
plate resampled to the same footprint. A surface that carries less high-frequency energy than the
plate at the pixel size the player sees is mush, measured.
and the de-light record for the stage's atlases are read from
GAME:Tools/lookdev/albedo_validator.py / delight.py outputs and reported as L12 preconditions.
If a stage's basecolor has not been de-lit, L12 REFUSES — because §5 of the standard makes
de-light mandatory and a texture-read taken before it is taken on the wrong asset
(LOOKDEV_STANDARD.md §10 L360-362).
---
The rig law, inherited verbatim from LOOKDEV_STANDARD.md §3 L107-109: *"The rig is a constant
and the subject moves… Any change between two sheets is therefore the ASSET changing, never the
rig."* And §4: *"A/B arms are re-rendered by the instrument doing the comparing… Both arms of any
comparison run at identical camera, lights, views and samples."* Both apply to stage N vs stage N+1
exactly as they apply to two lanes' sheets.
THREE PASSES PER STAGE, from ONE rig. Each has a different job and a different validity window.
| pass | instrument | exists from | what it is FOR | who reads it |
|---|---|---|---|---|
| P1 MEASUREMENT (material-blind) | build/3d/cage/render_turntable.py constants, unchanged — BLENDER_WORKBENCH, one flat colour, cavity shading | S1 (raw sculpt) onward | the SHAPE channel. Comparable across every stage because it does not require a texture to exist | L09, L10 ch.4, L10 ch.1-2 shape-only |
| P2 CALIBRATED (LOOKDEV E1) | GAME:Tools/lookdev/bl_lookdev_sheet.py under E1_NEUTRAL_STUDIO, view transform Standard, look None, exposure 0.0, gamma 1.0, grey + chrome + ColorChecker in frame | S9 (a texture exists) onward | the SURFACE and COLOUR channels, under the only light that makes a polish claim a claim | L10 ch.3, L12 |
| P3 SHIP-SCALE | the same camera at the target on-screen pixel footprint | S9 onward | the mush question, in the units the player sees | L12 |
A stage with no texture REFUSES P2 by name rather than substituting the sighting render. That
refusal is the direct fix for F4: the frames Josh graded were a P-none — an EEVEE sighting render
whose own record disclaims itself. Under this protocol that frame is not admissible as a likeness
claim, and the lens says so instead of scoring it.
The camera is the SOLVED camera, not a nominal one. thousand_point_eval.solve_camera() already
finds the (azimuth, scale, offset) that puts the mesh behind the plate and publishes the solved
azimuth beside the nominal so a disagreement is a finding. The likeness render uses that solve, so
the measurement and the picture are the same frame by construction. On the graded run the solve
returned 4.0° for a nominally 0° front plate — a 4° pose difference that a nominal camera would
have silently charged to the asset.
The plate side has a protocol too. Segmentation is figure_mask(), the harness's own; the
comparison is made on the FIGURE only; the render is level-matched to the plate's median luminance
before any luminance-bearing channel runs.
THE GARMENT IS MASKED OUT, AND THE MASK IS PUBLISHED. The plate at age 14 wears black trunks;
the asset wears cream elven short trousers by Josh's own 2026-08-07 ruling
(build/3d/finish_a14/build_trousers.py head, quoting DECISIONS_PENDING_JOSH "UNDERGARMENT DESIGN
RULING"). A whole-figure metric that includes the garment would score a **ruled design change as a
defect** — and at ~18% of the front figure's area it would swamp everything else. So: the garment
footprint is excluded from L10/L12 and the exclusion mask is written per run, and the garment is
compared against its own reference (the trousers design plates), never against the body plate.
This is a real limit of "whole-figure" and it is declared rather than discovered later.
---
The lesson this obeys, and it is already law in this repo.
docs/proposals/music/MASTERPIECE_PROGRAM.md §11.4 (L355): *"The class curve stays the unit."*
The measured proof of what happens otherwise is
build/audio/exemplars/instruments/DYNAMIC_ARC_VALIDATION.md L132-145: a global floor of
flow_p10 >= 0.34 derived from six hand-picked rows would have rejected 12 of the 28 tracks
Josh has loved for decades. harness/music_gen/instr_dynamic_arc.py L1996 states the rule as
shipped: *"the class curve is the unit and a global scalar is banned"*, and L715-716 adds the
minimum-n rule: *"a class curve built from one track is that track, not a class"*.
Applied here, the CLASS is named explicitly — because "characters" is not a class:
class = (metric, view_id, subject_class, age_rung)class = (metric, view_id, stage_pair)C1 — THE PLATE-TWIN CORPUS. The irreducible floor.
Every pair of authored plates depicting the SAME subject at the SAME age in the SAME view. This
repo already holds many: the V3 ladders and their BALD / BRACKET / MASK variants
(CHAR_0001_EXEMPLAR_FACE_{14,16,18}_V2_BALD*.json and the V3 splits), the inbetween ladder
(build/art/characters/face_evidence/inbetween/LADDER_01..06.jpg), and the multi-generation plate
sets under E:/art/boards/D1-09/CHAR_0001/.
Their pairwise distance IS the same-subject distribution. No asset can be asked to agree with
the plate more tightly than two authored plates of the same subject agree with each other — that
would be measuring generator variance and calling it an asset defect.
C2 — THE DIFFERENT-SUBJECT CORPUS. The separation control.
Plates of a DIFFERENT character (build/art/characters/CHAR_0002_EXEMPLAR_PREP.md and its plate
set) and of the same character at a DIFFERENT age rung. If a metric cannot order C1 strictly below
C2 with a stated margin, the metric is REFUSED and the refusal is published — the exact shape
age_anchors.py L560-585 already uses ("required_margin": 0.04, "armed": sep >= 0.04) and the
exact reason copy_index was refused. A metric that cannot tell two people apart cannot tell you
whether your asset is the right person.
C3 — THE STAGE-DELTA CORPUS. What a normal stage costs.
Every stage output already on disk, for every asset that has been through the chain: both generator
arms (GRAFT_A14_HI3DGEN{,_V2,_V3}.obj, GRAFT_A14_TRELLIS2{,_V3}.obj), the closes and fits
(retopo/CLOSED_A14_{HI3DGEN,V3B}{,_fitted}.obj, CLOSED_BODY_V3MV.obj), the partition
(uv/A14_PARTITIONED.obj) and the assembled asset (uv/A14_ASSET.obj), plus the creature lane
(CR_0002) and the equipment class. **The per-stage delta distribution is what says whether a given
stage's delta is normal or a regression** — and it costs zero regeneration to build, because the
artifacts are already there.
C4 — THE PLANTED-DEFECT CORPUS. The sensitivity curve, and the must-fire fixtures.
Synthetic degradations of a KNOWN-GOOD render at KNOWN magnitude: ears removed; head smoothed at
N mm; silhouette scaled ±k%; texture blurred to N px; albedo shifted N sRGB; a seam step inserted at
N mm. This gives every metric a measured sensitivity — *"this metric moves X per mm of ear
removed"* — which is the only thing that makes a threshold actionable in units a lane can fix.
Precedent: harness/music_gen/instr_hook_presence.py calibrated λ = 0.42 from planted controls, and
GAME:Tools/lookdev/delight.py's self-test recovers a KNOWN albedo (0.1475 → 0.0208 level-matched
error) rather than trusting its own output.
1. GREEN = the C1 same-subject distribution's p75, per class. An asset that agrees with the
plate as well as three of four same-subject plate pairs agree with each other is not
distinguishable from the reference by this instrument, and calling it a defect is inventing one.
2. RED = the value at which C1 and C2 become equiprobable (the crossing point of the two
distributions). Below that value the metric can no longer tell "our subject" from "a different
subject", so a score there is not evidence of likeness at all. Between RED and GREEN is AMBER.
3. **DELTA band per stage-pair = the C3 distribution's p90, floored by the C4 sensitivity at the
smallest defect the lane cares about.** A stage that moves the metric more than nine of ten
observed stage runs have moved it is a regression by the corpus's own account.
4. Minimum n, and DESCRIPTIVE-ONLY below it. A class whose corpus has fewer than 8 pairs is
published as descriptive and cannot gate — inherited from arc_class_match's own rule.
5. NO GLOBAL SCALAR. There is no "likeness ≥ 0.9". Every band is per (metric, view, class), and
every band is published with its n, its spread and its measurement date. A median quoted without
its spread is banned by the same section that banned the global floor.
6. Every band is re-derived when its corpus changes, in the same commit — the standing
same-commit re-emit law (docs/fidelity_baseline.json, `build/3d/schema/
anatomy_conformance_baseline.json _law`).
harness's existing rule.
LOOKDEV_STANDARD.md §6).--self-test,executed on every real invocation, exiting 2 if a ruler rotted — the pattern every gate 26-33
already uses per gates_config.json's own note.
the metric's floor, and the same plate at a planted 1% perturbation must score above it.
---
| id | stage | script | output artifact |
|---|---|---|---|
| S0 | PLATES (the reference) | — | E:/art/boards/D1-09/CHAR_0001/*_V3_*W1344.png (VIEWS, L121-131) |
| S1 | GENERATE | Hi3DGen / TRELLIS.2 | build/3d/v3/meshes/* |
| S2 | GRAFT | finish_a14/graft_a14.py (STAGE 1) | graft/GRAFT_A14_*.obj |
| S3 | CLOSE | finish_a14/close_shell.py (STAGE 2a) | retopo/CLOSED_A14_*.obj |
| S4 | BAND CORRECT | finish_a14/band_correct.py (STAGE 2b) | band/* |
| S5 | SEAL APERTURES | finish_a14/seal_apertures.py | graft/*_SEAM_FINAL* |
| S6 | RETOPO | AutoRemesher | retopo/AUTOREMESHER_REPORT*.txt |
| S7 | FIT | build/3d/hi3dgen/fit_a14.py | retopo/*_fitted.obj |
| S8 | PARTITION + UV | finish_a14/partition_and_uv.py (STAGE 3) | uv/A14_PARTITIONED.obj |
| S9 | BAKE | finish_a14/bake_plates.py (STAGE 4a) | texture/A14_BASECOLOR.100{1,2,3}.png |
| S10 | DE-LIGHT | finish_a14/delight_atlases.py (STAGE 4b) | no output on disk — see F4 |
| S11 | ASSEMBLE | finish_a14/assemble_asset.py | uv/A14_ASSET.obj |
| S12 | IMPORT / IN-ENGINE | — | OWED on the engine lock (LOOKDEV_STANDARD.md §7) |
Each stage script emits one row to LIKENESS_CHAIN_<asset>.json: stage_id, script,
input_sha256, output_path, output_sha256, emitted_at, and a HEAD-STATE declaration
(has_ears, has_hair, has_eyes, has_texture, texture_delit). That declaration is what turns
L09's head-band exclusion from a permanent blind spot into a per-stage, per-run **DECLARED
NOT-ARMED** row with an owner.
Standing law: workflow critics are read-only on a shared tree — a mutating critic fakes red
gates. The lens reads the manifest, renders P1/P2/P3 itself (the A/B rule: the instrument doing the
comparing re-renders both arms), and writes only into its own record directory.
**The stage that owns a finding is the FIRST stage at which the metric crosses its band, and the
lens names it by stage_id.**
This is the whole point of running per-stage, and it is what makes RC1 vs RC2 vs RC3 decidable:
generator never had — and that is the measurement that would either confirm or kill RC3's
"generate rich, fit LIGHTLY" architecture inversion.
stage named.
RC2 — the head is the loss, not the body.
beside the L01/L07 series. "The chain optimizes numbers, not look" stops being a hypothesis the
moment those two curves are printed on one axis: L01 flat-green while L10 falls stage by stage
IS RC1, measured.
head_band_NOT_SCORED_BECAUSE gains ARMS_WHEN ("the stage declares has_ears and has_hair")
and OWNER (the head lane), and prints under DECLARED NOT-ARMED in the scorecard **on every
run** — the pattern gates_config.json already mandates for gates 26-33 (*"every not-yet-armed
assertion prints its reason under 'DECLARED NOT-ARMED' in its own scorecard every run"*). An
exclusion with no expiry is how a missing ear survives sixteen thousand measured points.
likeness_lens in harness/gates_config.json → harness/check_likeness_lens.py --out harness/likeness_scorecard, on the **exact shape of the
existing lookdev_albedo entry** ({"script": ..., "args": ["--out", ...]}).
check_lookdev_albedo.py doctrine, L4-21): that theinstruments still fire — the C4 must-fire/must-not-fire fixtures, the C1/C2 separation arming,
and the band-derivation reproducing its published values from its recorded corpus. It does not
gate any asset's likeness, because the plates and renders live on D:/E: and never enter git, and
*"a gate whose green depends on unversioned media goes red for reasons that are not defects"*.
— the same shape as the LOOKDEV RECORD rule (§10: *"Un-recorded look claims are un-DONE"*).
build/3d/schema/anatomy_conformance_baseline.json's _law: a finding not in waived FAILS; a waiver naming something the run never measured FAILS; a waiver matching
nothing measured FAILS. The list can only shrink, in the same commit as the fix.
gatelib.write_scorecard() (json + md), so run_gates.py aggregates it likeevery other gate. Vacuity control: zero instruments resolved is a FAIL, never a pass.
emit_sheet()'s inlined-image discipline (*"a board is only DONE when it is viewable on a phone,
and a page whose images live on E: is not viewable anywhere but this machine"*) — with the
plate and the stage render side by side per view, per the SIDE-BY-SIDE LAW the keystone lane
already carries.
---
§8.14: *"build it before regenerating anything."* Operationally that is four waves, and the ordering
is load-bearing rather than ceremonial.
W0 — BUILD AND ARM. No asset is judged.
Build the four metrics. Assemble C1/C2/C3/C4 from what is already on disk. Run the arming proof and
publish it. **If a metric does not arm, it is REFUSED and the refusal is published — no threshold is
invented to rescue it.** That is the age_anchors precedent and it is the only thing that stops a
likeness lens from becoming a second copy_index.
W1 — RUN IT RETROSPECTIVELY OVER THE EXISTING LADDER. Still no regeneration.
Every artifact from S1 to S11 is on disk right now, for BOTH generator arms. Running the lens over
them costs render time and no generation, and it produces the attribution curve that adjudicates
RC1/RC2/RC3 with numbers instead of with argument. This is the deliverable that answers Josh's
question.
W2 — ONLY THEN REGENERATE, AND SCORE EVERY ARM AT EVERY STAGE.
This is what turns RC3's TRELLIS.2-native-PBR FIRST TEST into a measurement rather than an
impression: the native arm and the assembled arm are scored by the same lens, at the same stages, on
the same rig — which is the A/B law the standard already carries (§4, after a bench once compared
one lane's cavity-shaded clay against another lane's flat turnaround and read backwards).
W3 — IN-ENGINE, AT SHIP LOD. OWED on the engine lock (LOOKDEV_STANDARD.md §7 A-ENG-1..4).
Until it lands, every likeness number is off-engine working evidence and is labelled as such —
the standard's own rule, inherited without weakening.
Why the order is not negotiable. The current artifacts are the ONLY pre-change ladder that
exists. A regeneration run before W1 overwrites the evidence that says which stage is at fault, and
the post-mortem would have to be re-derived from an argument instead of read off a curve.
---
1. It cannot say the asset is good. Agreement with a plate is not appeal. The appeal rubric, the
cold judge and Josh keep that job, and the standard says so.
2. The reference is authored, not ground truth. The plates are generated images. If a plate is
wrong, a green lens is wrong with it. The lens measures agreement with the AUTHORED reference and
never claims more.
3. The plate/render domain gap is real and only partly removable. The plate's light is unknown
and cannot be de-lit (it is not a basecolor). Three of L10's four channels carry that
contamination; the fourth does not. They are published separately and never averaged.
4. Yaw is unsolved. L03's own limitation is inherited by L11 and is not fixed here.
5. The garment is masked out by ruling. "Whole-figure" therefore means whole *body* figure plus
head; the garment is compared against its own reference. Declared here so nobody reads more into
"whole-figure" than is there.
6. Nothing here is in-engine. Every number is off-engine working evidence until A-ENG-1..4 land.
7. This proposal asserts one licence fact it did not verify at the source: that OpenCV Zoo's
SFace ships permissive terms. That must be read at the model card on fetch and recorded per row,
on the hdri_set.json precedent. If it does not clear, L11 falls back to Tier-A-only and says so
rather than adopting a research-only weight.
---
| question | the artifact that answers it | which RC it adjudicates |
|---|---|---|
| Did the generated sculpt ever look like the plate? | L10 at S1, both generator arms | RC3 (invert the architecture?) |
| Which stage lost it? | the L10 delta series S1→S11 vs its C3 p90 band | RC1 |
| Is the loss in the head or the body? | L09 EAR_LINE + L10 per-region EMD on M_HEAD_FACE | RC2 |
| Is the head mushy at the size players see? | L12 at P3 ship-scale | RC2 |
| Is it still the same person? | L11 cosine vs the C1/C2 bands | RC2 / the named-missing rung (F5) |
| Was the graded frame even admissible? | P2 refusal on S9 (no de-light record) | F4 |
| Is L01-green-while-L10-falls real? | the two series on one axis | RC1, decisively |
---
DERIVED FROM (read in full):
docs/LOOKDEV_STANDARD.md (whole file) — §2 L55-77 the declared HDRI set + md5 pinning + licencerecording; §3 L81-109 the reference-geometry law and *"the rig is a constant and the subject
moves"*; §4 L113-139 the turntable sheet, the calibration lock (Standard/None/0.0/1.0) and the
A/B re-render rule; §5 L143-181 de-light mandatory + its declared limits + its refusals; §6
L185-220 the albedo band, the masking rule and the ratchet; §7 L223-275 the Guerrilla rule and
A-ENG-1..4; §8 L279-295 what is armed and what is not; §10 L358-368 where it plugs in; §11
L372-395 the honest limits.
harness/asset_factory/thousand_point_eval.py — docstring L1-92 (the three instruments, the derived-band doctrine, the vacuity control, the honest tier); VIEWS L121-131; figure_mask L583;
solve_camera L771; region_bands L906; lens_proportion L1040; lens_silhouette L1150-1229;
lens_face L2140-2180 with its _limitation; the head-band exclusion L1985-1990; emit_sheet
L2391-2450; render_head_for_face L2264-2280.
build/3d/eval/thousand_point/EVAL_A14_ASSET_TEXTURE_LEG.json — the full LENSES array, VERDICT,POINT_COUNTS, HONEST_TIER.
harness/check_lookdev_albedo.py (whole file) — the gate-that-arms-instruments doctrine.harness/gatelib.py L1-136 — baseline philosophy F1, vacuity guard F2, write_scorecard.harness/gates_config.json — the _note (DECLARED NOT-ARMED, must-fire/must-not-fire, ratchets, *"a check that is not in the runner is not armed"*) and the lookdev_albedo entry shape
(80 gates; lookdev_albedo verified present).
build/3d/finish_a14/ stage docstrings: graft_a14.py, close_shell.py, band_correct.py, seal_apertures.py, partition_and_uv.py, bake_plates.py, delight_atlases.py,
assemble_asset.py, render_textured.py, build_trousers.py; build/3d/cage/render_turntable.py
and build/3d/finish_a14/render_zoom.py (the lineage rule).
build/3d/finish_a14/renders/textured_tt/TURNTABLE_TEX_A14_TEX_V3.json — engine, flat_slots,HONEST_TIER.
harness/asset_factory/age_anchors.py L560-598 — the copy_index arming refusal and thenamed-missing identity embedding.
harness/asset_factory/age_keystones.py L150-195 — the licence survey that excludedInsightFace-class weights.
docs/proposals/music/MASTERPIECE_PROGRAM.md §11.4 L340-357; build/audio/exemplars/instruments/DYNAMIC_ARC_VALIDATION.md L132-145;
harness/music_gen/instr_dynamic_arc.py L710-720, L1996;
harness/music_gen/instr_hook_presence.py L1713 — the class-curve law and its measured proof.
build/3d/schema/anatomy_conformance_baseline.json _law — the shrink-only ratchet.docs/HANDOFF_2026-08-05_ACCOUNT_SWITCH.md §8.14 L2811-2843 — the charter, verbatim.E:/art/boards/D1-09/CHAR_0001/CHAR_0001_EXEMPLAR_BODY_14_V3_BALD_W1344.png and build/3d/finish_a14/renders/textured_tt/A14_TEX_V3_az000.png.
scikit-learn, no torch; C:/dev/venvs/face312 — mediapipe 0.10.21, opencv-contrib 4.11.0.86
with cv2.FaceRecognizerSF, cv2.FaceDetectorYN and cv2.quality all present, no onnxruntime.
NOT DERIVED (authored judgment, and why it had no canon home):
identity; spectral slope for render-scale read) — no canon or repo doc specifies a perceptual
metric; the constraint set (CPU, no torch, permissive licence, already-installed runtime) was read
off the box and the choice follows from it.
and the p75 / crossing-point / p90 threshold rules — the class-curve LAW is cited canon; the
specific corpora and percentiles are this lane's construction to satisfy it, and every one is
derived from a measured distribution rather than typed.
specifies P2's rig exactly and the repo already ships P1's instrument; splitting them by validity
window and adding P3 is this lane's judgment, forced by the fact that P2 cannot exist before S9.
§8.14 mandates "build it before regenerating anything"; the four-wave decomposition and the
reasoning that W1 must precede any regeneration because the current artifacts are the only
pre-change ladder are authored here.
trunks; no doc anticipated the collision.