Skip to content

refactor(ideal): extract value-derived Tabs UI helpers#684

Merged
dowdiness merged 1 commit into
mainfrom
refactor/ideal-tabs-cells
Jun 16, 2026
Merged

refactor(ideal): extract value-derived Tabs UI helpers#684
dowdiness merged 1 commit into
mainfrom
refactor/ideal-tabs-cells

Conversation

@dowdiness

@dowdiness dowdiness commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Summary

  • Extract shared Ideal tab chrome and headless rendering helpers into examples/ideal/main/ui/tabs.mbt.
  • Keep tab selection as durable value state in the parent Ideal model (mode and bottom_tab); no Rabbita Cell or Emit handles are stored in Model.
  • Toolbar Text/Structure controls keep button semantics (role=button, aria-pressed) while sharing the tab-style recipe from ui/tabs.mbt.
  • Bottom panel tabs render through shared tablist_view / tab_trigger_view helpers and the existing @tabs.Model keyboard/ARIA behavior.
  • Remove the temporary nested Tabs demo tab from the bottom panel.

Reuse check

Existing APIs considered:

API Location Reused? Reason if not
@tabs.Model dowdiness/rabbita-tabs/tabs Yes Headless keyboard navigation, roving tabindex, and ARIA tab attrs for the bottom panel
@tabs.tablist_attrs dowdiness/rabbita-tabs/tabs Yes Tablist role/label attrs via tablist_view
Existing toolbar button recipes examples/ideal/main/ui/button.mbt Yes Reused by toolbar_tab_class so toolbar mode controls retain button semantics
@rabbita.cell_with_emit rabbita/tea No Avoided because consumer Model must not store live Cell / Emit handles; tabs are derived from value state instead

New helpers added:

  • TabStyle: container/trigger class recipes for value-derived tablists.
  • tablist_view, tab_trigger_view, tab_panel_view: compositional headless rendering helpers.
  • toolbar_tab_class, tab_class, tabs_container_class: Ideal-local style recipes for toolbar and bottom-panel tab chrome.

Test plan

  • moon check passes
  • moon test passes
  • git diff *.mbti reviewed for unintended API surface changes
  • Targeted Ideal Playwright smoke covers toolbar button role/aria-pressed
  • JS build run for affected Ideal web example

Validation

cd examples/ideal && moon check
cd examples/ideal && moon test
# JS: 1438 passed; native: 70 passed

cd examples/ideal/web
MOON_WORK=off CANOPY_SKIP_RELAY_SERVER=1 CI=1 npx playwright test e2e/seed.spec.ts --reporter=line
# 3 passed

cd examples/ideal/web && npm run build
# passed

@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Introduces a self-contained make_tabs_cell abstraction in ui/tabs.mbt exporting Tab, TabsCellMsg, TabStyle, and view helpers (tablist_view, tab_trigger_view, tab_panel_view). Old tab class helpers are removed from button.mbt. view_bottom_tabs is rewritten to use the new view helpers, bottom_tabs_class is removed, and the CSS @source pipeline is extended to include tabs.mbt.

Changes

Tabs Cell Implementation and Wiring

Layer / File(s) Summary
Tab types, chrome helpers, and module dependencies
examples/ideal/main/ui/moon.pkg, examples/ideal/main/ui/tabs.mbt, examples/ideal/main/ui/pkg.generated.mbti, examples/ideal/main/ui/button.mbt
Adds rabbita/html/tabs imports; declares Tab, TabsCellMsg, TabStyle, and visual chrome helpers (tab_class, tabs_container_class, underline_tab_style, toolbar_tab_style, toolbar_tab_class); removes toolbar_tab_class and bottom_tab_class from button.mbt; reflects new types in the generated interface.
make_tabs_cell, view helpers, and generated API surface
examples/ideal/main/ui/tabs.mbt, examples/ideal/main/ui/pkg.generated.mbti
Implements make_tabs_cell with owned selected_index, TabActivated/SetSelected handling, and dual semantic/non-semantic render paths; exports headless behavior, tablist_view, tab_trigger_view, tab_panel_view; adds private button_group_view and button_trigger_view; updates pkg.generated.mbti Values with the complete new API.
Bottom panel and editor wiring
examples/ideal/main/view_bottom.mbt, examples/ideal/main/view_bottom_classes.mbt, examples/ideal/main/main.mbt, examples/ideal/web/styles/editor.css
Replaces view_bottom_tabs manual loop with @ui.tablist_view/tab_trigger_view; removes bottom_tabs_class constant; renames cmd to js_cmd in the SetMode branch; adds @source "../../main/ui/tabs.mbt" to the stylesheet pipeline.

Sequence Diagram(s)

sequenceDiagram
  participant Parent as Parent Cell
  participant make_tabs_cell as make_tabs_cell
  participant tabs_Model as `@tabs.Model`
  participant view_bottom as view_bottom_tabs

  Parent->>make_tabs_cell: TabActivated(index)
  make_tabs_cell->>make_tabs_cell: bounds-check index
  make_tabs_cell->>tabs_Model: `@tabs.Model`::new(id, tab_count, selected)
  make_tabs_cell->>Parent: on_select(tab_id) batched with focus_cmd

  Parent->>make_tabs_cell: SetSelected(index)
  make_tabs_cell->>make_tabs_cell: bounds-check, update selected_index

  view_bottom->>make_tabs_cell: tablist_view + tab_trigger_view per tab
  make_tabs_cell-->>view_bottom: rendered `@html.Html`
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • dowdiness/canopy#235: Modifies SelectBottomTab/focus behavior in main.mbt and the tablist rendering/ARIA/keyboard-nav logic in view_bottom.mbt, the same files touched by the bottom-panel wiring changes here.

Poem

🐇 A new make_tabs_cell hops into view,
With TabStyle and TabsCellMsg fresh and true.
Old bottom_tab_class has hopped away,
tablist_view renders a brighter day.
The rabbit typed classes with ears held high —
Semantic tabs now reach the sky! 🌟

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly references the main refactoring objective: extracting Tab UI helpers into a dedicated, reusable component. It accurately summarizes the primary change across the changeset.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/ideal-tabs-cells

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 16, 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 ff17b70 Commit Preview URL

Branch Preview URL
Jun 16 2026, 01:54 PM

@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: 3

🤖 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/agents/tailwind-plus-rabbita.md`:
- Around line 11-13: Add a language tag to the fenced code block containing
"reference/tailwind-plus/ui-blocks/" to satisfy markdownlint. Change the opening
fence from a bare triple backtick to triple backtick followed by "text" (e.g.,
```text) to specify the content format while keeping the content unchanged. This
satisfies the markdownlint requirement for fenced code blocks to have a language
identifier.

