Repository navigation
feat(demo-recording-polish): 60 fps capture, drawn cursor + ripple, eased scroll, zoom rendered after the take - #404
Merged
Conversation
…ased scroll, zoom rendered after the take Playwright recordVideo encodes 25 fps vp8 at 1 Mbit/s realtime; demo films look stepped and the viewer cannot see clicks. New generic helpers (project-tests/e2e/demo-polish.js + selftest) capture with CDP screencast at device pixels, assemble a constant 60 fps, draw a Bezier cursor with a click ripple, scroll the real scroll container with easing, log clicks/focus/scrolls and plan a Screen Studio-style zoom from that log in a separate render pass. New skill skills/demo-recording-polish.md (rules, knobs, why zoom afterwards, measured results, failure modes), linked from record-demo-video.md; skill-routing row; install manifest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pple, cursor parking, narration holds Round 2 after looking at the first take's stills: zoom frames the element with 8% padding, centred or not at all (edge targets skipped, cut targets capped at 1.25x); ripple 0->60 px over 450 ms, dark ring + white halo; park() rests the cursor in a side gutter or beside the next target; a narration line already playing when a shot starts holds it. Selftest 25 rules. Skill and changelog carry the re-measured 82 s take. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MendixMau
force-pushed
the
feat/demo-recording-polish
branch
from
October 16, 2026 01:49
02d66e4 to
87741b5
Compare
4 tasks done
Stage 6 routing keeps master's rest-between-mendix-apps and this PR's demo-recording-polish. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
project-tests/e2e/demo-polish.js(installed astests/e2e/demo-polish.js, added toMXTK_PROJECT_TESTS) gives demo films:Page.startScreencastat device pixels (3840x2160 for a 1920x1080 viewport);render()pass that plans a Screen Studio-style zoom from that log and draws each frame from a fractional source rectangle in headless Chromium.demo-polish.selftest.jschecks 25 camera rules: lead, push-in, hold, zoom-out, the 1.75x cap, the 1.25x floor, merging, scroll boundaries, ending at 1x, cuts and a kept caption band. No browser or app is needed.skills/demo-recording-polish.mdcovers the method, the knobs, the camera rules, why the zoom is rendered afterwards, the measured results and the failure modes.record-demo-video.mdrules 5 and 6 link to it.skill-routing.tsvrow istest / 6 / ondemand. Routing outputs were regenerated withrender-routing.sh.Why
recordVideois built for test evidence: playwright-core 1.59videoRecorder.jsencodes at a fixed 25 fps,vp8 -deadline realtime -b:v 1M. In films, motion steps, there is no pointer,scrollIntoViewsmooth scrolling cannot be tuned, and a dense page cannot be zoomed.position:fixedcaption bands, popups and hit-testing;zoompanjudders because it rounds the crop to whole pixels.Measured (one read-only 82 s scene in a Mendix app, recorded both ways against the same data)
Changed frames use ffmpeg
mpdecimate=hi=64*4:lo=64*2:frac=0.1; the windows are approximate for the old take, because the two takes differ by a few hundred ms in their timing.recordVideo→ mux)demo-polish)r_frame_rate=30/1(source webm vp825/1), 2466 frames, 4.63 MBr_frame_rate=60/1, 4940 frames, 5.75 MBRound 2 changes (after looking at the first take's stills):
shots.json; a target cut by the edge never goes past 1.25x.park(): between actions the cursor rests in a side gutter or beside the next target, never mid-content.Read honestly:
The stills and videos stay in the recording project, not in this PR: they show a demo app's data.
How to use
Then run
node tests/e2e/demo-polish.js stats take/andnode tests/e2e/demo-polish.selftest.js, and look at four stills (see the skill).Checks
check-scripts: 116/116 shell, 24/24 node.render-routing --check: exit 0.check-skill-routing: all checks pass.check-pr-discipline: clean.check-portability: clean, 261 files.check-no-client-data: no client data in 1067 tracked files.check-no-private-citations: clean.install-tests.shinto a temp project copies both files, and the selftest passes there ("all camera rules held").No existing PR or issue covers this (searched open and closed: #6, #57 and #313 are the earlier demo-video skill; #237 is closed).
Update 2026-10-16
Merged origin/master (d1cbd41) into the branch (CHANGELOG-only overlap, no conflicts). Routing check re-run on the merged head. Output checked by eye: a synthetic take of a generic local page (no app data) was captured and rendered with the PR's own
startCapture,clickandrender; the still at the click shows the drawn cursor with the dark ring and white halo ripple on the target, andshots.jsonlisted the zoom as skipped because the target sat at the frame edge, as the camera rule says.node project-tests/e2e/demo-polish.selftest.js: 25 of 25 camera rules ok.Impact
bin/lib/skill-routing.tsvand its re-render (README.md,ROUTING.md,agents/test-agent.md,bin/gate-check.shstage map),bin/lib/install-manifest.sh(MXTK_PROJECT_TESTSgainsdemo-polish.js),skills/record-demo-video.md(rules 5 and 6 link to the new skill). Needs playwright (chromium) and ffmpeg on PATH; reads no artifact the gates produce.bin/render-routing.sh --checkon master (d1cbd41) and on this head: baseline 75,225 → 75,225 words (budget 80,000); Stage 5 test 21,667 → 21,667 and Stage 6 test 21,442 → 21,442. Row istest / 6 / ondemand, so the new skill costs 0 here.agents/test-agent.md, Context cost 0). The skill is situational text; the measured one-scene before/after above is the evidence.Size cap
Over the cap: 10 files (at the limit) but 662 changed lines excluding CHANGELOG against 400 (script 338, selftest 95, skill 212, other 17). Split plan if the maintainer wants it: (A)
demo-polish.js, its selftest and the manifest line, 433 lines, still 33 over on its own; (B) the skill, therecord-demo-video.mdlinks and the routing row, 229 lines. The script and its selftest are one unit, so a split only helps by moving the text out. Left whole pending a maintainer decision to waive or split.🤖 Generated with Claude Code