Skip to content

Fix DuplicateBinding reparse soundness#696

Merged
dowdiness merged 1 commit into
mainfrom
fix/649-650-duplicate-binding
Jun 17, 2026
Merged

Fix DuplicateBinding reparse soundness#696
dowdiness merged 1 commit into
mainfrom
fix/649-650-duplicate-binding

Conversation

@dowdiness

@dowdiness dowdiness commented Jun 17, 2026

Copy link
Copy Markdown
Owner

Summary

Fixes #649.
Addresses the DuplicateBinding portion of #650; move/delete indentation remains tracked by #650.

Reuse check

  • Reused @scope.enclosing_env to avoid names visible at the duplicated binding.
  • Reused scope declarations and existing binding rewrite helpers (binding_rewrite_source, renamed_text) to preserve original source syntax.
  • Checked @scope.declaration_for_name_at / @scope.scope_for_node; not used directly for fresh-name generation because duplicate needs a scope-wide collision set, not a single name lookup.

Validation

NEW_MOON_MOD=0 moon check lang/lambda/edits lang/lambda/scope
NEW_MOON_MOD=0 moon test lang/lambda/edits lang/lambda/scope
NEW_MOON_MOD=0 moon fmt && NEW_MOON_MOD=0 moon info
NEW_MOON_MOD=0 moon check lang/lambda/edits lang/lambda/scope
NEW_MOON_MOD=0 moon test lang/lambda/edits lang/lambda/scope
git diff --check

Targeted tests passed: Total tests: 226, passed: 226, failed: 0.

Note: git submodule update --init --recursive could not clone nested rabbita/templates/rabbita-template over SSH in this environment, but the submodules required for the targeted MoonBit validation initialized successfully.

Summary by CodeRabbit

  • Bug Fixes

    • Fixed block-local binding duplication to correctly preserve indentation and ensure generated code reparses properly.
  • Improvements

    • Enhanced duplicate binding naming mechanism to automatically generate collision-free identifiers instead of using fixed suffixes, preventing conflicts within the current scope.

@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

compute_duplicate_binding is rewritten to use a new fresh-name mechanism (base name + incrementing digit suffix) instead of the unlexable _copy suffix, and now computes correct leading indentation for block-local duplicates. Three new helpers are added. All related whitebox tests are updated to assert lexability, reparse correctness, collision skipping, and proper block indentation. The previously noted caveats in docs/TODO.md are removed.

Changes

DuplicateBinding: fresh names and block indentation

Layer / File(s) Summary
Helper functions and compute_duplicate_binding rewrite
lang/lambda/edits/text_edit_binding.mbt
Adds decl_names_in_scope, fresh_name (base+N digit loop), and leading_indent helpers. Rewrites compute_duplicate_binding to derive a collision-free lexable name via fresh_name and to splice the duplicated text with correct leading indentation for block-local bindings.
Root-scope duplicate tests and TODO cleanup
lang/lambda/edits/text_edit_wbtest.mbt, docs/TODO.md
Updates root-scope DuplicateBinding tests to expect numeric suffixes (x1, twice1), adds reparse assertions and a collision-skip test (x1 present → x2), and removes the resolved unsoundness caveat from docs/TODO.md.
Block-local duplicate tests
lang/lambda/edits/text_edit_wbtest.mbt
Adds a new block-local test confirming a1 generation and correct nested block structure after reparse; reworks the existing block-local suffix-collision test (a1 present → a2) to assert indentation, ordering, and structural correctness via reparse.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 No more _copy causing a fright,
Fresh digits appended, the names are right!
Block-local indents now line up neat,
Reparsing the output — no corrupted feat.
The TODO grows shorter, the caveats gone,
A cleaner duplicate hops along! 🌿

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Fix DuplicateBinding reparse soundness' directly summarizes the main change: fixing the DuplicateBinding operation to produce valid, lexable code that reparses correctly.
Linked Issues check ✅ Passed All coding requirements from issues #649 and #650 are met: DuplicateBinding now generates lexable numeric-suffix names via a fresh-name mechanism, reparse-gate tests verify AST structure, collision handling is tested, and block-local duplicates are re-indented correctly.
Out of Scope Changes check ✅ Passed All changes are directly scoped to fixing DuplicateBinding: helper functions support fresh-name generation and re-indentation logic, tests verify both reparse correctness and numeric-suffix collisions, and the resolved TODO reflects the fix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/649-650-duplicate-binding

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

cloudflare-workers-and-pages Bot commented Jun 17, 2026

Copy link
Copy Markdown

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 9398bd1 Commit Preview URL

Branch Preview URL
Jun 17 2026, 10:43 AM

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4086540c02

ℹ️ 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".

Comment thread lang/lambda/edits/text_edit_binding.mbt Outdated
@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown

Benchmark Comparison Report

Comparing PR branch against main

Main Module Benchmarks

Base branch:

[dowdiness/btree] bench btree_benchmark.mbt:79 ("bench: build via inserts (100)") ok
time (mean ± σ)         range (min … max) 
  60.69 µs ± 633.08 ns    59.80 µs …  62.17 µs  in 10 ×   1601 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   2.81 µs ±   7.99 ns     2.81 µs …   2.83 µs  in 10 ×  39558 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
 931.82 µs ±   7.89 µs   921.98 µs … 944.14 µs  in 10 ×    100 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  23.84 µs ±  94.00 ns    23.76 µs …  24.01 µs  in 10 ×   4210 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  14.03 ms ± 108.07 µs    13.92 ms …  14.19 ms  in 10 ×      8 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 475.26 µs ±   9.46 µs   462.63 µs … 491.12 µs  in 10 ×    212 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  49.35 µs ± 253.30 ns    49.10 µs …  49.81 µs  in 10 ×   1989 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  44.27 µs ±  55.66 ns    44.21 µs …  44.38 µs  in 10 ×   2254 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 634.36 µs ±   2.22 µs   631.17 µs … 637.51 µs  in 10 ×    159 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 647.78 µs ±   4.83 µs   640.59 µs … 655.20 µs  in 10 ×    155 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:44 ("bench/incr_tap/snapshot_fanout_256") ok
