Allow full retry for rejected missing creates
ober
65affcba64e00cdbf619ae4a1f22785886af3ba9
--- 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))) --- 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"]