In `@examples/ideal/main/ui/tabs.mbt`:
- Around line 160-172: Replace the imperative for loop that pushes to the
mutable triggers array with a declarative array construction method. Instead of
using a for loop with push operations on tabs, use MoonBit's functional array
methods such as Array.mapi to create the triggers array in one expression. The
mapi function should iterate over the tabs with their indices and return
tab_trigger_view results directly, eliminating the need for imperative mutation.
Assign the result of this declarative mapping directly to triggers rather than
building it incrementally with push calls.

In `@examples/ideal/main/view_bottom_classes.mbt`:
- Around line 2-4: Update the comment in the bottom-panel tab strip chrome
ownership section to reference the correct symbol name. The comment currently
references canopy_tabs_container_class, but the actual API exported from
main/ui/tabs.mbt is tabs_container_class(). Replace the incorrect symbol
reference with the correct function name tabs_container_class() to ensure the
comment accurately directs readers to the proper symbol.
🪄 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: 93724309-405d-4a27-8a69-85d9d3e0842a

📥 Commits

Reviewing files that changed from the base of the PR and between 3611276 and ad912ab.

📒 Files selected for processing (14)
  • .gitignore
  • docs/TODO.md
  • docs/agents/tailwind-plus-rabbita.md
  • examples/ideal/main/main.mbt
  • examples/ideal/main/model.mbt
  • examples/ideal/main/msg.mbt
  • examples/ideal/main/pkg.generated.mbti
  • examples/ideal/main/ui/button.mbt
  • examples/ideal/main/ui/moon.pkg
  • examples/ideal/main/ui/pkg.generated.mbti
  • examples/ideal/main/ui/tabs.mbt
  • examples/ideal/main/view_bottom.mbt
  • examples/ideal/main/view_bottom_classes.mbt
  • examples/ideal/web/styles/editor.css

Comment thread docs/agents/tailwind-plus-rabbita.md Outdated
Comment thread examples/ideal/main/ui/tabs.mbt Outdated
Comment thread examples/ideal/main/view_bottom_classes.mbt Outdated

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ad912ab5f2

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread examples/ideal/main/main.mbt Outdated
Comment thread examples/ideal/main/main.mbt Outdated
@dowdiness dowdiness force-pushed the refactor/ideal-tabs-cells branch from ad912ab to b06bb87 Compare June 16, 2026 12:06

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b06bb8729d

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread examples/ideal/main/model.mbt Outdated
@dowdiness dowdiness force-pushed the refactor/ideal-tabs-cells branch from b06bb87 to a84fa14 Compare June 16, 2026 12:39
@github-actions

github-actions Bot commented Jun 16, 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) 
  59.51 µs ± 649.37 ns    58.41 µs …  60.72 µs  in 10 ×   1630 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   2.82 µs ±   9.65 ns     2.81 µs …   2.84 µs  in 10 ×  39121 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
 937.62 µs ±   8.05 µs   923.51 µs … 945.06 µs  in 10 ×     99 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  25.43 µs ± 840.64 ns    24.74 µs …  27.63 µs  in 10 ×   3756 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  14.33 ms ± 107.36 µs    14.17 ms …  14.47 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 493.30 µs ±   7.89 µs   479.54 µs … 505.38 µs  in 10 ×    208 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  50.43 µs ± 359.25 ns    49.91 µs …  51.06 µs  in 10 ×   1970 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  45.85 µs ± 512.49 ns    45.26 µs …  47.07 µs  in 10 ×   2214 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 643.73 µs ±   6.13 µs   637.22 µs … 655.49 µs  in 10 ×    155 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 665.99 µs ±  14.70 µs   647.91 µs … 693.18 µs  in 10 ×    153 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:44 ("bench/incr_tap/snapshot_fanout_256") ok
time (mean ± σ)         range (min … max) 
  56.86 µs ±   1.02 µs    56.02 µs …  59.53 µs  in 10 ×   1663 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 594.83 µs ±   5.55 µs   586.69 µs … 602.28 µs  in 10 ×    171 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:58 ("bench/incr_tap/to_visual_graph_fanout_256") ok
time (mean ± σ)         range (min … max) 
 116.19 µs ± 252.43 ns   115.93 µs … 116.80 µs  in 10 ×    858 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:64 ("bench/incr_tap/to_visual_graph_fanout_2048") ok
time (mean ± σ)         range (min … max) 
   1.11 ms ±  14.88 µs     1.09 ms …   1.14 ms  in 10 ×     92 runs
Total tests: 14, passed: 14, failed: 0. [wasm-gc]
node count: 402
node count: 802
node count: 2002
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:32 ("viewnode serialization (100 defs)") ok
time (mean ± σ)         range (min … max) 
   1.45 ms ±  22.77 µs     1.42 ms …   1.50 ms  in 10 ×     70 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:43 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   3.31 ms ±  37.81 µs     3.24 ms …   3.36 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.30 ms ± 705.72 µs    14.41 ms …  16.58 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.47 ms ±  72.60 µs     2.37 ms …   2.55 ms  in 10 ×     41 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.04 ms ±  53.35 µs   976.31 µs …   1.13 ms  in 10 ×     90 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.09 ms ±  57.85 µs     4.03 ms …   4.21 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.88 ms ± 712.63 µs    27.13 ms …  29.19 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) 
  63.57 ms ±   5.03 ms    57.64 ms …  69.37 ms  in 10 ×      1 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:118 ("json array - incremental keystroke (20 elements)") ok
time (mean ± σ)         range (min … max) 
 762.63 µs ± 139.99 µs   560.73 µs … 953.34 µs  in 10 ×    187 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 ±  47.88 µs     1.86 ms …   2.00 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) 
  13.03 ms ± 156.67 µs    12.82 ms …  13.34 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.40 ms ±   1.24 ms    32.38 ms …  36.65 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.94 ms ±  34.73 µs     3.86 ms …   3.97 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.83 ms ±  23.05 µs     3.79 ms …   3.86 ms  in 10 ×     26 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:105 ("text intent dispatch - caps optional field (100 members)") ok
time (mean ± σ)         range (min … max) 
   3.86 ms ±  49.98 µs     3.80 ms …   3.94 ms  in 10 ×     27 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:110 ("text intent dispatch - direct call (1000 members)") ok
