Summary (issue provided by Codex)
ACP can appear “broken” even when the ACPX runtime is healthy, because dispatch is separately gated by policy.
Current behavior
- Logs may show ACPX backend is ready (
acpx runtime backend ready)
- But ACP turns fail with:
ACP dispatch is disabled by policy (acp.dispatch.enabled=false)
- error code:
ACP_DISPATCH_DISABLED
This is correct behavior, but the distinction is easy to miss during setup/troubleshooting.
Expected behavior
Make the dual-gate model explicit in CLI/log UX:
- ACP backend availability (runtime/plugin)
- ACP dispatch policy (
acp.dispatch.enabled)
Suggested improvements
- On startup, if ACP backend is ready but dispatch disabled, emit a clear INFO/WARN like:
- “ACP runtime is ready, but ACP turn dispatch is disabled by policy (
acp.dispatch.enabled=false).”
- In ACP-related doctor/status output, show both states separately:
runtime: ready|not-ready
dispatch policy: enabled|disabled
- In docs/setup examples, include minimal required config together:
acp.enabled=true
acp.dispatch.enabled=true
acp.backend=<backend-id>
Why this helps
Reduces false diagnosis of “runtime unavailable” and shortens troubleshooting for new ACP users.
Summary (issue provided by Codex)
ACP can appear “broken” even when the ACPX runtime is healthy, because dispatch is separately gated by policy.
Current behavior
acpx runtime backend ready)ACP dispatch is disabled by policy (acp.dispatch.enabled=false)ACP_DISPATCH_DISABLEDThis is correct behavior, but the distinction is easy to miss during setup/troubleshooting.
Expected behavior
Make the dual-gate model explicit in CLI/log UX:
acp.dispatch.enabled)Suggested improvements
acp.dispatch.enabled=false).”runtime: ready|not-readydispatch policy: enabled|disabledacp.enabled=trueacp.dispatch.enabled=trueacp.backend=<backend-id>Why this helps
Reduces false diagnosis of “runtime unavailable” and shortens troubleshooting for new ACP users.