← Files RiversideARCHIVED FILE

CHANGELOG.md

25.1 KB · Oct 8, 2026 · 12:02 UTC

↓ Download file

See the change to this file →

# Changelog

All notable changes to the Riverside plugin are documented in this file.

## Release process

The plugin declares an explicit `"version"` in `.claude-plugin/plugin.json`.
Because the version is explicit rather than derived from git metadata,
**installed users only pick up a new release when that field is bumped** —
the Claude plugin directory and Cursor marketplace treat an unchanged
version as "nothing new to install," even if the underlying skills, docs, or
MCP wiring changed underneath it.

Practical consequence: **bump `version` on every release**, including
docs-only or packaging-only changes, following semver:

- **patch** (`0.2.0` → `0.2.1`) — typo/doc fixes, no behavior change
- **minor** (`0.2.0` → `0.3.0`) — new skills, new sections of functionality,
  backwards-compatible tool/skill changes
- **major** (`0.x.y` → `1.0.0`) — breaking changes to skill names, required
  inputs, or the plugin's public shape

Also keep `.cursor-plugin/plugin.json`'s `"version"` in sync with the Claude
manifest — the two packages ship from the same repo and are expected to move
together.

## [0.8.0] - 2026-10-01

Adds podcast-hosting guidance for the federated hosting service and refreshes
public distribution instructions.

- Adds the podcast-hosting skill, with live config and guidelines, distinct
  studio slug/id handling, verified episode sources, publication and
  distribution confirmation, artwork recovery, and download analytics.
- Adds the 18 hosting tool names to the reviewed catalog.
- Corrects social-management guidance for the newly exposed account and upload
  operations while retaining confirmation and duplicate-post protections.
- Keeps Creativity as the single OpenAI listing category. The OpenAI upload
  export preserves the existing directory package name and uses version 1.1.0;
  the shared public plugin release is 0.8.0.

## [0.7.1] - 2026-09-28

Stops sending agents to export tools the server no longer serves (EB-1254).

- **Removed `platform_list_exports` and `platform_get_export`** from
  content-discovery. The platform backend dropped both on 2026-08-25, so the
  "Getting a download link" workflow ended in `unknown tool: list_exports`.
- **"Getting a download link" is now "Getting a rendered file".** No live tool
  returns a download link, so the workflow ends at the edit's `riversideUrl`
  instead of promising one. The skill's link rules no longer say exports carry
  a `riversideUrl` or a download URL.
- **`expected-tools.txt` refreshed from a full tools/list** (68 tools, adds the
  `exports_` namespace). This refresh is what made the tool-name gate catch the
  stale references.

## [0.7.0] - 2026-08-27

Adds the publish read-back. `social_upload_create` returns when a publish is
*accepted*, and until now nothing on the social surface could tell you what
became of it — so an agent reported "published" for posts that never published.

- **New tool `social_get_upload_status`.** Takes the `uploadId` that
  `social_upload_create` returns and reports `PENDING`, `SCHEDULED`,
  `COMPLETED`, or `FAILED` with a `terminal` flag, plus `externalId` once the
  post exists and a bounded `reasonCode` + recovery sentence when it failed.
- **New reference `skills/social-publishing/references/upload-status.md`**, and
  a routing row for it. It carries the polling cadence, what each terminal state
  does and does not authorize, and two access facts worth knowing: MCP-created
  uploads are account-wide, while web-app production-scoped uploads can require
  production assignment; an unknown, foreign, or cancelled `uploadId` all
  return the same error, so a cancelled upload cannot be
  distinguished from one that never existed.
- **Retracted a premise in `results-and-recovery.md`.** It said retrying was
  unsafe partly because there was "no authoritative status readback". There is
  one now. The advice is unchanged for the case it actually governs — a call
  that returned nothing yielded no `uploadId` to read back — but the reason is
  now the accurate one.
- The safety contract is untouched. The new tool reads only; nothing here gained
  a way to cancel, edit, retry, or unpublish a post.

