From 498a93d915a623ba5630e7ae29859c19f4e80fb5 Mon Sep 17 00:00:00 2001 From: mptyl Date: Tue, 11 Aug 2026 19:50:12 +0200 Subject: [PATCH] fix: treat the operator JSON result as authoritative across exit codes --- .../internal/workspaceops/operations.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/thothctl/internal/workspaceops/operations.go b/tools/thothctl/internal/workspaceops/operations.go index 23d21be7..96bc78a0 100644 --- a/tools/thothctl/internal/workspaceops/operations.go +++ b/tools/thothctl/internal/workspaceops/operations.go @@ -293,15 +293,16 @@ func Execute(ctx context.Context, installation config.Installation, runner Runne return Result{}, err } result, err := runDocker(ctx, runner, StageComposeRun, args, bytes.NewReader(stdin)) - // The operator deliberately exits 3 for expected operator checkpoints/blocks - // (manual_review_required, evidence_materialization_required, lock/revision conflict). - // That exit is a valid machine result: the JSON payload on stdout is still authoritative. - if err != nil && !isExpectedOperatorExit(result, err) { - return Result{}, err - } - response, err := parseResponse(result.Stdout) - if err != nil { - return Result{}, err + // The operator emits one authoritative JSON result on stdout and encodes its status in the + // exit code (0 success, 3 operator checkpoint/block, 1 operational failure). A nonzero + // exit is therefore still a valid machine result whenever stdout parses; only a missing or + // malformed payload becomes an error. + response, parseErr := parseResponse(result.Stdout) + if parseErr != nil { + if err != nil { + return Result{}, err + } + return Result{}, parseErr } if suggest, ok := request.(SuggestFksRequest); ok && suggest.Output != "" { if response.SuggestedFksYAML == "" {