Skip to content

feat(room): one post frame, so a participant is a participant #39

Description

@smileygames

目的

人間と AI を同じ「参加者」として扱う投稿モデルへ移す。発言は誰が出したものでも同一の行為とし、部屋は全員へ配る。

前提

目指す形(2026-08-22、Master)

この場は AI と話すための場所ではない。人間も AI も区別なくやり取りできる場所であり、チャットよりも掲示板に近い。

現在のプロトコルはこの前提と食い違っている。人間の発言と AI の発言が別の行為としてモデル化されており、その食い違いが実際の不具合として出ている。

非対称が不具合を生んでいる

行為 frame 配送
人間が喋る say 全サイドカーへ fan-out
AI が喋る reply 画面へ emit のみ

room_say は組んだフレームを state.to_agents.send(frame) でサイドカーへ配る。いっぽう受信ループの "reply" 腕は app.emit("room-message", message) だけで、to_agents へは送っていない(src-tauri/src/room.rs)。

実測(2026-08-22、Master): 並列に立てた 2 セッションが互いの発言を受け取らなかった。

これは配送行の書き忘れではなく、reply という語が示すとおりの設計である。AI の発言が「部屋での発言」ではなく「人間への返答」としてモデル化されているため、他の参加者へ配る線がそもそも引かれていない。掲示板では行為はひとつであり、誰が出したかは名前の違いでしかない。

他に非対称が残っている箇所

  • RoomMessage.kind"human" / "agent" を持ち、styles.css が色を分けている(.message[data-kind="human"])。人間か AI かという軸が表示まで貫通している。
  • 名簿が agents だけagents: BTreeSet<String>)。人間は参加者ではなく操作者として場の外にいる。
  • 宛先の選択肢に人間がいない。AI から Master を名指せず、Master 自身も to の対象にならない。

版の互換

サイドカーはアプリが .mcp.json へ書く同梱パスから起動するため、部屋とサイドカーの版が食い違う形が構造上無い(#36 で確認済み)。旧フレームとの互換を残す必要はない。

制約

  • 発言に人間 / AI の区別を持たせない。区別は名前による。
  • 部屋は宛先で配送を絞らない。feat(room): give utterances an addressee so agents can stay silent #31 の決定を維持する。全員へ配り、答えるかどうかは参加者が決める。
  • 参加者は自分の発言を受け取らない。抑止は接続の同一性で判定する。名前で判定すると、名前が衝突している間は他人の発言まで落ちる(fix(session): agent names collide, so an addressee cannot name one session #40)。
  • 人間を名簿に載せる。宛先の選択肢は自分以外の参加者とする。
  • 画面への配送経路は一本のままとする。並び順の権威を増やさない。
  • 表示上の区別を残す場合、軸は「人間か AI か」ではなく「自分か他人か」とする。どう見せるかは実装側の判断とする。

対象ファイル

  • src-tauri/src/room.rs — フレームの統一、全参加者への配送、名簿
  • sidecar/src/index.ts — 統一フレームの送受信、自分の発言の抑止、instructions
  • sidecar/test/round-trip.test.mjs
  • src/main.ts, index.html, src/styles.css — 表示と宛先の選択肢
  • docs/0-requirements.md — 目指す形と投稿モデル

完了条件

  • 参加者 A の発言が参加者 B へ届く。人間と AI のどちらでも同じように届く。
  • 参加者 A に自分の発言が戻らない。
  • 宛先(to)が誰の発言でも meta を通じて届く。
  • 名簿に人間が並び、宛先として名指せる。
  • 発言の経路に人間 / AI の分岐が残っていない。
  • docs/0-requirements.md が掲示板としての前提と投稿モデルを記述している。

関連

Metadata

Metadata

Assignees

Labels

bug動いていない、壊れているin-progress着手中、実装または検証が進行中ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions