RC5_LIKENESS_LENS_PROPOSAL.md

pipelines/RC5_LIKENESS_LENS_PROPOSAL.md

RC5 — THE LIKENESS LENS (L09/L10/L11/L12): design proposal, proposal-tier

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.

---

1. THE FIVE MEASURED FINDINGS THAT DETERMINE THE DESIGN

Every design choice below answers one of these. Each is a fact on disk, not an opinion about the

turntable.

F1. No lens in the battery answers "does the WHOLE thing read like the plate"

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:

lenswhat it actually isverdict on the graded asset
L01_proportion10 girth sites vs BODY_AGE_14.jsonGREEN
L02_silhouette1-D contour distance per height, per viewRED
L03_face_structureProcrustes shape distance, 478 mediapipe landmarksRED
L04_toneREFUSED — "the mesh carries no texture"REFUSED
L05_colourREFUSED — sameREFUSED
L06_seam_continuity2nd difference of the radius profileAMBER
L07_anatomical_plausibilityladder-vs-research intervalGREEN
L08_equip_swap_readinesspreconditions P1-P4READY_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.

F2. The head band is EXCLUDED from the only whole-figure lens, with no arming condition

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):

large pointed elven ears, the single most distinctive silhouette feature on the subject.

ears 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.

F3. There is no comparable render BETWEEN stages, so nothing can be attributed

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.

F4. The frames Josh graded came from a SIGHTING instrument, on pre-de-light basecolors

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

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

lighting claim."`

build/3d/finish_a14/texture/ holds only tiles 1001/1002/1003, never 1021.

(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.

F5. The identity-embedding rung was NAMED as missing and never built

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.

---

2. WHAT THE LIKENESS LENS IS, AND WHAT IT IS NOT

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.

---

3. THE METRIC STACK — four instruments, each with a declared limit

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.

L09 — SILHOUETTE AGREEMENT, WHOLE FIGURE, HEAD INCLUDED

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.

L10 — WHOLE-FIGURE PERCEPTUAL SIMILARITY

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.

L11 — FACE IDENTITY EMBEDDING

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).

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"*).

L12 — TEXTURE READ AT RENDER SCALE

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).

---

4. THE RENDER PROTOCOL — what makes two stages comparable

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.

passinstrumentexists fromwhat it is FORwho reads it
P1 MEASUREMENT (material-blind)build/3d/cage/render_turntable.py constants, unchanged — BLENDER_WORKBENCH, one flat colour, cavity shadingS1 (raw sculpt) onwardthe SHAPE channel. Comparable across every stage because it does not require a texture to existL09, 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 frameS9 (a texture exists) onwardthe SURFACE and COLOUR channels, under the only light that makes a polish claim a claimL10 ch.3, L12
P3 SHIP-SCALEthe same camera at the target on-screen pixel footprintS9 onwardthe mush question, in the units the player seesL12

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.

---

5. THRESHOLD DERIVATION — calibrated from corpora, never hand-picked

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:

The four corpora, each with what it is FOR

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.

The threshold rules, stated so they cannot be hand-picked

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`).

The vacuity and positive controls (non-negotiable)

harness's existing rule.

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.

---

6. PER-STAGE WIRING AND FAILURE ATTRIBUTION

6.1 The stage ladder (the chain as it actually exists on disk)

idstagescriptoutput artifact
S0PLATES (the reference)E:/art/boards/D1-09/CHAR_0001/*_V3_*W1344.png (VIEWS, L121-131)
S1GENERATEHi3DGen / TRELLIS.2build/3d/v3/meshes/*
S2GRAFTfinish_a14/graft_a14.py (STAGE 1)graft/GRAFT_A14_*.obj
S3CLOSEfinish_a14/close_shell.py (STAGE 2a)retopo/CLOSED_A14_*.obj
S4BAND CORRECTfinish_a14/band_correct.py (STAGE 2b)band/*
S5SEAL APERTURESfinish_a14/seal_apertures.pygraft/*_SEAM_FINAL*
S6RETOPOAutoRemesherretopo/AUTOREMESHER_REPORT*.txt
S7FITbuild/3d/hi3dgen/fit_a14.pyretopo/*_fitted.obj
S8PARTITION + UVfinish_a14/partition_and_uv.py (STAGE 3)uv/A14_PARTITIONED.obj
S9BAKEfinish_a14/bake_plates.py (STAGE 4a)texture/A14_BASECOLOR.100{1,2,3}.png
S10DE-LIGHTfinish_a14/delight_atlases.py (STAGE 4b)no output on disk — see F4
S11ASSEMBLEfinish_a14/assemble_asset.pyuv/A14_ASSET.obj
S12IMPORT / IN-ENGINEOWED on the engine lock (LOOKDEV_STANDARD.md §7)

6.2 The chain manifest — one line per stage, and that is the whole integration cost

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.

6.3 The lens is a POST-STAGE pass, never in-stage

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.

6.4 THE ATTRIBUTION RULE

**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.

6.5 The head-band exclusion gets an arming condition (the F2 fix)

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.

6.6 Gate wiring

harness/check_likeness_lens.py --out harness/likeness_scorecard, on the **exact shape of the

existing lookdev_albedo entry** ({"script": ..., "args": ["--out", ...]}).

instruments 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"*).

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.

every 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.

---

7. THE NO-REGENERATION-BEFORE-THE-LENS SEQUENCING

§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.

---

8. HONEST LIMITS — what this lens cannot do

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.

---

9. THE FIRST NUMBERS W1 WOULD PRODUCE (what the director gets back)

questionthe artifact that answers itwhich RC it adjudicates
Did the generated sculpt ever look like the plate?L10 at S1, both generator armsRC3 (invert the architecture?)
Which stage lost it?the L10 delta series S1→S11 vs its C3 p90 bandRC1
Is the loss in the head or the body?L09 EAR_LINE + L10 per-region EMD on M_HEAD_FACERC2
Is the head mushy at the size players see?L12 at P3 ship-scaleRC2
Is it still the same person?L11 cosine vs the C1/C2 bandsRC2 / 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 axisRC1, decisively

---

10. DERIVATION

DERIVED FROM (read in full):

recording; §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.

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.

POINT_COUNTS, HONEST_TIER.

*"a check that is not in the runner is not armed"*) and the lookdev_albedo entry shape

(80 gates; lookdev_albedo verified present).

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).

HONEST_TIER.

named-missing identity embedding.

InsightFace-class weights.

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.

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.

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