Skip to content

refactor(lambda): route leaf projection kinds through CstFold#641

Merged
dowdiness merged 2 commits into
mainfrom
work/lambda-cstfold-630
Jun 14, 2026
Merged

refactor(lambda): route leaf projection kinds through CstFold#641
dowdiness merged 2 commits into
mainfrom
work/lambda-cstfold-630

Conversation

@dowdiness

@dowdiness dowdiness commented Jun 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • Route Lambda IntLiteral, VarRef, and HoleLiteral projection kinds through existing Loom Lambda CstFold output plus the Lambda projection: decide block-expression CstFold divergence #629 compatibility adapter.
  • Preserve ProjNode::leaf construction for leaf spans, node IDs, and childless shape.
  • Add white-box coverage pinning CstFold-compatible leaf kinds and ProjNode metadata.

Reuse check

  • Reused @parser.syntax_node_to_term for folded Lambda Term output.
  • Reused cstfold_projection_compatible_term to preserve Canopy block-expression semantics decided in Lambda projection: decide block-expression CstFold divergence #629/test(lambda): decide block CstFold compatibility #640.
  • Reused ProjNode::leaf for span/id allocation instead of rebuilding leaf metadata manually.
  • Checked @parser.lambda_fold_node, Term::children, and @ast.rebuild_from; Term::children/@ast.rebuild_from remain used by the compatibility adapter, while direct lambda_fold_node use is unnecessary for the leaf-only projection slice.
  • Added private helpers only: cstfold_projection_compatible_kind owns the SyntaxNode → adapter-normalized Term boundary; cstfold_leaf_node owns the leaf ProjNode construction boundary.

Validation

  • NEW_MOON_MOD=0 moon check lang/lambda/proj --deny-warn
  • NEW_MOON_MOD=0 moon test lang/lambda/proj
  • NEW_MOON_MOD=0 moon info
  • git diff -- '*.mbti' reviewed; no retained public API diff. Unrelated moon info newline churn was reverted.

Closes #630.

Summary by CodeRabbit

  • Refactor

    • Improved code organization and consistency in the internal implementation of syntax analysis and transformation components, consolidating repeated logic into reusable utility functions for better maintainability.
  • Tests

    • Added new test coverage for metadata preservation in syntax analysis operations, including validation of node classification and boundary information across different syntax element types, improving overall compiler reliability.

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@dowdiness, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 50 minutes and 7 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a8889e34-71b1-4407-8a25-11353a139f0a

📥 Commits

Reviewing files that changed from the base of the PR and between 9e3ab8e and 9f12b60.

📒 Files selected for processing (2)
  • lang/lambda/proj/cstfold_compat.mbt
  • lang/lambda/proj/proj_node.mbt
📝 Walkthrough

Walkthrough

Adds a new cstfold_projection_compatible_kind helper in cstfold_compat.mbt that converts a @seam.SyntaxNode to a normalized @ast.Term via the existing CstFold path. proj_node.mbt introduces a cstfold_leaf_node local helper using this function, replacing inline Int, Var, and Hole(0) constructions in syntax_to_proj_node. New white-box tests verify leaf kind and span parity.

Changes

CstFold-backed leaf kind derivation

Layer / File(s) Summary
cstfold_projection_compatible_kind helper
lang/lambda/proj/cstfold_compat.mbt
Removes the #warnings("-unused_value") directive and adds cstfold_projection_compatible_kind, which chains @parser.syntax_node_to_term and cstfold_projection_compatible_term to normalize a CST node into an @ast.Term.
Wire cstfold_leaf_node into syntax_to_proj_node
lang/lambda/proj/proj_node.mbt
Adds the cstfold_leaf_node local helper delegating kind selection to cstfold_projection_compatible_kind, and replaces inline Int(...), Var(...), and Hole(0) leaf constructions in syntax_to_proj_node with calls to this helper.
Leaf projection metadata parity tests
lang/lambda/proj/proj_node_cstfold_wbtest.mbt
Introduces assert_leaf_projection_metadata, which checks kind parity against the CstFold fold result and asserts exact span boundaries and node_id/children invariants; adds the test covering "42", " x", and "_".

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related issues

Possibly related PRs

  • dowdiness/canopy#640: Directly extends the same cstfold_projection_compatible_term compatibility boundary that this PR builds on, making it the immediate predecessor in the same compatibility-adapter work.

Poem

🐇 Hop, hop — no more hardcoded Hole(0) in sight,
The leaf kinds now flow through a centralized light.
cstfold_projection_compatible_kind clears the way,
Spans and node IDs checked without fray.
One helper to rule all the leaves of the tree —
A tidy little warren, just as it should be! 🌿

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main refactoring: routing leaf projection kinds through CstFold.
Linked Issues check ✅ Passed The PR successfully addresses all coding requirements from issue #630: routes three leaf Term constructions through CstFold APIs, preserves ProjNode shape and public API, adds parity test coverage, and maintains validation checks.
Out of Scope Changes check ✅ Passed All changes directly support the refactoring objective of routing leaf projection kinds through CstFold, with no out-of-scope modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch work/lambda-cstfold-630

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 14, 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 9f12b60 Commit Preview URL

Branch Preview URL
Jun 14 2026, 02:35 AM

@github-actions

