Skip to content

docs(lambda): decide edit bridge boundary#669

Merged
dowdiness merged 1 commit into
mainfrom
lambda-edit-bridge-boundary-634
Jun 15, 2026
Merged

docs(lambda): decide edit bridge boundary#669
dowdiness merged 1 commit into
mainfrom
lambda-edit-bridge-boundary-634

Conversation

@dowdiness

@dowdiness dowdiness commented Jun 15, 2026

Copy link
Copy Markdown
Owner

Summary

Closes #634.

Decision audit

Dimension Outcome
Required context Registry/DefinitionIndex are now derivable from the generic ProjNode root; context alone is not a reason to widen LanguageSpec.
Return type / patch trace Lambda still returns Result[Array[SpanEdit], TreeEditError]; LanguageSpec::apply_edit returns Result[Unit, String].
Typed errors Keep TreeEditError; do not flatten unless Lambda FFI/public consumers are deliberately migrated.
Drop/move_node Keep Lambda's Drop special-case through SyncEditor::move_node.
Callers Preserve ffi/lambda/intent.mbt, ffi/lambda/semantic.mbt, and editor/example facade behavior.

Reuse check

  • Reused/checked: LanguageSpec::apply_edit, compute_text_edit, EditContext, DefinitionIndex::from_proj_node, SyncEditor::move_node, TreeEditError.
  • No new MoonBit helpers or runtime APIs introduced.
  • Existing API discovery: used moon ide outline for lang/runtime/language_spec.mbt, lang/lambda/companion/lambda_editor.mbt, and lang/lambda/edits/text_edit.mbt; moon ide doc/peek-def hit a local IDE JSON parse error, so I cross-checked by reading the definitions and running validation.

Validation

  • NEW_MOON_MOD=0 moon check lang/lambda/companion lang/lambda/edits ffi/lambda editor lang/runtime --deny-warn
  • NEW_MOON_MOD=0 moon test lang/lambda/companion lang/lambda/edits ffi/lambda editor lang/runtime (485 passed)
  • NEW_MOON_MOD=0 moon fmt
  • NEW_MOON_MOD=0 moon info (reviewed .mbti; only unrelated trailing blank-line churn, reverted)
  • git diff -- '*.mbti' (empty)
  • git diff --check
  • bash scripts/check-agent-doc-links.sh

Summary by CodeRabbit

  • Documentation
    • Added new architectural decision record documenting language bridge design.
    • Updated language integration guide with revised references to bridge architecture documentation.
    • Clarified runtime documentation scope and bridge responsibilities.
    • Updated language-specific README with revised API parameter documentation (timestamp_ms parameter).

@coderabbitai

coderabbitai Bot commented Jun 15, 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 40 minutes and 32 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: d3a17d9c-b5c1-4cd6-9bcf-24077b51086d

📥 Commits

Reviewing files that changed from the base of the PR and between b543595 and c78d6f7.

📒 Files selected for processing (7)
  • docs/README.md
  • docs/decisions/2026-06-15-lambda-edit-bridge-boundary.md
  • docs/development/ADDING_A_LANGUAGE.md
  • docs/plans/2026-06-11-s3-lang-runtime-extraction.md
  • docs/plans/2026-06-14-lambda-cstfold-modernization-623.md
  • lang/lambda/README.md
  • lang/runtime/README.md
📝 Walkthrough

Walkthrough

Adds ADR docs/decisions/2026-06-15-lambda-edit-bridge-boundary.md recording the decision to keep Lambda's apply_lambda_tree_edit bridge outside LanguageSpec after ModuleProjection removal. Updates lang/lambda/README.md, lang/runtime/README.md, docs/development/ADDING_A_LANGUAGE.md, and two existing plan documents to reference and align with this decision.

Changes

Lambda Edit Bridge Boundary Decision

Layer / File(s) Summary
New ADR: decision rationale, audit table, and consequences
docs/decisions/2026-06-15-lambda-edit-bridge-boundary.md, docs/README.md
Creates the full ADR document stating the decision to keep Lambda's thin bridge, adds an audit table comparing LanguageSpec::apply_edit vs apply_lambda_tree_edit across context, return types, typed errors, patch trace, and Drop semantics, documents consequences for future languages, and registers the new entry in the docs index.
Package README and developer guide updates
lang/lambda/README.md, lang/runtime/README.md, docs/development/ADDING_A_LANGUAGE.md
Updates apply_lambda_tree_edit signature from cursor to timestamp_ms, adds a note that the bridge is intentionally outside LanguageSpec, expands the runtime README boundary rationale with the decision reference, and rewires the "Lambda exception" section in the adding-a-language guide to point to the new ADR.
Existing plan doc cross-references
docs/plans/2026-06-11-s3-lang-runtime-extraction.md, docs/plans/2026-06-14-lambda-cstfold-modernization-623.md
Tightens Step 4 grounding and revisit-trigger text in the S3 extraction plan; updates the CstFold modernization plan status, comparison table Edit bridge row, blockers subsection, and non-goals scope rule to reflect the finalized #634 decision.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related issues

  • #623 — The new ADR and updated plan docs directly address the CstFold modernization design note objective by recording the post-ModuleProjection Lambda bridge boundary decision.

Possibly related PRs

  • dowdiness/canopy#637: Directly updates the same docs/plans/2026-06-14-lambda-cstfold-modernization-623.md file with CstFold boundary decisions that this PR further refines.

Poem

🐇 Hopping through the decision logs with glee,
A bridge for Lambda, kept intentionally free!
TreeEditError typed, a SpanEdit trace so fine,
Drop delegates to move_node — by design!
No LanguageSpec widenings today,
The ADR is written — hip hip hooray! 📜✨

🚥 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 'docs(lambda): decide edit bridge boundary' clearly and concisely summarizes the main change: documenting Lambda's architectural decision on its edit bridge after ModuleProjection removal.
Linked Issues check ✅ Passed The PR fully addresses issue #634's acceptance criteria: documents the post-ModuleProjection bridge boundary decision, updates docs/development/ADDING_A_LANGUAGE.md and lang/runtime/README.md, preserves Lambda FFI/editor stability, and validates via tests.
Out of Scope Changes check ✅ Passed All changes directly support the #634 decision scope: the new ADR entry, updated documentation references, parameter name corrections for apply_lambda_tree_edit, and clarifications in runtime/plan docs are all aligned with documenting the bridge boundary decision.
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 lambda-edit-bridge-boundary-634

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 15, 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 c78d6f7 Commit Preview URL

