SkillsSkill for Claude

Sidewalk situation shortlists

Hand Claude a batch of front camera videos exported from your sidewalk delivery robots and get one CSV per situation: an e-scooter or shared bike on the walking path, a trash bin or garbage bags on the sidewalk, and a wet, puddled or snowy sidewalk. Claude prices the batch against your Vivu plan, uploads it to a private project, runs one precise search per situation, cuts a half second contact sheet for every window, labels each candidate from its frames and leaves an empty column for your reviewer. File names and robot logs never say that it was bin day or that a scooter lay across the path; only the picture does, and Vivu's results are treated as candidates until the frames confirm them.

Maintained by Vivu. Updated 2026-10-07.

Download

sidewalk-situation-shortlists.zip

10 KB. Unzips to sidewalk-situation-shortlists/SKILL.md. Upload the zip as it is in the Claude app, or unzip it into your skills folder for Claude Code.

SHA-256 1b256accae99a9673c1537a20ca0bbec5d568d1f968b35935c2ac20bbb12b6f3

At a glance

What the Sidewalk situation shortlists skill does, where it runs, what it needs, and when it asks
Looks forStatic sidewalk situations that only the camera picture shows: a scooter or bike standing or lying on the path, bins or garbage bags on the sidewalk, puddles, slush or snow on the pavement. Every candidate is checked against contact sheets cut from your own file before it gets a label, and rejected candidates stay in the CSV.
Runs onClaude Code on your computer (the terminal or the Code tab of Claude Desktop), because it reads your local video files and runs ffmpeg. No residential IP and no scheduler; run it once per batch.
Needs
  • The Vivu connector with write access, to create a private project, open its upload page and search.
  • The run videos as mp4 files on your computer, exported from the robot logs, because every contact sheet is cut from the local file.
  • A shell with ffmpeg and ffprobe, to measure the batch and cut contact sheets and zoomed frames.
  • An upload path: the Vivu upload page opened in your own browser, or a browser tool that can attach local files.
  • Someone who reviews the CSVs, because Claude's labels are a first pass and the reviewer decides.
Your Vivu planIndexing uses one Vivu index minute per minute of video, and each situation class is one precise search of 5 credits, so the default three classes use 15 search credits per batch (estimate). The skill shows the batch's minutes and credits against your plan with vivu_get_usage and waits for approval before uploading.
Asks you firstUploading the batch and spending its index minutes, writing the full CSVs (after you approve one sample row and the column mapping), and any upload or post of the CSVs to another place.

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

  • Vivu's search finds candidates, not answers: in our test run it called tree guards a fence and a hydrant with bollards a trash bin, so every row is labeled from frames and the reviewer checks each one.
  • Scooters on the path were tested on standing height footage only; on robot camera footage that class is unmeasured.
  • Construction barriers, cones and night footage are untested, and crossings without a curb ramp are not searched because that query failed in our test run.
  • An empty or short list does not mean the batch has none of these situations.
  • Passersby and homes appear in sidewalk footage; follow your team's data policy, and the skill does no face, plate or identity recognition.
  • The skill makes no safety judgment and does not explain run failures; the CSVs are review lists, not labels.
  • Videos stay in your Vivu project until you delete them; the project is created private because the default is visible to your whole organization.
  • Claude in Chrome uploads at most 10 MB per call, so larger files go through your own browser or the Vivu web app.

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:

Here are this week's robot camera exports in ~/runs/week40. Shortlist the stretches with scooters on the path, bins on the sidewalk, and wet or snowy pavement, one CSV each, for our eval review.

In Claude Code you can also type /sidewalk-situation-shortlists. 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: Measure the batch and price it
  8. Step 3: Upload and index
  9. Step 4: Search each situation class
  10. Step 5: Make contact sheets for every candidate and label it
  11. Step 6: Write one CSV per class and hand it over
  12. Compliance
  13. Known failure modes

The full skill

This is sidewalk-situation-shortlists/SKILL.md from the download, as Claude reads it: the frontmatter first, then the instructions.

