Sitelet https://github.com/NodeOps-app/createos-plugins/commit/4c8160510f89bb6db30cf898e4b691867598cd8e
Skip to content

Commit 4c81605

Browse files
committed
feat(cos): add auto-pause and disk flags to cos up
cos up hardcoded a 30m idle auto-pause and the 10 GiB default disk. Long-lived demos parked between visitors, and Docker-heavy apps (e.g. archestra pulling MCP images) hit "no space left on device". - cos up -P/--auto-pause <dur> (default 30m, platform max 24h) - cos up -d/--disk-mib <MiB> - docs: up command, skill gotchas, lifecycle + disk notes, README - codex-plugin copies synced via scripts/sync-shared.sh
1 parent b8fae8c commit 4c81605

10 files changed

Lines changed: 31 additions & 25 deletions

File tree

‎packages/claude-code-plugin/README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ The two halves compose: the URL lets **you** watch and take over in a browser wh
295295

296296
**`pause` is the cheap way to end a session.** It snapshots the whole box — disk, memory, and running processes — frees the host, and stops compute billing, so a box with a warm toolchain costs nothing while parked. `resume` restores it exactly — files, installed dependencies, and processes that were running when it paused. End to end through the CLI both operations land around 6–8 s (measured), and resume is slower when the snapshot has to be pulled to a different host than the one it was taken on. `down`, by contrast, destroys the box and forces the next session to reinstall everything.
297297

298-
`pause` stops the file sync and any tunnels first, since a paused box serves no traffic. Re-run `sync` / `tunnel` / `expose` after resuming. The project box also carries a 30-minute idle auto-pause as a backstop; raise it with `createos sandbox edit <id> --auto-pause 4h` when a box is serving an exposed URL that people will hit intermittently, or the demo will look dead between visitors.
298+
`pause` stops the file sync and any tunnels first, since a paused box serves no traffic. Re-run `sync` / `tunnel` / `expose` after resuming. The project box also carries a 30-minute idle auto-pause as a backstop; set it at create time with `cos up -P 22h` (max `24h`), or on a live box with `createos sandbox edit <id> --auto-pause 4h`, when a box is serving an exposed URL that people will hit intermittently, or the demo will look dead between visitors.
299299

300300
**`template` bakes a toolchain into an image** so boxes boot pre-provisioned instead of running the same install prelude on every offload. The build service enforces constraints that would otherwise only surface as a rejection after upload, so `cos` preflights the Dockerfile locally: exactly one `FROM` (single-stage), an operator-allowlisted base written literally (no `ARG` substitution), **no `COPY`/`ADD`** (no build context is uploaded — fetch inside a `RUN`), and 64 KiB of source at most. Two builds run concurrently per account.
301301

