Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
215 commits
Select commit Hold shift + click to select a range
2729789
fix(native): bound the cleanup stop batch and retry refused connects
roodboi Nov 5, 2026
ca8f5e5
fix(native): locate review port findings and name doctor next steps
roodboi Nov 5, 2026
bd034af
fix(env): require consent before env migration changes tracked files
roodboi Nov 5, 2026
96a7252
feat(native): accept optional dependencies, stdin/tty, inert route la…
roodboi Nov 5, 2026
7c272b5
feat(native): add hack down --remove-data for stopped native projects
roodboi Nov 5, 2026
2fb711a
feat(native): read project adaptation and machine settings from files
roodboi Nov 5, 2026
f48aee8
feat(native): deliver private credential files into environment alloc…
roodboi Nov 5, 2026
3439c82
feat(native): accept a compact services list in host dependency files
roodboi Nov 5, 2026
c039ff9
feat(native): admit covered image volumes and warn on data-service risks
roodboi Nov 5, 2026
dbcefdc
feat(native): pin a BuildKit client and scan Dockerfile image references
roodboi Nov 5, 2026
0d95e98
feat(native): apply project-wide host aliases with declarative host d…
roodboi Nov 5, 2026
5b67485
feat(native): run down hooks when foreground up is stopped
roodboi Nov 5, 2026
fb36288
test(native): use a neutral container path in file-member fixtures
roodboi Nov 5, 2026
901d3e3
feat(native): add a gcloud ADC file-mode adapter and AWS expiry warnings
roodboi Nov 5, 2026
2e4a2c9
fix(native): accept the one-shot label and name the Compose rerun for…
roodboi Nov 5, 2026
da25b89
test(native): scope port default redaction assertion to diagnostics
roodboi Nov 5, 2026
dc9e0b4
fix(native): admit the exact one-shot marker at native startup admission
roodboi Nov 5, 2026
eeaf50f
fix(native): bound nested default words by the expanded budget
roodboi Nov 5, 2026
108d80e
fix(native): verify one-off image volumes against parent storage
roodboi Nov 5, 2026
fc26dd9
feat(native): review interpolated port defaults and IPv6 loopback ports
roodboi Nov 5, 2026
cbb4552
fix(env): keep .hack/.env while Compose interpolates a service-only key
roodboi Nov 5, 2026
3d40b5b
fix(native): recover abandoned removal locks and release them on cancel
roodboi Nov 5, 2026
abcf36e
fix(native): keep disposable-cache volumes in data-service advisories
roodboi Nov 5, 2026
4fc5b5e
fix(native): skip condition checks for dropped optional dependencies
roodboi Nov 5, 2026
8f72922
feat(native): give Compose-file containers Docker's default capabilities
roodboi Nov 5, 2026
c88d84d
fix(native): resolve overridden platform arguments before accepting them
roodboi Nov 5, 2026
4d61ef2
fix(storage): re-pin native file and storage helper to oven/bun:1.4.4…
roodboi Nov 5, 2026
c0b67ac
fix(native): re-read host alias inputs after hooks and refuse unreada…
roodboi Nov 5, 2026
3d50abe
fix(native): cancel foreground down hooks by owned process group
roodboi Nov 5, 2026
fd35088
fix(native): refuse read-only covers for image volumes
roodboi Nov 5, 2026
78a22c2
fix(native): bound argument expansion and require plain ARG names
roodboi Nov 5, 2026
25fc0e0
fix(env): keep .hack/.env when Compose env inputs can't be checked
roodboi Nov 5, 2026
29a8f53
fix(native): keep the env selection without managed env files; valida…
roodboi Nov 5, 2026
932e577
feat(native): share many project roots in one development pool
roodboi Nov 5, 2026
77747bd
fix(native): deliver private file members only to profile-active serv…
roodboi Nov 5, 2026
2583e9f
feat(native): acquire images from any OCI registry with bounded budgets
roodboi Nov 5, 2026
cb42323
fix(native): refuse retained-data removal of a run restored meanwhile
roodboi Nov 5, 2026
78c8224
feat(native): add a new project root to the stopped shared pool on up
roodboi Nov 5, 2026
98f79ba
fix(native): canonicalize service host aliases before matching bindings
roodboi Nov 5, 2026
10df82b
fix(native): keep the connect stage when the deadline passes during b…
roodboi Nov 5, 2026
fe503d4
fix(native): await a concurrent down.before before foreground cleanup
roodboi Nov 5, 2026
05fef1f
chore: merge next into claude/hack-1302-native-stop-batch
roodboi Nov 5, 2026
a300f24
feat(native): build images in the guest engine with runtime build-image
roodboi Nov 5, 2026
e5eb577
test(native): keep the build cancellation test valid on a loaded host
roodboi Nov 5, 2026
64ac8da
feat(native): admit build storage, prune build cache and reclaim supe…
roodboi Nov 5, 2026
950c207
chore: merge next into claude/native-credential-files
roodboi Nov 5, 2026
7784059
feat(native): publish Compose ports on host loopback through owned br…
roodboi Nov 5, 2026
9bd0dd0
feat(native): owner-scoped host dependencies and automatic listener r…
roodboi Nov 5, 2026
62f6112
fix(native): refuse a build stage named scratch
roodboi Nov 5, 2026
ba79617
feat(native): opt-in linux/amd64 services under Rosetta 2 in the VM
roodboi Nov 5, 2026
a671d8c
docs(runtime-core): record the amd64_emulation owner field
roodboi Nov 5, 2026
ae6f01f
fix(native): record runs started without managed env files
roodboi Nov 5, 2026
271bd62
feat(native): run Compose restart policies through the guest engine
roodboi Nov 5, 2026
3de5fd1
fix(native): report foreground progress, busy ps and input causes
roodboi Nov 5, 2026
f51e426
feat(native): build Compose build services in native up behind HACK_N…
roodboi Nov 5, 2026
df46386
fix(native): scaffold native-startable init and release the HOME alia…
roodboi Nov 5, 2026
bbd6bb0
fix(native): detect zstd layers that start with a skippable frame
roodboi Nov 5, 2026
127883e
fix(native): bound credential helper stdout drain independently of de…
roodboi Nov 5, 2026
24ce5a8
fix(native): reconcile stopped graphs after Compose edits
roodboi Nov 5, 2026
1453ee6
fix(native): keep registry credentials and connections on admitted or…
roodboi Nov 5, 2026
525a067
docs(native): describe registry origin, realm and address rules
roodboi Nov 5, 2026
4f6841a
fix(native): keep whitespace after the heredoc operator in one word
roodboi Nov 5, 2026
074e993
fix(native): report service exits, runtime reasons and interleaved logs
roodboi Nov 5, 2026
e7b948c
Merge remote-tracking branch 'origin/next' into claude/hack-1915-nati…
roodboi Nov 5, 2026
f5b2cbc
fix(native): reuse a running pool when its primary root moved
roodboi Nov 5, 2026
3f8fe69
docs(native): record the stop batch scheduler as a model-coverage gap
roodboi Nov 5, 2026
34e20b0
chore: merge next into claude/hack-1302-native-stop-batch
roodboi Nov 5, 2026
6281a11
Merge branch 'claude/hack-1915-native-cli-feedback' into claude/hack-…
roodboi Nov 5, 2026
72e834f
chore: merge next into claude/hack-1904-env-migration-safety
roodboi Nov 5, 2026
30548e1
fix(native): refuse every non-global registry destination address
roodboi Nov 5, 2026
be6f194
fix(native)!: bind machine settings to listed project roots; validate…
roodboi Nov 5, 2026
431180e
fix(native): retain JSON metadata that starts with whitespace
roodboi Nov 5, 2026
f73bc4b
fix(native): recover interrupted share adds and release removed graph…
roodboi Nov 6, 2026
e177712
fix(models): accept every reachable restart-policy witness
roodboi Nov 6, 2026
3ff53d9
fix(native): keep the HOME alias reserved on down and never use a squ…
roodboi Nov 6, 2026
2427a33
Merge remote-tracking branch 'origin/next' into claude/hack-1907-revi…
roodboi Nov 6, 2026
ae1fba0
fix(native): requalify reserve restart after enabling amd64 emulation
roodboi Nov 6, 2026
9104416
fix(native): resolve the published platform before reusing an amd64 c…
roodboi Nov 6, 2026
78439d2
fix(native): bind amd64 emulation policy to reviewed plans and retain…
roodboi Nov 6, 2026
149514c
Merge remote-tracking branch 'origin/next' into claude/hack-1906-one-…
roodboi Nov 6, 2026
355ae22
fix(native): preserve adopt operation in backend rerun hints
roodboi Nov 6, 2026
0776feb
test(native): keep the moved root's inode allocated before recreating it
roodboi Nov 6, 2026
fc41d22
chore: merge claude/hack-1907-review-diagnostics into claude/native-p…
roodboi Nov 6, 2026
53d0dad
fix(native): keep authored log streams within their bound
roodboi Nov 6, 2026
8216321
test(native): spawn remove-data child processes with a private env
roodboi Nov 6, 2026
4990592
fix(native): keep the managed env guard when resuming retained runs
roodboi Nov 6, 2026
33293ea
test(models): accept every reachable first violation for multi-root-s…
roodboi Nov 6, 2026
dd58145
fix(native): deliver managed env to active services and explain start…
roodboi Nov 6, 2026
4668ef1
fix(runtime): classify a finished initializer by its own exit, not as…
roodboi Nov 6, 2026
420a9d8
fix(native): audit large provider descriptor tables and own failed st…
roodboi Nov 6, 2026
a40260c
feat(native): report failed services' last output on startup failure
roodboi Nov 6, 2026
f40855d
Merge remote-tracking branch 'refs/remotes/pr/620' into claude/train-…
roodboi Nov 6, 2026
8e4306a
Merge remote-tracking branch 'refs/remotes/pr/582' into claude/train-…
roodboi Nov 6, 2026
22ec3f9
Merge remote-tracking branch 'refs/remotes/pr/593' into claude/train-…
roodboi Nov 6, 2026
43a46fc
Merge remote-tracking branch 'refs/remotes/pr/591' into claude/train-…
roodboi Nov 6, 2026
8dcef14
Merge remote-tracking branch 'refs/remotes/pr/596' into claude/train-…
roodboi Nov 6, 2026
8709ef7
chore: merge #618 into claude/train-batch-1
roodboi Nov 6, 2026
5d041a1
chore: merge claude/native-ports into claude/native-ports-loopback
roodboi Nov 6, 2026
2e342c9
chore: merge claude/native-build-groundwork into claude/native-image-…
roodboi Nov 6, 2026
8b82f36
fix(native): move a squatted alias before the public up reads the pro…
roodboi Nov 6, 2026
a20da6d
fix(native): let an interrupted translation update recover on the res…
roodboi Nov 6, 2026
7ad87cb
fix(native): refuse arm64 images for services whose reviewed policy i…
roodboi Nov 6, 2026
cb03349
fix(native): release only validated archive blocks during image upload
roodboi Nov 6, 2026
a6a301c
chore: merge claude/native-shared-pool-multi-project into claude/nati…
roodboi Nov 6, 2026
4ddf956
fix(native): wait for starting loopback port endpoints within the sta…
roodboi Nov 6, 2026
2c11e12
chore: merge next into claude/native-rosetta-amd64
roodboi Nov 6, 2026
d2a2080
test(native): name an owned network in engine admission controls
roodboi Nov 6, 2026
a0c58c8
fix(native): build from the scanned Dockerfile and filter build output
roodboi Nov 6, 2026
6ab25d8
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
7ba0c59
fix(native): never prune parents when reclaiming and keep the last ve…
roodboi Nov 6, 2026
f3cfc4d
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
297df5a
fix(native): drop the build declaration when restart pins a built image
roodboi Nov 6, 2026
1ea5f33
fix(native): bound build shutdown on a stalled caller and time base r…
roodboi Nov 6, 2026
c92aa78
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
4ebc17b
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
1d42589
fix(native): keep build arguments named __proto__
roodboi Nov 6, 2026
eda16c6
Merge remote-tracking branch 'refs/remotes/pr/584' into claude/train-…
roodboi Nov 6, 2026
8e0bf5c
chore: merge #592 into claude/train-batch-2
roodboi Nov 6, 2026
7405310
chore: merge #586 into claude/train-batch-2
roodboi Nov 6, 2026
f2cadb1
chore: merge #588 into claude/train-batch-2
roodboi Nov 6, 2026
ebd7dde
chore: merge #590 into claude/train-batch-2
roodboi Nov 6, 2026
62feb75
chore: merge #594 into claude/train-batch-2
roodboi Nov 6, 2026
1973e92
fix(native): refuse ADD sources that native builds would fetch remotely
roodboi Nov 6, 2026
f26acd9
fix(native): pass build arguments in a private bake definition and wi…
roodboi Nov 6, 2026
7bcd47e
docs(storage): note that 1.4.2-helper storage refusal is expected on …
roodboi Nov 6, 2026
441080f
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
ab08fe5
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
de13309
fix(native): read JSON form as BuildKit does and add a source policy
roodboi Nov 6, 2026
0dff25c
docs(native): state that build arguments are not secrets
roodboi Nov 6, 2026
46899b4
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
4c8bd49
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
f21d5a0
fix(native): allow only pinned images in the build source policy
roodboi Nov 6, 2026
b007be2
fix(native): build only active profiles and refuse managed secrets as…
roodboi Nov 6, 2026
083158c
chore: merge claude/native-build-groundwork into claude/native-image-…
roodboi Nov 6, 2026
8c39b60
fix(native): run every build under the pinned-base source policy
roodboi Nov 6, 2026
41bccd5
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
8dbafdc
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
3b42fdd
fix(native): size the build receipt bound for every accepted base pin
roodboi Nov 6, 2026
3c91af7
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
95ad760
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
5a40b44
fix(native): discard an interrupted receipt publication under the key…
roodboi Nov 6, 2026
aa1c72e
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
1ed56b2
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
460ddff
fix(native): keep a surviving build client fenced after the CLI is ki…
roodboi Nov 6, 2026
8e93493
chore: merge claude/native-image-builds into claude/native-image-buil…
roodboi Nov 6, 2026
8ec7460
chore: merge claude/native-image-builds-retention into claude/native-…
roodboi Nov 6, 2026
09f4c12
Merge remote-tracking branch 'refs/remotes/pr/619' into claude/train-…
roodboi Nov 6, 2026
af11b94
chore: merge #622 into claude/train-batch-3
roodboi Nov 6, 2026
7c3fa6e
Merge remote-tracking branch 'refs/remotes/pr/613' into claude/train-…
roodboi Nov 6, 2026
2623117
Merge remote-tracking branch 'refs/remotes/pr/614' into claude/train-…
roodboi Nov 6, 2026
f0227fd
chore: merge next into claude/train-batch-2
roodboi Nov 6, 2026
e755e23
fix(native): keep the gcloud selection on a recorded failed-start owner
roodboi Nov 6, 2026
bff310c
chore: merge batch 2 (#625) into claude/train-batch-3
roodboi Nov 6, 2026
f2121e4
chore: merge next into claude/train-batch-3
roodboi Nov 6, 2026
a402696
chore: merge #602 into claude/train-batch-4
roodboi Nov 6, 2026
a230766
Merge remote-tracking branch 'refs/remotes/pr/603' into claude/train-…
roodboi Nov 6, 2026
33c330f
chore: merge #589 into claude/train-batch-4
roodboi Nov 6, 2026
a299cab
Merge remote-tracking branch 'refs/remotes/pr/599' into claude/train-…
roodboi Nov 6, 2026
e1904c0
Merge remote-tracking branch 'refs/remotes/pr/604' into claude/train-…
roodboi Nov 6, 2026
e875287
Merge remote-tracking branch 'refs/remotes/pr/600' into claude/train-…
roodboi Nov 6, 2026
e20e19b
fix(native): redact credential files from failed-service output
roodboi Nov 6, 2026
17ad74b
fix(native): initialize loopback ports in native config-plan resources
roodboi Nov 6, 2026
8f62bde
Merge remote-tracking branch 'refs/remotes/pr/604' into claude/train-…
roodboi Nov 6, 2026
f07ea58
fix(native): admit native build fields and name services in build ref…
roodboi Nov 6, 2026
f38751c
fix(native): relay the build client so the VM stays responsive
roodboi Nov 6, 2026
ffe2b3f
fix(native): stop a VM whose guest agent stopped responding
roodboi Nov 6, 2026
9844caa
chore: merge next into claude/train-batch-3
roodboi Nov 6, 2026
14ad93f
chore: merge claude/train-batch-3 into claude/train-batch-4
roodboi Nov 6, 2026
5643b8c
fix(native): remove build relay sockets a killed process left behind
roodboi Nov 6, 2026
66d25b8
fix(native): bound build relay buffers by pending bytes
roodboi Nov 6, 2026
a86b3cf
fix(native): refuse a silent-guest stop while a build is admitted
roodboi Nov 6, 2026
009989c
fix(native): restore a sourceless graph after its project files were …
roodboi Nov 6, 2026
f4fd827
fix(native): gate the build fence test helper to macOS
roodboi Nov 6, 2026
8be8201
chore: merge #611 into claude/train-batch-5
roodboi Nov 6, 2026
30bfb53
chore: merge #615 into claude/train-batch-5
roodboi Nov 6, 2026
1a5e8be
chore: merge #601 into claude/train-batch-5
roodboi Nov 6, 2026
1ca2ace
chore: merge #608 into claude/train-batch-5
roodboi Nov 6, 2026
dfb51b3
test: type the data handoff advisory fixture literally
roodboi Nov 6, 2026
144a6d9
chore: merge #609 into claude/train-batch-5
roodboi Nov 6, 2026
b4ad9a6
chore: merge #610 into claude/train-batch-5
roodboi Nov 6, 2026
8a0292d
chore: merge #605 into claude/train-batch-5
roodboi Nov 6, 2026
d2f306c
chore: merge #597 into claude/train-batch-5
roodboi Nov 6, 2026
fdf9061
chore: merge #598 into claude/train-batch-5
roodboi Nov 6, 2026
7f42e32
fix(native): admit native build fields and name services in build ref…
roodboi Nov 6, 2026
1641265
Merge remote-tracking branch 'refs/remotes/pr/583' into claude/train-…
roodboi Nov 6, 2026
fb24966
chore: merge #606 into claude/train-batch-6
roodboi Nov 6, 2026
58f9b5b
chore: merge #607 into claude/train-batch-6
roodboi Nov 6, 2026
953cffa
chore: merge #612 into claude/train-batch-6
roodboi Nov 7, 2026
21f9554
chore: merge #628 into claude/train-batch-6
roodboi Nov 7, 2026
a93db84
Merge branch 'claude/hack-1924-build-vm-hang' into claude/hack-1926-b…
roodboi Nov 7, 2026
1e1b64e
chore: merge #629 into claude/train-batch-6
roodboi Nov 7, 2026
a36285c
chore: merge #630 into claude/train-batch-6
roodboi Nov 7, 2026
53b9522
test: give Compose config cases a budget above their child timeout
roodboi Nov 7, 2026
0cfdbaf
chore: merge #630 into claude/train-batch-6
roodboi Nov 7, 2026
9f33a1d
docs(native): describe the orphaned build client as fenced in model c…
roodboi Nov 7, 2026
a0e3e79
test(native): make the build client relay tests independent of concur…
roodboi Nov 7, 2026
c9f9f0e
chore: merge #607 into claude/train-batch-6
roodboi Nov 7, 2026
63fc195
chore: merge #629 into claude/train-batch-6
roodboi Nov 7, 2026
24b5c70
fix(native): start restart-policy services with ports or routes witho…
roodboi Nov 7, 2026
4cef93d
chore: merge next into claude/train-batch-5
roodboi Nov 7, 2026
c9870ce
test: apply #634's Compose config test budget
roodboi Nov 7, 2026
69ce60f
chore: merge next into claude/train-batch-5
roodboi Nov 7, 2026
2e34807
chore: merge claude/train-batch-5 into claude/train-batch-6
roodboi Nov 7, 2026
5459c08
test(native): scope the doctor settings privacy check to setting paths
roodboi Nov 7, 2026
91867ae
fix(native): keep base-only named env selections restartable
roodboi Nov 7, 2026
6a1192b
fix(native): name the changed env file and how to apply it
roodboi Nov 7, 2026
54dfd5b
chore: merge claude/train-batch-5 into claude/train-batch-6
roodboi Nov 7, 2026
6337e0e
chore: merge next into claude/train-batch-6
roodboi Nov 7, 2026
25849f9
fix(native): match image config keys case-insensitively like the engine
roodboi Nov 7, 2026
f88495e
fix(native): refuse non-ASCII keys in image metadata the engine reads
roodboi Nov 7, 2026
0d13545
fix(native): bound a build base's declared size before the build
roodboi Nov 7, 2026
6c0dd7d
fix(native): match Dockerfile stage names case-insensitively
roodboi Nov 7, 2026
1866c70
fix(registry): judge a credential helper by its reply when it skips i…
roodboi Nov 7, 2026
32758d9
fix(native): validate build-base layer descriptors like direct acquis…
roodboi Nov 7, 2026
fe683f9
Merge remote-tracking branch 'refs/remotes/pr/640' into claude/train-…
roodboi Nov 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 132 additions & 10 deletions docs/guides/native-candidate.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ Compose backend. Native support for them is planned after v5.
| External network | A top-level network sets `external: true` or `external: {name: ...}`. A reviewed `x-hack-isolated: true` replacement is not external: it creates an owned internal bridge. A network that the selected adaptation (`HACK_NATIVE_ADAPTATION` or the committed `.hack/native/adaptation.json`; see [Native settings files](#native-settings-files)) lists in `isolatedNetworks` gets the same replacement, so it is not external either. |
| External volume | A top-level volume sets `external: true` or `external: {name: ...}`. The native runtime only creates volumes it owns, and there is no native replacement for an external volume. |
| Reserved ownership label | A service, network or volume label key starts with `com.docker.compose.`, `io.hack-local.`, `io.hack.native-config.`, `io.hack.native-file.` or `io.hack.storage-witness.`. Compose, the native runtime and native-config Compose use these labels to prove which resources they own. |
| Build outside the basic form | A service `build` is not the basic form that [`hack config import --dry-run`](../reference/native-config-import.md#pure-basic-build-preview) accepts (a relative context and optional relative `dockerfile` and `target`), or the service also sets `image`. Build arguments, secrets, SSH, cache options, platforms and other build options are outside the basic form. |
| Build outside the basic form | A service `build` is not the basic form that [`hack config import --dry-run`](../reference/native-config-import.md#pure-basic-build-preview) accepts (a relative context and optional relative `dockerfile` and `target`), or the service also sets `image`. Build arguments, secrets, SSH, cache options, platforms and other build options are outside the basic form. With `HACK_NATIVE_BUILDS=1` (see below), only a build field other than `context`, `dockerfile`, `target` and `args`, or `image` together with `build`, counts; native build admission reviews the values of those four fields itself. |
| Non-native platform | A service sets a `platform` other than `linux/arm64` or `linux/arm64/v8`, for example `linux/amd64`. The native VM runs Linux arm64. A missing or `null` `platform` is unset and passes. `linux/amd64` passes only for a service that the `HACK_NATIVE_ADAPTATION` selection opts in to [amd64 emulation](#amd64-emulation-with-rosetta-2); every other platform value stays on the Compose backend. |

Native `hack up` and `hack restart` check for these features after selecting the
Expand Down Expand Up @@ -252,9 +252,51 @@ routing labels (`one_shot_route_conflict`).
because it reads and adopts the Compose backend's existing containers and
volumes. On the native backend it refuses before reading anything and names the
rerun: `HACK_RUNTIME_BACKEND=compose hack config adopt --dry-run`. See
[Legacy Compose adoption](../reference/native-compose-adoption.md). A basic build is also
refused by native image-project `up`, with the general refusal: it needs the
authored native format.
[Legacy Compose adoption](../reference/native-compose-adoption.md).

Native image-project `up` builds Compose `build:` services only when you opt in
with `HACK_NATIVE_BUILDS=1` (and the usual `HACK_NATIVE_SHARED_SOURCE=1`). Without
it, a `build:` service refuses before any hook or VM effect and names the variable.
With it:

- Accepted forms are `build: <context>` and a mapping of `context`, `dockerfile`,
`target` and `args`. Paths follow Compose (the context is relative to the Compose
file, the Dockerfile to the context) and must stay inside the project. `args` may be
a mapping of literal strings or numbers, or a list of `KEY=VALUE` literals. Any `$`
interpolation, a list item without `=` (host variable inheritance), `null`, other
build keys (`secrets`, `ssh`, `cache_from`, `platforms`, `network` and the rest),
remote contexts and `image` together with `build` refuse. Values are never shown.
- Build args are not secrets: as with Docker, the image records them in its history.
A build arg whose value equals a `hack env` secret value of this project and
environment refuses before any hook or VM effect, naming the service and the
argument but never the value. The refusal does not suggest the Compose backend,
because a Compose build would record the value in the image history too. Pass
secrets with BuildKit build secrets instead; native builds do not support them yet.
- Every build refusal names the service. A refusal from the runtime's build source
policy (for example a base image that is not a public Docker Hub reference) says
that it is the build source policy and what to change. Other build failures name
the service and keep the runtime's message.
- After the runtime is up, each distinct build runs once with
`runtime build-image` (below), and its filtered output streams to your terminal.
Every service with that build is then pinned to the built content ID, so review,
readiness and restore treat it like an image service.
- An existing image for the same build inputs is reused without building. Set
`HACK_NATIVE_REBUILD=1` to build again; base-image tags then resolve again too.
Edits to other files in the context do not trigger a rebuild, as with Compose.
- Restoring an unchanged retained run uses the retained images and never builds; if
one is missing, `up` refuses and asks you to start fresh. `hack restart` also never
builds: it reuses the running or retained image, or refuses before stopping anything.
- "Unchanged" means the same Compose bytes. A run that mounts no project source and
uses no dependency cache still restores after its Compose file was edited and put
back, or after any project file was touched; build-context edits do not rebuild it.
Its review then differs only in the project source inventory (file sizes and
modification times), which such a run never reads, and restore keeps the retained
ownership plan, images and data.
- As with Compose `up`, only build services in the selected profiles are built and
pinned. A build service in a profile you did not select is not built, and restore
and restart need no image for it; selecting its profile in a later fresh `up` builds
it then. Native builds are `linux/arm64` only; `platform: linux/amd64` is still
refused.

Native review reads Compose `ports` without reading environment values. Each
entry may be short (`[host_ip:][published:]target[/protocol]`, with an IPv6 host
Expand Down Expand Up @@ -314,12 +356,14 @@ the same adaptation selection as native `up` without `--env` before it reports.
finds an external network, the message also names the `isolatedNetworks` selection
above, which keeps that network's project on native.

A basic build is not one of these features, but native image-project `up` still
refuses it, so doctor does not report it as ok. On the native backend the check
warns, names the general configuration refusal and the next step (preview the
authored native conversion with `hack config import --dry-run`, or select the
Compose backend), and its JSON adds `composeBackend.nativeUpRefusals:
["basic_build"]`. On the Compose backend the same note is informational.
A basic build is not one of these features, but without `HACK_NATIVE_BUILDS=1`
native image-project `up` refuses it, so doctor does not report it as ok then. On the
native backend the check warns, names the variable and the next steps (set
`HACK_NATIVE_BUILDS=1`, preview the authored native conversion with
`hack config import --dry-run`, or select the Compose backend), and its JSON adds
`composeBackend.nativeUpRefusals: ["basic_build"]`. On the Compose backend the same
note is informational. With `HACK_NATIVE_BUILDS=1` set, doctor classifies builds the
way native builds admit them and reports no basic-build refusal.

Publication control tokens are delivered to the relay through a one-shot inherited
pipe (`--control-fd 0`), never through process arguments. The relay reads exactly
Expand Down Expand Up @@ -579,6 +623,11 @@ the mapping, inspect the exact instance with the current bundle:

Omitting `--branch` uses the same linked-worktree default as project commands;
detached linked worktrees require an explicit instance. Inspection writes nothing.
A mapping that still matches the checkout reports `state: "current"` with its run,
the native graph phase (or `null` while the pool is stopped), whether the graph's
run, owner, namespace and plan match the mapping, and `repairRequired: false`.
Only a mapping whose scope no longer matches goes through the legacy device-rebind
inspection below, which returns the `selectionSha256` that repair requires.
Repair requires the exact selection and explicit acceptance of unproven original
filesystem volume continuity. It changes only the three scope directory device
numbers, preserving canonical paths, inodes, branch, run, owner, plan, environment
Expand Down Expand Up @@ -608,6 +657,79 @@ Provider setup is separate and explicit. Obtain the exact archives identified in
./hack-native --candidate-root /absolute/private/candidate-home runtime probe --json
```

The pins also name a BuildKit client (`buildx`, `darwin-arm64`) for native image
builds. Prepare it before using `HACK_NATIVE_BUILDS=1`; it is optional otherwise:

```sh
./hack-native --candidate-root /absolute/private/candidate-home runtime prepare-builder --archive /absolute/docker-buildx
```

The command takes the exact release file named in `provider-pins.json`. It checks
the SHA-256 before it changes any state, then copies the file into private candidate
state and checks its code signature. If a prepared client exists, the command checks
it again and does not replace it. If the prepared tree changes, `runtime probe`
refuses; it reports `builder_prepared` when the client is present and unchanged.

`runtime build-image --request <file> --json` builds one image in the running
runtime's engine with that client. Native `up` calls it for `build:` services when
`HACK_NATIVE_BUILDS=1` is set; you can also run it directly. The request is a private
JSON file (a singly linked, mode-`0600` file owned by you):

```json
{"version": 1, "project_root": "/absolute/project", "context": "app",
"dockerfile": "Dockerfile", "target": null, "args": {"NAME": "literal"},
"policy": "missing", "timeout_seconds": 1800}
```

- The context and Dockerfile must be inside the project and reached without symlinks.
The Dockerfile is read, never run, to find every image it can pull. Each image must
be a public Docker Hub reference; it is pinned to a digest before the build starts.
Base images with stored `ONBUILD` triggers refuse. The client builds from a private
copy of the Dockerfile and ignore rules that were scanned, so editing either file
during the build has no effect on it.
- Build arguments are not secrets, exactly as with Docker: the built image records
their values in its history, and an argument that selects a base image appears in
the resolved base references that the receipt and the result report. Never pass a
secret as a build argument. BuildKit build secrets are the right mechanism for
secrets; native builds do not support them yet.
- Every build runs under a BuildKit source policy: only the pinned base images
resolve as images, and network sources (`ADD` of an `http`, `https` or git URL, and
image blob sources) are denied. The engine would otherwise fetch those from outside
the isolated build network. The policy also covers sources that a base image's
stored `ONBUILD` triggers add; such bases refuse before the build anyway.
- Argument values reach the client only through a private definition file (mode
`0600`, removed after the build), never its command line or its environment; the
client's environment is a fixed list of its own settings. Names must be plain
identifiers. Names BuildKit or buildx interpret themselves (`BUILDKIT_*`,
`BUILDX_*`, `SOURCE_DATE_EPOCH`) and the platform arguments refuse.
- Build output is shown on stderr after filtering, as defense in depth: every
argument value is replaced with `[redacted]`, also when quoted or escaped the way
the client prints values, terminal control characters are removed, lines are cut at
16 KiB and output stops after 4 MiB.
- `missing` reuses a verified image for the same build key without running the client;
`rebuild` always builds. The key covers the Dockerfile and `.dockerignore` bytes,
target, arguments and versions, not the context's other files (as with Compose).
- The runtime must have network egress and the isolated build network that a runtime
started by this version sets up. An older runtime refuses with
`native_build_runtime_restart`: stop it and start it again.
- `runtime down` refuses while a build runs. Ctrl-C or SIGTERM cancels the build and
stops the client's whole process group; so does the time budget (default 30 minutes,
at most 2 hours). Both also apply while base images resolve, before the client
starts: the budget covers the whole operation.
- A cold build needs at least 6 GiB free on the runtime's storage disk, or twice the
last image of the same build if that is larger; otherwise it refuses with
`native_build_storage` and deletes nothing. After each successful build, BuildKit's
cache is pruned to 8 GiB. The cache holds only build steps; pruning never removes
images, containers or volumes.

`runtime reclaim-build-images --json` removes build images that a newer build of the
same key replaced. It keeps every image a build receipt names as current, every image
that any retained run's saved state mentions, every image a container still uses (the
engine refuses those), and every image whose ownership labels are not exactly this
runtime's. Each removal deletes that one image only, never its untagged parent
images. It refuses while a build runs, and removes nothing if it cannot read all
saved run state. The report lists removed images and why each other one was kept.

Before startup, network-tool preparation additionally requires all four pinned
Alpine aarch64 APKs in a current-user-owned private directory (mode `0700`), with
regular, singly linked mode-`0600` files. Acquire the matching public package bytes;
Expand Down
2 changes: 1 addition & 1 deletion docs/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -1431,7 +1431,7 @@ hack doctor [options]
| `--browser-result unknown|works|fails|permission-denied` | Your manual browser observation for --browser-url (default: unknown) |
| `--branch <name>` | Run against a branch-specific instance (compose name + hostnames) |
| `--native-cleanup inspect` | Inspect one mapped native graph's pending cleanup without recovery or stop replay |
| `--native-run-mapping inspect|repair` | Inspect or explicitly repair a native run mapping after filesystem device renumbering |
| `--native-run-mapping inspect|repair` | Inspect a native run mapping, or explicitly repair it after filesystem device renumbering |
| `--expect-selection <64-hex>` | Require the exact run-mapping recovery inspection selection |
| `--accept-legacy-device-rebind` | Explicitly accept legacy migration without proof of original filesystem volume continuity |
| `--no-interactive` | Never prompt: apply documented defaults or fail with E_INTERACTIVE_REQUIRED (also via HACK_NO_INTERACTIVE=1) |
Expand Down
2 changes: 2 additions & 0 deletions docs/reference/v5-model-coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ must be attached to the eventual exact integration revision.
| Dependency rebind, automatic refresh, incomplete initializer, terminal reuse | dependency-rebind, dependency-auto-refresh, stopped-pool-startup, restore-history | Dependency claim/readiness, saved execution, restore history and source convergence tests | Actual installer failure, cache corruption, retained application state and resource plateau. |
| Private environment allocation lifetime: staged values and private file members, crash between record and stage, retirement with the container | **Coverage gap:** no maintained model covers environment or credential delivery; file members share the existing allocation, intent record and retirement, so the state machine is unchanged | `packages/runtime-core/src/provider/environment.rs` (preparation bounds, staging layout, verification), `managed_environment.rs` (envelope v2 refusals, forwarding), `graph/launcher.rs` (read-only binds, overlap refusals) and `environment_recovery.rs` retirement tests | Live VM evidence that only the owning UID reads a member, writes fail read-only and the member is absent after cleanup; refresh or rotation of delivered files is not implemented. |
| One pool, many project roots: share-set changes, boot mounts, per-project share selection, removal of a referenced share | multi-root-share | `provider::share_update` (journaled stopped-pool add/remove, record before owner), `project_share::{check_request, check_boot, validate_set}`, `OwnedGuest::project_share_for`; `share_update` and `project_share` unit tests | Real provider boot with an updated mount record, virtio-fs device limits and live multi-project graphs on a host VM. Cross-project cleanup is abstracted to one run's own resources. |
| Native image builds: unleased build versus engine stop, crash mid-build, storage recreation, foreign or forged images, reclamation versus retained graph references | native-build-retention | `provider::image_build` (shared build fence, per-key lock, incarnation/boot/engine recheck and label check at adoption, dead-attempt recording) and `image_build::reclaim` (owned labels, current receipts, retained graph state scan, engine non-force removal); `image_build` regressions | One key and namespace; a build client orphaned by a killed `hack-native` is not modeled (the client inherits the build fence and per-key lock, so both stay held until it exits: `image_build::tests::a_killed_coordinator_leaves_its_client_fenced`); real BuildKit, engine removal semantics and guest storage are host evidence. |
| MCP cold start, cancellation and duplicate launches | mcp-startup, mcp-startup-cancellation | Shared MCP bundle identity, startup deduplication and cancellation regressions | Fresh supported client sessions, full workflow coverage and measured overhead (WU16/WU20/WU28). |
| Software install/upgrade/rollback, active launcher versus selection, compatibility | **Coverage gap:** no maintained model here is an installer/selection refinement | `scripts/install-prerelease.py`, prerelease-install/Python installer tests, candidate-install contract | Add a bounded selection/lock/crash/compatibility model before primary-driver promotion; real official-artifact upgrade/rollback still required. |
| Primary-driver promotion and rollback to stable | **Coverage gap:** staged readiness policy is not an implemented state machine proof | Reviewed release manifest, per-project opt-in, explicit stable/candidate ownership records | No active-project switch until exact candidate/artifact and rollback/data compatibility are qualified. |
Expand Down Expand Up @@ -99,6 +100,7 @@ liveness/reachability controls have their own documented assumptions.
| [service-restart-policy](../../tests/models/tla/service-restart-policy/RestartPolicy.tla) | 134 | 5 |
| [relay-fence](../../tests/models/tla/relay-fence/RelayFence.tla) | 16 | 2 |
| [pool-emulation](../../tests/models/tla/pool-emulation/Emulation.tla) | 13 | 3 |
| [native-build-retention](../../tests/models/tla/native-build-retention/BuildRetention.tla) | 6,181 | 4 |
| [shared-helper-instance](../../tests/models/tla/shared-helper-instance/Instance.tla) | 7,649 | 11 |
| [restore-history](../../tests/models/tla/restore-history/RestoreHistory.tla) | See named result contract | 2 |
| [graph-admission](../../tests/models/tla/graph-admission/Admission.tla) | See named result contract | 2 |
Expand Down
Loading
Loading