---
name: sidewalk-situation-shortlists
description: "Sort a batch of sidewalk robot camera videos into candidate CSVs per situation (scooters on the path, bins on the path, wet or snowy pavement) with Vivu. Use when curating eval or training data."
---

Sidewalk situation shortlists with Vivu

This skill turns a batch of front camera videos from recent sidewalk delivery robot runs (camera streams your team has already exported from the robot logs to mp4) into one CSV per sidewalk situation on the team's list: an e-scooter or shared bike standing or lying on the walking path, a trash bin or garbage bags on the sidewalk, and a wet, puddled or snowy sidewalk. Claude measures the batch, prices it against the user's Vivu plan, uploads it to a private Vivu project, runs one precise search per situation, cuts a contact sheet at half second steps for every window Vivu returns, labels each window looks right, looks wrong or can't tell, and writes every candidate into its situation's CSV with an empty reviewer_verdict column. The data engineer decides what goes into the eval or training set.

The value is in what only the picture holds. File names carry a date, a robot and a route; odometry and localization logs say where the robot was and how fast it went. None of them says that a scooter was lying across the path on Tuesday, that it was bin day on that street, or that the route was under snow. The same route looks different every day, and exported camera streams have no audio or captions to search. Vivu's search is used only to shortlist: in our test run a reworded bin search traded misses for false positives, and Vivu's reason text called a tree guard a fence and a fire hydrant with bollards a trash bin. So every candidate is labeled from its frames, rejected candidates stay in the CSV, and a short list never means the batch had no such stretch.

When to use

Use when someone asks to find the runs where a scooter blocked the sidewalk, to pull bin day footage for an obstacle eval set, to shortlist snowy or rainy runs for a weather slice, or to sort a batch of robot runs by sidewalk situation before labeling.

Not for these:

  1. A one off question about one run ("was there snow in this file?"): search Vivu directly and look at the frames.
  2. Crossings without a curb ramp. In our test run every window returned for that query showed a ramp or no crossing at all, so this skill does not search for it. Use the robot's own stop or reroute events to find those crossings.
  3. Moving things: a pedestrian or cyclist stepping in front of the robot, a car pulling out of a driveway. The skill lists static situations only.
  4. Construction barriers and cones as the main need. The bin query includes them, but the test corpus had none, so that half of the class is untested; have the reviewer treat those rows as unmeasured.
  5. Safety judgments, failure or intervention root causes, or anything on the robot or in real time. The CSVs are review lists made after the run.
  6. Frame accurate labels, masks or bounding boxes: use the team's annotation tool.
  7. Hundreds of hours at once. Pick a subset from the run logs first (routes, dates, weather days); one run of this skill is sized for about an hour of footage.
  8. Night footage: untested. The skill can run, but have the reviewer look at every row.

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 results are candidates, Claude's labels are a first pass, and the reviewer's verdict is the decision.
  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 batch and its index minutes, before upload) and before writing the full CSVs (one sample row first). The skill posts and sends nothing; if the user asks Claude to put the CSVs somewhere, ask again before each write.
  5. Labels come from frames, never from Vivu's reason text, which describes the situation it was asked for even when the frame shows something else.
  6. The CSVs keep every candidate and carry no recall or precision figures. A search misses some stretches and caps how many come back, so an empty or short list does not prove the batch has none.

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 run videos as mp4 files on the user's computer Vivu indexes video files, and every sheet is cut from the local file ffprobe -v error -show_entries format=duration -of csv=p=0 FILE prints a length for each file; ROS bags, MCAP or the robot's own log format must be exported to video by the team's tools first
A shell on that computer with ffmpeg and ffprobe measure the batch, cut contact sheets and zoomed 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
Someone who reviews the CSVs Claude's labels are a first pass; the reviewer decides ask who fills reviewer_verdict; the default is the user

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 batch.

Inputs to collect

