awf v0.6.0
Ownership of the host↔container boundary. Artifacts a step produces can now be
materialized onto the host by name, agent CLIs stay runnable and stay logged in
under the native sandbox, and the documentation stops describing an MCP input
channel that never existed.
Added
awf outputs --dest <dir>. Materializes a committed step'soutput_files
onto the host, written by theawfprocess itself and therefore owned by the
invoking user — no root-owned writeback, nochownpass. Each declared
container path is mirrored under<dir>with its leading separator stripped,
confined byos.Root: a..component or a symlink that would escape the
destination is refused, while an absolute container path is contained rather
than rejected. Every destination is resolved before the first byte is written,
so a colliding or unusable path fails the command without leaving a partial
tree.
Fixed
- Agent token refresh survives the native sandbox. Credential directories
were re-bound read-only, so an OAuth refresh written during a run was
discarded when the sandbox tore down its mount namespace — a silent logout
days later. The per-agent directories (~/.claude,$CODEX_HOMEor
~/.codex,~/.factory,~/.config/goose) are now writable for agent
invocations; the bare~/.configcatch-all stays read-only, so a step never
gains write access to the wider XDG tree. - Agent CLIs are executable under the native sandbox. Read+execute is now
granted for~/.local(where~/.local/binentries and the~/.local/lib
or~/.local/sharetargets they symlink to live) and/opt(where node and
npm global prefixes land, including the real binary behind a
/usr/local/binshim). Without them a step died with an opaque exit126
or127instead of a named error. - The ignored-image warning names the remedy.
--backend nativeon a
workflow that declares a container image now points at--backend auto, the
default that routes such a workflow to Docker, instead of only stating that
the image was ignored.
Security
- The writable credential grant refuses any candidate that is the home
directory or an ancestor of it.$CODEX_HOMEis environment-derived, and a
broad value would otherwise have been re-bound read-write over the sandbox's
$HOMEtmpfs, restoring the real home —~/.sshincluded — inside the
sandbox. - The writable credential and tool-prefix grants apply only to an agent adapter
invoking its own CLI. A workflowrun:step receives neither, and keeps
exactly the read-only credential baseline it had before.
Changed
- MCP is documented as what it is. The format reference advertised
with: { mcp_servers: ... }as an input channel, and the runtime design
claimed the Claude adapter mappedmcp://refs to a harness config. No
adapter ever accepted such a key — each validateswith:against a strict
allowlist and rejects an unknown key at run start — and no--mcp-configwas
ever emitted. The claims are removed rather than the rejection. In their place
the reference documents the arrangement that already works: run an
HTTP-transport MCP server as a digest-pinned Compose service and pass the
agent its URL, inheriting pinning, health-gated readiness, reconstruction from
the recipe on resume, and teardown with the run.with:remains opaque and
adapter-validated; no format field was added or removed. - Compose bind-mount ownership is documented.
awfnever bind-mounts a host
directory, so root-owned files on the host can only originate in an author's
own Compose file. The manual now records the fixes at that source —user:on
the service, a rootless engine, or an idmapped mount — and why those are
preferable to:Uor--userns-remap. - The sanctioned agent-CLI install prefixes are documented under
--backend native, with the exit-126failure they explain.