time (mean ± σ)         range (min … max) 
  55.85 µs ±   1.14 µs    55.14 µs …  58.91 µs  in 10 ×   1700 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 564.68 µs ±   1.71 µs   562.65 µs … 567.36 µs  in 10 ×    177 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:58 ("bench/incr_tap/to_visual_graph_fanout_256") ok
time (mean ± σ)         range (min … max) 
 115.44 µs ± 147.02 ns   115.18 µs … 115.71 µs  in 10 ×    865 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:64 ("bench/incr_tap/to_visual_graph_fanout_2048") ok
time (mean ± σ)         range (min … max) 
   1.08 ms ±   2.34 µs     1.08 ms …   1.08 ms  in 10 ×     93 runs
Total tests: 14, passed: 14, failed: 0. [wasm-gc]
node count: 402
node count: 802
node count: 2002
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:32 ("viewnode serialization (100 defs)") ok
time (mean ± σ)         range (min … max) 
   1.46 ms ±  29.15 µs     1.41 ms …   1.51 ms  in 10 ×     69 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:43 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   3.31 ms ±  44.50 µs     3.25 ms …   3.37 ms  in 10 ×     31 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:54 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  14.78 ms ± 676.51 µs    13.79 ms …  15.68 ms  in 10 ×      8 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:65 ("compute_view_patches (100 defs, single edit)") ok
time (mean ± σ)         range (min … max) 
   1.35 ms ±  61.04 µs     1.29 ms …   1.43 ms  in 10 ×     75 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.02 ms ±  47.84 µs   949.58 µs …   1.09 ms  in 10 ×     91 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.06 ms ±  31.83 µs     4.02 ms …   4.10 ms  in 10 ×     23 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  27.08 ms ± 285.25 µs    26.74 ms …  27.47 ms  in 10 ×      4 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:113 ("json object - incremental keystroke (1000 members)") ok
time (mean ± σ)         range (min … max) 
  62.72 ms ±   1.01 ms    61.96 ms …  65.37 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) 
 763.14 µs ± 150.15 µs   545.21 µs … 960.75 µs  in 10 ×    208 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   1.94 ms ±  49.35 µs     1.88 ms …   2.02 ms  in 10 ×     55 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  12.92 ms ±  32.67 µs    12.88 ms …  12.97 ms  in 10 ×      8 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:133 ("json array - incremental keystroke (1000 elements)") ok