github-actions Bot commented Jun 14, 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) 
  61.73 µs ± 570.10 ns    60.84 µs …  62.64 µs  in 10 ×   1569 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   3.26 µs ± 103.42 ns     3.14 µs …   3.46 µs  in 10 ×  31655 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
   1.08 ms ±  81.00 µs     1.02 ms …   1.30 ms  in 10 ×     97 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  32.35 µs ± 449.10 ns    31.75 µs …  32.91 µs  in 10 ×   3186 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  15.59 ms ± 186.93 µs    15.33 ms …  15.84 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 533.95 µs ±   7.23 µs   526.36 µs … 545.99 µs  in 10 ×    190 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  56.17 µs ± 467.60 ns    55.45 µs …  56.91 µs  in 10 ×   1725 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  51.03 µs ± 390.10 ns    50.31 µs …  51.51 µs  in 10 ×   1953 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 662.92 µs ±   3.60 µs   657.74 µs … 668.52 µs  in 10 ×    153 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 711.16 µs ±  12.31 µs   698.73 µs … 734.17 µs  in 10 ×    142 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:44 ("bench/incr_tap/snapshot_fanout_256") ok
time (mean ± σ)         range (min … max) 
  57.88 µs ±   2.25 µs    55.51 µs …  62.57 µs  in 10 ×   1742 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 610.38 µs ±   7.77 µs   598.65 µs … 619.63 µs  in 10 ×    166 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:58 ("bench/incr_tap/to_visual_graph_fanout_256") ok
time (mean ± σ)         range (min … max) 
 122.20 µs ±   1.05 µs   120.44 µs … 123.86 µs  in 10 ×    828 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:64 ("bench/incr_tap/to_visual_graph_fanout_2048") ok
time (mean ± σ)         range (min … max) 
   1.11 ms ±   8.60 µs     1.09 ms …   1.12 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.41 ms ±  22.28 µs     1.38 ms …   1.45 ms  in 10 ×     71 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:43 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   3.42 ms ±  59.17 µs     3.31 ms …   3.50 ms  in 10 ×     29 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:54 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  15.55 ms ± 896.00 µs    14.40 ms …  16.50 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.65 ms ±  44.07 µs     1.59 ms …   1.74 ms  in 10 ×     62 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.11 ms ±  53.89 µs     1.04 ms …   1.21 ms  in 10 ×     85 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.31 ms ±  63.19 µs     4.23 ms …   4.41 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) 
  28.39 ms ± 403.21 µs    27.81 ms …  29.06 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) 
  64.51 ms ±   2.35 ms    63.30 ms …  71.15 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) 
 823.14 µs ± 166.25 µs   595.17 µs …   1.07 ms  in 10 ×    191 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   2.07 ms ±  42.43 µs     2.01 ms …   2.15 ms  in 10 ×     51 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  13.58 ms ± 143.88 µs    13.32 ms …  13.80 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.89 ms ± 666.99 µs    32.94 ms …  34.86 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) 
   4.04 ms ±  65.47 µs     3.98 ms …   4.15 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) 
   4.10 ms ±  68.63 µs     4.01 ms …   4.21 ms  in 10 ×     25 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) 
   4.03 ms ±  43.67 µs     3.96 ms …   4.08 ms  in 10 ×     26 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.60 ms ±   1.55 ms    50.28 ms …  55.74 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) 
  51.77 ms ± 716.06 µs    50.56 ms …  52.76 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) 
  52.03 ms ± 749.28 µs    51.01 ms …  53.02 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) 
 710.04 ns ±   8.29 ns   697.90 ns … 720.28 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) 
 739.72 ns ±  12.12 ns   723.29 ns … 755.56 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) 
 756.33 ns ±   2.30 ns   753.61 ns … 759.00 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 ±  13.86 ns     5.52 µs …   5.56 µs  in 10 ×  17534 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  21.51 µs ± 110.55 ns    21.29 µs …  21.64 µs  in 10 ×   4565 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
  96.42 µs ±   1.95 µs    94.61 µs … 100.78 µs  in 10 ×   1018 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 384.25 µs ±   2.08 µs   381.21 µs … 386.47 µs  in 10 ×    260 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  10.88 µs ±  35.84 ns    10.83 µs …  10.93 µs  in 10 ×   9230 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 183.61 µs ±   1.04 µs   182.28 µs … 185.12 µs  in 10 ×    545 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 703.37 µs ±   4.60 µs   698.17 µs … 710.92 µs  in 10 ×    142 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  39.90 µs ± 211.28 ns    39.72 µs …  40.42 µs  in 10 ×   2523 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.61 µs ±  78.88 ns    11.48 µs …  11.73 µs  in 10 ×   8681 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 103.63 µs ± 413.51 ns   103.04 µs … 104.23 µs  in 10 ×    964 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:71 ("reconcile wide-siblings (320 defs)") ok