Ask for anything missing, most important first.

  1. BATCH_DIR: the folder that holds the exported mp4 files for this batch. Required.
  2. The situations and what counts for each. Default: the three classes in Step 4 with the label rules in Step 5. If the team defines a class differently (for example, a bin on the curb edge does not count, or only scooters lying down count), the team's definition wins; write it into config.json before labeling.
  3. BATCH_NAME: a short name such as a city and a week. It names the working folder and the Vivu project. Default: the name of BATCH_DIR.
  4. Batch size. Default: up to 60 minutes of video, or what remains of the plan this month, whichever is smaller.
  5. Who reviews the CSVs. Default: the user.

Files and state

Keep everything in one working folder next to BATCH_DIR:

sidewalk-BATCH_NAME/
  config.json      BATCH_DIR, classes with query, maximum_results and label rules, Vivu project id
  files.csv        source_file, duration_s, listed_name, video_id
  results/         search results without the result page link, one JSON per class
  sheets/          one folder per class with contact sheets and zoomed frames
  CLASS.csv        one per class: every candidate, Claude's label, empty reviewer_verdict
  state.json       steps done, files uploaded, classes searched with job ids, classes cut off, candidate keys labeled

The commands in Steps 2 to 5 run from the folder that holds both BATCH_DIR and sidewalk-BATCH_NAME/, so the relative paths in them resolve.

A rerun reads state.json first and skips finished steps. A file already marked uploaded is never uploaded again, a class with a saved result is not searched again, and a candidate key (video_id, start_ms and class) that already has a label is not labeled again. The next batch gets its own folder and its own Vivu project, so its searches do not return last week's candidates.

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 BATCH_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 BATCH_DIR.

Step 2: Measure the batch and price it

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

  1. Run the ffprobe length command on every mp4 in BATCH_DIR and write files.csv with source_file and duration_s. Add listed_name: the file name with each space, bracket, plus sign and percent sign replaced by an underscore, because that is how Vivu will list it.
  2. Call vivu_get_usage and show one table:
This batch Plan allowance Remaining this month
Index minutes sum of duration_s / 60 from vivu_get_usage from vivu_get_usage
Search credits 5 per class, 15 for the default three (estimate), plus 5 for each rewording 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. A typical batch of ten runs of four minutes each is about 40 index minutes (estimate), which is more than Free covers in a month and fits in Premium.

  1. If the batch does not fit, offer levers in this order: pick a smaller subset with the run logs (the routes, dates or weather days the dataset needs most), split the batch across two runs or two months, and only then a larger plan. Never drop files the user asked for without saying which ones.
  2. Confirm the Compliance items with the user.

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.

Done when the user approves the file list and its index minutes, and config.json records both.

Step 3: Upload and index

Goal: every file in the batch indexed in a private Vivu project for this batch.

  1. Call vivu_list_projects and reuse a project named "Sidewalk BATCH_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 street footage with passersby and homes is sensitive.
  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 run videos 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 files.csv by listed_name and record its video_id there and in state.json.

In our test run the 10 videos (17.77 minutes) were all ready 217 seconds after the upload started. They went through the same 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 files.csv shows ready and has a video_id.

Step 4: Search each situation class

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

Field Query Mode maximum_results
scooter_across an electric scooter or a shared bike is lying or standing across the sidewalk ahead, so it blocks part of the walking path in front of the camera; scooters parked neatly at the curb edge or in a rack, leaving the path clear, do not count precise 40
bin_or_barrier a trash bin, wheelie bin, garbage bags, or a construction barrier, fence or cone stands on the paved sidewalk ahead, near the line the camera is moving along; a bin set in a row of planters or benches or against a building wall does not count, and guards or stakes around young trees do not count precise 40
wet_or_snow the sidewalk surface ahead is covered by water puddles, slush or snow precise 40

The searches run side by side, one per class, because each class is its own list for the reviewer. Within a class the chain is: the precise search finds candidate windows, the contact sheet shows what the camera saw across each window, Claude labels it, and the reviewer decides. Every search is precise because only precise returns a time window; fast returns whole files with an empty reason, and the batch is already a chosen subset. Exported robot camera streams have no audio and no on screen text about the scene, so there is no second modality to switch to.

