SkillsSkill for Claude

Tutorial back reference table

This skill takes the screens a new tutorial refers back to (a settings panel, an open menu, a dropdown list, a preferences page) and the exported files of the past episodes you pick by title (the same cut you published, so a second in the file is the same second in the public video), and returns a table of which episode showed each screen and at what second, with the frame it was checked on, the title read from that frame, a link to your own public video at that second and a line ready for your description or a pinned comment. Claude measures the episodes, compares each length with the public video's, prices them against your Vivu plan, uploads them to a private Vivu project, runs one precise search per screen, checks every returned window on a half second contact sheet, reads the title of each time it keeps from a full frame, and writes the table; you check it and paste the links yourself. Narration says "click here" and titles stop at the topic, so which panel was open, and when, is only in the picture. Vivu's search only suggests where to look: it can merge repeated openings of a menu into one window and skip brief ones, so every time in the table is checked against the video and a missing row never proves an episode did not show a screen.

Maintained by Vivu. Updated 2026-09-28.

Download

tutorial-back-reference-table.zip

13 KB. Unzips to tutorial-back-reference-table/SKILL.md. Upload the zip as it is in the Claude app, or unzip it into your skills folder for Claude Code.

SHA-256 8d4b4a4310e945602f6517696273200136c92fa1b09d194386c0e79edae50713

At a glance

What the Tutorial back reference table skill does, where it runs, what it needs, and when it asks
Looks forThe moment a settings panel, menu, dropdown list or preferences page is open on screen in your past episodes. Narration says "click here" and titles and chapters stop at the topic, so only the picture shows which screen was open and when. Every window Vivu returns is checked against your episode file on a half second contact sheet, and every time that enters the table has its title read from a full frame first.
Runs onClaude Code on your computer (the terminal or the Code tab of Claude Desktop), with a shell, ffmpeg and your episode files stored locally. No residential IP is needed because nothing is downloaded. It uses the Vivu connector and runs once per new episode, with no scheduler.
Needs
  • The Vivu connector with write access, to create a private project, open its upload page and search.
  • Your past episodes as the exported files you published, the same cut as the public videos, because every contact sheet, frame and link second comes from the local file; a raw recording usually still has the takes the published cut removed, so its seconds land elsewhere in the public video.
  • A shell with ffmpeg and ffprobe, to measure the episodes and cut contact sheets and frames.
  • An upload path: the Vivu upload page opened in your own browser, or a browser tool that can attach local files.
  • The public address and length of each episode, because every link in the table points at your own video and the length shows whether a file is the published cut.
Your Vivu planIndex minutes equal the total length of the past episodes you pick by title. Each screen uses one precise search, and a precise search uses 5 credits in total, so about 40 search credits for eight screens (estimate). Before anything is uploaded, Claude measures the episodes with ffprobe, shows them next to what vivu_get_usage reports for your plan and waits for your approval; if they do not fit, it suggests dropping the episodes whose titles are furthest from the screens before a larger plan.
Asks you firstConfirming, before upload, that the episodes are your own recordings, that any guest agreed, that a parent or guardian consented for any child who appears, and that you checked them for private details; approving the list of screens and the episode list, then the episodes' index minutes, before upload; asking for the published export of any episode whose file length does not match its public video; approving a rerun of any search that comes back full; and approving one sample row with its field mapping, after you open its link and see the screen, before the full table is written. Claude posts nothing, and any write you ask for outside the working folder needs its own approval of the destination and the lines.

The skill does its video work through the Vivu connector. If the connector is not in your Claude yet, add it first; the skill checks that it is connected before it does anything else.

Before you run it

  • Search results are candidates only: Claude checks every window on a half second contact sheet and reads the panel title from a full frame before a time enters the table.
  • Links take their second from your local file, so use the exported files you published, not raw recordings; Claude compares each file's length with the public video's and stops on a mismatch, and you open the sample row's link to check it lands on the screen.
  • When a menu opens several times in a single episode, Vivu can return one wide window and skip the later brief openings, and in our test run it missed a brief menu in a whole episode, so the table gives one checked time per screen per episode and a missing row does not prove the episode never showed the screen.
  • Queries work best when they name the title and labels at the top of the screen; a query that named field values matched a scrolled panel whose description still claimed those values, so titles in the table come from the frame, never from Vivu's text.
  • Use only your own recordings, not other people's videos or YouTube links, and get consent from any guest who appears, and a parent's or guardian's consent for any child.
  • Screen recordings can show email addresses, file paths or keys, so check them before upload; the project is created private because the default is visible to your whole Vivu organization.
  • Claude in Chrome uploads at most 10 MB per call, so recordings go through your own browser or the Vivu web app, never split or recompressed.
  • The videos stay in your Vivu project until you delete them.
  • Claude writes only local files and does not edit your video descriptions or post comments unless you approve a destination and the lines first.

