What's Changed
- fix(api): sync box state when exec auto-starts a stopped box by @law-chain-hot in #861
- fix(dashboard): refresh terminal from box detail by @law-chain-hot in #889
- test(e2e): comprehensive REST API test coverage by @G4614 in #902
- chore(deps): bump the go_modules group across 2 directories with 1 update by @dependabot[bot] in #913
- chore(deps): bump the npm_and_yarn group across 1 directory with 2 updates by @dependabot[bot] in #914
- fix(hooks): unloop verdict gate + close commit/pr newline bypass by @DorianZheng in #915
- chore(apps): remove dead internal code by @DorianZheng in #916
- fix(dashboard): correct BoxLite logo assets by @DorianZheng in #918
- chore(assets): theme-adaptive favicon + logo README + white-bg variants by @DorianZheng in #919
- docs(readme): add ecosystem section, drop build badge by @DorianZheng in #920
- feat(dashboard): org box resource caps by @law-chain-hot in #895
- feat(hooks): trigger the verdict gate on detected verdict prose by @DorianZheng in #925
- feat(githooks): agent-agnostic gate layer at the git boundary by @DorianZheng in #928
- fix(dashboard): refresh terminal signed URL on reconnect by @law-chain-hot in #929
- fix(hooks): judge the whole turn and ask only the essential question by @DorianZheng in #930
- feat(volumes): support single-file volume mounts by @BatmanByte in #926
- feat(quickstart): Add C, CLI, and REST quickstart entries by @law-chain-hot in #894
- feat(cli): support rootfs paths in run and create by @BatmanByte in #934
- feat(hooks): add rule-recency reminder hook by @DorianZheng in #943
- fix(hooks): gitignore .pr-reviewed.json to keep verdict dossiers valid by @DorianZheng in #948
- refactor(dashboard): align scrollbars with theme by @law-chain-hot in #921
- fix(api): remove error box auto-reconcile by @G4614 in #900
- feat(net): expose gvproxy services + /tunnel via NetworkBackend by @DorianZheng in #949
- chore(deps): bump the go_modules group across 2 directories with 1 update by @dependabot[bot] in #952
- chore(deps): bump @xhmikosr/decompress from 10.2.0 to 10.2.1 in /apps in the npm_and_yarn group across 1 directory by @dependabot[bot] in #955
- fix(python): add async SimpleBox metrics by @G4614 in #960
- fix(runtime): align local defaults with cloud by @G4614 in #956
- fix(ci): run e2e-local on labeled fork PRs via pull_request_target by @DorianZheng in #987
- feat(rust-sdk): expose box network tunnels by @G4614 in #991
- fix(musl): run static shim without libkrunfw dlopen by @xhebox in #937
- chore(deps): bump websocket-driver from 0.7.4 to 0.7.5 in /apps in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1001
- chore(deps): bump the npm_and_yarn group across 1 directory with 5 updates by @dependabot[bot] in #1010
- chore(deps): bump @astrojs/node from 10.0.5 to 11.0.2 in /apps in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1013
- fix(run): run COMMAND as the container init (docker semantics) by @DorianZheng in #988
- fix(exec): validate floating timeout seconds by @BatmanByte in #1012
- chore(deps): bump the npm_and_yarn group across 1 directory with 7 updates by @dependabot[bot] in #1014
- chore(deps): bump google.golang.org/grpc from 1.80.0 to 1.82.1 in /apps/common-go in the go_modules group across 1 directory by @dependabot[bot] in #1015
- feat: add auto pause and resume lifecycle options at box creation time by @xhebox in #1009
- feat(core): expose box network tunnels by @G4614 in #992
- feat(sdk): expose box network tunnels by @G4614 in #994
- feat(volume): add volume surface across CLI/SDK/REST on v1 (id-based, backend not yet supported) by @G4614 in #964
- feat(api): proxy box network tunnels by @G4614 in #998
- fix(ci): allow fork-PR checkout in label-gated e2e workflow by @DorianZheng in #1017
- feat(proxy): route public box service traffic by @G4614 in #995
- chore(musl): revert static shim libkrunfw dlopen change (#937) by @DorianZheng in #1019
- fix(runtime): resync guest clock after host sleep and quiesce by @EXboys in #899
- feat(preview): adapt browser HTTP over runner tunnels by @G4614 in #993
- fix(portal): tolerate pre-#988 guest missing Container.Start by @DorianZheng in #1020
- fix(lifecycle): correct create-time box option validation by @DorianZheng in #1021
- ci(e2e-local): queue runs behind in-progress instead of cancelling by @DorianZheng in #1023
- chore(deps-dev): bump postcss from 8.5.10 to 8.5.12 in /apps in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1024
- feat(api): env-configurable box image allowlist by @DorianZheng in #1027
- fix(python-sdk): clean up ruff lint baseline and pin ruff version by @nieyy in #1030
- fix(apps): remove unsafe box resource resize by @DorianZheng in #1037
- feat(cli): group tunnel under network by @DorianZheng in #1039
- chore(deps-dev): bump postcss from 8.5.12 to 8.5.18 in /apps in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1033
- feat(api): add org-wide box quota and concurrency limit by @DorianZheng in #1028
- Support custom guest kernels by @DorianZheng in #1041
- Gate custom kernels behind an RC opt-in by @DorianZheng in #1051
- fix(cli): render table correctly when box list is empty by @niyue in #1058
- Add structured container capability controls by @DorianZheng in #1047
- feat: add experimental nested virtualization by @DorianZheng in #1054
- feat(network): add local port publication by @DorianZheng in #1031
- ci(e2e): add dev-targeted E2E workflow by @G4614 in #1063
- ci(e2e): rename e2e-dev workflow to e2e-cloud by @DorianZheng in #1070
- feat: add embedded SSH server by @DorianZheng in #1042
- fix(hooks): make mtime checks portable by @uran0sH in #1081
- fix(api): restore box usage period ledger by @DorianZheng in #1083
- fix(libkrun-sys): let a static shim dlopen libkrunfw by @DorianZheng in #1084
- feat!: remove ssh-gateway by @DorianZheng in #1087
- refactor(apps): move api-client-go and common-go under apps/libs by @DorianZheng in #1088
- feat(exec): drain guest output before attach by @BatmanByte in #1022
- fix(gvproxy)!: apply allow_net to UDP egress by @ltstriker in #1090
- fix(infra): harden SST deployments by @DorianZheng in #1093
- fix(ci): use one SST deployment selector by @DorianZheng in #1094
- fix(rootfs): key guest rootfs cache on the resolved guest binary by @DorianZheng in #1096
- feat(infra): land runner binary upgrades via SST, one host at a time by @DorianZheng in #1097
- fix(ci): deploy stack without Runner by @DorianZheng in #1095
- refactor(box-images)!: adopt v0.1.0 line, relocate under apps/ by @DorianZheng in #1100
- fix(gvproxy)!: apply allow_net to the host alias IP by @ltstriker in #1106
- docs(contributing): mandate before/after call graph in PR descriptions by @DorianZheng in #1107
- feat(agents): watch CI and PR feedback after every push by @DorianZheng in #1112
- refactor(agents): move gate implementations out of .claude into .agents by @DorianZheng in #1115
- feat(infra): bootstrap deployment prerequisites, protect the prod stage by @DorianZheng in #1113
- Update README by @DorianZheng in #1116
- fix(infra): unblock the first real deploy and finish the login flow by @DorianZheng in #1118
- fix(infra): stop verifying an image list /api/config never returns by @DorianZheng in #1120
- docs(infra): point the removed image check at #1045 by @DorianZheng in #1121
- feat(infra): source the API and Runner from one artifact selector by @DorianZheng in #1122
- fix(tunnel)!: own half-close in core, tolerate a hung-up peer by @DorianZheng in #1123
- fix(agents): harden gate hooks, pin suites against ambient state by @DorianZheng in #1125
- feat(githooks): install the gate from make setup, drop install.sh by @DorianZheng in #1126
- refactor(e2e): move stack suite under apps by @DorianZheng in #1127
- fix(ci): grant deploy-infra's reusable calls contents: write by @DorianZheng in #1129
- ci(e2e-cloud): run only from a deploy or a dispatch by @DorianZheng in #1131
- feat(agents): short-circuit verdict triage, park FAILed dossiers by @DorianZheng in #1132
- feat(ci): build the Api image in its own job, beside the C SDK by @DorianZheng in #1134
- refactor(lifecycle)!: rename auto_pause to auto_stop across the stack by @DorianZheng in #1135
- refactor(infra): give AWS resource names a workload slot by @DorianZheng in #1137
- fix(runner): evict spent box handles, map every core status by @DorianZheng in #1138
- fix(infra): stop the wrapper tests inheriting artifact selectors by @DorianZheng in #1140
- refactor(build): drop unused --dest-dir/--libs-dir from build scripts by @DorianZheng in #1143
- fix(libkrun-sys): keep libkrunfw's libc dependency aarch64-only by @DorianZheng in #1145
- feat(ci): deploy the head of an open PR, not only main by @DorianZheng in #1148
- feat(ci): deploy an open PR's head by number, not SHA by @DorianZheng in #1151
- feat(infra): run the commerce billing service on the dev stack by @DorianZheng in #1159
- Worktree snoopy conjuring peacock by @DorianZheng in #1161
- fix(hooks): triage on whether a turn shows its evidence, not on facts by @DorianZheng in #1164
- feat(ci): select which components deploy-infra builds and deploys by @DorianZheng in #1165
- fix(ci): refuse a narrowed deploy on a commit that cannot scope by @DorianZheng in #1167
- feat(dashboard): consolidate billing into one restyled page by @DorianZheng in #1166
- feat(api): export finalized box usage to Commerce via an outbox by @DorianZheng in #1169
- fix(api): reject usage-export settings that cannot work by @DorianZheng in #1170
- refactor(apps): remove fork-local admin observability console by @DorianZheng in #1171
- feat(go): add box archive import and export by @ltstriker in #1162
- fix(api): reject a usage-export URL carrying a query or fragment by @DorianZheng in #1173
- chore(api): drop the orphaned observability audit target by @DorianZheng in #1174
- Fix ext4 ownership/sizing; cut rootfs merge traversals by @DorianZheng in #1177
- feat(observability): make Jaeger receive traces locally and in AWS by @DorianZheng in #1175
- chore(infra-local): drop dead runtime-pin and cache-patch workarounds by @DorianZheng in #1178
- fix(infra): keep Jaeger OTLP ingest off the internet-facing ALB by @DorianZheng in #1179
- fix(disk): silent debugfs failures, xattr loss, image capacity by @DorianZheng in #1182
- chore(infra): remove the Commerce service and its ECR bootstrap by @DorianZheng in #1183
- feat(api): snapshot open allocations, admit a billing role by @DorianZheng in #1188
- feat: repair a box startup whose job completion was lost by @ltstriker in #1091
- fix(infra): give the usage exporter the settings it waits for by @DorianZheng in #1190
- fix(api): add owner-safe usage lock leases by @zhaoyuana777 in #1180
- Update CLAUDE.md by @DorianZheng in #1193
- Remove CLAUDE.md documentation for dashboard by @DorianZheng in #1194
- docs(infra): stop documenting the removed ops-console workload by @DorianZheng in #1195
- feat(rest): expose managed volume CRUD via REST API by @G4614 in #1191
- feat(runner): execute the box migration jobs by @DefeatMan in #1189
- feat(rest): accept managed volume mounts on REST box creation by @G4614 in #1192
- test(e2e): align test_sdk_tunnel.py with the rest of the suite's box lifecycle by @G4614 in #1187
- feat(rest): expose S3 managed volumes by @G4614 in #1056
- fix(exec): signal executions through a verifiable exit claim by @BatmanByte in #1185
- feat[runner]: Runner Decommission by @zhaoyuana777 in #1201
- refactor(guest): replace external chown with syscalls by @ltstriker in #1210
- fix(api): stop auto-destroying boxes during runner drain by @zhaoyuana777 in #1211
- feat(dev): add validated BoxLite diagrams skill by @DorianZheng in #1218
- feat(api): advance box migrations from reported job status by @DefeatMan in #1215
- fix(ci): support both deploy verifier layouts by @DorianZheng in #1225
- fix(ci): support versioned deploy scope capability by @DorianZheng in #1228
- refactor(apps): remove unused job types by @DorianZheng in #1227
- fix(ci): support relocated deploy environment validator by @DorianZheng in #1229
- Align REST network DTO with inbound/outbound core shape by @G4614 in #1199
- fix(ci): support relocated deployment preview by @DorianZheng in #1230
- refactor(infra): organize deployment by domain by @DorianZheng in #1222
- fix(api): keep open usage periods in step with their boxes by @ltstriker in #1104
- build(guest): add static e2fsprogs tools by @ltstriker in #1219
- fix(api): namespace box migration jobs under BACKUP by @DefeatMan in #1233
- feat(diagrams): validate cloud architecture containment by @DorianZheng in #1235
- docs(apps): catalog service APIs by @DorianZheng in #1236
- feat(cli): remove --mount by @G4614 in #1216
- docs(apps): catalog application data model by @DorianZheng in #1244
- feat(network): add tunnel listener forwarding by @DorianZheng in #1243
- docs(apps): correct and reorganize service API catalog by @DorianZheng in #1246
- build(guest): build minimal rootfs by @ltstriker in #1245
- feat(exec): retain terminal sessions after exit by @BatmanByte in #1146
- docs(apps): add missing interfaces to service API catalog by @DorianZheng in #1248
- feat(dashboard): volumes console and restructured create-box dialog by @Mandalorian-Wang in #1252
- fix(dashboard): restore the OpenAPI mention in REST quickstart setup by @Mandalorian-Wang in #1251
- fix(ci): accept deployment capability v2 by @DorianZheng in #1253
- fix(dashboard): close data-loss and mount-format gaps merged in #1252 by @Mandalorian-Wang in #1254
- feat(box): start containers in the background by @ltstriker in #1249
- feat(infra): read stage config from the SST secret store by @DorianZheng in #1258
- fix(dashboard): accept nullable volume last-used timestamp by @DorianZheng in #1259
- fix(infra): keep deploy-wrapper progress off sst's stdout stream by @DorianZheng in #1262
- refactor(infra): remove duplicated modules and dead deploy paths by @DorianZheng in #1263
- fix(infra): scope the deploy role's IAM and secrets grants to one stage by @DorianZheng in #1264
- feat(dashboard): bind the Usage tab to the commerce quota API by @DorianZheng in #1256
- ci: extract shared workflow steps into composite actions by @DorianZheng in #1265
- test(infra): type-check infra scripts before running their suite by @DorianZheng in #1266
- fix(api): give the image build a node-gyp toolchain by @DorianZheng in #1269
- fix(infra): enable allocation snapshots with usage export by @mamamiyear in #1267
- feat(infra): add selectable ClickHouse backend by @DorianZheng in #1234
- fix(api): detect MinIO via its STS endpoint by @mamamiyear in #1275
- fix(disk): handle whitespace in debugfs paths by @mamamiyear in #1274
- fix(api): resolve box migration import target before the transaction by @DefeatMan in #1277
- update billing tab by @DorianZheng in #1280
- refactor(dashboard): replace tier-based billing API with plan-based by @DorianZheng in #1283
- fix plan by @DorianZheng in #1284
- feat(proxy): Export application logs over OTLP by @zhaoyuana777 in #1282
- Add custom billing plan card by @DorianZheng in #1286
- Align billing UI with Commerce by @DorianZheng in #1287
- feat(box): add privileged plumbing for DinD by @G4614 in #646
- Split NetworkSpec into outbound/inbound directions by @G4614 in #996
- refactor(api): remove organization quota ownership by @DorianZheng in #1292
- Require source metadata in sequence diagram messages by @DorianZheng in #1293
- ci(api): preserve tests after quota removal by @DorianZheng in #1294
- fix(dashboard): restore Volumes navigation by @DorianZheng in #1291
- perf(export): eliminate transient flatten sync bottleneck by @ltstriker in #1279
- fix(proto): stop wrapping capabilities in a process submessage by @G4614 in #1289
- refactor(agent): use shared tooling by @DorianZheng in #1299
- feat(rest): support big file copies by @ltstriker in #1298
- build(guest): emit standalone guest artifacts by @ltstriker in #1300
- fix(dashboard): fix the quickstart picker labels and the box-name hint by @Mandalorian-Wang in #1301
- fix(dashboard): align billing tabs with page content by @DorianZheng in #1303
- fix(rest): keep box activity fresh for the request lifetime by @ltstriker in #1302
- chore(setup): auto-init worktree submodules by @DorianZheng in #1304
- chore(nx): disable workspace daemon by @DorianZheng in #1306
- fix(lint): satisfy clippy 1.98 lints by @ltstriker in #1309
- test(e2e): pin REST host bind mounts as rejected, not silently dropped by @G4614 in #1102
- feat(runtime): build minimal guest rootfs image in background by @ltstriker in #1305
- feat(infra): let a deploy create a declared Runner by @DefeatMan in #1310
- feat(dashboard): make box names visible and copyable on boxes views by @Mandalorian-Wang in #1317
- feat(dashboard): quote box price from published usage rates by @Mandalorian-Wang in #1315
- chore: float agent-tooling on main with a recorded revision by @DorianZheng in #1319
- docs: adopt the shared agent-tooling guidance block in AGENTS.md by @DorianZheng in #1321
- feat(runtime): boot from the minimal guest rootfs image by @ltstriker in #1322
- fix(dashboard): make the wallet warn, and name the unsubscribed modes by @Mandalorian-Wang in #1323
- feat(dashboard): confirm plan changes on a page and show what is queued by @DorianZheng in #1325
- fix(dashboard): read one predicate for what a cycle rolls into by @DorianZheng in #1327
- feat(billing): add concurrency timeline by @DorianZheng in #1326
- fix(billing): scale concurrency chart to usage by @DorianZheng in #1329
- feat(auth): align the hosted login and auth surfaces with the console by @Mandalorian-Wang in #1270
- fix(guest): enable protected link sysctls by @aiqubits in #1328
- fix(dashboard): allow top-ups without a saved card by @mamamiyear in #1331
- feat(auth): gate database login on verified email by @DorianZheng in #1332
- fix(gvproxy)!: bind allow_net host checks to the resolved destination by @ltstriker in #1330
- fix(auth): return 403 with a code for unverified email by @DorianZheng in #1335
- feat(infra): send mail through SES, retire the internal admin UIs by @DorianZheng in #1336
- fix(dashboard): keep the quickstart shut for returning users by @DorianZheng in #1337
- refactor(runtime): stop mutating capabilities from privileged mode by @G4614 in #1296
- feat(dashboard): update billing plan and payment methods by @DorianZheng in #1341
- feat: automate agent tooling bootstrap by @DorianZheng in #1343
- fix(runtime): keep host diagnostics out of client-facing errors by @ltstriker in #1346
- fix: complete first plugin bootstrap by @DorianZheng in #1344
- feat(volumes): address managed volumes by id or name, drop volume:// by @DorianZheng in #1350
- fix(runtime): derive RLIMIT_FSIZE from disk_size_gb by @G4614 in #1231
- feat(rest)!: reject host-only box options and wire the dropped ones by @DorianZheng in #1354
- fix(rest): classify transport faults, unblock two red tests by @DorianZheng in #1357
- fix(import): reject link archive members and fail closed on bad disks by @ltstriker in #1359
- fix(seccomp): allow time syscall in x86_64 vmm filter by @ltstriker in #1367
- chore(seccomp): wrap over-width line to satisfy rustfmt by @ltstriker in #1369
- chore(release): bump version to 0.10.0 by @ltstriker in #1374
- fix(dashboard): round top-up amounts to integer cents by @mamamiyear in #1375
- fix(images): cap decompressed layer size during extraction by @ltstriker in #1372
- fix(api): reject tunnel CONNECT for a stopped box instead of silently dropping the stream by @G4614 in #1352
- fix(files): refuse mount-shadowed copies and chown to the box user by @DorianZheng in #1363
- feat(infra): bootstrap Auth0 email verification by @DorianZheng in #1379
- fix(security): separate host sandbox grants from guest networking by @G4614 in #1079
- chore(infra): move Auth0 email bodies to HTML and set signup flag by @DefeatMan in #1380
- refactor(dashboard): place balance warnings by severity by @mamamiyear in #1381
- feat(cloud): wire box secrets through the REST create path by @ltstriker in #1365
- feat(api): push component health to incident.io status page by @DorianZheng in #1376
- fix(api): deadline status-sync reads and retire orphaned alerts safely by @DorianZheng in #1386
- refactor(dashboard): show remaining quota in usage summary by @mamamiyear in #1388
- fix(guest): make container start idempotent and revive zombies on exec by @ltstriker in #1382
- Expose inbound network policy across CLI, SDKs, serve, and NetworkInfo by @G4614 in #1206
- fix(python): stop passing sccache wrapper into wheel containers by @ltstriker in #1395
- build(node): pin napi-rs CLI to 3.7.2 by @ltstriker in #1397
- fix(core): map BoxOptions caller-input validation errors to 400 by @G4614 in #1394
New Contributors
- @BatmanByte made their first contribution in #926
- @xhebox made their first contribution in #937
- @EXboys made their first contribution in #899
- @nieyy made their first contribution in #1030
- @niyue made their first contribution in #1058
- @ltstriker made their first contribution in #1090
- @zhaoyuana777 made their first contribution in #1180
- @DefeatMan made their first contribution in #1189
- @Mandalorian-Wang made their first contribution in #1252
- @mamamiyear made their first contribution in #1267
- @aiqubits made their first contribution in #1328
Full Changelog: v0.9.7...v0.10.0