The bin wording is the third one we tried on the same footage (see the worked example). Its exclusions exist because the first wording returned tree guards and bins inside planter rows. Keep them unless the team's definition differs.

maximum_results is also the ceiling on how many candidates come back. 40 leaves room for an hour of footage with several stretches per run; a search that returns exactly 40 was cut off, and the batch holds more candidates than one search can return. Then tell the user, mark the class cut off in state.json, and offer to split the batch into two smaller batches with their own projects (quote the index minutes again and wait for approval as in Step 2). In our test run no search came close to 40, so a cut off search was not exercised in our test run.

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 a CSV.

Run each class once. If the team changes a wording, the new wording is untested until its first candidates have been through Step 5; in our test run a reworded bin query lost bins the earlier wording had found.

Done when every class has a completed result saved in results/, and every class whose search returned exactly its maximum_results is marked cut off in state.json.

Step 5: Make contact sheets for every candidate and label it

Goal: every candidate labeled looks right, looks wrong or can't tell from what its frames show.

For each result in results/FIELD.json, cut contact sheets of its window from the local file at two frames a second:

mkdir -p sidewalk-BATCH_NAME/sheets/FIELD
ffmpeg -v error -y -ss START -to END -i FILE -vf "fps=2,scale=384:-2,tile=5x4" sidewalk-BATCH_NAME/sheets/FIELD/rRANK_STEM_STARTMS_%02d.png

FIELD is the class, FILE the local source file (BATCH_DIR/ followed by its source_file), STEM its name without .mp4, RANK the result_number written with two digits (r01, r09) so the files sort by rank, STARTMS the result's start_ms, and START and END the result's start_ms and end_ms divided by 1000. Each sheet holds 20 tiles covering 10 seconds of the window; the last sheet is padded with black tiles. Tile k on sheet n (both counted from 0, left to right and top to bottom) is at START + 10 * n + k / 2 seconds. The tile position gives each frame's time, so the command needs no text overlay. Look at every sheet of a window.

wet_or_snow windows are long, because snow or rain lasts the whole clip. For a window longer than 40 seconds, use fps=0.5 in the same command (one tile every 2 seconds); then tile k on sheet n is at START + 40 * n + 2 * k seconds.

A bin, bollard or scooter near the edge of the frame is a few dozen pixels on a tile. When a tile shows a small dark shape near the path, or the sheet looks empty but the reason names a bin or a scooter, extract a zoomed full size frame at that tile's second:

ffmpeg -v error -y -ss SECONDS -i FILE -frames:v 1 -vf "crop=iw/2:ih/2:X:Y,scale=iw*2:-2" sidewalk-BATCH_NAME/sheets/FIELD/rRANK_STEM_SECMS_zoom_PART.png

SECONDS is the time of the tile, SECMS the same time in milliseconds, 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, and PART names the crop (for example left_bottom) so two crops of the same second get different files.

