render-compare-eval-loop
Use when validating a perception/reconstruction pipeline against reality (render-vs-capture, sim-vs-real, model-vs-measurement) — pin the metric semantics first, climb a staged fidelity ladder with th
SKILL.mdproject-trajectory/skills/render-compare-eval-loop/SKILL.md
GitHubWhen to use. Any loop whose acceptance is "the model's output matches the real signal to within X%". Why: the same render swung pass→fail→pass across three metric revisions (mean ΔE 4.89% vs per-channel std 11.08% on identical pixels) — metric semantics dominate the outcome, and same-view comparison silently degenerates into copying.
Procedure.
- Pin the metric BEFORE iterating: comparison space (fixed, even if the pipeline's internal space is a knob), statistic (mean vs distribution — std is tail-quadratic and can't be tuned to, only re-built to), channels + scales, pixel population. Flag interpretations as veto-able defaults and keep a previous metric as a reference column when it changes.
- Report std WITH mean bias (std is blind to a uniformly wrong answer), and name which channel binds.
- Climb a staged fidelity ladder (shapes → background → texture → config search), printing the error after each rung and every search trial — stagnation must be visible in the output, not inferred.
- Guard against saturation: the moment the model borrows appearance from the capture, same-view error is circular. Score on a novel view (a stereo pair's other eye is free; a second camera is stronger) and report coverage. State explicitly which layers the metric no longer tests.
- Done when: the bar is met on the discriminative (novel-view) form of the metric, the residual breakdown says where the next rung would attack, and any saturated/untested layer is named in the write-up.
Knowledge: FIELD-KNOWLEDGE-GILBERT.md §G3 (+ §G2 for the stereo substrate).