Skip to content

feat: Boundary 3 bidirectional type-checker for lambda calculus#182

Merged
dowdiness merged 5 commits intomainfrom
feat/boundary3-bidirectional-typechecker
Apr 15, 2026
Merged

feat: Boundary 3 bidirectional type-checker for lambda calculus#182
dowdiness merged 5 commits intomainfrom
feat/boundary3-bidirectional-typechecker

Conversation

@dowdiness
Copy link
Copy Markdown
Owner

Summary

  • InternTable[T] in incr/types/ — grow-only interning table with stable InternId keys for cross-revision cache stability
  • Bidirectional type system in lambda/typecheck/ — TInt, TArrow, TUnit, TError with infer/check, error propagation, cascading suppression
  • Parser extensions — Colon/Arrow tokens, type annotation grammar (λx:Int. body, let f(x:Int) = ...), TypeAnnotView
  • Incremental pipeline — Scope-managed Memo chain with per-def recomputation and backdating
  • MemoMap[DefId, TypeResult] index — query-by-id access exercising MemoMap + InternTable integration

Infrastructure validation for Boundary 3 (CST → Typed AST). Exercises InternTable, MemoMap, Scope-managed Memo chains, and diagnostic collection in incr. The type system is intentionally minimal; correctness of the incremental architecture matters more than language expressiveness.

Submodule PRs

  • incr: dowdiness/incr — branch feat/boundary3-intern-table (InternTable)
  • loom: dowdiness/loom — branch feat/boundary3-bidirectional-typechecker (type-checker + parser changes)

Test plan

  • cd loom/incr && moon test — 495 tests (4 new InternTable)
  • cd loom/examples/lambda && moon test — 494 tests (43 new: 39 typecheck + 4 lexer)
  • Verify InternTable dedup: same value → same InternId across calls
  • Verify bidirectional rules: annotated lambda infers, unannotated checks from context
  • Verify error suppression: Hole/Error emit one diagnostic, no cascading
  • Verify incremental behavior: edit def body → only that def recomputes; structural change → scope rebuild

🤖 Generated with Claude Code

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 15, 2026

Warning

Rate limit exceeded

@dowdiness has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 17 minutes and 57 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 17 minutes and 57 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 721c64d8-20c1-409e-bf0d-4e68767db835

📥 Commits

Reviewing files that changed from the base of the PR and between cc6efec and de13f65.

📒 Files selected for processing (1)
  • loom
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/boundary3-bidirectional-typechecker

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages bot commented Apr 15, 2026

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
lambda-editor de13f65 Commit Preview URL

Branch Preview URL
Apr 15 2026, 02:14 PM

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 15, 2026

Benchmark Comparison Report

Comparing PR branch against main

Main Module Benchmarks

Base branch:

node count: 402
node count: 802
node count: 2002
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:24 ("viewnode serialization (100 defs)") ok
time (mean ± σ)         range (min … max) 
   2.07 ms ±  19.67 µs     2.04 ms …   2.09 ms  in 10 ×     50 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:35 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   5.56 ms ± 207.98 µs     5.34 ms …   5.98 ms  in 10 ×     19 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:46 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  26.42 ms ±   1.95 ms    24.34 ms …  29.67 ms  in 10 ×      4 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:57 ("compute_view_patches (100 defs, single edit)") ok
time (mean ± σ)         range (min … max) 
   1.58 ms ±  61.55 µs     1.51 ms …   1.73 ms  in 10 ×     65 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
 595.57 µs ±  94.33 µs   455.77 µs … 729.36 µs  in 10 ×    247 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   1.26 ms ±  49.29 µs     1.21 ms …   1.33 ms  in 10 ×     87 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  12.48 ms ± 482.33 µs    12.03 ms …  13.63 ms  in 10 ×      8 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:113 ("json object - incremental keystroke (1000 members)") ok
time (mean ± σ)         range (min … max) 
  47.71 ms ±   6.41 ms    41.91 ms …  60.34 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:118 ("json array - incremental keystroke (20 elements)") ok
time (mean ± σ)         range (min … max) 
 610.03 µs ± 184.73 µs   355.50 µs … 871.47 µs  in 10 ×    372 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
 904.15 µs ±  64.95 µs   811.39 µs … 998.28 µs  in 10 ×    132 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
   9.66 ms ± 190.74 µs     9.36 ms …   9.89 ms  in 10 ×     11 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:133 ("json array - incremental keystroke (1000 elements)") ok