time (mean ± σ)         range (min … max) 
  31.93 ms ± 253.12 µs    31.57 ms …  32.21 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:95 ("text intent dispatch - direct call (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.85 ms ±  78.66 µs     3.77 ms …   4.03 ms  in 10 ×     27 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:100 ("text intent dispatch - caps field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.82 ms ±  28.37 µs     3.78 ms …   3.85 ms  in 10 ×     27 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:105 ("text intent dispatch - caps optional field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.83 ms ±  25.00 µs     3.79 ms …   3.88 ms  in 10 ×     27 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:110 ("text intent dispatch - direct call (1000 members)") ok
time (mean ± σ)         range (min … max) 
  51.42 ms ±   2.12 ms    50.06 ms …  57.36 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:115 ("text intent dispatch - caps field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  50.88 ms ± 400.16 µs    50.13 ms …  51.24 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:120 ("text intent dispatch - caps optional field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  51.04 ms ± 472.10 µs    50.21 ms …  51.62 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:143 ("isolated dispatch - direct call x1000") ok
time (mean ± σ)         range (min … max) 
 670.75 ns ±   2.68 ns   665.77 ns … 675.00 ns  in 10 × 100000 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:154 ("isolated dispatch - caps field x1000") ok
time (mean ± σ)         range (min … max) 
 676.53 ns ±   3.29 ns   672.76 ns … 683.72 ns  in 10 × 100000 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:169 ("isolated dispatch - caps optional field x1000") ok
time (mean ± σ)         range (min … max) 
 683.98 ns ±   6.05 ns   675.88 ns … 691.22 ns  in 10 × 100000 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:38 ("tree refresh unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
   5.54 µs ±  15.26 ns     5.52 µs …   5.57 µs  in 10 ×  17395 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  24.87 µs ±  75.17 ns    24.80 µs …  25.05 µs  in 10 ×   3775 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 108.88 µs ±   2.00 µs   107.80 µs … 114.33 µs  in 10 ×    913 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 458.64 µs ±   1.10 µs   457.33 µs … 460.29 µs  in 10 ×    218 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.37 µs ±  18.42 ns    11.34 µs …  11.40 µs  in 10 ×   8811 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 221.89 µs ± 878.69 ns   220.63 µs … 223.32 µs  in 10 ×    453 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 762.22 µs ±   2.51 µs   759.61 µs … 767.38 µs  in 10 ×    120 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  48.89 µs ± 115.29 ns    48.76 µs …  49.11 µs  in 10 ×   2030 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  17.26 µs ±  78.71 ns    17.17 µs …  17.41 µs  in 10 ×   5782 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 126.55 µs ± 235.00 ns   126.12 µs … 126.88 µs  in 10 ×    793 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:71 ("reconcile wide-siblings (320 defs)") ok
time (mean ± σ)         range (min … max) 
   1.47 ms ±   7.75 µs     1.47 ms …   1.49 ms  in 10 ×     68 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.65 ms ±  22.09 µs    13.62 ms …  13.69 ms  in 10 ×      8 runs
Total tests: 33, passed: 33, failed: 0. [js]
Warning: no test entry found.
Total tests: 0, passed: 0, failed: 0. [native]

PR branch:

Registry index updated successfully
Symbols updated successfully
Downloading dowdiness/rle@0.2.2
Downloading dowdiness/incr@0.9.0
Using cached moonbitlang/quickcheck@0.14.0
Using cached moonbitlang/async@0.16.8
Using cached moonbitlang/x@0.4.38
[dowdiness/btree] bench btree_benchmark.mbt:79 ("bench: build via inserts (100)") ok
time (mean ± σ)         range (min … max) 
  61.93 µs ± 777.14 ns    60.82 µs …  63.32 µs  in 10 ×   1563 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   2.81 µs ±  11.76 ns     2.79 µs …   2.83 µs  in 10 ×  39674 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
 940.25 µs ±   5.94 µs   930.40 µs … 947.97 µs  in 10 ×     99 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  24.58 µs ± 590.21 ns    23.83 µs …  25.11 µs  in 10 ×   4002 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  14.15 ms ± 168.85 µs    14.02 ms …  14.59 ms  in 10 ×      8 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 477.51 µs ±  14.84 µs   467.07 µs … 517.36 µs  in 10 ×    208 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  49.17 µs ± 297.46 ns    48.88 µs …  49.78 µs  in 10 ×   2001 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  45.33 µs ±   2.30 µs    44.44 µs …  51.85 µs  in 10 ×   2230 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 631.79 µs ±   4.12 µs   627.76 µs … 640.70 µs  in 10 ×    158 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 636.43 µs ±  10.60 µs   624.43 µs … 653.04 µs  in 10 ×    157 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:44 ("bench/incr_tap/snapshot_fanout_256") ok
time (mean ± σ)         range (min … max) 
  56.93 µs ±   1.45 µs    55.91 µs …  60.41 µs  in 10 ×   1673 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 561.35 µs ±   2.53 µs   558.03 µs … 564.65 µs  in 10 ×    180 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:58 ("bench/incr_tap/to_visual_graph_fanout_256") ok
time (mean ± σ)         range (min … max) 
 116.62 µs ±   2.67 µs   115.10 µs … 123.10 µs  in 10 ×    868 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:64 ("bench/incr_tap/to_visual_graph_fanout_2048") ok
time (mean ± σ)         range (min … max) 
   1.09 ms ±   7.31 µs     1.08 ms …   1.10 ms  in 10 ×     92 runs
Total tests: 14, passed: 14, failed: 0. [wasm-gc]
node count: 402
node count: 802
node count: 2002
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:32 ("viewnode serialization (100 defs)") ok
time (mean ± σ)         range (min … max) 
   1.37 ms ±   9.71 µs     1.36 ms …   1.39 ms  in 10 ×     73 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:43 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   3.31 ms ±  53.51 µs     3.21 ms …   3.38 ms  in 10 ×     31 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:54 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  15.97 ms ±   1.77 ms    13.99 ms …  18.53 ms  in 10 ×      7 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:65 ("compute_view_patches (100 defs, single edit)") ok
time (mean ± σ)         range (min … max) 
   1.38 ms ±  99.30 µs     1.28 ms …   1.59 ms  in 10 ×     74 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.06 ms ±  44.36 µs   991.25 µs …   1.13 ms  in 10 ×     79 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.08 ms ±  50.52 µs     4.01 ms …   4.17 ms  in 10 ×     25 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  26.92 ms ± 206.09 µs    26.72 ms …  27.46 ms  in 10 ×      4 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:113 ("json object - incremental keystroke (1000 members)") ok
time (mean ± σ)         range (min … max) 
  60.95 ms ±   2.41 ms    60.01 ms …  67.77 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) 
 784.21 µs ± 159.53 µs   557.56 µs … 997.41 µs  in 10 ×    211 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   1.95 ms ±  56.99 µs     1.88 ms …   2.03 ms  in 10 ×     54 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  12.85 ms ±  42.70 µs    12.76 ms …  12.90 ms  in 10 ×      8 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:133 ("json array - incremental keystroke (1000 elements)") ok
time (mean ± σ)         range (min … max) 
  33.92 ms ±   2.87 ms    32.72 ms …  42.01 ms  in 10 ×      4 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:95 ("text intent dispatch - direct call (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.86 ms ±  35.75 µs     3.82 ms …   3.94 ms  in 10 ×     26 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:100 ("text intent dispatch - caps field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.85 ms ±  28.99 µs     3.82 ms …   3.91 ms  in 10 ×     26 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:105 ("text intent dispatch - caps optional field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.83 ms ±  46.68 µs     3.79 ms …   3.95 ms  in 10 ×     27 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:110 ("text intent dispatch - direct call (1000 members)") ok
time (mean ± σ)         range (min … max) 
  49.82 ms ±   1.64 ms    48.53 ms …  54.05 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:115 ("text intent dispatch - caps field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  49.28 ms ± 588.85 µs    48.47 ms …  49.93 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:120 ("text intent dispatch - caps optional field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  49.86 ms ±   1.86 ms    48.21 ms …  54.36 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:143 ("isolated dispatch - direct call x1000") ok
time (mean ± σ)         range (min … max) 
 679.53 ns ±   4.34 ns   670.89 ns … 686.14 ns  in 10 × 100000 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:154 ("isolated dispatch - caps field x1000") ok
time (mean ± σ)         range (min … max) 
 683.92 ns ±   9.18 ns   674.22 ns … 700.25 ns  in 10 × 100000 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:169 ("isolated dispatch - caps optional field x1000") ok
time (mean ± σ)         range (min … max) 
 684.81 ns ±   9.11 ns   671.23 ns … 695.36 ns  in 10 × 100000 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:38 ("tree refresh unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
   5.87 µs ±  11.68 ns     5.86 µs …   5.90 µs  in 10 ×  16473 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  23.94 µs ±  73.55 ns    23.86 µs …  24.11 µs  in 10 ×   3888 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 105.76 µs ±   1.76 µs   104.82 µs … 110.68 µs  in 10 ×    938 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 418.04 µs ±   2.04 µs   415.26 µs … 421.71 µs  in 10 ×    239 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.42 µs ± 607.87 ns    11.10 µs …  13.03 µs  in 10 ×   8992 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 210.33 µs ± 828.83 ns   209.68 µs … 212.03 µs  in 10 ×    477 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 788.80 µs ±   2.41 µs   785.68 µs … 794.12 µs  in 10 ×    127 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  46.41 µs ± 100.56 ns    46.24 µs …  46.58 µs  in 10 ×   2164 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  17.11 µs ±  98.64 ns    16.98 µs …  17.25 µs  in 10 ×   5895 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 127.78 µs ± 208.16 ns   127.59 µs … 128.29 µs  in 10 ×    782 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:71 ("reconcile wide-siblings (320 defs)") ok
time (mean ± σ)         range (min … max) 
   1.48 ms ±   3.70 µs     1.47 ms …   1.48 ms  in 10 ×     68 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.63 ms ±  26.39 µs    13.60 ms …  13.67 ms  in 10 ×      8 runs
Total tests: 33, passed: 33, failed: 0. [js]
Warning: no test entry found.
Total tests: 0, passed: 0, failed: 0. [native]

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) 
  19.93 µs ± 789.04 ns    19.21 µs …  21.49 µs  in 10 ×   4801 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) 
 102.63 µs ± 110.32 ns   102.47 µs … 102.84 µs  in 10 ×    972 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) 
 452.66 µs ±   3.26 µs   450.70 µs … 461.59 µs  in 10 ×    223 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) 
 132.71 µs ± 346.27 ns   132.36 µs … 133.36 µs  in 10 ×    754 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) 
  96.06 µs ± 275.63 ns    95.80 µs …  96.51 µs  in 10 ×   1046 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) 
  66.36 µs ± 188.80 ns    66.10 µs …  66.60 µs  in 10 ×   1503 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) 
 100.64 µs ± 219.68 ns   100.38 µs … 101.07 µs  in 10 ×    996 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) 
 209.04 µs ± 668.01 ns   208.28 µs … 209.95 µs  in 10 ×    478 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) 
  44.23 µs ±  25.75 µs    26.21 µs …  99.84 µs  in 10 ×   2348 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   3.81 µs ±  15.95 ns     3.80 µs …   3.85 µs  in 10 ×  25913 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  30.25 µs ±  61.05 ns    30.16 µs …  30.32 µs  in 10 ×   3312 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 414.34 µs ±   1.44 µs   412.24 µs … 416.03 µs  in 10 ×    241 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  11.64 µs ±   3.68 µs     8.80 µs …  18.12 µs  in 10 ×   8814 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  92.08 µs ±  50.01 µs    58.61 µs … 176.05 µs  in 10 ×   1182 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  36.20 µs ± 171.98 ns    36.00 µs …  36.44 µs  in 10 ×   2772 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  36.05 µs ±  63.60 ns    35.96 µs …  36.17 µs  in 10 ×   2775 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.78 µs ± 538.63 ns    25.24 µs …  26.97 µs  in 10 ×   3895 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.30 ms ±   3.76 ms     2.65 ms …  13.25 ms  in 10 ×     69 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  11.11 µs ±  66.10 ns    11.05 µs …  11.24 µs  in 10 ×   8908 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 114.11 µs ± 383.13 ns   113.61 µs … 114.67 µs  in 10 ×    882 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.85 µs ± 317.22 ns     3.64 µs …   4.64 µs  in 10 ×  26748 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  51.26 µs ±  29.06 µs    30.90 µs … 116.19 µs  in 10 ×   2812 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  19.16 ms ±   6.66 ms     9.21 ms …  27.66 ms  in 10 ×     21 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  15.02 µs ±   4.38 µs    12.19 µs …  26.80 µs  in 10 ×   7362 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 649.79 ns ±   8.02 ns   637.94 ns … 657.69 ns  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.78 µs ±   6.42 ns     4.77 µs …   4.79 µs  in 10 ×  20846 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  43.12 µs ± 385.21 ns    42.59 µs …  43.80 µs  in 10 ×   2313 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) 
   5.99 µs ±  10.92 ns     5.97 µs …   6.00 µs  in 10 ×  16650 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) 
   5.94 µs ±  12.95 ns     5.92 µs …   5.96 µs  in 10 ×  16882 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.16 µs ±  10.78 ns     8.15 µs …   8.19 µs  in 10 ×  12197 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.43 µs ±   4.52 ns     3.43 µs …   3.44 µs  in 10 ×  29122 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.53 µs ±   9.87 ns     5.52 µs …   5.55 µs  in 10 ×  18088 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 443.29 µs ±   1.02 µs   441.98 µs … 444.97 µs  in 10 ×    225 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   6.75 ms ±  66.86 µs     6.68 ms …   6.88 ms  in 10 ×     15 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) 
  23.19 ms ±   3.34 ms    20.52 ms …  28.78 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) 
  49.36 ns ±   0.37 ns    48.62 ns …  49.64 ns  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) 
 139.73 ns ±   0.67 ns   139.00 ns … 140.91 ns  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.05 µs ±   1.23 ns     1.04 µs …   1.05 µs  in 10 ×  95585 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) 
 173.52 ns ±   0.45 ns   172.90 ns … 174.27 ns  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) 
 122.62 ns ±   0.52 ns   122.02 ns … 123.47 ns  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) 
 471.99 ns ±   0.41 ns   471.37 ns … 472.66 ns  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) 
 205.24 ns ±   0.40 ns   204.76 ns … 205.96 ns  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) 
   1.28 µs ±   2.30 ns     1.28 µs …   1.28 µs  in 10 ×  78448 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) 
 144.98 ns ±   0.63 ns   144.05 ns … 145.84 ns  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) 
 123.61 ns ±   0.33 ns   123.11 ns … 124.02 ns  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) 
 575.12 ns ±   1.26 ns   573.22 ns … 577.10 ns  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.86 µs ±   8.25 ns     4.85 µs …   4.87 µs  in 10 ×  20575 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) 
 198.80 ns ±   0.74 ns   197.96 ns … 200.26 ns  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.01 µs ±  22.19 ns     4.99 µs …   5.06 µs  in 10 ×  19993 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) 
  69.83 ns ±   0.52 ns    68.83 ns …  70.31 ns  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) 
  14.65 ns ±   0.33 ns    14.33 ns …  15.37 ns  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) 
 182.34 µs ±   1.09 µs   181.11 µs … 184.67 µs  in 10 ×    509 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.72 ms ±  48.19 µs     2.68 ms …   2.81 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.91 ms ± 177.66 µs     8.77 ms …   9.31 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) 
   3.30 ms ±  28.01 µs     3.26 ms …   3.34 ms  in 10 ×     29 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) 
  29.54 ms ± 542.59 µs    28.63 ms …  30.41 ms  in 10 ×      4 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) 
  91.56 ns ±   0.52 ns    91.04 ns …  92.60 ns  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) 
  92.04 ns ±   0.30 ns    91.76 ns …  92.75 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/fugue/tree_position_benchmark.mbt:20 ("bench: lv_to_position middle of 10K tree") ok