Start it

Once the skill is installed, ask for the task in your own words. Naming the skill is the most reliable way to have Claude use it. For example:

My new episode refers back to the export settings panel, the file format list and the keymap preferences. Here is the folder with the exported files of my recent tutorials, and their YouTube links. Find where I showed each screen before and give me timestamp links for the description.

In Claude Code you can also type /tutorial-back-reference-table. Claude asks for anything the request leaves out, most important first.

What is inside

  1. When to use
  2. Working principles
  3. What you need before starting
  4. Inputs to collect
  5. Files and state
  6. Step 1: Check the Vivu connector and the setup
  7. Step 2: Pick the screens and the episodes
  8. Step 3: Measure the episodes and price them
  9. Step 4: Upload and index
  10. Step 5: Search each screen
  11. Step 6: Check every candidate on a contact sheet and read the title from a full frame
  12. Step 7: Write the table and the lines to paste
  13. Compliance
  14. Known failure modes

The full skill

This is tutorial-back-reference-table/SKILL.md from the download, as Claude reads it: the frontmatter first, then the instructions.

---
name: tutorial-back-reference-table
description: "Find which of your past tutorials showed each panel or menu, and at what second, with Vivu; get a checked table and timestamp links for your description. Use when a new episode reuses screens."
---

Back reference timestamps from your past tutorials

This skill takes the screens a new tutorial refers back to (a settings panel, an open menu, a dropdown list, a preferences page) and the exported files of the past episodes the creator picks by title (the same cut that was published, so a second in the file is the same second in the public video), and returns a back reference table: for each screen and each episode where it was found and checked, the minute and second, the frame it was checked on, the panel title read from that frame, a link to the creator's own public video at that second, and a line ready to paste into the description or a pinned comment. Claude measures the episodes, compares each length with the public video's, prices them against the user's Vivu plan, uploads them to a private Vivu project, runs one precise search per screen, cuts a half second contact sheet for every returned window, reads the title from a full frame, and writes the table. The creator checks it and posts the links.

The value is in what only the picture shows. Narration says "click here" or "open this", and titles and chapter names stop at the topic ("render output settings"); which panel or menu was on screen, and the second it opened, is only in the video. Vivu's search only suggests where to look. In our test run every window returned for the final wordings showed the screen that was asked for, but when the File Format list opened several times in a single episode Vivu returned one wide window around the first openings and skipped three later brief ones, and it missed a brief Add menu in a whole episode. So every window stays a candidate until a contact sheet and a full frame show the screen, the table gives one checked time per screen per episode, and a screen with no row in an episode may still appear there.

When to use

Use when a creator asks "which of my old videos showed the export settings?", "find where I demoed these panels before so I can link them", "build the back reference links for my new episode", or "make timestamp links to my earlier tutorials for the description".

Not for these:

  1. A one off question about one video ("when does the preferences window open in this file?"): search Vivu directly and look at the frames.
  2. A whole channel at once. Pick the five to eight episodes whose titles touch the screens (Step 2); indexing dozens of episodes does not fit a monthly plan.
  3. Finding what was said (a phrase, an explanation): use the captions or transcript. This skill finds what was on screen.
  4. Chapters, cuts, clips or captions. Vivu only finds moments; editing stays in the creator's editor.
  5. Other people's videos or YouTube links. The skill works on the creator's own recordings only.

Working principles

  1. Report measured numbers, not estimates. When a number is an estimate, say so.
  2. Nothing is verified until it has been checked against the source video. Vivu's windows are candidates; a time enters the table only after its contact sheet shows the screen and its title has been read from a full frame.
  3. Stop and tell the user when a required capability or tool is missing. Do not guess around it.
  4. Ask the user before anything that is expensive to redo (the episode list and its index minutes, before upload; a rerun of a full search) and before writing the full table (one sample row first). The skill posts nothing; the creator pastes the links.
  5. Titles in the table come from the frame, never from Vivu's reason text, which can name controls that have already scrolled off screen.
  6. A missing row is not proof. Search can merge repeated openings into one window and skip brief ones, so the table and the summary never say an episode does not show a screen.

What you need before starting

Check each item at the start of the run and tell the user plainly what is missing before doing anything else.

