Allow full retry for rejected missing creates

ober

65affcba64e00cdbf619ae4a1f22785886af3ba9

diff --git a/src/jcode/core/verified-run.ss b/src/jcode/core/verified-run.ss
index 8258218..a142980 100644
--- a/src/jcode/core/verified-run.ss
+++ b/src/jcode/core/verified-run.ss
@@ -194,7 +194,7 @@
 
 (def (verified-syntax-create-staged-tool-spec? spec)
   (member (tool-spec-name spec)
-          '("line_edit" "replace_def" "replace_range")))
+          '("edit" "write" "line_edit" "replace_def" "replace_range")))
 
 (def (verified-missing-create-staged-tool-spec? spec)
   (member (tool-spec-name spec)
@@ -447,13 +447,10 @@
        (openai-function-tool-choice "edit")))
 
 (def (force-staged-create-repair-tool-name specs)
-  (and (current-verified-local-model?)
-       (syntax-broken-missing-create-repair-mode?)
-       (cond
-         ((tool-specs-include? specs "line_edit") "line_edit")
-         ((tool-specs-include? specs "replace_range") "replace_range")
-         ((tool-specs-include? specs "replace_def") "replace_def")
-         (else #f))))
+  ;; Syntax-broken missing-file creates have no on-disk artifact yet. Let the
+  ;; model choose between a bounded repair and a corrected complete file body;
+  ;; forcing line_edit made local models fight the natural full-retry path.
+  #f)
 
 (def (forced-first-edit-specs specs forced-choice)
   (if forced-choice
@@ -2898,38 +2895,7 @@
            "list, balance, MCP, edit, or write before that repair is promoted."))))
 
 (def (staged-create-broad-write-block-message cwd name args)
-  (let* ((path (pending-missing-ss-create-path cwd))
-         (requested-path (arg-path args #f))
-         (content (arg-content args))
-         (line-no (arg-int args "line" 0))
-         (old-str (or (arg-ref args "old_str" #f)
-                      (arg-ref args "old_string" #f))))
-    (and path
-         (current-verified-local-model?)
-         (current-rejected-ss-draft)
-         (not (incomplete-rejected-ss-create-draft?))
-         requested-path
-         content
-         (not old-str)
-         (<= line-no 0)
-         (same-verified-path? cwd requested-path path)
-         (string-append
-           "Full-file "
-           (tool-label name)
-           " is unavailable for "
-           path
-           " while a syntax-broken missing-file create is retained as an "
-           "editable staged draft. The submitted full body was not written. "
-           "Do not resend or regenerate the whole file. Use line_edit(path=\""
-           path
-           "\", line=<reported line>, content=<complete corrected line>) for "
-           "a one-line diagnostic, replace_range(path=\""
-           path
-           "\", start=<start>, end=<end>, content=<complete corrected span>) "
-           "for a structural span, replace_def for one top-level definition, "
-           "or exact old_str/new_str replacement against the retained draft. "
-           "The file does not exist on disk until the staged repair passes the "
-           "syntax guard and is promoted."))))
+  #f)
 
 (def (pending-existing-rejected-draft-message cwd who)
   (let ((draft (current-rejected-ss-draft)))
diff --git a/test/run.ss b/test/run.ss
index 97da076..ed70d9f 100644
--- a/test/run.ss
+++ b/test/run.ss
@@ -3843,12 +3843,12 @@
 	    (check-pred! "verified-run: repeated local rejection focuses staged tools"
 	      staged-tool-names
 	      (lambda (names)
-	        (and (member "line_edit" names)
-	             (member "replace_def" names)
-	             (member "replace_range" names)
-	             (not (member "edit" names))
-	             (not (member "write" names))
-	             (not (member "verify" names))
+		        (and (member "line_edit" names)
+		             (member "replace_def" names)
+		             (member "replace_range" names)
+		             (member "edit" names)
+		             (member "write" names)
+		             (not (member "verify" names))
 	             (not (member "read" names))
 	             (not (member "balance" names)))))
 	    (check! "verified-run: local staged line edit promotes repaired file"
@@ -4554,10 +4554,10 @@
 	            (cadr observed) 8192)
 	    (check! "verified-run: inspected rejected draft repair uses 4k cap"
 	            (caddr observed) 4096))
-	  (check-pred! "verified-run: inspected syntax draft hides broad write"
-	    repair-tool-names (lambda (names) (not (member "write" names))))
-	  (check-pred! "verified-run: inspected syntax draft hides full edit"
-	    repair-tool-names (lambda (names) (not (member "edit" names))))
+	  (check-pred! "verified-run: inspected syntax draft keeps broad write"
+		    repair-tool-names (lambda (names) (member "write" names)))
+	  (check-pred! "verified-run: inspected syntax draft keeps full edit"
+		    repair-tool-names (lambda (names) (member "edit" names)))
 	  (check-pred! "verified-run: inspected rejected draft keeps line edit"
 	    repair-tool-names (lambda (names) (member "line_edit" names)))
 	  (safe-delete-test-file! target-path))
@@ -4597,8 +4597,8 @@
 	              (cons 'max-iterations 8)))])
 	    (check! "verified-run: repeated rejected draft schema repair verifies"
 	            result "VERIFIED: exit 0\n"))
-	  (check-pred! "verified-run: repeated syntax draft hides write schema"
-	    tool-names-after-repeat (lambda (names) (not (member "write" names))))
+	  (check-pred! "verified-run: repeated syntax draft keeps write schema"
+		    tool-names-after-repeat (lambda (names) (member "write" names)))
 	  (check-pred! "verified-run: repeated rejected draft keeps line edit schema"
 	    tool-names-after-repeat (lambda (names) (member "line_edit" names)))
 	  (safe-delete-test-file! target-path))
@@ -4706,10 +4706,10 @@
 	              (cons 'max-iterations 8)))])
 	    (check! "verified-run: missing create staged repair after rejects verifies"
 	            result "VERIFIED: exit 0\n"))
-	  (check-pred! "verified-run: missing create staged repair hides write"
-	    tool-names-after-repeat (lambda (names) (not (member "write" names))))
-	  (check-pred! "verified-run: missing create staged repair hides edit"
-	    tool-names-after-repeat (lambda (names) (not (member "edit" names))))
+	  (check-pred! "verified-run: missing create staged repair keeps write"
+		    tool-names-after-repeat (lambda (names) (member "write" names)))
+	  (check-pred! "verified-run: missing create staged repair keeps edit"
+		    tool-names-after-repeat (lambda (names) (member "edit" names)))
 	  (check-pred! "verified-run: missing create staged range reaches disk"
 	    (call-with-input-file target-path (lambda (p) (get-string-all p)))
 	    (lambda (s) (str-contains? s "fixed")))
@@ -7945,8 +7945,8 @@
                (and (member "line_edit" names)
                     (member "replace_def" names)
                     (member "replace_range" names)
-                    (not (member "edit" names))
-                    (not (member "write" names))
+	                    (member "edit" names)
+	                    (member "write" names)
                     (not (member "read" names))
                     (not (member "list" names))
                     (not (member "balance" names))
@@ -8124,23 +8124,23 @@
 	            result "VERIFIED: exit 0\n")
 	    (check! "verified-run: syntax create staged repair writes file"
 	            (slurp target-path) (string-append fixed "\n"))
-		    (check-pred! "verified-run: syntax create staged schema hides full writes"
-		      (reverse seen-specs)
-		      (lambda (xs)
-		        (and (>= (length xs) 2)
-		             (let ([names (list-ref xs 1)])
-		               (and (member "line_edit" names)
-		                    (member "replace_range" names)
-		                    (not (member "write" names))
-		                    (not (member "edit" names))
-		                    (not (member "verify" names))))))))
-		  (safe-delete-test-file! target-path))
+			    (check-pred! "verified-run: syntax create staged schema keeps full retry"
+			      (reverse seen-specs)
+			      (lambda (xs)
+			        (and (>= (length xs) 2)
+			             (let ([names (list-ref xs 1)])
+			               (and (member "line_edit" names)
+			                    (member "replace_range" names)
+			                    (member "write" names)
+			                    (member "edit" names)
+			                    (not (member "verify" names))))))))
+			  (safe-delete-test-file! target-path))
 
 		(let* ([vr-dir  "/tmp"]
 		       [target "jcode-verified-hidden-write-after-syntax-create.ss"]
 		       [target-path (string-append vr-dir "/" target)]
 		       [broken "(import (jerboa prelude))\n(def (main)\n  (list-set! xs 0 #t)\n  (displayln \"fixed\"))\n(main)\n"]
-		       [ignored "(import (jerboa prelude))\n(def (main)\n  (displayln \"ignored\"))\n(main)\n"]
+			       [fixed "(import (jerboa prelude))\n(def (main)\n  (displayln \"fixed\"))\n(main)\n"]
 		       [tool-results '()]
 		       [i 0]
 		       [slurp (lambda (p) (call-with-input-file p (lambda (in) (get-string-all in))))])
@@ -8154,17 +8154,15 @@
 		                (list (make-wtool-call "write"
 		                        (list (cons "path" target)
 		                              (cons "content" broken)) #f))]
-		               [(= i 2)
-		                (list (make-wtool-call "write"
-		                        (list (cons "path" target)
-		                              (cons "content" ignored)) #f))]
-		               [(= i 3)
-		                (list (make-wtool-call "line_edit"
-		                        (list (cons "path" target)
-		                              (cons "line" 3)
-		                              (cons "content" "  (displayln \"fixed\")")) #f))]
-		               [else
-		                (error 'test "hidden write recovery should auto-verify")]))]
+			               [(= i 2)
+			                (list (make-wtool-call "write"
+			                        (list (cons "path" target)
+			                              (cons "content" fixed)) #f))]
+			               [(= i 3)
+			                (list (make-wtool-call "verify" '() #f))]
+			               [else
+			                (list (make-wtool-call "done"
+			                        '(("summary" . "full-retry-recovery-ok")) #f))]))]
 		         [result (verified-run provider
 		                   "recover hidden write after syntax-broken missing create"
 		                   (list (cons 'cwd vr-dir)
@@ -8181,21 +8179,16 @@
 		                                 (cons (message-content m) tool-results)))))))])
 		    (check! "verified-run: hidden write after syntax create recovers"
 		            result "VERIFIED: exit 0\n")
-		    (check-pred! "verified-run: hidden write after syntax create rejected"
-		      (reverse tool-results)
-		      (lambda (xs)
-		        (let loop ([ys xs])
-		          (and (pair? ys)
-		               (or (and (str-contains? (car ys) "[ToolRecoverableError]")
-		                        (str-contains? (car ys) "Full-file write")
-		                        (str-contains? (car ys) "syntax-broken missing-file create")
-		                        (str-contains? (car ys) "line_edit"))
-		                   (loop (cdr ys)))))))
-		    (check-pred! "verified-run: hidden write after syntax create keeps ignored body out"
-		      (slurp target-path)
-		      (lambda (s)
-		        (and (str-contains? s "fixed")
-		             (not (str-contains? s "ignored"))))))
+			    (check-pred! "verified-run: full write after syntax create promoted"
+			      (reverse tool-results)
+			      (lambda (xs)
+			        (let loop ([ys xs])
+			          (and (pair? ys)
+			               (or (str-contains? (car ys)
+			                     "complete replacement repaired and promoted rejected draft")
+			                   (loop (cdr ys)))))))
+			    (check! "verified-run: full write after syntax create writes fixed body"
+			            (slurp target-path) fixed))
 		  (safe-delete-test-file! target-path))
 
 		(let* ([vr-dir  "/tmp"]