purpose
読み出し(read_room_history)は在って動くが、引き金が無い。文脈を持たないまま席に着いたセッションに、そのことを伝える。伝えたうえで引くかどうかはセッションが決める——push にはしない。
観測(2026-08-29、実機)
#131 の実機確認で見えた。再開先を外した起動は人には言う——状態行「Claude Lay を起動しました。戻る先の会話が見つからなかったため、このトピックの再開先は外しました。」。しかしセッション自身には何も言わない。文脈ゼロで席に着き、そうと知らないまま話し始める。
#131 が入る前はこの経路が起動ごと壊れていたため、欠けが後ろに隠れていた。壊れなくなって初めて前に出た。
premise
いずれも main(945c31d)で確認した。
- 道具は在り、動く。
sidecar/src/index.ts:312 の read_room_history、history / history_result フレーム、before の巻き戻しまで実装済みである(docs/0-requirements.md:366 の実装済み一覧)。
- 作法は呼ぶかどうかをセッションに委ねている。
sidecar/src/index.ts:208 の INSTRUCTIONS:「必要になったら read_room_history を呼んでください」「押し付けられないので、要らないときは呼ばないでください」。呼ぶべき場面を名指す文が無い。 欠けているのは道具ではなく引き金である。
- サイドカーは launch ごとの事実を env で受け取っている。
PULLCEPT_ROOM_URL / PULLCEPT_AGENT_NAME / PULLCEPT_ROOM_TOKEN / PULLCEPT_ROOM_ID / PULLCEPT_AGENT_HUE。書き出しは crates/mcp-config/src/lib.rs:532 付近であり、起動のたびに書き直される。伝える口は既に在る。
- 順序は足りている。
resolve_launch(src-tauri/src/session.rs:632)は register_sidecar(同 :793)より前に走る。登録の時点で resumed_from / dropped_resume は確定している。
- トピックに過去の発言が在るかは答えられる。
room_log::topic_posts(src-tauri/src/room_log.rs:356)。
決定
AI 判断1: 境界は「再開しなかった席」であって、「再開先を外した席」ではない。 伝える条件は、そのトピックに既に発言が在り、かつこの起動が再開の線に入らなかったこと。dropped_resume はその一例に過ぎない。
採る理由: 盲目の度合いが同じだからである。外した席も、発言のあるトピックへ初めて入った席も、等しく「来る前の発言を持たない」。前者だけを拾う形は、#131 の経路に貼った絆創膏になり、同じ状態の残り半分を落とす。
AI 判断2: 伝えるのは「在る」ことだけで、件数は載せない。 引くかどうかの判断に件数は要らない。件数を出すには topic_posts の全読みを起動のたびに払うことになり、対価が釣り合わない。
AI 判断3: アプリが read_room_history を代理で呼ばない。 引く判断はセッションのものである。アプリが結果を先回りして注入すれば、下の制約が見送った力業と同じ場所に着く。
constraints
target files
crates/mcp-config/src/lib.rs(env の書き出し)
src-tauri/src/session.rs(LaunchLine が持つ事実を登録へ渡す)
sidecar/src/index.ts(INSTRUCTIONS の分岐)
sidecar/test/round-trip.test.mjs(作法の文言を持つテスト)
docs/0-requirements.md
関連
purpose
読み出し(
read_room_history)は在って動くが、引き金が無い。文脈を持たないまま席に着いたセッションに、そのことを伝える。伝えたうえで引くかどうかはセッションが決める——push にはしない。観測(2026-08-29、実機)
#131 の実機確認で見えた。再開先を外した起動は人には言う——状態行「Claude Lay を起動しました。戻る先の会話が見つからなかったため、このトピックの再開先は外しました。」。しかしセッション自身には何も言わない。文脈ゼロで席に着き、そうと知らないまま話し始める。
#131 が入る前はこの経路が起動ごと壊れていたため、欠けが後ろに隠れていた。壊れなくなって初めて前に出た。
premise
いずれも
main(945c31d)で確認した。sidecar/src/index.ts:312のread_room_history、history/history_resultフレーム、beforeの巻き戻しまで実装済みである(docs/0-requirements.md:366の実装済み一覧)。sidecar/src/index.ts:208のINSTRUCTIONS:「必要になったら read_room_history を呼んでください」「押し付けられないので、要らないときは呼ばないでください」。呼ぶべき場面を名指す文が無い。 欠けているのは道具ではなく引き金である。PULLCEPT_ROOM_URL/PULLCEPT_AGENT_NAME/PULLCEPT_ROOM_TOKEN/PULLCEPT_ROOM_ID/PULLCEPT_AGENT_HUE。書き出しはcrates/mcp-config/src/lib.rs:532付近であり、起動のたびに書き直される。伝える口は既に在る。resolve_launch(src-tauri/src/session.rs:632)はregister_sidecar(同:793)より前に走る。登録の時点でresumed_from/dropped_resumeは確定している。room_log::topic_posts(src-tauri/src/room_log.rs:356)。決定
AI 判断1: 境界は「再開しなかった席」であって、「再開先を外した席」ではない。 伝える条件は、そのトピックに既に発言が在り、かつこの起動が再開の線に入らなかったこと。
dropped_resumeはその一例に過ぎない。採る理由: 盲目の度合いが同じだからである。外した席も、発言のあるトピックへ初めて入った席も、等しく「来る前の発言を持たない」。前者だけを拾う形は、#131 の経路に貼った絆創膏になり、同じ状態の残り半分を落とす。
AI 判断2: 伝えるのは「在る」ことだけで、件数は載せない。 引くかどうかの判断に件数は要らない。件数を出すには
topic_postsの全読みを起動のたびに払うことになり、対価が釣り合わない。AI 判断3: アプリが
read_room_historyを代理で呼ばない。 引く判断はセッションのものである。アプリが結果を先回りして注入すれば、下の制約が見送った力業と同じ場所に着く。constraints
docs/0-requirements.md:71、feat(room): give utterances an addressee so agents can stay silent #31 / feat(room): one post frame, so a participant is a participant #39)。渡すのは「在る」という事実であって、発言そのものではない。この一線を動かさないことが、この issue が pull の枠内に留まる条件である。docs/0-requirements.md:272が三つの理由で見送っている——トピックが伸びるほど毎回の起動が高くつく/CLI は流し込まれた文をユーザ入力として読むため「自分が言ったこと」と「言ったと聞かされたこと」を区別できない/端末ペインにその塊が見える。target files
crates/mcp-config/src/lib.rs(env の書き出し)src-tauri/src/session.rs(LaunchLineが持つ事実を登録へ渡す)sidecar/src/index.ts(INSTRUCTIONSの分岐)sidecar/test/round-trip.test.mjs(作法の文言を持つテスト)docs/0-requirements.md関連