高速イテレーション期 · API とドキュメントは変更される場合があります
Liri Liri 開発ログ
ホームに戻る
JA
BUILD LOG

まだ歩き終えていない道

v0.1 から v0.5.22 まで、156 日、116 のリリース。ここに書くのは機能一覧ではなく、私たちが踏んだ穴、それと引き換えに得たルール、まだ埋まっていない空白です。

156 日
初回リリースから今日まで
116
リリース
9
アーキテクチャスナップショット
20+
アーキテクチャチェック

データスナップショット 2026-11-01 · 数値は sync-facts と health:arch が Liri の本体リポジトリから収集

タイムラインへ移動

起源

2026 年 5 月 25 日、Liri の最初のバージョンは v0.1 でした。100 回の実質的なコミット、動くターミナル AI アシスタントが 1 つ。

最初に解こうとした問題は具体的でした——大規模モデルを本当にターミナルの中に座らせ、ファイルを読み、コマンドを実行し、コードを書き換える。Web の入力欄でチャットするだけではなく。ローカルモデルを優先したのは、個人のファイルを他人のサーバーへ送りたくないから。セキュリティ内蔵を選んだのは、それが API ではなく実際のマシンを渡されるからです。

その後の 3 か月で、能力を 1 つずつ広げました:ツール、27 のメッセージチャネル、デスクトップ、音声、ナレッジベース。8 月にはリポジトリに 4000 を超えるファイルがありました。

問題が初めて明示されたのもその頃です。2026 年 6 月 18 日のコードレビューでは、LocalHTTPService が 7200 行、ChatManager が 3263 行、テストファイル 150 個に対してソースファイル 3742 個。2 か月後、アーキテクチャ健全性の最初の採点は 10/40、グレード D で、105 個の上限超過ファイルがすべて未登録でした。

そこで分かったこと:プロジェクトを他人に引き継げるかどうかは、機能の数ではなく、穴に落ちた後にどんなルールを育てたかで決まる。

5 つの転換点

因果順に並べており、カレンダー順ではありません——期間は重なっています。

2026-05-25 → 2026-08

まず能力を広げ、境界は後回し

状況
v0.1 は 100 コミット。動けば勝ちで、構造より機能が優先でした。
判断
まず能力を埋める:ツール、チャネル、デスクトップ、音声、ナレッジを 1 つずつ。
代償
最初の監査が出した数字はひどいものでした——LocalHTTPService 7200 行、ChatManager 3263 行、テストとソースの比率は約 4%、最初のアーキテクチャ健全性は 10/40(D)で、105 個の上限超過ファイルがすべて未登録。
結果
4000+ ファイル、69 個のツール、27 個のチャネル、429 個のデスクトップコンポーネント。

↳ 参加できること — 新しい能力を足したいとき:app/src 配下にモジュールを立て、カーネルには詰め込まない。

2026-08-09 → 2026-09-30

まず自分たちを測れるようにする

状況
問題は誰もが感じていましたが、「どれくらい劣化しているか」を説明できる人はいませんでした。
判断
アーキテクチャ品質を再現可能な採点と台帳(architecture-health)にし、上限超過ファイルは必ず登録する。「自制心で清潔さを保つ」という前提は捨てました。
代償
登録は分割ではありません——ChatManager はむしろ 3263 行から 7036 行に増えました(現在は 2,570 行に分割済み)。採点の基準自体も変わってきたので、健康診断表としてのみ使い、KPI にはしません。
結果
9 回のスナップショット。未登録の上限超過ファイルは 105 から 0 へ(後に 2 へ戻る)。超過リストは「誰も知らない」ものから追跡可能な台帳になりました。

↳ 参加できること — 上限超過ファイルを 1 つ引き受けて分割してください(下の参加方法を参照)。

2026-10-08 → 10-09

1 回の削除ミスが、削除プロセスをもたらした

