#238 (2026-08 レビューのまとめ Issue) をサブシステム別に分割したうちの editor 分。
項目番号 (e1〜e6) は #238 のトリアージコメントの採番。現存は 2026-08-24 / HEAD d61f126 で再確認済み
(dead API は grep -rn --include='*.ts' で「1 ヒット = 定義のみ」を個別に確認)。
dead API の除去 (e3 + トリアージで追加発見した分)
呼び出し元ゼロのメソッド。exportSingleTab が最優先 — waitForQueueDrain を通さず exportProof を
呼ぶので、将来誰かが配線すると #225 が再発する。
| メソッド |
位置 |
行数 |
備考 |
TabManager.exportSingleTab |
TabManager.ts:1558-1564 |
7 |
#225 再発の地雷。最優先で削除 |
TabManager.exportAllTabs |
:1569-1623 |
55 |
shared の MultiFileExportedProof / isMultiFileProof / types.test.ts も道連れ → #231(a) で spec §5.4 を削る |
TabManager.reset |
:1524-1553 |
30 |
JSDoc の「reCAPTCHA」も stale |
TabManager.getActiveContent |
:1628-1631 |
4 |
|
TabManager.getSessionService |
:1516-1518 |
3 |
|
TabManager.getSyncStatus |
:238-240 |
3 |
|
SessionStorageService.pruneOldSessions |
SessionStorageService.ts:721-747 |
27 (+73) |
唯一の呼び出し元だった private deleteSessionById :752-824 も道連れ |
SessionStorageService.truncateEvents |
:584-614 |
31 |
|
SessionStorageService.updateTabContent |
:469-476 |
8 |
|
SessionStorageService.updateTabMetadata |
:481-491 |
11 |
|
合計 −190 行程度。
updateSessionActivity / markSessionInactive / getInstanceId / isSessionActive は #268 の管轄なので
この Issue では触らない (getInstanceId は #237 で使う予定)。
e2 — 記録エラー時のフォールバック index で直前イベントを二重処理する
packages/shared/src/TypingProof.ts:415-425 / packages/editor/src/services/EventRecorder.ts:86-104
TypingProof の catch が { index: events.length - 1 } で resolve するため、EventRecorder が
events[result.index] = 直前の成功イベントを LogViewer と IDB に再投入する。
再現済み (潜在): 2 件目の computeHash を 1 回だけ throw させると recordEvent が
{index:0, hash:<1 件目>} で resolve し events.length === 1 になる。IDB 側は unique index で黙って弾かれるので
二重保存にはならず、LogViewer の二重表示のみ顕在化する。到達性は低い
(PoSW worker 障害は main-thread fallback で throw しなくなっている)。
方針: RecordEventResult に recorded: false を足して呼び出し側で分岐する。~10 行。
e1 — 削除操作の分類が粗く、コメントと実挙動が一致しない
packages/editor/src/services/OperationDetector.ts:83-106, 146-151
rangeLength 2..49 を複数行でも deleteWordBackward と分類する。advisory メタデータのみで
pureTyping への影響はない (削除系 inputType はすべて ALLOWED_INPUT_TYPES) が、分析層の入力品質を下げる。
~15 行 + テスト。
e5 — 復元時の合成 tabSwitch が復元経路に依存して非決定的
packages/editor/src/services/TabManager.ts:684-699
isRestoring 中は IDB への persistTabSwitch だけ抑止し、tabSwitches.push と sessionStorage 保存は実行する。
結果、sessionStorage 復元ではリロードのたびに fromTabId:null が 1 件ずつ蓄積し、
IDB 復旧では IDB 由来 + 合成 1 件になる。監査証跡が復元経路で変わる。advisory のみ。1-3 行 + テスト。
e4 — beforeunload の deleteScreenshotsDB() は legacy DB しか消さない
packages/editor/src/ui/StaticEventListeners.ts:331-332 / StorageClearHelper.ts:65-71
削除対象は 'typedcode-screenshots' のみ。コメントは全 DB を消すかのように読める。コメント 2 行の修正。
e6 — stale コメント waitForProcessingComplete()
packages/shared/src/TypingProof.ts:954-956
「旧 API 名」ではなく、同名の private メソッドが packages/editor/src/services/ProofExporter.ts:130 に現存する。
stale なのは (a) shared から editor 内部名を参照している点、(b) 整合性の根拠が #225 以降
waitForQueueDrain + 未排出時の export 中止に移った点。2 行。
備考
Refs #238 #243
#238 (2026-08 レビューのまとめ Issue) をサブシステム別に分割したうちの editor 分。
項目番号 (e1〜e6) は #238 のトリアージコメントの採番。現存は 2026-08-24 / HEAD
d61f126で再確認済み(dead API は
grep -rn --include='*.ts'で「1 ヒット = 定義のみ」を個別に確認)。dead API の除去 (e3 + トリアージで追加発見した分)
呼び出し元ゼロのメソッド。
exportSingleTabが最優先 —waitForQueueDrainを通さずexportProofを呼ぶので、将来誰かが配線すると #225 が再発する。
TabManager.exportSingleTabTabManager.ts:1558-1564TabManager.exportAllTabs:1569-1623MultiFileExportedProof/isMultiFileProof/types.test.tsも道連れ → #231(a) で spec §5.4 を削るTabManager.reset:1524-1553TabManager.getActiveContent:1628-1631TabManager.getSessionService:1516-1518TabManager.getSyncStatus:238-240SessionStorageService.pruneOldSessionsSessionStorageService.ts:721-747deleteSessionById :752-824も道連れSessionStorageService.truncateEvents:584-614SessionStorageService.updateTabContent:469-476SessionStorageService.updateTabMetadata:481-491合計 −190 行程度。
e2 — 記録エラー時のフォールバック index で直前イベントを二重処理する
packages/shared/src/TypingProof.ts:415-425/packages/editor/src/services/EventRecorder.ts:86-104TypingProofの catch が{ index: events.length - 1 }で resolve するため、EventRecorderがevents[result.index]= 直前の成功イベントを LogViewer と IDB に再投入する。再現済み (潜在): 2 件目の
computeHashを 1 回だけ throw させるとrecordEventが{index:0, hash:<1 件目>}で resolve しevents.length === 1になる。IDB 側は unique index で黙って弾かれるので二重保存にはならず、LogViewer の二重表示のみ顕在化する。到達性は低い
(PoSW worker 障害は main-thread fallback で throw しなくなっている)。
方針:
RecordEventResultにrecorded: falseを足して呼び出し側で分岐する。~10 行。e1 — 削除操作の分類が粗く、コメントと実挙動が一致しない
packages/editor/src/services/OperationDetector.ts:83-106, 146-151rangeLength2..49 を複数行でもdeleteWordBackwardと分類する。advisory メタデータのみでpureTyping への影響はない (削除系 inputType はすべて
ALLOWED_INPUT_TYPES) が、分析層の入力品質を下げる。~15 行 + テスト。
e5 — 復元時の合成 tabSwitch が復元経路に依存して非決定的
packages/editor/src/services/TabManager.ts:684-699isRestoring中は IDB へのpersistTabSwitchだけ抑止し、tabSwitches.pushと sessionStorage 保存は実行する。結果、sessionStorage 復元ではリロードのたびに
fromTabId:nullが 1 件ずつ蓄積し、IDB 復旧では IDB 由来 + 合成 1 件になる。監査証跡が復元経路で変わる。advisory のみ。1-3 行 + テスト。
e4 —
beforeunloadのdeleteScreenshotsDB()は legacy DB しか消さないpackages/editor/src/ui/StaticEventListeners.ts:331-332/StorageClearHelper.ts:65-71削除対象は
'typedcode-screenshots'のみ。コメントは全 DB を消すかのように読める。コメント 2 行の修正。e6 — stale コメント
waitForProcessingComplete()packages/shared/src/TypingProof.ts:954-956「旧 API 名」ではなく、同名の private メソッドが
packages/editor/src/services/ProofExporter.ts:130に現存する。stale なのは (a) shared から editor 内部名を参照している点、(b) 整合性の根拠が #225 以降
waitForQueueDrain+ 未排出時の export 中止に移った点。2 行。備考
exportSingleTabだけは「配線されたら [editor] waitForQueueDrain timeout 時の export が content replay で invalid になる proof を生む #225 が再発する」という点で先に消しておく価値がある
exportAllTabsを消すと shared と docs ([docs] system-spec の陳腐化 (§5.4 dead なマルチファイル形式 / §5.3 フィールド欠落 / firstSeenAt と上限の per-tab 化など) #231) に波及するので、その 2 つは同一 PR か直後にRefs #238 #243