NEW TASK from Kavan: he watched final.mp4 and it is NOT acceptable yet. His 3-round fix cap from before is lifted: you now have up to 6 fix rounds. Fix everything below, re-verify by looking at real frames, re-render, and report. Do not argue the old verdicts: your earlier review passed these defects, so trust the evidence below and your own crops, not the contact-sheet scans. WHAT HE SAW (and I confirmed on frames at 0.5, 2, 4, 5.5, 7.3, 9, 11, 13, 15.5, 18, 20, 22.5, 25, 27, 29, 31 s of final.mp4): 1. THE PISTON IS NOT ATTACHED TO THE CRANK. The piston body (the grey block with 3 ring notches at its sides, about 150 px wide) is drawn FAR ABOVE the cylinder, floating over the cylinder head near the top of the engine area, and it moves the wrong way / by the wrong offset (tall stack at t=2, flat at t=0.5). Meanwhile the rod's small end and wristPin circle sit down in the bore with NOTHING attached: there is a black gap between the bottom of the blue/red gas block and the wrist pin. Fix: pistonG must follow the wrist pin exactly. Per SPEC.md the crown is flat at pinY+26 (the gas block's bottom edge), half-width 38, 3 rings at crown offsets -6/-13/-20, skirt down to pinY-34, wrist pin through the piston, rod joining wrist pin and crank pin in EVERY frame. I read the code and the likely root cause is this: the pistonG rects in index.html (around lines 74-84) are authored with the crown top at y=0 and the group 120 px tall (60 mm: crown to skirt), but the per-frame update (around line 511) sets transform translate(0 2*st.s), which is only the travel below TDC, so the piston is drawn near the very top of the viewBox. It should be translate(0 crownY) with crownY = 800 - 2*(st.pinY + 26), the same value you already compute two lines below for the gas block. Verify that, do not trust me blindly: also check the rest of the group (ring notches, skirt) lines up with the wrist pin once it is moved. Check numerically at t = 0, 2, 4, 5.5, 7.33, 9, 11, 13, 16, 20, 25, 31.7 s: piston crown y == gas block bottom y == wrist pin y minus 26 mm, in the same units, from the DOM (getBoundingClientRect or the SVG attributes), then confirm by eye on full-resolution crops. The solid grey piston must be visible between the gas block and the rod in every frame. 2. THE VALVE SPRINGS ARE FLOATING OR HIDDEN. The right (exhaust) spring zigzag is drawn OUTSIDE the head casting to the right, floating in the air beside the head. The left (intake) spring is partly hidden behind the head block (z-order). Per SPEC: spring wells at x = valveX +/- 14, y 246-280 INSIDE the head extents (x +/-66, y 212-280), seat washer at y 248 (fixed, stem hole +/-4), retainer on the stem at y = 284 - lift, coil zigzag 5 turns between washer and retainer. Both springs must sit inside their wells, be drawn IN FRONT of the head casting, touch the washer at the top and the retainer at the bottom, and compress/extend with the valve. Also check each valve stem runs continuously from the valve head up through the washer to the roller/cam follower with no gaps, and that the cam towers/rocker bits do not cover the springs. 3. The dial text collision: the 'SPARK' label next to '360' overlaps the caption 'ONE LAP = 720 deg CRANK = 360 deg CAM' (right side, around y 440-470 at 1920x1080). Separate them (move one, do not remove either). 4. LOOK FOR EVERYTHING ELSE WRONG. Do a proper pass on the engine area at the 16 times above, using FULL-RESOLUTION CROPS of the head, bore, rod and crank (not 360 px contact sheets), one picture call at a time (vision_analyze runs on Bolt now, a few seconds per frame, but it is only trustworthy for text and colour: for geometry use the DOM numbers). Things I want checked: every part that should touch actually touches (plug into the roof, valve heads on their seats when closed, rod to both pins, crank pin to crank web), no part floating, no part hidden behind another, leader lines that cross the whole engine, gas colour only inside the chamber above the crown (never on metal), no clipped or overlapping text anywhere. HOW TO WORK: - Before touching anything, copy the current deliverable: final.mp4 -> final_v1.mp4 and review.mp4 -> review_v1.mp4, and copy index.html -> index_v1.html. - Fix in index.html, keep the spark flash, gas colours, timing and the callouts working as they are now (they are correct). Re-run lint and check, snapshot at the 16 times, then render review.mp4 (draft) and final.mp4 (delivery) and re-run the ffprobe gate (h264, 1 video stream, 1920x1080, 30 fps, 32.0 s +/-0.05, no audio). - Append a new section to REVIEW.md and REPORT.md: what was wrong, the numbers before and after (piston crown y vs wrist pin y per time), what you fixed per round, anything you found beyond the three listed, anything still imperfect. - You have up to 150 tool calls in this turn. Work in short steps, write progress notes to NOTES.md as you go (round number, what changed), and end with a final report in chat that names the files and lists each defect as fixed or not fixed.