Branch Preview URL
Jun 15 2026, 09:26 AM

@github-actions

github-actions Bot commented Jun 15, 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) 
  74.57 µs ±  13.94 µs    65.09 µs … 103.15 µs  in 10 ×   1465 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   3.08 µs ±  12.36 ns     3.07 µs …   3.10 µs  in 10 ×  35531 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
   1.07 ms ±  24.73 µs     1.04 ms …   1.13 ms  in 10 ×     92 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  30.07 µs ± 209.19 ns    29.83 µs …  30.40 µs  in 10 ×   3359 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  16.18 ms ± 133.69 µs    15.99 ms …  16.40 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 523.52 µs ±  11.03 µs   507.25 µs … 538.94 µs  in 10 ×    195 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  57.74 µs ± 466.12 ns    57.23 µs …  58.55 µs  in 10 ×   1718 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  52.73 µs ± 167.57 ns    52.45 µs …  52.90 µs  in 10 ×   1898 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 707.68 µs ±   4.77 µs   700.86 µs … 714.01 µs  in 10 ×    141 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 698.14 µs ±  10.66 µs   688.34 µs … 713.66 µs  in 10 ×    144 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:44 ("bench/incr_tap/snapshot_fanout_256") ok
time (mean ± σ)         range (min … max) 
  62.77 µs ± 973.32 ns    60.91 µs …  64.21 µs  in 10 ×   1604 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 598.98 µs ±   7.28 µs   590.74 µs … 612.73 µ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) 
 114.42 µs ± 120.63 ns   114.22 µs … 114.55 µs  in 10 ×    874 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:64 ("bench/incr_tap/to_visual_graph_fanout_2048") ok
time (mean ± σ)         range (min … max) 
   1.09 ms ±  12.88 µs     1.07 ms …   1.11 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.35 ms ±  16.44 µs     1.33 ms …   1.38 ms  in 10 ×     75 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:43 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   3.16 ms ±  60.24 µs     3.07 ms …   3.25 ms  in 10 ×     31 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:54 ("viewnode serialization (500 defs)") ok
time (mean ± σ)         range (min … max) 
  14.82 ms ±   1.66 ms    13.32 ms …  18.45 ms  in 10 ×      8 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:65 ("compute_view_patches (100 defs, single edit)") ok
time (mean ± σ)         range (min … max) 
   2.61 ms ±  89.59 µs     2.46 ms …   2.72 ms  in 10 ×     38 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.02 ms ±  57.12 µs   936.48 µs …   1.09 ms  in 10 ×     91 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.92 ms ±  73.90 µs     3.84 ms …   4.08 ms  in 10 ×     25 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:108 ("json object - incremental keystroke (500 members)") ok