Label rules (defaults; the team's definitions from Inputs win):

  1. scooter_across looks right when an e-scooter or shared bike stands or lies on the paved walking path ahead, not in a rack, on grass, in the road or in a bike lane. It looks wrong for scooters and bikes parked at the curb edge or in a rack with the path clear.
  2. bin_or_barrier looks right when a trash bin, wheelie bin, garbage bags, a construction barrier, a fence panel or a cone sits on the paved sidewalk surface ahead. It looks wrong for bins inside a row of planters or benches, tree guards and stakes around young trees, bollards, hydrants, utility boxes, sandwich boards and cafe furniture.
  3. wet_or_snow looks right when the sidewalk surface ahead has visible standing water, puddles, slush or snow. It looks wrong for a dry surface, and for water only in the road. Puddles in the gutter or verge beside a dry footpath are can't tell unless the team counts them.
  4. can't tell when the zoomed frame still does not settle it (the object is hidden, too small or blurred). The reviewer looks at the source.

Write a note of what the frames show for every candidate, such as "wheelie bins on the narrow footpath at 01:56, path half blocked" or "bollards and a hydrant at the corner, no bin in any tile or the zoom at 01:53". Never copy the reason into the note. Record each candidate key and its label in state.json.

Worked example from our test run

The test corpus was public first person sidewalk footage published under a Creative Commons license, used in place of robot footage because no reusable robot camera footage was available: 10 videos (17.77 minutes) cut at fixed offsets from low handheld walks, e-scooter rides on footpaths at handlebar height, snow and rain walks, and one short TV b-roll clip of shared scooters on sidewalks, with the audio removed and the files renamed so the names said nothing about content. Every camera was higher than a delivery robot's. Bins, scooters and wet or snowy stretches were marked by hand on contact sheets before any search, together with look alikes (a scooter parked upright beside a bin, bikes at a rack and at the curb, a utility box, sandwich boards, a dry floor under a canopy). Bins the first pass missed or mislabeled were added after the first search under the same rules and count as misses for every wording that did not return them.

  1. scooter_across: 1 candidate, 1 real and 0 false, and 0 missed. That one stretch was TV b-roll shot from standing height; the corpus had no scooter seen from a robot's height, so this says little about how the query does on the user's footage. A scooter parked upright beside a bin on a snowy street, bikes leaning at the curb and bikes at a rack were not returned.
  2. bin_or_barrier, first wording ("takes up part of the walking path"): 10 candidates, 7 real and 3 false, and 1 missed. The false ones were bins inside a row of planter fences and two wooden tree guards that the reason called a fence on the sidewalk.
  3. A second wording that required the bin to narrow the path returned 2 candidates, 2 real and 0 false, but missed 6.
  4. The wording in the table, after 2 rewordings on the same corpus: 6 candidates, 5 real and 1 false, and 3 of the 8 bins marked by hand missed. The false one was a corner with bollards, a hydrant and a signal pole that the reason called a public trash bin; a zoomed frame showed no bin. The three misses were bins at a path edge or next to a kiosk that the first wording had found. The corpus had no construction barriers or cones.
  5. wet_or_snow: 7 candidates, 7 real and 0 false, and 0 missed. A dry floor under a canopy was not returned. The windows were long (median 31 seconds) because snow and rain lasted the whole clip.
  6. A curb ramp query ("sidewalk ends at a raised curb ... no sloped curb ramp") returned 4 candidates, 0 real and 3 false, and 1 can't tell. Every reason said the ramp was missing; the frames showed a ramp, a ramp already crossed, or no crossing at all. That class is not part of this skill.
  7. The 10 videos were all ready 217 seconds after the upload started. The three CSVs held 14 rows in total.

Done when every candidate in results/ has at least one contact sheet in sheets/ and a label in state.json.

Step 6: Write one CSV per class and hand it over

Goal: a review list per class that a data engineer can work through without opening Vivu.

Show the user one sample row and the field mapping, and wait for an OK before writing the rest:

source_file,rank,start_mmss,end_mmss,search_reason,contact_sheets,claude_label,claude_note,reviewer_verdict
SW_02.mp4,6,01:47,02:00,"A public trash bin stands on the paved sidewalk near the curb along the path the camera travels.",sheets/bin_or_barrier/r06_SW_02_107000_01.png;sheets/bin_or_barrier/r06_SW_02_113000_zoom_left_bottom.png,looks wrong,"corner with bollards, a hydrant and a signal pole; no bin on the sidewalk in any tile or in the zoomed frame at 01:53",

The row above is from our test run; the user's rows carry their own file names.

Column Source If unavailable
source_file files.csv, matched by listed_name keep the row with Vivu's file name, label it can't tell with the note "no local file matched", and tell the user
rank result_number in results/FIELD.json none
start_mmss, end_mmss start_ms and end_ms, written MM:SS none
search_reason the result's reason, copied as is; it is Vivu's description, not evidence blank
contact_sheets the sheet files and zoomed frames from Step 5, separated by semicolons none; the row cannot be labeled without them
claude_label Step 5 (inferred from frames) can't tell
claude_note what the frames show, in Claude's words (inferred) blank
reviewer_verdict left empty for the reviewer empty

claude_label and claude_note are Claude's reading of the frames, not a measurement. Whether a bin at the curb edge "blocks" the path depends on the robot's width and the team's definition, so the reviewer goes through every row, the looks right ones included, before anything enters a dataset.

Write FIELD.csv for every class with one row per result, sorted by rank, including the rows labeled looks wrong: a reviewer may disagree with a label, and the rejected rows show what the search confuses. The CSV uses the user's own file names and times, never a Vivu result page link, so it stays usable after the link expires.

Then tell the user, per class, how many candidates came back, how many Claude labeled looks right, looks wrong and can't tell, and whether the list was cut off at maximum_results. Say plainly that an empty or short list does not mean the batch has none, that bins and scooters at the edge of the frame are the easiest to miss, and that crossings without a curb ramp were not searched. Do not add recall or precision figures: the hand marks needed to measure them do not exist for the user's batch.

The CSVs stay in the working folder. Passing them on is the user's step. If the user asks Claude to upload or post them (a shared drive, a tracker, a chat), name the destination, show the rendered first rows and wait for a yes before each write.

In our test run the CSVs were written from the dry run's results and sheets; showing the sample row to a user and handing the CSVs over were not exercised in our test run.

Done when every class has a CSV whose row count equals the number of results in results/FIELD.json, the user approved the sample row and the mapping, and state.json marks the batch done.

Compliance

  1. Use robot footage the team owns or has the rights to analyze. For public videos used as extra material, check the license and the platform's terms first and keep them for internal analysis only. Have the user confirm this before Step 3.
  2. Passersby, homes and license plates on the sidewalk did not agree to be filmed. The skill lists stretches by situation only; it does no face, license plate or identity recognition and never searches for people. Follow the team's data policy for people in frame (some teams blur faces before any upload), and confirm before Step 3. Do not use the skill to collect footage of particular people or homes.
  3. The skill makes no safety judgment, does not say why a run failed or needed an intervention, and does nothing on the robot or in real time. The CSVs are review lists for people, not annotation files.
  4. The videos stay in the user's Vivu project until the user deletes them. Create the project as private; the default is visible to the whole Vivu organization. Delete videos or the project only when the user asks, and confirm first.
  5. The skill writes only local files. Any upload or post of the CSVs goes through the approval in Step 6.

Known failure modes

Symptom Cause Fix
(observed) tree guards around saplings came back as a fence on the sidewalk: 10 returned, 7 real and 3 false the first bin wording matched any fence like shape near the path keep the exclusions in the table wording; label tree guards looks wrong
(observed) a corner with bollards and a hydrant came back as a trash bin: 6 returned, 5 real and 1 false the reason names the object it was asked for label from the sheet and a zoomed frame, never from the reason
(observed) a tighter bin wording returned 2 candidates, 2 real, and missed 6 requiring the bin to narrow the path dropped bins at the curb and path edge keep the wording in the table; if the team rewrites it, treat it as untested until its candidates have been labeled
(observed) every curb ramp candidate said the ramp was missing: 4 returned, 0 real and 3 false the search cannot tell a ramped corner from an unramped one in this footage the skill does not search for missing curb ramps; use the robot's stop or reroute events instead
(observed) wet or snow windows run long, median 31 seconds the condition lasts the whole clip use the slower sheet rate for windows over 40 seconds and set start_mmss and end_mmss from the tiles if the team needs tight edges
(observed) the only scooter stretch in the test came from standing height footage no robot height scooter footage was available to test treat scooter rows as unmeasured on robot footage and have the reviewer check each one
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 BATCH_DIR Vivu replaced a space, bracket, plus or percent sign in the name match on listed_name in files.csv
a search returns exactly its maximum_results the batch holds more candidates than one search returns mark the class cut off, say so in the summary, and offer to split the batch
a class comes back empty none in the batch, or the search missed them an empty result does not prove the footage has no such stretch; say so in the summary
labels on night footage look unreliable this footage is untested treat every row as unmeasured and have the reviewer check each one

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.