diff --git a/.gitignore b/.gitignore
index 2bedac4..8a702ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,5 @@ src-tauri/gen/
# Machine-local cargo override (see src-tauri/.cargo/config.toml.example)
src-tauri/.cargo/config.toml
+# Seeded design canvas — 2.2MB of editor payload, regenerated from design/*.dc.html
+design/liplus-chat-ui.html
diff --git a/design/Main.dc.html b/design/Main.dc.html
new file mode 100644
index 0000000..530e722
--- /dev/null
+++ b/design/Main.dc.html
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Li+ Chat
+ Claude Code / Lin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ claude --dangerously-skip-permissions --dangerously-load-development-channels server:liplus-chat-room server:github-webhook-mcp
+
+
+
+
+
+
+
+
+
+
+
+ マスター
+ 10:15
+
+
部屋の往復が通ったので、次は宛先を付けたい。
+
+
+
+
+ Lin
+ → マスター
+ 10:16
+
+
say フレームに to を足すだけで、名指しされていない側が黙れるようになります。判定はエージェント側に置いたままで済みます。
+
+
+
+
+ Lay
+ 10:16
+
+
(宛先なしの発言。作法により沈黙を選んでいる)
+
+
+
+
+ マスター
+ → Lin
+ 10:17
+
+
じゃあそれで。
+
+
+
+
+
+
+
+ 宛先
+
+
+ Lin
+ ×
+
+ 未指定なら部屋全体へ
+
+
+
+
+
+
+
Claude Code を起動しました。C:\Users\smile\ClaudeCode\.mcp.json に登録済み。
+
+
+
+
+
参加者
+
+
+
+
+ マスター(あなた)
+
+
+
+ Lin
+ PTY
+
+
+
+ Lay
+ 未起動
+
+
+
+
+
+ 部屋ソケット
+ 127.0.0.1:64475
+
+
+ 接続方法
+ PTY
+
+
+ 起動コマンド
+ claude
+
+
+ 作業ディレクトリ
+ C:\Users\smile\ClaudeCode
+
+
+ 開始時刻
+ 10:12
+
+
+ ウィンドウ
+ 120×30
+
+
+
+
+
+
+
+
+
+
+
+
+
端末(診断)
+
room socket: connected as "Lin"
+mcp: stdio transport connected
+>
+
+
+
+
+
+
+
+
+
+
diff --git a/design/README.md b/design/README.md
new file mode 100644
index 0000000..c1d57a6
--- /dev/null
+++ b/design/README.md
@@ -0,0 +1,13 @@
+# design
+
+UI 設計キャンバスの元ファイル。公開先は `docs/0-requirements.md` の「UI の方向」節にリンクがある。
+
+- `Main.dc.html` — 次の一手(実装可能な範囲)
+- `Vision.dc.html` — 全体像(到達点)
+- `canvas.json` — 2 枚の配置、付箋、開く位置
+
+色と寸法は `src/styles.css` の実値をそのまま使っている。実装側のトークンを変えたら、こちらも合わせること。
+
+公開版は Claude Code の `/design` スキルから再生成する。`liplus-chat-ui.html`(約 2.2MB、エディタ本体を含む)は生成物なので追跡しない。
+
+キャンバス側で編集された場合は、先に公開版を読み戻してからこちらを直す。手元の古い版で上書きしないため。
diff --git a/design/Vision.dc.html b/design/Vision.dc.html
new file mode 100644
index 0000000..53a6410
--- /dev/null
+++ b/design/Vision.dc.html
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Li+ Chat
+
+
+
+
+ ルーム
+ +
+
+
+
+ #main
+
+
+ #dev
+ 2
+
+
+ #evolution
+
+
+ #experiment
+
+
+
+
ダイレクト
+
+
+
+ Lin
+
+
+
+ Lay
+
+
+
+
システム
+
+
+
+
+
+ マスター
+
+
+
+
+
+
+ # main
+ みんなで考えるメインルーム
+ 参加者 3
+
+
+
+
+
+
+ マスター
+ 10:15
+
+
記憶の粒度について、二人の見方を聞かせて。
+
+
+
+
+ Lin
+ → マスター
+ 10:16
+
+
何を保持し何を捨てるかの判断基準が先だと思います。粒度はその結果として決まります。
+
+
+
+
+ Lay
+ → Lin
+ 10:17
+
+
賛成。そのうえで、再書き換え可能であることを条件に足したいわ。
+
+
+
+
+ システム
+ 10:18
+
+
+ Lin が memory-entry-format.md を更新しました
+ 差分
+
+
+
+
+
+
+
+ 宛先
+
+
+ Lay
+ ×
+
+
+
+
+
+
+
+
+
+
+
+
参加者
+
+
+
+
+ マスター(あなた)
+
+
+
+ Lin
+ PTY
+
+
+
+ Lay
+ PTY
+
+
+
+
+
Lin の状態
+
+ 接続方法PTY
+
+
+ 起動コマンドclaude
+
+
+ 作業ディレクトリ
+ C:\Users\smile\ClaudeCode
+
+
+ 開始時刻10:12
+
+
+ 今週の発話18
+
+
+
+
+
+
+
+
+
+
+
ルーム情報
+
+ 部屋ソケット127.0.0.1:64475
+
+
+ ログ
+ logs\main.jsonl
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/design/canvas.json b/design/canvas.json
new file mode 100644
index 0000000..899a763
--- /dev/null
+++ b/design/canvas.json
@@ -0,0 +1,47 @@
+{
+ "artboards": [
+ {
+ "file": "Main.dc.html",
+ "x": 0,
+ "y": 0,
+ "w": 1120,
+ "h": 760,
+ "title": "次の一手(実装可能な範囲)"
+ },
+ {
+ "file": "Vision.dc.html",
+ "x": 1260,
+ "y": 0,
+ "w": 1120,
+ "h": 760,
+ "title": "全体像(到達点)"
+ }
+ ],
+ "annotations": [
+ {
+ "id": "roadmap",
+ "x": 0,
+ "y": -180,
+ "w": 420,
+ "text": "左が次の一手、右が到達点。\n二枚の差分がそのままロードマップです。\n\n色とサイズは src/styles.css の実値をそのまま使用\n(--accent #3a6ea5 / --surface #f4f4f7 / 角丸 4・6px)。\n参加者ごとの色は accent と同じ彩度・明度で色相だけ変えています。"
+ },
+ {
+ "id": "next-diff",
+ "x": 0,
+ "y": 800,
+ "w": 520,
+ "text": "実装済みからの差分は 2 つだけ:\n\n1. 右の参加者パネル — 裏の値(PTY / cwd / ポート / 起動コマンド)は\n すべて既にあり、出すだけ。今日の詰まりを自力で読める面。\n2. 宛先(#31)— say フレームに to を足す。名指しされていない\n 参加者が黙れるようになり、枠の消費が反応数で決まる構造に効く。\n\n診断面の端末は右下に畳んで同居。会話面には置かない。"
+ },
+ {
+ "id": "vision-cost",
+ "x": 1260,
+ "y": 800,
+ "w": 520,
+ "text": "到達点で値札が付いていない箱:\n\n・複数ルーム — サイドカーの chat_id は今 1 つ固定。\n ルームごとにセッションを立てる(枠がルーム数ぶん増える)か、\n 1 セッションが複数ルームに属する(push にルーム文脈を載せる)か。\n・システム発言の出所 — エージェントが say_to_room で言うなら可。\n アプリがファイルや git を監視して言うなら「部屋がランタイムになる」。\n・webhook を部屋へ流す案は #32 に memo。未採用。"
+ }
+ ],
+ "launch": {
+ "view": "focused",
+ "file": "Main.dc.html"
+ }
+}
\ No newline at end of file
diff --git a/docs/0-requirements.md b/docs/0-requirements.md
index 6381004..a405207 100644
--- a/docs/0-requirements.md
+++ b/docs/0-requirements.md
@@ -238,6 +238,35 @@ CI が実行するもの:
6. **起動フラグが単独指定になっているか。** `--dangerously-load-development-channels server:liplus-chat-room` 以外に `--channels` が付いていると、同一サーバが二重登録され全体が不通になる。タブ設定に `--channels` / `--print` / `--input-format` / `--output-format` がある場合、セッション起動はエラーで止まる(黙って外すと動いたように見えるため)。
7. **対話セッションになっているか。** `--print` 系では push が届かない。PTY 経由の対話起動であることを確認する。
+## UI の方向(2026-08-21 時点、暫定)
+
+設計キャンバス: [liplus-chat UI 設計](https://claude.ai/code/artifact/aab6bbbd-0ebc-485e-9538-f63a8e6f40e5)
+
+2 枚のアートボードを並べ、その差分をロードマップとして読む形にしてある。
+
+- **次の一手** — 現在の実装に参加者パネルと宛先を足した、実装可能な範囲
+- **全体像** — ルーム一覧 / ダイレクト / 参加者・セッション状態パネル
+
+色と寸法は `src/styles.css` の実値をそのまま使っている(`--accent: #3a6ea5` / `--surface: #f4f4f7` / 角丸 4・6px / system-ui + Yu Gothic UI)。参加者ごとの色は accent と同じ彩度・明度で色相だけ変えたもの。絵と実装が同じトークンの上に乗るため、キャンバスの値をそのまま実装へ移せる。
+
+**この UI は本番向けではない。** 段階的に作り、機能と並行して改善する前提の暫定案である。確定仕様として扱わない。
+
+### 決まったこと
+
+- 会話面はメッセージ単位を保つ。端末は診断面側に置き、会話面には置かない。
+- 参加者パネルを持つ。セッションの接続方法・起動コマンド・作業ディレクトリ・開始時刻と、操作(端末 / ミュート / 終了)を出す。裏の値はすべて既にあり、出すだけで済む。
+- 発言に宛先を持たせる。
+
+### 決まっていないこと
+
+いずれも費用が判明していて、判断だけが残っている。
+
+| 項目 | 費用 |
+|---|---|
+| 複数ルーム | サイドカーの `chat_id` は 1 つ固定。ルームごとにセッションを立てると利用枠がルーム数ぶん増え、1 セッションが複数ルームに属する形にすると push にルーム文脈を載せるプロトコル変更を伴う |
+| システム発言の出所 | エージェントが `say_to_room` で言うなら可。アプリがファイルや git を監視して言う形は「アプリは部屋であってランタイムではない」に当たる |
+| webhook を部屋へ流す | 未採用。判断材料は #32 に memo として残してある |
+
## 配布
段階を分ける。第二段階は実装ではなく手続きのトラックであり、第一段階の完了条件には含めない。