SIGN IN SIGN UP

fix(runner): the lease sandbox binds the transport the engine actually spawns

M170 §3 narrowed the lease sandbox to three read-only paths on the premise
that no executable is needed inside a lease at all. The premise was false:
the NullClaw engine's model transport spawns `curl` (ten provider modules
reach `sse.curlStream*` / `http_util.curlPost*`), as does the `http_request`
tool. With `/usr` and `/lib` unbound, `curl` and its shared libraries do not
exist inside a lease and every lease dies at `execve` before its first model
call — not merely losing a tool.

Restore the executable and library trees; keep the credential trees out.
`/opt` (the daemon's control-plane token) and the broad `/etc` (the host
account database) stay refused at compile time, which was always the real
exposure. Every baseline entry is now a `DANGER_HOST_`-prefixed constant, so
`grep DANGER_HOST_` returns the complete lease-reachable host surface, and a
comptime guard refuses a bare path literal appended to the list.

Landlock now lands the rule for a regular file: `SYSTEM_READONLY_ACCESS`
carries `READ_DIR`, which the kernel refuses on a non-directory, so the
`/etc/hosts` rule returned EINVAL and `catch continue` ate it — bind-mounted
and unreadable with every list test green. `addPathRule` retries with the
file-accepted subset, and a kernel refusal now fails the lease instead of
sharing an arm with a path that is merely absent.

The self-test gains a `transport=` row: the parent resolves the host's
transport binary and the probe spawns it from behind the full wall, so the
runner measures on every heartbeat what this milestone previously reasoned
about once. A host carrying no transport reads as its own named fault,
distinct from one whose exec was attempted and refused.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
K
Kishore Kumar committed
fc93d06567807960a95110762febe23241a99e21
Parent: e8e5ccb