buzz-acp setup payload parser rejects the desktop's MissingBinary requirement — setup-listener crashes (exit 1) instead of nudging
- Dominant language
- Rust
- Stars
- 32.7k
- Forks
- 4.3k
- Avg merge
- 1d 13h
- Merged PRs (30d)
- 253
Description
### Summary
`buzz-acp`'s setup-mode payload parser (`RequirementPayload` in `crates/buzz-acp/src/setup_mode.rs`) does not know the `MissingBinary` requirement variant that the desktop's readiness engine (`Requirement::MissingBinary` in `desktop/src-tauri/src/managed_agents/readiness.rs`) can emit. When the desktop classifies an agent as NotReady with that variant, the spawned setup-listener crashes at startup instead of entering nudge mode:
```
Error: setup payload error: malformed BUZZ_ACP_SETUP_PAYLOAD: unknown variant `missing_binary`,
expected one of `normalized_field`, `env_key`, `cli_login`, `cli_config_invalid`, `git_bash`
```
The harness then exit-loops (auto-restart respawns it, it crashes again), so the agent shows as repeatedly failing rather than grey-with-nudge.
### Reproduction
1. Pin an agent's harness (`agent_command_override`) to a command that is not resolvable in PATH and not a known ACP runtime (e.g. a bare registry *id* like `opencode-acp` rather than its resolved command — overrides are used raw, unlike `record.runtime`/persona runtime which go through the three-tier lookup).
2. Start the agent. Desktop readiness → unknown runtime → PATH check fails → `Requirement::MissingBinary` is serialized into `BUZZ_ACP_SETUP_PAYLOAD`.
3. `buzz-acp` fails to deserialize the payload → `Error: setup payload error …` → exit 1.
Observed today on a real install (agent recovered by pinning the resolved command instead).
### Suggested directions
- Add `MissingBinary { command }` to `RequirementPayload` in buzz-acp (mirroring the desktop enum) with a "install/locate the harness binary" nudge instruction.
- Alternatively/additionally: make the desktop degrade unknown-to-wire variants into `NormalizedField { field: "provider" }`-style generic requirements, or have buzz-acp skip-and-log unrecognized requirement variants (`#[serde(other)]`-style tolerance is complicated for struct-variants, but a custom deserializer or a `serde_json::Value` pass-through works).
- Longer term, a shared wire type for the setup payload would prevent drift between the two binaries shipped in the same bundle.
Cross-ref: #7611 (same incident, agent-orchestration bugs).
Contributor guide
Assessment
This issue has not been assessed yet.