time (mean ± σ)         range (min … max) 
   1.35 ms ±   5.64 µs     1.34 ms …   1.36 ms  in 10 ×     74 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.44 ms ±  88.25 µs    13.35 ms …  13.59 ms  in 10 ×      8 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:148 ("fp_incr unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
  12.52 µs ±  20.89 ns    12.49 µs …  12.55 µs  in 10 ×   7955 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:157 ("fp_incr unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  64.55 µs ± 129.86 ns    64.41 µs …  64.80 µs  in 10 ×   1551 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:166 ("fp_incr unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 577.14 µs ±   2.68 µs   574.83 µs … 583.95 µs  in 10 ×    174 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:175 ("fp_incr unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   4.45 ms ±  12.35 µs     4.43 ms …   4.47 ms  in 10 ×     23 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:186 ("fp_incr tail (20 defs)") ok
time (mean ± σ)         range (min … max) 
  20.84 µs ± 156.70 ns    20.62 µs …  21.20 µs  in 10 ×   4810 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:195 ("fp_incr tail (80 defs)") ok
time (mean ± σ)         range (min … max) 
  95.44 µs ± 591.59 ns    94.97 µs …  96.85 µs  in 10 ×   1052 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:204 ("fp_incr tail (320 defs)") ok
time (mean ± σ)         range (min … max) 
 743.84 µs ±   3.23 µs   739.13 µs … 748.92 µs  in 10 ×    135 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:213 ("fp_incr tail (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   5.00 ms ±  15.55 µs     4.98 ms …   5.03 ms  in 10 ×     20 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:224 ("fp_incr shifted (20 defs)") ok
time (mean ± σ)         range (min … max) 
  52.93 µs ± 427.49 ns    52.13 µs …  53.50 µs  in 10 ×   1859 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:230 ("fp_incr shifted (80 defs)") ok
time (mean ± σ)         range (min … max) 
 222.68 µs ±   2.04 µs   220.19 µs … 225.27 µs  in 10 ×    452 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:236 ("fp_incr shifted (320 defs)") ok
time (mean ± σ)         range (min … max) 
 975.80 µs ±  13.59 µs   957.77 µs … 995.18 µs  in 10 ×    103 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:242 ("fp_incr shifted (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   3.24 ms ±  28.22 µs     3.19 ms …   3.28 ms  in 10 ×     32 runs
Total tests: 45, passed: 45, 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
Using cached moonbitlang/async@0.16.8
Using cached moonbitlang/quickcheck@0.14.0
Using cached moonbitlang/x@0.4.38
Downloading dowdiness/rle@0.2.2
Downloading dowdiness/incr@0.9.0
[dowdiness/btree] bench btree_benchmark.mbt:79 ("bench: build via inserts (100)") ok
time (mean ± σ)         range (min … max) 
  64.79 µs ± 608.14 ns    64.18 µs …  66.17 µs  in 10 ×   1512 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   2.83 µs ±  37.13 ns     2.79 µs …   2.91 µs  in 10 ×  35276 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
   1.07 ms ±  17.51 µs     1.04 ms …   1.09 ms  in 10 ×     89 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  34.41 µs ±   4.88 µs    31.00 µs …  45.39 µs  in 10 ×   3134 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  16.27 ms ± 247.04 µs    15.96 ms …  16.82 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 579.31 µs ±  30.09 µs   538.62 µs … 644.39 µs  in 10 ×    164 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  56.66 µs ± 902.66 ns    55.28 µs …  58.36 µs  in 10 ×   1717 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  51.10 µs ± 352.87 ns    50.35 µs …  51.56 µs  in 10 ×   1968 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 663.57 µs ±   8.11 µs   650.28 µs … 674.96 µs  in 10 ×    152 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 685.65 µs ±  11.44 µs   673.58 µs … 705.81 µs  in 10 ×    145 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:44 ("bench/incr_tap/snapshot_fanout_256") ok
time (mean ± σ)         range (min … max) 
  56.95 µs ±   1.50 µs    54.20 µs …  58.65 µs  in 10 ×   1815 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 597.14 µs ±   6.33 µs   590.32 µs … 607.96 µs  in 10 ×    167 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:58 ("bench/incr_tap/to_visual_graph_fanout_256") ok
time (mean ± σ)         range (min … max) 
 119.84 µs ±   1.17 µs   118.36 µs … 121.41 µs  in 10 ×    827 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:64 ("bench/incr_tap/to_visual_graph_fanout_2048") ok
time (mean ± σ)         range (min … max) 
   1.12 ms ±   5.84 µs     1.11 ms …   1.13 ms  in 10 ×     89 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.45 ms ±  36.36 µs     1.40 ms …   1.52 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.45 ms ±  75.76 µs     3.32 ms …   3.58 ms  in 10 ×     30 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:54 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  15.53 ms ± 916.09 µs    14.62 ms …  17.25 ms  in 10 ×      6 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.63 ms ±  46.75 µs     1.59 ms …   1.74 ms  in 10 ×     64 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.10 ms ±  74.30 µs   998.25 µs …   1.22 ms  in 10 ×     90 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.29 ms ±  52.37 µs     4.21 ms …   4.39 ms  in 10 ×     24 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  28.50 ms ± 462.17 µs    27.97 ms …  29.41 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) 
  65.03 ms ±   1.48 ms    63.45 ms …  68.09 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) 
 847.81 µs ± 181.32 µs   606.27 µs …   1.08 ms  in 10 ×    188 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   2.03 ms ±  47.56 µs     1.99 ms …   2.14 ms  in 10 ×     52 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  13.40 ms ± 228.64 µs    13.20 ms …  13.93 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.48 ms ± 817.28 µs    32.28 ms …  34.72 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) 
   4.09 ms ±  59.85 µs     4.00 ms …   4.16 ms  in 10 ×     25 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:100 ("text intent dispatch - caps field (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.03 ms ±  52.46 µs     3.98 ms …   4.12 ms  in 10 ×     25 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) 
   4.05 ms ±  90.00 µs     3.97 ms …   4.26 ms  in 10 ×     26 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:110 ("text intent dispatch - direct call (1000 members)") ok
time (mean ± σ)         range (min … max) 
  52.96 ms ±   4.55 ms    50.26 ms …  65.80 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) 
  51.38 ms ± 756.25 µs    50.22 ms …  52.52 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) 
  52.70 ms ±   2.20 ms    50.88 ms …  58.50 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) 
 753.21 ns ±   2.69 ns   750.20 ns … 758.70 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) 
 754.14 ns ±   6.77 ns   748.51 ns … 769.32 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) 
 754.42 ns ±   3.78 ns   749.78 ns … 759.42 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) 
   6.14 µs ±  49.82 ns     6.07 µs …   6.23 µs  in 10 ×  16304 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  23.92 µs ±  94.21 ns    23.75 µs …  24.06 µs  in 10 ×   4030 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 100.03 µs ±   1.20 µs    98.75 µs … 102.75 µs  in 10 ×    990 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 399.31 µs ±   2.69 µs   394.14 µs … 402.64 µs  in 10 ×    251 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.64 µs ±  42.90 ns    11.59 µs …  11.70 µs  in 10 ×   8559 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 189.90 µs ±   1.28 µs   188.13 µs … 192.12 µs  in 10 ×    529 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 829.97 µs ±   7.15 µs   816.60 µs … 839.86 µs  in 10 ×    121 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  43.64 µs ± 297.69 ns    43.40 µs …  44.26 µs  in 10 ×   2298 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.64 µs ±  61.36 ns    11.51 µs …  11.71 µs  in 10 ×   8723 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 103.19 µs ± 415.87 ns   102.56 µs … 103.69 µs  in 10 ×    963 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:71 ("reconcile wide-siblings (320 defs)") ok
