cargo-hauler 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +31 -8
  3. package/dist/.claude-plugin/marketplace.json +1 -1
  4. package/dist/.claude-plugin/plugin.json +1 -1
  5. package/dist/.codex-plugin/plugin.json +1 -1
  6. package/dist/.cursor-plugin/plugin.json +1 -1
  7. package/dist/AGENTS.md +6 -5
  8. package/dist/INSTALL.md +1 -1
  9. package/dist/README.md +31 -8
  10. package/dist/agent-bundle.compile-evidence.json +1 -1
  11. package/dist/agent-bundle.manifest.json +1 -1
  12. package/dist/agent-bundle.package-compile-evidence.json +1 -1
  13. package/dist/bin/cargo-hauler-flight.mjs +27 -27
  14. package/dist/bin/cargo-hauler.mjs +60 -60
  15. package/dist/bin/hauler.js +46 -46
  16. package/dist/hooks/event-route-session-start.claude.mjs +2 -2
  17. package/dist/hooks/event-route-session-start.codex.mjs +2 -2
  18. package/dist/hooks/event-route-session-start.cursor.mjs +2 -2
  19. package/dist/hooks/event-route-stop.claude.mjs +2 -2
  20. package/dist/hooks/event-route-stop.codex.mjs +2 -2
  21. package/dist/hooks/event-route-stop.cursor.mjs +2 -2
  22. package/dist/hooks/event-route-tool-after.claude.execute.mjs +2 -2
  23. package/dist/hooks/event-route-tool-after.claude.mjs +9 -9
  24. package/dist/hooks/event-route-tool-after.codex.execute.mjs +2 -2
  25. package/dist/hooks/event-route-tool-after.codex.mjs +9 -9
  26. package/dist/hooks/event-route-tool-after.cursor.execute.mjs +2 -2
  27. package/dist/hooks/event-route-tool-after.cursor.mjs +9 -9
  28. package/dist/hooks/event-route-tool-before.claude.execute.mjs +2 -2
  29. package/dist/hooks/event-route-tool-before.codex.execute.mjs +2 -2
  30. package/dist/hooks/event-route-tool-before.cursor.execute.mjs +2 -2
  31. package/dist/hooks/hooks-flight.mjs +23 -23
  32. package/dist/install.mjs +1 -1
  33. package/dist/mcp/mcp-hauler-2b8242f9-flight.mjs +32 -32
  34. package/dist/mcp/mcp-hauler-2b8242f9.mjs +30 -30
  35. package/dist/mcp-apps/dashboard.html +2 -2
  36. package/dist/package.json +1 -1
  37. package/dist/plugin.json +1 -1
  38. package/dist/scripts/hauler.mjs +46 -46
  39. package/dist/skills/hauler-dashboard/SKILL.md +1 -1
  40. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 7490839: Internal: the implementation behind the Agent Bundle entrypoints now lives
8
+ under `src/internal/<owner>/` (contracts, cargo, daemon/{runtime,broker,
9
+ scheduling,reporting}, storage, client, operations, host-hooks,
10
+ integrations/kache, platform, shim, ui/{documents,dashboard,shared}, util)
11
+ instead of `daemon/`, `lib/`, `hooks/`, and friends; `tests/` is grouped by
12
+ what a test executes (unit, integration, packaging, acceptance). A move-only
13
+ change: no route, executable, protocol, or scheduling behaviour changed.
14
+ `docs/architecture.md` is the ownership map and walkthrough.
15
+
3
16
  ## 0.8.1
4
17
 
5
18
  ### Patch Changes
package/README.md CHANGED
@@ -787,7 +787,6 @@ argv parser, or string-concatenated Markdown; the `src/` tree is the app.
787
787
  src/
788
788
  layout.tsx the hauler shell around every rendered route
789
789
  providers/hauler-daemon.ts request-scoped daemon configuration
