Skip to content

設計思想

なぜ Kumiki は今の形をしているのか。このページは設計理念——言語の背後にある前提——の要約です。7 レイヤをどう使うかは Kumiki の考え方 に譲り、ここではそれらがなぜ存在するのかを扱います。

なぜ React ではないのか

React は人間中心の最適点です。Hooks・Context・JSX は、人が読み書きして自然に感じるよう 20 年近く磨かれてきた慣用句です。コードの書き手が AI に移ると、同じ機構が摩擦になります:

摩擦点AI にとってのコスト
構文オーバーヘッドJSX は閉じタグ・キャメル属性・式埋め込みでトークンが嵩む
暗黙の副作用useEffect の依存配列、stale closure、cleanup 忘れ
順序依存ルールHooks の呼び出し順、条件分岐内・リスト内の禁止
暗黙スコープProvider 階層、子孫から不可視に解決される Context
非局所的レンダリング親の再レンダーが子に波及し、memo での抑制が複雑さを足す

共通するパターン: これらはどれも AI が書く分には書けるが、AI が直す並列で触るとなると急激に難しくなります。バグの原因がプログラムテキストの外——実行履歴・依存配列・stale closure——にあるとき、AI は履歴をコンテキスト窓に全部詰めないと推論できません。

Kumiki はこの摩擦を規約ではなく構造で消します。

設計要件

  1. トークン効率 — 同じ UI を React より少ないトークンで。
  2. 副作用の静的追跡可能性 — どの副作用がどの状態に依存しどこから発火するか、構文だけから自明であること。
  3. アーキテクチャの予測可能性 — バグは局所化し、エラーは機械可読なコードで返ること。
  4. 並列編集耐性 — 数十のエージェントが同時に編集してもセマンティックに壊れないこと。
  5. 可読性の放棄を許容 — 人間が読んで快適かは二次目標。一次目標は AI が正確に書け・直せること。

要件 1 と(部分的に)2–4 は願望ではなく、継続的に実測されています。ベンチマーク を参照。

4 つの独立案が収束した先

Kumiki は 1 つの設計から始まっていません。互いを参照しない 4 つの独立案——S 式 IR + Elm 風アクター、episode 指向ランタイム(Loom)、1 行 1 宣言の effect 型付きタイル言語(Pyramid)、CRDT ネイティブのトリプルグラフ(Nexus)——をそれぞれ別のモデル支援探索で得るところから始まりました。

批判的に比較すると、表面の構文がまったく違うのに、4 案すべてが同じ 4 つの核に収束していました:

  1. 副作用は明示 descriptor — 関数呼び出しではなく純粋な値。
  2. ローカル状態の禁止 / 最小化 — 全状態が静的に位置特定可能。
  3. source ≠ runtime — IR とコンパイルの必須化。
  4. append-only causal log — デバッグ・リプレイ・監査を一つの基盤に統合。

残った論点はソース表現の物理形式だけでした。Kumiki はそのハイブリッドです: 7 レイヤ強制分離と名前付き slot(Pyramid)、capability 付き effect descriptor(IR+Actor / Pyramid)、episode log の考え方(Loom)、参照整合性を検査された op による並列編集(Nexus)——そして各案の既知の弱点は別の案の強みで塞いでいます(例: ネストは tile 内のみ許容することで、1 行 1 宣言の形が括弧地獄にもアセンブリ退化にも落ちない)。

先行研究からのレッスン

試み取り入れた避けた
Elm完全な副作用分離、Result/Optionボイラープレートの膨張、ローカル状態全面禁止の硬直さ
Unisoncontent-addressable な定義テキスト/Git エコシステムからの分断
SolidJSfine-grained reactivity、コンパイル時依存解析隠れた追跡範囲、シグナルの stale 問題
Hazel / Subtexttyped holes、構文エラーゼロ入力摩擦
Darktrace 駆動の開発エコシステムロックイン
Datomicappend-only fact log高頻度更新への不適合

非目標

Kumiki は次のものを意図的に目指しません:

  • 既存 React コードの段階移行 — 互換性ゼロでよい。新規アプリ専用。
  • 人間が快適にフルスクラッチで書くこと — 人間も書けるが、そのために最適化しない。
  • マクロ・プラグイン・言語拡張 — AI の学習対象を単一かつ閉じたまま保つ。
  • 動的型 — すべて静的。
  • 複数レンダリングターゲット — DOM のみ。

接続は境界で。言語に穴を開けない

上の非目標は裏返すと積極的な原則になります: interop のために言語そのものに穴を開けない。既存 JS エコシステムとの接続は、すべて言語の外側にある 3 つの境界で行います:

  • Inbound — 宣言済み capability の実装をホスト側が注入する(mount(app, target, { providers }))。http.* などの標準 capability も同じ仕組みで上書き可能。標準ライブラリ §2.5 を参照。
  • Outbound — Kumiki アプリは Web Component(defineKumikiElement)として任意のページに埋め込める。ランタイム を参照。
  • Build@kumikijs/vite で任意の Vite プロジェクトから import App from "./app.kumiki" でき、provider 用の TS 型も生成される。

ホスト固有のものが .kumiki に漏れ込めないからこそ、同じファイルがどこでも同じ意味を持ちます。

運用モデルも設計の一部

このリポジトリは「見ればすべての疑問が解決する」を規則として運用されています。質問やバグには散文ではなく動く example とテストの追加で答える。仕様は normative であり、すべての example は CI で compile・build・smoke を通らなければならない。機械を読者とする言語には、同じ性質——説得的ではなく検証可能——を持つドキュメントが必要です。


このページはかつての design-notes/ ディレクトリの要約です(#46 で削除。設計判断の記録先は PR 説明に移行)。元の設計理念の全文は git 履歴 で読めます。