time (mean ± σ)         range (min … max) 
  26.06 ms ± 275.96 µs    25.72 ms …  26.53 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) 
  59.77 ms ± 622.12 µs    59.30 ms …  61.30 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) 
 807.48 µs ± 167.23 µs   547.78 µs …   1.02 ms  in 10 ×    212 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   1.93 ms ±  51.71 µs     1.86 ms …   2.01 ms  in 10 ×     55 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  12.66 ms ± 155.89 µs    12.54 ms …  12.95 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) 
  32.29 ms ± 907.64 µs    31.27 ms …  34.64 ms  in 10 ×      4 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:95 ("text intent dispatch - direct call (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.66 ms ±  19.57 µs     3.63 ms …   3.69 ms  in 10 ×     28 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:100 ("text intent dispatch - caps field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.72 ms ±  20.85 µs     3.68 ms …   3.75 ms  in 10 ×     28 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:105 ("text intent dispatch - caps optional field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.70 ms ±  24.64 µs     3.68 ms …   3.75 ms  in 10 ×     28 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:110 ("text intent dispatch - direct call (1000 members)") ok
time (mean ± σ)         range (min … max) 
  48.97 ms ±   1.67 ms    47.54 ms …  53.25 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:115 ("text intent dispatch - caps field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  49.16 ms ± 622.52 µs    48.33 ms …  49.91 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:120 ("text intent dispatch - caps optional field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  49.73 ms ±   2.46 ms    47.96 ms …  56.38 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:143 ("isolated dispatch - direct call x1000") ok
time (mean ± σ)         range (min … max) 
 813.03 ns ±   2.51 ns   810.54 ns … 816.44 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) 
 813.59 ns ±   2.44 ns   810.59 ns … 816.70 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) 
 810.84 ns ±   2.50 ns   805.97 ns … 814.71 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.52 µs ±  12.00 ns     5.50 µs …   5.54 µs  in 10 ×  17376 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  22.69 µs ±  54.40 ns    22.63 µs …  22.75 µs  in 10 ×   4383 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
  96.00 µs ±   1.70 µs    94.72 µs … 100.29 µs  in 10 ×   1016 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 386.94 µs ±   4.65 µs   379.99 µs … 393.73 µs  in 10 ×    258 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  10.28 µs ±  62.66 ns    10.20 µs …  10.38 µs  in 10 ×   9799 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 172.68 µs ±   1.01 µs   171.54 µs … 175.01 µs  in 10 ×    574 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 729.37 µs ±  18.76 µs   708.54 µs … 769.79 µs  in 10 ×    139 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  39.24 µs ± 141.09 ns    39.05 µs …  39.42 µs  in 10 ×   2529 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.25 µs ±  86.79 ns    11.18 µs …  11.48 µs  in 10 ×   8938 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 103.67 µs ± 337.71 ns   103.23 µs … 104.37 µs  in 10 ×    970 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:71 ("reconcile wide-siblings (320 defs)") ok
time (mean ± σ)         range (min … max) 
   1.38 ms ±   4.20 µs     1.37 ms …   1.39 ms  in 10 ×     73 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.18 ms ±  61.06 µs    13.08 ms …  13.27 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.28 µs ±  37.53 ns    12.24 µs …  12.35 µs  in 10 ×   8144 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:157 ("fp_incr unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  65.52 µs ± 267.91 ns    65.24 µs …  66.14 µs  in 10 ×   1524 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:166 ("fp_incr unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 633.94 µs ±  14.42 µs   627.12 µs … 674.45 µs  in 10 ×    155 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:175 ("fp_incr unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   5.29 ms ±  16.00 µs     5.27 ms …   5.30 ms  in 10 ×     19 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:186 ("fp_incr tail (20 defs)") ok
time (mean ± σ)         range (min … max) 
  21.68 µs ±  71.66 ns    21.56 µs …  21.76 µs  in 10 ×   4588 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:195 ("fp_incr tail (80 defs)") ok
time (mean ± σ)         range (min … max) 
 100.56 µs ± 897.48 ns    99.81 µs … 102.90 µs  in 10 ×   1000 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:204 ("fp_incr tail (320 defs)") ok
time (mean ± σ)         range (min … max) 
 780.13 µs ±   3.60 µs   774.85 µs … 785.03 µs  in 10 ×    129 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:213 ("fp_incr tail (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   5.86 ms ±  22.94 µs     5.83 ms …   5.89 ms  in 10 ×     18 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:224 ("fp_incr shifted (20 defs)") ok
time (mean ± σ)         range (min … max) 
  55.86 µs ±   1.51 µs    54.50 µs …  58.39 µs  in 10 ×   1739 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:230 ("fp_incr shifted (80 defs)") ok
time (mean ± σ)         range (min … max) 
 226.22 µs ±   4.39 µs   222.38 µs … 235.55 µs  in 10 ×    450 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:236 ("fp_incr shifted (320 defs)") ok
time (mean ± σ)         range (min … max) 
 942.86 µs ±  15.82 µs   922.94 µs … 967.94 µs  in 10 ×    106 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:242 ("fp_incr shifted (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   3.21 ms ±  68.52 µs     3.13 ms …   3.36 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) 
  65.90 µs ±   1.05 µs    65.15 µs …  68.15 µs  in 10 ×   1495 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   3.11 µs ±   9.39 ns     3.10 µs …   3.13 µs  in 10 ×  33698 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
   1.07 ms ±  18.25 µs     1.04 ms …   1.09 ms  in 10 ×     86 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  30.45 µs ±  95.59 ns    30.31 µs …  30.56 µs  in 10 ×   3304 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  17.04 ms ±   1.26 ms    16.26 ms …  19.76 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 586.45 µs ±  24.69 µs   539.43 µs … 624.30 µs  in 10 ×    179 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  58.53 µs ± 703.62 ns    57.82 µs …  59.84 µs  in 10 ×   1701 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  53.20 µs ± 220.14 ns    52.88 µs …  53.52 µs  in 10 ×   1879 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 714.80 µs ±   9.66 µs   709.34 µs … 741.94 µs  in 10 ×    140 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 700.47 µs ±   8.55 µs   688.28 µs … 710.67 µ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) 
  64.43 µs ±   1.20 µs    63.61 µs …  67.62 µs  in 10 ×   1510 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 611.11 µs ±  15.57 µs   587.66 µs … 627.13 µs  in 10 ×    168 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:58 ("bench/incr_tap/to_visual_graph_fanout_256") ok
time (mean ± σ)         range (min … max) 
 117.50 µs ±   3.50 µs   115.10 µs … 125.41 µs  in 10 ×    868 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:64 ("bench/incr_tap/to_visual_graph_fanout_2048") ok
time (mean ± σ)         range (min … max) 
   1.08 ms ±  15.75 µs     1.06 ms …   1.11 ms  in 10 ×     88 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.40 ms ±  12.92 µs     1.38 ms …   1.42 ms  in 10 ×     73 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:43 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   3.33 ms ±  33.85 µs     3.27 ms …   3.39 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.93 ms ±   1.12 ms    15.13 ms …  18.33 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.51 ms ±  36.22 µs     1.46 ms …   1.59 ms  in 10 ×     60 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.05 ms ±  52.00 µs   977.60 µs …   1.12 ms  in 10 ×     89 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.12 ms ±  31.99 µs     4.07 ms …   4.16 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) 
  27.72 ms ± 650.74 µs    26.89 ms …  28.64 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.70 ms ±   3.65 ms    62.56 ms …  74.61 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) 
 842.63 µs ± 191.09 µs   571.84 µs …   1.10 ms  in 10 ×    208 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:123 ("json array - incremental keystroke (100 elements)") ok
time (mean ± σ)         range (min … max) 
   1.99 ms ±  84.50 µs     1.88 ms …   2.14 ms  in 10 ×     54 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  13.19 ms ± 279.68 µs    12.89 ms …  13.67 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.82 ms ± 702.51 µs    33.02 ms …  34.67 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:95 ("text intent dispatch - direct call (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.91 ms ±  34.78 µs     3.84 ms …   3.96 ms  in 10 ×     26 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:100 ("text intent dispatch - caps field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.87 ms ±  43.72 µs     3.81 ms …   3.93 ms  in 10 ×     27 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:105 ("text intent dispatch - caps optional field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.82 ms ±  20.49 µs     3.78 ms …   3.85 ms  in 10 ×     27 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:110 ("text intent dispatch - direct call (1000 members)") ok
time (mean ± σ)         range (min … max) 
  48.89 ms ±   1.59 ms    47.63 ms …  52.94 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:115 ("text intent dispatch - caps field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  49.19 ms ± 683.35 µs    48.17 ms …  50.08 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:120 ("text intent dispatch - caps optional field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  49.97 ms ±   1.92 ms    48.39 ms …  54.94 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:143 ("isolated dispatch - direct call x1000") ok
time (mean ± σ)         range (min … max) 
 814.71 ns ±   2.56 ns   811.47 ns … 817.20 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) 
 814.24 ns ±   2.53 ns   810.79 ns … 817.45 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) 
 815.66 ns ±   4.36 ns   811.47 ns … 824.21 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.95 µs ±  18.13 ns     5.91 µs …   5.97 µs  in 10 ×  16562 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  22.59 µs ±  47.59 ns    22.53 µs …  22.65 µs  in 10 ×   4405 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
  97.41 µs ± 796.91 ns    96.63 µs …  98.81 µs  in 10 ×    925 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 410.77 µs ±   3.47 µs   405.78 µs … 416.97 µs  in 10 ×    243 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.46 µs ± 252.42 ns    11.17 µs …  11.83 µs  in 10 ×   8728 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 185.85 µs ±   1.81 µs   183.43 µs … 188.70 µs  in 10 ×    533 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 726.94 µs ±   5.03 µs   719.94 µs … 733.86 µs  in 10 ×    139 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  42.23 µs ± 509.06 ns    41.65 µs …  43.44 µs  in 10 ×   2394 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.12 µs ±  40.67 ns    11.07 µs …  11.17 µs  in 10 ×   9023 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 106.59 µs ±   4.42 µs   104.49 µs … 119.00 µs  in 10 ×    967 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:71 ("reconcile wide-siblings (320 defs)") ok
time (mean ± σ)         range (min … max) 
   1.36 ms ±   2.99 µs     1.36 ms …   1.37 ms  in 10 ×     73 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.51 ms ± 115.05 µs    13.42 ms …  13.82 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.62 µs ±  46.73 ns    11.57 µs …  11.72 µs  in 10 ×   8622 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:157 ("fp_incr unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  64.29 µs ±  93.49 ns    64.16 µs …  64.46 µs  in 10 ×   1558 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:166 ("fp_incr unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 623.97 µs ±   1.62 µs   621.82 µs … 625.70 µs  in 10 ×    157 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:175 ("fp_incr unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   5.35 ms ±  26.90 µs     5.31 ms …   5.39 ms  in 10 ×     19 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:186 ("fp_incr tail (20 defs)") ok
time (mean ± σ)         range (min … max) 
  21.97 µs ±  52.23 ns    21.88 µs …  22.02 µs  in 10 ×   4533 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:195 ("fp_incr tail (80 defs)") ok
time (mean ± σ)         range (min … max) 
  99.85 µs ± 420.37 ns    99.37 µs … 100.59 µs  in 10 ×   1002 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:204 ("fp_incr tail (320 defs)") ok
time (mean ± σ)         range (min … max) 
 781.31 µs ±   2.61 µs   777.85 µs … 784.76 µs  in 10 ×    128 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:213 ("fp_incr tail (1000 defs)") ok
time (mean ± σ)         range (min … max) 
   5.94 ms ±  22.66 µs     5.91 ms …   5.98 ms  in 10 ×     17 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:224 ("fp_incr shifted (20 defs)") ok
time (mean ± σ)         range (min … max) 
  56.92 µs ± 845.68 ns    56.21 µs …  59.06 µs  in 10 ×   1746 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:230 ("fp_incr shifted (80 defs)") ok
time (mean ± σ)         range (min … max) 
 224.69 µs ±   1.97 µs   222.87 µs … 229.80 µs  in 10 ×    432 runs
[dowdiness/canopy] bench projection/module_projection_incremental_benchmark_wbtest.mbt:236 ("fp_incr shifted (320 defs)") ok
time (mean ± σ)         range (min … max) 
 950.66 µs ±  20.96 µs   930.31 µs … 989.19 µ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.24 ms ± 100.64 µs     3.08 ms …   3.39 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]

event-graph-walker Benchmarks

Base branch:

Registry index updated successfully
Symbols updated successfully
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:21 ("merge - concurrent edits (2 agents x 10)") ok
time (mean ± σ)         range (min … max) 
  19.67 µs ±   1.22 µs    18.66 µs …  22.10 µs  in 10 ×   4869 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) 
  95.71 µs ± 309.33 ns    95.19 µs …  96.09 µs  in 10 ×   1043 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) 
 439.59 µs ±   5.44 µs   433.30 µs … 451.17 µs  in 10 ×    227 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) 
 125.25 µs ± 338.94 ns   124.90 µs … 125.98 µs  in 10 ×    788 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) 
  90.75 µs ±   1.06 µs    89.26 µs …  92.28 µs  in 10 ×   1100 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) 
  63.89 µs ± 393.06 ns    63.42 µs …  64.59 µs  in 10 ×   1572 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) 
  98.65 µs ± 592.05 ns    97.70 µs …  99.37 µs  in 10 ×   1023 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) 
 224.59 µs ±   1.14 µs   223.43 µs … 227.40 µs  in 10 ×    441 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.95 µs ±  15.81 µs    29.48 µs …  78.59 µs  in 10 ×   2050 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   4.35 µs ±  24.03 ns     4.32 µs …   4.38 µs  in 10 ×  23072 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  30.62 µs ± 162.35 ns    30.37 µs …  30.85 µs  in 10 ×   3279 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 413.86 µs ±  21.57 µs   402.81 µs … 474.35 µs  in 10 ×    247 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  12.56 µs ±   6.29 µs     9.68 µs …  28.09 µs  in 10 ×   7700 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
 100.37 µs ±  57.12 µs    62.81 µs … 232.43 µs  in 10 ×   1460 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  40.60 µs ± 396.84 ns    40.17 µs …  41.57 µs  in 10 ×   2476 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  40.27 µs ± 552.68 ns    39.82 µs …  41.31 µs  in 10 ×   2467 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:176 ("branch - repeated advance steady-state (10 iterations)") ok
