Acceptance criteria
| Criterion | Verdict | Evidence |
|---|---|---|
| Package builds standalonetestbuilds with no workspace back-refs · 2 assertions | ✓ PASS | canvas-host.build.test.ts:19 |
| No mission-control coupling remainsgit grep returns no output · 0 hits | ✓ PASS | packages/canvas-host/src |
| Artifacts serve from a separate origintestserves off ofusercontent.com · 4 assertions | ✓ PASS | render-origin.test.ts:64 |
| Sealed CSP on every responsetestsets default-src 'none' · 7 assertions | ✓ PASS | csp.test.ts:31 |
| Sandbox omits allow-same-origintestiframe drops same-origin · 3 assertions | ✓ PASS | sandbox.test.ts:22 |
| + 6 more criteria · all PASS — loopback MC regression, headers, egress, types, docs, lint | ||
Run these yourself
$ pnpm --filter @oasis/canvas-host build $ git grep -n mission-control packages/canvas-host/src # expect: no output $ pnpm --filter @oasis/canvas-host test
Surprises
- render-origin still pulled a mission-control logger transitively through @oasis/shared — cut the import to keep canvas-host egress-free. Caught here, fixed in-story.
- ofusercontent.com needs its own Vercel project so a bad artifact never shares the app's registrable domain — logged as a follow-up, out of this story's scope.