Skip to content

D330 — The README shows a recorded Atlas tour again, filmed by a test

Decision. This reopens D198. The README's hero is an animated WebP of the Atlas (docs/atlas/hero.webp): the graph, a search, a concept's links, colour by Map, a skill in the Artifacts panel, the Observatory. The tour is web/e2e/hero.spec.ts. In the e2e-web suite it runs over the fixture at full speed, and make hero runs it over the demo KB at a watchable pace, filmed through the browser's DevTools screencast in a headed window and encoded by web/scripts/record-hero.sh. Along with it, the README becomes a landing page: what Cartographer is for, what you get, a short Quick start, a ✓/— client matrix and links. Install details, upgrades, removal, configuration, build and structure live in docs/getting-started.md, docs/deployment.md, docs/sync.md and CONTRIBUTING.md.

Why. D198 removed the old demo because nothing noticed when it went stale and re-recording it needed a toolchain outside the build. Its consequences left the door open to "a way to go stale loudly". A tour that is itself a test gives that: a step the animation shows and the UI no longer offers fails CI on the next web change, and re-recording is one command over a generated, publishable KB. A static screenshot could not show what makes the product different. Cartographer is more than a wiki: the same KB carries the skills, subagents and hooks that configure every agent client, and a moving tour shows both sides at once. The cost is the part a test cannot check: a cosmetic change (spacing, colour) leaves the image behind until someone runs make hero, which needs a GPU, ffmpeg and img2webp, so it stays outside CI. It also adds up to ~20 MB per re-recording to the clone (1600 px, 30 fps: the maintainer chose sharpness over weight); the two screenshots it replaces weighed about 0.8 MB.

Alternatives rejected. - GIF. The living graph changes most pixels of every frame: the same tour was 11–25 MB as a 256-colour GIF against 4–6 MB as lossy WebP, which every current browser animates in an <img>. - Playwright's built-in video. It encodes VP8 at about 1 Mbit/s, which smears a dense graph and its labels before the WebP pass even starts; the first hero shipped that way and looked it. The screencast hands over each composited frame almost losslessly, at about 45 frames/s from a headed window. - MP4 or a video link. GitHub does not autoplay a repository video in a README, and a hero that needs a click is not a hero. - Hosting the image outside the repository (release asset, docs site). It keeps the clone lighter, but the image is no longer versioned with the UI it shows, and the maintainer preferred it in the repository. - Pixel baselines to catch cosmetic drift. D228 already rejects them: they break across runners and add maintenance. - Light and dark variants. Twice the weight and twice the recording for one impression; the 3D graph reads best on dark.

Consequences. hero.spec.ts must keep running in both modes: the beats are no-ops in the suite, and the recording-only settings (GPU, video, slow typing) stay behind HERO_RECORD. The demo KB (web/scripts/demo-kb.mjs) now ships skills, subagents, a hook and instructions so the tour has artifacts to show. They use no rand(), so the concept graph the benchmark measures is unchanged. A PR that changes what the tour shows re-records it in the same PR.