diff --git a/docs/reverse-engineering-tools.md b/docs/reverse-engineering-tools.md
index bb5df5ef30..e224100a79 100644
--- a/docs/reverse-engineering-tools.md
+++ b/docs/reverse-engineering-tools.md
@@ -76,6 +76,9 @@ probe retries the original command. Failed acknowledgements remain pending and
block new commands until they can be retried successfully. Status proof failures
identify `cutter_command` and retain `status` in
`details.diagnostics.auxiliary_operation`; malformed proof still blocks dispatch.
+Descriptor failures likewise retain the requesting operation through cleanup.
+Command admission reports typed cancellation and treats the caller's abort reason
+as opaque metadata, without inferring cleanup ownership from it.
## Configuration and coverage
diff --git a/src/cutter/CutterBridgeClient.ts b/src/cutter/CutterBridgeClient.ts
index 3de1be6db1..9e76f3c509 100644
--- a/src/cutter/CutterBridgeClient.ts
+++ b/src/cutter/CutterBridgeClient.ts
@@ -176,6 +176,13 @@ class CutterBridgeResponseFrames {
}
}
+const assertCommandActive = (signal: AbortSignal | undefined): void => {
+ if (signal?.aborted)
+ throw new AnalysisCancelledError("cutter_command", {
+ cause: signal.reason,
+ });
+};
+
const mapDiscovery = async (
inputs: readonly Input[],
operation: (input: Input) => Promise