time (mean ± σ)         range (min … max) 
   1.34 ms ±   5.83 µs     1.33 ms …   1.35 ms  in 10 ×     75 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.54 ms ± 123.57 µs    13.37 ms …  13.72 ms  in 10 ×      8 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:148 ("fp_incr unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.69 µs ±  30.61 ns    11.63 µs …  11.73 µs  in 10 ×   8611 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:157 ("fp_incr unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  61.29 µs ± 111.44 ns    61.16 µs …  61.49 µs  in 10 ×   1632 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:166 ("fp_incr unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 561.79 µs ± 958.08 ns   559.73 µs … 562.68 µs  in 10 ×    179 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:175 ("fp_incr unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   4.41 ms ±  11.42 µs     4.39 ms …   4.42 ms  in 10 ×     23 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:186 ("fp_incr tail (20 defs)") ok
time (mean ± σ)         range (min … max) 
  20.86 µs ±  75.36 ns    20.71 µs …  20.94 µs  in 10 ×   4708 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:195 ("fp_incr tail (80 defs)") ok
time (mean ± σ)         range (min … max) 
  92.40 µs ± 363.33 ns    91.87 µs …  92.86 µs  in 10 ×   1089 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:204 ("fp_incr tail (320 defs)") ok
time (mean ± σ)         range (min … max) 
 742.63 µs ±   2.72 µs   737.35 µs … 746.27 µs  in 10 ×    135 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:213 ("fp_incr tail (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   4.97 ms ±  13.52 µs     4.95 ms …   4.99 ms  in 10 ×     21 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:224 ("fp_incr shifted (20 defs)") ok
time (mean ± σ)         range (min … max) 
  52.66 µs ± 684.88 ns    51.53 µs …  53.56 µs  in 10 ×   1923 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:230 ("fp_incr shifted (80 defs)") ok
time (mean ± σ)         range (min … max) 
 211.96 µs ±   2.20 µs   208.61 µs … 215.74 µs  in 10 ×    477 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:236 ("fp_incr shifted (320 defs)") ok
time (mean ± σ)         range (min … max) 
 934.73 µs ±  11.99 µs   916.64 µs … 948.44 µs  in 10 ×    108 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:242 ("fp_incr shifted (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   3.17 ms ± 109.56 µs     3.04 ms …   3.35 ms  in 10 ×     33 runs
Total tests: 45, passed: 45, 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) 
  22.41 µs ± 480.82 ns    21.71 µs …  23.06 µs  in 10 ×   4024 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) 
 107.72 µs ± 994.10 ns   106.42 µs … 109.28 µs  in 10 ×    917 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) 
 472.40 µs ±  10.14 µs   458.74 µs … 487.66 µs  in 10 ×    216 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) 
 141.65 µs ±   1.56 µs   139.46 µs … 143.87 µs  in 10 ×    714 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) 
 101.76 µs ± 731.85 ns   100.82 µs … 102.96 µs  in 10 ×    978 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) 
  71.63 µs ± 445.75 ns    71.00 µs …  72.31 µs  in 10 ×   1413 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) 
 109.91 µs ± 805.06 ns   108.88 µs … 111.06 µs  in 10 ×    918 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) 
 218.56 µs ±   3.04 µs   215.35 µs … 225.12 µs  in 10 ×    459 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) 
  38.43 µs ±  15.33 µs    27.61 µs …  76.24 µs  in 10 ×   2116 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   5.13 µs ±  95.39 ns     4.96 µs …   5.27 µs  in 10 ×  19930 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  29.20 µs ± 238.56 ns    28.90 µs …  29.66 µs  in 10 ×   3425 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 366.17 µs ±   3.17 µs   361.24 µs … 370.33 µs  in 10 ×    272 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  13.31 µs ±   6.93 µs     9.84 µs …  28.21 µs  in 10 ×   7779 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
 102.09 µs ±  43.44 µs    65.17 µs … 205.63 µs  in 10 ×   1400 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  37.75 µs ± 711.01 ns    36.98 µs …  39.05 µs  in 10 ×   2595 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  38.16 µs ± 336.16 ns    37.67 µs …  38.84 µs  in 10 ×   2622 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) 
  28.65 µs ± 752.45 ns    27.88 µs …  30.22 µs  in 10 ×   3466 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.48 ms ±   3.94 ms     2.71 ms …  13.93 ms  in 10 ×     66 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  12.01 µs ± 241.67 ns    11.60 µs …  12.28 µs  in 10 ×   8578 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 124.22 µs ±   2.81 µs   119.16 µs … 127.58 µs  in 10 ×    790 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   4.17 µs ± 505.34 ns     3.87 µs …   5.39 µs  in 10 ×  24951 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  50.00 µs ±  25.46 µs    32.89 µs …  97.51 µs  in 10 ×   2438 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  16.51 ms ±   7.58 ms     6.63 ms …  29.91 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  23.06 µs ±  13.28 µs    13.05 µs …  49.08 µs  in 10 ×   4656 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 601.64 ns ±   7.32 ns   590.46 ns … 611.07 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.48 µs ±   3.29 ns     4.48 µs …   4.49 µs  in 10 ×  22227 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  41.81 µs ± 622.26 ns    41.16 µs …  42.73 µs  in 10 ×   2424 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.64 µs ±  83.27 ns     5.55 µs …   5.78 µs  in 10 ×  17913 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.68 µs ±  82.98 ns     5.59 µs …   5.83 µs  in 10 ×  17717 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:99 ("walker - diamond pattern (50 diamonds)") ok
