Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Troubleshooting

Common local issues and the real diagnostics to resolve them. Every error message below is reproduced verbatim from the 0.0.1-beta.4 build.

aasm start fails: “failed to spawn aa-gateway”

$ aasm start --mode local --port 7391
aasm start: failed to spawn aa-gateway: No such file or directory (os error 2)

Cause. aasm start shells out to a separate aa-gateway binary, which must be on your PATH.

Fix. Build it and put target/debug on PATH:

$ cargo build -p aa-gateway --bin aa-gateway
$ export PATH="$PWD/target/debug:$PATH"
$ aasm start --mode local --port 7391

aasm start fails: “–policy is required in legacy-grpc mode”

$ aasm start
Error: "--policy is required in legacy-grpc mode"
aasm start: gateway did not become ready within 5.000335375s

Cause. The aa-gateway binary defaults to its legacy gRPC mode, which requires a policy file. For a local control plane with the HTTP API and dashboard, you want local mode, which does not.

Fix. Run local mode directly:

$ aa-gateway --mode local
Agent Assembly [local mode] v0.0.1-beta.4
  Listening:  http://127.0.0.1:7391
  Dashboard:  http://127.0.0.1:7391/
  Storage:    /Users/you/.aasm/local.db (SQLite)

  Ctrl+C to stop.

For the legacy gRPC server, supply a policy: aa-gateway --policy policy-examples/low-risk.yaml.

CLI commands say the gateway is “unreachable”

$ aasm status
Agent Assembly Status
─────────────────────────────────────
  Gateway:   http://localhost:8080
  Health:    ✗ unreachable
─────────────────────────────────────
...
Error: gateway is not running. Start it with: aasm start
$ aasm version
+-----------+---------------+-------------+
| COMPONENT | VERSION       | STATUS      |
+=========================================+
| cli       | 0.0.1-beta.4  | -           |
|-----------+---------------+-------------|
| gateway   | -             | unreachable |
|-----------+---------------+-------------|
| api       | -             | unreachable |
+-----------+---------------+-------------+

Cause. The CLI defaults to the SaaS control-plane API on http://localhost:8080. The local-mode gateway serves its API on 7391, not 8080, so the default target is unreachable.

Fix. Point the CLI at the local API:

$ aasm --api-url http://127.0.0.1:7391 status
Agent Assembly Status
─────────────────────────────────────
  Mode:      local
  Gateway:   http://127.0.0.1:7391
  Storage:   sqlite
  Version:   0.0.1-beta.4
  Uptime:    2m 24s
  Health:    ✓ ok
─────────────────────────────────────

To avoid repeating the flag, save a named context with aasm context or set the API URL in ~/.aa/config.yaml.

aasm gateway status says “not running” even though local mode is up

$ aasm gateway status
Gateway: not running

Cause. aasm gateway status tracks the legacy gRPC gateway via its PID file. A gateway started in local mode (aa-gateway --mode local) is a different process and is not reflected here.

Fix. Check local-mode liveness with the HTTP status instead:

$ aasm --api-url http://127.0.0.1:7391 status

or hit the health endpoint directly: curl http://127.0.0.1:7391/healthz.

A dashboard page loads but its tables stay empty / skeleton