time (mean ± σ)         range (min … max) 
  26.97 µs ± 667.58 ns    26.05 µs …  28.40 µs  in 10 ×   3767 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:220 ("branch - repeated advance with oplog mutations (10 iterations)") ok
time (mean ± σ)         range (min … max) 
   7.30 ms ±   3.41 ms     2.85 ms …  12.62 ms  in 10 ×     61 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  11.86 µs ±  49.44 ns    11.80 µs …  11.95 µs  in 10 ×   8360 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 122.01 µs ± 365.46 ns   121.45 µs … 122.50 µs  in 10 ×    818 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.04 µs ± 334.03 ns     3.84 µs …   4.89 µs  in 10 ×  25603 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  58.11 µs ±  32.63 µs    33.71 µs … 117.59 µs  in 10 ×   2007 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  20.64 ms ±   6.50 ms    10.28 ms …  29.13 ms  in 10 ×     23 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  15.13 µs ±   6.09 µs    12.74 µs …  32.37 µs  in 10 ×   6951 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 635.31 ns ±   6.90 ns   626.41 ns … 644.58 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.82 µs ±   6.84 ns     4.81 µs …   4.83 µs  in 10 ×  20769 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  45.57 µs ± 465.94 ns    45.31 µs …  46.83 µs  in 10 ×   2206 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:54 ("walker - concurrent branches (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
   6.11 µs ± 158.44 ns     6.04 µs …   6.56 µs  in 10 ×  16329 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:79 ("walker - concurrent branches (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
   6.03 µs ±   9.15 ns     6.02 µs …   6.05 µs  in 10 ×  16551 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.29 µs ±  32.86 ns     8.27 µs …   8.38 µs  in 10 ×  12027 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.48 µs ±  10.53 ns     3.47 µs …   3.50 µs  in 10 ×  28708 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.58 µs ±  32.78 ns     5.56 µs …   5.66 µs  in 10 ×  17972 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 463.84 µs ±   1.22 µs   462.72 µs … 465.63 µs  in 10 ×    216 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   7.61 ms ±  50.71 µs     7.55 ms …   7.71 ms  in 10 ×     14 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:213 ("walker - concurrent branches (100000 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
  24.63 ms ±   3.51 ms    22.31 ms …  31.22 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) 
  51.50 ns ±   0.38 ns    50.82 ns …  51.89 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) 
 146.00 ns ±   0.26 ns   145.59 ns … 146.55 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.04 µs ±   3.93 ns     1.04 µs …   1.05 µs  in 10 ×  95277 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) 
 187.12 ns ±   0.38 ns   186.22 ns … 187.73 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) 
 133.01 ns ±   1.13 ns   131.61 ns … 134.48 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) 
 536.08 ns ±   1.09 ns   534.81 ns … 537.41 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) 
 217.19 ns ±   0.48 ns   216.79 ns … 218.17 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.32 µs ±   1.53 ns     1.32 µs …   1.33 µs  in 10 ×  74973 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) 
 160.62 ns ±   1.72 ns   158.32 ns … 162.29 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) 
 133.75 ns ±   0.66 ns   132.89 ns … 134.72 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) 
 591.31 ns ±   0.84 ns   589.89 ns … 592.27 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) 
   5.01 µs ±  13.65 ns     5.00 µs …   5.04 µs  in 10 ×  19781 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) 
 216.39 ns ±   2.93 ns   213.81 ns … 223.39 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:230 ("version_vector - roundtrip (5 agents)") ok