time (mean ± σ)         range (min … max) 
  51.58 ms ±   1.94 ms    49.93 ms …  56.79 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:115 ("text intent dispatch - caps field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  51.68 ms ± 779.19 µs    50.76 ms …  52.83 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) 
  51.78 ms ± 519.98 µs    50.73 ms …  52.34 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:143 ("isolated dispatch - direct call x1000") ok
time (mean ± σ)         range (min … max) 
 676.79 ns ±   3.71 ns   673.48 ns … 684.41 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) 
 677.10 ns ±   4.06 ns   671.37 ns … 683.14 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) 
 727.18 ns ±   5.57 ns   720.71 ns … 735.15 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.77 µs ±   8.72 ns     5.76 µs …   5.79 µs  in 10 ×  14910 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  22.66 µs ±  59.31 ns    22.60 µs …  22.77 µs  in 10 ×   4289 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 107.53 µs ±   2.52 µs   105.67 µs … 113.46 µs  in 10 ×    935 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 460.54 µs ±   1.71 µs   457.96 µs … 463.06 µs  in 10 ×    219 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  10.68 µs ±  30.70 ns    10.63 µs …  10.71 µs  in 10 ×   9396 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 207.30 µs ± 502.63 ns   206.60 µs … 208.00 µs  in 10 ×    486 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 752.63 µs ±   3.03 µs   748.75 µs … 757.05 µs  in 10 ×    133 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  44.40 µs ±   1.85 µs    43.32 µs …  48.38 µs  in 10 ×   2310 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.18 µs ±  39.23 ns    11.13 µs …  11.26 µs  in 10 ×   8957 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 102.27 µs ± 169.41 ns   102.02 µs … 102.48 µs  in 10 ×    979 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.89 µs     1.36 ms …   1.36 ms  in 10 ×     74 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.37 ms ±  54.82 µs    13.28 ms …  13.43 ms  in 10 ×      8 runs
Total tests: 33, passed: 33, failed: 0. [js]
Warning: no test entry found.
Total tests: 0, passed: 0, failed: 0. [native]

PR branch:

Registry index updated successfully
Symbols updated successfully
Using cached moonbitlang/async@0.16.8
Using cached moonbitlang/quickcheck@0.14.0
Using cached moonbitlang/x@0.4.38
Downloading dowdiness/incr@0.9.0
Downloading dowdiness/rle@0.2.2
[dowdiness/btree] bench btree_benchmark.mbt:79 ("bench: build via inserts (100)") ok
time (mean ± σ)         range (min … max) 
  59.13 µs ±   1.27 µs    57.80 µs …  61.89 µs  in 10 ×   1631 runs
[dowdiness/btree] bench btree_benchmark.mbt:84 ("bench: build via from_sorted (100)") ok
time (mean ± σ)         range (min … max) 
   2.83 µs ±   9.72 ns     2.82 µs …   2.85 µs  in 10 ×  39275 runs
[dowdiness/btree] bench btree_benchmark.mbt:91 ("bench: build via inserts (1000)") ok
time (mean ± σ)         range (min … max) 
 930.75 µs ±  10.09 µs   914.93 µs … 940.13 µs  in 10 ×     99 runs
[dowdiness/btree] bench btree_benchmark.mbt:96 ("bench: build via from_sorted (1000)") ok
time (mean ± σ)         range (min … max) 
  24.72 µs ± 116.08 ns    24.54 µs …  24.96 µs  in 10 ×   4095 runs
[dowdiness/btree] bench btree_benchmark.mbt:103 ("bench: build via inserts (10000)") ok
time (mean ± σ)         range (min … max) 
  14.50 ms ± 618.73 µs    14.05 ms …  15.97 ms  in 10 ×      7 runs
[dowdiness/btree] bench btree_benchmark.mbt:108 ("bench: build via from_sorted (10000)") ok
time (mean ± σ)         range (min … max) 
 490.77 µs ±   6.02 µs   479.86 µs … 497.63 µs  in 10 ×    206 runs
[dowdiness/btree] bench btree_benchmark.mbt:115 ("bench: delete_range middle 10% (1000)") ok
time (mean ± σ)         range (min … max) 
  50.08 µs ± 417.94 ns    49.66 µs …  51.06 µs  in 10 ×   1913 runs
[dowdiness/btree] bench btree_benchmark.mbt:124 ("bench: delete_range middle 50% (1000)") ok
time (mean ± σ)         range (min … max) 
  44.98 µs ± 179.84 ns    44.76 µs …  45.27 µs  in 10 ×   2222 runs
[dowdiness/btree] bench btree_benchmark.mbt:133 ("bench: delete_range middle 10% (10000)") ok
time (mean ± σ)         range (min … max) 
 638.78 µs ±   2.27 µs   634.77 µs … 641.06 µs  in 10 ×    149 runs
[dowdiness/btree] bench btree_benchmark.mbt:142 ("bench: delete_range middle 50% (10000)") ok
time (mean ± σ)         range (min … max) 
 653.64 µs ±   9.62 µs   640.04 µs … 664.67 µs  in 10 ×    154 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:44 ("bench/incr_tap/snapshot_fanout_256") ok
time (mean ± σ)         range (min … max) 
  56.95 µs ±   1.04 µs    56.18 µs …  59.81 µs  in 10 ×   1672 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:51 ("bench/incr_tap/snapshot_fanout_2048") ok
time (mean ± σ)         range (min … max) 
 594.73 µs ±   6.33 µs   586.88 µs … 606.54 µs  in 10 ×    171 runs
[dowdiness/visualizer] bench incr_tap_benchmark.mbt:58 ("bench/incr_tap/to_visual_graph_fanout_256") ok
time (mean ± σ)         range (min … max) 
 117.96 µs ±   2.99 µs   115.73 µs … 123.52 µs  in 10 ×    836 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 ±   9.09 µs     1.08 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.44 ms ±  11.29 µs     1.41 ms …   1.45 ms  in 10 ×     70 runs
[dowdiness/canopy] bench editor/view_updater_benchmark_wbtest.mbt:43 ("viewnode serialization (200 defs)") ok
time (mean ± σ)         range (min … max) 
   3.40 ms ±  41.70 µs     3.32 ms …   3.45 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.28 ms ± 848.32 µs    14.41 ms …  16.42 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.36 ms ±  58.38 µs     1.29 ms …   1.44 ms  in 10 ×     75 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:98 ("json object - incremental keystroke (20 members)") ok
time (mean ± σ)         range (min … max) 
   1.06 ms ±  51.76 µs   993.16 µs …   1.15 ms  in 10 ×     88 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:103 ("json object - incremental keystroke (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.19 ms ±  41.99 µs     4.15 ms …   4.26 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.51 ms ± 312.38 µs    27.20 ms …  28.10 ms  in 10 ×      4 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:113 ("json object - incremental keystroke (1000 members)") ok
time (mean ± σ)         range (min … max) 
  62.35 ms ± 530.52 µs    61.82 ms …  63.29 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) 
 778.99 µs ± 148.88 µs   574.21 µs … 990.72 µs  in 10 ×    197 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 ±  62.78 µs     1.93 ms …   2.12 ms  in 10 ×     53 runs
