Auto-verify after remote edit prose

ober

c15fd430501aa503e87e5898dd1b7adf3e9532ab

diff --git a/src/jcode/core/verified-run.ss b/src/jcode/core/verified-run.ss
index aa220fc..e377bce 100644
--- a/src/jcode/core/verified-run.ss
+++ b/src/jcode/core/verified-run.ss
@@ -6008,6 +6008,10 @@
 	                                 (current-edited-since-verify?))
 	                            (list (make-wtool-call "verify" '() #f)))
 	                           (else #f))))
+	                     (cons 'text-response-tool-calls
+	                       (lambda (_content)
+	                         (and (current-edited-since-verify?)
+	                              (list (make-wtool-call "verify" '() #f)))))
 	                     (cons 'prepare-messages
 	                       (lambda (messages)
 	                         (compact-verified-history
diff --git a/src/jcode/core/workflow-runner.ss b/src/jcode/core/workflow-runner.ss
index 2a31e2a..58622c0 100644
--- a/src/jcode/core/workflow-runner.ss
+++ b/src/jcode/core/workflow-runner.ss
@@ -439,6 +439,7 @@
      tool-spec-filter (#f; optional current tool-specs -> visible tool-specs)
      tool-execution-spec-filter (#f; optional current tool-specs -> executable tool-specs)
      automatic-tool-calls (#f; optional thunk -> tool-call list)
+     text-response-tool-calls (#f; optional text -> tool-call list)
      on-message (#f) prompt-vars ('()) initial-messages (#f)
      cancel? (thunk -> bool, default never).
    Raises MaxIterationsError / StepEnforcementError / PrerequisiteError /
@@ -455,6 +456,7 @@
          (tool-spec-filter (opt-ref o 'tool-spec-filter))
          (tool-execution-spec-filter (opt-ref o 'tool-execution-spec-filter))
          (automatic-tool-calls (opt-ref o 'automatic-tool-calls))
+         (text-response-tool-calls (opt-ref o 'text-response-tool-calls))
          (on-message     (opt-ref o 'on-message))
          (prompt-vars    (or (opt-ref o 'prompt-vars) '()))
          (initial-msgs   (opt-ref o 'initial-messages))
@@ -521,6 +523,18 @@
 	               ((text-response? response)
 	                (let ((content (text-response-content response)))
 	                  (emit! (make-assistant-message content))
+	                  (let ((tool-calls
+	                          (and text-response-tool-calls
+	                               (text-response-tool-calls content))))
+	                    (if (and (list? tool-calls) (pair? tool-calls))
+	                      (begin
+	                        (error-tracker-reset-retries! error-tracker)
+	                        (let ((outcome
+	                                (execute-batch! emit! workflow enforcer
+	                                  error-tracker tool-calls executable-tool-names)))
+	                          (if (and (pair? outcome) (eq? (car outcome) 'terminal))
+	                            (cdr outcome)
+	                            (loop (+ iteration 1)))))
 	                  (if retry-text-responses?
 	                    (begin
 	                      (error-tracker-record-retry! error-tracker)
@@ -534,7 +548,7 @@
                                    (error-tracker-consecutive-retries
                                      error-tracker))))
 	                      (loop (+ iteration 1)))
-	                    (loop (+ iteration 1)))))
+	                    (loop (+ iteration 1)))))))
 	               (else
 	                (let ((tool-calls (if (list? response) response (list response))))
 	                  (error-tracker-reset-retries! error-tracker)
diff --git a/test/run.ss b/test/run.ss
index 4680173..52ba7eb 100644
--- a/test/run.ss
+++ b/test/run.ss
@@ -3694,6 +3694,32 @@
 	  (safe-delete-test-file! target-path))
 
 	(let* ([vr-dir "/tmp"]
+	       [target "jcode-remote-auto-verify.txt"]
+	       [target-path (string-append vr-dir "/" target)]
+	       [calls 0]
+	       [responder
+	         (lambda (_messages _tools _step)
+	           (set! calls (+ calls 1))
+	           (case calls
+	             [(1) (list (make-wtool-call "write"
+	                         (list (cons "path" target)
+	                               (cons "content" "remote fixed\n")) #f))]
+	             [else (make-text-response "Continuing.")]))])
+	  (safe-delete-test-file! target-path)
+	  (let ([result
+	          (verified-run responder "remote edit should auto verify"
+	            (list
+	              (cons 'cwd vr-dir)
+	              (cons 'verify-command (string-append "grep -q 'remote fixed' " target))
+	              (cons 'write-scope (parse-write-scope target))
+	              (cons 'max-iterations 6)))])
+	    (check! "verified-run: remote edit is automatically verified"
+	            result "VERIFIED: exit 0\n"))
+	  (check! "verified-run: remote auto verify avoids prose retry"
+	          calls 2)
+	  (safe-delete-test-file! target-path))
+
+	(let* ([vr-dir "/tmp"]
 	       [target "jcode-local-env-first-cap.txt"]
 	       [target-path (string-append vr-dir "/" target)]
 	       [old-cap (getenv "JCODE_LOCAL_VERIFIED_MAX_COMPLETION_TOKENS")]