time (mean ± σ)         range (min … max) 
 522.95 µs ±   2.05 µs   520.71 µs … 526.21 µs  in 10 ×    192 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 151.82 µs ±   1.04 µs   150.39 µs … 153.21 µs  in 10 ×    657 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) 
 147.95 µs ± 312.04 ns   147.48 µs … 148.39 µs  in 10 ×    672 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.24 ms ± 100.45 µs     4.08 ms …   4.35 ms  in 10 ×     24 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 148.13 µs ± 255.37 ns   147.77 µs … 148.53 µs  in 10 ×    672 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  41.22 µs ± 685.72 ns    40.72 µs …  42.92 µs  in 10 ×   2395 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 476.80 µs ±   1.53 µs   474.71 µs … 478.55 µs  in 10 ×    210 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.13 µs ± 377.41 ns    59.64 µs …  60.69 µs  in 10 ×   1677 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  28.48 µs ±  82.10 ns    28.40 µs …  28.66 µs  in 10 ×   3522 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 186.63 ns ±   0.72 ns   186.03 ns … 187.95 ns  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) 
  20.19 ns ±   0.29 ns    19.83 ns …  20.60 ns  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) 
  24.71 ns ±   0.27 ns    24.20 ns …  24.99 ns  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) 
  11.29 µs ±  97.43 ns    11.18 µs …  11.44 µs  in 10 ×   8754 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  18.96 µs ±  54.51 ns    18.84 µs …  19.01 µs  in 10 ×   5121 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.40 µs ±   8.87 ns     5.39 µs …   5.42 µs  in 10 ×  18498 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   8.64 µs ±  27.79 ns     8.61 µs …   8.69 µs  in 10 ×  11857 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 224.02 µs ± 614.52 ns   223.14 µs … 224.83 µ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) 
  41.25 µs ± 538.75 ns    40.77 µs …  42.68 µs  in 10 ×   2425 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 147.78 ms ±  23.85 ms   113.91 ms … 174.63 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) 
  65.45 ms ±  16.87 ms    45.06 ms …  83.67 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) 
  91.76 µs ± 278.79 ns    91.45 µs …  92.24 µs  in 10 ×    945 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.23 ms ±   6.71 µs     1.22 ms …   1.24 ms  in 10 ×     82 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 153.37 µs ± 625.40 ns   152.51 µs … 154.16 µs  in 10 ×    649 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) 
 226.02 µs ± 583.67 ns   225.21 µs … 226.88 µs  in 10 ×    441 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.40 µs ±  92.25 ns    13.31 µs …  13.55 µs  in 10 ×   7330 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 139.20 µs ± 355.97 ns   138.70 µs … 139.71 µs  in 10 ×    719 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  12.92 ns ±   0.32 ns    12.67 ns …  13.42 ns  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) 
  92.02 ns ±   0.50 ns    91.48 ns …  93.21 ns  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) 
  93.72 ns ±   0.68 ns    92.88 ns …  95.11 ns  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) 
  33.47 µs ± 441.54 ns    33.06 µs …  34.32 µs  in 10 ×   2910 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  51.15 µs ± 427.97 ns    50.55 µs …  51.71 µs  in 10 ×   1932 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 617.52 µs ± 651.25 ns   616.91 µs … 619.07 µs  in 10 ×    162 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) 
 106.06 µs ± 169.34 ns   105.81 µs … 106.38 µs  in 10 ×    944 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  14.07 µs ±  80.74 ns    13.97 µs …  14.22 µs  in 10 ×   7055 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 168.24 µs ±   2.13 µs   166.61 µs … 173.48 µs  in 10 ×    597 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.08 µs ±   7.37 ns     2.07 µs …   2.09 µs  in 10 ×  47965 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.40 µs ±  15.42 ns     2.38 µs …   2.43 µs  in 10 ×  41552 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  28.22 µs ± 162.42 ns    28.11 µs …  28.65 µs  in 10 ×   3535 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 448.38 µs ±   1.20 µs   446.66 µs … 450.34 µs  in 10 ×    222 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) 
  31.99 µs ±  42.02 ns    31.93 µs …  32.05 µs  in 10 ×   3120 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) 
 275.39 µs ± 717.26 ns   274.52 µs … 276.71 µs  in 10 ×    362 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.24 ms ±   4.31 µs     1.24 ms …   1.25 ms  in 10 ×     81 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.91 ms ±  21.71 µs     2.88 ms …   2.95 ms  in 10 ×     35 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) 
   1.88 ms ±  16.38 µs     1.86 ms …   1.92 ms  in 10 ×     54 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.46 ms ±   8.18 µs     2.45 ms …   2.47 ms  in 10 ×     41 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.33 µs ±   1.97 µs     5.82 µs …  11.92 µs  in 10 ×  15066 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.51 µs ±   1.00 µs     5.88 µs …   9.25 µs  in 10 ×  17689 runs