@@ -489,7 +489,7 @@ cos down # stops sync/tunnels, destr
489489
- **`cos: command not found`** — run `cos install` by its full path (the `SessionStart` hook prints that path into Claude's context), or call `cos` by full path. Do not type `${CLAUDE_PLUGIN_ROOT}` into a Bash command — that variable is unset in the Bash tool's environment and the path resolves to `/scripts/cos`.
490490
- **`/scripts/cos: no such file`** — same cause. Never work around it by rebuilding the offload from raw `createos sandbox create/push/exec`: that drops egress restriction, keepalive, auto-destroy, and the auth preflight.
491491
- **Shape rejected** — run `createos sandbox shapes` and pick from the `Allowed: [...]` list in the error.
492-
- **Box says paused / `cos run` refuses** — the 30 m idle auto-pause fired, or someone ran `pause`. `cos resume` brings it back; raise the timeout with `createos sandbox edit <id> --auto-pause 4h`.
492+
- **Box says paused / `cos run` refuses** — the 30 m idle auto-pause fired, or someone ran `pause`. `cos resume` brings it back; raise the timeout with `cos up -P 22h` at create time or `createos sandbox edit <id> --auto-pause 4h` on a live box.
493493
- **Template build rejected** — `cos template submit` preflights single-stage/no-`COPY`/64 KiB locally; a rejection past that is usually a base image outside the operator allowlist.
494494
- **Build can't reach a host** — you restricted egress; add the host with `-e <domain>` or the right `-p <preset>`.
495495
- **`sync` copied `node_modules` anyway** — your `createos` CLI is old and lacks `--exclude`; upgrade it (`cos` warns when this happens).
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
description: Create or reuse a persistent CreateOS project sandbox for this repo (one active box per git root). Warm box for repeated runs and live sync.
3-
argument-hint: "[-s shape] [-r rootfs] [-n name] [-e dom|-p preset|-E]"
3+
argument-hint: "[-s shape] [-r rootfs] [-n name] [-P auto-pause] [-d disk-mib] [-e dom|-p preset|-E]"
44
allowed-tools: Bash
55
---
66

7-
Bring up (or reuse) the project sandbox. State is tracked per git root, so repeated runs reuse the same warm box. Egress defaults to unrestricted, same as `offload`; `-e <domain>` (repeatable) or `-p <preset>` (e.g. `python-uv`, `rust-cargo`, `npm`, `github`) restrict to an exact set, or `-E` to keep it explicitly unrestricted.
7+
Bring up (or reuse) the project sandbox. State is tracked per git root, so repeated runs reuse the same warm box. Egress defaults to unrestricted, same as `offload`; `-e <domain>` (repeatable) or `-p <preset>` (e.g. `python-uv`, `rust-cargo`, `npm`, `github`) restrict to an exact set, or `-E` to keep it explicitly unrestricted. `-P <dur>` sets the idle auto-pause (default `30m`, max `24h`, e.g. `-P 22h` for a long-lived demo); `-d <MiB>` sets disk size (default 10 GiB — raise it for Docker-heavy apps, e.g. `-d 40960`).
88

99
!`"${CLAUDE_PLUGIN_ROOT}/scripts/cos" up $ARGUMENTS`
1010

11-
Confirm the box id/shape above. Remember to `/createos-sandbox:down` when finished — a project box stays running (with a 30 m idle auto-pause backstop).
11+
Confirm the box id/shape above. Remember to `/createos-sandbox:down` when finished — a project box stays running (with an idle auto-pause backstop — 30 m unless `-P` set).

‎packages/claude-code-plugin/scripts/cos‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# cos install [target] symlink this script onto PATH (default ~/.local/bin/cos)
1313
# cos offload [flags] <local-dir> <cmd> throwaway box: stage→run→pull→destroy
1414
# cos agent [flags] <agent> <dir> <prompt> run claude|codex|opencode|pi|cursor in a box
15-
# cos up [-s][-r][-n][-e|-p|-E][-a] create/reuse a project box (-a to adopt)
15+
# cos up [-s][-r][-n][-P][-d][-e|-p|-E][-a] create/reuse a project box (-a to adopt)
1616
# cos run <cmd> run in the project box (keepalive)
1717
# cos sync [-2|-M][-x] <local-dir> [remote] start file sync into the project box (bg)
1818
# cos pause | cos resume park the warm box at zero compute cost / bring it back
@@ -51,7 +51,7 @@ strip_ansi(){ perl -pe 's/\e\[[0-9;?]*[ -\/]*[@-~]//g' 2>/dev/null || cat; }
5151
NORMA=()
5252
_mapl(){ case "$1" in
5353
--shape) echo -s;; --rootfs) echo -r;; --out|--output) echo -o;; --name) echo -n;;
54-
--egress) echo -e;; --egress-preset) echo -p;; --egress-all) echo -E;; --env) echo -v;; --adopt) echo -a;;
54+
--egress) echo -e;; --egress-preset) echo -p;; --egress-all) echo -E;; --env) echo -v;; --adopt) echo -a;; --auto-pause) echo -P;; --disk-mib) echo -d;;
5555
--exclude) echo -x;; --keep-on-fail) echo -K;; --swap) echo -w;;
5656
--two-way) echo -2;; --mirror) echo -M;; --forks) echo -f;; *) echo "$1";; esac; }
5757
_norm(){ NORMA=(); while [ $# -gt 0 ]; do case "$1" in
@@ -116,7 +116,8 @@ wait_running(){ local id=$1 to=${2:-30} i s
116116

117117
create_box(){ # $1=name $2=shape $3=rootfs ; extra --egress in COS_EGRESS array
118118
local name=$1 shape=$2 rootfs=$3
119-
local args=(sandbox create --name "$name" --shape "$shape" --rootfs "$rootfs" --auto-pause 30m)
119+
local args=(sandbox create --name "$name" --shape "$shape" --rootfs "$rootfs" --auto-pause "${COS_AUTOPAUSE:-30m}")
120+
[ -n "${COS_DISK:-}" ] && args+=(--disk-mib "$COS_DISK")
120121
[ -n "${COS_NET:-}" ] && args+=(--network "${COS_NET}")
121122
[ "${#COS_EGRESS[@]}" -gt 0 ] && args+=("${COS_EGRESS[@]}")
122123
[ "${#COS_ENV[@]}" -gt 0 ] && args+=("${COS_ENV[@]}")
@@ -547,16 +548,17 @@ EOF
547548
cmd_up(){
548549
_norm "$@"; set -- ${NORMA[@]+"${NORMA[@]}"}
549550
local shape=s-2vcpu-2gb rootfs=devbox:1 name="" egress_all=0 adopt=0; COS_EGRESS=(); local -a _d; local OPTIND=1 o doms d
550-
while getopts "s:r:n:e:p:v:Eah" o; do case $o in
551+
while getopts "s:r:n:e:p:v:P:d:Eah" o; do case $o in
551552
s) shape=$OPTARG;; r) rootfs=$OPTARG;; n) name=$OPTARG;;
553+
P) COS_AUTOPAUSE=$OPTARG;; d) COS_DISK=$OPTARG;;
552554
v) add_env "$OPTARG";;
553555
e) COS_EGRESS+=(--egress "$OPTARG");;
554556
p) doms=$(egress_preset "$OPTARG") || die "unknown egress preset '$OPTARG' (have: $EGRESS_PRESETS)"
555557
read -ra _d <<<"$doms"; for d in "${_d[@]}"; do COS_EGRESS+=(--egress "$d"); done;;
556558
E) egress_all=1;;
557559
a) adopt=1;;
558-
h) echo "cos up [-s shape] [-r rootfs] [-n name] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]"; exit 0;;
559-
*) die "usage: cos up [-s shape] [-r rootfs] [-n name] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]";; esac; done
560+
h) echo "cos up [-s shape] [-r rootfs] [-n name] [-P auto-pause] [-d disk-mib] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]"; exit 0;;
561+
*) die "usage: cos up [-s shape] [-r rootfs] [-n name] [-P auto-pause] [-d disk-mib] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]";; esac; done
560562
[ "$egress_all" = 1 ] && COS_EGRESS=()
561563
lock_state # held across check → create → write; released on return via EXIT trap
562564
local cur curname; cur=$(state_get id); curname=$(state_get name)
@@ -1425,7 +1427,7 @@ cos — CreateOS sandbox as remote compute. (run `cos install` to put `cos` on
14251427
against OpenRouter / any OpenAI- or Anthropic-compatible provider (cos agent -h)
14261428
cos fanout [-j N][flags] <dir> <cmd>... run each <cmd> in its own throwaway box, in parallel (cos fanout -h)
14271429
cos shell [-s][-r][-e|-p|-E] instant throwaway interactive Linux (destroyed on exit)
1428-
cos up [-s][-r][-n][-e|-p|-E][-a] create/reuse project box (-a adopt a box cos didn't create)
1430+
cos up [-s][-r][-n][-P][-d][-e|-p|-E][-a] create/reuse project box (-a adopt a box cos didn't create)
14291431
cos run <cmd> run in project box (keepalive; ONE string, no '--' separator)
14301432
cos sync [-2|-M][-x glob] <dir> [remote] file sync (default one-way, -2 two-way, -M mirror; big dirs excluded)
14311433
cos tunnel <remote> [local] forward box port → 127.0.0.1 (background)

‎packages/claude-code-plugin/skills/using-createos-sandbox/SKILL.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ For repeated runs against a warm box, or a dev server you edit against. One box
129129

130130
```bash
131131
cos up -s s-2vcpu-2gb # create/reuse this project's box
132+
cos up -P 22h -d 40960 # longer idle auto-pause, 40 GiB disk (Docker-heavy apps)
132133
cos run 'npm ci' # warm it — deps persist across runs
133134
cos sync ~/app /work # one-way by default (laptop → box), background
134135
cos run 'npm run dev &' # start a watcher; it sees synced edits
@@ -237,7 +238,7 @@ Disk data lives in the user's own S3 account and region. `--path-style` is neede
237238

238239
## Lifecycle and cost
239240

240-
- Ephemeral boxes self-destroy. The project box carries a 30-minute idle auto-pause as a backstop, so a forgotten box parks itself instead of billing overnight. Raise it with `createos sandbox edit <id> --auto-pause 4h` when a box is serving an exposed URL people will hit intermittently — otherwise the demo will look dead between visitors.
241+
- Ephemeral boxes self-destroy. The project box carries a 30-minute idle auto-pause as a backstop, so a forgotten box parks itself instead of billing overnight. Set it at create time with `cos up -P 22h` (max `24h`), or on a live box with `createos sandbox edit <id> --auto-pause 4h`, when a box is serving an exposed URL people will hit intermittently — otherwise the demo will look dead between visitors.
241242
- Finish a live session with `cos pause` (keeping the warm state) or `cos down` (done for good). Don't leave a running box behind either way.
242243
- **Concurrency is limited** — external keys have been observed to allow 2 boxes running at once, with a daily creation cap. This is observed behaviour rather than published policy, so budget `cluster` and `fanout` against it and expect excess jobs to queue rather than fail.
243244
- If a shape is rejected, the error names the allowed list — pick from it, or run `createos sandbox shapes`.

‎packages/claude-code-plugin/skills/using-createos-sandbox/references/lifecycle-and-images.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Through the CLI, both `cos pause` and `cos resume` land around 6–8 seconds end
3131

3232
## Idle auto-pause
3333

34-
`cos up` creates the project box with a 30-minute idle auto-pause as a cost backstop, so a box forgotten at the end of a session parks itself rather than billing overnight.
34+
`cos up` creates the project box with a 30-minute idle auto-pause as a cost backstop, so a box forgotten at the end of a session parks itself rather than billing overnight. Override at create time with `cos up -P 22h` (or `--auto-pause`).
3535

3636
The platform accepts anything from 60 seconds to 24 hours, and it can be changed on a live box:
3737

‎packages/claude-code-plugin/skills/using-createos-sandbox/references/offload-and-egress.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,6 @@ The jobs share no network — that is the difference from `cluster`, where boxes
8181

8282
**Swap is best-effort.** `-w <GB>` tries to add a swapfile, but `devbox:1` cannot currently `swapon` — it stays at 0 MB, `cos` warns, and continues. If a compiled-extension build (pyo3/maturin, torch) is OOMing, the fix is a bigger shape or less work per run: build the extension separately, or install only the extra/group you actually need.
8383

84-
**Disk fills fast.** `pip install --all-extras` or an unconstrained `uv sync` can pull CUDA and torch wheels measured in gigabytes and hit `No space left on device` on a small box. Install only what the job needs; `--disk-mib` at create time raises the ceiling if you control it.
84+
**Disk fills fast.** `pip install --all-extras` or an unconstrained `uv sync` can pull CUDA and torch wheels measured in gigabytes and hit `No space left on device` on a small box. Install only what the job needs; `cos up -d 40960` (MiB) raises the ceiling on a project box — the default is 10 GiB, which Docker-heavy apps that pull extra images outgrow.
8585

8686
**Bandwidth is quota'd.** Every box starts with a fixed egress allowance (5 GiB by default) covering traffic the box initiates. A big model download, a `docker pull`, or a large dataset fetch can exhaust it, after which the box is flagged capped and outbound traffic stops. The quota is topped up additively — `createos sandbox edit <id>` has an interactive top-up — and clears a few seconds after the top-up lands. The control channels that carry exec, file transfer, and tunnels are exempt, so a blown quota degrades the workload without cutting off access to the box.

‎packages/codex-plugin/scripts/cos‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# cos install [target] symlink this script onto PATH (default ~/.local/bin/cos)
1313
# cos offload [flags] <local-dir> <cmd> throwaway box: stage→run→pull→destroy
1414
# cos agent [flags] <agent> <dir> <prompt> run claude|codex|opencode|pi|cursor in a box
15-
# cos up [-s][-r][-n][-e|-p|-E][-a] create/reuse a project box (-a to adopt)
15+
# cos up [-s][-r][-n][-P][-d][-e|-p|-E][-a] create/reuse a project box (-a to adopt)
1616
# cos run <cmd> run in the project box (keepalive)
1717
# cos sync [-2|-M][-x] <local-dir> [remote] start file sync into the project box (bg)
1818
# cos pause | cos resume park the warm box at zero compute cost / bring it back
@@ -51,7 +51,7 @@ strip_ansi(){ perl -pe 's/\e\[[0-9;?]*[ -\/]*[@-~]//g' 2>/dev/null || cat; }
5151
NORMA=()
5252
_mapl(){ case "$1" in
5353
--shape) echo -s;; --rootfs) echo -r;; --out|--output) echo -o;; --name) echo -n;;
54-
--egress) echo -e;; --egress-preset) echo -p;; --egress-all) echo -E;; --env) echo -v;; --adopt) echo -a;;
54+
--egress) echo -e;; --egress-preset) echo -p;; --egress-all) echo -E;; --env) echo -v;; --adopt) echo -a;; --auto-pause) echo -P;; --disk-mib) echo -d;;
5555
--exclude) echo -x;; --keep-on-fail) echo -K;; --swap) echo -w;;
5656
--two-way) echo -2;; --mirror) echo -M;; --forks) echo -f;; *) echo "$1";; esac; }
5757
_norm(){ NORMA=(); while [ $# -gt 0 ]; do case "$1" in
@@ -116,7 +116,8 @@ wait_running(){ local id=$1 to=${2:-30} i s
116116

117117
create_box(){ # $1=name $2=shape $3=rootfs ; extra --egress in COS_EGRESS array
118118
local name=$1 shape=$2 rootfs=$3
119-
local args=(sandbox create --name "$name" --shape "$shape" --rootfs "$rootfs" --auto-pause 30m)
119+
local args=(sandbox create --name "$name" --shape "$shape" --rootfs "$rootfs" --auto-pause "${COS_AUTOPAUSE:-30m}")
120+
[ -n "${COS_DISK:-}" ] && args+=(--disk-mib "$COS_DISK")
120121
[ -n "${COS_NET:-}" ] && args+=(--network "${COS_NET}")
121122
[ "${#COS_EGRESS[@]}" -gt 0 ] && args+=("${COS_EGRESS[@]}")
122123
[ "${#COS_ENV[@]}" -gt 0 ] && args+=("${COS_ENV[@]}")
@@ -547,16 +548,17 @@ EOF
547548
cmd_up(){
548549
_norm "$@"; set -- ${NORMA[@]+"${NORMA[@]}"}
549550
local shape=s-2vcpu-2gb rootfs=devbox:1 name="" egress_all=0 adopt=0; COS_EGRESS=(); local -a _d; local OPTIND=1 o doms d
550-
while getopts "s:r:n:e:p:v:Eah" o; do case $o in
551+
while getopts "s:r:n:e:p:v:P:d:Eah" o; do case $o in
551552
s) shape=$OPTARG;; r) rootfs=$OPTARG;; n) name=$OPTARG;;
553+
P) COS_AUTOPAUSE=$OPTARG;; d) COS_DISK=$OPTARG;;
552554
v) add_env "$OPTARG";;
553555
e) COS_EGRESS+=(--egress "$OPTARG");;
554556
p) doms=$(egress_preset "$OPTARG") || die "unknown egress preset '$OPTARG' (have: $EGRESS_PRESETS)"
555557
read -ra _d <<<"$doms"; for d in "${_d[@]}"; do COS_EGRESS+=(--egress "$d"); done;;
556558
E) egress_all=1;;
557559
a) adopt=1;;
558-
h) echo "cos up [-s shape] [-r rootfs] [-n name] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]"; exit 0;;
559-
*) die "usage: cos up [-s shape] [-r rootfs] [-n name] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]";; esac; done
560+
h) echo "cos up [-s shape] [-r rootfs] [-n name] [-P auto-pause] [-d disk-mib] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]"; exit 0;;
561+
*) die "usage: cos up [-s shape] [-r rootfs] [-n name] [-P auto-pause] [-d disk-mib] [-e dom|-p preset|-E] [-v KEY[=VAL]] [-a]";; esac; done
560562
[ "$egress_all" = 1 ] && COS_EGRESS=()
561563
lock_state # held across check → create → write; released on return via EXIT trap
562564
local cur curname; cur=$(state_get id); curname=$(state_get name)
@@ -1425,7 +1427,7 @@ cos — CreateOS sandbox as remote compute. (run `cos install` to put `cos` on
14251427
against OpenRouter / any OpenAI- or Anthropic-compatible provider (cos agent -h)
14261428
cos fanout [-j N][flags] <dir> <cmd>... run each <cmd> in its own throwaway box, in parallel (cos fanout -h)
14271429
cos shell [-s][-r][-e|-p|-E] instant throwaway interactive Linux (destroyed on exit)
1428-
cos up [-s][-r][-n][-e|-p|-E][-a] create/reuse project box (-a adopt a box cos didn't create)
1430+
cos up [-s][-r][-n][-P][-d][-e|-p|-E][-a] create/reuse project box (-a adopt a box cos didn't create)
14291431
cos run <cmd> run in project box (keepalive; ONE string, no '--' separator)
14301432
cos sync [-2|-M][-x glob] <dir> [remote] file sync (default one-way, -2 two-way, -M mirror; big dirs excluded)
14311433
cos tunnel <remote> [local] forward box port → 127.0.0.1 (background)

‎packages/codex-plugin/skills/using-createos-sandbox/SKILL.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ For repeated runs against a warm box, or a dev server you edit against. One box
129129

130130
```bash
131131
cos up -s s-2vcpu-2gb # create/reuse this project's box
132+
cos up -P 22h -d 40960 # longer idle auto-pause, 40 GiB disk (Docker-heavy apps)
132133
cos run 'npm ci' # warm it — deps persist across runs
133134
cos sync ~/app /work # one-way by default (laptop → box), background
134135
cos run 'npm run dev &' # start a watcher; it sees synced edits
@@ -237,7 +238,7 @@ Disk data lives in the user's own S3 account and region. `--path-style` is neede
237238

238239
## Lifecycle and cost
239240

240-
- Ephemeral boxes self-destroy. The project box carries a 30-minute idle auto-pause as a backstop, so a forgotten box parks itself instead of billing overnight. Raise it with `createos sandbox edit <id> --auto-pause 4h` when a box is serving an exposed URL people will hit intermittently — otherwise the demo will look dead between visitors.
241+
- Ephemeral boxes self-destroy. The project box carries a 30-minute idle auto-pause as a backstop, so a forgotten box parks itself instead of billing overnight. Set it at create time with `cos up -P 22h` (max `24h`), or on a live box with `createos sandbox edit <id> --auto-pause 4h`, when a box is serving an exposed URL people will hit intermittently — otherwise the demo will look dead between visitors.
241242
- Finish a live session with `cos pause` (keeping the warm state) or `cos down` (done for good). Don't leave a running box behind either way.
242243
- **Concurrency is limited** — external keys have been observed to allow 2 boxes running at once, with a daily creation cap. This is observed behaviour rather than published policy, so budget `cluster` and `fanout` against it and expect excess jobs to queue rather than fail.
243244
- If a shape is rejected, the error names the allowed list — pick from it, or run `createos sandbox shapes`.

0 commit comments

Comments
 (0)