time (mean ± σ)         range (min … max) 
   7.59 µs ±  38.68 ns     7.53 µs …   7.64 µs  in 10 ×  13176 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.57 µs ±  21.81 ns     3.53 µs …   3.60 µs  in 10 ×  28564 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.40 µs ±  31.65 ns     5.35 µs …   5.44 µs  in 10 ×  18427 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 454.54 µs ±   1.20 µs   452.89 µs … 456.17 µs  in 10 ×    220 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   7.07 ms ± 193.74 µs     6.82 ms …   7.33 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.90 ms ±   3.61 ms    20.02 ms …  29.94 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) 
  50.50 ns ±   1.23 ns    48.79 ns …  52.20 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) 
 132.54 ns ±   1.20 ns   130.91 ns … 134.37 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.09 µs ±  15.28 ns     1.07 µs …   1.11 µs  in 10 ×  90683 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) 
 153.35 ns ±   0.91 ns   152.02 ns … 154.68 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) 
 105.94 ns ±   1.11 ns   104.49 ns … 107.37 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) 
 394.68 ns ±   2.48 ns   392.57 ns … 401.03 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) 
 186.69 ns ±   1.06 ns   185.09 ns … 188.23 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.15 µs ±  16.43 ns     1.13 µs …   1.19 µs  in 10 ×  88116 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) 
 122.50 ns ±   1.07 ns   120.94 ns … 123.91 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) 
 109.86 ns ±   0.76 ns   108.49 ns … 110.74 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) 
 474.30 ns ±   1.54 ns   472.12 ns … 476.66 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) 
   3.94 µs ±  15.15 ns     3.93 µs …   3.99 µs  in 10 ×  25354 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) 
 193.38 ns ±   1.69 ns   191.26 ns … 197.11 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) 
   4.11 µs ±  11.73 ns     4.09 µs …   4.13 µs  in 10 ×  24369 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) 
  64.60 ns ±   0.61 ns    63.78 ns …  65.34 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) 
  13.76 ns ±   0.59 ns    12.92 ns …  14.63 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) 
 244.66 µs ±  10.02 µs   233.34 µs … 260.97 µs  in 10 ×    407 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) 
   3.14 ms ±  92.41 µs     3.03 ms …   3.31 ms  in 10 ×     31 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   9.88 ms ± 479.24 µs     9.12 ms …  10.63 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.58 ms ±  56.19 µs     3.47 ms …   3.68 ms  in 10 ×     26 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) 
  33.01 ms ±   1.15 ms    31.41 ms …  34.26 ms  in 10 ×      3 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:113 ("bench: warm cache position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
  97.71 ns ±   1.44 ns    96.01 ns … 100.11 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) 
  96.88 ns ±   2.37 ns    92.15 ns …  99.56 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) 
 574.03 µs ±  22.62 µs   535.84 µs … 601.03 µs  in 10 ×    175 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 147.20 µs ± 802.16 ns   146.30 µs … 148.43 µs  in 10 ×    670 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) 
 145.74 µs ± 887.14 ns   144.29 µs … 146.85 µs  in 10 ×    685 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.61 ms ± 142.73 µs     4.44 ms …   4.78 ms  in 10 ×     22 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 146.27 µs ±   2.23 µs   143.39 µs … 150.23 µs  in 10 ×    683 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  42.41 µs ± 583.51 ns    41.44 µs …  43.23 µs  in 10 ×   2518 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 504.02 µs ±   3.90 µs   499.21 µs … 510.06 µs  in 10 ×    199 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:34 ("oplog - insert and delete mix (100 ops)") ok