Total tests: 105, passed: 105, failed: 0.

PR branch:

Registry index updated successfully
Symbols updated successfully
Using cached moonbitlang/quickcheck@0.14.0
Downloading dowdiness/order-tree@0.1.0
Downloading dowdiness/alga@0.3.0
Downloading dowdiness/btree@0.1.0
Using cached dowdiness/rle@0.2.2
Warning: [0020]
      ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/container/document.mbt:1178:47 ]
      │
 1178 │   let _result : Result[Unit, DocumentError] = try? self.with_implicit_transaction(() => {
      │                                               ──┬─  
      │                                                 ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
──────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/container/undo_test.mbt:117:16 ]
     │
 117 │   let result = try? doc.transaction(() => {
     │                ──┬─  
     │                  ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
─────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/branch/delete_index_test.mbt:37:49 ]
    │
 37 │   let empty_retreat : @rle.Rle[@core.LvRange] = @rle.Rle::new()
    │                                                 ──────┬──────  
    │                                                       ╰──────── Warning (deprecated): Use Rle::Rle() instead
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/causal_graph/walker.mbt:85:5 ]
    │
 85 │     @rle.Rle::new()
    │     ──────┬──────  
    │           ╰──────── Warning (deprecated): Use Rle::Rle() instead
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/causal_graph/walker.mbt:90:5 ]
    │
 90 │     @rle.Rle::new()
    │     ──────┬──────  
    │           ╰──────── Warning (deprecated): Use Rle::Rle() instead