[dowdiness/canopy] bench lang/json/companion/json_benchmark.mbt:128 ("json array - incremental keystroke (500 elements)") ok
time (mean ± σ)         range (min … max) 
  13.28 ms ±  60.98 µs    13.19 ms …  13.38 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) 
  34.48 ms ±   1.38 ms    33.25 ms …  38.06 ms  in 10 ×      3 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:95 ("text intent dispatch - direct call (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.12 ms ± 118.35 µs     4.00 ms …   4.32 ms  in 10 ×     25 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:100 ("text intent dispatch - caps field (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.05 ms ± 144.46 µs     3.93 ms …   4.39 ms  in 10 ×     25 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:105 ("text intent dispatch - caps optional field (100 members)") ok
time (mean ± σ)         range (min … max) 
   4.03 ms ± 102.31 µs     3.93 ms …   4.22 ms  in 10 ×     26 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:110 ("text intent dispatch - direct call (1000 members)") ok
time (mean ± σ)         range (min … max) 
  51.72 ms ±   2.68 ms    50.46 ms …  59.31 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:115 ("text intent dispatch - caps field (1000 members)") ok
time (mean ± σ)         range (min … max) 
  51.29 ms ± 597.30 µs    50.42 ms …  52.15 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) 
  52.19 ms ±   2.30 ms    50.76 ms …  58.41 ms  in 10 ×      2 runs
[dowdiness/canopy] bench lang/json/companion/dispatch_benchmark.mbt:143 ("isolated dispatch - direct call x1000") ok
time (mean ± σ)         range (min … max) 
 679.89 ns ±   7.71 ns   667.63 ns … 692.64 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) 
 680.47 ns ±   6.74 ns   671.32 ns … 689.29 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) 
 679.90 ns ±   6.34 ns   672.00 ns … 690.51 ns  in 10 × 100000 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:38 ("tree refresh unchanged (20 defs)") ok
time (mean ± σ)         range (min … max) 
   6.12 µs ± 204.36 ns     6.03 µs …   6.69 µs  in 10 ×  16125 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:48 ("tree refresh unchanged (80 defs)") ok
time (mean ± σ)         range (min … max) 
  23.97 µs ±  97.80 ns    23.86 µs …  24.14 µs  in 10 ×   4062 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:58 ("tree refresh unchanged (320 defs)") ok
time (mean ± σ)         range (min … max) 
 111.59 µs ±   4.88 µs   109.41 µs … 125.35 µs  in 10 ×    839 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:68 ("tree refresh unchanged (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 420.49 µs ±   1.95 µs   417.56 µs … 423.10 µs  in 10 ×    239 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:80 ("tree refresh 1 changed (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.28 µs ±  20.27 ns    11.26 µs …  11.32 µs  in 10 ×   8863 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:95 ("tree refresh 1 changed (320 defs)") ok
time (mean ± σ)         range (min … max) 
 208.01 µs ±   2.40 µs   206.17 µs … 214.19 µs  in 10 ×    477 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:110 ("tree refresh 1 changed (1000 defs)") ok
time (mean ± σ)         range (min … max) 
 799.32 µs ±   4.17 µs   792.34 µs … 805.49 µs  in 10 ×    126 runs
[dowdiness/canopy] bench projection/tree_refresh_benchmark_wbtest.mbt:125 ("tree refresh 1 changed (80 defs)") ok
time (mean ± σ)         range (min … max) 
  46.28 µs ± 174.17 ns    46.07 µs …  46.59 µs  in 10 ×   2166 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:61 ("reconcile wide-siblings (20 defs)") ok
time (mean ± σ)         range (min … max) 
  11.05 µs ±  19.43 ns    11.03 µs …  11.09 µs  in 10 ×   9060 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:66 ("reconcile wide-siblings (80 defs)") ok
time (mean ± σ)         range (min … max) 
 103.26 µs ± 353.28 ns   102.98 µs … 104.00 µs  in 10 ×    971 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.43 µs     1.36 ms …   1.36 ms  in 10 ×     74 runs
[dowdiness/canopy] bench projection/reconcile_lcs_benchmark_wbtest.mbt:76 ("reconcile wide-siblings (1000 defs)") ok
time (mean ± σ)         range (min … max) 
  13.43 ms ±  36.49 µs    13.36 ms …  13.47 ms  in 10 ×      8 runs
Total tests: 33, passed: 33, failed: 0. [js]
Warning: no test entry found.
Total tests: 0, passed: 0, failed: 0. [native]

event-graph-walker Benchmarks

Base branch:

Registry index updated successfully
Symbols updated successfully
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:21 ("merge - concurrent edits (2 agents x 10)") ok
time (mean ± σ)         range (min … max) 
  20.51 µs ± 689.65 ns    19.87 µs …  22.08 µs  in 10 ×   4600 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) 
 105.53 µs ± 596.89 ns   104.78 µs … 106.39 µs  in 10 ×    956 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) 
 469.43 µs ±   3.82 µs   462.81 µs … 474.32 µs  in 10 ×    212 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) 
 136.74 µs ±   3.45 µs   134.67 µs … 144.25 µs  in 10 ×    733 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) 
  98.38 µs ± 481.34 ns    97.68 µs …  99.03 µs  in 10 ×   1022 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) 
  67.40 µs ± 266.91 ns    67.01 µs …  67.78 µs  in 10 ×   1486 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) 
 102.27 µs ± 180.11 ns   101.98 µs … 102.46 µs  in 10 ×    982 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:341 ("merge - retreat concurrent deletes (500 items, 50 deletes)") ok
time (mean ± σ)         range (min … max) 
 211.84 µs ±   1.11 µs   210.79 µs … 214.29 µs  in 10 ×    474 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) 
  48.83 µs ±  26.22 µs    26.59 µs … 101.14 µs  in 10 ×   2303 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   4.17 µs ±  78.84 ns     4.09 µs …   4.33 µs  in 10 ×  24467 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  28.72 µs ± 111.05 ns    28.59 µs …  28.90 µs  in 10 ×   3498 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 385.48 µs ±   2.65 µs   381.92 µs … 391.08 µs  in 10 ×    252 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  10.77 µs ±   2.86 µs     9.27 µs …  18.76 µs  in 10 ×   9586 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  74.21 µs ±  25.86 µs    60.06 µs … 131.05 µs  in 10 ×   1549 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  37.11 µs ± 207.16 ns    36.92 µs …  37.47 µs  in 10 ×   2697 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  36.03 µs ± 115.72 ns    35.89 µs …  36.19 µs  in 10 ×   2785 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.76 µs ±   3.30 µs    25.79 µs …  35.63 µs  in 10 ×   3513 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.64 ms ±   3.95 ms     2.78 ms …  14.08 ms  in 10 ×     67 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  11.14 µs ±  49.76 ns    11.08 µs …  11.24 µs  in 10 ×   8920 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 118.58 µs ±   1.08 µs   117.54 µs … 120.84 µs  in 10 ×    854 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   3.93 µs ± 187.78 ns     3.76 µs …   4.34 µs  in 10 ×  25194 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  41.55 µs ±  12.85 µs    32.52 µs …  73.83 µs  in 10 ×   2038 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  14.95 ms ±   4.72 ms     7.93 ms …  21.31 ms  in 10 ×     17 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  14.89 µs ±   5.75 µs    12.63 µs …  31.15 µs  in 10 ×   7199 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 640.02 ns ±   7.74 ns   629.77 ns … 648.39 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.79 µs ±   2.51 ns     4.79 µs …   4.80 µs  in 10 ×  20828 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  43.33 µs ± 446.87 ns    42.92 µs …  44.11 µs  in 10 ×   2326 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:54 ("walker - concurrent branches (2 agents x 50)") ok
