Published in openvibe-contracts v0.419.0 (docs/adr/ADR-060-skills-run-sandboxed.md), rendered as is.

ADR-060: Skills that run code — never on our server, always in a sandbox

Evidence

Decision

  1. The rule. A skill's code never runs on an OpenVibe server, never on the person's machine outside a sandbox, and never sees a secret. It runs as a Run job of class function on a Link that declared the skill runner, with the network denied unless the skill declared otherwise and the person approved it, and with the exact bytes the registry scanned.
  2. The contracts. actor.skill@2 adds:
  1. The Link runner ([email protected], a declared function like [email protected]):
  1. The Actor registry and the run.
  1. The person sees it on the skill's card and install page: "Runs code in a sandbox on your machine or OpenVibe's", the tools with their net in plain words ("no internet", "OpenVibe sites only", "the internet"), and the scan's findings per tool. A flagged code skill installs only after reading them; a failed never.

Alternatives

Migration and rollback

Both new contracts are additive majors; nothing parses actor.skill@2 until Actor's registry and Link's runner ship, and @1 keeps working for every existing prompt skill. The only data a sandbox listing adds is the Media objects that hold the code; they are private to Actor's tenant and can be deleted with the listing. Rollback is retiring the @2 listing and turning the runner off: no prompt skill is affected, no job can be submitted without the skill.run kind, and nothing ever ran on our servers, so there is no server-side state to unwind.

Tests

test/run.js:

Link's own tests (in OpenVibe Link) prove the runner: a tool cannot read env, spawn, write a file, open a socket under deny, or exceed its output.