## [0.6.5] - 2026-09-06

Docs-only. Corrects what the setup guidance claims about ChatGPT write actions.

- **Stop asserting an OpenAI plan matrix we cannot back.** The prerequisites
  said "ChatGPT Pro supports read/fetch actions only. ChatGPT Business and
  Enterprise/Edu support write/modify actions." That was uncited, silent on
  ChatGPT Plus, and is exactly the kind of third-party detail that moves
  without telling us. It now states the requirement that is actually ours — a
  qualifying paid Riverside plan — and sends the reader to OpenAI for
  everything on their side. The README carries the link; the skill just says
  to check, to stay inside its context budget.
- **Widen the "tool not listed" troubleshooting row to the all-writes-missing
  case.** From EB-1019, where a customer's connector was authenticating and
  serving read tools normally while every edit write came back not-exposed.
  The Riverside surface was verified complete throughout, so the row now says
  the connection is fine and points at the host's write permission. Previously
  the nearest rows pointed at reconnecting or at a Riverside plan problem,
  both of which are dead ends for this symptom.

## [0.6.4] - 2026-08-16

Makes every skill `description` readable by naive frontmatter parsers.

- **All four descriptions were YAML folded block scalars (`description: >`).**
  A parser that reads the value off the `description:` line — rather than
  gathering the indented lines beneath it — sees the literal `>` and nothing
  else. cursor.directory's repository auto-detect does exactly that, so all
  four skills arrived at its submission form with `>` as their description and
  had to be filled in by hand. This repo already knew the hazard:
  `validate_cursor_package.py` carries a comment explaining that a block scalar
  "carries its value in the indented lines" because it had to special-case it.
- **They are now single-line plain scalars.** Verified against a YAML parser:
  each parsed value is identical to what it was before, except that the block
  scalar's trailing newline is gone — an artifact of the format, not content.
  No wording changed. Plain (unquoted) form is deliberate: a naive
  `split(":", 1)` recovers the exact text with no quote artifacts to strip.
  Checked that none of the four contains a `": "` or `" #"` sequence, or a
  leading YAML indicator character, so all four are valid plain scalars.
- **Costs four long lines in the source files**, which is the trade for the
  descriptions surviving every parser that reads them.

## [0.6.3] - 2026-08-13

Corrects the `repository` URL advertised by every vendor manifest.

- **All four manifests pointed at `riversidefm/riverside-mcp`**, which is
  private. Any external reader — including a directory reviewer following the
  link from a listing — resolved it to a 404. They now point at
  `riversidefm/riverside-mcp-public`, the published entry point that actually
  serves this bundle.
- No skill, tool, or MCP wiring changes; packaging metadata only.

## [0.6.2] - 2026-08-13

Refactors the bundled skills for structural progressive disclosure while
preserving current live-authority and safety behavior.

- **Smaller always-loaded entrypoints.** The content-discovery,
  social-publishing, and video-editing entrypoints retain their routing and
  safety contracts while moving workflow-specific detail out of the
  always-loaded surface. Setup remains self-contained.
- **Ten conditionally routed, one-hop references.** Content discovery routes to
  three references, social publishing to two, and video editing to five.
- **Deterministic selective loading.** Before the first workflow call and after
  each response, the operational skills evaluate every routing condition, load
  every matching reference, and avoid unrelated references. Edit creation now
  has one owner: discovery resolves identifiers and video editing performs the
  mutation from the live creation schema.
- **Context budgets are regression-tested.** Every ordinary one-reference route,
  setup, and the compound social scheduling-and-recovery route load fewer
  instruction bytes than their 0.6.1 monolithic entrypoint.
- **Live authority and safety gates remain in control.** Current MCP schemas and
  guide tools remain authoritative, while ambiguity handling, revision
  threading, mutation readiness, unchanged returned payloads, and final
  publishing confirmation remain enforced. Keep/reorder and cross-source
  assembly requests no longer route to a write that production has delisted.