time (mean ± σ)         range (min … max) 
   5.41 µs ± 204.16 ns     5.29 µs …   5.88 µs  in 10 ×  18874 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) 
  76.57 ns ±   0.61 ns    75.73 ns …  77.19 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.01 ns ±   0.54 ns    12.42 ns …  13.85 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) 
 193.38 µs ± 773.66 ns   192.45 µs … 194.68 µs  in 10 ×    475 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.91 ms ±  50.01 µs     2.87 ms …   3.01 ms  in 10 ×     35 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
   9.34 ms ± 199.25 µs     9.13 ms …   9.73 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.64 ms ±  83.52 µs     3.53 ms …   3.81 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) 
  32.73 ms ± 969.65 µs    31.28 ms …  33.92 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) 
 102.39 ns ±   0.24 ns   102.15 ns … 102.97 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) 
 102.36 ns ±   0.41 ns   101.94 ns … 103.03 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) 
 557.36 µs ±   2.93 µs   552.81 µs … 560.98 µs  in 10 ×    180 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 166.27 µs ±   1.06 µs   164.40 µs … 167.34 µs  in 10 ×    597 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:26 ("jump - concurrent insert into 1K doc") ok
time (mean ± σ)         range (min … max) 
 160.61 µs ± 962.29 ns   159.24 µs … 162.61 µs  in 10 ×    624 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.51 ms ±  85.51 µs     4.37 ms …   4.66 ms  in 10 ×     23 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 160.30 µs ± 323.26 ns   159.73 µs … 160.69 µs  in 10 ×    623 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  38.16 µs ± 902.92 ns    37.67 µs …  40.67 µs  in 10 ×   2533 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 494.22 µs ±   3.48 µs   487.34 µs … 496.87 µs  in 10 ×    203 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:34 ("oplog - insert and delete mix (100 ops)") ok
time (mean ± σ)         range (min … max) 
  55.22 µs ± 401.61 ns    54.45 µs …  55.72 µs  in 10 ×   1826 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  26.02 µs ± 123.82 ns    25.88 µs …  26.17 µs  in 10 ×   3861 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 237.14 ns ±   0.47 ns   236.35 ns … 237.66 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) 
  22.68 ns ±   0.30 ns    22.21 ns …  23.01 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) 
  26.03 ns ±   0.38 ns    25.40 ns …  26.68 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.54 µs ±  95.53 ns    11.43 µs …  11.72 µs  in 10 ×   8545 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  20.52 µs ±  72.82 ns    20.41 µs …  20.63 µs  in 10 ×   4136 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.74 µs ±   8.76 ns     5.73 µs …   5.75 µs  in 10 ×  17456 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   9.07 µs ±  37.71 ns     9.02 µs …   9.16 µs  in 10 ×  11591 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 224.17 µs ±   1.98 µs   222.94 µs … 229.61 µs  in 10 ×    451 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  37.25 µs ± 104.12 ns    37.12 µs …  37.43 µs  in 10 ×   2708 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 168.69 ms ±  26.40 ms   129.02 ms … 195.10 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) 
  68.85 ms ±  18.04 ms    48.75 ms …  92.50 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) 
  98.88 µs ± 445.84 ns    98.21 µs …  99.40 µs  in 10 ×    903 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.39 ms ±  16.34 µs     1.37 ms …   1.41 ms  in 10 ×     72 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 175.66 µs ± 520.75 ns   174.76 µs … 176.29 µs  in 10 ×    567 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) 
 242.85 µs ± 423.21 ns   241.92 µs … 243.35 µs  in 10 ×    412 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.68 µs ±  93.45 ns    14.57 µs …  14.80 µs  in 10 ×   6760 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 150.40 µs ± 615.29 ns   149.59 µs … 151.24 µs  in 10 ×    669 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  15.42 ns ±   0.47 ns    14.77 ns …  16.11 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) 
 106.49 ns ±   0.37 ns   105.94 ns … 106.94 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) 
 107.42 ns ±   0.59 ns   106.79 ns … 108.34 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.88 µs ± 164.61 ns    36.67 µs …  37.24 µs  in 10 ×   2710 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  49.45 µs ± 551.97 ns    48.68 µs …  50.22 µs  in 10 ×   2008 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 619.14 µs ±   3.14 µs   615.15 µs … 626.11 µs  in 10 ×    163 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) 
 102.65 µs ± 747.76 ns   101.84 µs … 103.83 µs  in 10 ×    977 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  14.87 µs ±  48.36 ns    14.78 µs …  14.96 µs  in 10 ×   6643 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 168.48 µs ± 464.17 ns   167.87 µs … 169.37 µs  in 10 ×    593 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:256 ("text - undo record_insert (100 ops, 1 group)") ok
time (mean ± σ)         range (min … max) 
   2.02 µs ±   3.75 ns     2.01 µs …   2.02 µs  in 10 ×  49562 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:269 ("text - undo record_insert (100 ops, 100 groups)") ok
