Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
230 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
4d25fa5
fix(native): compile host aliases like execution and name unbound ali…
roodboi Nov 7, 2026
afb4526
fix(native): reconcile edited graphs that have a dependency cache
roodboi Nov 7, 2026
516c723
fix(native): run stock image processes in wrappers like Docker, namin…
roodboi Nov 7, 2026
139be6c
fix(native): bind every cache-volume mount into the cache identity
roodboi Nov 7, 2026
08f2d8c
fix(native): check process wrappers for profile-active services only
roodboi Nov 7, 2026
592a9b1
fix(native): scope dependency caches with writable consumers to one i…
roodboi Nov 7, 2026
4ac7246
chore: merge #636 into claude/train-batch-7
roodboi Nov 7, 2026
4fad902
chore: merge #638 into claude/train-batch-7
roodboi Nov 7, 2026
d38a439
chore: merge #637 into claude/train-batch-7
roodboi Nov 7, 2026
dbcf2bc
fix(native): keep CandidateError under clippy's large-error bound
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
1c479a5
chore: merge claude/train-batch-6 into claude/train-batch-7
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
2f9b30a
chore: merge claude/train-batch-6 into claude/train-batch-7
roodboi Nov 7, 2026
97957c9
Merge remote-tracking branch 'refs/remotes/pr/640' into claude/train-…
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
1a1d0ff
chore: merge claude/train-batch-6 into claude/train-batch-7
roodboi Nov 7, 2026
458e0a9
chore: merge next into claude/train-batch-7
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
101 changes: 88 additions & 13 deletions docs/guides/native-candidate.md
Original file line number Diff line number Diff line change
Expand Up @@ -389,9 +389,14 @@ keep it open, use `hack ps` and `hack logs` from another terminal, and press
Ctrl-C to stop it. For detached startup, use the Compose backend.