────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/core/op_run_wbtest.mbt:352:31 ]
     │
 352 │   let rle : @rle.Rle[OpRun] = @rle.Rle::new()
     │                               ──────┬──────  
     │                                     ╰──────── Warning (deprecated): Use Rle::Rle() instead
─────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/core/op_run_wbtest.mbt:379:31 ]
     │
 379 │   let rle : @rle.Rle[OpRun] = @rle.Rle::new()
     │                               ──────┬──────  
     │                                     ╰──────── Warning (deprecated): Use Rle::Rle() instead
─────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/document/document_test.mbt:30:46 ]
    │
 30 │   let result : Result[Unit, DocumentError] = try? doc.apply_remote(
    │                                              ──┬─  
    │                                                ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/document/unicode_safety_wbtest.mbt:99:46 ]
    │
 99 │   let result : Result[Unit, DocumentError] = try? doc.apply_remote(op0)
    │                                              ──┬─  
    │                                                ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/document/unicode_safety_wbtest.mbt:118:46 ]
     │
 118 │   let result : Result[Unit, DocumentError] = try? doc.apply_remote(op0)
     │                                              ──┬─  
     │                                                ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
─────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/document/unicode_safety_wbtest.mbt:132:46 ]
     │
 132 │   let result : Result[Unit, DocumentError] = try? doc.apply_remote(op0)
     │                                              ──┬─  
     │                                                ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
─────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/document/visible_run_wbtest.mbt:56:36 ]
    │
 56 │   let rle : @rle.Rle[VisibleRun] = @rle.Rle::new()
    │                                    ──────┬──────  
    │                                          ╰──────── Warning (deprecated): Use Rle::Rle() instead
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/document/visible_run_wbtest.mbt:67:36 ]
    │
 67 │   let rle : @rle.Rle[VisibleRun] = @rle.Rle::new()
    │                                    ──────┬──────  
    │                                          ╰──────── Warning (deprecated): Use Rle::Rle() instead
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/document/visible_run_wbtest.mbt:77:36 ]
    │
 77 │   let rle : @rle.Rle[VisibleRun] = @rle.Rle::new()
    │                                    ──────┬──────  
    │                                          ╰──────── Warning (deprecated): Use Rle::Rle() instead
────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/fugue/tree_properties_test.mbt:488:52 ]
     │
 488 │     let result : Result[Unit, @fugue.FugueError] = try? tree.delete(
     │                                                    ──┬─  
     │                                                      ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
─────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog.mbt:16:17 ]
    │
 16 │     operations: @rle.Rle::new(),
    │                 ──────┬──────  
    │                       ╰──────── Warning (deprecated): Use Rle::Rle() instead
────╯
Warning: [0020]
   ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:9:43 ]
   │
 9 │   let result : Result[Unit, OpLogError] = try? oplog.validate_remote_batch(
   │                                           ──┬─  
   │                                             ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
───╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:36:43 ]
    │
 36 │   let result : Result[Unit, OpLogError] = try? oplog.validate_remote_batch(
    │                                           ──┬─  
    │                                             ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:57:43 ]
    │
 57 │   let result : Result[Unit, OpLogError] = try? oplog.validate_remote_batch(
    │                                           ──┬─  
    │                                             ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:70:43 ]
    │
 70 │   let result : Result[Unit, OpLogError] = try? oplog.validate_remote_batch(
    │                                           ──┬─  
    │                                             ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
────╯
Warning: [0020]
    ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:90:43 ]
    │
 90 │   let result : Result[Unit, OpLogError] = try? oplog.validate_remote_batch(
    │                                           ──┬─  
    │                                             ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:106:43 ]
     │
 106 │   let result : Result[Unit, OpLogError] = try? oplog.validate_remote_batch(
     │                                           ──┬─  
     │                                             ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
─────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:118:54 ]
     │
 118 │   let result : Result[Array[@core.Op], OpLogError] = try? oplog.apply_remote(
     │                                                      ──┬─  
     │                                                        ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
─────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/internal/oplog/oplog_test.mbt:134:54 ]
     │
 134 │   let result : Result[Array[@core.Op], OpLogError] = try? oplog.apply_remote(op)
     │                                                      ──┬─  
     │                                                        ╰─── Warning (deprecated): `try?` is deprecated.

Do not mechanically replace this with:
  try expr |> Ok catch { e => Err(e) }

That still creates a local `Result` wrapper and usually misses the intended migration.

Default migration: handle the raising expression directly with `try ... catch ... noraise`, especially in local inspect/assert/match/guard/logging/test code:

  try expr catch {
    e => inspect(e, content=...)
  } noraise {
    value => inspect(value, content=...)
  }