状況
コードベースには、参照されているように見えない「死んだ面」が溜まっていました。v0.4.69 のクリーンアップはサンドボックスと分離サブシステムを死んだコードとして削除——そのバージョンは 170 ファイルに触れ、+9340 / −10174 行でした。
判断
翌日 v0.4.71 で一括ロールバック:24 ファイルを復元(IsolationManager、EnhancedSandboxManager、PTYSandbox、SSHSandbox、docker/** など、加えて 5 件のテスト)し、存続する 21 ファイルの付随変更も戻しました。
代償
1 ファイルを消すにはまず証拠を書く必要があり、手順は遅くなります。ただし削除してから戻すよりは速い。
結果
v0.4.72 で削除プロセス code-deletion.md(CD01–CD07)が導入されました。まず証拠を集め、次に入口を外し、最後に実装を削除する。「誰も使っていないように見える」は削除の理由にならなくなりました。

↳ 参加できること — CD01–CD07 に沿って「デッドコード候補」を 1 件確認してください。

2026-10-10 → 10-22

ルールをゲートにする

状況
ルールはドキュメントに書かれ、自制心に頼っていました。ドキュメントとコードが乖離し始めます。
判断
すべてのルールを提案ではなく CI の遮断にしました:5 つのゲート + doc-gate + sandbox-negative の必須ジョブ。ハードコードのベースライン 413 キー。状態語彙 34 値、1795 組のベースライン。起動面、重要モジュール、カーネル面にそれぞれ 1 つ。
代償
コミットごとに数秒増え、語彙を変えるたびにベースラインを同期する必要があります——基準を気軽に変えられないことこそが目的です。
結果
lint:arch の違反は 0。テストは 3029 から 7488 に増加。

↳ 参加できること — プッシュ前にローカルでゲートを 1 回実行(bun run ci)。赤くなったところを直す。

2026-10-05 → 10-28

カーネルの収縮:5336 行から独立パッケージへ

状況
core は入口の実装でもあり、あらゆる能力の共有地でもあり、誰でも中に足せました。
判断
3 段階——まず削る(CoreAPIImpl 5336 → 2521 行)、次にパッケージを抽出(@openliri/kernel を独立、core は 146 → 113 ファイル、K01–K08 のカーネルゲート)、最後に外へ移す(「ゼロ I/O / 上位層への依存ゼロ」を満たさない 37 モジュールを app/src へ降ろし、470+ か所の import を同期、5 種類のベースラインを再生成)。
代償
大規模な移行 1 回で、すべてのベースラインを再生成。10-18 からはバッチ単位で収め、コミット密度は意識的に下げました。
結果
カーネルが外部に公開するのは薄いインターフェースだけになり、外部からの貢献に初めて明確な境界ができました。

↳ 参加できること — カーネル境界の外にある新機能は app/src から始めればよく、カーネルに入れる必要はありません。

アーキテクチャ:オペレーティングシステムのように層を分ける

アーキテクチャは新しく発明したものではありません。薄いカーネル、サブシステムの境界、依存の方向、ゲートと可観測性——この組織化は OS の数十年のエンジニアリング実践から来ています。Agent 領域でここ 2 年に公開された設計パターンとエンジニアリングガイドも、ほぼ同じ問いに収束しています:階層、境界、状態、ガバナンス、評価。私たちは前者のやり方で自分たちを縛り、後者のチェックリストで自己点検します。

OS の概念 → Liri の現状

概念 Liri での対応 状態
カーネル @openliri/kernel 独立パッケージ。外部には薄いインターフェースのみ公開し、K01–K08 のゲートで守る 導入済み
サブシステム ツール / チャネル / 記憶 / ルーティング / サンドボックス / タスク / 音声 / デスクトップ。それぞれに入口と境界 収束中
ドライバー プロバイダーアダプター、チャネルアダプター、6 種のサンドボックスバックエンド(Landlock / Docker / SSH / PTY / macOS / Windows) 導入済み
プロセスとスケジューリング セッション実行、PDCA、Swarm、Cron 導入済み
権限モデル 5 層の防御線 + 承認の 4 段階(requested → presented → decided → recorded) 外部監査待ち
可観測性と監査 イベントログ、コスト台帳、証拠台帳 導入済み
メンテナー(MAINTAINERS) 未確立:サブシステムの owner も引き継ぎ経路もない 空白

参考にしたもの

公開されている Agent の設計パターンとエンジニアリングガイドに 1 項目ずつ照らし合わせました。21 のパターンにはすべて実際の実装がありますが、うち 3 つの重要なスイッチは既定でオフです——そのため対外的には「実装あり」とだけ言い、「既定で有効」とは言いません。エンジニアリングの流れも同じ 5 段階で自己点検します:アーキテクチャ、ビルド、実行、ガバナンス、チューニング。

3 つの空白

サブシステムのメンテナー制度

owner がいなければ引き継ぎ経路もありません。最も OS らしく、最も欠けている部分です。

サブシステムの契約層

契約の設計書はありますが、台帳 / LoopProfile が実装されたかは未確認——インターフェース安定性の約束はまだ固まっていません。

カバレッジゲート

レビュー時点で約 4%。CI には 20+ 項目のアーキテクチャチェックがありますが、カバレッジのしきい値はまだありません。

正直に言うと、アーキテクチャ健全性は依然 D(10/40)、142 個の上限超過ファイルのうち 141 個が未登録、最大は今も chat モジュールです(ChatManager は 7,036 行から 2,570 行に分割済み)。カーネルはでき、境界は収束しつつあり、メンテナー制度はまだありません——これが「まだ歩き終えていない」という意味です。

現在の 8 層の機能階層を展開

アーキテクチャ全体像

入口からフィードバックまでの 8 つの機能層。エンジニアリング面では 6 層の依存ゲート(entry > ui > app > service > infra > core)で強制しています

L1

マルチモーダル入口層

REPL ターミナル
React + Ink で構築したターミナル UI。Buddy コンパニオンシステムを内蔵
Tauri デスクトップクライアント
429 個の TSX コンポーネント、32 個の機能ページ(Tauri 2.11 + React 19)
MCP / チャネルゲートウェイ
MCP Server と 27 個のメッセージチャネル(WeChat / DingTalk / Feishu / Telegram など)
CLI / HTTP API
Liri / liri-memory / liri-ink の 3 つの実行ファイル + HTTP API
L2

セキュリティ第一層

Rust AST コンパイル時解析
FFI 層が Bash AST を解析し、37 件の危険コマンドルールに照合
TypeScript 意味解析
複合的な読み取り専用コマンドを区間ごとに判定し、拒否理由を追跡可能に
Guardrail ルールエンジン
14 件のインジェクションパターン + 10 件の Shell 専用ルール
AutoMode 分類器
タスクのリスクレベルを自動判定し、許可 / 確認 / 拒否を決定
L3

スマートルーティング層

19 種のタスク種別を識別
コーディング / 執筆 / 分析 / ツール / 翻訳 / 検索 / 発想 / 雑談など
4 段階の tier
simple / medium / complex / reasoning
5 段階の判定パイプライン
スイッチ → ファストパス → セッション固定 → LLM 判定 → Tier 解決
FallbackChain フォールバック
プライマリプロバイダーが使えない場合に順にフォールバック。RetryPolicy と併用
L4

セカンドブレイン注入層

ナレッジベース
Markdown をディスクに保存 + セマンティックインデックス。キーワード / ベクトル / RRF のハイブリッド検索
記憶システム
階層型記憶 + SQLite ベクトルテーブル。関連度で重み付けして想起
セッションイベント
events.jsonl へ追記保存。再生・監査が可能
DreamEngine
アイドル時に知識を整理:収集 → 分析 → 生成 → 書き込み → インデックス
L5

TAOR 判断ループ

Think
4 種のエージェント戦略:汎用 / コーディング / 探索 / 計画
Act
69 個の組み込みツールをビルドバリアントごとに動的登録
Observe
結果評価 + コンテキストの階層化ウィンドウと自動圧縮
Reason
トークン予算管理 + チェックポイント再開 + ラウンド単位のサーキットブレーカー
L6

実行サンドボックス層

Linux Landlock
カーネルレベルのファイルシステムアクセス制限
macOS / Windows
システムサンドボックス + Low IL / Job オブジェクトによるフォールバック分離
Docker コンテナ
完全なコンテナ分離 + リソース制限 + ネットワークポリシー
SSH / PTY
リモートのクリーンな実行環境と疑似端末の経路制御
L7

長時間タスク層

PDCA パイプライン
Plan-Do-Check-Act の閉ループ。成果物の実在に基づいて進捗を進める
Swarm マルチエージェント
AgentSwarm + 合議型オーケストレーション。レジストリを動的に検出
Cron スケジュール
once / interval / cron 式に対応(タイムゾーンを含む)
タスクの永続化
セッションスナップショット + 中断点からの復元 + 待機中のカウントダウン表示
L8

フィードバックと進化の層

失敗パターンの帰納
失敗パターンを一般化してプロンプトとスキルへ書き戻し、改善のループを閉じる
コスト台帳
データベースの価格表で課金し、プロバイダーが返した実際のモデル名を記録
評価ゲート
内蔵ベースライン問題集 + pass^k 信頼性指標 + ペア比較による安全性測定
イベント再生
すべてのモデル呼び出しのコンテキストを後から再構築可能

アーキテクチャの哲学

🛡️
セキュリティ内蔵
セキュリティはプラグインではなく、各層の DNA です
🏠
ローカルファースト
データはローカルに保存され、オフラインでも動作し、プライバシーは既定で守られます
🧠
スマートルーティング
19 種類のタスクを対応する tier のモデルに割り当てます
🧬
セカンドブレイン設計
ナレッジベース + 記憶 + イベントログ:検索可能な 3 層のコンテキスト
🔄
検証可能な閉ループ
失敗したサンプルを帰納して書き戻し、変更はゲートで止めます
🔌
マルチモーダルの統一
ターミナル / デスクトップ / IM / API が同じエンジンを共有します

タイムライン

毎月 1 行。アーキテクチャとガバナンスの変化のみを記録し、通常のコミットは載せません。

  1. 2026-05-25 v0.1:100 回の実質的なコミット、ターミナルアシスタントが動く
  2. 2026-06-18 最初のコードレビュー:7200 行の巨石ファイル、テストとソースの比率は約 4%
  3. 2026-08-09 最初のアーキテクチャ健全性:10/40(D)、105 個の上限超過ファイルが未登録
  4. 2026-10-09 サンドボックスがクリーンアップで誤削除 → 一括ロールバック。翌日に削除プロセス CD01–CD07
  5. 2026-10-20 状態語彙ゲートを導入:34 値、1795 組のベースライン
  6. 2026-10-28 カーネルの外移が完了。既定で見えるツールは 12 個、1397 token に収束
  7. 2026-10-28 中国語・英語の二言語ドキュメントサイトと本サイトを公開

以降の毎月の更新もここに追記していきます。

参加方法

このページは完了報告ではなく、招待です。3 つのこと、いずれも人手が足りていません。

セキュリティ監査チェックリスト

  • 危険コマンドルール:37 件のルールがどこにあり、どう発火するか——1 件作って、期待したルールで遮断されるか確認する
  • プロンプトインジェクションルール:14 件のインジェクションルール。悪意ある文書を渡して遮断されるか見る
  • Shell ルール:10 件の許可 / 拒否リスト。バイパス経路(パイプ、サブシェル、エンコード)を検証する
  • サンドボックスの縮退ロジック:6 種のバックエンドがそれぞれどんな条件で縮退し、縮退後も fail-closed かどうか
  • 承認の 4 段階:requested → presented → decided → recorded に欠落や順序の乱れがないか
  • 権限の境界面:ツール呼び出しが権限分類器を迂回して直接書き込み・実行できないか

入口:app/src/security、app/src/sandbox、app/src/permission。

脆弱性の詳細を見つけた場合は SECURITY.md に従って非公開で報告し、公開 issue を立てないでください。公開 issue は監査プロセスと範囲についてのみ扱います。

資金で支援したい方はスポンサーページへ