Canopy開発日誌-3月

2026年3月のCanopy開発ログ。3月はCanopyのリポジトリ名確定、parser→loomの分離、Rabbita/Ideal editorの急速な成長、構造編集アクション、CRDTの性能改善、framework抽出、block editor、JSON editorまで、幅広い領域で大きな進捗があった。

Canopyは、テキストとプログラムの構造を同じ空間で直接編集できる、次世代のコードエディタです。ソースコードを文字列ではなく「構造」として扱うことで、安全なリファクタリングやAIとの協調作業、CRDTによる複数人同時編集を実現しています。

今月の大きな流れ

  • parser → loom: 2月までCanopy内にあったparserをdowdiness/loomとして独立させ、APIを移行した。
  • SyncEditor確立: ParsedEditorからSyncEditorへ統一。編集・undo/redo・同期・presenceを一つのeditor abstractionで扱うようになった。
  • 名前解決とgraphviz: Lambdaの名前解決をSyncEditorに組み込み、ToDot/FromDot traitでgraph可視化と連携。
  • Rabbita/Ideal editor: Rabbitaベースのprojectional editorを立ち上げ、性能問題を潰し、mobile layout、design tokens、tree pane navigation、Ideal editorのUI基盤を作った。
  • 構造編集アクション: 16の構造編集アクションを実装。
  • CRDT性能: FugueTree/traverse_treeのiterative化、order-tree導入、event-graph-walkerの高速化(two-count retreatで17.7×)など。
  • WebSocket協調編集: transport layer、relay server、sync recovery protocol、ephemeral store v2を実装。
  • Framework抽出: ProjNode[T]のgeneric化、TreeNode/Renderable traitの導入、framework/coreパッケージの切り出し。
  • 新しいeditor: block editor、JSON editor、AST Zipper、Container Phase 1、pretty-printerの導入。

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への移行を開始した。

主なコミット: 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

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対応。

主なコミット: Make Rabbita Cloudflare Pages ready, Add Wrangler config for Rabbita deploy, Add tree edit bridge for 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で再設計。

主なコミット: 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

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に分解。

主なコミット: add graph library with DirectedGraph trait, harden WebSocket collaboration with error recovery, decompose compute_text_edit into handler chain

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

Genericなeditor frameworkを切り出し、CanopyをLambda専用から複数言語に対応できる構造編集フレームワークへ近づけた。block editor、JSON editor、AST Zipper、Container Phase 1、pretty-printerを立ち上げ、1ヶ月の前半で作った基盤を使って新しい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

2026/4/1

Canopy / Pretty-printer

Wadler-Lindig pretty-printer engineをannotation support付きで実装し、get_ast_prettyへ統合(#106)。

作業運用メモ

3月はCanopyの”理想エディタ”となるIdeal editor、Rabbita、構造編集アクション、協調編集基盤が一気に育った月。同時に後の独立リポジトリ化を見越したframework抽出と、CRDT/パーサーの性能改善も並行して進んだ。4月はこの勢いを引き継ぎ、さらにUI/UXと言語実装が深まっていく。