Only create `Ok`/`Err` when the `Result` value must escape this local expression: stored, returned, passed to a Result-taking API, or kept for later comparison as data.
─────╯
Warning: [0020]
     ╭─[ /home/runner/work/canopy/canopy/event-graph-walker/text/sync.mbt:143:37 ]
     │
 143 │   let rle : @rle.Rle[@core.OpRun] = @rle.Rle::new()
     │                                     ──────┬──────  
     │                                           ╰──────── Warning (deprecated): Use Rle::Rle() instead
─────╯
[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) 
  19.73 µs ± 746.89 ns    19.09 µs …  21.32 µs  in 10 ×   4833 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) 
 102.93 µs ± 276.05 ns   102.60 µs … 103.49 µs  in 10 ×    973 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) 
 450.38 µs ±   2.81 µs   448.33 µs … 458.15 µs  in 10 ×    223 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) 
 133.22 µs ± 313.63 ns   132.84 µs … 133.80 µs  in 10 ×    752 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) 
  96.38 µs ± 538.14 ns    95.72 µs …  97.04 µs  in 10 ×   1043 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) 
  66.37 µs ± 300.86 ns    65.97 µs …  66.87 µs  in 10 ×   1472 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) 
 100.64 µs ±  77.12 ns   100.52 µs … 100.78 µs  in 10 ×    996 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) 
 211.21 µs ± 657.42 ns   210.68 µs … 212.85 µs  in 10 ×    472 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.29 µs ±  24.06 µs    26.09 µs …  96.03 µs  in 10 ×   2215 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   3.86 µs ±  18.02 ns     3.83 µs …   3.89 µs  in 10 ×  25909 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  29.45 µs ±  39.72 ns    29.38 µs …  29.51 µs  in 10 ×   3394 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 406.19 µs ± 819.24 ns   405.42 µs … 407.66 µs  in 10 ×    247 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  12.02 µs ±   3.94 µs     9.10 µs …  17.80 µs  in 10 ×   8577 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  89.32 µs ±  46.33 µs    59.22 µs … 176.22 µs  in 10 ×   1219 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  36.32 µs ± 365.78 ns    35.99 µs …  37.20 µs  in 10 ×   2760 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  36.06 µs ± 118.68 ns    35.92 µs …  36.23 µs  in 10 ×   2779 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) 
  26.26 µs ± 642.78 ns    25.74 µs …  27.65 µs  in 10 ×   3799 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.31 ms ±   3.77 ms     2.68 ms …  13.40 ms  in 10 ×     69 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 ±  81.03 ns    11.19 µs …  11.43 µs  in 10 ×   8846 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 114.26 µs ± 527.84 ns   113.94 µs … 115.71 µs  in 10 ×    878 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.95 µs ± 354.80 ns     3.72 µs …   4.64 µs  in 10 ×  24927 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  39.99 µs ±  17.95 µs    30.28 µs …  78.59 µs  in 10 ×   2452 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  18.06 ms ±  10.49 ms     6.44 ms …  38.23 ms  in 10 ×     31 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  19.43 µs ±  10.98 µs    12.01 µs …  38.70 µs  in 10 ×   5555 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 664.88 ns ±   9.11 ns   654.15 ns … 682.05 ns  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.83 µs ±  97.25 ns     4.79 µs …   5.11 µs  in 10 ×  20764 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  42.89 µs ± 353.18 ns    42.66 µs …  43.87 µs  in 10 ×   2329 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) 
   5.92 µs ±   6.41 ns     5.91 µs …   5.93 µs  in 10 ×  16840 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 ±  11.35 ns     6.35 µs …   6.38 µs  in 10 ×  15682 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.16 µs ±   6.94 ns     8.15 µs …   8.17 µs  in 10 ×  12192 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.43 µs ±   4.98 ns     3.42 µs …   3.43 µs  in 10 ×  29140 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.53 µs ±   9.77 ns     5.51 µs …   5.54 µs  in 10 ×  18118 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 456.27 µs ± 722.12 ns   455.24 µs … 457.14 µs  in 10 ×    219 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   6.76 ms ±  48.33 µs     6.70 ms …   6.85 ms  in 10 ×     15 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) 
  22.74 ms ±   3.27 ms    20.05 ms …  27.62 ms  in 10 ×      5 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) 
  49.56 ns ±   0.29 ns    48.92 ns …  49.88 ns  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) 
 139.72 ns ±   0.31 ns   139.13 ns … 140.33 ns  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.05 µs ±   1.47 ns     1.05 µs …   1.06 µs  in 10 ×  95322 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) 
 175.71 ns ±   0.40 ns   175.16 ns … 176.62 ns  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) 
 118.83 ns ±   0.41 ns   118.39 ns … 119.35 ns  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) 
 468.79 ns ±   1.28 ns   467.57 ns … 471.33 ns  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) 
 204.86 ns ±   0.66 ns   204.15 ns … 206.27 ns  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) 
   1.28 µs ±   1.42 ns     1.28 µs …   1.28 µs  in 10 ×  78029 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) 
 145.30 ns ±   0.52 ns   144.72 ns … 145.99 ns  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) 
 122.48 ns ±   0.41 ns   121.95 ns … 123.09 ns  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) 
 566.12 ns ±   1.03 ns   564.73 ns … 567.65 ns  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.76 µs ±   6.71 ns     4.75 µs …   4.78 µs  in 10 ×  20974 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) 
 196.31 ns ±   0.54 ns   195.55 ns … 197.21 ns  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.04 µs ± 237.07 ns     4.96 µs …   5.71 µs  in 10 ×  20082 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) 
  67.08 ns ±   0.39 ns    66.56 ns …  67.61 ns  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) 
  12.43 ns ±   0.33 ns    12.15 ns …  12.96 ns  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.83 µs ± 900.12 ns   180.54 µs … 183.18 µs  in 10 ×    507 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 ±  55.63 µs     2.67 ms …   2.83 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.85 ms ± 185.19 µs     8.68 ms …   9.20 ms  in 10 ×     12 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) 
   3.32 ms ±  19.46 µs     3.29 ms …   3.35 ms  in 10 ×     29 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) 
  29.38 ms ± 649.79 µs    28.36 ms …  30.55 ms  in 10 ×      4 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) 
 100.48 ns ±   0.34 ns    99.97 ns … 100.99 ns  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) 
 100.08 ns ±   0.08 ns    99.99 ns … 100.23 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/fugue/tree_position_benchmark.mbt:20 ("bench: lv_to_position middle of 10K tree") ok