time (mean ± σ)         range (min … max) 
  64.36 µs ±   1.04 µs    63.06 µs …  65.78 µs  in 10 ×   1586 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  28.01 µs ± 292.44 ns    27.68 µs …  28.54 µ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) 
 211.23 ns ±   7.19 ns   201.48 ns … 220.77 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) 
  25.24 ns ±   0.38 ns    24.51 ns …  25.87 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) 
  27.52 ns ±   0.83 ns    26.44 ns …  28.78 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.86 µs ±  98.78 ns    11.72 µs …  12.00 µs  in 10 ×   8339 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  19.19 µs ± 241.98 ns    18.82 µs …  19.54 µs  in 10 ×   5190 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.76 µs ±  59.31 ns     5.69 µs …   5.83 µs  in 10 ×  17140 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   9.02 µs ± 123.95 ns     8.87 µs …   9.20 µs  in 10 ×  11389 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 234.14 µs ±   3.49 µs   229.45 µs … 240.14 µs  in 10 ×    431 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.34 µs ± 260.99 ns    40.96 µs …  41.82 µs  in 10 ×   2458 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 177.52 ms ±  25.30 ms   145.40 ms … 208.93 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) 
  69.92 ms ±  14.53 ms    52.13 ms …  86.75 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) 
  96.98 µs ±   1.01 µs    95.48 µs …  98.33 µs  in 10 ×    956 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.38 ms ±  31.69 µs     1.34 ms …   1.42 ms  in 10 ×     70 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 164.03 µs ±   1.33 µs   162.51 µs … 166.02 µs  in 10 ×    612 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) 
 238.55 µs ±   2.93 µs   235.74 µs … 243.33 µs  in 10 ×    417 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.73 µs ± 268.45 ns    14.33 µs …  15.11 µs  in 10 ×   6670 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 145.60 µs ±   2.36 µs   141.45 µs … 149.56 µs  in 10 ×    691 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.33 ns ±   0.75 ns    12.37 ns …  14.33 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) 
  94.63 ns ±   3.62 ns    90.46 ns … 100.03 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) 
 100.86 ns ±   1.57 ns    98.70 ns … 102.95 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) 
  36.26 µs ± 253.06 ns    35.93 µs …  36.66 µs  in 10 ×   2725 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  55.01 µs ± 799.04 ns    53.81 µs …  56.00 µs  in 10 ×   1820 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 651.18 µs ±  15.36 µs   632.18 µs … 674.03 µs  in 10 ×    152 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) 
 113.93 µs ±   1.67 µs   111.94 µs … 116.80 µs  in 10 ×    875 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  15.29 µs ± 239.78 ns    15.02 µs …  15.69 µs  in 10 ×   6521 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 160.66 µs ±   1.59 µs   158.44 µs … 162.87 µs  in 10 ×    634 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.37 µs ±  49.25 ns     2.26 µs …   2.42 µs  in 10 ×  42889 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) 
   3.24 µs ±  71.92 ns     3.11 µs …   3.37 µs  in 10 ×  31951 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  32.84 µs ± 400.58 ns    32.26 µs …  33.38 µs  in 10 ×   2992 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 501.73 µs ±   5.98 µs   491.47 µs … 509.37 µs  in 10 ×    196 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) 
  36.30 µs ± 542.45 ns    35.41 µs …  37.07 µs  in 10 ×   2685 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) 
 314.98 µs ±   5.97 µs   309.72 µs … 330.20 µs  in 10 ×    319 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.43 ms ±  23.24 µs     1.39 ms …   1.47 ms  in 10 ×     72 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.22 ms ±  32.37 µs     3.18 ms …   3.29 ms  in 10 ×     31 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.05 ms ±  31.04 µs     2.02 ms …   2.10 ms  in 10 ×     50 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:71 ("cache - jump to middle every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.63 ms ±  27.38 µs     2.59 ms …   2.67 ms  in 10 ×     38 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.54 µs ±   1.16 µs     6.29 µs …  10.22 µs  in 10 ×  15048 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:108 ("cache - single non-seq insert on 5000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.63 µs ±   1.43 µs     6.00 µs …  10.47 µs  in 10 ×  14288 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/alga@0.3.0
Downloading dowdiness/order-tree@0.1.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) 
  21.96 µs ± 293.30 ns    21.55 µs …  22.44 µs  in 10 ×   4859 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) 
 107.11 µs ±   1.00 µs   105.38 µs … 108.49 µs  in 10 ×    921 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) 
 484.64 µs ±  54.98 µs   457.43 µs … 635.20 µs  in 10 ×    218 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) 
 141.61 µs ±   2.03 µs   138.87 µs … 143.89 µs  in 10 ×    701 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) 
 101.26 µs ± 898.83 ns   100.05 µs … 102.81 µs  in 10 ×    979 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) 
  71.03 µs ± 618.68 ns    70.13 µs …  71.91 µs  in 10 ×   1394 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) 
 110.07 µs ±   1.31 µs   107.47 µs … 111.68 µs  in 10 ×    917 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) 
 212.43 µs ±   2.60 µs   207.08 µs … 216.26 µs  in 10 ×    460 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) 
  38.82 µs ±  16.99 µs    26.56 µs …  79.64 µs  in 10 ×   2198 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   5.11 µs ± 161.38 ns     4.92 µs …   5.33 µs  in 10 ×  21104 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  29.41 µs ± 539.36 ns    28.75 µs …  30.48 µs  in 10 ×   3471 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 359.42 µs ±   4.75 µs   354.43 µs … 367.21 µs  in 10 ×    280 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  13.24 µs ±   7.04 µs     9.68 µs …  28.91 µs  in 10 ×   7728 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  99.73 µs ±  41.66 µs    64.61 µs … 203.03 µs  in 10 ×   1430 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  37.89 µs ± 536.78 ns    37.25 µs …  38.55 µs  in 10 ×   2646 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  38.64 µs ± 717.02 ns    37.92 µs …  39.89 µs  in 10 ×   2646 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) 
  28.81 µs ± 731.75 ns    28.16 µs …  30.54 µs  in 10 ×   3444 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.60 ms ±   4.19 ms     2.74 ms …  14.73 ms  in 10 ×     65 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  12.84 µs ± 160.19 ns    12.60 µs …  13.11 µs  in 10 ×   7653 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 126.78 µs ±   1.71 µs   123.91 µs … 130.30 µs  in 10 ×    782 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   4.18 µs ± 413.12 ns     3.91 µs …   5.21 µs  in 10 ×  24673 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  48.39 µs ±  21.07 µs    32.47 µs …  93.90 µs  in 10 ×   1902 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  16.83 ms ±   7.01 ms     6.46 ms …  25.64 ms  in 10 ×     18 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  15.70 µs ±   6.89 µs    12.96 µs …  35.21 µs  in 10 ×   6867 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 599.70 ns ±  10.35 ns   584.14 ns … 610.09 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.46 µs ±   4.78 ns     4.45 µs …   4.47 µs  in 10 ×  22299 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  41.59 µs ± 428.20 ns    40.87 µs …  42.27 µs  in 10 ×   2428 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.82 µs ±  68.91 ns     5.73 µs …   5.91 µs  in 10 ×  17001 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.74 µs ±  82.74 ns     5.62 µs …   5.85 µs  in 10 ×  17230 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.21 µs ± 631.99 ns     7.91 µs …   9.91 µs  in 10 ×  11921 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.58 µs ±  32.68 ns     3.54 µs …   3.62 µs  in 10 ×  27560 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.43 µs ±  52.55 ns     5.33 µs …   5.50 µs  in 10 ×  18110 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 446.35 µs ±   5.87 µs   437.68 µs … 453.83 µs  in 10 ×    224 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 ± 205.00 µs     6.44 ms …   7.08 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.38 ms ±   3.71 ms    20.53 ms …  30.48 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) 
  53.75 ns ±   1.12 ns    51.88 ns …  55.38 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) 
 138.74 ns ±   1.32 ns   136.41 ns … 140.86 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.17 µs ±  28.42 ns     1.14 µs …   1.23 µs  in 10 ×  87208 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) 
 152.58 ns ±   0.85 ns   151.10 ns … 153.50 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) 
 106.89 ns ±   1.22 ns   105.72 ns … 108.87 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) 
 396.42 ns ±   3.19 ns   392.41 ns … 401.20 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) 
 195.49 ns ±   1.66 ns   193.45 ns … 198.08 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.12 µs ±  10.08 ns     1.11 µs …   1.14 µs  in 10 ×  88969 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) 
 122.13 ns ±   1.15 ns   121.00 ns … 124.04 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) 
 110.24 ns ±   1.52 ns   108.78 ns … 113.24 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) 
 467.65 ns ±   2.40 ns   463.44 ns … 471.44 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) 
   3.95 µs ±  13.94 ns     3.94 µs …   3.98 µs  in 10 ×  25317 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) 
 191.02 ns ±   0.96 ns   190.14 ns … 193.16 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) 
   4.22 µs ±  12.32 ns     4.20 µs …   4.24 µs  in 10 ×  23737 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) 
  64.60 ns ±   0.61 ns    63.67 ns …  65.58 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.91 ns ±   0.83 ns    14.18 ns …  16.35 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) 
 261.31 µs ±   8.98 µs   243.03 µs … 271.22 µs  in 10 ×    373 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) 
   3.05 ms ± 174.70 µs     2.80 ms …   3.32 ms  in 10 ×     34 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   9.67 ms ± 519.54 µs     9.03 ms …  10.67 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.58 ms ±  63.57 µs     3.47 ms …   3.64 ms  in 10 ×     26 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) 
  34.10 ms ±   1.37 ms    32.73 ms …  37.20 ms  in 10 ×      3 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:113 ("bench: warm cache position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 100.44 ns ±   1.97 ns    98.09 ns … 102.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) 
  96.65 ns ±   1.76 ns    93.72 ns …  98.45 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) 
 575.39 µs ±  17.55 µs   555.67 µs … 603.48 µs  in 10 ×    177 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 149.74 µs ±   1.34 µs   148.35 µs … 152.04 µs  in 10 ×    659 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) 
 146.39 µs ±   1.38 µs   144.87 µs … 148.74 µs  in 10 ×    693 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.60 ms ± 119.29 µs     4.41 ms …   4.76 ms  in 10 ×     22 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 146.61 µs ±   1.97 µs   143.23 µs … 148.99 µs  in 10 ×    687 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  42.65 µs ± 381.31 ns    42.13 µs …  43.22 µs  in 10 ×   2553 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 514.48 µs ±   5.85 µs   506.65 µs … 523.42 µs  in 10 ×    195 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) 
  66.84 µs ± 362.96 ns    66.30 µs …  67.36 µs  in 10 ×   1490 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  29.21 µs ± 229.43 ns    28.90 µs …  29.54 µs  in 10 ×   3426 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 239.46 ns ±   3.29 ns   235.08 ns … 242.89 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) 
  27.21 ns ±   0.68 ns    26.08 ns …  27.97 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) 
  29.38 ns ±   0.57 ns    28.54 ns …  30.43 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) 
  12.23 µs ± 137.11 ns    12.10 µs …  12.49 µs  in 10 ×   8077 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  19.23 µs ± 415.18 ns    18.64 µs …  19.75 µs  in 10 ×   5126 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.83 µs ±  56.61 ns     5.75 µs …   5.90 µs  in 10 ×  17120 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   9.27 µs ±  97.00 ns     9.14 µs …   9.43 µs  in 10 ×  11197 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 236.22 µs ±   3.67 µs   232.44 µs … 245.14 µs  in 10 ×    425 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.96 µs ± 270.55 ns    41.65 µs …  42.54 µs  in 10 ×   2403 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 178.93 ms ±  26.46 ms   143.86 ms … 209.71 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) 
  75.06 ms ±  14.39 ms    53.25 ms …  89.71 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) 
  95.85 µs ±   1.19 µs    94.06 µs …  97.47 µs  in 10 ×   1014 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.33 ms ±  25.35 µs     1.30 ms …   1.36 ms  in 10 ×     75 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 164.07 µs ±   1.43 µs   162.64 µs … 166.32 µs  in 10 ×    611 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) 
 238.08 µs ±   2.56 µs   234.44 µs … 242.46 µs  in 10 ×    415 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.84 µs ± 354.95 ns    14.38 µs …  15.32 µs  in 10 ×   6751 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 156.47 µs ±   2.37 µs   152.24 µs … 159.35 µs  in 10 ×    644 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.78 ns ±   0.70 ns    13.02 ns …  14.91 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) 
 103.73 ns ±   0.94 ns   102.18 ns … 104.79 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) 
 103.34 ns ±   1.08 ns   101.77 ns … 105.08 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) 
  36.53 µs ± 315.16 ns    36.18 µs …  37.14 µs  in 10 ×   2687 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  55.90 µs ± 710.96 ns    54.62 µs …  56.79 µs  in 10 ×   1798 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 659.70 µs ±  10.89 µs   645.54 µs … 678.28 µs  in 10 ×    153 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:186 ("text - bidirectional sync (2 peers, 50 ops each)") ok