time (mean ± σ)         range (min … max) 
  35.59 ms ±   4.12 ms    31.30 ms …  42.79 ms  in 10 ×      3 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:38 ("tree refresh unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
   4.98 µs ±   0.05 µs     4.95 µs …   5.10 µs  in 10 ×  19830 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  18.69 µs ±   0.25 µs    18.50 µs …  19.31 µs  in 10 ×   5313 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
  76.55 µs ±   1.38 µs    75.81 µs …  80.39 µs  in 10 ×   1317 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 276.38 µs ±   2.74 µs   273.17 µs … 280.90 µs  in 10 ×    361 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
   8.13 µs ±   0.03 µs     8.10 µs …   8.20 µs  in 10 ×  11944 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 131.94 µs ±   0.95 µs   130.81 µs … 134.16 µs  in 10 ×    758 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 500.22 µs ±   4.18 µs   496.21 µs … 508.64 µs  in 10 ×    202 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  29.75 µs ±   0.14 µs    29.58 µs …  29.96 µs  in 10 ×   3345 runs
Total tests: 20, passed: 20, failed: 0.

PR branch:

Registry index cloned successfully
Symbols updated successfully
Downloading moonbitlang/quickcheck@0.11.2
Downloading moonbitlang/x@0.4.38
Downloading moonbitlang/async@0.16.8
node count: 402
node count: 802
node count: 2002
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:24 ("viewnode serialization (100 defs)") ok
time (mean ± σ)         range (min … max) 
   2.05 ms ±  59.59 µs     1.99 ms …   2.19 ms  in 10 ×     51 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:35 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   5.95 ms ± 571.87 µs     5.44 ms …   7.14 ms  in 10 ×     16 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:46 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  29.12 ms ±   2.50 ms    26.17 ms …  33.64 ms  in 10 ×      4 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:57 ("compute_view_patches (100 defs, single edit)") ok
time (mean ± σ)         range (min … max) 
   1.50 ms ±  64.06 µs     1.42 ms …   1.61 ms  in 10 ×     65 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
 587.98 µs ±  96.03 µs   454.36 µs … 727.25 µs  in 10 ×    248 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   1.22 ms ±  44.37 µs     1.17 ms …   1.29 ms  in 10 ×     89 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  11.05 ms ± 340.51 µs    10.84 ms …  11.99 ms  in 10 ×     10 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:113 ("json object - incremental keystroke (1000 members)") ok
time (mean ± σ)         range (min … max) 
  46.40 ms ±   6.06 ms    42.86 ms …  60.58 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:118 ("json array - incremental keystroke (20 elements)") ok
time (mean ± σ)         range (min … max) 
 580.61 µs ± 169.37 µs   342.26 µs … 823.49 µs  in 10 ×    354 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
 853.15 µs ±  74.97 µs   743.64 µs … 943.33 µs  in 10 ×    145 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
   8.68 ms ±   1.07 ms     7.97 ms …  10.75 ms  in 10 ×     13 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:133 ("json array - incremental keystroke (1000 elements)") ok
time (mean ± σ)         range (min … max) 
  36.12 ms ±   2.91 ms    32.43 ms …  41.44 ms  in 10 ×      3 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:38 ("tree refresh unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
   4.75 µs ±   0.06 µs     4.72 µs …   4.89 µs  in 10 ×  20582 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  18.04 µs ±   0.19 µs    17.88 µs …  18.56 µs  in 10 ×   5509 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
  76.51 µs ±   1.49 µs    75.36 µs …  79.78 µs  in 10 ×   1297 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 293.29 µs ±   2.63 µs   289.62 µs … 297.07 µs  in 10 ×    343 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
   7.96 µs ±   0.05 µs     7.91 µs …   8.06 µs  in 10 ×  12604 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 131.57 µs ±   0.43 µs   131.00 µs … 132.25 µs  in 10 ×    749 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 510.07 µs ±   7.19 µs   504.77 µs … 529.31 µs  in 10 ×    195 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  29.43 µs ±   0.05 µs    29.32 µs …  29.49 µs  in 10 ×   3388 runs
Total tests: 20, passed: 20, failed: 0.

event-graph-walker Benchmarks

Base branch:

Registry index updated successfully
Symbols updated successfully
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:21 ("merge - concurrent edits (2 agents x 10)") ok
time (mean ± σ)         range (min … max) 
  21.27 µs ±   0.51 µs    20.66 µs …  21.80 µs  in 10 ×   4377 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:59 ("merge - concurrent edits (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
 110.52 µs ±   0.90 µs   109.99 µs … 112.77 µs  in 10 ×    912 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:97 ("merge - concurrent edits (2 agents x 200)") ok
time (mean ± σ)         range (min … max) 
 509.94 µs ±   6.13 µs   503.71 µs … 523.45 µs  in 10 ×    200 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:135 ("merge - many agents (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
 140.03 µs ±   0.79 µs   138.73 µs … 141.61 µs  in 10 ×    718 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:184 ("merge - with deletes (50 inserts, 25 deletes)") ok
time (mean ± σ)         range (min … max) 
 107.08 µs ±   0.72 µs   106.07 µs … 107.90 µs  in 10 ×    932 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:230 ("merge - graph_diff advance (20 ops)") ok
time (mean ± σ)         range (min … max) 
  69.93 µs ±   0.54 µs    69.21 µs …  70.65 µs  in 10 ×   1434 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:303 ("merge - repeated small (10 iterations x 5 ops)") ok
time (mean ± σ)         range (min … max) 
 108.12 µs ±   0.55 µs   107.64 µs … 109.45 µs  in 10 ×    925 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:341 ("merge - retreat concurrent deletes (500 items, 50 deletes)") ok
time (mean ± σ)         range (min … max) 
 206.07 µs ±   0.73 µs   204.76 µs … 207.09 µs  in 10 ×    487 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:408 ("merge - context apply operations (50 ops)") ok
time (mean ± σ)         range (min … max) 
  40.01 µs ±  19.88 µs    25.69 µs …  81.13 µs  in 10 ×   2326 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   4.00 µs ±   0.03 µs     3.95 µs …   4.04 µs  in 10 ×  25093 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  28.94 µs ±   0.26 µs    28.67 µs …  29.47 µs  in 10 ×   3474 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 391.32 µs ±   3.04 µs   387.98 µs … 396.87 µs  in 10 ×    249 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  11.32 µs ±   4.02 µs     9.03 µs …  20.76 µs  in 10 ×   8109 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
 107.03 µs ±  62.96 µs    59.29 µs … 241.85 µs  in 10 ×   1067 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  30.35 µs ±   0.49 µs    30.06 µs …  31.67 µs  in 10 ×   3314 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  39.41 µs ±   0.31 µs    38.88 µs …  39.84 µs  in 10 ×   2469 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:176 ("branch - repeated advance steady-state (10 iterations)") ok
time (mean ± σ)         range (min … max) 
  25.92 µs ±   0.68 µs    25.35 µs …  27.36 µs  in 10 ×   3859 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:220 ("branch - repeated advance with oplog mutations (10 iterations)") ok
time (mean ± σ)         range (min … max) 
   6.94 ms ±   3.34 ms     2.65 ms …  12.49 ms  in 10 ×     63 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  11.25 µs ±   0.06 µs    11.18 µs …  11.36 µs  in 10 ×   8734 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 117.61 µs ±   0.32 µs   117.21 µs … 118.12 µs  in 10 ×    857 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   3.91 µs ±   0.22 µs     3.73 µs …   4.36 µs  in 10 ×  26282 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  41.99 µs ±  14.58 µs    30.89 µs …  75.39 µs  in 10 ×   2143 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  15.67 ms ±   6.53 ms     6.76 ms …  26.34 ms  in 10 ×     27 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  21.45 µs ±  10.01 µs    12.83 µs …  43.92 µs  in 10 ×   6912 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
   0.62 µs ±   0.01 µs     0.61 µs …   0.63 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:22 ("walker - linear history (100 ops)") ok
time (mean ± σ)         range (min … max) 
   4.80 µs ±   0.00 µs     4.79 µs …   4.80 µs  in 10 ×  20807 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  44.66 µs ±   0.57 µs    44.18 µs …  45.93 µs  in 10 ×   2253 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:54 ("walker - concurrent branches (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
   6.36 µs ±   0.01 µs     6.35 µs …   6.38 µs  in 10 ×  15726 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:79 ("walker - concurrent branches (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
   6.36 µs ±   0.01 µs     6.35 µs …   6.39 µs  in 10 ×  15735 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:99 ("walker - diamond pattern (50 diamonds)") ok
time (mean ± σ)         range (min … max) 
   8.26 µs ±   0.11 µs     8.17 µs …   8.49 µs  in 10 ×  12088 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:121 ("walker - diff advance only (10 new ops)") ok
time (mean ± σ)         range (min … max) 
   3.47 µs ±   0.01 µs     3.46 µs …   3.48 µs  in 10 ×  28878 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:145 ("walker - diff with concurrent branches") ok
time (mean ± σ)         range (min … max) 
   5.72 µs ±   0.01 µs     5.71 µs …   5.74 µs  in 10 ×  17392 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 476.13 µs ±   1.76 µs   473.52 µs … 478.31 µs  in 10 ×    210 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   9.00 ms ± 262.47 µs     8.68 ms …   9.41 ms  in 10 ×     12 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:213 ("walker - concurrent branches (100000 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
  29.25 ms ±   3.41 ms    25.92 ms …  35.06 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:6 ("version_vector - create (1 agent)") ok
time (mean ± σ)         range (min … max) 
   0.06 µs ±   0.00 µs     0.06 µs …   0.06 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:15 ("version_vector - create (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.35 µs ±   0.00 µs     0.35 µs …   0.35 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:29 ("version_vector - create (20 agents)") ok
time (mean ± σ)         range (min … max) 
   1.46 µs ±   0.00 µs     1.45 µs …   1.47 µs  in 10 ×  68691 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:42 ("version_vector - compare equal (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.27 µs ±   0.00 µs     0.27 µs …   0.28 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:63 ("version_vector - compare <= (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.17 µs ±   0.00 µs     0.17 µs …   0.17 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:84 ("version_vector - compare <= (20 agents)") ok
time (mean ± σ)         range (min … max) 
   0.68 µs ±   0.00 µs     0.68 µs …   0.69 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:100 ("version_vector - merge (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.52 µs ±   0.00 µs     0.52 µs …   0.52 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:118 ("version_vector - merge (20 agents)") ok
time (mean ± σ)         range (min … max) 
   2.61 µs ±   0.01 µs     2.60 µs …   2.62 µs  in 10 ×  38337 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:134 ("version_vector - includes (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.24 µs ±   0.00 µs     0.24 µs …   0.24 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:153 ("version_vector - concurrent (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.17 µs ±   0.00 µs     0.17 µs …   0.17 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:170 ("version_vector - from_frontier (10 ops)") ok
time (mean ± σ)         range (min … max) 
   0.56 µs ±   0.00 µs     0.55 µs …   0.56 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:186 ("version_vector - from_frontier (100 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.65 µs ±   0.01 µs     4.64 µs …   4.69 µs  in 10 ×  21428 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:206 ("version_vector - to_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.26 µs ±   0.00 µs     0.26 µs …   0.26 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:230 ("version_vector - roundtrip (5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.97 µs ±   0.01 µs     4.96 µs …   4.98 µs  in 10 ×  20134 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:251 ("version_vector - agents (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.05 µs ±   0.00 µs     0.05 µs …   0.05 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:266 ("version_vector - length (20 agents)") ok
time (mean ± σ)         range (min … max) 
   0.01 µs ±   0.00 µs     0.01 µs …   0.01 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:20 ("bench: cache invalidate + position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 185.68 µs ±   1.33 µs   184.25 µs … 187.68 µs  in 10 ×    491 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.88 ms ±  90.12 µs     2.76 ms …   3.01 ms  in 10 ×     35 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   9.45 ms ± 221.45 µs     9.22 ms …   9.83 ms  in 10 ×     11 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:57 ("bench: 10 remote inserts + queries (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
   4.32 ms ±  77.33 µs     4.23 ms …   4.46 ms  in 10 ×     23 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:84 ("bench: 10 remote inserts + queries (5000-char doc)") ok
time (mean ± σ)         range (min … max) 
  36.93 ms ± 889.47 µs    35.33 ms …  37.80 ms  in 10 ×      3 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:113 ("bench: warm cache position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.10 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:120 ("bench: warm cache position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.10 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 167.16 µs ±   1.40 µs   165.73 µs … 169.28 µs  in 10 ×    594 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:26 ("jump - concurrent insert into 1K doc") ok
time (mean ± σ)         range (min … max) 
 160.85 µs ±   1.30 µs   159.22 µs … 163.89 µs  in 10 ×    627 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:58 ("jump - concurrent insert into 10K doc") ok
time (mean ± σ)         range (min … max) 
   4.64 ms ± 107.88 µs     4.48 ms …   4.81 ms  in 10 ×     22 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 160.72 µs ±   1.03 µs   159.20 µs … 162.20 µs  in 10 ×    617 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  39.21 µs ±   0.90 µs    38.64 µs …  41.68 µs  in 10 ×   2514 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 498.27 µs ±   3.09 µs   493.98 µs … 503.19 µs  in 10 ×    192 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:34 ("oplog - insert and delete mix (100 ops)") ok
time (mean ± σ)         range (min … max) 
  59.56 µs ±   0.22 µs    59.13 µs …  59.90 µs  in 10 ×   1685 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  28.44 µs ±   0.10 µs    28.33 µs …  28.62 µs  in 10 ×   3535 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
   0.13 µs ±   0.00 µs     0.13 µs …   0.13 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:97 ("oplog - get_frontier (single agent)") ok
time (mean ± σ)         range (min … max) 
   0.02 µs ±   0.00 µs     0.02 µs …   0.02 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:112 ("oplog - get_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.03 µs ±   0.00 µs     0.03 µs …   0.03 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:134 ("oplog - walk_and_collect (100 ops)") ok
time (mean ± σ)         range (min … max) 
  10.13 µs ±   0.05 µs    10.05 µs …  10.21 µs  in 10 ×   9754 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  11.46 µs ±   0.04 µs    11.40 µs …  11.51 µs  in 10 ×   8699 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:177 ("oplog - diff_and_collect (advance 20)") ok
time (mean ± σ)         range (min … max) 
   5.12 µs ±   0.01 µs     5.11 µs …   5.13 µs  in 10 ×  19305 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   8.14 µs ±   0.03 µs     8.12 µs …   8.20 µs  in 10 ×  12833 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 223.88 µs ±   0.45 µs   223.33 µs … 224.61 µs  in 10 ×    448 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  39.12 µs ±   0.16 µs    38.90 µs …  39.32 µs  in 10 ×   2556 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 157.57 ms ±  23.78 ms   123.58 ms … 185.87 ms  in 10 ×      1 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:287 ("oplog - diff_and_collect (100000 ops advance)") ok
time (mean ± σ)         range (min … max) 
  62.27 ms ±  15.70 ms    43.37 ms …  83.61 ms  in 10 ×      2 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:10 ("text - insert append (100 chars)") ok
time (mean ± σ)         range (min … max) 
  99.54 µs ±   0.37 µs    98.93 µs … 100.24 µs  in 10 ×    889 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.37 ms ±  11.39 µs     1.35 ms …   1.39 ms  in 10 ×     74 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 160.73 µs ±   0.92 µs   159.14 µs … 161.79 µs  in 10 ×    619 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:51 ("text - delete (100 deletes from 100-char doc)") ok
time (mean ± σ)         range (min … max) 
 249.54 µs ±   1.14 µs   248.22 µs … 251.70 µs  in 10 ×    401 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.05 µs ±   0.16 µs    13.75 µs …  14.21 µs  in 10 ×   7252 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 141.41 µs ±   0.31 µs   141.01 µs … 142.16 µs  in 10 ×    695 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
   0.01 µs ±   0.00 µs     0.01 µs …   0.01 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:113 ("text - sync export_all (100 ops)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.10 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:126 ("text - sync export_all (1000 ops)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.10 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:139 ("text - sync export_since (50-op delta, 1000-op base)") ok
time (mean ± σ)         range (min … max) 
  36.85 µs ±   0.18 µs    36.54 µs …  37.05 µs  in 10 ×   2729 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  51.46 µs ±   0.26 µs    51.20 µs …  52.09 µs  in 10 ×   1952 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 655.65 µs ±   2.84 µs   651.59 µs … 659.35 µs  in 10 ×    153 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:186 ("text - bidirectional sync (2 peers, 50 ops each)") ok
time (mean ± σ)         range (min … max) 
 109.08 µs ±   0.55 µs   108.35 µs … 110.14 µs  in 10 ×    920 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  13.60 µs ±   0.05 µs    13.51 µs …  13.68 µs  in 10 ×   7357 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 154.28 µs ±   1.62 µs   152.94 µs … 157.27 µs  in 10 ×    649 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:256 ("text - undo record_insert (100 ops, 1 group)") ok
time (mean ± σ)         range (min … max) 
   2.01 µs ±   0.00 µs     2.01 µs …   2.02 µs  in 10 ×  49079 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:269 ("text - undo record_insert (100 ops, 100 groups)") ok
time (mean ± σ)         range (min … max) 
   2.42 µs ±   0.00 µs     2.41 µs …   2.42 µs  in 10 ×  40961 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  29.86 µs ±   0.23 µs    29.61 µs …  30.29 µs  in 10 ×   3362 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 477.89 µs ±   2.07 µs   475.32 µs … 482.83 µs  in 10 ×    211 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:309 ("text - undo undo+redo roundtrip (10-op group)") ok
time (mean ± σ)         range (min … max) 
  33.80 µs ±   0.43 µs    33.43 µs …  34.89 µs  in 10 ×   2982 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:324 ("text - undo 10 undo+redo cycles (10-op group)") ok
time (mean ± σ)         range (min … max) 
 288.37 µs ±   1.84 µs   286.84 µs … 292.35 µs  in 10 ×    343 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.41 ms ±  13.25 µs     1.39 ms …   1.43 ms  in 10 ×     71 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.37 ms ±  40.73 µs     3.32 ms …   3.44 ms  in 10 ×     30 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.02 ms ±  29.05 µs     1.99 ms …   2.07 ms  in 10 ×     50 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:71 ("cache - jump to middle every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.76 ms ±  42.32 µs     2.72 ms …   2.87 ms  in 10 ×     37 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:94 ("cache - single non-seq insert on 1000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.16 µs ±   1.00 µs     6.08 µs …   9.57 µs  in 10 ×  15587 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:108 ("cache - single non-seq insert on 5000-char doc") ok
time (mean ± σ)         range (min … max) 
   6.90 µs ±   1.12 µs     5.84 µs …   9.61 µs  in 10 ×  16164 runs
Total tests: 104, passed: 104, failed: 0.

PR branch:

Registry index updated successfully
Symbols updated successfully
Using cached moonbitlang/quickcheck@0.11.2
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:21 ("merge - concurrent edits (2 agents x 10)") ok
time (mean ± σ)         range (min … max) 
  21.72 µs ±   0.41 µs    21.23 µs …  22.26 µs  in 10 ×   4335 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:59 ("merge - concurrent edits (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
 110.03 µs ±   0.54 µs   109.38 µs … 111.15 µs  in 10 ×    882 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:97 ("merge - concurrent edits (2 agents x 200)") ok
time (mean ± σ)         range (min … max) 
 501.72 µs ±   2.90 µs   499.03 µs … 506.65 µs  in 10 ×    199 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:135 ("merge - many agents (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
 139.50 µs ±   0.83 µs   138.63 µs … 140.67 µs  in 10 ×    716 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:184 ("merge - with deletes (50 inserts, 25 deletes)") ok
time (mean ± σ)         range (min … max) 
 107.35 µs ±   2.31 µs   105.73 µs … 113.54 µs  in 10 ×    937 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:230 ("merge - graph_diff advance (20 ops)") ok
time (mean ± σ)         range (min … max) 
  69.16 µs ±   0.43 µs    68.68 µs …  69.88 µs  in 10 ×   1419 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:303 ("merge - repeated small (10 iterations x 5 ops)") ok
time (mean ± σ)         range (min … max) 
 107.52 µs ±   0.48 µs   106.85 µs … 108.21 µs  in 10 ×    928 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:341 ("merge - retreat concurrent deletes (500 items, 50 deletes)") ok
time (mean ± σ)         range (min … max) 
 206.67 µs ±   0.59 µs   205.75 µs … 207.42 µs  in 10 ×    486 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:408 ("merge - context apply operations (50 ops)") ok
time (mean ± σ)         range (min … max) 
  43.24 µs ±  20.20 µs    27.37 µs …  89.05 µs  in 10 ×   2415 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   3.97 µs ±   0.03 µs     3.94 µs …   4.01 µs  in 10 ×  25059 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  29.13 µs ±   0.52 µs    28.76 µs …  30.35 µs  in 10 ×   3469 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 388.84 µs ±   1.20 µs   387.16 µs … 390.50 µs  in 10 ×    257 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  12.73 µs ±   6.14 µs     8.89 µs …  24.47 µs  in 10 ×   8428 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  94.59 µs ±  57.74 µs    60.37 µs … 233.35 µs  in 10 ×   1568 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  30.19 µs ±   0.10 µs    30.07 µs …  30.36 µs  in 10 ×   3291 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  39.54 µs ±   0.15 µs    39.28 µs …  39.74 µs  in 10 ×   2521 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:176 ("branch - repeated advance steady-state (10 iterations)") ok
time (mean ± σ)         range (min … max) 
  25.89 µs ±   0.74 µs    25.38 µs …  27.36 µs  in 10 ×   3844 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:220 ("branch - repeated advance with oplog mutations (10 iterations)") ok
time (mean ± σ)         range (min … max) 
   7.25 ms ±   3.61 ms     2.78 ms …  13.16 ms  in 10 ×     66 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  11.16 µs ±   0.03 µs    11.12 µs …  11.21 µs  in 10 ×   9010 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 115.87 µs ±   0.32 µs   115.37 µs … 116.32 µs  in 10 ×    863 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   3.88 µs ±   0.19 µs     3.74 µs …   4.31 µs  in 10 ×  24304 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  50.64 µs ±  29.56 µs    31.23 µs … 112.04 µs  in 10 ×   2111 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  16.24 ms ±   7.45 ms     6.74 ms …  30.61 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  20.45 µs ±  10.96 µs    12.86 µs …  39.74 µs  in 10 ×   6926 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
   0.62 µs ±   0.01 µs     0.61 µs …   0.63 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:22 ("walker - linear history (100 ops)") ok
time (mean ± σ)         range (min … max) 
   4.88 µs ±   0.02 µs     4.86 µs …   4.92 µs  in 10 ×  20602 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  44.85 µs ±   0.52 µs    44.46 µs …  46.13 µs  in 10 ×   2251 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:54 ("walker - concurrent branches (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
   6.39 µs ±   0.01 µs     6.37 µs …   6.41 µs  in 10 ×  15663 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:79 ("walker - concurrent branches (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
   6.33 µs ±   0.01 µs     6.32 µs …   6.34 µs  in 10 ×  15758 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:99 ("walker - diamond pattern (50 diamonds)") ok
time (mean ± σ)         range (min … max) 
   8.40 µs ±   0.07 µs     8.33 µs …   8.53 µs  in 10 ×  11869 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:121 ("walker - diff advance only (10 new ops)") ok
time (mean ± σ)         range (min … max) 
   3.56 µs ±   0.01 µs     3.55 µs …   3.57 µs  in 10 ×  28121 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:145 ("walker - diff with concurrent branches") ok
time (mean ± σ)         range (min … max) 
   5.73 µs ±   0.02 µs     5.70 µs …   5.77 µs  in 10 ×  17447 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 462.27 µs ±   1.34 µs   460.85 µs … 465.47 µs  in 10 ×    216 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   7.64 ms ±  42.82 µs     7.57 ms …   7.70 ms  in 10 ×     14 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:213 ("walker - concurrent branches (100000 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
  26.48 ms ±   3.34 ms    24.12 ms …  32.72 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:6 ("version_vector - create (1 agent)") ok
time (mean ± σ)         range (min … max) 
   0.06 µs ±   0.00 µs     0.06 µs …   0.06 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:15 ("version_vector - create (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.35 µs ±   0.00 µs     0.35 µs …   0.36 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:29 ("version_vector - create (20 agents)") ok
time (mean ± σ)         range (min … max) 
   1.47 µs ±   0.00 µs     1.47 µs …   1.48 µs  in 10 ×  67789 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:42 ("version_vector - compare equal (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.27 µs ±   0.00 µs     0.27 µs …   0.27 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:63 ("version_vector - compare <= (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.17 µs ±   0.00 µs     0.17 µs …   0.17 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:84 ("version_vector - compare <= (20 agents)") ok
time (mean ± σ)         range (min … max) 
   0.68 µs ±   0.00 µs     0.68 µs …   0.69 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:100 ("version_vector - merge (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.53 µs ±   0.00 µs     0.53 µs …   0.54 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:118 ("version_vector - merge (20 agents)") ok
time (mean ± σ)         range (min … max) 
   2.64 µs ±   0.00 µs     2.63 µs …   2.64 µs  in 10 ×  37857 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:134 ("version_vector - includes (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.24 µs ±   0.00 µs     0.24 µs …   0.25 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:153 ("version_vector - concurrent (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.18 µs ±   0.00 µs     0.18 µs …   0.18 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:170 ("version_vector - from_frontier (10 ops)") ok
time (mean ± σ)         range (min … max) 
   0.56 µs ±   0.00 µs     0.56 µs …   0.57 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:186 ("version_vector - from_frontier (100 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.69 µs ±   0.01 µs     4.68 µs …   4.71 µs  in 10 ×  21347 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:206 ("version_vector - to_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.26 µs ±   0.00 µs     0.26 µs …   0.26 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:230 ("version_vector - roundtrip (5 agents)") ok
time (mean ± σ)         range (min … max) 
   5.05 µs ±   0.01 µs     5.04 µs …   5.05 µs  in 10 ×  19812 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:251 ("version_vector - agents (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.05 µs ±   0.00 µs     0.05 µs …   0.05 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:266 ("version_vector - length (20 agents)") ok
time (mean ± σ)         range (min … max) 
   0.01 µs ±   0.00 µs     0.01 µs …   0.01 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:20 ("bench: cache invalidate + position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 181.46 µs ±   1.22 µs   179.11 µs … 183.02 µs  in 10 ×    503 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.75 ms ±  57.24 µs     2.68 ms …   2.84 ms  in 10 ×     37 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   8.94 ms ± 312.58 µs     8.70 ms …   9.54 ms  in 10 ×     11 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:57 ("bench: 10 remote inserts + queries (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
   4.21 ms ±  30.42 µs     4.18 ms …   4.26 ms  in 10 ×     23 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:84 ("bench: 10 remote inserts + queries (5000-char doc)") ok
time (mean ± σ)         range (min … max) 
  36.14 ms ± 801.09 µs    35.22 ms …  37.42 ms  in 10 ×      3 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:113 ("bench: warm cache position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.09 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:120 ("bench: warm cache position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.09 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 162.77 µs ±   0.96 µs   161.48 µs … 164.17 µs  in 10 ×    609 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:26 ("jump - concurrent insert into 1K doc") ok
time (mean ± σ)         range (min … max) 
 157.69 µs ±   0.72 µs   156.85 µs … 159.37 µs  in 10 ×    629 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:58 ("jump - concurrent insert into 10K doc") ok
time (mean ± σ)         range (min … max) 
   4.66 ms ± 132.28 µs     4.49 ms …   4.88 ms  in 10 ×     22 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 159.00 µs ±   1.31 µs   157.99 µs … 161.45 µs  in 10 ×    596 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  40.27 µs ±   0.92 µs    39.71 µs …  42.81 µs  in 10 ×   2436 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 511.97 µs ±   3.76 µs   506.57 µs … 518.27 µs  in 10 ×    199 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:34 ("oplog - insert and delete mix (100 ops)") ok
time (mean ± σ)         range (min … max) 
  60.88 µs ±   0.46 µs    60.23 µs …  61.67 µs  in 10 ×   1644 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  28.55 µs ±   0.10 µs    28.45 µs …  28.73 µs  in 10 ×   3507 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
   0.13 µs ±   0.00 µs     0.13 µs …   0.13 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:97 ("oplog - get_frontier (single agent)") ok
time (mean ± σ)         range (min … max) 
   0.02 µs ±   0.00 µs     0.02 µs …   0.02 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:112 ("oplog - get_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
   0.03 µs ±   0.00 µs     0.03 µs …   0.03 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:134 ("oplog - walk_and_collect (100 ops)") ok
time (mean ± σ)         range (min … max) 
   9.19 µs ±   0.05 µs     9.11 µs …   9.26 µs  in 10 ×  10789 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  11.55 µs ±   0.06 µs    11.46 µs …  11.63 µs  in 10 ×   8627 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:177 ("oplog - diff_and_collect (advance 20)") ok
time (mean ± σ)         range (min … max) 
   5.15 µs ±   0.02 µs     5.12 µs …   5.19 µs  in 10 ×  19445 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   8.15 µs ±   0.04 µs     8.09 µs …   8.23 µs  in 10 ×  12870 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 231.06 µs ±   0.83 µs   229.88 µs … 232.22 µs  in 10 ×    436 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  39.80 µs ±   0.15 µs    39.62 µs …  40.04 µs  in 10 ×   2507 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 166.92 ms ±  24.75 ms   133.59 ms … 203.75 ms  in 10 ×      1 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:287 ("oplog - diff_and_collect (100000 ops advance)") ok
time (mean ± σ)         range (min … max) 
  62.94 ms ±  16.87 ms    42.15 ms …  83.80 ms  in 10 ×      2 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:10 ("text - insert append (100 chars)") ok
time (mean ± σ)         range (min … max) 
 103.05 µs ±   0.60 µs   102.09 µs … 104.15 µs  in 10 ×    861 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.47 ms ±  66.57 µs     1.41 ms …   1.59 ms  in 10 ×     64 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 163.25 µs ±   0.69 µs   161.99 µs … 163.99 µs  in 10 ×    605 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:51 ("text - delete (100 deletes from 100-char doc)") ok
time (mean ± σ)         range (min … max) 
 251.66 µs ±   1.37 µs   249.77 µs … 253.65 µs  in 10 ×    393 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.75 µs ±   0.16 µs    13.59 µs …  13.98 µs  in 10 ×   7163 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 140.59 µs ±   0.52 µs   139.98 µs … 141.71 µs  in 10 ×    695 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
   0.01 µs ±   0.00 µs     0.01 µs …   0.01 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:113 ("text - sync export_all (100 ops)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.10 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:126 ("text - sync export_all (1000 ops)") ok
time (mean ± σ)         range (min … max) 
   0.10 µs ±   0.00 µs     0.10 µs …   0.10 µs  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:139 ("text - sync export_since (50-op delta, 1000-op base)") ok
time (mean ± σ)         range (min … max) 
  36.32 µs ±   0.12 µs    36.15 µs …  36.52 µs  in 10 ×   2748 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  53.01 µs ±   0.13 µs    52.82 µs …  53.17 µs  in 10 ×   1885 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 701.70 µs ±   4.82 µs   694.66 µs … 706.66 µs  in 10 ×    144 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:186 ("text - bidirectional sync (2 peers, 50 ops each)") ok
time (mean ± σ)         range (min … max) 
 112.64 µs ±   0.50 µs   112.11 µs … 113.84 µs  in 10 ×    881 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  13.97 µs ±   0.13 µs    13.86 µs …  14.22 µs  in 10 ×   7093 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 155.82 µs ±   0.98 µs   154.65 µs … 157.86 µs  in 10 ×    645 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:256 ("text - undo record_insert (100 ops, 1 group)") ok
time (mean ± σ)         range (min … max) 
   2.02 µs ±   0.00 µs     2.01 µs …   2.02 µs  in 10 ×  49256 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:269 ("text - undo record_insert (100 ops, 100 groups)") ok
time (mean ± σ)         range (min … max) 
   2.43 µs ±   0.01 µs     2.42 µs …   2.46 µs  in 10 ×  41217 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  30.91 µs ±   0.22 µs    30.58 µs …  31.22 µs  in 10 ×   3213 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 484.02 µs ±   1.61 µs   481.26 µs … 487.00 µs  in 10 ×    210 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:309 ("text - undo undo+redo roundtrip (10-op group)") ok
time (mean ± σ)         range (min … max) 
  34.65 µs ±   0.14 µs    34.51 µs …  34.88 µs  in 10 ×   2869 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:324 ("text - undo 10 undo+redo cycles (10-op group)") ok
time (mean ± σ)         range (min … max) 
 293.73 µs ±   1.53 µs   291.39 µs … 296.06 µs  in 10 ×    341 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.48 ms ±  29.76 µs     1.42 ms …   1.50 ms  in 10 ×     71 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.53 ms ±  40.36 µs     3.47 ms …   3.58 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.12 ms ±  38.41 µs     2.05 ms …   2.16 ms  in 10 ×     49 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:71 ("cache - jump to middle every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.84 ms ±  18.61 µs     2.81 ms …   2.87 ms  in 10 ×     36 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:94 ("cache - single non-seq insert on 1000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.56 µs ±   1.02 µs     6.48 µs …  10.11 µs  in 10 ×  15688 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:108 ("cache - single non-seq insert on 5000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.19 µs ±   1.14 µs     6.00 µs …   9.79 µs  in 10 ×  15469 runs
Total tests: 104, passed: 104, failed: 0.

Benchmarks run with --release flag

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

https://github.com/dowdiness/canopy/blob/03be099a15832cdc818d95f89acc2a26d1d2faa5/loom/examples/lambda/src/typecheck/typecheck.mbt#L90-L92
P1 Badge Guard DefId lookups against stale encounter_order reuse

In build_typecheck_pipeline_with_index, the MemoMap resolver uses entry.encounter_order as a direct index into state.type_memos without verifying that the slot still corresponds to entry.name. After a structural edit that rebuilds the chain (for example renaming/removing/reordering defs), old InternIds remain valid in the grow-only InternTable but can now read a different definition’s type at the same index, returning silently incorrect results instead of an error. This breaks the query-by-id contract and can surface wrong types to callers that cache IDs across edits.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@dowdiness dowdiness merged commit 51bc092 into main Apr 15, 2026
16 checks passed
@dowdiness dowdiness deleted the feat/boundary3-bidirectional-typechecker branch April 15, 2026 14:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant