NEW TASK from Kavan, in two parts: PART 1 = fix round 3 (an independent check of your new final.mp4 found real defects), PART 2 = make the animation viewable as a plain HTML page. Do PART 1 first, then PART 2, then one final report. Your fix budget is still open (up to 6 rounds; this is round 3). You have up to 150 tool calls. WHY ROUND 3: three independent reviewers looked at final.mp4 at full resolution at 21 different times, without seeing your reports. All three agreed on the same blocking defect and several smaller ones. Their images are in folders A, B and C of the review images (files head_T.png, low_T.png, full_T.png): look at head_0.5.png and head_4.png first. The piston fix, the spring fix and the SPARK/ONE LAP separation are confirmed good. Do not undo them. PART 1 - DEFECTS, most important first 1. BLOCKING: THE WHOLE EXHAUST VALVE TRAIN IS ~60 px (30 mm) TOO FAR RIGHT. SPEC says valve axes are at x = -22 mm and +22 mm about the bore axis, i.e. screen x = 856 (intake, correct) and 944 (exhaust). Your exhaust stem, spring, cam and roller are at x = 1004 (+52 mm). In round 2 you moved the cam train from 1044 to 1004 to meet the stem, which locked in the misplacement: the real error was the exhaust STEM position (it was at 1004 in v1 as well). Consequences you can see: the exhaust valve head (x 980-1028) sits OUTSIDE the chamber (chamber/gas spans x 820-980), over the right bore wall and water jacket, so it can never open into the cylinder; the exhaust callout leader and the exhaust port dots end at x 944-948 where there is no valve; the red port dots are drawn across the stem and spring. Fix: move the ENTIRE exhaust column to axis x = 944: valve head (24 mm wide), stem, barrel, retainer, washer, spring, roller, cam (cam axis x = valve axis per SPEC), the cam housing/tower block, and anything else keyed to 1004 or 1044. Mirror the intake side (856 = 900 - 44) exactly. The exhaust head must then sit inside the chamber x-range, over the gas, and the port dots must end at the seat where the valve is. Check the two cams do not collide (88 px apart now; max lobe radius is 14 mm = 28 px each). 2. Dial: a stray slanted tick sits glued to the front of the label so it reads '\SPARK' (it is about 20-25 px outside the ring, not on it; the 330 deg spark tick should sit on the ring near x 1629, y 405). Put the spark tick on the ring at the right angle or remove the stray stroke. The short 90-degree ticks run through the '180 deg' and '540 deg' labels (a tick strikes through the '1'); move the labels outward. The red 'EX' label starts on the red arc; nudge it clear. The needle tip dot lands on 'IN' / 'EX' at some times (cosmetic: nudge labels if easy). 3. Callout leader lines: each anchor must land on the part it labels (intake valve head at (-22, 218) mm, plug at (0, 230) mm, exhaust valve head at (22, 218) mm, between valves at (0, 218) mm per SPEC). Today the 'OVERLAP' leader anchors at the plug tip and the exhaust leader at an empty spot. The leader lines also run diagonally across the whole engine (head hatch, gas, piston crown, right water jacket) like a scratch: route them so they do not cross the gas or the piston (for example draw them behind the engine group, or run them above the head and then out to the right). 4. The white SPARK flash at t=7.33 is clipped only to the bore width, so it paints over the piston crown, the top ring land and half of the wrist pin. Clip it to the chamber rect (crown to roof) so it never covers the piston. 5. Exhaust port looks broken: the intake port is a smooth curved band but the exhaust port is a jagged black wedge with a notch cut through the right edge of the head and no opening into the chamber; they should be mirror images (SPEC bezier). The left under-deck block is hatched and the right is plain grey: make them mirror-symmetric or deliberate. 6. Smaller things, your call if they are quick: the connecting rod and the crank web are the same grey (the rod merges into the web where they overlap: add a thin darker outline or slightly different shade to the rod); two grey rectangles above the head are offset ~45 px from the cam centres (check what they are; if they are stray, fix or remove); the HUD readouts truncate instead of round (329.85 shows 329): check the SPEC rule and follow it. 7. Remove the probe hook 'window.__hfRender = render;' from index.html before the final render (the measuring tool does not need it). HOW: copy final.mp4 -> final_v2.mp4 and review.mp4 -> review_v2.mp4 and index.html -> workspace/v2/index_v2.html first. Use the measuring tool, it now has two new checks that FAIL today for defect 1: node measure_engine.mjs (add --times and --shots DIR as before) New checks: valve axes mirrored about the bore axis, and both valve heads inside the chamber x-range. All checks must pass, at 12 or more times, before you render. Then look at full-resolution crops of the head at 0.5, 2, 5.5, 11, 13 and 25 s by eye (vision_analyze is for text and colour only). Then render review.mp4 and final.mp4, run the ffprobe gate (h264, 1 video stream, 1920x1080, 30/1, 32.0 s +/-0.05, no audio), append the round-3 numbers to REVIEW.md, REPORT.md and NOTES.md. PART 2 - VIEWABLE AS HTML (Kavan asked: 'is it viewable as html?', and wants YOU to build it). Today index.html cannot be opened by double click: its GSAP timeline is paused and only HyperFrames drives it, so a browser shows one still frame at t=0. Build player.html in four-stroke-2d (do NOT change index.html): ONE self-contained file made from the FINISHED index.html (copy after part 1 so the fixes are included): inline assets/vendor/gsap.min.js and assets/engine-state.js, same SVG/HUD markup and engine code, optional Google Fonts links for Inter and JetBrains Mono with the same fallbacks. Behaviour: the 1920x1080 stage scales to the window width keeping 16:9; a Play/Pause button; a scrub slider 0-32 s with a time readout; loops; drive it with requestAnimationFrame and tl.seek(t, false) (the false matters: the default suppresses the onUpdate that redraws). Autoplay unless prefers-reduced-motion is set (Kavan's Chrome reports reduce-motion, so make the Play button obvious). Optional deep link: open paused at a time from a hash like #t12.5. Test it in headless Chrome at three times (use the hash) and compare the screenshots against the same frames of final.mp4: they must match. Report the path and size, and add a line about player.html to REPORT.md. FINAL REPORT: per defect fixed or not fixed with evidence (measure tool output before/after), the ffprobe gate, the player.html test, files written. Be honest about anything still imperfect; your earlier report said 'nothing remains known-imperfect' and the independent check disagreed.