* feat(w8): teammates wake a team workspace from the phone (team route long-poll wake, same access/billing/cap; owner route stays the fallback)
* test(w8): team wake refuses an admin on a private row, never returns the endpoint; phone never falls back on 401/403
terminal.send text+Enter to a daemon-backed shell always waited the 500 ms agent paste
settle: the daemon's shell-foreground answer is lifecycle ownership, which is only proven
after a recovery or full-screen exit, never for a fresh or plain-command shell. On Linux
the idle-prompt claim now also accepts the shell's own /proc stat (process group is the
terminal foreground group, i.e. ps '+'), scoped to the target PTY; other hosts unchanged.
The acceptance wake split uses one persistent paired connection per wake (the desktop's
transport) by default; transport=cli keeps the per-call socket the CLI dials.
- auth.signed-out-create (D-1/D-4), proj.cloud-name (D-3), life.delete-unconfirmed (D-2,
team switch -> not_found), life.delete-after-oob-destroy; life.destroy now requires destroyed
and records the asleep-delete refusal
- starts signed out (dev auth) with no sign-in-then-relaunch workaround; mock keychain so a
fresh dev app identity does not block on a macOS Keychain prompt
- cloud vs local rows disambiguated by badge (Move to this computer reuses the name)
- upload/download helpers for staging and collecting a run on a paired Orca environment
On every Orca Cloud start and wake, orcad ran its disposable startup preflight child. That child is a
second full load of the 15 MB bundle plus the SQLite and node-pty probes, and it ran before main().
The cloud slot could never be qualified: qualification needed the managed-activation env, and the
marker lives in the slot directory, which is root-owned in the image. In-VM profiles showed the main
thread idle for about 580 ms waiting on that child.
- ORCA_ORCAD_STARTUP_QUALIFICATION_DIR names a writable directory for the startup-qualified marker
and opts the slot into qualification. The key is unchanged: artifact version, file stat identity,
runtime, ABI, kernel and launch env. It survives a stop and resume: inode, mtime and ctime are
identical after resume, and the first launch after resume skipped the preflight.
- The image creates /opt/orca/startup-qualification. The provisioning smoke run records the marker,
and orca-sandbox-start passes the env.
- Agent-state-rules live updates and speech-model warm-up now start after the ready line instead of
before it.
- Once the ready line is published, a terminal list warms the terminal path (worktree catalog,
daemon inventory) before the reconnecting desktop asks for it.
Real 4-vCPU VMs, readyMs median of 5: idle 1475 -> 903 ms; with 3 busy cores 1921 -> 1200 ms.
Environment snapshots are built on a golden, so workspaces from them kept that golden's orcad and VM
scripts after rotation (e.g. no files.archiveStart). Each 5-minute tick, after the golden tick, every
environment whose active build's base_snapshot_id is not the current golden gets a background rebuild
of the active build's config (only the base image changes), attributed to system:golden-refresh and
billed like any build. The active build serves until the new one succeeds, then the newest-success
activation swaps it atomically; the old snapshot stays for rollback; a failed rebuild keeps the active
build, shows the usual failed build, and is not retried for that golden. At most 2 starts per tick
and 3 builds in flight overall. startBuild accepts an explicit config for this.
The Worker-started source build used the VM scripts, provision script and manifest pins embedded in
the Worker that started it, so a golden built from a newer commit could miss that commit's new VM
scripts (seen live: snap_HTsU from 19f900e has #122's orcad but not orca-desktop-proxy or
orca-desktop-page.js). source-build.sh now sources image/commit-provision-env.mjs from the fetched
checkout (no dependencies; mirrors provisionEnv, enforced by a test), so the image ships exactly that
commit. Tests also require every image/vm file to be a declared VM script and installed by provision.
* fix(w8): removing a member revokes their phones; role changes move phones too; a phone's stored role never re-syncs keys
* fix(w8): one removal path revokes keys, phones, grants and routines; stale desktop tokens can't re-sync roles or vouch phones; a grant revoked mid-issue stays revoked
* fix(w8): a removed member's unexpired desktop tokens stop working; changes count from auth's time; desktop re-mints and retries enroll on stale_token
* feat(w8): role-aware plan-denial copy on the phone (owners and admins get the fix, members who to ask)
* fix(w8): W10 copy (per-seat team limit, choose a plan) and FE review (3 s abortable role read, Android live region, more copy cases); no casts
* feat(cli,sandbox-control): orca repo add --display-name; cloud sandboxes name the project after its repository
The VM checkout lives at /vercel/sandbox/project, so boot-time registration (#104) named the repo
'project'. repo.add already accepts displayName; the CLI now exposes it as --display-name and
orca-sandbox-start passes the repository basename from ORCA_REPO_URL.
* fix(sandbox-control): golden builder polls detached builds with a bounded wait=true read; image-only merges trigger a rebuild
The provider reports a detached command's exit code only to a wait=true read (W1's finding, #123):
stepBuild's plain GET is what kept finished golden builds 'running' until the deadline. stepBuild and
the operator rotation now use the same bounded wait probe (4 s); the exit-file marker stays as a
fallback. golden-source's VM path list now includes cloud/apps/sandbox-control/image/ (VM scripts,
provision, manifest), so a script-only merge (e.g. orca-desktop-proxy) rebuilds the golden too.
* feat(cloud): remote desktop single-use tickets, fit, clipboard and keyboard release
- VM: Xvnc on a 0600 socket with no VNC auth plus an X cookie; orca-desktop-proxy (websockify
subclass) admits one WebSocket per unused 60 s ticket from the same localhost origin, refuses
rebinding Hosts, scrubs tickets from logs, serves the page with connect-src 'self'.
- Worker: POST /desktop mints a fresh ticket per call (schemaVersion 2).
- Desktop: no secret in the tab URL; main hands the page tickets on load and reconnect (backoff,
floor, pause with Reconnect), only for the exact URL of a live forward it opened; keyboard stays
in the desktop until Ctrl+Cmd / Ctrl+Alt; a paste key pushes this computer's clipboard; sandbox
copies reach this computer after a copy gesture.
- UI: keyboard hint, asleep/starting neutral tone and mapping, persistent error toasts, Beta badge.
* fix(cloud): remote desktop review fixes
- Security review: noVNC host/port/encrypt pinned to the page's origin, CSP connect-src 'self',
exact-URL + live-forward trust, mint floor and per-minute cap, copy gate on copy gestures only,
X display cookie.
- Design review: archived is its own neutral state, starting covers waking, page messages say
"Wake it in Orca", pause overlay is a status for calm states and focuses Reconnect, hint wraps
and hides from assistive tech when faded.
- FE review: paste follows the keyboard layout, AltGr never releases, page calls settle on
navigation, state notices only on change, hint once per load/release, paste always pushes,
no committed bytecode, session tests.
* fix(cloud): remote desktop archived page message, hint layout, fixtures
* fix(cloud): remote desktop copy gate counts double-clicks (pointer events have no click count)
* chore(cloud): remote desktop lint (exhaustive pause reasons, no test casts or wall clock)
* fix(sandbox-control): read the orgRole claim that Orca Cloud auth mints (#29)
Auth mints the live org role as orgRole on sandbox tokens (same claim as billing
tokens, stablyai/orca-cloud#695); the verifier read org_role, so admins would
never have been recognized.
* wip(cloud): environment builds control plane
* wip(cloud): environment build boot path, staleness, routes
* wip(cloud): env build tests, anonymous staleness fallback
* wip(cloud): migration 0008 (claimed), quieter recovered clone errors
* fix(cloud): env build review: interrupted-snapshot recovery, bounded log reads, secret redaction, activation guard, hook/prelude fixes
* fix(cloud): wait briefly for the build exit code after its log ends; print the base image and package manager
* wip(desktop): org environments client, IPC, CLI, settings UI, orcad disk usage + low-disk banner
* perf(cloud): smoke-boot each environment build before activating it; skip the redundant prelude fetch
* fix(cloud): a GitHub token error fails the build as github_unavailable instead of cloning anonymously
* perf(cloud): warm pool VMs per hot environment build, so a create from an org environment skips the provider boot
* wip(desktop): cloud environment UI round-3 fixes
* fix(cloud): pool-per-build review: smoke race safety, provider hiccups skip smoke, usage-based hot builds with caps, bounded boots, index
* fix(desktop): Configure with an agent hands the prompt over at launch (trust dialog swallowed the pasted Enter); CLI builds table widths
* polish(desktop): W10 P2s — InlineError action slot, shared focus-ring, copy
* feat(cloud): build event stream heartbeat every 20 s
* fix(desktop): FE review — stable virtualizer, shadow-buffer replays, heartbeat-aware build watch, CLI follower restarts, repo import path checks, poll races
* feat(cloud): meter environment build sandbox time to the member who started it; no setup-script nudge for workspaces booted from an env build
* fix(cloud): environment builds progress server-side on a Durable Object alarm, not only while someone streams their log
* fix(cloud): advance env builds with a bounded wait=true exit probe (Vercel reports exit codes only to waiting readers)
* fix(sandbox-control): read the orgRole claim that Orca Cloud auth mints (#29)
Auth mints the live org role as orgRole on sandbox tokens (same claim as billing
tokens, stablyai/orca-cloud#695); the verifier read org_role, so admins would
never have been recognized.
* wip(cloud): environment builds control plane
* wip(cloud): environment build boot path, staleness, routes
* wip(cloud): env build tests, anonymous staleness fallback
* wip(cloud): migration 0008 (claimed), quieter recovered clone errors
* fix(cloud): env build review: interrupted-snapshot recovery, bounded log reads, secret redaction, activation guard, hook/prelude fixes
* fix(cloud): wait briefly for the build exit code after its log ends; print the base image and package manager
* wip(desktop): org environments client, IPC, CLI, settings UI, orcad disk usage + low-disk banner
* perf(cloud): smoke-boot each environment build before activating it; skip the redundant prelude fetch
* fix(cloud): a GitHub token error fails the build as github_unavailable instead of cloning anonymously
* perf(cloud): warm pool VMs per hot environment build, so a create from an org environment skips the provider boot
* wip(desktop): cloud environment UI round-3 fixes
* fix(cloud): pool-per-build review: smoke race safety, provider hiccups skip smoke, usage-based hot builds with caps, bounded boots, index
* fix(desktop): Configure with an agent hands the prompt over at launch (trust dialog swallowed the pasted Enter); CLI builds table widths
* polish(desktop): W10 P2s — InlineError action slot, shared focus-ring, copy
* feat(cloud): build event stream heartbeat every 20 s
* fix(desktop): FE review — stable virtualizer, shadow-buffer replays, heartbeat-aware build watch, CLI follower restarts, repo import path checks, poll races
* feat(cloud): meter environment build sandbox time to the member who started it; no setup-script nudge for workspaces booted from an env build
* fix(cloud): environment builds progress server-side on a Durable Object alarm, not only while someone streams their log