time (mean ± σ)         range (min … max) 
   5.99 µs ±  13.37 ns     5.97 µs …   6.02 µs  in 10 ×  16690 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.07 µs ± 228.23 ns     5.94 µs …   6.59 µs  in 10 ×  16798 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.20 µs ± 101.06 ns     8.15 µs …   8.48 µs  in 10 ×  12225 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.50 µs ±  37.50 ns     3.45 µs …   3.55 µs  in 10 ×  28836 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.55 µs ±  26.34 ns     5.52 µs …   5.60 µs  in 10 ×  18050 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 461.78 µs ±  13.35 µs   452.83 µs … 495.57 µs  in 10 ×    220 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:196 ("walker - linear history (100000 ops)") ok
time (mean ± σ)         range (min … max) 
   6.99 ms ±  95.87 µs     6.89 ms …   7.21 ms  in 10 ×     15 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:213 ("walker - concurrent branches (100000 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
  24.15 ms ±   2.37 ms    21.83 ms …  28.48 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:6 ("version_vector - create (1 agent)") ok
time (mean ± σ)         range (min … max) 
  50.13 ns ±   0.27 ns    49.58 ns …  50.49 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:15 ("version_vector - create (5 agents)") ok
time (mean ± σ)         range (min … max) 
 139.87 ns ±   0.76 ns   138.87 ns … 141.11 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 ±   4.57 ns     1.05 µs …   1.07 µs  in 10 ×  94982 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) 
 171.01 ns ±   0.37 ns   170.59 ns … 171.66 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) 
 119.43 ns ±   0.44 ns   118.81 ns … 120.18 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:84 ("version_vector - compare <= (20 agents)") ok
time (mean ± σ)         range (min … max) 
 471.15 ns ±   1.16 ns   469.50 ns … 472.56 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) 
 202.82 ns ±   0.65 ns   202.13 ns … 204.03 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:118 ("version_vector - merge (20 agents)") ok
time (mean ± σ)         range (min … max) 
   1.28 µs ±   3.27 ns     1.28 µs …   1.28 µs  in 10 ×  78613 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) 
 142.48 ns ±   0.70 ns   141.68 ns … 143.50 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:153 ("version_vector - concurrent (5 agents)") ok
time (mean ± σ)         range (min … max) 
 122.71 ns ±   0.89 ns   121.39 ns … 124.07 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) 
 571.58 ns ±   1.49 ns   570.03 ns … 574.87 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:186 ("version_vector - from_frontier (100 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.75 µs ±   6.99 ns     4.74 µs …   4.77 µs  in 10 ×  20931 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:206 ("version_vector - to_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
 196.44 ns ±   0.63 ns   195.71 ns … 197.40 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:230 ("version_vector - roundtrip (5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.96 µs ±  18.38 ns     4.94 µs …   4.99 µs  in 10 ×  20083 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:251 ("version_vector - agents (5 agents)") ok
time (mean ± σ)         range (min … max) 
  67.52 ns ±   0.55 ns    66.90 ns …  68.57 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:266 ("version_vector - length (20 agents)") ok
time (mean ± σ)         range (min … max) 
  12.94 ns ±   0.63 ns    12.21 ns …  13.86 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) 
 195.79 µs ±   2.73 µs   192.23 µs … 200.50 µs  in 10 ×    477 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.00 ms ± 101.86 µs     2.86 ms …   3.13 ms  in 10 ×     34 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
  10.19 ms ± 251.36 µs     9.99 ms …  10.72 ms  in 10 ×     10 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.63 ms ±  50.13 µs     3.56 ms …   3.70 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.94 ms ±   1.23 ms    31.64 ms …  34.75 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) 
  96.54 ns ±   0.41 ns    95.97 ns …  97.34 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) 
  95.77 ns ±   0.71 ns    95.02 ns …  96.96 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) 
 538.24 µs ±   2.41 µs   534.06 µs … 541.64 µs  in 10 ×    186 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 152.57 µs ± 670.85 ns   151.68 µs … 153.51 µs  in 10 ×    648 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) 
 153.42 µs ±   6.69 µs   149.21 µs … 167.94 µs  in 10 ×    660 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.35 ms ± 100.24 µs     4.22 ms …   4.53 ms  in 10 ×     24 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:90 ("jump - degenerate chain remote insert") ok
time (mean ± σ)         range (min … max) 
 150.41 µs ± 662.37 ns   149.42 µs … 151.25 µs  in 10 ×    663 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  42.46 µs ± 772.82 ns    41.97 µs …  44.62 µs  in 10 ×   2320 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 503.01 µs ±   6.45 µs   496.29 µs … 517.69 µs  in 10 ×    197 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:34 ("oplog - insert and delete mix (100 ops)") ok
time (mean ± σ)         range (min … max) 
  62.56 µs ± 148.88 ns    62.39 µs …  62.80 µs  in 10 ×   1598 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  28.76 µs ±  87.12 ns    28.63 µs …  28.89 µs  in 10 ×   3489 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 188.25 ns ±   0.94 ns   187.13 ns … 190.31 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:97 ("oplog - get_frontier (single agent)") ok
time (mean ± σ)         range (min … max) 
  20.24 ns ±   0.25 ns    19.86 ns …  20.62 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:112 ("oplog - get_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
  24.61 ns ±   0.26 ns    24.25 ns …  24.92 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.38 µs ±  57.75 ns    11.29 µs …  11.46 µs  in 10 ×   8740 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  18.80 µs ±  83.70 ns    18.66 µs …  18.89 µs  in 10 ×   5323 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.46 µs ±  30.51 ns     5.43 µs …   5.53 µs  in 10 ×  18274 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   8.81 µs ±  24.65 ns     8.77 µs …   8.85 µs  in 10 ×  11678 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 230.15 µs ± 499.29 ns   229.43 µs … 230.72 µs  in 10 ×    435 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  41.72 µs ± 268.67 ns    41.38 µs …  42.13 µs  in 10 ×   2392 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 158.47 ms ±  23.91 ms   124.56 ms … 182.40 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) 
  63.44 ms ±  12.19 ms    44.92 ms …  79.62 ms  in 10 ×      2 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:10 ("text - insert append (100 chars)") ok
time (mean ± σ)         range (min … max) 
  95.93 µs ± 354.30 ns    95.56 µs …  96.46 µs  in 10 ×    943 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:22 ("text - insert append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.30 ms ±  16.30 µs     1.28 ms …   1.32 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) 
 158.31 µs ± 893.49 ns   157.53 µs … 160.06 µs  in 10 ×    632 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) 
 235.30 µs ± 657.16 ns   234.25 µs … 236.26 µs  in 10 ×    423 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.86 µs ±  99.63 ns    13.75 µs …  14.00 µs  in 10 ×   7145 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 146.29 µs ± 691.86 ns   145.26 µs … 147.52 µs  in 10 ×    687 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  12.67 ns ±   0.40 ns    12.23 ns …  13.28 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:113 ("text - sync export_all (100 ops)") ok