Cause. The dashboard SPA served by the local-mode gateway can render its chrome and page shells, but aa-gateway --mode local wires only two REST routes — /api/v1/health and /api/v1/admin/status. It cannot mount the full aa-api router, because that router needs an aa_api::AppState local mode deliberately does not construct (aa-gateway/src/local_mode.rs:269-277). Every other /api/v1/* path therefore falls through to the SPA catch-all and comes back as text/html, which reads to a caller as “the endpoint is missing”.

Fix — run aa-api-server, which is the binary that serves the REST surface. This is not discoverable from the gateway’s own output, and assuming the local REST surface does not exist is the wrong conclusion to draw from it (AAASM-5694):

$ cargo build -p aa-api --bin aa-api-server
$ AASM_API_AUTH=off AA_API_ADDR=127.0.0.1:7700 ./target/debug/aa-api-server
$ curl -s http://127.0.0.1:7700/api/v1/health

This is the same binary the dashboard-e2e-real-backend CI lane boots, so a page verified this way is verified against what CI checks. Endpoints backed by the SaaS/cloud control plane remain unavailable locally; a panel still empty after this is either one of those or genuinely has no rows.

policy validate prints “Unknown key … will be ignored”

$ aasm policy validate policy-examples/medium-risk.yaml
warning: tier — Unknown key 'tier' will be ignored
warning: rules — Unknown key 'rules' will be ignored
warning: notifications — Unknown key 'notifications' will be ignored
Policy is valid: policy-examples/medium-risk.yaml

Cause. These are warnings, not errors — the policy still validates. The keys tier, rules, notifications, and similar are not part of the schema the gateway enforces; the supported spec sections are network, schedule, budget, data, tools, capabilities, approval, and scope.

Fix. Move the intended behaviour into a supported section (e.g. express allow/deny via capabilities or tools, gating via approval), or ignore the warnings if the extra keys are intentional annotations. The capability-policy.yaml example validates with no warnings and is a good reference shape.

A wildcard egress host is denied in policy simulate

If aasm policy simulate denies a host that your *.example.com allowlist entry should permit, this is expected: the simulator’s decision path uses an exact host comparison, while the live aa-proxy uses the glob-aware matcher. Confirm the host against the running proxy rather than treating the simulation deny as a real block — see the caveat in Enforce an egress policy.

aasm run --isolation process refuses to launch: “cannot be selected on this host”

$ aasm run exec --isolation process -- python agent.py
Error: refusing to launch: an execution-isolation boundary was requested and the `sandlock`
backend cannot be selected on this host — no sandlock executable on PATH; install it or set
AA_SANDLOCK_BIN.

There is no fallback. A launch that asked for a boundary and quietly ran without one would
report as governed while being unconfined, which is the failure this mode exists to prevent.
Install the backend, or re-run with `--isolation none` to launch unconfined deliberately.

Cause. On Linux this requires a separate backend executable that Agent Assembly does not bundle, download, or build on your behalf. --isolation auto / --isolation process never falls back to running unconfined — there is no silent degrade.

Fix. On Linux, install the backend and put it on PATH, or set AA_SANDLOCK_BIN to its path. On Apple Silicon macOS, pass --isolation-backend aasm-macos-vm explicitly (not selected by auto) and set AA_ISOLATION_MACOS_VM_{HELPER,KERNEL,ROOTFS} — see Execution isolation for the full prerequisites and its named limitations. On Intel macOS or Windows there is no fix; no backend targets those platforms today. If you just want to see what a run would do without the backend installed, --dry-run reports the same refusal without stopping. Full detail, including every refusal message and the per-capability troubleshooting table, is in Execution isolation → Troubleshooting.

A policy-required isolation control is refused instead of degraded

If a policy states an execution-isolation requirement with a posture that demands prevention and the selected backend cannot provide it, the launch refuses before the process starts rather than running with a weaker boundary than requested. Check the per-capability table in aasm run --dry-run’s --- execution isolation --- section for the exact domain and reason — see Execution isolation → Requested vs. achieved.

Quick reference

SymptomFirst thing to check
“failed to spawn aa-gateway”aa-gateway on PATH?
“–policy is required”Use aa-gateway --mode local, not the default
“unreachable” on every CLI callPass --api-url http://127.0.0.1:7391
gateway status “not running”Local mode ≠ legacy gRPC; use status / /healthz
Empty dashboard tables--mode local serves no data routes — run aa-api-server
validate warningsUnknown keys ignored — move into a supported section
aasm run --isolation refuses to launchLinux + backend on PATH/AA_SANDLOCK_BIN? Apple Silicon macOS needs --isolation-backend aasm-macos-vm explicitly. Intel macOS/Windows have no backend at all

Last updated: 2026-08-24 by Chisanan232