time (mean ± σ)         range (min … max) 
   2.44 µs ±   8.90 ns     2.43 µs …   2.46 µs  in 10 ×  40733 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  30.09 µs ± 168.68 ns    29.84 µs …  30.29 µs  in 10 ×   3297 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 493.01 µs ±   3.27 µs   487.69 µs … 497.09 µs  in 10 ×    204 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:309 ("text - undo undo+redo roundtrip (10-op group)") ok
time (mean ± σ)         range (min … max) 
  33.26 µs ± 127.89 ns    33.06 µs …  33.46 µs  in 10 ×   3007 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) 
 291.90 µs ±   1.11 µs   290.58 µs … 293.64 µs  in 10 ×    343 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.40 ms ±  29.58 µs     1.36 ms …   1.44 ms  in 10 ×     71 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.62 ms ±  32.21 µs     3.56 ms …   3.66 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.28 ms ±  25.48 µs     2.24 ms …   2.31 ms  in 10 ×     44 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) 
   3.04 ms ±  43.78 µs     2.99 ms …   3.14 ms  in 10 ×     32 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) 
   8.11 µs ±   1.15 µs     7.11 µs …  10.24 µs  in 10 ×  14226 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.98 µs ±   1.52 µs     6.72 µs …  11.49 µs  in 10 ×  13666 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/btree@0.1.0
Downloading dowdiness/order-tree@0.1.0
Using cached dowdiness/rle@0.2.2
Downloading dowdiness/alga@0.3.0
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) 
  20.12 µs ±   1.69 µs    18.72 µs …  23.91 µs  in 10 ×   4904 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) 
  96.85 µs ± 347.43 ns    96.25 µs …  97.35 µs  in 10 ×   1027 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:97 ("merge - concurrent edits (2 agents x 200)") ok
time (mean ± σ)         range (min … max) 
 450.25 µs ±   4.02 µs   444.01 µs … 456.06 µs  in 10 ×    229 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) 
 125.46 µs ± 562.90 ns   124.55 µs … 126.24 µs  in 10 ×    793 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) 
  90.14 µs ±   1.14 µs    88.67 µs …  92.57 µs  in 10 ×   1113 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) 
  63.82 µs ± 180.40 ns    63.58 µs …  64.12 µs  in 10 ×   1555 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) 
  99.08 µs ± 939.03 ns    97.65 µs … 100.15 µs  in 10 ×   1022 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) 
 234.93 µs ± 866.93 ns   233.58 µs … 236.46 µs  in 10 ×    423 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:408 ("merge - context apply operations (50 ops)") ok
time (mean ± σ)         range (min … max) 
  40.94 µs ±  16.83 µs    30.13 µs …  82.88 µs  in 10 ×   1967 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   4.59 µs ±  36.97 ns     4.53 µs …   4.64 µs  in 10 ×  21750 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  31.27 µs ± 174.66 ns    31.07 µs …  31.57 µs  in 10 ×   3174 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 422.85 µs ±   3.87 µs   417.35 µs … 428.27 µs  in 10 ×    237 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  12.24 µs ±   3.73 µs     9.89 µs …  19.45 µs  in 10 ×   8056 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  92.68 µs ±  30.52 µs    65.89 µs … 167.74 µs  in 10 ×    969 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  40.96 µs ± 253.61 ns    40.64 µs …  41.40 µs  in 10 ×   2457 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  40.16 µs ± 210.33 ns    39.90 µs …  40.59 µs  in 10 ×   2486 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) 
  27.39 µs ±   2.14 µs    26.13 µs …  33.21 µs  in 10 ×   3621 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.47 ms ±   3.76 ms     2.69 ms …  13.65 ms  in 10 ×     62 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  12.02 µs ±  88.13 ns    11.93 µs …  12.19 µs  in 10 ×   8074 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 124.61 µs ± 652.61 ns   124.00 µs … 126.17 µs  in 10 ×    802 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 ± 528.44 ns     3.90 µs …   5.60 µs  in 10 ×  25112 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  54.88 µs ±  30.04 µs    33.76 µs … 121.40 µs  in 10 ×   2582 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  18.23 ms ±   5.85 ms     9.16 ms …  25.88 ms  in 10 ×     22 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  17.89 µs ±   5.84 µs    13.68 µs …  33.56 µs  in 10 ×   6381 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 637.13 ns ±   8.53 ns   626.94 ns … 648.01 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.96 µs ± 234.80 ns     4.84 µs …   5.52 µs  in 10 ×  20433 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  45.83 µs ± 667.75 ns    45.22 µs …  47.26 µs  in 10 ×   2191 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:54 ("walker - concurrent branches (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
   6.21 µs ±  57.67 ns     6.15 µs …   6.35 µs  in 10 ×  16033 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:79 ("walker - concurrent branches (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
   6.20 µs ±  21.38 ns     6.18 µs …   6.24 µs  in 10 ×  16150 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.66 µs ±  62.26 ns     8.62 µs …   8.84 µs  in 10 ×  11584 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.51 µs ±  16.36 ns     3.49 µs …   3.53 µs  in 10 ×  28467 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.57 µs ±  14.09 ns     5.55 µs …   5.59 µs  in 10 ×  17704 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 474.13 µs ±   2.52 µs   469.76 µs … 476.59 µs  in 10 ×    213 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   8.33 ms ± 190.80 µs     8.12 ms …   8.70 ms  in 10 ×     12 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:213 ("walker - concurrent branches (100000 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
  31.89 ms ±   3.76 ms    28.53 ms …  37.62 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) 
  51.79 ns ±   0.47 ns    50.88 ns …  52.29 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) 
 150.82 ns ±   3.80 ns   148.55 ns … 161.49 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:29 ("version_vector - create (20 agents)") ok
time (mean ± σ)         range (min … max) 
   1.05 µs ±   3.28 ns     1.05 µs …   1.06 µs  in 10 ×  94902 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) 
 202.22 ns ±  32.18 ns   191.34 ns … 293.77 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) 
 132.97 ns ±   1.04 ns   131.75 ns … 134.28 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) 
 528.03 ns ±   1.85 ns   525.87 ns … 530.60 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) 
 218.58 ns ±   0.79 ns   217.72 ns … 220.12 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.33 µs ±   3.19 ns     1.32 µs …   1.34 µs  in 10 ×  75078 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) 
 163.29 ns ±   0.75 ns   162.63 ns … 164.64 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) 
 134.12 ns ±   0.74 ns   133.11 ns … 135.43 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) 
 592.20 ns ±   3.03 ns   586.76 ns … 594.83 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) 
   5.04 µs ±  41.34 ns     5.01 µs …   5.15 µs  in 10 ×  20125 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) 
 213.24 ns ±   0.44 ns   212.38 ns … 213.92 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:230 ("version_vector - roundtrip (5 agents)") ok
time (mean ± σ)         range (min … max) 
   5.21 µs ±   6.75 ns     5.20 µs …   5.22 µs  in 10 ×  19200 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) 
  76.70 ns ±   0.57 ns    75.89 ns …  77.28 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.13 ns ±   0.48 ns    12.54 ns …  14.14 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) 
 188.06 µs ±   1.08 µs   186.47 µs … 190.25 µs  in 10 ×    487 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.87 ms ±  89.83 µs     2.77 ms …   3.04 ms  in 10 ×     36 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.07 ms ± 267.83 µs     8.82 ms …   9.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.59 ms ±  24.52 µs     3.55 ms …   3.63 ms  in 10 ×     27 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) 
  31.28 ms ± 512.36 µs    30.49 ms …  32.09 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.99 ns ±   0.35 ns   100.37 ns … 101.41 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:120 ("bench: warm cache position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
 100.62 ns ±   0.68 ns   100.01 ns … 101.86 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) 
 549.46 µs ±   2.25 µs   545.52 µs … 552.55 µs  in 10 ×    184 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 164.79 µs ±   1.09 µs   163.40 µs … 166.19 µs  in 10 ×    603 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) 
 158.74 µs ± 489.10 ns   158.22 µs … 159.66 µs  in 10 ×    631 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.82 ms ±  52.87 µs     4.76 ms …   4.91 ms  in 10 ×     21 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 159.41 µs ± 924.10 ns   158.14 µs … 161.08 µs  in 10 ×    630 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  39.88 µs ± 845.71 ns    39.33 µs …  42.19 µ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) 
 496.11 µs ±   1.90 µs   494.22 µs … 500.35 µs  in 10 ×    202 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) 
  56.82 µs ±   2.93 µs    54.68 µs …  63.79 µs  in 10 ×   1816 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  26.38 µs ± 131.41 ns    26.24 µs …  26.64 µs  in 10 ×   3773 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 202.76 ns ±   0.34 ns   202.32 ns … 203.32 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.66 ns ±   0.71 ns    26.98 ns …  29.01 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) 
  37.33 ns ±   1.11 ns    36.28 ns …  39.47 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.61 µs ±  51.10 ns    11.53 µs …  11.69 µs  in 10 ×   8515 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  20.99 µs ± 228.32 ns    20.72 µs …  21.56 µs  in 10 ×   4742 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.70 µs ±  23.68 ns     5.67 µs …   5.74 µs  in 10 ×  17412 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 ±  36.23 ns     8.98 µs …   9.08 µs  in 10 ×  11502 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 227.77 µs ± 915.53 ns   226.63 µs … 229.16 µs  in 10 ×    439 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  39.19 µs ± 241.89 ns    38.89 µs …  39.60 µs  in 10 ×   2562 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 159.33 ms ±  29.40 ms   120.60 ms … 191.65 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.17 ms ±  19.16 ms    47.45 ms …  92.78 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.59 µs ± 636.24 ns    95.78 µs …  98.02 µs  in 10 ×    901 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.34 ms ±  14.28 µs     1.31 ms …   1.35 ms  in 10 ×     78 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 174.10 µs ± 298.69 ns   173.50 µs … 174.50 µs  in 10 ×    571 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) 
 242.18 µs ± 385.97 ns   241.73 µs … 242.93 µs  in 10 ×    409 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  14.63 µs ±  81.31 ns    14.52 µs …  14.77 µs  in 10 ×   6800 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 149.65 µs ± 547.99 ns   148.79 µs … 150.39 µs  in 10 ×    672 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.07 ns ±   0.35 ns    12.74 ns …  13.59 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) 
 105.19 ns ±   0.33 ns   104.80 ns … 105.64 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) 
 105.59 ns ±   0.29 ns   105.26 ns … 106.02 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) 
  35.61 µs ± 274.25 ns    35.34 µs …  36.09 µs  in 10 ×   2776 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  48.77 µs ± 338.03 ns    48.25 µs …  49.24 µs  in 10 ×   2040 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 618.36 µs ±   5.28 µs   610.37 µs … 626.46 µs  in 10 ×    163 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) 
 102.04 µs ± 496.91 ns   101.33 µs … 102.72 µs  in 10 ×    989 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:216 ("text - checkout (midpoint of 100-op doc)") ok
time (mean ± σ)         range (min … max) 
  14.75 µs ±  83.76 ns    14.60 µs …  14.86 µs  in 10 ×   6735 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 169.46 µs ± 255.71 ns   169.10 µs … 169.94 µs  in 10 ×    591 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:256 ("text - undo record_insert (100 ops, 1 group)") ok
time (mean ± σ)         range (min … max) 
   2.01 µs ±   3.04 ns     2.00 µs …   2.01 µs  in 10 ×  49589 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:269 ("text - undo record_insert (100 ops, 100 groups)") ok
time (mean ± σ)         range (min … max) 
   2.43 µs ±   9.38 ns     2.42 µs …   2.44 µs  in 10 ×  41269 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  30.01 µs ± 678.91 ns    29.55 µs …  31.81 µs  in 10 ×   3337 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 491.27 µs ±   2.12 µs   488.09 µs … 495.01 µs  in 10 ×    203 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:309 ("text - undo undo+redo roundtrip (10-op group)") ok
time (mean ± σ)         range (min … max) 
  33.14 µs ± 161.79 ns    32.94 µs …  33.37 µs  in 10 ×   3047 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:324 ("text - undo 10 undo+redo cycles (10-op group)") ok
time (mean ± σ)         range (min … max) 
 288.43 µs ±   2.22 µs   285.06 µs … 291.93 µs  in 10 ×    343 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.40 ms ±  30.66 µ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.59 ms ±  62.87 µs     3.51 ms …   3.70 ms  in 10 ×     28 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.26 ms ±  20.34 µs     2.23 ms …   2.29 ms  in 10 ×     45 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) 
   3.07 ms ±  39.41 µs     3.02 ms …   3.13 ms  in 10 ×     34 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) 
   8.24 µs ±   1.07 µs     7.07 µs …  10.35 µs  in 10 ×  14438 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.80 µs ±   1.68 µs     6.46 µs …  11.78 µs  in 10 ×  13121 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: 1

🧹 Nitpick comments (1)
docs/decisions/2026-06-15-lambda-edit-bridge-boundary.md (1)

28-37: ⚡ Quick win

Rewrite audit table to maintain principle-level documentation per coding guidelines.

The audit table violates the guideline that architecture documentation (docs/**/*.md) must contain principles only and never reference specific types, fields, or line numbers. The table currently lists many implementation details: TreeEditError, SpanEdit, registry, definition_index, lang/lambda/companion/tree_edit_bridge_test.mbt, function names like apply_lambda_tree_edit and move_node, etc.

Reframe the comparison at the principle level. For example:

  • Return type: Replace specific result types with principle: "Stringly typed result vs. typed error variants + patch trace".
  • Context: Replace field names with principle: "Generic context vs. language-specific structures requiring derivation from projection root".
  • Module references: Replace file paths with principle: "Edit trace attestation requirements for inspector/patch consumers".

The core decision—that Lambda's application contract differs from the SPI in three persistent ways—is the principle that matters. The specific type/field names are implementation details that should not appear in architecture documentation.

📋 Reframed audit table template
| Dimension | Generic `LanguageSpec::apply_edit` | Lambda `apply_lambda_tree_edit` | Boundary decision |
|---|---|---|---|
| Required context | Fetches from editor; language closure computes edits from the generic shape: `(source, proj, source_map)` | Requires language-specific structures (registry, definition index) derived from projection state after cleanup; these are now derivable from the generic projection root, not requiring wider SPI context. | Context alone no longer blocks; Lambda remains separate because of application contract mismatch, not context width. |
| Return type | Stringly typed result covering all outcomes | Typed error variants covering multiple failure modes; returns applied edit trace alongside the result | Preserve typed errors and trace; do not flatten into generic result without deliberate FFI consumer migration. |
| Error transparency | Single error message per failure path | Multiple typed error branches for projection, parse, registry, transform, and edit failures | Keep typed errors as public API; do not drop them to unify the SPI. |
| Patch trace | Applies edits internally; no successful edit trace exposed | Returns exact SpanEdit array applied; inspector/patch consumers depend on the trace attestation | Preserve the trace as a public invariant. |
| Drop/move semantics | No editor-coupled branch; SPI only applies language-computed spans | Drop delegates to editor-owned `move_node` for placeholder/separator handling | Keep Drop out of SPI until another language requires the same editor coupling. |
| FFI/public callers | JSON/Markdown wrappers; callers observe `Ok(())` or error string | Lambda facade used by semantic/intent surfaces that depend on typed messages and patch traces | Keep facade stable; changing it breaks consumers. |
🤖 Prompt for 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.

In `@docs/decisions/2026-06-15-lambda-edit-bridge-boundary.md` around lines 28 -
37, The audit table in the decision document contains implementation-specific
details (type names like TreeEditError and SpanEdit, field names like registry
and definition_index, file paths like
lang/lambda/companion/tree_edit_bridge_test.mbt, and function names like
apply_lambda_tree_edit and move_node) that violate the architectural
documentation guideline requiring principles-only content. Rewrite each row of
the audit table to express the underlying architectural principle instead:
generalize "Return type" to discuss the contrast between stringly-typed results
versus typed error variants with patch tracing; replace "Context" field
references with the principle of generic versus language-specific structures;
replace file path citations with the principle of edit trace requirements for
downstream consumers; and similarly abstract the "Drop/move_node" row to the
principle of editor-coupled move semantics rather than specific function names.
Keep the core decision intact (that Lambda's contract differs in three
persistent ways from the SPI) but remove all concrete type names, field names,
file paths, and function references.

Source: Coding guidelines

🤖 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 `@docs/plans/2026-06-14-lambda-cstfold-modernization-623.md`:
- Around line 3-4: The Status line contains `#634` which the Markdown parser
misinterprets as an atx-style heading marker due to the missing space after the
`#` symbol. Fix this by escaping the issue reference with a backslash (change
`#634` to `\`#634``) or by rewording the Status line to avoid placing the issue
reference in a position where it could be parsed as a heading marker. Apply this
fix to both occurrences of `#634` in the Status line on lines 3-4 of the
document.

---

Nitpick comments:
In `@docs/decisions/2026-06-15-lambda-edit-bridge-boundary.md`:
- Around line 28-37: The audit table in the decision document contains
implementation-specific details (type names like TreeEditError and SpanEdit,
field names like registry and definition_index, file paths like
lang/lambda/companion/tree_edit_bridge_test.mbt, and function names like
apply_lambda_tree_edit and move_node) that violate the architectural
documentation guideline requiring principles-only content. Rewrite each row of
the audit table to express the underlying architectural principle instead:
generalize "Return type" to discuss the contrast between stringly-typed results
versus typed error variants with patch tracing; replace "Context" field
references with the principle of generic versus language-specific structures;
replace file path citations with the principle of edit trace requirements for
downstream consumers; and similarly abstract the "Drop/move_node" row to the
principle of editor-coupled move semantics rather than specific function names.
Keep the core decision intact (that Lambda's contract differs in three
persistent ways from the SPI) but remove all concrete type names, field names,
file paths, and function references.
🪄 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: 445baf8f-b629-4af7-b499-442e24d73da4

📥 Commits

Reviewing files that changed from the base of the PR and between 5e5da83 and b543595.

📒 Files selected for processing (7)
  • docs/README.md
  • docs/decisions/2026-06-15-lambda-edit-bridge-boundary.md
  • docs/development/ADDING_A_LANGUAGE.md
  • docs/plans/2026-06-11-s3-lang-runtime-extraction.md
  • docs/plans/2026-06-14-lambda-cstfold-modernization-623.md
  • lang/lambda/README.md
  • lang/runtime/README.md

Comment thread docs/plans/2026-06-14-lambda-cstfold-modernization-623.md Outdated
@dowdiness dowdiness force-pushed the lambda-edit-bridge-boundary-634 branch from b543595 to f20ac9f Compare June 15, 2026 09:20
@dowdiness dowdiness force-pushed the lambda-edit-bridge-boundary-634 branch from f20ac9f to c78d6f7 Compare June 15, 2026 09:24
@dowdiness dowdiness merged commit 54fed4a into main Jun 15, 2026
29 checks passed
@dowdiness dowdiness deleted the lambda-edit-bridge-boundary-634 branch June 15, 2026 09:41
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: revisit edit bridge after ModuleProjection removal

1 participant