time (mean ± σ)         range (min … max) 
  94.43 ns ±   0.62 ns    93.50 ns …  95.19 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:126 ("text - sync export_all (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  93.56 ns ±   0.61 ns    92.68 ns …  94.54 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:139 ("text - sync export_since (50-op delta, 1000-op base)") ok
time (mean ± σ)         range (min … max) 
  34.93 µs ± 713.18 ns    34.11 µs …  36.79 µs  in 10 ×   2862 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  52.09 µs ± 200.72 ns    51.84 µs …  52.34 µs  in 10 ×   1904 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 638.28 µs ±   5.28 µs   632.36 µs … 646.86 µs  in 10 ×    157 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) 
 108.18 µs ± 499.45 ns   107.72 µs … 109.36 µs  in 10 ×    927 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.45 µs ±  91.84 ns    14.33 µs …  14.57 µs  in 10 ×   6794 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 171.00 µs ± 760.29 ns   170.36 µs … 172.51 µs  in 10 ×    585 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.09 µs ±   4.89 ns     2.08 µs …   2.10 µs  in 10 ×  47554 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.48 µs ±  13.57 ns     2.46 µs …   2.50 µs  in 10 ×  40747 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  29.60 µs ± 132.20 ns    29.38 µs …  29.77 µs  in 10 ×   3338 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 472.70 µs ±  12.90 µs   466.28 µs … 508.97 µs  in 10 ×    212 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.36 µs ± 111.70 ns    33.12 µs …  33.52 µs  in 10 ×   2991 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) 
 286.46 µs ±   1.45 µs   284.63 µs … 289.13 µs  in 10 ×    348 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.37 ms ±  30.55 µs     1.33 ms …   1.41 ms  in 10 ×     76 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.17 ms ±  33.29 µs     3.15 ms …   3.25 ms  in 10 ×     32 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.02 ms ±  36.95 µs     1.97 ms …   2.08 ms  in 10 ×     49 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:71 ("cache - jump to middle every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.65 ms ±  34.55 µs     2.59 ms …   2.71 ms  in 10 ×     37 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:94 ("cache - single non-seq insert on 1000-char doc") ok
time (mean ± σ)         range (min … max) 
   7.00 µs ±   1.16 µs     5.80 µs …   9.76 µs  in 10 ×  16036 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.22 µs ±   1.61 µs     6.06 µs …  11.07 µs  in 10 ×  15600 runs
Total tests: 105, passed: 105, failed: 0.

PR branch:

Registry index updated successfully
Symbols updated successfully
Downloading dowdiness/btree@0.1.0
Downloading dowdiness/alga@0.3.0
Downloading dowdiness/order-tree@0.1.0
Using cached dowdiness/rle@0.2.2
Using cached moonbitlang/quickcheck@0.14.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.44 µs ± 764.76 ns    19.80 µs …  22.04 µs  in 10 ×   4747 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) 
 105.11 µs ±   2.49 µs   103.54 µs … 111.97 µs  in 10 ×    956 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) 
 463.18 µs ±   5.04 µs   456.35 µs … 470.57 µs  in 10 ×    214 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) 
 134.58 µs ± 545.72 ns   133.94 µs … 135.50 µs  in 10 ×    738 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) 
  97.63 µs ± 586.79 ns    97.00 µs …  98.44 µs  in 10 ×   1014 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) 
  67.26 µs ± 383.83 ns    66.76 µs …  67.89 µs  in 10 ×   1494 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) 
 101.44 µs ± 361.42 ns   100.94 µs … 102.17 µs  in 10 ×    981 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:341 ("merge - retreat concurrent deletes (500 items, 50 deletes)") ok
time (mean ± σ)         range (min … max) 
 212.09 µs ± 523.05 ns   211.26 µs … 212.99 µs  in 10 ×    467 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_merge_benchmark.mbt:408 ("merge - context apply operations (50 ops)") ok
time (mean ± σ)         range (min … max) 
  44.64 µs ±  25.93 µs    27.83 µs … 108.15 µs  in 10 ×   2235 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:6 ("branch - checkout (10 ops)") ok
time (mean ± σ)         range (min … max) 
   4.09 µs ±  26.64 ns     4.07 µs …   4.16 µs  in 10 ×  23723 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:29 ("branch - checkout (100 ops)") ok
time (mean ± σ)         range (min … max) 
  29.93 µs ±  36.65 ns    29.89 µs …  29.99 µs  in 10 ×   3337 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:47 ("branch - checkout (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 407.52 µs ±   2.64 µs   404.70 µs … 412.48 µs  in 10 ×    246 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:65 ("branch - advance (10 new ops)") ok
time (mean ± σ)         range (min … max) 
  11.07 µs ±   3.68 µs     9.24 µs …  21.45 µs  in 10 ×   9613 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:91 ("branch - advance (100 new ops)") ok
time (mean ± σ)         range (min … max) 
  87.48 µs ±  41.33 µs    60.46 µs … 163.79 µs  in 10 ×   1574 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:117 ("branch - checkout with concurrent branches") ok
time (mean ± σ)         range (min … max) 
  37.18 µs ± 151.45 ns    36.98 µs …  37.47 µs  in 10 ×   2679 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:145 ("branch - checkout with deletes") ok
time (mean ± σ)         range (min … max) 
  36.60 µs ± 178.17 ns    36.43 µs …  36.89 µs  in 10 ×   2737 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.83 µs ±   2.63 µs    25.42 µs …  34.05 µs  in 10 ×   3820 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.20 ms ±   3.62 ms     2.73 ms …  13.08 ms  in 10 ×     67 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:246 ("branch - to_text (100 chars)") ok
time (mean ± σ)         range (min … max) 
  11.24 µs ±  34.88 ns    11.19 µs …  11.30 µs  in 10 ×   8827 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:264 ("branch - to_text (1000 chars)") ok
time (mean ± σ)         range (min … max) 
 116.86 µs ± 989.43 ns   115.99 µs … 119.41 µs  in 10 ×    849 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:285 ("branch - single advance (1 new op)") ok
time (mean ± σ)         range (min … max) 
   3.96 µs ± 343.96 ns     3.69 µs …   4.57 µs  in 10 ×  25069 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:311 ("branch - single advance (50 new ops)") ok
time (mean ± σ)         range (min … max) 
  48.84 µs ±  26.55 µs    31.85 µs … 108.04 µs  in 10 ×   2199 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:342 ("branch - realistic typing (50 chars)") ok
time (mean ± σ)         range (min … max) 
  16.35 ms ±   7.96 ms     6.62 ms …  32.71 ms  in 10 ×     29 runs
[dowdiness/event-graph-walker] bench internal/branch/branch_benchmark.mbt:375 ("branch - concurrent merge scenario") ok
time (mean ± σ)         range (min … max) 
  18.57 µs ±   7.38 µs    12.71 µs …  34.52 µs  in 10 ×   7295 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:6 ("walker - linear history (10 ops)") ok
time (mean ± σ)         range (min … max) 
 657.73 ns ±   6.56 ns   649.64 ns … 665.23 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 ±  15.26 ns     4.81 µs …   4.85 µs  in 10 ×  20718 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:38 ("walker - linear history (1000 ops)") ok
time (mean ± σ)         range (min … max) 
  43.23 µs ± 517.54 ns    42.71 µs …  44.42 µs  in 10 ×   2331 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.04 µs ±  13.28 ns     6.01 µs …   6.06 µs  in 10 ×  16378 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:79 ("walker - concurrent branches (5 agents x 20)") ok
time (mean ± σ)         range (min … max) 
   5.94 µs ±  22.67 ns     5.91 µs …   5.98 µs  in 10 ×  16774 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.30 µs ±  29.95 ns     8.26 µs …   8.35 µs  in 10 ×  12112 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.49 µs ±  16.46 ns     3.47 µs …   3.52 µs  in 10 ×  28792 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.52 µs ±  22.26 ns     5.49 µs …   5.57 µs  in 10 ×  18111 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/walker_benchmark.mbt:176 ("walker - large history (10000 ops)") ok
time (mean ± σ)         range (min … max) 
 461.23 µs ±   1.66 µs   458.82 µs … 463.83 µ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.22 ms ±  56.10 µs     7.14 ms …   7.32 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) 
  27.36 ms ±   4.90 ms    22.81 ms …  37.69 ms  in 10 ×      3 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:6 ("version_vector - create (1 agent)") ok
