Canopy開発日誌-6月

2026年6月のCanopy開発ログ。

6月1日は、5月末に進めたLambdaのscope graphやgo-to-definitionを、実際の構造編集へ近づける作業が中心だった。 同時に、CanopyとMoonDspの関係、性能改善の優先度、エージェントの使い分けも整理した。

2026/6/1

Canopy

まず、CanopyとMoonDspの長期的な接続構想を整理した。 MoonDspは別リポジトリの音楽DSL / DSPエンジンなので、Canopyへすぐ統合する対象ではない。

今は、Canopyは構造編集の土台、MoonDspは音楽DSL側の実験、incr / Loomは共有基盤として分けて考えることにした。 関連PR: #445

Lambda projectionでは、小さな整理を先に進めた。 ProjNode の構築helper、SourceMap token helper、Block / Holeのtyped viewなどを使い、projection処理の重複を減らした。

その後、module-level bindingをfirst-classな LetDef projection nodeとして扱う変更を入れた。 以前はbinding rowがinit expressionの NodeId やsynthetic idを借りていたので、Structure modeのdrag/dropやbinding-level editで責務が曖昧だった。

LetDef が実際のnodeになったことで、binding rowを構造編集の対象として扱いやすくなった。 binderの位置取得は、引き続き @scope.binder_span / @scope.go_to_definition が担当する。 関連PR: #437#438#439#440#446#448

性能面では、BAND 2bのevidence gateを走らせた。 ここでは最適化を書かず、まず本当に遅いのかを測った。

to_flat_proj_incremental は1000 defsで数msまで伸びることが分かった。 ただし、実際のCanopy内のLambda documentはまだそこまで大きくない。

そのため、この最適化は一旦parkした。 大きなdocumentやimport機能が出てきたら、改めて取り組む。 関連PR: #447

依存関係まわりでは、rle submoduleの更新と、examples配下のVite / Playwright / React系の更新も行った。 PlaywrightはpackageだけでなくCI containerも合わせる必要があった。 関連PR: #435#280

loom

Loomでは examples/json-settings に、last-good semantic projection attachmentのchecked exampleを追加した。 docsにあったtemplateを、実際にテストできるexampleへ落とした形。

ポイントは、@incr.Derived のcomputeをpureに保ち、last-goodの保持を外側の settle に任せたこと。 Watch::read()ReadError も、parser/projection failureとは分けて GraphBlocked として扱うようにした。 関連PR: loom #206

Lambda example側ではBlock / Holeのtyped syntax viewを追加し、その後 LetDef term wrapperを入れた。 Canopyのfirst-class LetDef projection nodeはこのLoom側の変更を受けて進んでいる。 関連PR: loom #207loom #209

incr dependencyも整理した。 Loomの3 consumerをregistryの dowdiness/incr@0.7.0 へ寄せた。

Canopy側の追従も見たが、loom配下のincr submoduleに別作業が残っていたので一旦pauseした。 関連PR: loom #208

js_engine

js_engineでは、benchmarkを読みやすくする作業を進めた。 focused repeat benchmark runnerを追加し、複数回の測定からmedianやCVを見られるようにした。

単発の結果ではなく、ノイズを見ながら判断するための道具になっている。 関連PR: js_engine #186js_engine #187

startup側では、new_interpreter の中を分けて測り、final realm stampingを軽くした。 runtimeで作られるiterator callbackやPromise callbackにもrealmを付ける整理をした。 関連PR: js_engine #188js_engine #192

Arrayまわりでは、sortsplice などのmutatorで、明示的な undefined とholeの扱いがずれる問題を直した。 genericなArray mutatorでは、Proxy receiverを考慮して HasProperty 相当の経路を使う必要がある、というメモも残した。 関連PR: js_engine #191

作業運用

Claude / Codex / piの使い分けも整理した。

長い実装計画はCodexが書き、Claude/Opusは設計と実行管理を持つ。 Codexはpre-PR reviewだけでなく、実装順序や検証点を含む計画を書く役割も持つ。

この運用はLoomのjson-settings exampleで最初に使い、GraphBlocked stateのような設計漏れも拾えた。