Releases: ScriptedAlchemy/cargo-hauler
Release list
v0.8.2
Patch Changes
- 7490839: Internal: the implementation behind the Agent Bundle entrypoints now lives
undersrc/internal/<owner>/(contracts, cargo, daemon/{runtime,broker,
scheduling,reporting}, storage, client, operations, host-hooks,
integrations/kache, platform, shim, ui/{documents,dashboard,shared}, util)
instead ofdaemon/,lib/,hooks/, and friends;tests/is grouped by
what a test executes (unit, integration, packaging, acceptance). A move-only
change: no route, executable, protocol, or scheduling behaviour changed.
docs/architecture.mdis the ownership map and walkthrough.
v0.8.1
Patch Changes
- ef7d00e: Dashboard: the Contention panel's CPU stat is labelled
1-min load average
instead ofloadavg (1m), which read as a stuck "loading" timer. Same value:
the machine's Unix 1-minute load average over its cores.
v0.8.0
Minor Changes
- 970dbde: New
hauler_dashboardMCP tool carries the dashboard App
(ui://cargo-hauler/dashboard.html): hosts that render MCP Apps open the
dashboard beside its result, populated from the same status payload the App
then polls throughhauler_status. Its text result is one summary line plus
where the App and the text form are, so opening the dashboard never pastes the
status document into the model's context.hauler_statusno longer advertises
the App and returns the queue, lanes, and tickets as text for the model, as
before.hauler webopens the App throughhauler_dashboard. The
hauler-dashboardskill and the status document's dashboard line name the new
tool.
v0.7.4
Patch Changes
-
4267d0c: Keep read-only commands and MCP tools on a protocol-compatible running daemon, and defer automatic replacement for submissions until the older daemon is idle (#209).
Initialize the dashboard on every MCP Apps host — Codex, Claude, ChatGPT, VS Code/Cursor, and Goose — without host-specific origin exceptions (#212).
v0.7.3
Patch Changes
- 5d14c4f: Initialize the dashboard in Codex Desktop when MCP Apps use a
codex-sandbox://origin (#206). - 4ac68a9: Make
hauler daemon stopandcargo-hauler daemon stoppreserve typed shutdown outcomes and fail when the daemon refuses, times out, returns a protocol error, disconnects before acknowledgement, or remains alive (#200). - bc2ed53: Make daemon state and relocated control sockets owner-private on Linux and
macOS. The state directory,tickets/, and the socket's runtime directory
are created0700and sensitive files — complete ticket output, the ledger
and its WAL sidecars, the daemon log, the passthrough spool,hook-state.json,
hook-events.jsonl, the pid lock, and the jobserver FIFO —0600,
independent of the invoking shell's umask, instead of inheriting0755/0644.
An existing state directory the running user owns is tightened in place; a
parent named byCARGO_HAULER_STATE_DIRis never chmod'ed, and a state path
that is a symlink, the wrong kind of entry, or owned by another user is
refused by name rather than followed, chmod'ed, or deleted. A state directory
too deep forsun_pathnow puts its socket in acargo-hauler-<uid>
directory underXDG_RUNTIME_DIR/TMPDIR/the system temporary directory
instead of directly in a possibly shared temporary root, and the socket
digest no longer lowercases Unix paths, so case-distinct state directories no
longer share one control endpoint. A daemon left listening at the previous
relocated path is retired by the next client under the existing one-version
rule and stopped byhauler daemon stop, so the moved endpoint needs no
manual cleanup on upgrade. Windows keeps its named pipe and gains no POSIX
modes or uids. (#203)
v0.7.2
Patch Changes
- 0ca43dd: Compare prerelease versions by SemVer identifiers when deciding whether a client may replace a daemon. Numeric counters such as
rc.10now sort afterrc.9, preventing an older prerelease client from being mistaken for a newer install. - bb0901a: Install PATH shims without following existing symlinks or overwriting other hard links to Cargo executables. Refuse dangling destination links unless
--forceis supplied, publish complete executable files atomically, and prevent an existing destination symlink from being embedded as the shim's own real Cargo path.
v0.7.1
v0.7.0
Minor Changes
-
80939ab: A
hauler execwhose daemon connection drops after the ticket was accepted now
reattaches instead of giving up. The client printsconnection to daemon lost; reattaching to ticket cc-N…, reconnects (starting the daemon again if it is
gone, a few attempts one second apart), and sends the newreattachmessage;
the daemon rebinds the ticket, replays the output the client had not yet
received, and streams the rest, so the caller's exit code is cargo's as if the
connection had held. Output the replay buffer no longer holds is announced as
N bytes of output missed while reconnecting; full log: <path>, never
invented. A ticket that finished in the meantime yields its exit code and log
path.The daemon no longer kills a queued ticket the moment its submitter
disconnects: it keeps its queue position (and may start) for
CARGO_HAULER_REATTACH_GRACE_MS(default 30000;0restores the immediate
kill) and is killed askilled while queued: submitter disconnected and did not reattach within 30sonly if nobody reattaches. A running ticket continues
as before, marked orphaned; a reattach clears the flag.When the ticket cannot be reattached — it never ran cargo and was killed at
the daemon's shutdown ororphaned by daemon restart, the daemon does not
know it, the daemon predates this release and answers the message with
bad-message, or no daemon answered within the budget — the client fails
closed withbrokered run aborted: daemon connection lost; ticket cc-N <reason>and the new exit code69(EX_UNAVAILABLE), distinct from cargo's
1and from2/75/130/143. It no longer printsticket cc-N continues — hauler result cc-Nand exits1while the daemon recordskilled while queued.--bgand auto-backgrounded tickets are detached, not owned, and
are unchanged. (#187) -
3758d82: Refuse a target directory shared across workspace roots (#185). When a request's target dir lies outside its own workspace and another lane with a different workspace root already uses that dir, the daemon refuses it as a bad intent (client exit 2) with a message naming both roots, the dir, and the mechanism: cargo's
-C metadatahash is relative to the workspace root, so same-layout worktrees write identical artifact filenames into a shared target dir and whichever compiled last runs as "fresh" in the others — a stale-binary collision, not a kache miss.hauler exec --allow-shared-targetorCARGO_HAULER_ALLOW_SHARED_TARGET=1(per request, or in the daemon's environment for all requests) admits the request with one warning line on stderr that cargo's--quietcannot hide.hauler statusand the dashboard flag every lane on a shared dir withsharedTargetWith(optional; older daemons omit it). Refused intents — this one and the existing bad-intent rejections — are now ledgered asdeniedrows instead offailedruns under laneinvalid, sohauler logno longer shows a command that never ran as a failed run.
Patch Changes
- f84e901:
hauler exec --allow-shared-target(andCARGO_HAULER_ALLOW_SHARED_TARGET=1
in the caller's environment) now reaches the daemon: the server dropped the
request field, so only the daemon-side setting could admit a shared target dir.
The shared-target warning has one wording everywhere — the daemon's refusal
and ack line, the lane board, and the dashboard's lane cell (other roots, full
text on hover) — andhauler requestshows the daemon's warning in its summary
when the daemon admitted a shared target. Thehauler statussummary string
no longer carries extra warning lines the document never rendered; the lane
board is where the warning shows.
Detection no longer re-resolves already-canonical lane paths on every submit
and status poll.
v0.6.18
Patch Changes
- d344246: The
cargo-haulerskill no longer tells agents how to setCARGO_TARGET_DIR. The one bullet that did ("do not hand-rollCARGO_TARGET_DIRisolation … the daemon already serializes per (workspace, target dir)") read as if sharing one target dir across checkouts were safe because runs are serialized; it is not — cargo's-C metadatahash is relative to the workspace root, so worktrees of one repo with the same layout collide on artifact names and stale binaries run silently (#185). Target-dir policy belongs to the operator and, where hauler can detect the footgun, to the daemon, not to the prompt. (#186)
v0.6.17
Patch Changes
- 9da56e4: Preserve shell-hook denials and governed rewrites when telemetry fails, times out,
or is cancelled. Bound recording waits and emit command-free diagnostics. Keep
probe errors explicitly host-decided rather than reporting confirmed daemon absence. - fcedc8c: Bind shell rewrites to the semantic request's observed plugin code root. Delegate
standalone root validation to the public framework resolver with explicit fallback
policies, and remove the product's native host environment precedence chain. (#181) - 6595017: Report prerequisite-blocked tickets as never run in result/await headlines and
guidance. Explain how to rerun the prerequisite and resubmit instead of claiming
there are diagnostics to fix or that a retry must attach to the blocked ticket. (#177) - 217c4c4: Report all observed test-binary summaries from shared test logs in result,
await, and last, with explicit composite-output and widened-filter labels
instead of another package's final output tail. (#180)