- **Batch tool name corrected to `editing_batch`.** The skills instructed callers
  to use `editing_editing_batch` and stated that `editing_batch` was not
  callable. editing-mcp-v2 ENG-640 registers the tool as `batch`, so the
  gateway's `editing_` namespace serves `editing_batch` and the doubled-prefix
  name resolves to nothing. Every batch call, and every
  `editing_validate_edit_plan` preflight that feeds one, previously failed with
  tool-not-found. The reviewed live-surface snapshot and its validator allowlist
  were corrected to match.
- **An unavailable operation is no longer a dead end.** Keep/reorder and
  cross-source assembly previously refused outright and forbade "clone, batch,
  or cuts" — but the live guide names exactly those as its supported fallbacks
  for the same unavailability, so the skills contradicted the source they had
  just declared authoritative. They now fail closed on the direct operation and
  offer only a fallback the live response or the guide actually names, described
  as what it does rather than as an equivalent. Inventing a substitute, guessing
  a stale tool name, and inverting a keep selection into cuts all remain barred.
- **The guide is fetched by section.** `editing_get_editing_guide` takes
  `section` and `category`, and its default section is larger than the whole
  video-editing skill. The entrypoint now tells callers to read the current
  section names off the schema and request the narrowest one that covers the
  task, which is worth more context than this refactor's own restructuring.
- **One phrasing of the live-authority rule.** All ten references opened with
  the same "live schemas decide, the main skill file's rules still apply" point
  written ten different ways; they now share one. Measured saving is small (179
  bytes); the intent is that one rule reads the same everywhere.
- **The compound-route trade is now tested, not assumed.** A request matching
  three or more video-editing routing rows loads more than the 0.6.1 monolith
  did. That is the accepted cost of progressive disclosure — one- and
  two-reference routes, which dominate, each save 7-11 KB — and a new test pins
  the crossover so it cannot drift without review.
- **No runtime performance claim.** This release establishes structural
  progressive disclosure; it does not claim measured runtime token or latency
  savings. The compound-route figures above are byte counts, not measurements.

## [0.6.1] - 2026-08-12

Pre-submission corrections ahead of the Claude and ChatGPT directory listings.
Documentation, packaging metadata, and CI only — no skill guidance about tools
changed, and no tool name moved.

- **Removed `.app.json`.** A ChatGPT app id is workspace-scoped: committing one
  binds the package to a single workspace, and the value is world-readable in a
  public repository. The directory path does not consume it either — a
  Skills-only upload removes it, and an MCP-backed submission uses "With MCP"
  and submits the MCP server directly. `validate_openai_package.py` now asserts
  its **absence**, in both halves: no `apps` field in the manifest and no
  `.app.json` in the tree. The app-id and placeholder checks went with the file,
  including the `--allow-placeholder` flag.
