fix(session): drop the resume record when the room never saw the session (topic-index crate, room_log, session.rs, main.ts, docs) - #129
Conversation
…ion (topic-index crate, room_log, session.rs, main.ts, docs) セッション id は spawn が返った直後に記録される。プロセスが立ったことは 会話ができたことではないため、起動直後の確認プロンプトで止めたまま終えた 回は会話の無い id を残す。以後その(アカウント, トピック)の組は押すたびに 再開の線へ入り、`No conversation found with session ID` で失敗する——落ちる 先が無く、記録を消すかトピックを消すまで直らない。#127 判別は既に在る三つの観測だけで行う:起動が再開の線であったこと(席が持つ)、 部屋の名簿がそのアカウントを一度も運ばなかったこと(行が「起動中」を描いて いるのと同じ観測)、セッションが自分で終わったこと(終了イベントが終了 コードを運んだかどうか。値ではない)。CLI の出力も文言も読まない——文言の 一致を条件にすると、CLI の版が変われば黙って効かなくなる。 外すのは記録がその id のままであるときだけであり、トピックの項目も発言も 残る。外したことは状態行で述べ、自動では起動し直さない。次に押せば通常 起動で立つ。 - `crates/topic-index`: `TopicIndex::forget_session` と、項目・他アカウント を残すこと / id 一致でのみ効くことのテスト - `src-tauri`: `room_log::forget_session` と `room_forget_session` コマンド、 `LaunchLine.resumed` を `resumed_from` へ、席と起動の戻り値が再開元の id と 起動時のトピックを運ぶ - `src/main.ts`: 端末が再開元・トピック・名簿への到着を持ち、終了時に記録を 外して状態行で述べる。最初の名簿の読みも `renderRoster` を通す - `docs/0-requirements.md`: 「トピック」へ判断を追記、実装済み / 未実装 / テストの表 / 受容したトレードオフを更新 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
smileygames
left a comment
There was a problem hiding this comment.
AI セルフレビュー(execution_mode = auto、#127 に対して)。
受け入れ基準
本文の決定を diff で確認した。満たしている。
- AI 判断1(軸2+軸3) — 再開で起動したセッションが席に着かないまま自分で終了したとき、
room_forget_sessionでその id の記録を外し、状態行で述べる。 - AI 判断2(自動で起動し直さない) —
dropDeadResumeは記録を外して終わる。再起動の呼び出しは無い。 - 制約(CLI のエラー文言に一致させない) — 守られている。判定は既に在る三つの観測のみ:
resumedFrom(席が持つ)、seenInRoom(名簿がそのアカウントを運んだか)、終了コードの有無。文字列比較は一つも無い。 - 軸4 は触れていない。
docsにも「ここでは扱わない」と明記され、#128 へ送られている。
判別条件の literal:
if (dead === null || view.seenInRoom || view.topicId === "" || code === null) return;
code === null を「こちらから止めた」の判別に使っているのが要点である。pty.rs は kill されたセッションを reap の前に map から外すため、その終了はコードを伴わずに着く。値ではなく有無を読むことで、行の ❌・トピック削除・アプリ終了を自然に除外している。#89 の確認プロンプトが CLI を数分間部屋の外に留める窓で起動し違えたアカウントを止めても、成立したはずの戻り道を失わない。この偽陽性を潰している点を評価する。
競合の守り
forget_session が id で照合している。セッション終了の瞬間に席は空くため、外す前に同じアカウントが同じトピックへ起動し直して新しい id を書きうる。id 一致を条件にすることで、その新しい記録に手が届かない。crate 側に二つのテストがあり、CI が走らせている(cargo test、topic-index 10 passed)。
状態行はバックエンドが「外した」と答えたときだけ述べる。頼んだことではなく起きたことを言う形になっている。
逸脱
なし。6 ファイルで、src-tauri/src/lib.rs の差分はコマンド登録一行のみ。本文の target files に crates/topic-index と lib.rs は挙げていないが、room_log.rs の新コマンドを登録するのに必要な最小の付随であり、範囲拡大ではない。
受容したトレードオフ(docs に記載あり)
根本は未修正である。id は今も spawn 直後に記録されるため、死んだ id は一度書かれ、一度失敗してから外れる。また到着の合図が名簿であるため、再開自体は成立したがサイドカーが部屋へ届かなかったセッションも同じ扱いになり、戻り道を失う(read_room_history は残る)。いずれも docs の「受容したトレードオフ」に書かれている。握り潰していない。
CI
check / CI ともに success(c95e6f0)。mergeStateStatus = CLEAN。
版数
patch。観測できる変化だが規模は限定的で、大きな構造変更ではない。
未確認として残るもの
実機未確認。 この経路を意図的に再現するには、確認プロンプトで止めた起動で id を記録させたうえで再開させる必要がある。docs にも未確認として記録済み。実機確認はマージの門ではないため止めない。
次: 自己レビュー通過につき、auto モードの直接マージへ進む。
Closes #127
再開の線で起動したセッションが、部屋の名簿に一度も現れないまま自分で終了したら、そのトピックからその id の記録を外し、状態行でそう述べる。次に押せば通常起動で立つ。自動では起動し直さない。
判別は既に在る三つの観測だけで行う——起動が再開の線であったこと(席が持つ)、名簿がそのアカウントを一度も運ばなかったこと、セッションが自分で終わったこと(終了イベントが終了コードを運んだかどうか。値ではない)。CLI の出力も文言も読まないため、
docs/0-requirements.md「CLI の出力から状態を読む形」で見送られた軸に踏み込まず、文言依存も負わない。外すのは記録がその id のままであるときだけであり、トピックの項目も発言も残る。軸4(再開の線に適用範囲を持たせる形)は issue の決定どおり扱っていない。