time (mean ± σ)         range (min … max) 
  50.14 ns ±   0.59 ns    49.27 ns …  50.80 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) 
 140.45 ns ±   0.31 ns   140.05 ns … 140.89 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 ±   2.17 ns     1.04 µs …   1.05 µs  in 10 ×  95846 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) 
 171.29 ns ±   0.51 ns   170.78 ns … 172.45 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) 
 119.33 ns ±   0.89 ns   118.53 ns … 120.72 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) 
 469.76 ns ±   1.45 ns   468.02 ns … 472.08 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) 
 208.49 ns ±   2.09 ns   206.60 ns … 214.21 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.29 µs ±   5.46 ns     1.28 µs …   1.30 µs  in 10 ×  77227 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) 
 142.25 ns ±   0.87 ns   141.24 ns … 143.81 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) 
 121.49 ns ±   0.65 ns   120.50 ns … 122.26 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) 
 573.17 ns ±   2.34 ns   570.60 ns … 579.20 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:186 ("version_vector - from_frontier (100 ops, 5 agents)") ok
time (mean ± σ)         range (min … max) 
   4.77 µs ±   7.57 ns     4.75 µs …   4.78 µs  in 10 ×  20981 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:206 ("version_vector - to_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
 198.53 ns ±   9.27 ns   194.59 ns … 224.79 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.27 µs ±  12.72 ns     5.26 µs …   5.30 µs  in 10 ×  19009 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:251 ("version_vector - agents (5 agents)") ok
time (mean ± σ)         range (min … max) 
  67.68 ns ±   0.40 ns    67.24 ns …  68.39 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/causal_graph/version_vector_benchmark.mbt:266 ("version_vector - length (20 agents)") ok
time (mean ± σ)         range (min … max) 
  12.48 ns ±   0.36 ns    12.20 ns …  13.18 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) 
 199.85 µs ±   3.07 µs   195.74 µs … 203.14 µs  in 10 ×    463 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:31 ("bench: cache invalidate + position query (5000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.08 ms ±  57.36 µs     3.00 ms …   3.18 ms  in 10 ×     34 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:41 ("bench: cache invalidate + position query (10000 chars)") ok
time (mean ± σ)         range (min … max) 
  10.58 ms ± 909.00 µs     9.69 ms …  11.90 ms  in 10 ×     10 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.60 ms ± 113.85 µs     3.44 ms …   3.74 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) 
  31.70 ms ± 970.47 µs    30.79 ms …  33.48 ms  in 10 ×      4 runs
[dowdiness/event-graph-walker] bench internal/document/document_benchmark.mbt:113 ("bench: warm cache position query (1000 chars)") ok
time (mean ± σ)         range (min … max) 
  94.51 ns ±   0.43 ns    94.01 ns …  95.45 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) 
  95.02 ns ±   0.46 ns    94.36 ns …  95.56 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/fugue/tree_position_benchmark.mbt:20 ("bench: lv_to_position middle of 10K tree") ok
time (mean ± σ)         range (min … max) 
 542.52 µs ±   8.76 µs   531.97 µs … 558.28 µs  in 10 ×    186 runs
[dowdiness/event-graph-walker] bench internal/fugue/jump_ancestors_benchmark.mbt:2 ("jump - sequential append 1K") ok
time (mean ± σ)         range (min … max) 
 153.39 µs ±   1.03 µs   152.09 µs … 154.84 µs  in 10 ×    653 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) 
 151.57 µs ±   1.40 µs   149.99 µs … 154.09 µs  in 10 ×    657 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.38 ms ± 121.05 µs     4.24 ms …   4.55 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) 
 151.69 µs ± 697.65 ns   150.54 µs … 152.74 µs  in 10 ×    658 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:6 ("oplog - insert (100 ops)") ok
time (mean ± σ)         range (min … max) 
  42.16 µs ± 813.60 ns    41.60 µs …  44.22 µs  in 10 ×   2351 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:20 ("oplog - insert (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 503.21 µs ±   7.26 µs   494.16 µs … 515.40 µs  in 10 ×    197 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) 
  61.57 µs ± 193.47 ns    61.37 µs …  61.93 µs  in 10 ×   1627 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:58 ("oplog - apply_remote (50 ops)") ok
time (mean ± σ)         range (min … max) 
  28.73 µs ± 125.08 ns    28.55 µs …  28.93 µs  in 10 ×   3471 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:79 ("oplog - get_op (1000 ops)") ok
time (mean ± σ)         range (min … max) 
 188.62 ns ±   0.59 ns   187.95 ns … 189.73 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:97 ("oplog - get_frontier (single agent)") ok
time (mean ± σ)         range (min … max) 
  20.45 ns ±   0.35 ns    19.96 ns …  20.90 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:112 ("oplog - get_frontier (5 agents)") ok
time (mean ± σ)         range (min … max) 
  24.85 ns ±   0.27 ns    24.47 ns …  25.35 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.41 µs ±  73.51 ns    11.30 µs …  11.50 µs  in 10 ×   8665 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:150 ("oplog - walk_and_collect (concurrent)") ok
time (mean ± σ)         range (min … max) 
  19.15 µs ±  47.64 ns    19.05 µs …  19.21 µs  in 10 ×   5228 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.45 µs ±  12.03 ns     5.43 µs …   5.47 µs  in 10 ×  18304 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:202 ("oplog - walk_filtered (inserts only)") ok
time (mean ± σ)         range (min … max) 
   8.76 µs ±  19.87 ns     8.73 µs …   8.80 µs  in 10 ×  11742 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:233 ("oplog - sequential typing (500 chars)") ok
time (mean ± σ)         range (min … max) 
 228.55 µs ± 574.82 ns   227.80 µs … 229.26 µs  in 10 ×    428 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:249 ("oplog - random position inserts (100 ops)") ok
time (mean ± σ)         range (min … max) 
  41.79 µs ±  78.29 ns    41.67 µs …  41.92 µs  in 10 ×   2391 runs
[dowdiness/event-graph-walker] bench internal/oplog/oplog_benchmark.mbt:270 ("oplog - sequential typing (100000 chars)") ok
time (mean ± σ)         range (min … max) 
 156.50 ms ±  21.40 ms   124.60 ms … 179.39 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) 
  64.53 ms ±  15.50 ms    46.07 ms …  85.36 ms  in 10 ×      2 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:10 ("text - insert append (100 chars)") ok
