Canopy開発日誌-3月

2026年3月のCanopy開発ログ(日次記録)。月の要約は3月-まとめ

ソースコードを構造(IR)として編集する MoonBit 製エディタ。概要はCanopyとは

今月の大きな流れ

月全体の流れは3月-まとめにまとめた。以下は週次ヘッダと日付見出しによる作業記録。PR番号の一覧は文末のPR索引にある。月初(第1週)から loom 分離と SyncEditor 移行が始まる。

3月第1週: parser→loom分離、SyncEditor、名前解決

月初はparserサブモジュールをdowdiness/loomとして独立させ、Canopy側を新APIへ移行する作業が中心だった。loomはのちに独立リポジトリとして発展するparser/AST基盤であり、この週が分離の出発点となった。続いてParsedEditorをSyncEditorに置き換え、編集・undo・同期・presenceを一つのeditor abstractionで扱える土台を整えた。週末にはLambdaの名前解決とgraphviz可視化を追加し、構造編集の前段階が揃った。

2026/3/2

Canopy / parser → loom 移行開始

parserサブモジュールのURLとディレクトリ名をloomへ変更した。dowdiness/parser APIからdowdiness/loom APIへの移行を開始した。

2026/3/5

Canopy / SyncEditor登場

ParsedEditorを廃止し、SyncEditorを導入した。SyncEditorはtext編集、tree編集、undo/redo、sourceMap/registry管理を一元化するeditor abstractionである。あわせてImperativeParserのdirty-flag方式から、ReactiveParser(Signal/Memo pipeline)へ移行した。

Edit Bridge Phase 1として、compute_editをloomのTextDelta APIに置き換えた。

主なPR / Issue: canopy #15, #16, #17

2026/3/7

Canopy / 名前解決とgraphviz

  • SyncEditorにname resolutionを追加(#19)。
  • ToDot/FromDot traitを追加し、Graph AST interchangeを実装(#18)。
  • Incremental Hylomorphismのアーキテクチャ文書を追加。

主なPR / Issue: canopy #18, #19

3月第2週: Rabbita性能、source_file_grammar、flat grammar

Rabbitaベースのprojectional editorを本格化した。tree editorのsubtree再利用(elide/hydrate)で性能を回復し、projectional editorとして実用的な速度を取り戻した。同時にsource_file_grammarによるO(1)增量編集、flat grammar統合、projection incremental updatesの設計を進め、大規模な構造編集に耐えるパーサー・投影層の構築を始めた。

2026/3/10

Canopy / Rabbita Cloudflare Pages化

Rabbita editorをCloudflare Pagesへデプロイする準備を進めた。Wrangler configの追加、tree edit bridgeのCRDT roundtrip対応を行った。

2026/3/11

Canopy / Rabbita性能回復

Rabbita editorの性能が著しく低下していた問題に対処した。subtreeのelide/hydrate、unchanged subtreeのreuse、deferred selection state、incremental text edit、parser memoからのprojection derivationなどを導入し、Rabbita projection editorのrefresh workを削減した。perf harnessも追加した。

主なPR / Issue: canopy #20, #21

Canopy / examples整理

web appとdemo-reactをexamples/ディレクトリへ移動した。

2026/3/14

Canopy / source_file_grammarとEphemeralStore

  • source_file_grammarへ切り替え、O(1)增量編集を実現(source_file_grammar switch)。
  • peer presence awareness用のEphemeralStoreを実装し、SyncEditorとFFI surfaceへ統合。
  • Rabbita perf harnessをphase timingとdiagnosticsで再設計。

2026/3/15

Canopy / flat grammar統合とprojection incremental updates

flat grammar統合(#32)を進めた。text_change adapterの削除、shared text change moduleの抽出、CellMeta supertraitの導入を行い、projection incremental updatesの計画を立案してFlatProj設計を確定した。

主なPR / Issue: canopy #32

3月第3週: ProseMirror/CodeMirror、協調編集、CRDT性能

Projectional editorにCodeMirror 6 / ProseMirrorを統合し、テキストエディタとの橋渡しを強化した。協調編集面ではWebSocket transport、relay server、ephemeral store v2、sync recovery protocolを実装し、複数人編集の基盤が大きく進んだ。CRDT側ではFugueTreeのiterative traverse、order-tree導入、event-graph-walkerの高速化により、大規模文書でも使える性能を目指した。

2026/3/18

Canopy / リポジトリ名をcrdtからcanopyへ

プロジェクト名をcrdtからcanopyに変更した。README rewrite、architecture docs修正、各種パス・パッケージ名の更新を行った。同日、FlatProj最適化(#36)、RLE sync(#35)、RLE Phase 0(#34)がmergeされた。

Canopy / ProseMirror + CodeMirror 6統合

ProseMirrorベースのprojectional editorを実装した。CrdtBridge、leaf edit routing、reconciler、CM6 NodeViews、PM schema、ProjNode→PM変換、static EditorViewを追加した。同日、CodeMirror 6 code editorへの置き換えも並行して進めた。

主なPR / Issue: canopy #34, #35, #36

2026/3/19

Canopy / Ephemeral Store v2とTransport

  • EphemeralHub、namespace-based store routing、presence view types、EphemeralValue serializationを実装(#39)。
  • SyncTransport traitとSyncMessage wire protocol、InMemoryTransportを追加。
  • Projectional editorのtext delta経路を実装(#37)。

主なPR / Issue: canopy #37, #38, #39

2026/3/20

Canopy / lazy tree refreshとWebSocket transport Phase 2

  • projectionのlazy structural index buildersを導入し、unchanged subtreeをrefreshでskip(#42)。
  • WebSocket transport Phase 2: Cloudflare Worker relay + client glueを追加(#41)。

主なPR / Issue: canopy #41, #42

2026/3/21

Canopy / 構造編集アクションとincremental parser最適化

  • 16の構造編集アクションを実装(#48)。WrapInLambda、ChangeOperator、InsertChildなど、Lambda編集の基本操作が揃った。
  • incremental parser最適化: balanced trees + size-threshold(#46)。
  • Ideal editorのmobile layout、drawer panels、touch targets、design tokens導入。

主なPR / Issue: canopy #46, #48

2026/3/22

Canopy / incremental SourceMap/RegistryとCRDT性能

  • SourceMapとRegistryのincremental patch pathを実装(#51)。
  • WebSocket sync recovery protocol(SyncRequest/SyncResponse)を追加(#53)。
  • Ideal editorのdocument persistence: localStorage + SQLite + shareable URLs(#52)。
  • FugueTreeのtraverse_treeをiterative化し、500+ defのdocumentでも動作するように。
  • order-treeをgit submoduleとして追加。

主なPR / Issue: canopy #51, #52, #53

2026/3/23

Canopy / graph library (alga) とWebSocket hardened

  • DirectedGraph traitとalgorithmsを持つgraph libraryを追加し、dowdiness/algaとして切り出した。WebSocket協調編集にはerror recovery、offline queue、persistenceを追加した。compute_text_editはhandler chain with middlewareへ分解した。

3月第4週: Framework抽出、block editor、JSON editor

Genericなeditor frameworkを切り出し、CanopyをLambda専用から複数言語に対応できる構造編集フレームワークへ近づけた。block editor、JSON editor、AST Zipper、Container Phase 1、pretty-printerを立ち上げ、前半で整えた基盤をもとに新しいeditor形態を次々と増やした一週間だった。

2026/3/24

Canopy / Framework Extraction Phase 1

  • ProjNode[T]をgeneric化し、TreeNode/Renderable traitを導入(Term impl)。
  • SyncEditor[T]をparser factoryでparameterize。
  • framework/coreパッケージへの切り出し準備。

主なPR / Issue: canopy #57

2026/3/28

Canopy / Framework Extraction Phase 2/3 + block editor

  • framework/coreパッケージを抽出し、lang/lambda/へlambda固有コードを移動。
  • loom側にTreeNode/Renderable traitを移し、Canopy側はloom定義を使用。
  • block editorのPhase 1a〜1dを実装: scaffold、BlockDoc CRUD、Markdown export/import、1d JS bridge + TypeScript web shell(#61, #63, #65, #67)。
  • event-graph-walkerをMovableTree CRDTへbump。

主なPR / Issue: canopy #58, #60, #61, #62, #63, #64, #65, #66, #67

2026/3/29

Canopy / JSON editor、AST Zipper、framework/core

  • JSON editorのprojection pipeline、edit handlers、bridge、integration testsを実装。
  • AST Zipperを追加し、tree pane navigationと構造編集を支える(#89)。
  • SpanEditFocusHintをframework/coreへ移動。
  • TextDoc/TreeDoc/TreeDocErrorTextState/TreeState/TreeErrorへrename。

主なPR / Issue: canopy #89, #98, #99

2026/3/30

Canopy / JSON editor完成とCloudflare deploy

  • JSON editorをmerge(#100)。
  • 全examplesをCloudflare Pagesへdeployするworkflowを追加。
  • GitHub Pages deploy workflowを削除。

主なPR / Issue: canopy #100

2026/3/31

Canopy / Container Phase 1とideal keyboard navigation

  • Container Phase 1: Document structとblock editor migration(#103)。
  • Ideal editor: outline treeでのkeyboard-driven structural navigation(#105)。
  • JSON editor用のVite multi-page build、JSON CRDT editor web pageとTypeScript bridgeを追加。
  • Wadler-Lindig pretty-printer engine design specを追加。
  • alga、event-graph-walker、loom等submoduleをbump。

主なPR / Issue: canopy #103, #104, #105

PR索引

週ごとに折りたたんだ PR / Issue 一覧。GitHub 上の詳細への索引。PR レビュー前の日はコミットメッセージのみ。

3月第1週(3/2〜3/7)

2026/3/2

parser → loom 移行開始

  • rename parser submodule directory to loom
  • update parser submodule URL after repo rename to loom
  • migrate from dowdiness/parser to dowdiness/loom API

2026/3/5

SyncEditor登場

canopy #15, #16, #17

2026/3/7

名前解決とgraphviz

canopy #18, #19

3月第2週(3/10〜3/15)

2026/3/10

Rabbita Cloudflare Pages化

  • Make Rabbita Cloudflare Pages ready
  • Add Wrangler config for Rabbita deploy
  • Add tree edit bridge for CRDT roundtrip

2026/3/11

Rabbita性能回復

canopy #20, #21

2026/3/14

source_file_grammarとEphemeralStore

  • switch to source_file_grammar for O(1) incremental edits
  • add source_file_to_proj_node for flat LetDef* structure
  • integrate EphemeralStore into SyncEditor

2026/3/15

flat grammar統合とprojection incremental updates

canopy #32

3月第3週(3/18〜3/23)

2026/3/18

ProseMirror + CodeMirror 6統合

canopy #34, #35, #36

2026/3/19

Ephemeral Store v2とTransport

canopy #37, #38, #39

2026/3/20

lazy tree refreshとWebSocket transport Phase 2

canopy #41, #42

2026/3/21

構造編集アクションとincremental parser最適化

canopy #46, #48

2026/3/22

incremental SourceMap/RegistryとCRDT性能

canopy #51, #52, #53

2026/3/23

graph library (alga) とWebSocket hardened

  • add graph library with DirectedGraph trait
  • harden WebSocket collaboration with error recovery
  • decompose compute_text_edit into handler chain
3月第4週(3/24〜3/31)

2026/3/24

Framework Extraction Phase 1

canopy #57

2026/3/28

Framework Extraction Phase 2/3 + block editor

canopy #58, #60, #61, #62, #63, #64, #65, #66, #67

2026/3/29

JSON editor、AST Zipper、framework/core

canopy #89, #98, #99

2026/3/30

JSON editor完成とCloudflare deploy

canopy #100

2026/3/31

Container Phase 1とideal keyboard navigation

canopy #103, #104, #105