Requirement Why How to check
Vivu connector with write access create a private project, open its upload page, search vivu_get_account shows can_create_projects: true (tool names may carry a server prefix). A write call failing with "has not granted vivu.write" means the user reconnects Vivu and allows write access
The past episodes as the exported files that were published, on the user's computer (the same cut as the public videos, not the raw recordings) Vivu indexes the files it is given, and every contact sheet, frame and link second is taken from the local file, so its timeline has to match the public video's. A raw recording (an OBS or ScreenFlow original) usually still has the takes and pauses the published cut removed and lacks an intro added later, so its seconds land somewhere else in the public video ffprobe -v error -show_entries format=duration -of csv=p=0 "FILE" prints a length for each file, and Step 3 compares it with the public video's length
A shell on that computer with ffmpeg and ffprobe measure the episodes, cut contact sheets and frames ffmpeg -version, ffprobe -version
An upload path move the files into Vivu vivu_open_upload_page plus the user's own browser, or a browser tool that can attach local files
The public address and the public length of each episode every link in the table points at the creator's own video, and the length is how Step 3 spots a file that is not the published cut every row of episodes.csv has a video address (for YouTube a watch?v=, youtu.be/, /live/ or /shorts/ link; for another platform, one whose timestamp form is known, see Step 7) and public_length as the video page shows it

This skill needs Claude Code on the user's computer (the terminal or the Code tab of Claude Desktop), because it reads local files and runs ffmpeg. Claude on the web and cloud sessions cannot reach the files. It downloads nothing, so no residential IP is needed. Nothing recurs, so no scheduler is involved; run it once per new episode.

Inputs to collect

Ask for anything missing, most important first.

  1. SCREENS: the screens the new episode refers back to, usually six to ten. For each one, its name as it appears on screen (the panel title, the menu name, the popup heading) and two to four labels visible at its top. Required.
  2. EPISODES_DIR and the episode list: the folder with the exported files of the past episodes as they were published, and for each episode its file, its title, its public address and its length as the public video page shows it. Required. If the user is unsure which episodes to include, Claude suggests some from the titles in Step 2.
  3. WORK_NAME: a short name for the working folder and the Vivu project. Default: the new episode's working title.
  4. LINK_OFFSET: how many seconds before the checked frame each link lands, so viewers see the click that opens the screen. Default: 1.
  5. The line format for the description. Default: "SCREEN, shown in EPISODE_TITLE at M:SS: URL".

Files and state

Keep everything in one working folder next to EPISODES_DIR:

backref-WORK_NAME/
  config.json            screens with query and maximum_results, Vivu project id, LINK_OFFSET, line format
  episodes.csv           file, listed_name, title, public_url, public_length, duration_s, video_id
  results/               one JSON per screen: search results without the result page link
  sheets/                contact sheets, one set per checked window
  read/                  full frames the titles were read from
  candidates.csv         every window Vivu returned, with its check outcome
  back_reference.csv     one row per screen per episode with a checked time
  description_block.txt  the lines to paste
  state.json             steps done, files uploaded, screens searched with job ids, windows checked

The commands in Steps 3 and 6 run from the folder that holds both EPISODES_DIR and backref-WORK_NAME/, so their relative paths resolve.

A rerun reads state.json first and skips finished steps: a file marked uploaded is not uploaded again, a screen with a saved result is not searched again, and a window with a recorded outcome is not checked again. A later episode gets its own working folder; if it draws on the same past episodes, copy the project id from the earlier folder's config.json and reuse that Vivu project instead of uploading them again.

Step 1: Check the Vivu connector and the setup