time (mean ± σ)         range (min … max) 
  95.96 µs ± 245.42 ns    95.52 µs …  96.28 µs  in 10 ×    911 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 ±  18.71 µs     1.32 ms …   1.37 ms  in 10 ×     77 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:35 ("text - insert prepend (100 chars)") ok
time (mean ± σ)         range (min … max) 
 158.99 µs ± 489.46 ns   158.19 µs … 159.77 µs  in 10 ×    627 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) 
 236.79 µs ±   1.45 µs   234.78 µs … 238.67 µs  in 10 ×    422 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:70 ("text - text() (100-char doc)") ok
time (mean ± σ)         range (min … max) 
  13.87 µs ± 184.45 ns    13.73 µs …  14.22 µs  in 10 ×   7053 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:83 ("text - text() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
 145.72 µs ± 828.01 ns   144.13 µs … 146.80 µs  in 10 ×    690 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:96 ("text - len() (1000-char doc)") ok
time (mean ± σ)         range (min … max) 
  12.47 ns ±   0.36 ns    12.16 ns …  12.97 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) 
  97.31 ns ±   0.27 ns    96.94 ns …  97.66 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) 
  94.34 ns ±   0.77 ns    93.66 ns …  95.92 ns  in 10 × 100000 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:139 ("text - sync export_since (50-op delta, 1000-op base)") ok
time (mean ± σ)         range (min … max) 
  34.11 µs ± 247.65 ns    33.76 µs …  34.66 µs  in 10 ×   2863 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:156 ("text - sync apply (50 remote ops)") ok
time (mean ± σ)         range (min … max) 
  52.58 µs ± 220.87 ns    52.25 µs …  52.92 µs  in 10 ×   1892 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:171 ("text - sync apply (500 remote ops)") ok
time (mean ± σ)         range (min … max) 
 652.27 µs ±   9.20 µs   641.73 µs … 667.69 µs  in 10 ×    151 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:186 ("text - bidirectional sync (2 peers, 50 ops each)") ok
time (mean ± σ)         range (min … max) 
 109.49 µs ± 769.59 ns   108.29 µs … 110.55 µs  in 10 ×    915 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.69 µs ± 109.48 ns    14.52 µs …  14.82 µs  in 10 ×   6857 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:233 ("text - checkout (midpoint of 1000-op doc)") ok
time (mean ± σ)         range (min … max) 
 171.34 µs ± 581.87 ns   170.30 µs … 172.17 µs  in 10 ×    583 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.11 µs ±   5.64 ns     2.10 µs …   2.11 µs  in 10 ×  47431 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.47 µs ±  11.11 ns     2.45 µs …   2.49 µs  in 10 ×  40702 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:281 ("text - undo undo() (10-op group)") ok
time (mean ± σ)         range (min … max) 
  29.32 µs ± 126.81 ns    29.15 µs …  29.52 µs  in 10 ×   3382 runs
[dowdiness/event-graph-walker] bench text/text_benchmark.mbt:295 ("text - undo undo() (50-op group)") ok
time (mean ± σ)         range (min … max) 
 461.46 µs ±   3.02 µs   457.01 µs … 465.19 µs  in 10 ×    216 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.62 µs ± 514.79 ns    33.19 µs …  34.59 µs  in 10 ×   3015 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) 
 286.04 µs ±   1.26 µs   283.94 µs … 287.88 µs  in 10 ×    350 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:17 ("cache - sequential append (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.32 ms ±   9.74 µs     1.31 ms …   1.33 ms  in 10 ×     75 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:34 ("cache - alternating pos (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   3.14 ms ±  37.01 µs     3.09 ms …   3.21 ms  in 10 ×     32 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:52 ("cache - jump to pos 0 every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   1.99 ms ±  32.73 µs     1.95 ms …   2.04 ms  in 10 ×     49 runs
[dowdiness/event-graph-walker] bench text/position_cache_benchmark.mbt:71 ("cache - jump to middle every 10 chars (1000 chars)") ok
time (mean ± σ)         range (min … max) 
   2.58 ms ±  33.56 µs     2.54 ms …   2.63 ms  in 10 ×     39 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) 
   6.83 µs ±   1.10 µs     5.93 µs …   9.41 µs  in 10 ×  15891 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.32 µs ±   1.51 µs     5.93 µs …   9.68 µs  in 10 ×  15908 runs
Total tests: 105, passed: 105, failed: 0.

Benchmarks run with --release flag

@dowdiness dowdiness force-pushed the refactor/ideal-tabs-cells branch 4 times, most recently from 1b5eb8a to bb36d15 Compare June 16, 2026 13:47
Extract shared Ideal tab styling and headless rendering helpers into examples/ideal/main/ui/tabs.mbt. The Ideal app keeps selection in durable value state (mode and bottom_tab) and renders toolbar/bottom tabs from those values rather than storing Rabbita Cell or Emit handles in Model.

- Move tab-specific toolbar and bottom-panel style recipes out of ui/button.mbt
- Add TabStyle plus tablist_view/tab_trigger_view/tab_panel_view helpers
- Keep toolbar Text/Structure controls as pressed buttons for existing semantics/tests
- Render bottom-panel tabs through shared helpers and @tabs.Model behavior
- Remove the temporary TabsDemo tab from the bottom panel
@dowdiness dowdiness force-pushed the refactor/ideal-tabs-cells branch from bb36d15 to ff17b70 Compare June 16, 2026 13:52
@dowdiness dowdiness changed the title refactor(ideal): make Tabs a self-contained Rabbita cell refactor(ideal): extract value-derived Tabs UI helpers Jun 16, 2026
@dowdiness dowdiness merged commit 7b8b93c into main Jun 16, 2026
28 checks passed
@dowdiness dowdiness deleted the refactor/ideal-tabs-cells branch June 16, 2026 14:07
dowdiness added a commit that referenced this pull request Jun 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant