mvschwarzandClaude Opus 5.5 6a6b1386c9 live-state: the floor's open work is its own rig's, and a finished item's answer is read from the same version of it
- Open work is this floor's rig only (a seat at either end), like its seats and its finished work, and only the CLI's active states (asked for with --state pending,in-progress,blocked); it was every item on the box, and every state but done, so canceled, failed and handed-off items counted as queued.
- A finished item's result is taken only when `queue show` answers for the same item, still done, at the same tsUpdated the list showed; a later close, a reopen or an unrelated answer reads as unreadable, isn't cached, and is tried again next refresh.
- A done-list answer that isn't a list is unreadable, never "no finished work".

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 00:29:00 -07:00

openrig-studio-apps

The apps and providers for OpenRig Studio. Every app here is a surface that runs in the SDK's shell (@openrig/studio) — the shell is a rail of tabs, a stage, and an agent sidebar, plus the contract a surface speaks to reach them.

Layout

apps/<id>/
  app.json          the manifest: surface, provider, roots, verbs
  app/<id>.html     the surface
  vendor/           assets that travel with THIS app
providers/<name>/
  package.json      declares roots (as KINDS), binaries, first-run, peers
  *.mjs             the server(s)

Ultralight vs heavy — the only distinction that matters

Who serves the bytes.

ultralight heavy
ships HTML + a script or two its own service
served by the shell (path: row) itself (url: row)
install drop the file, register a row npm / docker / git — normal distribution
needs the SDK yes — the shell is its runtime only to appear as a tab

That inverts the intuitive reading: the ultralight app is the one that needs the SDK. files is ultralight. media-manager, canvas and mini-nle are clients of @openrig/studio-video. cutdown is a client of @openrig/studio-cutdown.

Manifests declare; they do not imply

Every field in app.json and in a provider's openrig block exists because leaving it out is how bespokeness happens. Roots are declared as kinds (project, media, footage) and bound to real directories at install. Every hardcoded path removed from this code — content-piece-1/assembly, workspace/<project>, $HOME/studio/app — existed because there was nowhere to say this. If there is a field for it, nobody inlines it.

A manifest authored on a machine that already has everything installed will always under-declare. Test one by installing it somewhere that has nothing.

The video provider's app-contract and media-root regressions run after its dependencies are installed:

cd providers/studio-video
npm ci
npm test

Provenance

Ported from the frozen studio-box spike, then de-bespoked: the original project each tool was built for was still wired in as a default. The code is ported, not extracted — hand-extracting it silently broke three contracts that answered HTTP 200 with real data while the pane rendered empty.

S
Description
No description provided
Readme Apache-2.0
3 MiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 55.4%
HTML 44.2%
Dockerfile 0.3%