time (mean ± σ)         range (min … max) 
 521.82 µs ±   1.82 µs   519.19 µs … 525.16 µs  in 10 ×    192 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 150.93 µs ± 639.84 ns   150.19 µs … 151.83 µs  in 10 ×    660 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) 
 147.58 µs ± 267.62 ns   147.16 µs … 148.03 µs  in 10 ×    675 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.25 ms ±  84.07 µs     4.11 ms …   4.34 ms  in 10 ×     24 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 147.51 µs ± 265.73 ns   147.16 µs … 148.08 µs  in 10 ×    680 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  42.98 µs ± 764.91 ns    42.61 µs …  45.14 µs  in 10 ×   2269 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 492.47 µs ±   1.01 µs   491.22 µs … 494.10 µs  in 10 ×    203 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) 
  62.50 µs ± 279.30 ns    62.20 µs …  63.19 µs  in 10 ×   1601 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  28.50 µs ±  71.24 ns    28.40 µs …  28.59 µs  in 10 ×   3506 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 183.06 ns ±   0.67 ns   182.39 ns … 184.73 ns  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) 
  20.14 ns ±   0.30 ns    19.72 ns …  20.50 ns  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) 
  24.20 ns ±   0.39 ns    23.66 ns …  24.81 ns  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) 
  11.14 µs ±  58.88 ns    11.07 µs …  11.25 µs  in 10 ×   8898 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  18.90 µs ±  35.51 ns    18.84 µs …  18.96 µs  in 10 ×   5264 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.37 µs ±   9.86 ns     5.36 µs …   5.39 µs  in 10 ×  18591 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   8.75 µs ±  29.16 ns     8.72 µs …   8.81 µs  in 10 ×  11860 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 226.65 µs ± 385.90 ns   226.11 µs … 227.22 µs  in 10 ×    441 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  41.78 µs ±  96.08 ns    41.63 µs …  41.92 µs  in 10 ×   2396 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 143.48 ms ±  19.88 ms   116.93 ms … 172.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) 
  60.83 ms ±  15.10 ms    43.27 ms …  81.45 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) 
  92.77 µs ± 190.53 ns    92.48 µs …  93.01 µs  in 10 ×    968 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.23 ms ±   4.68 µs     1.23 ms …   1.24 ms  in 10 ×     82 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 156.11 µs ±   5.87 µs   152.68 µs … 167.80 µs  in 10 ×    650 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) 
 228.82 µs ± 535.12 ns   228.28 µs … 229.74 µs  in 10 ×    435 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.15 µs ± 329.91 ns    13.92 µs …  14.99 µs  in 10 ×   6954 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 144.20 µs ± 424.56 ns   143.48 µs … 144.96 µs  in 10 ×    689 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  12.52 ns ±   0.29 ns    12.28 ns …  13.07 ns  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) 
  93.12 ns ±   3.54 ns    91.23 ns … 102.83 ns  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) 
  93.23 ns ±   3.99 ns    90.99 ns … 103.36 ns  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) 
  34.04 µs ± 242.14 ns    33.69 µs …  34.54 µs  in 10 ×   2828 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  52.59 µs ± 582.86 ns    51.95 µs …  53.57 µs  in 10 ×   1909 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 633.47 µs ±   2.33 µs   630.72 µs … 637.73 µs  in 10 ×    159 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) 
 106.10 µs ± 136.49 ns   105.89 µs … 106.35 µs  in 10 ×    944 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  14.29 µs ±  31.08 ns    14.26 µs …  14.36 µs  in 10 ×   6999 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 171.16 µs ±   1.34 µs   169.36 µs … 173.08 µs  in 10 ×    586 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.08 µs ±   3.63 ns     2.07 µs …   2.09 µs  in 10 ×  48011 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 ±  20.00 ns     2.40 µs …   2.47 µs  in 10 ×  41992 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  28.61 µs ±  44.17 ns    28.55 µs …  28.68 µs  in 10 ×   3469 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 455.87 µs ±   1.70 µs   454.45 µs … 459.45 µs  in 10 ×    219 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) 
  32.42 µs ± 116.53 ns    32.29 µs …  32.63 µs  in 10 ×   3086 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) 
 283.31 µs ±   1.06 µs   282.53 µs … 286.00 µs  in 10 ×    354 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.25 ms ±   5.27 µs     1.24 ms …   1.25 ms  in 10 ×     80 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.89 ms ±  20.12 µs     2.87 ms …   2.92 ms  in 10 ×     35 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) 
   1.86 ms ±   7.70 µs     1.84 ms …   1.87 ms  in 10 ×     54 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.45 ms ±  15.03 µs     2.43 ms …   2.48 ms  in 10 ×     41 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.47 µs ±   2.09 µs     5.89 µs …  12.22 µs  in 10 ×  15194 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.50 µs ±   1.00 µs     5.93 µs …   9.30 µs  in 10 ×  17626 runs
Total tests: 105, passed: 105, failed: 0.

Benchmarks run with --release flag

@dowdiness dowdiness force-pushed the fix/649-650-duplicate-binding branch from 4086540 to 9398bd1 Compare June 17, 2026 10:42
@dowdiness dowdiness merged commit 1ba66af into main Jun 17, 2026
29 checks passed
@dowdiness dowdiness deleted the fix/649-650-duplicate-binding branch June 17, 2026 10:52
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.

Binding duplicate emits non-lexable names (_copy); needs a proper fresh-name mechanism

1 participant