概要
OpenCode (SQLite) 取り込みが 1 行の破損で全体を中断し、位置ベースのカーソルで新規ターンを取りこぼす。
詳細
- 無ガード行パース
indexer._load_opencode_raw_entries: json.loads(row["data"]) / _epoch_ms_to_iso(row["time_created"]) が無ガードで、1行破損や NULL が DB 全体 (全プロジェクト/セッション) の取り込みを中断。os.path.realpath(row["worktree"]) は NULL で TypeError。
- 位置カーソルのズレ
indexer.index_opencode_db: ply_start が (time_created, id) 順リストの添字。順序が前後する新規メッセージ到着で添字がシフトし、新規ターンを取りこぼす/旧ターンを再emit (exchange-id dedup が再emitを隠すが新規は欠落)。
- (関連)
sqlite3.connect(f"file:{path}?mode=ro") はパスに ?/#/空白を含むと URI 誤解釈。
修正案
概要
OpenCode (SQLite) 取り込みが 1 行の破損で全体を中断し、位置ベースのカーソルで新規ターンを取りこぼす。
詳細
indexer._load_opencode_raw_entries:json.loads(row["data"])/_epoch_ms_to_iso(row["time_created"])が無ガードで、1行破損や NULL が DB 全体 (全プロジェクト/セッション) の取り込みを中断。os.path.realpath(row["worktree"])は NULL でTypeError。indexer.index_opencode_db:ply_startが(time_created, id)順リストの添字。順序が前後する新規メッセージ到着で添字がシフトし、新規ターンを取りこぼす/旧ターンを再emit (exchange-id dedup が再emitを隠すが新規は欠落)。sqlite3.connect(f"file:{path}?mode=ro")はパスに?/#/空白を含むと URI 誤解釈。修正案