comp-spec, comp-diff, build-phase, font-match, and generate-image now decode any comp raster via loadRaster(), converting non-PNG input to <file>.png next to the source. Sessions used to hit 'not a PNG' and rewrite the .webp in place with PNG bytes, which broke transcript replay (a later step rewrites the comp beyond the cut) and left a mislabeled file.
AI-assisted (Claude Code).
Three simulated builds under the previous gate reached 78-83% overall with
the exploded plate placed and the table right, then spent 12-20 attempts
chasing 'contradicted' verdicts on a headline set in a substitute face and
on 50px chrome strips whose detail was paper grain. Text with structure
above the floor and its palette intact is drift; chrome and controls with
structure and palette held are drift. The adversarial set (swapped
columns, mirror, sepia, noise plate, tile shuffle) still fails.
isMain uses realpath on both sides so a skill mounted through a symlink
(Cursor, worktrees, staged evals) still runs its CLIs.
AI-assisted (Claude).
Co-Authored-By: Claude <noreply@anthropic.com>
From a forensics pass over twelve runs and two adversarial passes over
the metrics:
- comp-diff: detail is signed and penalizes invented energy; regions with
structure under 0.3 (or painted regions under 0.45 / added detail over
0.4) are contradicted whatever the mean says; palette ramp tightened;
region crops inherit the whole-image best translation so a shifted page
is not eight contradicted regions.
- hero gate: fails on any contradicted plate/image/text region (chrome and
controls keep the one-third allowance), on a capture that is not the
comp's frame, on a palette that is not the comp's, and on an organic
clip-path drawn inside a raster region's box.
- plates gate: scored against the comp crop with overlapping text/chrome
painted out (comp-spec plateReference; generate-image uses it too), with
a structure floor and an added-detail veto; the real plate passes, noise,
mirrors, mosaics, and other regions do not.
- comp-spec refuses a regions file that leaves comp ink unnamed.
- The direction-choice ping is folded into build-phase.mjs start
--direction --kind; the roll writes .impeccable/build/pending.json and
context.mjs / detect.mjs report COMP_ROUND_OPEN until the hero gate
passes. A code-led config makes start print the contract step and stop.
AI-assisted (Claude).
Co-Authored-By: Claude <noreply@anthropic.com>
generate-image.mjs --plate produces one raster region of the measured spec
from the comp crop, scores it against the crop, and refuses under --min.
The asset producer's job becomes producing the spec's plates. Detector
gains organic-clip-path (many-vertex polygon / curved path() clips) and
buried-raster (raster under a near-opaque wash or at near-zero opacity),
wired into both engines with fixtures.
AI-assisted (Claude).
Co-Authored-By: Claude <noreply@anthropic.com>
Dependency-free PNG codec, perceptual metrics (structure / color / detail /
bands), side-by-side + heatmap + per-region crops, a measured spec from the
approved comp (grid overlay, sampled palette, plate list), and a phase state
machine whose spec / plates / hero gates run the diff instead of asking the
model to remember the image.
AI-assisted (Claude).
Co-Authored-By: Claude <noreply@anthropic.com>