790
- components/ typed components over pure view-models
791
790
  mcp/hauler/tools/*.tsx hauler_status, _dashboard, _log, _last, _await, _result, _request, _kill
792
791
  mcp/hauler/tools/*.cli.ts each tool's `hauler <command>` projection (flags, positionals)
793
792
  mcp/hauler/apps/dashboard.tsx the MCP App (ui://cargo-hauler/dashboard.html)
@@ -796,9 +795,26 @@ src/
796
795
  events/tool/{before,after}.tsx the shell hook routes, gated by *.preflight.ts
797
796
  skills/cargo-hauler/SKILL.md, skills/hauler-dashboard/SKILL.tsx
798
797
  scripts/hauler.ts the `hauler` process entry hooks rewrite cargo to
799
- daemon/, client/, hooks/, shim/, lib/ the broker and its libraries
798
+ internal/ the implementation the entrypoints import, by owner
799
+ contracts/ wire protocol, tool schemas, wire version
800
+ cargo/ argv, intent, workspace, topology, execution/
801
+ daemon/ composition (main, config), runtime/, broker/, scheduling/, reporting/
802
+ storage/ the SQLite ledger and per-ticket output logs
803
+ client/ socket clients: control, exec, tickets, ensure-daemon
804
+ operations/ what the routes call: tickets, status, inspection
805
+ host-hooks/ the shell/session hook handlers and their small RPC client
806
+ integrations/kache/ kache status and store pressure
807
+ platform/ state and socket paths, private-file policy, executable location
808
+ shim/ the PATH shim installer
809
+ ui/documents/, ui/dashboard/, ui/shared/ agent documents, the browser App, shared formatters
810
+ util/ guards, ids, text, ANSI
800
811
  ```
801
812
 
813
+ Everything above `internal/` is discovered by the framework's conventions;
814
+ everything under it is ordinary imported code. [docs/architecture.md](docs/architecture.md)
815
+ is the ownership map and walks the three main paths (submitting cargo, reading
816
+ status, processing a shell hook) file by file.
817
+
802
818
  #### The shell (`src/layout.tsx`)
803
819
 
804
820
  Every rendered route — MCP tool, CLI command, rendered script — composes
@@ -826,7 +842,7 @@ addition: each re-exports a `preflight` (`before.preflight.ts`,
826
842
  `hooks/event-route-tool-before.<host>.mjs`, a few hundred KB with no React,
827
843
  Flight worker, or Effect — and runs before the rendered route
828
844
  (`*.execute.mjs`) is loaded. The gate decides on the raw command
829
- (`src/hooks/tokens.ts`; `session-ping.ts` for the one bounded completion ping
845
+ (`src/internal/host-hooks/tokens.ts`; `session-ping.ts` for the one bounded completion ping
830
846
  after a tool ran): `continue` for the shell calls that name neither cargo nor
831
847
  hauler, `execute` for the rest. Both routes declare `providers: []`, so
832
848
  neither mounts the daemon-config provider; the rendered route calls
@@ -843,7 +859,7 @@ socket, and ledger paths); active health and status I/O belongs to the operation
843
859
  that needs it. Routes read the config through `requestDaemonConfig(context)`,
844
860
  and tests inject a fixture through the harness `context.providers` seam.
845
861
 
846
- #### Components (`src/components/`)
862
+ #### Components (`src/internal/ui/documents/`)
847
863
 
848
864
  Components render view-models and nothing else. The models are pure functions
849
865
  in `view-models.ts`, so the MCP document, the CLI Markdown, and a test
@@ -871,7 +887,7 @@ assertion share one derivation.
871
887
  same operation render the same document with different command spellings
872
888
  (`surface.ts`).
873
889
 
874
- #### Streaming (`src/components/streaming.tsx`)
890
+ #### Streaming (`src/internal/ui/documents/streaming.tsx`)
875
891
 
876
892
  `hauler_await` and `hauler_log` are progressive documents. Each is a
877
893
  valueless `Agent.Result` container around one `Suspense` boundary:
@@ -944,7 +960,7 @@ with the wait split by cause: *lane-bound* (a same-lane leader was still
944
960
  compiling — before its `Finished` line or exit), *permit-bound* (every
945
961
  admission permit was held and no same-lane compile was to blame), and *other*
946
962
  (admission holds, `--after` prerequisites, scheduling latency). The
947
- classification is a pure sweep over ledger rows (`src/daemon/wait-split.ts`)
963
+ classification is a pure sweep over ledger rows (`src/internal/daemon/reporting/wait-split.ts`)
948
964
  run once per status refresh against the daemon's current permit count, which
949
965
  the tile states; runs admitted under an earlier cap are classified against
950
966
  today's. With `buildFinishedAtMs` on the row, the by-command split adds
@@ -957,12 +973,19 @@ the lane time the execution-phase hand-back released.
957
973
  pnpm run check # validate + build + typecheck + Effect diagnostics + rstest + route tests
958
974
  ```
959
975
 
976
+ `tests/` is grouped by what a test executes: `unit/<subsystem>/` is scoped to
977
+ one owner under `src/internal/`; `integration/` runs a real broker
978
+ in-process through `tests/support/harness.ts`; `packaging/` reads the built
979
+ `artifact/` or spawns the package entries; `acceptance/` drives real `cargo`
980
+ against the workspaces under `evals/fixtures/`; `route-unit/` and
981
+ `browser-app/` are the framework-level suites below.
982
+
960
983
  `tests/route-unit/` renders the app through the framework compiler with no
961
984
  artifact build, at the harness proof levels:
962
985
 
963
986
  | Level | Suite | What it proves |
964
987
  | --- | --- | --- |
965
- | route-unit | `routes`, `layout`, `streaming`, `events` | documents, shell metadata, Suspense fallbacks and settled values, lineage attribution, event decisions (the shell routes' preflight gates are unit-tested in `tests/event-preflight.test.ts` and against their compiled entries in `tests/hooks-simulate.test.ts`) |
988
+ | route-unit | `routes`, `layout`, `streaming`, `events` | documents, shell metadata, Suspense fallbacks and settled values, lineage attribution, event decisions (the shell routes' preflight gates are unit-tested in `tests/integration/event-preflight.test.ts` and against their compiled entries in `tests/integration/hooks-simulate.test.ts`) |
966
989
  | cli-dispatch | `cli-dispatch`, `layout` | argv through the routed CLI shell; Markdown wrapped by the shell, `--json` bare |
967
990
  | script-dispatch | `script-dispatch` | the `hauler` entry through its `main` envelope as its own process |
968
991
  | mcp-in-memory | `mcp-surface`, `layout` | tool names, `outputSchema`, the dashboard resource link, `_meta.hauler`, and a live fixture broker over the in-memory transport |
@@ -971,7 +994,7 @@ artifact build, at the harness proof levels:
971
994
  | workbench-surface | `workbench-surface` | what `agent-bundle dev` would show: catalog, provider, lifecycles per host, counts |
972
995
 
973
996
  Daemon-backed cases run a real broker in-process with a fake `cargo`
974
- (`tests/harness.ts`) and reach it either through the `haulerDaemon` provider
997
+ (`tests/support/harness.ts`) and reach it either through the `haulerDaemon` provider
975
998
  seam or through `CARGO_HAULER_STATE_DIR`.
976
999
 
977
1000
  ### Development
@@ -1 +1 @@
1
- {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler-marketplace","owner":{"name":"cargo-hauler"},"plugins":[{"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","source":"./","version":"0.8.1"}]}
1
+ {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler-marketplace","owner":{"name":"cargo-hauler"},"plugins":[{"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","source":"./","version":"0.8.2"}]}
@@ -1 +1 @@
1
- {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler","version":"0.8.1"}
1
+ {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler","version":"0.8.2"}
@@ -1 +1 @@
1
- {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","hooks":"./.codex-plugin/hooks.json","interface":{"capabilities":["mcp","hooks","skills"],"category":"Productivity","defaultPrompt":["Help me use cargo-hauler."],"developerName":"cargo-hauler","displayName":"cargo-hauler","longDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","shortDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks."},"keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.1"}
1
+ {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","hooks":"./.codex-plugin/hooks.json","interface":{"capabilities":["mcp","hooks","skills"],"category":"Productivity","defaultPrompt":["Help me use cargo-hauler."],"developerName":"cargo-hauler","displayName":"cargo-hauler","longDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","shortDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks."},"keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.2"}
@@ -1 +1 @@
1
- {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","displayName":"cargo-hauler","hooks":"./.cursor-plugin/hooks.json","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.1"}
1
+ {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","displayName":"cargo-hauler","hooks":"./.cursor-plugin/hooks.json","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.2"}
package/dist/AGENTS.md CHANGED
@@ -11,14 +11,15 @@
11
11
  diagnostics, `rstest`, the route-unit suite, and browser App tests. Run it
12
12
  before claiming a change is done.
13
13
  - The plugin surface is an agent-bundle application: `src/layout.tsx` (the
14
- shell), `src/providers/hauler-daemon.ts` (daemon connection), `src/components`
15
- (typed components over `view-models.ts`), `src/mcp/hauler/tools` and
14
+ shell), `src/providers/hauler-daemon.ts` (daemon connection),
15
+ `src/internal/ui/documents` (typed components over `view-models.ts`), `src/mcp/hauler/tools` and
16
16
  `src/mcp/hauler/apps` (MCP; each tool's `<tool>.cli.ts` is its `hauler`
17
17
  command), `src/events` (hook routes; `tool/before.preflight.ts` and
18
18
  `tool/after.preflight.ts` decide on the raw command before the route
19
- loads — keep them free of React and Effect), `src/hooks` (the handlers
20
- the routes call), `src/cli/daemon.ts`, `src/scripts/hauler.ts` (process entry),
21
- `src/skills`. The README's tour is the map; do not reintroduce a
19
+ loads — keep them free of React and Effect), `src/internal/host-hooks` (the
20
+ handlers the routes call), `src/cli/daemon.ts`, `src/scripts/hauler.ts` (process
21
+ entry), `src/skills`. Everything else lives under `src/internal/<owner>/`
22
+ (`docs/architecture.md` is the ownership map); do not reintroduce a
22
23
  hand-written server, argv parser, or string-concatenated documents — add a
23
24
  component and a view-model.
24
25
  - Documents must stay honest: a daemon the probe could not reach renders as
package/dist/INSTALL.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.
4
4
 
5
- Version: `0.8.1`
5
+ Version: `0.8.2`
6
6
 
7
7
  Run these commands from this bundle directory. The bundle is self-contained: every command below is
8
8
  a host command or the bundled installer, and nothing requires the `agent-bundle` CLI. Where that CLI is
package/dist/README.md CHANGED
@@ -787,7 +787,6 @@ argv parser, or string-concatenated Markdown; the `src/` tree is the app.
787
787
  src/
788
788
  layout.tsx the hauler shell around every rendered route
789
789
  providers/hauler-daemon.ts request-scoped daemon configuration
790
- components/ typed components over pure view-models
791
790
  mcp/hauler/tools/*.tsx hauler_status, _dashboard, _log, _last, _await, _result, _request, _kill
792
791
  mcp/hauler/tools/*.cli.ts each tool's `hauler <command>` projection (flags, positionals)
793
792
  mcp/hauler/apps/dashboard.tsx the MCP App (ui://cargo-hauler/dashboard.html)
@@ -796,9 +795,26 @@ src/
796
795
  events/tool/{before,after}.tsx the shell hook routes, gated by *.preflight.ts
797
796
  skills/cargo-hauler/SKILL.md, skills/hauler-dashboard/SKILL.tsx
798
797
  scripts/hauler.ts the `hauler` process entry hooks rewrite cargo to
799
- daemon/, client/, hooks/, shim/, lib/ the broker and its libraries
798
+ internal/ the implementation the entrypoints import, by owner
799
+ contracts/ wire protocol, tool schemas, wire version
800
+ cargo/ argv, intent, workspace, topology, execution/
801
+ daemon/ composition (main, config), runtime/, broker/, scheduling/, reporting/
802
+ storage/ the SQLite ledger and per-ticket output logs
803
+ client/ socket clients: control, exec, tickets, ensure-daemon
804
+ operations/ what the routes call: tickets, status, inspection
805
+ host-hooks/ the shell/session hook handlers and their small RPC client
806
+ integrations/kache/ kache status and store pressure
807
+ platform/ state and socket paths, private-file policy, executable location
808
+ shim/ the PATH shim installer
809
+ ui/documents/, ui/dashboard/, ui/shared/ agent documents, the browser App, shared formatters
810
+ util/ guards, ids, text, ANSI
800
811
  ```
801
812
 
813
+ Everything above `internal/` is discovered by the framework's conventions;
814
+ everything under it is ordinary imported code. [docs/architecture.md](docs/architecture.md)
815
+ is the ownership map and walks the three main paths (submitting cargo, reading
816
+ status, processing a shell hook) file by file.
817
+
802
818
  #### The shell (`src/layout.tsx`)
803
819
 
804
820
  Every rendered route — MCP tool, CLI command, rendered script — composes
@@ -826,7 +842,7 @@ addition: each re-exports a `preflight` (`before.preflight.ts`,
826
842
  `hooks/event-route-tool-before.<host>.mjs`, a few hundred KB with no React,
827
843
  Flight worker, or Effect — and runs before the rendered route
828
844
  (`*.execute.mjs`) is loaded. The gate decides on the raw command
829
- (`src/hooks/tokens.ts`; `session-ping.ts` for the one bounded completion ping
845
+ (`src/internal/host-hooks/tokens.ts`; `session-ping.ts` for the one bounded completion ping
830
846
  after a tool ran): `continue` for the shell calls that name neither cargo nor
831
847
  hauler, `execute` for the rest. Both routes declare `providers: []`, so
832
848
  neither mounts the daemon-config provider; the rendered route calls
@@ -843,7 +859,7 @@ socket, and ledger paths); active health and status I/O belongs to the operation
843
859
  that needs it. Routes read the config through `requestDaemonConfig(context)`,
844
860
  and tests inject a fixture through the harness `context.providers` seam.
845
861
 
846
- #### Components (`src/components/`)
862
+ #### Components (`src/internal/ui/documents/`)
847
863
 
848
864
  Components render view-models and nothing else. The models are pure functions
849
865
  in `view-models.ts`, so the MCP document, the CLI Markdown, and a test
@@ -871,7 +887,7 @@ assertion share one derivation.
871
887
  same operation render the same document with different command spellings
872
888
  (`surface.ts`).
873
889
 
874
- #### Streaming (`src/components/streaming.tsx`)
890
+ #### Streaming (`src/internal/ui/documents/streaming.tsx`)
875
891
 
876
892
  `hauler_await` and `hauler_log` are progressive documents. Each is a
877
893
  valueless `Agent.Result` container around one `Suspense` boundary:
@@ -944,7 +960,7 @@ with the wait split by cause: *lane-bound* (a same-lane leader was still
944
960
  compiling — before its `Finished` line or exit), *permit-bound* (every
945
961
  admission permit was held and no same-lane compile was to blame), and *other*
946
962
  (admission holds, `--after` prerequisites, scheduling latency). The
947
- classification is a pure sweep over ledger rows (`src/daemon/wait-split.ts`)
963
+ classification is a pure sweep over ledger rows (`src/internal/daemon/reporting/wait-split.ts`)
948
964
  run once per status refresh against the daemon's current permit count, which
949
965
  the tile states; runs admitted under an earlier cap are classified against
950
966
  today's. With `buildFinishedAtMs` on the row, the by-command split adds
@@ -957,12 +973,19 @@ the lane time the execution-phase hand-back released.
957
973
  pnpm run check # validate + build + typecheck + Effect diagnostics + rstest + route tests
958
974
  ```
959
975
 
976
+ `tests/` is grouped by what a test executes: `unit/<subsystem>/` is scoped to
977
+ one owner under `src/internal/`; `integration/` runs a real broker
978
+ in-process through `tests/support/harness.ts`; `packaging/` reads the built
979
+ `artifact/` or spawns the package entries; `acceptance/` drives real `cargo`
980
+ against the workspaces under `evals/fixtures/`; `route-unit/` and
981
+ `browser-app/` are the framework-level suites below.
982
+
960
983
  `tests/route-unit/` renders the app through the framework compiler with no
961
984
  artifact build, at the harness proof levels:
962
985
 
963
986
  | Level | Suite | What it proves |
964
987
  | --- | --- | --- |
965
- | route-unit | `routes`, `layout`, `streaming`, `events` | documents, shell metadata, Suspense fallbacks and settled values, lineage attribution, event decisions (the shell routes' preflight gates are unit-tested in `tests/event-preflight.test.ts` and against their compiled entries in `tests/hooks-simulate.test.ts`) |
988
+ | route-unit | `routes`, `layout`, `streaming`, `events` | documents, shell metadata, Suspense fallbacks and settled values, lineage attribution, event decisions (the shell routes' preflight gates are unit-tested in `tests/integration/event-preflight.test.ts` and against their compiled entries in `tests/integration/hooks-simulate.test.ts`) |
966
989
  | cli-dispatch | `cli-dispatch`, `layout` | argv through the routed CLI shell; Markdown wrapped by the shell, `--json` bare |
967
990
  | script-dispatch | `script-dispatch` | the `hauler` entry through its `main` envelope as its own process |
968
991
  | mcp-in-memory | `mcp-surface`, `layout` | tool names, `outputSchema`, the dashboard resource link, `_meta.hauler`, and a live fixture broker over the in-memory transport |
@@ -971,7 +994,7 @@ artifact build, at the harness proof levels:
971
994
  | workbench-surface | `workbench-surface` | what `agent-bundle dev` would show: catalog, provider, lifecycles per host, counts |
972
995
 
973
996
  Daemon-backed cases run a real broker in-process with a fake `cargo`
974
- (`tests/harness.ts`) and reach it either through the `haulerDaemon` provider
997
+ (`tests/support/harness.ts`) and reach it either through the `haulerDaemon` provider
975
998
  seam or through `CARGO_HAULER_STATE_DIR`.
976
999
 
977
1000
  ### Development