time (mean ± σ)         range (min … max) 
 113.53 µs ±   2.10 µs   111.22 µs … 117.66 µs  in 10 ×    900 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  15.42 µs ± 144.40 ns    15.25 µs …  15.69 µs  in 10 ×   6394 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 159.99 µs ±   1.13 µs   158.10 µs … 161.36 µs  in 10 ×    620 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.32 µs ±  26.21 ns     2.29 µs …   2.36 µs  in 10 ×  43713 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) 
   3.27 µs ±  62.07 ns     3.21 µs …   3.39 µs  in 10 ×  30309 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  32.49 µs ± 168.33 ns    32.26 µs …  32.69 µs  in 10 ×   3070 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 504.25 µs ±   3.06 µs   499.00 µs … 508.38 µs  in 10 ×    195 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) 
  36.31 µs ± 638.11 ns    35.47 µs …  37.27 µs  in 10 ×   2674 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) 
 316.41 µs ±   9.33 µs   306.69 µs … 337.68 µs  in 10 ×    318 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.40 ms ±  25.95 µs     1.36 ms …   1.43 ms  in 10 ×     72 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.22 ms ±  33.91 µs     3.17 ms …   3.26 ms  in 10 ×     31 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.07 ms ±  12.86 µs     2.05 ms …   2.09 ms  in 10 ×     48 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.70 ms ±  37.96 µs     2.65 ms …   2.75 ms  in 10 ×     37 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:94 ("cache - single non-seq insert on 1000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.63 µs ±   1.17 µs     6.30 µs …  10.36 µs  in 10 ×  15113 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:108 ("cache - single non-seq insert on 5000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.59 µs ±   1.27 µs     6.12 µs …  10.42 µs  in 10 ×  14330 runs
Total tests: 105, passed: 105, failed: 0.

Benchmarks run with --release flag

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@lang/lambda/proj/cstfold_compat.mbt`:
- Around line 27-30: Add a doc comment above the
cstfold_projection_compatible_kind function that states which existing APIs were
evaluated (specifically `@parser.syntax_node_to_term` and
cstfold_projection_compatible_term) and explains why neither alone is sufficient
for the use case. The doc comment must explicitly define the helper's
responsibility boundary, clearly stating that it converts a CST node to a
projection-compatible Term by combining the CstFold path through
`@parser.syntax_node_to_term` with projection compatibility normalization via
cstfold_projection_compatible_term.

In `@lang/lambda/proj/proj_node.mbt`:
- Around line 69-75: Add a documentation comment to the cstfold_leaf_node
function that states which existing APIs were considered (ProjNode::leaf and
cstfold_projection_compatible_kind) and why this wrapper is necessary instead of
using those directly. Explicitly document the responsibility boundary of this
helper, which is to own leaf ProjNode construction boundaries as described in
the PR objectives. Follow the coding guideline format that requires stating
candidate existing APIs and the helper's explicit responsibility boundary.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 842d8bdc-fdd7-4657-bd07-649c3d3f92da

📥 Commits

Reviewing files that changed from the base of the PR and between 157df23 and 9e3ab8e.

📒 Files selected for processing (3)
  • lang/lambda/proj/cstfold_compat.mbt
  • lang/lambda/proj/proj_node.mbt
  • lang/lambda/proj/proj_node_cstfold_wbtest.mbt

Comment thread lang/lambda/proj/cstfold_compat.mbt
Comment thread lang/lambda/proj/proj_node.mbt
@dowdiness dowdiness merged commit 4e85dae into main Jun 14, 2026
29 checks passed
@dowdiness dowdiness deleted the work/lambda-cstfold-630 branch June 14, 2026 02:44
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.

Lambda projection: replace safe hand-built Term construction with CstFold

1 participant