Decks: what ruv.sgit.ai does, and how it changes the deck per persona
Status: a follow-up to 2026-10-25__brief__a-deck-per-persona.md, written after the editor named the site he meant ("It was ruv.sgit.ai. See how we created great slides there"). Not built. Author: story-site (claude-story-site), 25 October 2026. Read from the site's public pages on 25 October: https://ruv.sgit.ai/, talk/talk-10.json, talk/narration.html, articles/the-talk-player.html and articles/how-it-was-made.html.
What ruv.sgit.ai does
It is a talk, "Autonomy with a mandate and a memory" (Dinis Cruz, Agentic Engineering Live, London, 15 October 2026), built as data and played by a player.
- The talk is one JSON timeline,
talk/talk-10.json: a title, the event, the speaker,duration_s(698), asourceline ("every number on screen is read from data/report.json ..."), thedatafiles it reads, 26beatsand 2extras(untimed backup slides). - A beat is
id,at(when it starts),dur,title, aslide, andsay(the words to speak). Theslidehas alayout(statement,bullets,table,quote,image,video,terminal,iframe), aheadingandsub, itstextorsrc, afallbackimage, and optionalbuilds(lines that appear at a time within the slide),speed, androws_from(a table filled from a data file at load). - One deck, three narrations. The same slides are told three ways, for a CEO, a CTO and a developer, as
narration/ceo.json,narration/cto.jsonandnarration/dev.json. Each paragraph is timed to what is on screen and carries what the screen shows, the line from the talk it comes from, and the file behind every number; the narration's numbers come from a ledger (data/vaults-narrated.json), so the narration updates as the ledger grows. Each track downloads as a script (.md) and captions (.vtt), and can be read aloud by the browser's own voice. - Live slides: 23 of the 26 slides are live pages in iframes, all driven by one virtual clock (
assets/clock.js), so the player can pause, seek, speed up and step pages it did not write; a page declares its steps (window.RUV_STEPS). Every live slide has a recordedfallbackimage, used offline and in exports. - An offline file:
talk/offline-10.html, one self-contained file of about 2.6 MB. - Versions: v0.1.2 to v0.1.27, each fix tied to a version.
Its principles, in its own words: "The timeline is data, and the player validates it" (it refuses a timeline whose beats do not add up). "Nothing plays unless you press play." "The script is beside the slide, never on it." Numbers are read from data files at load time, "never typed in". "Each slide follows one small contract, so agents can build slides in parallel." Every key has a button. Slide titles sit in the same place on every slide.
How this changes the deck per persona
| The deck brief said | Now, after ruv |
|---|---|
| Seven decks, one per persona | One slide library and seven tracks. As ruv tells one talk three ways, the site keeps one set of slides from the evidence vault, and each persona is a track: which slides, in what order, and what is said over each, in that persona's words. A slide that changes changes in every track that uses it, so the delta is told once and seen by everyone it concerns. This is also the line's model (parts shared, ordered per role), so the two agree. |
| This site's own slide schema, "convertible later" | ruv's timeline format, as is. Beats with id, title, slide.layout, heading, sub, builds, say, fallback, rows_from; tracks as narration files. A deck from this site should play in ruv's player unchanged, so the player is reused, not rewritten. |
| Points carry their fact and status | Kept, and done ruv's way: a slide's numbers are read from the site's data files at load (rows_from, and the same for single figures), never typed into the deck. |
| PDF at 16:9 and 4:5 | Kept, from the fallback images and the static layouts; plus ruv's script (.md) and captions (.vtt) per track, which are what goes into a LinkedIn post's text. |
| A slider through the cuts | Kept. ruv's player already has the parts (seek, step, a slide picker, a review mode); the cut rail sits above it. |
The slide contract, so several members can write slides at once: one beat per slide, a stable id, one layout from the list, a heading in the same place on every slide, every number from data, every claim with its fact id and status, the words to say beside the slide and never on it, and a fallback image for every live slide. The build refuses a deck that breaks it, as ruv's player refuses a timeline that does not add up.
What the site has to solve that ruv did not
1. Live slides need the security policy changed. ruv's live slides are iframes of its own pages. This site's Content-Security-Policy allows frames only from https://dev.vault.sgraph.ai, not from itself, so an iframe of one of its own pages (the spectrum, the status bar) is blocked today. Adding 'self' to frame-src is a change to the policy, which goes to security for review and the editor's go. Until then every slide is static (statement, bullets, table, quote, image), which is enough for a debrief.
2. The player is ruv's code. Reusing it means vendoring player.html, assets/clock.js and sw.js with a note of where they came from and at which version, as the line's engine was; any inline script in it becomes a file, to fit the policy.
3. Cuts and tracks together. A cut freezes the slide library, the seven tracks and the fallback images together, so "compare two cuts" can say both "this slide changed" and "this slide is new in the Executive's track".
4. Timing is optional here. ruv's beats have times because it is a talk. A debrief is read, not played, so at and dur are kept (so it can be played, narrated and captioned) but the reader steps through at their own pace by default, which ruv already allows ("Nothing plays unless you press play").
Steps, revised
1. Vendor ruv's player and read three or four of its live talk files closely; fix this site's slide library as ruv-format beats.
2. The slide library from the vault, and the seven tracks; the desk reviews each track's words.
3. The first cut, by hand: the library, the tracks, the fallback images, the PDFs, the scripts and captions; /decks/ and the front-page card.
4. The cut rail, pin, play and compare; "since yours" in the line.
5. Live slides, once security has reviewed frame-src 'self'.
6. Cuts on a schedule, with the editor's go.
Decisions for the editor, updated
1. ~~Which site "Roof" was~~: ruv.sgit.ai.
2. One library and seven tracks, as proposed here, or seven separate decks.
3. Reuse ruv's player, vendored, as proposed, or a player of this site's own.
4. Live slides: ask security for frame-src 'self' now, or start static and ask later.
5. The cadence, who cuts, and LinkedIn: as in the first deck brief.