Foreground image-project `up` prints each startup step (input, runtime, images,
services) and one ready line, `Project is ready (SERVICES)`, after the graph is
ready and its run mapping is published. Ctrl-C prints the stop sequence and
`Native project stopped.` once owned cleanup is confirmed. Until the ready line,
services) and one ready line, `Project is ready (SERVICES; run RUN)`, after the
graph is ready and its run mapping is published. Under it, `up` lists each routed
service's reviewed hostnames as HTTPS URLs (with the `HACK_NATIVE_HTTPS_PORT`
port unless it is 443) and the published loopback ports. Without the native
HTTPS frontend it says that routes are not served on this host. Ctrl-C prints the
stop sequence and, once owned cleanup is confirmed, one stopped line that says
whether named volumes and the stopped run mapping were kept (`Native project
stopped.` when no run mapping was published). Until the ready line,
startup holds the runtime's exclusive provider lease, so graph admission cannot
interleave with another operation. A `hack ps` from another terminal during that
window waits briefly, then reports that the runtime is busy (`runtime_busy`,
Expand All @@ -414,8 +419,8 @@ Runtime refusals print their code and, when the runtime marks its message as a f
literal that cannot carry values, that message and the service it concerns (for
example `Service web: Pinned image architecture or implicit volumes are
incompatible.`). Formatted runtime messages stay omitted. A start refused before the
runtime reserved any graph state reports that nothing was retained instead of
unconfirmed cleanup.
runtime reserved any graph state reports that nothing was created and no cleanup is
needed, with the startup diagnostic, instead of unconfirmed cleanup.

### Network aliases and the Compose project name

Expand Down Expand Up @@ -887,10 +892,40 @@ is reattached under its recorded name after the same label and identity checks;
newly declared volume is created fresh; a retained volume the new file no longer
declares stays owned and unmounted until `hack down --remove-data` (Compose also
keeps project volumes). Retained data is only ever reattached to the run and
namespace that created it. Graphs with dependency caches, live source or a pending
source-device rebind keep the narrower rules below. `hack restart` of a stopped
graph refuses and points to `hack up`.
For a shared-source graph admitted with a retained compatibility contract, ordinary
namespace that created it.

Graphs with `hack.dependencies.*` caches reconcile the same way. A cache's identity
covers only its own inputs: the initializer's service definition and resolved
command, entrypoint, environment and user, the cache declaration, its image, the
declared lockfile and runtime-file contents, and the cache volume layout: every
service that mounts the cache volume, with its target, subpath and `:ro` mode. Any
of those services can write the shared contents, so adding, removing or changing
such a mount is a cache input; mounts stay as declared, as in Compose and v4, and
are not forced read-only. Caches are shared across linked worktrees and branch
instances only while every service other than the initializers mounts them
read-only. A service that mounts the cache read-write can change its contents
through its own image, command, environment or source, which the identity does not
cover, so that cache is scoped to this checkout and branch instance and never
shared. To share it again, mount it with `:ro` in the other services. A run created
by an earlier build whose cache has such a writer moves to its own instance cache
once instead of reusing the shared one. Any other edit to another service, such as an
environment value on the app, keeps the cache. An edit to one of those inputs,
including a lockfile, selects the cache for the new identity as a fresh `up` would, so the initializer installs into it; the old cache
is shared and is only released by this run. Each such `up` publishes the current
source snapshot. A retained named volume is never reused as a dependency cache:
declaring one refuses and names the service and the `hack.dependencies.cache-volume`
field. Caches recorded by earlier builds, whose identity also covered the whole
Compose file, are kept while that file is unchanged and replaced once on the first
edit. Live source, a cache scope carried across a source-device rebind or a pending
initializer cache release keep the narrower rules below: a Compose edit other than
a routed hostname change refuses there with `graph_plan_change_unsupported`, and a
hostname change mixed with other edits refuses with `graph_hostname_change` and the
service name. Every refusal says to revert the edit, or to run
`hack down --remove-data` and then `hack up`. `hack restart` of a stopped graph
refuses and points to `hack up`.
For a shared-source graph that reconciliation does not select (live source, a
carried cache scope, a pending source-device rebind or initializer cache release)
and that was admitted with a retained compatibility contract, ordinary
source-content edits may change the reviewed plan ID: restart checks the stable
execution, exclusion, mount and dependency-cache inputs before cleanup and again
under the provider lease. The original installer publication and graph ownership
Expand Down Expand Up @@ -1356,7 +1391,11 @@ run mapping before exiting, so `hack ps`, `hack down` and
`hack doctor --native-cleanup inspect` select that run instead of reporting the
project as not started; nothing is stopped or replayed to do so. When the
receipt itself cannot be authenticated, nothing is recorded and the runtime
journal keeps the graph for explicit recovery.
journal keeps the graph for explicit recovery. When the graph owner exited
before reserving any runtime state (for example a configuration refusal during
execution compilation), inspection finds no journal for the run: startup then
reports the failure code and that nothing was created, instead of an
unconfirmed cleanup.

Managed values are declared on every authored service, so the reviewed plan is the
same for every profile selection, but they are delivered only to the services the
Expand Down Expand Up @@ -2149,12 +2188,27 @@ must then have a selected binding for each alias it declares. A missing binding
refuses with `E_NATIVE_PROJECT_UNSUPPORTED` ("Native host alias has no reviewed
host dependency binding; configuration was not dropped."), before any runtime
work; with no dependency selection at all it refuses before lifecycle hooks.
The refusal lists every unbound alias with the services that declare it and
where it comes from: the service's Compose `extra_hosts`, `internal.extra_hosts`
in project configuration, this checkout's `.hack/.internal/extra-hosts.json`, or
the main checkout's map that a linked worktree inherits. It then names the
`aliases` a binding needs and how to remove the alias instead
(`hack internal extra-hosts unset <alias>` hides an inherited entry in this
worktree). Listener values are never printed.
An entry whose target is not `host-gateway` (for example a fixed address), a name
that is not an exact lowercase DNS name, or a service that already maps the name
to a different target also refuses. Service-declared names are matched in the
form native review compiles them to (one trailing dot removed, lowercased), so a
service that declares `API.Example.` is covered by a binding for `api.example` and
does not receive a second spelling. Earlier native builds ignored these entries,
form native execution compiles them to: Compose interpolation resolved as the
native runtime resolves it (no ambient environment, so `${UNSET:-word}` selects
`word` and `${UNSET:+word}` selects nothing), then one trailing dot removed and
lowercased. So a service that declares `API.Example.` or
`${UNSET_PREFIX:+x-}api.example` is covered by a binding for `api.example` and
does not receive a second copy of a project-wide `api.example`. A service whose
declarations compile to the same alias twice refuses with `E_CONFIG_INVALID`,
naming the service and alias, before any runtime work; native execution would
refuse it only after the VM started. A name that refers to a required variable,
a Hack-managed value or `COMPOSE_PROJECT_NAME` is left to native review and
execution. Earlier native builds ignored these entries,
which let a container resolve the public name instead of the local listener.
Native reads these aliases before lifecycle hooks, because they are part of the
reviewed configuration; unlike the Compose backend, a hook that changes them makes
Expand Down Expand Up @@ -3135,6 +3189,27 @@ checks. Named users/groups remain unsupported for private delivery and refuse
instead of silently becoming root. An image with no user retains Docker's normal
root default; an explicit Compose numeric user takes precedence.

Services with private environment values and services with host dependency
bindings (including every service when project-wide host aliases exist) run their
process through a wrapper. The wrapper runs exactly what Docker would: the image
or Compose `entrypoint` followed by `command` (with no entrypoint, `command`
alone), and a bare executable name such as `docker-entrypoint.sh` or the
`mysqladmin` of `CMD mysqladmin ping` is resolved through the container's own
PATH after the environment is applied. A shell-form health check (`CMD-SHELL`
or a string `test`) runs through the image's shell (`/bin/sh -c` by default), as
Docker runs it. Stock images therefore need no absolute paths. What a wrapper
still cannot run is an empty process, a health test that names no executable, a
named (non-numeric) user, a stop signal other than SIGTERM, SIGINT, SIGQUIT or
SIGKILL, and a volume target at `/`, `/run` or a reserved wrapper path. Native
`up` refuses the Compose-declared cases before the VM starts, and the runtime
checks settings inherited from the pinned image before reserving anything. Both
name every refused service and field at once (for example
`service db user (use a numeric UID or UID:GID)`). `hack doctor` on the native
backend reports the Compose-declared cases in its `native process wrappers`
check, for every service native may wrap. Only profile-active services are
checked by `up` and `restart`; a service behind an unselected profile never runs
and cannot block them, so `doctor` lists such services as information only.

### Approved-host DNS on pool restart

The pinned Smol provider re-resolves approved hosts at each boot and appends the
Expand Down
3 changes: 2 additions & 1 deletion docs/reference/v5-model-coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ must be attached to the eventual exact integration revision.
| Foreground Compose startup failing after resources started; unconfirmed cleanup; unauthenticated final inspection | native-startup-owner | `recordFailedStartupOwner` in [native-project-start](../../src/backends/native-project-start.ts) publishes the authenticated failed run with a finalization lifetime; [start regressions](../../tests/native-project-start.test.ts) cover recording, an unauthenticated receipt and a retained mapping | A refused final inspection still leaves only the runtime journal; crash between finalization registration and mapping publication; physical guest acceptance. |
| Canceled/expired startup; reader cancellation versus EOF; producer/group uncertainty | pre-ready-retirement, authority-lifetime, native-file-material | Native graph finalizer/onSettled, exact Removed, hard-signal freshness, host stop/close; local pre-Ready retained/removed regressions, including separate live/foreign/hard-canceled fresh-teardown-admission assertions (HACK-1801) | Physical guest acceptance; current root aggregate; explicit executable unknown host-close control; async proof-to-stop and partial binding-retirement crash windows; post-stop source/session replacement or hard cancellation before Retire (Retire does not recheck these inputs; Safe has no post-stop interference predicate). |
| Crash between reserve, publish, sync and release; stale recovery | native-frontend-recovery, publication, publication-journal, native-storage-witness | Durable intent/enrolled/released records, fresh lease and expected binding; recovery and sync-failure tests | Fsync guarantees, process-kill windows, real restarted provider observations. No missing-path authority. |
| Data lifetime independent of compute; replaced/aliased metadata; retained-data handoff across Compose plan changes | native-persistent-enrollment, native-storage-witness, native-file-material, native-plan-reconcile | Existing-only enrollment, exact birth/witness and reference fencing; copied-label/replacement tests; `provider/graph/plan_reconcile.rs` projection tests | Real SQL/content retention, external writer assumptions, allocated-byte evidence. |
| Data lifetime independent of compute; replaced/aliased metadata; retained-data handoff across Compose plan changes, including dependency caches | native-persistent-enrollment, native-storage-witness, native-file-material, native-plan-reconcile, native-cache-reconcile | Existing-only enrollment, exact birth/witness and reference fencing; copied-label/replacement tests; `provider/graph/plan_reconcile.rs` projection and cache-selection tests | Real SQL/content retention, external writer assumptions, allocated-byte evidence. |
| Settled retained Compose route-attempt retirement; pinned references; interrupted deletion | **Coverage gap:** filesystem journal compaction is not modeled; native-route-stop covers a different stop protocol | Instance mutation lock and exact surviving claim witnesses in [journal compaction](../../src/lib/native-compose-route-claims.ts); [claim regressions](../../tests/native-compose-route-claims.test.ts) and [retained lifecycle integration](../../tests/native-compose-adoption-routing-generation.test.ts) | 24 successful operations keep two attempt directories and constant Linux descriptors; four integrated lifecycle operations check directory counts. Injected unlink failures cover same-store and fresh-store cleanup retries. Assumes cooperative same-user writers, the caller's mutation lock and working filesystem synchronization. No process-kill/power-loss durability proof or bound on unresolved/over-budget histories. |
| Graph cleanup container stop batch: bounded in-flight stops, shared worker queue, connect-stage retry, batch-wide unreachable state, deadline expiry, worker panic | **Coverage gap:** no maintained model covers scheduling inside the stop batch; native-route-stop covers a different stop protocol | `dispatch` and `attempt` in [the stop batch](../../packages/runtime-core/src/provider/engine/stop.rs): at most 4 stops in flight, every worker joined; only `connect`/`connect_timeout` failures retry (25 ms doubling to 500 ms, within the batch deadline and 30 s of a stop's first connect failure); once one stop exhausts its window, later connect failures return at once; a deadline reached during backoff keeps the connect stage; `response`, `timeout` and `transport` never retry. Regressions in the same file's `provider::engine::stop` tests (bounded in-flight socket server, late socket, missing socket, 14-stop retry counts, persistent connect failures, oversleeping backoff, non-retried stages, worker panic) and `fourteen_service_connect_failures_keep_resumable_progress_and_retry_only_unstopped` | Tests cover exact attempt counts and the in-flight bound for fixed interleavings; no model explores all worker schedules or proves at most one delivered request per stop. Assumes a failed connect sent no request bytes and that the stop budget covers fully serialized grace periods. Graph-level resume after a partial batch is covered by tests only. Host qualification of the descriptor-pressure root cause (HACK-1302) remains open. |
| Concurrent stop/publication; route claim and relay lifetime | native-route-stop, shared-https-lifetime, previous-boot-shared-https, relay-lifecycle-barrier, relay-authorization, relay-staging, relay-fence | Fenced route removal, relay owner, ready/removed protocol, authenticated observations | Native DNS/TLS/browser behavior; old-boot uncertainty and external routing. |
Expand Down Expand Up @@ -69,6 +69,7 @@ liveness/reachability controls have their own documented assumptions.
| Model | Positive distinct states | Configurations |
| --- | ---: | ---: |
| [native-plan-reconcile](../../tests/models/tla/native-plan-reconcile/Reconcile.tla) | 747,656 | 4 |
| [native-cache-reconcile](../../tests/models/tla/native-cache-reconcile/CacheReconcile.tla) | 2,208 | 5 |
| [pre-ready-retirement](../../tests/models/tla/pre-ready-retirement/Retirement.tla) | 10,965 | 8 |
| [native-persistent-enrollment](../../tests/models/tla/native-persistent-enrollment/Enrollment.tla) | 38 | 6 |
| [native-frontend-recovery](../../tests/models/tla/native-frontend-recovery/Recovery.tla) | 602 | 10 |
Expand Down
11 changes: 7 additions & 4 deletions packages/relay-guest/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,18 @@ shutdown and absence of surviving workers or descriptors.
The Linux-only gate modes do not read stdin or install signal handlers:

```text
hack-relay-guest --await-release <32 lowercase hex generation> -- <absolute executable> [args...]
hack-relay-guest --check-release <32 lowercase hex generation> -- <absolute executable> [args...]
hack-relay-guest --await-release <32 lowercase hex generation> -- <executable> [args...]
hack-relay-guest --check-release <32 lowercase hex generation> -- <executable> [args...]
```

Await mode watches `/run/hack-startup` with inotify before checking for `release`,
then waits on events with one anchored 120-second monotonic deadline. Check mode
checks once and refuses immediately while the marker is absent. A valid release
executes the supplied absolute executable in place, preserving arguments (including
non-UTF-8 arguments), environment, uid/gid and standard descriptors. Observation
executes the supplied executable in place, preserving arguments (including
non-UTF-8 arguments), environment, uid/gid and standard descriptors. Like Docker,
a name containing `/` runs as given and a bare name (such as
`docker-entrypoint.sh`) is resolved through the container's own PATH; no shell
runs and no host PATH is consulted. Observation
FDs close before exec. Graph launch must use Docker `Init=true` so normal init
signal forwarding applies while waiting and after replacement.

Expand Down
11 changes: 9 additions & 2 deletions packages/relay-guest/src/barrier.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//! A public generation fence, not a credential or authentication boundary.
use crate::CandidateError;
use std::{ffi::OsString, os::unix::process::CommandExt, path::Path, process::Command};
use std::{ffi::OsString, os::unix::process::CommandExt, process::Command};

fn refused() -> CandidateError {
CandidateError::new("relay_guest_barrier", "Guest startup release refused.")
Expand All @@ -18,7 +18,14 @@ pub(super) fn valid(args: &[OsString]) -> bool {
.all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b))
})
&& args[2] == "--"
&& Path::new(&args[3]).is_absolute()
&& executable(&args[3])
}
/// Docker accepts an absolute path, a path relative to the working directory,
/// or a bare name it resolves through the container's PATH. `Command` performs
/// that same lookup with this process's (the container's) PATH; no shell runs.
fn executable(name: &OsString) -> bool {
let bytes = name.as_encoded_bytes();
!bytes.is_empty() && bytes != b"/" && !bytes.contains(&0)
}
pub(super) fn run(args: &[OsString]) -> Result<(), CandidateError> {
if !valid(args) {
Expand Down
Loading
Loading