← RiversideCONTENT HISTORY

Update to Riverside

Snapshot Sep 30, 2026 · 23:19 UTC · version 1.0.1

Collection source: not recorded for this historical snapshot. These snapshots do not have a confirmed matching collection source. Differences in file lists alone do not establish changes to the package.

WHAT CHANGED · RULE-BASED ANALYSIS

Supporting file metadata differs

Newly listed paths: agents/openai.yaml. This compares saved file lists, not package contents; a different collection source can change the list.

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Supporting files

Before

[{"relative_path":"references/captions-and-brand.md","size_in_bytes":3781},{"relative_path":"references/cuts-and-audio.md","size_in_bytes":4906},{"relative_path":"references/edit-lifecycle.md","size_in_bytes":5631},{"relative_path":"refe...

After

[{"relative_path":"agents/openai.yaml","size_in_bytes":514},{"relative_path":"references/captions-and-brand.md","size_in_bytes":3781},{"relative_path":"references/cuts-and-audio.md","size_in_bytes":4906},{"relative_path":"references/edit...

Compare saved observations

Download comparison JSON
Full technical diff · 1 changed fields

changed /included_files

BEFORE
[
  {
    "relative_path": "references/captions-and-brand.md",
    "size_in_bytes": 3781
  },
  {
    "relative_path": "references/cuts-and-audio.md",
    "size_in_bytes": 4906
  },
  {
    "relative_path": "references/edit-lifecycle.md",
    "size_in_bytes": 5631
  },
  {
    "relative_path": "references/transcript-editing.md",
    "size_in_bytes": 4484
  },
  {
    "relative_path": "references/visuals-and-media.md",
    "size_in_bytes": 5098
  }
]
AFTER
[
  {
    "relative_path": "agents/openai.yaml",
    "size_in_bytes": 514
  },
  {
    "relative_path": "references/captions-and-brand.md",
    "size_in_bytes": 3781
  },
  {
    "relative_path": "references/cuts-and-audio.md",
    "size_in_bytes": 4906
  },
  {
    "relative_path": "references/edit-lifecycle.md",
    "size_in_bytes": 5631
  },
  {
    "relative_path": "references/transcript-editing.md",
    "size_in_bytes": 4484
  },
  {
    "relative_path": "references/visuals-and-media.md",
    "size_in_bytes": 5098
  }
]
Full snapshot data
{
  "name": "video-editing",
  "description": "Use when the user wants to cut, trim, clean up, caption, lay out, crop, brand, add overlays, stock media or music to, or otherwise change the content of a Riverside edit, or to turn a raw recording into an editable edit. Not for browsing or searching existing content (see content-discovery), and not for publishing to social platforms (see social-publishing). If the question is whether an editing error is really an authentication or connection problem, use setup first.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 514
    },
    {
      "relative_path": "references/captions-and-brand.md",
      "size_in_bytes": 3781
    },
    {
      "relative_path": "references/cuts-and-audio.md",
      "size_in_bytes": 4906
    },
    {
      "relative_path": "references/edit-lifecycle.md",
      "size_in_bytes": 5631
    },
    {
      "relative_path": "references/transcript-editing.md",
      "size_in_bytes": 4484
    },
    {
      "relative_path": "references/visuals-and-media.md",
      "size_in_bytes": 5098
    }
  ],
  "skill_md_contents": "---\nname: video-editing\ndescription: >\n  Use when the user wants to cut, trim, clean up, caption, lay out, crop,\n  brand, add overlays, stock media or music to, or otherwise change the content\n  of a Riverside edit, or to turn a raw recording into an editable edit. Not for\n  browsing or searching existing content (see content-discovery), and not for\n  publishing to social platforms (see social-publishing). If the question is\n  whether an editing error is really an authentication or connection problem,\n  use setup first.\n---\n\n# Video editing\n\nServer-side timeline editing. Tools are exposed at the gateway with the\n`editing_` prefix. Work is keyed by an **`editId`**; revision-aware writes\nadvance a **`revision`**.\n\nCurrent tool schemas and the live `editing_get_editing_guide` response are\nauthoritative for parameters, enums, limits, defaults, and recoverable errors.\nThis file carries only the invariants no single schema can state.\n\n## Three rules that override everything\n\n1. **Keep operating on the same edit.** When iterating on an existing edit, do\n   NOT create a new edit or clone — keep passing the same `editId` and its\n   latest `revision`. Create or clone only when the user explicitly asks for a\n   separate version. The currently listed entry points\n   (`editing_create_edit_from_recording` and `editing_clone_edit`) each return\n   an `editId` that becomes the working edit for the rest of the flow.\n\n2. **Thread the revision on revision-aware writes.** When the current write\n   schema exposes `expectedRevision`, pass the latest revision back as that\n   value; omitting it risks clobbering a concurrent edit. After a successful\n   revision-changing write, use the revision it returns for the next such\n   write. Preserve the revision's live type and value rather than coercing it.\n\n   Do not generalize this into an argument for every tool that accepts an\n   `editId`: reads and some non-revisioned operations do not accept\n   `expectedRevision`. The live schema of the specific call decides whether the\n   argument exists; the invariant is that you never omit or stale it when it\n   does.\n\n   A revision conflict is not retryable. Never replay the same write with a\n   newer revision substituted. Stop before another write and evaluate the\n   routing table again; the now-observable conflict selects the recovery\n   workflow that re-reads and re-derives the operation.\n\n3. **Never mix time axes.** See below. This is the easiest way to silently\n   corrupt an edit.\n\n## Time axes — read before computing any time\n\nThe timeline has two axes, and tools disagree about which one they take.\n\n- **Source time** — positions in the original recorded media, before cuts.\n- **Playable time** — positions on the edited, post-cut timeline the viewer sees.\n\nWith no cuts yet the two coincide and the distinction is harmless. Once any cut\nexists they diverge, and a number from one axis fed to a tool on the other lands\nin the wrong place with no error.\n\n| Axis & unit | Tools |\n|---|---|\n| **Source**, `{n,d}` fractions of seconds | `editing_read_timeline_in_range` (every returned time: `trackTime`, `timeRange`, `duration`, scene times), fraction-based `editing_batch` params |\n| **Source**, integer ms | `editing_add_lower_third` (`startMs`), `editing_add_text_overlay` (`startMs`), `editing_insert_overlay` (`startMs`) |\n| **Playable**, integer ms | `editing_cut_time_ranges` (`startMs`/`endMs`), `editing_insert_audio` (`startMs`), `editing_insert_media_as_scene` (`startMs`), `editing_read_aligned_transcript` (`playableStartMs`/`playableEndMs`, and its `startMs`/`endMs` window), `editing_resolve_transcript_selection` (in and out) |\n\nRules that follow:\n\n- **Never compare or reason across the axes** — not in a tool argument, and not\n  in your own analysis. Converting a source `{n,d}` to milliseconds does not\n  make it comparable to a playable millisecond value: once cuts exist, \"these\n  two numbers differ\" tells you nothing about whether they name the same moment.\n  Two values are comparable only when both came from the same axis.\n- Convert a `{n,d}` fraction to ms *within one axis* with\n  `Math.round(1000 * n / d)`.\n- Derive playable-ms placements from `editing_read_aligned_transcript` or\n  `editing_resolve_transcript_selection`, and source-ms placements from\n  `editing_read_timeline_in_range`. Never cross over.\n- `editing_insert_stock_media` places an overlay the same way\n  `editing_insert_overlay` does; treat its `startMs` the same.\n- `position` on the overlay tools is a **canvas** fraction, not a time — it\n  shares the `{n,d}` shape and means something else entirely.\n\n## Read the guide, then follow the guide\n\nFor anything beyond a single common operation, call `editing_get_editing_guide`\nfirst — and then use only what that response actually lists.\n\n**Ask for the narrowest slice that answers the question.** The guide is\nsectioned, and one section can outweigh this whole skill, so an unscoped call is\nthe most expensive read on this surface. Take the current section and category\nnames off the tool's schema and request the one covering the task in hand. Never\npass a section or category from memory or inferred from a wrapper's name; if the\none you expected is absent, choose from what is present and say which you used.\n\n**An unavailable operation is not a dead end.** When a tool is missing from the\nlive surface or comes back unavailable, say so — then offer a fallback that\nresponse or the guide actually names, described as what it does, never as an\nequivalent. Assemble no substitute of your own.\n\n## Prefer the dedicated tool over batch\n\nEach common operation has a dedicated high-level tool that resolves timeline\ndetails for you. Reach for the low-level batch tool only for a multi-operation\natomic change, or for an operation with no standalone wrapper.\n\n> **The batch tool's callable name is `editing_batch`.** An earlier surface\n> exposed it under a doubled prefix; **`editing_editing_batch` is not a callable\n> tool.** Confirm the name against the live tool surface rather than either\n> spelling written from memory.\n\n## Transcript handles fail closed\n\n`editing_resolve_transcript_selection` returns opaque handles and a\nready-to-execute payload scoped to **one edit and one revision**. Never carry a\nhandle across edits or across revisions.\n\nExecute `payload.input` **unchanged, and only when `readyToApply` is true**.\nWhen it is false, or unresolved warnings leave `payload: null`, stop: report the\nwarning and re-resolve. Never synthesize a call from a null payload, and never\nhand-edit the payload into something executable.\n\n## Handing an edit off to publishing\n\nWhen an edit is going out to a social platform, publishing itself belongs to\nthe social-publishing skill, and the exported edit id is the `clipId` it takes.\nBefore a YouTube handoff, clear the copyright / Content-ID pre-check on the\nedit's media with `editing_get_export_publish_data`, and surface a flagged match\ninstead of publishing over it. For another platform, use its current live\nguidance rather than generalizing the YouTube check. The YouTube pre-check\ncondition selects the Edit lifecycle row below.\n\n## Where to read next\n\n| Need | Read |\n|---|---|\n| Create or clone an edit, inspect an edit, compare revisions as the primary task, recover an actual revision conflict, run a verified plan, or prepare a YouTube handoff that requires the copyright pre-check | [Edit lifecycle](references/edit-lifecycle.md) |\n| Keep, remove, or move transcript-selected speech | [Transcript editing](references/transcript-editing.md) |\n| Cut, reorder, clean up, restore, or adjust audio | [Cuts and audio](references/cuts-and-audio.md) |\n| Apply captions, presets, or a brand kit | [Captions and brand](references/captions-and-brand.md) |\n| Change layout/crop/visual media, place existing assets, or use stock | [Visuals and media](references/visuals-and-media.md) |\n\n**Routing contract:** Before the first Riverside workflow call, evaluate every\nrow against the observable request and state. Read every matching reference and\nno unrelated reference. After each Riverside response, evaluate every row\nagain before the next workflow call; read any newly matching reference first.\nOnly this table routes references — a reference never routes to another one.\n\nA post-operation revision comparison already prescribed by the owning\nworkflow reference does not activate an additional reference by itself. Every\ncondition listed in the routing table remains authoritative.\n"
}

SHA-256: 0b63d6b0e1144efa83b29100f9c83991d9a0f1998e825dc635796fdb15069887