chore: add AGENTS.md, .claude lock, and 30-min sandbox soak benchmark results

ober

58907da27af310ba49f2ad14543c10acc761c08e

diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock
new file mode 100644
index 0000000..1fb10de
--- /dev/null
+++ b/.claude/scheduled_tasks.lock
@@ -0,0 +1 @@
+{"sessionId":"d2292307-bbeb-499c-9e06-7a2ba3e633e3","pid":34961,"procStart":"Sat May 16 20:31:35 2026","acquiredAt":1778974075662}
\ No newline at end of file
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..ca30460
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,466 @@
+## The Jerboa Language — Quick Reference
+
+Jerboa is a Scheme dialect built on Chez Scheme. It is Gerbil-inspired but its own language. **All user-facing code is `.ss` files. Never write `.sls` files for the user** — those are internal implementation files.
+
+### File Structure
+
+Every Jerboa file looks like this:
+
+```scheme
+(import (jerboa prelude))    ;; ONE import gives you the ENTIRE language
+;; Optional extra imports for modules NOT in the prelude:
+;; (import (std net request))
+
+(def (my-function x y)
+  (+ x y))
+
+(displayln (my-function 1 2))
+```
+
+Run with: `scheme --libdirs lib --script file.ss`
+
+**NEVER** write `(library ...)` forms — that's `.sls` internal syntax.
+
+### Reader Syntax Extensions
+
+```
+[...]                → plain parentheses — same as Gerbil and Chez Scheme
+{method obj args}    → (~ obj 'method args)  — method dispatch
+name:                → keyword #:name
+:std/sort            → (std sort)        — Gerbil-style module path
+#<<END ... END       → heredoc string
+```
+
+Square brackets `[...]` are interchangeable with `(...)`, exactly like Gerbil and stock Chez Scheme. You can freely use them in bindings, match clauses, and anywhere you'd use parentheses:
+```scheme
+;; All of these are correct:
+(let ([x 1] [y 2]) (+ x y))
+(for/collect ([x (in-range 5)]) (* x x))
+(match val ([list a b] (+ a b)))
+(cond [(> x 0) "positive"] [else "non-positive"])
+```
+
+### CRITICAL: Things That DO NOT EXIST in Jerboa/Chez
+
+Claude frequently hallucinates these from Gerbil, Gambit, Racket, or R7RS training data.
+**NONE of them are real in Jerboa/Chez. STOP and use the correct form.**
+
+#### AI Compatibility Aliases (these now work in the prelude)
+The following names from other Scheme dialects are aliased in `(jerboa prelude)`:
+- `hash-has-key?` → `hash-key?` (Racket)
+- `hash-table-set!` → `hash-put!` (Racket)
+- `directory-exists?` → `file-directory?` (Gambit)
+- `eql?` → `eqv?` (Common Lisp)
+- `random-integer` → `random` (Gambit)
+- `read-line` → `get-line` wrapper (Gambit) — works with or without port arg
+- `force-output` → `flush-output-port` wrapper (Gambit) — works with or without port arg
+- `string-map` → char-level map (Racket/R7RS) — `(string-map f str)`
+
+#### Hallucinated Functions (still do NOT exist)
+- `symbol<?` — use `(lambda (a b) (string<? (symbol->string a) (symbol->string b)))`
+- `string-contains?` — use `(string-contains str sub)` (returns index or #f, NOT boolean)
+- `define-struct` — use `(defstruct name (fields ...))`
+- `raise` with a string — use `(error 'who "message" irritants ...)`
+- `environment-bound?` — Gerbil-only. No direct Chez equivalent
+
+#### Gerbil/Gambit-isms (from training data — wrong in Jerboa)
+- `time->seconds` — use `(time-second (current-time))` for epoch seconds
+- `thread-sleep!` — Gambit. Use `(sleep (make-time 'time-duration 0 seconds))`
+- `thread-yield` — no Chez equivalent. Use `(sleep (make-time 'time-duration 0 0))` as workaround
+- `path-expand` with 2 args — Gerbil takes `(path-expand rel base)`. Jerboa takes 1 arg. Use `(path-join base rel)` for 2-arg version
+- `process-status` — Gerbil. Use `(std misc process)` API in Jerboa
+- `user-info-home` — Gerbil. Use `(getenv "HOME")`
+- `the-environment` — Gerbil. Use `(interaction-environment)` in Chez
+- `condition/report-string` — Gerbil. Use `(with-output-to-string (lambda () (display-condition c)))`
+- `make-class-type` — Gerbil. Use `(defstruct ...)` or `(defclass ...)` in Jerboa
+- `string-subst` — Gerbil. Not in prelude. Use `(string-replace str old new)` or implement manually
+- `open-fd-pair` — Gambit. Does not exist in Chez; requires different API
+
+#### R6RS/Racket-isms (wrong variant)
+- `make-equal-hashtable` — R6RS. Use `(make-hash-table)` from Jerboa prelude
+- `arithmetic-shift` — Racket. Use `(bitwise-arithmetic-shift n k)` or `(ash n k)` in Chez
+- `pregexp-match` — Racket. Use `(std text regex)` or `(std pregexp)` API in Jerboa
+
+### CRITICAL: Common Arity Mistakes
+
+- `(list-of? pred)` → returns a PREDICATE. It takes 1 arg. Use: `((list-of? number?) lst)`
+- `(maybe pred)` → returns a PREDICATE. It takes 1 arg. Use: `((maybe string?) val)`
+- `(in-range end)` or `(in-range start end)` or `(in-range start end step)` — NOT `(in-range start step end)`
+- `(hash-ref ht key)` or `(hash-ref ht key default)` — NOT `(hash-ref key ht)`
+- `(string-split str delimiter)` where delimiter is a CHAR: `(string-split "a,b" #\,)`
+- `(make-rwlock)` — takes **0 args**, NOT `(make-rwlock 'name)` (Gerbil takes a name; Jerboa does not)
+- `(path-expand path)` — takes **1 arg**, NOT `(path-expand rel base)` (Gerbil takes 2; use `path-join` for 2-arg)
+- `(sort predicate list)` — Chez arg order. NOT `(sort list predicate)` which is Gerbil/SRFI order
+
+### Core Forms (all from `(import (jerboa prelude))`)
+
+#### Definitions
+```scheme
+(def x 42)                              ;; variable
+(def (f x y) (+ x y))                  ;; function
+(def (f x (y 10)) body)                ;; optional param with default
+(def (f x . rest) body)                ;; rest args
+(def* f ((x) ...) ((x y) ...))         ;; multi-arity
+(defrule (name pat) template)           ;; macro
+```
+
+#### Data Structures
+```scheme
+(defstruct point (x y))                ;; → make-point, point?, point-x, point-y, point-x-set!
+(defstruct (circle shape) (radius))    ;; inheritance (single only)
+(defmethod (area (self circle)) body)  ;; method on type
+(~ obj 'method arg ...)                ;; dispatch (or {method obj arg ...})
+(defrecord person (name age))          ;; struct + pretty-print + ->alist
+(define-enum color (red green blue))   ;; → color-red, color?, color->name
+```
+
+#### Pattern Matching
+```scheme
+(match value
+  (42 "exact")                          ;; literal
+  ((list a b c) (+ a b c))             ;; list destructure
+  ((cons h t) h)                        ;; pair
+  ((? number?) "num")                   ;; predicate
+  ((? string? s) (string-upcase s))    ;; predicate + bind
+  ((and (? number?) (? positive?)) "positive number")
+  ((or "yes" "y") #t)
+  ((=> string->number n) n)            ;; view pattern
+  (n (where (> n 0)) "positive")       ;; guard
+  (_ "default"))                        ;; wildcard
+```
+
+#### Error Handling
+```scheme
+(try expr (catch (e) handler) (finally cleanup))
+(try expr (catch (error? e) handler))
+(unwind-protect body cleanup)
+(with-resource (var init cleanup) body)
+```
+
+#### Result Type (Rust-inspired ok/err)
+```scheme
+(ok 42)  (err "bad")  (ok? r)  (err? r)
+(unwrap (ok 42))         ;; → 42 (raises on err)
+(unwrap-or (err "x") 0)  ;; → 0
+(map-ok f result)  (map-err f result)
+(and-then result f)       ;; monadic bind
+(try-result expr)         ;; exceptions → (err condition)
+(try-result* expr)        ;; exceptions → (err "message string")
+(sequence-results list-of-results)  ;; → (ok list) or first (err)
+(->? (ok 10) (+ 5) (* 2))  ;; → (ok 30), short-circuits on err
+```
+
+#### Iterators
+```scheme
+(for ((x (in-range 5))) (displayln x))
+(for/collect ((x (in-range 5))) (* x x))           ;; → (0 1 4 9 16)
+(for/fold ((sum 0)) ((x (in-range 10))) (+ sum x)) ;; → 45
+(for/or ((x lst)) (and (pred? x) x))               ;; first truthy
+(for/and ((x lst)) (pred? x))                       ;; all truthy
+
+;; Iterators: in-list, in-vector, in-string, in-range, in-hash-keys,
+;; in-hash-values, in-hash-pairs, in-naturals, in-indexed,
+;; in-port, in-lines, in-chars, in-bytes, in-producer
+```
+
+#### Threading Macros
+```scheme
+(-> x (f a) (g b))       ;; thread first: (g (f x a) b)
+(->> x (f a) (g b))      ;; thread last:  (g b (f a x))
+(as-> x v (f v) (g v))   ;; named
+(some-> x (f) (g))       ;; short-circuit on #f
+(cond-> x test (f) t2 (g))  ;; conditional steps
+(->? (ok x) (f) (g))     ;; result-aware thread first
+```
+
+#### Ergo Typing
+```scheme
+(: expr pred?)                    ;; checked cast
+(using (p (make-point 1 2) : point?)
+  (+ p.x p.y))                   ;; dot-access → (point-x p) etc.
+((list-of? number?) '(1 2 3))    ;; predicate factory → #t
+((maybe string?) #f)              ;; accepts #f or string → #t
+```
+
+#### Hash Tables
+```scheme
+(def ht (make-hash-table))
+(hash-put! ht "key" "val")
+(hash-ref ht "key")              ;; error if missing
+(hash-ref ht "key" "default")    ;; with default
+(hash-get ht "key")              ;; → val or #f
+(hash-key? ht "key")             ;; → #t/#f
+(hash-remove! ht "key")
+(hash->list ht)  (hash-keys ht)  (hash-values ht)
+(hash-for-each (lambda (k v) ...) ht)
+(list->hash-table '(("a" . 1) ("b" . 2)))
+```
+
+#### Strings
+```scheme
+(string-split "a,b,c" #\,)       ;; → ("a" "b" "c")  NOTE: char delimiter
+(string-join '("a" "b") ",")     ;; → "a,b"
+(string-trim "  hi  ")           ;; → "hi"
+(string-prefix? "he" "hello")    ;; → #t
+(string-suffix? "lo" "hello")    ;; → #t
+(string-contains "hello" "ell")  ;; → 1 (index, not boolean!)
+(string-empty? "")               ;; → #t
+(str "age: " 42 "!")             ;; → "age: 42!" (auto-coerce)
+```
+
+#### Lists
+```scheme
+(flatten '(1 (2 (3))))    ;; → (1 2 3)
+(unique '(1 2 2 3))       ;; → (1 2 3)
+(take lst n)  (drop lst n)  (take-last lst n)  (drop-last lst n)
+(every pred lst)  (any pred lst)  (filter-map f lst)
+(group-by f lst)  (zip lst1 lst2)  (frequencies lst)
+(partition pred lst)  (interleave l1 l2)  (mapcat f lst)
+(distinct lst)  (keep f lst)  (split-at lst n)
+(append-map f lst)  (snoc lst elem)
+```
+
+#### Functional Combinators
+```scheme
+(compose f g)  (comp f g)       ;; (f (g x))
+(partial f arg ...)              ;; partial application
+(complement pred)  (negate pred) ;; logical not
+(identity x)  (constantly v)     ;; basic combinators
+(curry f arg)  (flip f)          ;; currying, arg swap
+(conjoin p1 p2)  (disjoin p1 p2) ;; predicate AND/OR
+(juxt f g)                        ;; → (lambda (x) (list (f x) (g x)))
+(cut f <> y)                      ;; SRFI-26 partial: (lambda (x) (f x y))
+```
+
+#### JSON
+```scheme
+(string->json-object "{\"key\":\"val\"}")  ;; → hash table
+(json-object->string ht)                    ;; → JSON string
+(read-json port)  (write-json obj port)
+```
+
+#### CSV
+```scheme
+(csv->alists "name,age\nAlice,30")  ;; → (((name . "Alice") (age . "30")))
+(read-csv-file "data.csv")          ;; → list of row lists
+(write-csv-file "out.csv" rows)
+```
+
+#### DateTime
+```scheme
+(datetime-now)  (datetime-utc-now)
+(make-datetime 2026 3 27 12 0 0)
+(parse-datetime "2026-03-27T12:00:00Z")
+(datetime->iso8601 dt)  (datetime->epoch dt)
+(datetime-add dt duration)  (datetime-diff dt1 dt2)
+(datetime<? dt1 dt2)  (day-of-week dt)  (leap-year? 2024)
+```
+
+#### Paths
+```scheme
+(path-join "/home" "user" "f.txt")  ;; → "/home/user/f.txt"
+(path-directory "/a/b/f.txt")       ;; → "/a/b"
+(path-extension "file.txt")         ;; → "txt"
+(path-absolute? "/home")            ;; → #t
+```
+
+#### File I/O
+```scheme
+(read-file-string "f.txt")         ;; → entire file
+(read-file-lines "f.txt")          ;; → list of lines
+(write-file-string "f.txt" "data")
+```
+
+#### Pretty Printing
+```scheme
+(pp expr)  (pp-to-string expr)  (pprint expr)
+```
+
+#### Formatting
+```scheme
+(format "~a is ~a" "Alice" 30)  ;; → "Alice is 30"
+(printf "x = ~a\n" 42)
+(displayln "hello" " " "world")
+```
+
+#### Anaphoric / Conditional Binding
+```scheme
+(awhen (find x) (use it))          ;; binds result to `it`
+(aif (find x) (use it) (default))
+(when-let (x (find y)) (use x))
+(if-let (x (find y)) (use x) (default))
+```
+
+#### Loops
+```scheme
+(while test body ...)
+(until test body ...)
+(dotimes (i 10) body ...)   ;; 0..9
+```
+
+#### Misc Sugar
+```scheme
+(assert! (> x 0))  (assert! (> x 0) "message")
+(alist (name "Alice") (age 30))  ;; → ((name . "Alice") (age . 30))
+(let-alist data (name age) body)
+```
+
+### What's NOT in the Prelude (requires separate import)
+
+```scheme
+(import (std net request))      ;; HTTP client
+(import (std net httpd))        ;; HTTP server
+(import (std db sqlite))        ;; SQLite
+(import (std actor))            ;; Actor system
+(import (std async))            ;; Async/await
+(import (std crypto digest))    ;; SHA, MD5
+(import (std text regex))       ;; Regex
+(import (std text xml))         ;; XML
+(import (std text yaml))        ;; YAML
+(import (std os env))           ;; Environment variables
+(import (std os signal))        ;; Signal handling
+(import (std security sandbox)) ;; Sandboxing
+```
+
+### Chez Scheme Conflicts (handled by prelude)
+
+The prelude shadows these Chez builtins with Jerboa versions:
+`make-hash-table`, `hash-table?`, `sort`, `sort!`, `printf`, `fprintf`,
+`path-extension`, `path-absolute?`, `with-input-from-string`,
+`with-output-to-string`, `iota`, `1+`, `1-`, `partition`,
+`make-date`, `make-time`
+
+All standard Chez Scheme is still available — the prelude just re-exports
+improved versions of the above.
+
+---
+
+## Repository Boundaries
+
+When working in a Jerboa project, **ONLY modify files in the current repo** unless the user explicitly names another path.
+
+Common sibling repos that exist but must NOT be touched without explicit instruction:
+- `~/mine/jerboa-emacs` — **NEVER touch**. Another model owns it.
+- `~/mine/jerboa-mcp` — Only modify when user explicitly says to work there.
+- `~/mine/jerboa-shell` — Only modify when user explicitly says to work there.
+- `~/mine/gerbil-mcp` — **NEVER touch**. Deprecated.
+- `~/mine/gerbil-orig` — Read-only reference for upstream Gerbil. Never modify.
+
+If a user instruction mentions a file path, use EXACTLY that path. Do not substitute a similar-looking path from another repo.
+
+---
+
+## Build & Verification
+
+After modifying any `.ss` or `.sls` (Jerboa Scheme) source files, always run the build command and fix any errors before moving on. Common issues include: missing imports, wrong function names, and duplicate definitions.
+
+### Stale Artifacts
+
+If edits seem to have no effect after `make build`, delete stale compiled files:
+```bash
+find lib -name "*.so" -delete && find lib -name "*.wpo" -delete && make build
+```
+Run `jerboa_stale_static` to detect stale `.so` files before debugging "why doesn't my edit work?".
+
+## Jerboa MCP Tools — MANDATORY Usage
+
+Jerboa is a niche Scheme dialect with limited training data. **Never guess — always verify** with MCP tools. Tool descriptions are available at runtime via the MCP server; this section covers **when** and **why** to use each tool.
+
+### MANDATORY Workflow Order (for writing new code)
+
+1. **`jerboa_howto`** — BEFORE writing code, search cookbook for verified patterns
+2. **`jerboa_module_exports`** / **`jerboa_function_signature`** — confirm APIs exist and check arities
+3. Write the code
+4. **`jerboa_verify`** — combined syntax + compile + lint + arity + duplicate check (use instead of individual tools)
+5. **`jerboa_security_scan`** — for code involving FFI, shell commands, or file I/O
+
+### Essential Tools (use proactively)
+
+| When | Tool |
+|---|---|
+| Before writing ANY Jerboa code | `jerboa_howto` — cookbook has verified patterns with correct imports |
+| Check what a module exports | `jerboa_module_exports` — never guess function names |
+| Check function arity/args | `jerboa_function_signature` — prevents wrong-arg-count errors |
+| Validate your code | `jerboa_verify` — one-stop syntax+compile+lint+arity check |
+| Test expressions interactively | `jerboa_eval` — use `imports` param for modules, `env` for FFI paths |
+| Persistent interactive testing | `jerboa_repl_session` — maintains state across evaluations |
+| Debug an error message | `jerboa_explain_error` + `jerboa_error_fix_lookup` |
+| Understand unfamiliar code | `jerboa_file_summary` + `jerboa_document_symbols` |
+| Find where something is defined | `jerboa_find_definition` — source file, module, kind, arity |
+| Search for symbol by substring | `jerboa_apropos` or `jerboa_smart_complete` |
+| Build the project | `jerboa_build_and_report` or `jerboa_make` — prefer over bash `make` |
+| Run tests | `jerboa_run_tests` — prefer over bash `scheme --script` |
+| Check for stale .so artifacts | `jerboa_stale_static` — common cause of "edit has no effect" |
+| Macro expansion | `jerboa_expand_macro` / `jerboa_trace_macro` |
+| Inspect struct/class types | `jerboa_class_info` — fields, inheritance, constructor signature |
+| FFI work | `jerboa_ffi_scaffold` / `jerboa_ffi_type_check` / `jerboa_ffi_null_safety` |
+| Port Gerbil code | `jerboa_migration_check` + `jerboa_translate_scheme` |
+| Detect paren imbalance | `jerboa_check_balance` — use BEFORE `make build` after deep edits |
+| Full project audit | `jerboa_project_health_check` — balance, exports, cycles, duplicates |
+| Security audit | `jerboa_security_audit` + `jerboa_import_policy_check` |
+| Static build audit | `jerboa_static_symbol_audit` + `jerboa_boot_library_audit` |
+| Explore a module | `jerboa_module_catalog` (replaces multiple `jerboa_doc` calls) |
+| Look up any symbol | `jerboa_doc` — type, arity, qualified name, related symbols |
+| Read stdlib source | `jerboa_stdlib_source` — see internal implementations |
+
+### Cookbook & Knowledge Management
+
+- **`jerboa_howto`** / **`jerboa_howto_get`**: Search and retrieve verified recipes
+- **`jerboa_howto_add`**: Save new patterns to cookbook (MANDATORY when you discover something non-trivial)
+- **`jerboa_howto_run`** / **`jerboa_howto_verify`**: Validate recipes still work
+- **`jerboa_error_fix_add`**: Save error→fix mappings for common mistakes
+
+### Code Generation & Refactoring
+
+`jerboa_rename_symbol`, `jerboa_balanced_replace`, `jerboa_wrap_form`, `jerboa_splice_form`, `jerboa_scaffold_test`, `jerboa_generate_module`, `jerboa_translate_scheme`, `jerboa_project_template`, `jerboa_httpd_handler_scaffold`, `jerboa_db_pattern_scaffold`, `jerboa_actor_ensemble_scaffold`
+
+### Feature Suggestions
+
+- **`jerboa_list_features`** / **`jerboa_suggest_feature`** / **`jerboa_vote_feature`**: Track and submit tooling improvement ideas
+
+---
+
+## MANDATORY: Save What You Learn
+
+Jerboa is niche — every non-trivial pattern you discover prevents future sessions from re-discovering it.
+
+### Save to cookbook (`jerboa_howto_add`) whenever you:
+- Discover a working pattern through `jerboa_eval` or trial-and-error
+- Figure out correct imports, arities, or calling conventions that weren't obvious
+- Find a workaround for a Jerboa quirk or undocumented behavior
+
+**Before saving**: check `jerboa_howto` to avoid duplicates. **Do NOT save**: trivial one-liners, project-specific logic, or existing recipes.
+
+**Recipe format**: `id` (kebab-case), `tags` (4-6 search keywords incl. module name), `imports` (all required), `code` (complete working example), `notes` (gotchas/alternatives).
+
+### Suggest tooling improvements (`jerboa_suggest_feature`) whenever you:
+- Make multiple sequential tool calls that could be one tool
+- Fall back to bash because an MCP tool is missing or insufficient
+
+**Before suggesting**: check `jerboa_list_features`; vote with `jerboa_vote_feature` if it already exists.
+
+### Save Discoveries Mechanisms
+- **`/save-discoveries` skill**: invoke anytime to review session and save patterns + suggestions
+- **PreCompact hook**: add `PreCompact` hook with `type: "prompt"` in `.claude/settings.json` to auto-save before context compaction
+
+---
+
+## Common Workflows
+
+- **Write new code**: `jerboa_howto` -> `jerboa_module_exports` -> write code -> `jerboa_verify` -> `jerboa_security_scan`
+- **Debug an error**: `jerboa_explain_error` -> follow suggested tools -> `jerboa_howto` for fix patterns
+- **Understand unfamiliar code**: `jerboa_file_summary` -> `jerboa_document_symbols` -> `jerboa_module_deps`
+- **Refactor a module**: `jerboa_check_exports` -> `jerboa_find_callers` -> `jerboa_rename_symbol` -> `jerboa_check_import_conflicts`
+- **Build project**: `jerboa_build_conflict_check` -> `jerboa_make` -> `jerboa_build_and_report`
+- **Port from Gerbil**: `jerboa_migration_check` -> `jerboa_translate_scheme` -> `jerboa_verify` -> `jerboa_check_syntax`
+- **Audit project quality**: `jerboa_verify` -> `jerboa_lint` -> `jerboa_dead_code` -> `jerboa_dependency_cycles`
+- **Debug a crash**: `jerboa_stale_static` -> `jerboa_bisect_crash` -> `jerboa_ffi_type_check`
+- **Learn a module**: `jerboa_stdlib_source` -> `jerboa_module_catalog` -> `jerboa_module_quickstart`
+- **Security audit**: `jerboa_security_audit` -> `jerboa_import_policy_check` -> `jerboa_unsafe_import_lint`
+- **Static build audit**: `jerboa_static_symbol_audit` -> `jerboa_boot_library_audit` -> `jerboa_rust_musl_build`
+- **Safe-by-default check**: `jerboa_safe_prelude_check` -> `jerboa_resource_leak_check` -> `jerboa_safe_prelude_generate`
+- **Debug editor command**: `jerboa_command_trace` with `project_path` and `buffer_type`
+
+## Workflow Conventions
+
+When implementing new features, always complete the documentation update in the same session. Document non-trivial solutions as howto recipes in the cookbook system.
diff --git a/bench/results/fix1/soak30/sandbox-15k-30min.dnsperf.log b/bench/results/fix1/soak30/sandbox-15k-30min.dnsperf.log
new file mode 100644
index 0000000..3e526be
--- /dev/null
+++ b/bench/results/fix1/soak30/sandbox-15k-30min.dnsperf.log
@@ -0,0 +1,34 @@
+DNS Performance Testing Tool
+Version 2.15.1
+
+[Status] Command line: dnsperf -d bench/queries/mixed.txt -s 127.0.0.1 -p 5400 -Q 15000 -l 1800 -q 1000 -t 2 -S 30 -c 4 -O latency-histogram
+[Status] Sending queries (to 127.0.0.1:5400)
+[Status] Started at: Sat May 16 19:48:17 2026
+[Status] Stopping after 1800.000000 seconds
+1778982527.682152: 14940.971297
+1778982557.682570: 14999.991000
+1778982587.684559: 15000.005500
+1778982658.308681: 6356.595838
+1778982688.310651: 15000.048330
+1778982718.312638: 15000.006500
+1778982748.314613: 14999.979168
+1778982778.316195: 15000.009000
+1778982808.298943: 14999.925957
+1778982838.295457: 14999.976331
+1778982868.296423: 15000.016999
+1778982937.802857: 6452.208439
+1778982967.806222: 15000.050828
+[Timeout] Query timed out: msg id 30640
+Warning: received a response with an unexpected (maybe timed out) id: 30640
+1778983020.204173: 8565.983811
+1778983050.206069: 15000.018665
+1778983080.207951: 14999.992334
+[Timeout] Query timed out: msg id 45079
+Warning: received a response with an unexpected (maybe timed out) id: 45079
+1778983168.225914: 5100.458869
+1778983198.227777: 15000.001833
+1778983249.387955: 8767.678643
+1778983279.389893: 14014.128021
+1778983309.389951: 14884.104557
+[Timeout] Query timed out: msg id 12799
+Warning: received a response with an unexpected (maybe timed out) id: 12799
diff --git a/bench/results/fix1/soak30/sandbox-15k-30min.watchdog.log b/bench/results/fix1/soak30/sandbox-15k-30min.watchdog.log
new file mode 100644
index 0000000..21aebc7
--- /dev/null
+++ b/bench/results/fix1/soak30/sandbox-15k-30min.watchdog.log
@@ -0,0 +1,24 @@
+# ts elapsed rss_kb fd_count dnsperf_log_bytes server_alive
+1778982527 30 51680 10 321 1
+1778982557 60 51728 10 353 1
+1778982587 90 51728 10 385 1
+1778982658 161 51728 10 417 1
+1778982688 191 51728 10 448 1
+1778982718 221 51728 10 480 1
+1778982749 252 51728 10 512 1
+1778982779 282 51728 10 544 1
+1778982809 312 51728 10 576 1
+1778982839 342 51728 10 608 1
+1778982869 372 51728 10 640 1
+1778982939 442 51728 10 672 1
+1778982969 472 51728 10 703 1
+1778983021 524 51728 10 851 1
+1778983051 554 51728 10 882 1
+1778983082 585 51728 10 914 1
+1778983170 673 51728 10 1062 1
+1778983200 703 51728 10 1093 1
+1778983251 754 37312 10 1125 1
+1778983281 784 32976 10 1156 1
+1778983311 814 32976 10 1188 1
+1778983373 876 0 0 1336 0
+# soak ended
diff --git a/bench/results/fix1/soak30/sandbox-20k-30min.dnsperf.log b/bench/results/fix1/soak30/sandbox-20k-30min.dnsperf.log
new file mode 100644
index 0000000..c9b6659
--- /dev/null
+++ b/bench/results/fix1/soak30/sandbox-20k-30min.dnsperf.log
@@ -0,0 +1,2560 @@
+DNS Performance Testing Tool
+Version 2.15.1
+
+[Status] Command line: dnsperf -d bench/queries/mixed.txt -s 127.0.0.1 -p 5400 -Q 20000 -l 1800 -q 1000 -t 2 -S 30 -c 4 -O latency-histogram
+[Status] Sending queries (to 127.0.0.1:5400)
+[Status] Started at: Sat May 16 18:53:29 2026
+[Status] Stopping after 1800.000000 seconds
+1778979239.103946: 19999.998000
+[Timeout] Query timed out: msg id 10963
+Warning: received a response with an unexpected (maybe timed out) id: 10963
+1778979271.018767: 18744.425983
+1778979301.020151: 20000.010666
+1778979331.022126: 19999.983334
+1778979361.095519: 19906.400319
+1778979391.096850: 19999.979334
+1778979421.098860: 19999.993334
+1778979451.100840: 20000.013332
+1778979481.102793: 19999.998000
+1778979511.104763: 19999.986668
+1778979541.104868: 19999.996667
+1778979636.332626: 6154.035465
+1778979666.332949: 19999.984667
+1778979696.349959: 20000.026652
+[Timeout] Query timed out: msg id 56373
+Warning: received a response with an unexpected (maybe timed out) id: 56373
+1778979748.267548: 10691.444088
+1778979778.273746: 6349.721481
+1778979808.275577: 17342.874840
+1778979838.277844: 19999.988668
+1778979868.279998: 19999.997334
+1778979898.282131: 19999.978002
+1778979928.284264: 20000.044663
+[Timeout] Query timed out: msg id 40018
+[Timeout] Query timed out: msg id 40019
+[Timeout] Query timed out: msg id 40020
+[Timeout] Query timed out: msg id 40021
+[Timeout] Query timed out: msg id 40022
+[Timeout] Query timed out: msg id 40023
+[Timeout] Query timed out: msg id 40024
+[Timeout] Query timed out: msg id 40025
+[Timeout] Query timed out: msg id 40026
+[Timeout] Query timed out: msg id 40027
+[Timeout] Query timed out: msg id 40028
+[Timeout] Query timed out: msg id 40029
+[Timeout] Query timed out: msg id 40030
+[Timeout] Query timed out: msg id 40031
+[Timeout] Query timed out: msg id 40032
+[Timeout] Query timed out: msg id 40033
+[Timeout] Query timed out: msg id 40034
+[Timeout] Query timed out: msg id 40035
+[Timeout] Query timed out: msg id 40036
+[Timeout] Query timed out: msg id 40037
+[Timeout] Query timed out: msg id 40038
+[Timeout] Query timed out: msg id 40039
+[Timeout] Query timed out: msg id 40040
+[Timeout] Query timed out: msg id 40041
+[Timeout] Query timed out: msg id 40042
+[Timeout] Query timed out: msg id 40043
+[Timeout] Query timed out: msg id 40044
+[Timeout] Query timed out: msg id 40045
+[Timeout] Query timed out: msg id 40046
+[Timeout] Query timed out: msg id 40047
+[Timeout] Query timed out: msg id 40048
+[Timeout] Query timed out: msg id 40049
+[Timeout] Query timed out: msg id 40050
+[Timeout] Query timed out: msg id 40051
+[Timeout] Query timed out: msg id 40052
+[Timeout] Query timed out: msg id 40053
+[Timeout] Query timed out: msg id 40054
+[Timeout] Query timed out: msg id 40055
+[Timeout] Query timed out: msg id 40056
+[Timeout] Query timed out: msg id 40057
+[Timeout] Query timed out: msg id 40058
+[Timeout] Query timed out: msg id 40059
+[Timeout] Query timed out: msg id 40060
+[Timeout] Query timed out: msg id 40061
+[Timeout] Query timed out: msg id 40062
+[Timeout] Query timed out: msg id 40063
+[Timeout] Query timed out: msg id 40064
+[Timeout] Query timed out: msg id 40065
+[Timeout] Query timed out: msg id 40066
+[Timeout] Query timed out: msg id 40067
+[Timeout] Query timed out: msg id 40068
+[Timeout] Query timed out: msg id 40069
+[Timeout] Query timed out: msg id 40070
+[Timeout] Query timed out: msg id 40071
+[Timeout] Query timed out: msg id 40072
+[Timeout] Query timed out: msg id 40073
+[Timeout] Query timed out: msg id 40074
+[Timeout] Query timed out: msg id 40075
+[Timeout] Query timed out: msg id 40076
+[Timeout] Query timed out: msg id 40077
+[Timeout] Query timed out: msg id 40078
+[Timeout] Query timed out: msg id 40079
+[Timeout] Query timed out: msg id 40080
+[Timeout] Query timed out: msg id 40081
+[Timeout] Query timed out: msg id 40082
+[Timeout] Query timed out: msg id 40083
+[Timeout] Query timed out: msg id 40084
+[Timeout] Query timed out: msg id 40085
+[Timeout] Query timed out: msg id 40086
+[Timeout] Query timed out: msg id 40087
+[Timeout] Query timed out: msg id 40088
+[Timeout] Query timed out: msg id 40089
+[Timeout] Query timed out: msg id 40090
+[Timeout] Query timed out: msg id 40091
+[Timeout] Query timed out: msg id 40092
+[Timeout] Query timed out: msg id 40093
+[Timeout] Query timed out: msg id 40094
+[Timeout] Query timed out: msg id 40095
+[Timeout] Query timed out: msg id 40096
+[Timeout] Query timed out: msg id 40097
+[Timeout] Query timed out: msg id 40098
+[Timeout] Query timed out: msg id 40099
+[Timeout] Query timed out: msg id 40100
+[Timeout] Query timed out: msg id 40101
+[Timeout] Query timed out: msg id 40102
+[Timeout] Query timed out: msg id 40103
+[Timeout] Query timed out: msg id 40104
+[Timeout] Query timed out: msg id 40105
+[Timeout] Query timed out: msg id 40106
+[Timeout] Query timed out: msg id 40107
+[Timeout] Query timed out: msg id 40108
+[Timeout] Query timed out: msg id 40109
+[Timeout] Query timed out: msg id 40110
+[Timeout] Query timed out: msg id 40111
+[Timeout] Query timed out: msg id 40112
+[Timeout] Query timed out: msg id 40113
+[Timeout] Query timed out: msg id 40114
+[Timeout] Query timed out: msg id 40115
+[Timeout] Query timed out: msg id 40116
+[Timeout] Query timed out: msg id 40117
+[Timeout] Query timed out: msg id 40118
+[Timeout] Query timed out: msg id 40119
+[Timeout] Query timed out: msg id 40120
+[Timeout] Query timed out: msg id 40121
+[Timeout] Query timed out: msg id 40122
+[Timeout] Query timed out: msg id 40123
+[Timeout] Query timed out: msg id 40124
+[Timeout] Query timed out: msg id 40125
+[Timeout] Query timed out: msg id 40126
+[Timeout] Query timed out: msg id 40127
+[Timeout] Query timed out: msg id 40128
+[Timeout] Query timed out: msg id 40129
+[Timeout] Query timed out: msg id 40130
+[Timeout] Query timed out: msg id 40131
+[Timeout] Query timed out: msg id 40132
+[Timeout] Query timed out: msg id 40133
+[Timeout] Query timed out: msg id 40134
+[Timeout] Query timed out: msg id 40135
+[Timeout] Query timed out: msg id 40136
+[Timeout] Query timed out: msg id 40137
+[Timeout] Query timed out: msg id 40138
+[Timeout] Query timed out: msg id 40139
+[Timeout] Query timed out: msg id 40140
+[Timeout] Query timed out: msg id 40141
+[Timeout] Query timed out: msg id 40142
+[Timeout] Query timed out: msg id 40143
+[Timeout] Query timed out: msg id 40144
+[Timeout] Query timed out: msg id 40145
+[Timeout] Query timed out: msg id 40146
+[Timeout] Query timed out: msg id 40147
+[Timeout] Query timed out: msg id 40148
+[Timeout] Query timed out: msg id 40149
+[Timeout] Query timed out: msg id 40150
+[Timeout] Query timed out: msg id 40151
+[Timeout] Query timed out: msg id 40152
+[Timeout] Query timed out: msg id 40153
+[Timeout] Query timed out: msg id 40154
+[Timeout] Query timed out: msg id 40155
+[Timeout] Query timed out: msg id 40156
+[Timeout] Query timed out: msg id 40157
+[Timeout] Query timed out: msg id 40158
+[Timeout] Query timed out: msg id 40159
+[Timeout] Query timed out: msg id 40160
+[Timeout] Query timed out: msg id 40161
+[Timeout] Query timed out: msg id 40162
+[Timeout] Query timed out: msg id 40163
+[Timeout] Query timed out: msg id 40164
+[Timeout] Query timed out: msg id 40165
+[Timeout] Query timed out: msg id 40166
+[Timeout] Query timed out: msg id 40167
+[Timeout] Query timed out: msg id 40168
+[Timeout] Query timed out: msg id 40169
+[Timeout] Query timed out: msg id 40170
+[Timeout] Query timed out: msg id 40171
+[Timeout] Query timed out: msg id 40172
+[Timeout] Query timed out: msg id 40173
+[Timeout] Query timed out: msg id 40174
+[Timeout] Query timed out: msg id 40175
+[Timeout] Query timed out: msg id 40176
+[Timeout] Query timed out: msg id 40177
+[Timeout] Query timed out: msg id 40178
+[Timeout] Query timed out: msg id 40179
+[Timeout] Query timed out: msg id 40180
+[Timeout] Query timed out: msg id 40181
+[Timeout] Query timed out: msg id 40182
+[Timeout] Query timed out: msg id 40183
+[Timeout] Query timed out: msg id 40184
+[Timeout] Query timed out: msg id 40185
+[Timeout] Query timed out: msg id 40186
+[Timeout] Query timed out: msg id 40187
+[Timeout] Query timed out: msg id 40188
+[Timeout] Query timed out: msg id 40189
+[Timeout] Query timed out: msg id 40190
+[Timeout] Query timed out: msg id 40191
+[Timeout] Query timed out: msg id 40192
+[Timeout] Query timed out: msg id 40193
+[Timeout] Query timed out: msg id 40194
+[Timeout] Query timed out: msg id 40195
+[Timeout] Query timed out: msg id 40196
+[Timeout] Query timed out: msg id 40197
+[Timeout] Query timed out: msg id 40198
+[Timeout] Query timed out: msg id 40199
+[Timeout] Query timed out: msg id 40200
+[Timeout] Query timed out: msg id 40201
+[Timeout] Query timed out: msg id 40202
+[Timeout] Query timed out: msg id 40203
+[Timeout] Query timed out: msg id 40204
+[Timeout] Query timed out: msg id 40205
+[Timeout] Query timed out: msg id 40206
+[Timeout] Query timed out: msg id 40207
+[Timeout] Query timed out: msg id 40208
+[Timeout] Query timed out: msg id 40209
+[Timeout] Query timed out: msg id 40210
+[Timeout] Query timed out: msg id 40211
+[Timeout] Query timed out: msg id 40212
+[Timeout] Query timed out: msg id 40213
+[Timeout] Query timed out: msg id 40214
+[Timeout] Query timed out: msg id 40215
+[Timeout] Query timed out: msg id 40216
+[Timeout] Query timed out: msg id 40217
+[Timeout] Query timed out: msg id 40218
+[Timeout] Query timed out: msg id 40219
+[Timeout] Query timed out: msg id 40220
+[Timeout] Query timed out: msg id 40221
+[Timeout] Query timed out: msg id 40222
+[Timeout] Query timed out: msg id 40223
+[Timeout] Query timed out: msg id 40224
+[Timeout] Query timed out: msg id 40225
+[Timeout] Query timed out: msg id 40226
+[Timeout] Query timed out: msg id 40227
+[Timeout] Query timed out: msg id 40228
+[Timeout] Query timed out: msg id 40229
+[Timeout] Query timed out: msg id 40230
+[Timeout] Query timed out: msg id 40231
+[Timeout] Query timed out: msg id 40232
+[Timeout] Query timed out: msg id 40233
+[Timeout] Query timed out: msg id 40234
+[Timeout] Query timed out: msg id 40235
+[Timeout] Query timed out: msg id 40236
+[Timeout] Query timed out: msg id 40237
+[Timeout] Query timed out: msg id 40238
+[Timeout] Query timed out: msg id 40239
+[Timeout] Query timed out: msg id 40240
+[Timeout] Query timed out: msg id 40241
+[Timeout] Query timed out: msg id 40242
+[Timeout] Query timed out: msg id 40243
+[Timeout] Query timed out: msg id 40244
+[Timeout] Query timed out: msg id 40245
+[Timeout] Query timed out: msg id 40246
+[Timeout] Query timed out: msg id 40247
+[Timeout] Query timed out: msg id 40248
+[Timeout] Query timed out: msg id 40249
+[Timeout] Query timed out: msg id 40250
+[Timeout] Query timed out: msg id 40251
+[Timeout] Query timed out: msg id 40252
+[Timeout] Query timed out: msg id 40253
+[Timeout] Query timed out: msg id 40254
+[Timeout] Query timed out: msg id 40255
+[Timeout] Query timed out: msg id 40256
+[Timeout] Query timed out: msg id 40257
+[Timeout] Query timed out: msg id 40258
+[Timeout] Query timed out: msg id 40259
+[Timeout] Query timed out: msg id 40260
+[Timeout] Query timed out: msg id 40261
+[Timeout] Query timed out: msg id 40262
+[Timeout] Query timed out: msg id 40263
+[Timeout] Query timed out: msg id 40264
+[Timeout] Query timed out: msg id 40265
+[Timeout] Query timed out: msg id 40266
+[Timeout] Query timed out: msg id 40267
+[Timeout] Query timed out: msg id 40268
+[Timeout] Query timed out: msg id 40269
+[Timeout] Query timed out: msg id 40270
+[Timeout] Query timed out: msg id 40271
+[Timeout] Query timed out: msg id 40272
+[Timeout] Query timed out: msg id 40273
+[Timeout] Query timed out: msg id 40274
+[Timeout] Query timed out: msg id 40275
+[Timeout] Query timed out: msg id 40276
+[Timeout] Query timed out: msg id 40277
+[Timeout] Query timed out: msg id 40278
+[Timeout] Query timed out: msg id 40279
+[Timeout] Query timed out: msg id 40280
+[Timeout] Query timed out: msg id 40281
+[Timeout] Query timed out: msg id 40282
+[Timeout] Query timed out: msg id 40283
+[Timeout] Query timed out: msg id 40284
+[Timeout] Query timed out: msg id 40285
+[Timeout] Query timed out: msg id 40286
+[Timeout] Query timed out: msg id 40287
+[Timeout] Query timed out: msg id 40288
+[Timeout] Query timed out: msg id 40289
+[Timeout] Query timed out: msg id 40290
+[Timeout] Query timed out: msg id 40291
+[Timeout] Query timed out: msg id 40292
+[Timeout] Query timed out: msg id 40293
+[Timeout] Query timed out: msg id 40294
+[Timeout] Query timed out: msg id 40295
+[Timeout] Query timed out: msg id 40296
+[Timeout] Query timed out: msg id 40297
+[Timeout] Query timed out: msg id 40298
+[Timeout] Query timed out: msg id 40299
+[Timeout] Query timed out: msg id 40300
+[Timeout] Query timed out: msg id 40301
+[Timeout] Query timed out: msg id 40302
+[Timeout] Query timed out: msg id 40303
+[Timeout] Query timed out: msg id 40304
+[Timeout] Query timed out: msg id 40305
+[Timeout] Query timed out: msg id 40306
+[Timeout] Query timed out: msg id 40307
+[Timeout] Query timed out: msg id 40308
+[Timeout] Query timed out: msg id 40309
+[Timeout] Query timed out: msg id 40310
+[Timeout] Query timed out: msg id 40311
+[Timeout] Query timed out: msg id 40312
+[Timeout] Query timed out: msg id 40313
+[Timeout] Query timed out: msg id 40314
+[Timeout] Query timed out: msg id 40315
+[Timeout] Query timed out: msg id 40316
+[Timeout] Query timed out: msg id 40317
+[Timeout] Query timed out: msg id 40318
+[Timeout] Query timed out: msg id 40319
+[Timeout] Query timed out: msg id 40320
+[Timeout] Query timed out: msg id 40321
+[Timeout] Query timed out: msg id 40322
+[Timeout] Query timed out: msg id 40323
+[Timeout] Query timed out: msg id 40324
+[Timeout] Query timed out: msg id 40325
+[Timeout] Query timed out: msg id 40326
+[Timeout] Query timed out: msg id 40327
+[Timeout] Query timed out: msg id 40328
+[Timeout] Query timed out: msg id 40329
+[Timeout] Query timed out: msg id 40330
+[Timeout] Query timed out: msg id 40331
+[Timeout] Query timed out: msg id 40332
+[Timeout] Query timed out: msg id 40333
+[Timeout] Query timed out: msg id 40334
+[Timeout] Query timed out: msg id 40335
+[Timeout] Query timed out: msg id 40336
+[Timeout] Query timed out: msg id 40337
+[Timeout] Query timed out: msg id 40338
+[Timeout] Query timed out: msg id 40339
+[Timeout] Query timed out: msg id 40340
+[Timeout] Query timed out: msg id 40341
+[Timeout] Query timed out: msg id 40342
+[Timeout] Query timed out: msg id 40343
+[Timeout] Query timed out: msg id 40344
+[Timeout] Query timed out: msg id 40345
+[Timeout] Query timed out: msg id 40346
+[Timeout] Query timed out: msg id 40347
+[Timeout] Query timed out: msg id 40348
+[Timeout] Query timed out: msg id 40349
+[Timeout] Query timed out: msg id 40350
+[Timeout] Query timed out: msg id 40351
+[Timeout] Query timed out: msg id 40352
+[Timeout] Query timed out: msg id 40353
+[Timeout] Query timed out: msg id 40354
+[Timeout] Query timed out: msg id 40355
+[Timeout] Query timed out: msg id 40356
+[Timeout] Query timed out: msg id 40357
+[Timeout] Query timed out: msg id 40358
+[Timeout] Query timed out: msg id 40359
+[Timeout] Query timed out: msg id 40360
+[Timeout] Query timed out: msg id 40361
+[Timeout] Query timed out: msg id 40362
+[Timeout] Query timed out: msg id 40363
+[Timeout] Query timed out: msg id 40364
+[Timeout] Query timed out: msg id 40365
+[Timeout] Query timed out: msg id 40366
+[Timeout] Query timed out: msg id 40367
+[Timeout] Query timed out: msg id 40368
+[Timeout] Query timed out: msg id 40369
+[Timeout] Query timed out: msg id 40370
+[Timeout] Query timed out: msg id 40371
+[Timeout] Query timed out: msg id 40372
+[Timeout] Query timed out: msg id 40373
+[Timeout] Query timed out: msg id 40374
+[Timeout] Query timed out: msg id 40375
+[Timeout] Query timed out: msg id 40376
+[Timeout] Query timed out: msg id 40377
+[Timeout] Query timed out: msg id 40378
+[Timeout] Query timed out: msg id 40379
+[Timeout] Query timed out: msg id 40380
+[Timeout] Query timed out: msg id 40381
+[Timeout] Query timed out: msg id 40382
+[Timeout] Query timed out: msg id 40383
+[Timeout] Query timed out: msg id 40384
+[Timeout] Query timed out: msg id 40385
+[Timeout] Query timed out: msg id 40386
+[Timeout] Query timed out: msg id 40387
+[Timeout] Query timed out: msg id 40388
+[Timeout] Query timed out: msg id 40389
+[Timeout] Query timed out: msg id 40390
+[Timeout] Query timed out: msg id 40391
+[Timeout] Query timed out: msg id 40392
+[Timeout] Query timed out: msg id 40393
+[Timeout] Query timed out: msg id 40394
+[Timeout] Query timed out: msg id 40395
+[Timeout] Query timed out: msg id 40396
+[Timeout] Query timed out: msg id 40397
+[Timeout] Query timed out: msg id 40398
+[Timeout] Query timed out: msg id 40399
+[Timeout] Query timed out: msg id 40400
+[Timeout] Query timed out: msg id 40401
+[Timeout] Query timed out: msg id 40402
+[Timeout] Query timed out: msg id 40403
+[Timeout] Query timed out: msg id 40404
+[Timeout] Query timed out: msg id 40405
+[Timeout] Query timed out: msg id 40406
+[Timeout] Query timed out: msg id 40407
+[Timeout] Query timed out: msg id 40408
+[Timeout] Query timed out: msg id 40409
+[Timeout] Query timed out: msg id 40410
+[Timeout] Query timed out: msg id 40411
+[Timeout] Query timed out: msg id 40412
+[Timeout] Query timed out: msg id 40413
+[Timeout] Query timed out: msg id 40414
+[Timeout] Query timed out: msg id 40415
+[Timeout] Query timed out: msg id 40416
+[Timeout] Query timed out: msg id 40417
+[Timeout] Query timed out: msg id 40418
+[Timeout] Query timed out: msg id 40419
+[Timeout] Query timed out: msg id 40420
+[Timeout] Query timed out: msg id 40421
+[Timeout] Query timed out: msg id 40422
+[Timeout] Query timed out: msg id 40423
+[Timeout] Query timed out: msg id 40424
+[Timeout] Query timed out: msg id 40425
+[Timeout] Query timed out: msg id 40426
+[Timeout] Query timed out: msg id 40427
+[Timeout] Query timed out: msg id 40428
+[Timeout] Query timed out: msg id 40429
+[Timeout] Query timed out: msg id 40430
+[Timeout] Query timed out: msg id 40431
+[Timeout] Query timed out: msg id 40432
+[Timeout] Query timed out: msg id 40433
+[Timeout] Query timed out: msg id 40434
+[Timeout] Query timed out: msg id 40435
+[Timeout] Query timed out: msg id 40436
+[Timeout] Query timed out: msg id 40437
+[Timeout] Query timed out: msg id 40438
+[Timeout] Query timed out: msg id 40439
+[Timeout] Query timed out: msg id 40440
+[Timeout] Query timed out: msg id 40441
+[Timeout] Query timed out: msg id 40442
+[Timeout] Query timed out: msg id 40443
+[Timeout] Query timed out: msg id 40444
+[Timeout] Query timed out: msg id 40445
+[Timeout] Query timed out: msg id 40446
+[Timeout] Query timed out: msg id 40447
+[Timeout] Query timed out: msg id 40448