diff --git a/docs/reverse-engineering-tools.md b/docs/reverse-engineering-tools.md
index 0bd27ef2bb..ab2e0c83ed 100644
--- a/docs/reverse-engineering-tools.md
+++ b/docs/reverse-engineering-tools.md
@@ -88,7 +88,11 @@ 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.
+as opaque metadata, without inferring cleanup ownership from it. A generation
+mismatch is an input correction only when the authenticated reply confirms
+`not_started`. Missing or ambiguous execution state retains the command's
+completion uncertainty until terminal proof arrives, even if the reply names a
+generation error.
## Configuration and coverage
diff --git a/src/cutter/CutterBridgeClient.ts b/src/cutter/CutterBridgeClient.ts
index c02c3b5eb2..1085a829e7 100644
--- a/src/cutter/CutterBridgeClient.ts
+++ b/src/cutter/CutterBridgeClient.ts
@@ -20,6 +20,7 @@ import { z } from "zod";
import {
AnalysisCapabilityUnavailableError,
+ AnalysisInputError,
AnalysisOutputError,
AnalysisResourceConstraintError,
} from "../domain/analysisErrorCore.js";
@@ -180,9 +181,12 @@ class CutterBridgeResponseFrames {
}
}
-const assertCommandActive = (signal: AbortSignal | undefined): void => {
+const assertBridgeActive = (
+ signal: AbortSignal | undefined,
+ operation: "cutter_command" | "list_cutter_sessions",
+): void => {
if (signal?.aborted)
- throw new AnalysisCancelledError("cutter_command", {
+ throw new AnalysisCancelledError(operation, {
cause: signal.reason,
});
};
@@ -190,9 +194,9 @@ const assertCommandActive = (signal: AbortSignal | undefined): void => {
const mapDiscovery = async (
inputs: readonly Input[],
operation: (input: Input) => Promise