Goal: confirm every requirement before spending anything.

  1. Call vivu_get_account. If the tool does not exist, tell the user to add the Vivu connector in Claude (https://mcp.vivu.ai/mcp) and stop. If the account does not show can_create_projects: true, or a later write call fails with "has not granted vivu.write", ask the user to reconnect Vivu and allow write access, then stop until they have.
  2. Run ffmpeg -version and ffprobe -version.
  3. List EPISODES_DIR and run the ffprobe length command on one file.

Done when vivu_get_account shows can_create_projects: true, ffmpeg and ffprobe print their versions, and ffprobe prints a length for a file in EPISODES_DIR.

Step 2: Pick the screens and the episodes

Goal: a short list of screens and a short list of past episodes worth indexing.

  1. Write each screen into config.json with its on screen name and the labels at its top, for example "Render Engine dropdown: Eevee, Workbench, Cycles". The search matches words and shapes that are on screen; values that change from episode to episode (a resolution, a file name) are poor anchors (Step 5 says why).
  2. Pick episodes by title. List the titles in EPISODES_DIR (or the ones the user pastes from their channel) and keep those whose topic touches the screens, five to eight of them. Titles are text, so this costs nothing; indexing every episode would.
  3. Write episodes.csv with file, title, public_url and public_length (the length the public video page or YouTube Studio shows, as M:SS). The file is the exported episode that was published, not the raw recording, because every link takes its second from the file. Add listed_name: the file name with spaces and punctuation replaced by underscores (hyphens and the dot before the extension stay), because that is how Vivu lists names. If a name still does not match after upload, Step 4 matches by length instead.
  4. Confirm the Compliance items with the user.

In our test run the screens came from an assumed outline and the episodes were picked by title from the series; confirming both with a creator was not exercised in our test run.

Done when the user approves the screen list and episodes.csv.

Step 3: Measure the episodes and price them

Goal: an indexed set the user's plan can pay for, approved before upload.

  1. Run the ffprobe length command on every file in episodes.csv and write duration_s.
  2. Compare duration_s with public_length for every episode. The page shows whole seconds, so up to a second of difference is rounding. If they differ by more than 1.5 seconds, stop for that episode and tell the user: its file is not the cut that was published (a raw recording, or an export made before a later edit), so every link from it would land on the wrong second of the public video. Ask for the exported file that was published. A creator who no longer has it can download their own upload from YouTube Studio (Content, the video's Options menu, Download). If neither is possible, leave the episode out and say which one. Matching lengths do not prove the same cut, which is why Step 7 asks the user to open the sample row's link.
  3. Call vivu_get_usage and show one table:
These episodes Plan allowance Remaining this month
Index minutes sum of duration_s / 60 from vivu_get_usage from vivu_get_usage
Search credits 5 per screen, 40 for eight screens (estimate), plus 5 for each rewording or rerun from vivu_get_usage from vivu_get_usage

Plan facts: Free is $0 a month with 20 index minutes a month and 50 search credits a month; Premium is $30 a month with 180 index minutes and 500 search credits. A precise search uses 5 credits in total. On Free, the minutes cover about two ten minute episodes a month (estimate), so a Free user starts with the two episodes most likely to show the most screens.

  1. If the episodes do not fit, offer levers in this order: drop the episodes whose titles are furthest from the screens, split the list across two months, and only then move to a larger plan. Never drop an episode the user asked for without saying which one, and never trim or recompress a file to save minutes.

The account used in our test run returns no allowance figures, so the comparison with a real plan and the user's approval were not exercised in our test run.

The files in our test run were the public videos themselves, so their seconds matched the public videos by construction; comparing duration_s with public_length, a file cut differently from its public video and the YouTube Studio download were not exercised in our test run.

Done when every episode left in episodes.csv has a duration_s within 1.5 seconds of its public_length, the user approves the episode list and its index minutes, and config.json records both.

Step 4: Upload and index

Goal: every approved episode indexed in a private Vivu project.

  1. Call vivu_list_projects and reuse a project named "Back references WORK_NAME" if one exists. Otherwise call vivu_create_project with that name and visibility "private". The default visibility is organization, which shows the project to everyone in the user's Vivu organization, and tutorial recordings can show email addresses, file paths or keys in a corner of the screen.
  2. Call vivu_open_upload_page with the project ID immediately before uploading. The link expires in 180 seconds and works once, so never post or store it. Give it to the user to open in their own browser and select the files, or open it in a browser tool that can attach local files. Claude in Chrome accepts at most 10 MB per upload call and screen recordings are usually larger, so they normally go through the user's own browser or the Vivu web app. Never split or recompress a file to fit.
  3. Poll vivu_list_videos until every file shows ready. Match each Vivu file name to episodes.csv by listed_name. When a name does not match (file names taken from episode titles often carry commas, apostrophes, # or &), match by length instead: vivu_list_videos reports duration_ms, so compare it with duration_s in milliseconds. Record each video_id in episodes.csv and state.json.

In our test run the 6 episodes (32.81 minutes) were all ready 574 seconds after the upload started. Each duration_ms equaled the ffprobe length of its file, and the hyphens in our file names were kept, so every name matched listed_name and the length fallback was not exercised in our test run. They went through the upload page with an automated browser, so opening the link in the user's own browser was not exercised in our test run.

Done when every file in episodes.csv shows ready and has a video_id.

Step 5: Search each screen

Goal: a saved list of candidate windows for every screen.

One precise search per screen, side by side, because each screen is its own row group in the table. The chain behind each row: the precise search suggests windows, the contact sheet finds the tile where the screen is open, the full frame confirms its title, and the table takes that second. Every search is precise because only precise returns a time window; fast returns whole files with an empty reason, and the episodes are already a chosen set. There is no switch to speech: narration names a panel before or after it opens, and a back reference link needs the moment it is on screen.

These are the wordings from our test run, on tutorials for one 3D program. Write the user's queries the same way: the screen's on screen name, where it is, and two to four labels visible at its top.

Field Query Mode maximum_results
render_engine_menu the Render Engine dropdown is open in the render properties panel, showing the list Eevee, Workbench and Cycles precise 10
render_menu the Render menu is open from the top menu bar, listing Render Image, Render Animation and View Render precise 10
file_format_menu a small popup titled File Format is open for a few seconds, listing image file types and movie file types to choose from precise 10
dimensions_panel the Dimensions panel header at the top of the Output properties, with the Resolution X and Resolution Y pixel fields and the blue 100% resolution bar visible under it precise 10
metadata_panel the Metadata panel is open in the Output properties, a list of checkboxes for Date, Time, Render Time, Frame and Camera with a Burn Into Image option precise 10
keymap_prefs the Preferences window is open on the Keymap section, with the Select with Left or Right mouse button option precise 10
add_menu the Add menu is open in the 3D viewport, listing Mesh, Curve, Light and Camera precise 10
light_properties the light properties panel in the Properties editor, with Point, Sun, Spot and Area buttons, a Color swatch and a Power value precise 10

The file_format_menu and dimensions_panel wordings were tuned on our test corpus, each after 2 rewordings on the same corpus; the others are first wordings. Name labels, not values: a wording that named the panel's field values matched windows where the panel had scrolled and those fields were gone, while the reason still described them. A new wording for the user's software is untested until its first windows have been through Step 6.

maximum_results is 10 because five to eight episodes rarely show one screen in more than a few places each, and it is also the ceiling on how many windows come back. If a search returns exactly its maximum_results, tell the user and, once they agree, run it again with 30 (5 more credits, estimate).

That rerun with a larger maximum_results was not exercised in our test run.

How far to trust the searches: with the final wordings, the windows that came back on our test corpus showed the screen asked for, including when a neighboring panel or menu looked much the same, but the searches did not return every time a screen was opened, and brief or repeated openings were the ones left out. Treat recall from picture search as weak: every window goes through Step 6, and a missing row proves nothing.

Run each query with vivu_search_videos (project_id, query, mode, maximum_results). It returns a job ID. Call vivu_get_search_results until complete is true; each status call can wait up to 45 seconds, so a pending search is not a stalled one. Save each completed result as results/FIELD.json without its result_page_url field, and record the job_id in state.json. Show the Vivu result page link in the live reply only; it expires after four hours, so it never goes into a saved file or the table.

Done when every screen has a completed result saved in results/, and any search that returned exactly its maximum_results has been run again with the user's approval or is marked capped in state.json.

Step 6: Check every candidate on a contact sheet and read the title from a full frame

Goal: for each screen and episode, the earliest window that really shows the screen, with its title read from a full frame.

Sort each screen's windows by episode and start_ms (Vivu does not return them in time order). For each screen and episode, take the earliest window and cut contact sheets from the local file at two frames a second:

mkdir -p "backref-WORK_NAME/sheets" "backref-WORK_NAME/read"
ffmpeg -v error -y -ss START -to END -i "FILE" -vf "fps=2,scale=480:-2,tile=5x4" "backref-WORK_NAME/sheets/FIELD_STEM_STARTMS_%02d.png"

FIELD is the screen's field name, FILE the local episode file (EPISODES_DIR/ followed by its file name), STEM the file name without its extension, STARTMS the window's start_ms, and START and END the window's start_ms and end_ms divided by 1000. Keep the double quotes around FILE and every backref-WORK_NAME path in these commands: episode file names and the default WORK_NAME often contain spaces, brackets or plus signs, which the shell would otherwise split or expand (zsh stops on brackets with "no matches found"). Each sheet holds 20 tiles covering about 10 seconds; tile k on sheet n (both counted from 0, left to right and top to bottom) is at roughly START + 10 * n + k / 2 seconds. ffmpeg numbers the sheet files from 01, so the file ending _01 is sheet 0, _02 is sheet 1, and so on. The -y flag lets a rerun overwrite a sheet instead of stopping.

  1. Look at every sheet of the window and find the first tile where the screen is open: the dropdown list, the menu, the popup or the panel, recognizable by its shape and layout. Tiles are too small to read, so the shape only says where to look.
  2. Extract a full frame half a second after that tile's time, T:
ffmpeg -v error -y -ss T -i "FILE" -frames:v 1 "backref-WORK_NAME/read/FIELD_STEM_TMS.png"

TMS is T in milliseconds. A tile can show a frame slightly later than its computed time, so the frame at the tile's own time often still shows the screen closed. If the full frame does not show the screen, add half a second to T and extract again, up to the end of the window. 3. Read the title and the labels from the full frame and compare them with the screen asked for. A neighboring panel, another dropdown in the same panel or a different menu is a rejection, whatever the reason says. If the title is too small to read (a recording made at a high resolution and scaled down, or a zoomed out screen), crop the quarter that holds it and enlarge it:

ffmpeg -v error -y -ss T -i "FILE" -frames:v 1 -vf "crop=iw/2:ih/2:X:Y,scale=iw*2:-2" "backref-WORK_NAME/read/FIELD_STEM_TMS_zoom.png"

X is 0 for the left half or iw/2 for the right half, Y is 0 for the top half or ih/2 for the bottom half. This crop command was not exercised in our test run: every title there could be read on the full frame, and the earlier crops used to settle doubtful frames were cut differently. 4. A window whose tiles and frames never show the screen is rejected: write what they show instead (for example "Edit menu open, not the Render menu") and move on to the next window of that screen in that episode. 5. Once a screen has a checked time in an episode, its later windows in that episode still get a contact sheet, so candidates.csv says for every window whether the screen is in it ("later window, screen shown" or "rejected"). They need no full frame, because the table takes one time per screen per episode. Rejected windows stay in candidates.csv with their note and never enter the table. 6. If a window's reason describes a quick dropdown but no tile shows it, the dropdown may have opened between tiles. Run the sheet command on the few seconds around it with fps=10 instead of fps=2 before rejecting it. (Our test looked at such a moment on frames cut a tenth of a second apart from a crop of the panel; this exact fps=10 command was not exercised in our test run.)

Record every window in candidates.csv (screen, episode, start and end, outcome, sheets, frame, note) and in state.json.

Worked example from our test run

The test corpus was public: 6 official Blender tutorials published under a Creative Commons license (32.81 minutes) from one series, so neighboring panels and menus of the same program appear throughout. The recordings were full screen at 1080p and were indexed at 720p, where panel titles are small. The local files were the public videos themselves, so a second in a file was the same second in its public video by construction; a local file cut differently from its public video was not exercised in our test run.

Before any search the screens and their neighbors were marked by hand on coarse contact sheets. After the search, frames inside returned windows showed brief openings those marks had missed, and part of one stretch marked beforehand as a neighboring screen (the Output panel with the Dimensions panel collapsed or scrolled away) showed the full Dimensions panel on its frames; both were added to the marks. 5 of the 27 windows below, in the Render Engine, Render menu, Add menu and Dimensions results, match only these later marks. Each of them showed the screen asked for on its frames, so they count as real here; judged against the marks made before the search alone, they would have counted as false. The missed counts below cover only what the marks or a search caught.

  1. Render Engine dropdown: 4 returned, 4 real, 0 false, 1 missed. The missed one was a quick reopening that no window covered.
  2. Render menu: 8 returned, 8 real, 0 false, none missed.
  3. File Format list, with the wording in the table after 2 rewordings on the same corpus: 1 returned, 1 real, 0 false, 3 missed. The list opened several times in a single episode. Vivu returned one window, 25.2 seconds wide, that covered the earlier openings, and 3 later, shorter openings in the same episode were missed with all three wordings. By the recall formula of our test (true windows against true windows plus missed openings) that is 1 of 4, although the one window held more than one opening; counted per episode, which is what the table uses, the only episode with this list got its row.
  4. Dimensions panel, with the wording in the table after 2 rewordings on the same corpus: 6 returned, 6 real, 0 false, none missed. The previous wording named the panel's field values and returned 7 windows, 5 real and 2 false; in the false ones the resolution fields had scrolled off screen while the reason still said they were visible.
  5. Metadata panel: 1 returned, 1 real, 0 false, none missed. It appears in a single episode, so this is a small sample.
  6. Keymap page of the preferences: 1 returned, 1 real, 0 false, 1 missed, a second visit to the same page later in that episode.
  7. Add menu: 4 returned, 4 real, 0 false, 1 missed. The missed one was the only Add menu in the Right Click Select episode, a brief opening, so that episode got no Add menu row although it shows one.
  8. Light properties: 2 returned, 2 real, 0 false, none missed.
  9. Across the final wordings that is 27 windows, all 27 real by their frames, 5 of them only after the later marks described above. No window came back for a neighboring screen on its own (another dropdown in the same panel, the Edit and View menus, the right click menu, other preference pages, other property tabs): the Add menu window that ran on into a right click menu also held the Add menu, and the window inside the stretch first marked as a neighbor showed the full Dimensions panel.
  10. The 6 episodes were ready 574 seconds after the upload started, and the eight searches with the final wordings completed 98 to 181 seconds after they were submitted; they were polled one after another, so the search times are upper bounds.
  11. Every window of the final wordings got a contact sheet, and the earliest window of each screen in each episode also got a full frame. Each of those earliest windows showed the screen on its sheet and its full frame, and every title could be read on the full 720p frame without cropping. In one later window the Render Engine list was open so briefly that it showed on no tile of the half second sheet, only on frames a tenth of a second apart, which is what the fps=10 variant in Step 6 is for. Several frames taken at a tile's computed time showed the menu still closed, which is why Step 6 extracts the frame half a second later.

Done when every window in results/ has a line in candidates.csv, and every screen and episode with a window has either a checked time or only rejected windows.

Step 7: Write the table and the lines to paste

Goal: a table the creator can check against their own videos and paste from, without opening Vivu.

Show the user one sample row and the field mapping. Ask them to open the sample row's link: the public video should show the screen at that second, or open it within a second or two (LINK_OFFSET). Wait for an OK before writing the rest:

screen,episode_file,episode_title,mm_ss,seconds,frame_path,panel_title_read_from_frame,public_url_with_t,description_line,status,coverage_note
File Format list,tut_Gifto41kpJw.mp4,Render Output Settings,01:34,94,read/file_format_menu_tut_Gifto41kpJw_95300.png,"File Format popup: Image column (BMP to Targa Raw) and Movie column (AVI JPEG, AVI Raw, FFmpeg video)",https://www.youtube.com/watch?v=Gifto41kpJw&t=94,"File Format list, shown in Render Output Settings at 1:34: https://www.youtube.com/watch?v=Gifto41kpJw&t=94",VERIFIED,"This episode may also show this screen earlier or later than this time, and an episode with no row for this screen may still show it; search did not return every opening"

The row above is from our test run; the user's rows carry their own screens, files and addresses.

If the link lands somewhere else, stop: that episode's file is not the cut that was published, so none of its rows can be used. Tell the user, and go back to Step 3 for that episode with the exported file that was published; uploading it again costs index minutes, so it needs the user's approval. The length check in Step 3 does not catch an edit that kept the length, so also ask the user to open one link from each other episode before posting.

Column Source If unavailable
screen config.json none
episode_file, episode_title episodes.csv, matched by listed_name or by length (Step 4) keep the row with Vivu's file name and tell the user
seconds the whole second of the checked frame's T, minus LINK_OFFSET, never below 0 none
mm_ss seconds written MM:SS none
frame_path the full frame from Step 6 none; without it the row is not VERIFIED
panel_title_read_from_frame read by Claude from the frame (inferred) left blank, status NOT VERIFIED
public_url_with_t public_url with the time added. For a YouTube address in any form (watch?v=, youtu.be/, /live/ or /shorts/, with or without ?si= or other parameters), take the video ID and write https://www.youtube.com/watch?v=ID&t=SECONDS, so no link ends up with two question marks. For Vimeo, the address plus #t= and the seconds with an s (#t=94s). For another platform, its own timestamp form blank when the form is unknown, and tell the user
description_line the line format from Inputs none
status VERIFIED; NOT VERIFIED when the row has a frame but its title could not be read, even after the crop in Step 6 (the row stays out of description_block.txt); NOT FOUND for a screen with no checked time in any episode none
coverage_note fixed text: "This episode may also show this screen earlier or later than this time, and an episode with no row for this screen may still show it; search did not return every opening" none

Write back_reference.csv with one row per screen per episode that has a checked time, sorted by screen and then by time. A screen with no checked time anywhere gets one NOT FOUND row with the note "no checked window; this does not prove the episodes never show it". Write description_block.txt with the description_line of every VERIFIED row, grouped by screen. Both use the creator's own public addresses, never a Vivu result page link, so they keep working after that link expires.

Then tell the user, per screen, how many windows Vivu returned, how many showed the screen and how many were rejected, which episodes have a row and which searched episodes do not, and say plainly that an episode without a row may still show the screen, and that an episode with a row may show it again at other times. If the user remembers a screen in an episode without a row, cut a contact sheet over the minutes they remember with the Step 6 command; it costs no credits.

The table and the lines are the creator's to check and post. If the user asks Claude to put them somewhere (a video description, a pinned comment, a document), name the destination, show the rendered lines and wait for a yes before each write.

In our test run the table, the lines and candidates.csv were written from the dry run's windows and frames; showing the sample row to a creator, opening its link and posting the lines were not exercised in our test run. Every screen had a checked time in some episode, so the NOT FOUND row was not exercised in our test run, and only watch?v= addresses were used, so rewriting other YouTube address forms and Vimeo links was not exercised in our test run either.

Done when back_reference.csv and description_block.txt exist, every VERIFIED row has a frame in read/, the user opened the sample row's link, saw the screen there and approved the sample row and the mapping, and state.json marks the run done.

Compliance

  1. Use only the creator's own recordings. Do not import other people's videos or YouTube links; the links in the table point at the creator's own public videos. Confirm this before Step 4.
  2. If an episode has a guest on camera or on a call, the guest's consent to uploading the recording to a third party service is needed. If a child appears, upload that episode only with a parent's or guardian's consent; otherwise leave it out. Confirm before Step 4.
  3. Screen recordings can show email addresses, file paths, API keys or client files. Ask the user to check the episodes before upload, and create the project as private; the default is visible to the whole Vivu organization.
  4. The videos stay in the user's Vivu project until the user deletes them. Delete videos or the project only when the user asks, and confirm first.
  5. The skill writes only local files. It does not edit video descriptions, post comments or publish anything; any such write goes through the approval in Step 7. It does no face, logo or identity recognition.

Known failure modes

Symptom Cause Fix
(observed) a menu that opens several times in a single episode can come back as a single wide window: the File Format list returned 1 window of 25.2 seconds, 1 real, 0 false, and 3 later openings in that episode were missed Vivu can merge nearby openings into one wide window, and a brief reopening may not come back as a window of its own the table needs one time per episode, so keep the checked time; the coverage note says other openings may exist; to list every opening, cut contact sheets outside the window locally
(observed) a brief Add menu that was the only one in its episode never came back: 4 returned, 4 real, 0 false, 1 missed a brief opening can be missed by the search an episode without a row may still show the screen; if the creator remembers it, cut a contact sheet over that stretch (Step 7)
(observed) with field values in the query, the Dimensions search returned 7 windows, 5 real and 2 false, and the reason said the panel "is fully visible, displaying Resolution X" while the fields had scrolled away the reason repeats the query instead of describing the frame name the title and labels at the top of the screen, not values; read the title from the full frame
(observed) the full frame taken at the computed time of the first tile that shows a menu has the menu still closed a tile can show a frame slightly later than its computed time step forward half a second and extract the frame again (Step 6)
(observed) a dropdown that opened for a fraction of a second appears on no tile of the sheet it opened and closed between two tiles cut the few seconds around it at fps=10 before rejecting the window
(observed) a window ends on a neighboring menu (a right click menu after the Add menu) windows are wider than the moment they contain judge only the tiles where the asked screen is open, and take the time from those
(observed) "Not overwriting - exiting" when extracting a frame the output file already exists and ffmpeg asks before overwriting keep -y in the commands, as in Step 6
upload page asks to sign in or shows an error the one time upload link expires after 180 seconds request a new link right before opening it
a file is rejected by the browser upload tool the tool accepts at most 10 MB per call the user adds the file in their own browser or the Vivu web app
"has not granted vivu.write" Vivu connected read only the user reconnects Vivu with write access
a result's file name does not match episodes.csv Vivu replaced spaces and punctuation in the name with underscores match on listed_name; if that fails, match vivu_list_videos duration_ms against duration_s (Step 4)
a search returns exactly its maximum_results more windows than the cap run it again with a larger maximum_results after telling the user the credits
a screen comes back with no windows at all the wording does not match the screen, or no chosen episode shows it check the wording names the on screen title and labels; an empty result does not prove the episodes never show it
the panel title cannot be read on the full frame small text in a scaled or zoomed out recording crop and enlarge the quarter that holds it (Step 6)

Connect Vivu, then add the skill.

The skill runs through the Vivu connector. Add it to Claude from the connector directory, then install the skill.