Record jcode benchmark repair guidance

ober

532c7db9e30beb58efc66e31319fd4babd942d0b

diff --git a/data/anti-patterns.sexp b/data/anti-patterns.sexp
index 5f198eb..a3eee34 100644
--- a/data/anti-patterns.sexp
+++ b/data/anti-patterns.sexp
@@ -4572,4 +4572,25 @@
      "Do not shadow real dependencies or alter the verifier environment")
    ("tools" "write-scope" "JCODE_READ_ROOTS"
      "jerboa_module_exports" "jerboa_function_signature" "verify"
-     "git_diff")))
+     "git_diff"))
+ (("advice"
+    .
+    "Launch benchmark cohorts with --no-expert in every jcode verified command, verify every jcode command.txt contains --no-expert, then scan logs/traces/command files for expert markers. Discard and rerun any contaminated result.")
+   ("avoid"
+     .
+     "Do not count a jcode benchmark result if the run omitted --no-expert or any artifact shows expert escalation. That measures the configured expert model, not the selected candidate model.")
+   ("id" . "jcode-benchmark-expert-contamination")
+   ("kinds" "test" "docs")
+   ("pattern"
+     .
+     "escalating-to-expert|expert-result|expert fallback|<expert/>")
+   ("severity" . "high")
+   ("tags" "jcode" "benchmark" "no-expert" "expert-escalation"
+     "kratistos")
+   ("title"
+     .
+     "Jcode Benchmarks Must Not Use Expert Escalation")
+   ("tools"
+     "rg"
+     "kratistos policy tests"
+     "command.txt artifact scan")))
diff --git a/data/error-fixes.sexp b/data/error-fixes.sexp
index 9450257..52f4ae8 100644
--- a/data/error-fixes.sexp
+++ b/data/error-fixes.sexp
@@ -2792,4 +2792,32 @@
    ("pattern"
      .
      "invalid bound variable \\(lambda \\(app\\).*with-qt-app|invalid bound variable.*in \\(let.*dynamic-wind")
-   ("type" . "macro-usage")))
+   ("type" . "macro-usage"))
+ (("code_example"
+    .
+    "(qt-on-timeout! timer\n  (lambda ()\n    (tick!)\n    (qt-paint-widget-update! canvas)))")
+   ("explanation"
+     .
+     "The `(jerboa-qt qt)` API exports the paint-widget-specific update procedure, not the generic widget update aliases many Qt wrappers use.")
+   ("fix"
+     .
+     "For jerboa-qt paint widgets, request repaint with `(qt-paint-widget-update! canvas)`. Do not use guessed generic names such as `qt-widget-update!` or `qt-widget-update`.")
+   ("id" . "qt-paint-widget-update-unbound")
+   ("pattern"
+     .
+     "variable qt-widget-update!? is not bound|qt-widget-update!?[^\\n]*not bound")
+   ("type" . "module-api"))
+ (("code_example"
+    .
+    ";; wrong: py cannot see dy in the same let\n(let ((dy 1)\n      (py (+ y dy)))\n  py)\n\n;; right\n(let* ((dy 1)\n       (py (+ y dy)))\n  py)")
+   ("explanation"
+     .
+     "Jerboa follows Scheme `let` semantics: bindings in the same `let` are simultaneous, so a later RHS cannot reference an earlier local from that same binding list.")
+   ("fix"
+     .
+     "If the unbound name is a local that was introduced earlier in the same `let`, change that binding group to `let*` or split it into nested lets. Plain `let` evaluates all right-hand sides before any local names are bound.")
+   ("id" . "dependent-let-binding-unbound")
+   ("pattern"
+     .
+     "variable [A-Za-z0-9_+*!?<>=$%&/.-]+ is not bound")
+   ("type" . "binding")))