From bdfb2a9cc53f25b146f3804e4af7858ea8a32fa9 Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Fri, 2 Oct 2026 02:08:56 -0600 Subject: [PATCH] Say when a command is never acknowledged 15 commands go on the unacknowledged buffer, so acked=false is their normal outcome rather than a failure. Reporting it bare made a working camera move look broken; the note now says to confirm with get_state instead. --- src/mcbebop/tools/command.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mcbebop/tools/command.py b/src/mcbebop/tools/command.py index 137486e..233ba13 100644 --- a/src/mcbebop/tools/command.py +++ b/src/mcbebop/tools/command.py @@ -10,7 +10,7 @@ from mcbebop.config import Settings from mcbebop.models import SendResult from mcbebop.protocol import xml_index from mcbebop.protocol.safety import ALWAYS_ALLOWED -from mcbebop.protocol.types import Direction, Tier +from mcbebop.protocol.types import Buffer, Direction, Tier from mcbebop.tools._common import app, require_session LOCKED_TIERS = (Tier.MOTION, Tier.ENVELOPE) @@ -70,7 +70,15 @@ def register(mcp: FastMCP, settings: Settings) -> None: session = require_session() note = "" - if xml_index.supports_bebop2(spec.support) is False: + if spec.buffer is Buffer.NON_ACK: + # Fire-and-forget by design: piloting and camera commands go on the + # unacknowledged buffer, so acked=false here means "never acked", + # not "failed". Say so, or a working command reads as a failure. + note = ( + "Sent on the unacknowledged buffer, so the drone never replies to it; " + "acked=false is expected. Confirm it took effect with get_state()." + ) + elif xml_index.supports_bebop2(spec.support) is False: note = f"The XML does not list the Bebop 2 as supporting this (support={spec.support!r})." elif spec.deprecated: note = "Parrot marks this command deprecated; the drone may ignore it."