- **`shortDescription` shortened to 28 characters** ("Search, edit & publish
  video"). It is the listing subtitle, and OpenAI's submission step rejects one
  over 30 — a failure that surfaces only at submission time, long after CI is
  green. The validator now asserts caps on `shortDescription`, `displayName`,
  `longDescription`, and `developerName` so it cannot regress.
- **Added `interface.supportURL`**, pointing at the public "Connect to Riverside
  MCP" help article. Both directories ask for a reachable support destination and
  OpenAI requires an HTTPS one, which an email address does not satisfy. The
  validator now requires the field and checks that the URL fields are `https://`.
- **The `setup` skill documents the ChatGPT/Codex lane.** It previously described
  only the Claude Code and Cursor first-tool-call flow. It now covers the current
  custom connection steps and the future directory path. In either case the
  plugin supplies skills while the separately managed Riverside connection
  supplies tools, so the two fail independently. Removing the plugin does not
  disconnect Riverside. Troubleshooting now names the right control point for
  each host rather than only Claude Code's `/mcp` and Cursor's settings panel.
- **Corrected the session lifetime in the README** from 12 hours to 7 days, and
  recorded that there is no silent token refresh — re-consent is required through
  the browser when a connection expires and cannot happen silently.
- **Fixed the authentication wording.** The README described
  `https://riverside.com/auth` as "the consent screen"; that URL is the OAuth
  issuer identifier and returns 404 to a browser. It is now named as the issuer,
  with the real flow described: the client discovers it and opens Riverside's
  hosted sign-in, and the grant prompt belongs to the host client rather than to
  Riverside, which has no consent UI of its own.
- **Replaced the support instruction with a link.** The README pointed readers at
  the homepage to go hunting for Help / Support; it now links the Riverside Help
  Center and the per-client connection article directly.
- **Stated the plan requirement without under-claiming.** "Grow or above" is
  narrower than the live entitlement and told eligible customers on other paid
  plans that they were excluded. The README, the `setup` skill, and the OpenAI
  `longDescription` now say a qualifying paid plan is required and that Free and
  Pro accounts cannot use the MCP, and the `setup` skill points at the
  informational pricing page rather than instructing the reader to upgrade.
- **Trimmed internal engineering detail out of the shipped bundle.**
  `expected-tools.txt`'s header keeps what it is, why it is a snapshot, how to
  refresh it, and the capture date and counts, and drops the incident narrative,
  infrastructure commands, and internal repository references. The docstrings in
  `validate_tool_names.py`, `validate_release.py`, and `validate_mcp_config.py`,
  and a comment in the CI workflow, now state the defect class each gate closes
  without the dated incident reports. The 61 tool names are byte-for-byte
  unchanged.

**Tool names are unchanged.** `expected-tools.txt` still lists the same 61 tools
across 5 namespaces captured on 2026-08-09.

## [0.6.0] - 2026-08-11

Adds the OpenAI (ChatGPT / Codex) packaging lane. No skill text changes — the
same four skills are now installable on a third host family.

- **New OpenAI package.** `.codex-plugin/plugin.json` declares the plugin for
  ChatGPT and Codex, `.app.json` carries the app binding, and `agents/openai.yaml`
  supplies plugin-level display metadata. `content-discovery`, `video-editing`,
  and `social-publishing` each declare the Riverside MCP as a
  `transport: streamable_http` dependency so ChatGPT makes the server available to
  them. `setup` deliberately declares no dependency: it troubleshoots the very
  connection that would otherwise be its prerequisite.
- **`mcpServers` is declared inline rather than as a path.** This repo's
  `.mcp.json` is the Claude *plugin* shape — a bare `{"<server>": {...}}` map —
  while every plugin in OpenAI's registry wraps `.mcp.json` in a top-level
  `mcpServers` key. Pointing OpenAI at the unwrapped file would hand it a shape
  no registry plugin uses, so `.codex-plugin/plugin.json` inlines the server and
  `validate_openai_package.py` asserts that copy agrees with `.mcp.json` and
  `mcp.json` on both server name and URL.
- **New gate: `scripts/validate_openai_package.py`.** Checks manifest and
  interface shape, `defaultPrompt` limits, asset existence, path containment,
  the MCP wrapper trap above, and the per-skill dependency declarations. It does
  not validate the app id against a prefix allowlist — OpenAI issues more than
  one prefix — but it does reject an unresolved placeholder id, and it rejects an
  id that keeps the `plugin_` URL route segment, which the browser shows after
  registration but which no stored id carries.
- **The release gate now covers the new files.** `.codex-plugin/plugin.json`
  joined the version-parity set, and `.app.json`, `.codex-plugin/plugin.json`,
  and `agents/` count as shipped, so a change to any of them requires a version
  bump like every other shipped file.

The app id in `.app.json` is a ChatGPT Developer Mode registration. It is package
metadata rather than a credential — OpenAI's own plugin registry publishes these
ids — but it is account-scoped, so a different workspace needs its own id.

## [0.5.1] - 2026-08-10

Closes a coverage hole in the tool-name gate added in 0.5.0. No shipped skill
text changes — this is a fix to what CI is able to see.

- **The tool-name gate now validates bare namespace globs.** It claimed to check
  prefix globs, but only ever looked at the two characters following a matched
  token, and a token had to end in an alphanumeric. `editing_remove_*` was
  therefore checked (token `editing_remove`, trailing `_*`) while a bare
  `editing_*` matched no token at all and was skipped silently — so a whole
  namespace could go unverified.
- A dedicated glob parser now recognises any identifier ending in `_*`,
  validates its prefix against `expected-tools.txt`, and records its span so the
  plain-token scan cannot report the same glob twice. Requiring that trailing
  underscore is also what keeps markdown emphasis (`*editing_batch*`) out of the
  glob parser.
- Added `NOT_A_TOOL_GLOBS`, a reason-bearing allowlist for glob-shaped prose
  that names no callable namespace. It has one entry: `list_*` in
  `content-discovery`, describing the shared pagination envelope. Real
  namespaces are not allowlistable — verifying them is the point of the gate.
- Failures name the file, the line, and the live namespace the stale one most
  likely came from (`platform-mcp-mcp_*` → "Did you mean `platform_*`?").

`expected-tools.txt` is untouched: still the 61 tools across 5 namespaces
captured on 2026-08-09. A snapshot refresh stays a separate reviewed change.

## [0.5.0] - 2026-08-09

Agent Plugins v1.0 conformance, and CI that can actually fail.

- **Added the Agent Plugins manifest** at the repo root (`plugin.json`). It is
  the specification's one hard MUST (§4.1.2): without it a conforming client
  rejects the plugin and runs none of its components. Note it deliberately
  carries no `displayName`, `logo`, `skills`, or `mcpServers` — the AP schema
  is closed, and those fields belong to `.cursor-plugin/plugin.json`.
- **Made root `mcp.json` conform**: added `$schema` and the required
  `type: "streamable-http"` discriminator. The URL is unchanged.
- **Kept the existing package layout**: `.claude-plugin/`, `.cursor-plugin/`,
  `.mcp.json`, and `skills/` retain their established paths. The vendor
  manifest versions and `content-discovery` guidance change as described in
  this release; the locations do not. Claude Code and Cursor read those exact
  paths, and renaming them to reverse-domain form would break both clients to
  satisfy a spec that does not ask for it.
- **Added four CI gates** covering what green CI did not: every tool name in
  `skills/**` and `README.md` must exist on the live surface
  (`expected-tools.txt`); `.mcp.json` must be valid and agree with `mcp.json`;
  the Agent Plugins files must validate against the official schemas; and a
  change to any shipped file must come with a version bump and a changelog
  entry.
- Fixed an unprefixed tool reference in `content-discovery` — the new
  tool-name gate found it on its first run.

## [0.4.0] - 2026-08-09

Corrects the documented plan requirement and moves the package's web links to
the canonical domain.

- Corrected the required plan from **Pro to Grow** in the `setup` skill
  (requirement and troubleshooting row). The README carried this correction
  already; it shipped without a version bump, so it is recorded here.
- Moved the package's **web URLs** to the canonical `riverside.com` domain:
  the privacy-policy link, both manifests' `homepage`, the author URL, and the
  links in the `setup` skill. Contact addresses remain on `riverside.fm`.
- Added the **terms and conditions** link to the README alongside the privacy
  policy. Both directory submissions ask for one, and the canonical path is
  `/terms-conditions` — `/terms` and five other obvious spellings 404.
- Made the README's Authentication section client-neutral rather than
  Claude-specific.
- Dropped the withdrawn "deprecated search alias" guidance from
  `content-discovery`; those aliases were removed from the gateway on
  2026-07-30 and no alias is served today.
- Corrected `platform_get_transcript` guidance to describe sentence-level
  timestamps, the word-level timing handoff, and the per-speaker no-offset
  caveat.
- Removed an internal task assignment from `docs/cursor-testing.md`.

**Tool names are unchanged from 0.3.0.** The 13 hierarchy tools keep their
`platform_*` names. The gateway's `platform` target was deployed and verified
on 2026-08-09 before this release.

## [0.3.0] - 2026-07-29

Re-aligned every skill with the live tool surface, tool by tool.

- Documented the two search tools (`search_recording_transcripts_exact` and
  `search_riverside`) in `content-discovery`, and replaced the old
  transcript-by-transcript discovery strategy with a search-first one. The skill
  had previously stated that no search tool existed on this surface.
- Corrected the batch tool's name to `editing_editing_batch` throughout
  `video-editing`; the name the skill used did not resolve at the gateway.
- Added a "Time axes" section to `video-editing` covering which tools take source
  time and which take playable time, and how to convert between `{n,d}` fractions
  and milliseconds.
- Documented `editing_get_asset_metadata` and
  `editing_list_edit_recording_asset_sessions`, the two editing tools that had no
  coverage.
- Fixed required and missing parameters: `editing_insert_overlay`'s `durationMs`,
  `editing_insert_audio`'s `dB`/`multiplier` (there is no `volume` parameter),
  `editing_resolve_transcript_selection`'s required `intent` plus its
  `readyToApply`/`payload` contract, `editing_create_edit_from_segments`'s
  fraction times and required `type`, and `editing_set_visual_crop`'s
  target/crop shape.
- Corrected tool behavior throughout `video-editing`, including
  `editing_remove_fillers`' transcript-based classification and duration-based
  `Smart` mode, the third field returned by `editing_get_captions_presets`,
  `editing_apply_brand`'s applied/skipped result, `editing_reorder_timeline`'s
  content duplication on overlapping ranges, and `editing_restore_audio_cleanup`
  also requiring a transcript.
- `content-discovery`: filter soft-deleted edits, prefer `platform_get_project`
  as a single fan-out, keep unscoped requests unscoped, document
  `platform_get_recording`'s opt-in `includePreviewUrl`, and stop presenting a
  `ready` export as proof that a clip can publish.
- `social-publishing`: never infer `youtubeData.privacyStatus`, X character
  weighting, the `composeSettings` field names and `quality` values, and that
  publish-readiness cannot be checked in advance.
- README: documented the search capability under "What You Can Do", and added
  Cursor to the title, the intro, and the requirements list.

## [0.2.0] - 2026-07-19

This release adds Claude plugin-directory metadata, Cursor marketplace
packaging, validation CI, and release documentation.

- Rewrote all skills for the current gateway tool surface (`platform_*`,
  `editing_*`, `social_*` prefixes), replacing the alpha's skills which
  referenced outdated tool names.
- Added two new skills: `video-editing` and `setup` (previously only
  `content-discovery` and `social-publishing` existed).
- Added Cursor marketplace packaging (`.cursor-plugin/plugin.json`,
  root `mcp.json`) alongside the existing Claude plugin packaging.
- Added packaging compliance for the Claude plugin directory: `LICENSE`,
  this changelog, a plugin logo, `displayName`/`keywords` metadata, and
  README sections required for review (Authentication, Support & Security,
  Privacy).
- Added a validation CI workflow that runs `claude plugin validate --strict`
  for the Claude manifest and a lightweight custom check
  (`scripts/validate_cursor_package.py`) for the Cursor package (version
  parity, path containment, skill frontmatter), on every PR and push to
  `main`.

The plugin logo (`assets/logo.png`) is Riverside's public site icon.

## [0.1.0] - 2026-04

Initial alpha release of the Riverside plugin.

- Initial plugin scaffold wrapping the Riverside remote MCP server
  (`https://mcp.riverside.com/mcp`).
- Two skills: `content-discovery` and `social-publishing`.

SHA-256: 4e8e8665e7e81652f363b178e71194041926c958049fd0525ce1fbea9270f1b7