Avoid forcing local large draft repairs

ober

135ae767fcf77af774d32937a2b9d16f38dfdbda

diff --git a/src/jcode/core/verified-run.ss b/src/jcode/core/verified-run.ss
index 1dbace6..4210a25 100644
--- a/src/jcode/core/verified-run.ss
+++ b/src/jcode/core/verified-run.ss
@@ -20,6 +20,7 @@
         default-verify-command
         default-verified-max-iterations
         current-required-range-repair
+        large-unclosed-rejected-draft-content?
         long-prefix-exact-replacement-block-message)
 
 (import :std/os/aproc
@@ -450,9 +451,26 @@
        (tool-specs-include? specs "edit")
        (openai-function-tool-choice "edit")))
 
+(def (large-unclosed-rejected-draft-content? msg content)
+  (and (string? msg)
+       (string? content)
+       (> (string-length content) 4096)
+       (if (or (string-contains msg
+                 "delimiter balance failed: Unclosed")
+               (string-contains msg
+                 "Minimal EOF delimiter repair was not applied"))
+         #t
+         #f)))
+
+(def (large-unclosed-rejected-draft?)
+  (let ((draft (current-rejected-ss-draft)))
+    (and (pair? draft)
+         (large-unclosed-rejected-draft-content?
+           (current-rejected-draft-guard-message)
+           (cdr draft)))))
+
 (def (rejected-draft-direct-edit-guard?)
-  (let ((msg (current-rejected-draft-guard-message))
-        (draft (current-rejected-ss-draft)))
+  (let ((msg (current-rejected-draft-guard-message)))
     (and (string? msg)
          (or (string-contains msg "list-set! is not available")
              (string-contains msg "random-make-state")
@@ -460,12 +478,13 @@
              (string-contains msg "Jerboa has no break form")
              (string-contains msg "Jerboa has no continue form")
              (string-contains msg "Jerboa imports use")
-             (and (pair? draft)
-                  (> (string-length (cdr draft)) 4096)
-                  (or (string-contains msg
-                        "delimiter balance failed: Unclosed")
-                      (string-contains msg
-                        "Minimal EOF delimiter repair was not applied")))))))
+             (large-unclosed-rejected-draft?)))))
+
+(def (suppress-local-staged-tool-choice? staged-tool)
+  (and (current-verified-local-model?)
+       (string? staged-tool)
+       (string=? staged-tool "edit")
+       (large-unclosed-rejected-draft?)))
 
 (def (force-staged-create-repair-tool-name specs)
   ;; Syntax-broken missing-file creates have no on-disk artifact yet. The
@@ -582,18 +601,24 @@
              (else
               (current-max-tokens-cap)))))
 	        (if (procedure? provider)
-	          (let* ((specs (verified-provider-tool-specs tool-specs))
-	                 (staged-tool
-	                   (force-staged-create-repair-tool-name specs))
-	                 (staged-choice
-	                   (and staged-tool
-	                        (openai-function-tool-choice staged-tool)))
-	                 (forced-choice
-	                   (or staged-choice
-	                       (force-first-edit-tool-choice specs)))
-		                 (forced-specs
-		                   (if staged-tool
-		                     (forced-staged-repair-specs specs staged-tool)
+		          (let* ((specs (verified-provider-tool-specs tool-specs))
+		                 (staged-tool
+		                   (force-staged-create-repair-tool-name specs))
+		                 (suppress-staged-choice?
+		                   (suppress-local-staged-tool-choice? staged-tool))
+		                 (staged-choice
+		                   (and staged-tool
+		                        (not suppress-staged-choice?)
+		                        (openai-function-tool-choice staged-tool)))
+		                 (first-edit-choice
+		                   (and (not suppress-staged-choice?)
+		                        (force-first-edit-tool-choice specs)))
+		                 (forced-choice
+		                   (or staged-choice
+		                       first-edit-choice))
+			                 (forced-specs
+			                   (if staged-tool
+			                     (forced-staged-repair-specs specs staged-tool)
 		                     (forced-first-edit-specs specs forced-choice))))
 		            (if staged-tool
 		              (forced-staged-repair-response
@@ -628,12 +653,18 @@
                 ((make-provider-backend
                    (get-expert-provider) chat-direct-via-stream)
                  messages specs #f))
-		              (let* ((first-edit-choice (force-first-edit-tool-choice specs))
-	                     (staged-tool
-	                       (force-staged-create-repair-tool-name specs))
-	                     (staged-choice
-	                       (and staged-tool
-	                            (openai-function-tool-choice staged-tool)))
+			              (let* ((raw-first-edit-choice (force-first-edit-tool-choice specs))
+		                     (staged-tool
+		                       (force-staged-create-repair-tool-name specs))
+		                     (suppress-staged-choice?
+		                       (suppress-local-staged-tool-choice? staged-tool))
+		                     (first-edit-choice
+		                       (and (not suppress-staged-choice?)
+		                            raw-first-edit-choice))
+		                     (staged-choice
+		                       (and staged-tool
+		                            (not suppress-staged-choice?)
+		                            (openai-function-tool-choice staged-tool)))
 	                     (forced-choice (or staged-choice first-edit-choice))
 				                     (forced-specs
 				                       (if staged-tool
diff --git a/test/run.ss b/test/run.ss
index 07abcd4..5a34b5e 100644
--- a/test/run.ss
+++ b/test/run.ss
@@ -9285,6 +9285,23 @@
 		           (not (member "balance" names)))))
 		  (safe-delete-test-file! target-path))
 
+		(let ([large-draft (make-string 5000 #\space)])
+		  (check! "verified-run: large unclosed draft suppresses provider force"
+		          (large-unclosed-rejected-draft-content?
+		            "delimiter balance failed: Unclosed ( opened at line 10"
+		            large-draft)
+		          #t)
+		  (check! "verified-run: small unclosed draft keeps structural force path"
+		          (large-unclosed-rejected-draft-content?
+		            "delimiter balance failed: Unclosed ( opened at line 10"
+		            "(def (main)\n")
+		          #f)
+		  (check! "verified-run: large unrelated draft keeps normal force path"
+		          (large-unclosed-rejected-draft-content?
+		            "list-set! is not available"
+		            large-draft)
+		          #f))
+
 		(let* ([vr-dir  "/tmp"]
 		       [target "jcode-verified-hidden-write-after-syntax-create.ss"]
 		       [target-path (string-append vr-dir "/" target)]