2026-08-02 のプロジェクト全体レビューで見つかった、単独では Issue にするほどでない小さな問題をまとめる。個別に片付けても、まとめて 1 PR にしてもよい。
verify (web)
TrustCalculator.ts:57-63: issue メッセージに shared の英語文言が素通し される (message: verificationResult.message || t('trust.issueChainInvalid'))。ja ロケールで Previous hash mismatch at event 42: ... のような英文が混ざる
TabBar.ts:79-93: removeTab が TabBar.activeTabId を無通知で付け替えるが VerifyTabManager.activeTabId は同期されない (TabController.handleTabClose:111-126)。タブを閉じた直後、選択タブと表示中の結果が別ファイルになる
ResultPanel.ts:552-565: trustResult 未指定時のフォールバック isSuccess = result.chainValid && result.pureTyping が metadata 不正・exam 束縛失敗・スクショ改竄を無視する。現状は到達不能だが overclaim を生む地雷なのでフォールバックごと削除が安全
ScreenshotLightbox.ts:294: screenshot.displayInfo.width は攻撃者制御の manifest 由来。displayInfo 欠落で TypeError
ResultPanel.ts:878-883: exam カードが package 未提供時に緑 バッジ。文言は正直だが、カードが既定折りたたみのため未提供注記が隠れる。warning 色 + 既定展開が望ましい
VerificationController.ts:135-139: 複数 proof の ZIP で「最初に完了した proof」を自動で開くため、緑のタブが開いた状態で赤い兄弟タブを見落としうる (CLI にはある Summary: N/M proofs passed 相当の集約表示が web に無い)
VerificationQueue.ts:246-266: clear()/terminate() が manifestMap を消していない (parsedDataMap/modeMap と非対称)
verify-cli
cli.ts:221: process.exit() によるパイプ時の stdout 切り捨て。typedcode-verify x.zip | tee report.txt で末尾が欠けうる。process.exitCode = ... にして自然終了させる
output.ts:397: audit モードの help が fast + deterministic PoSW sampling (placeholder) (= fast 相当) と読めるが、実装は full と同等 (spec §6.1 と一致)。あわせて result.poswSampled (サンプリング (audit)) が到達不能な dead string
--analyzer の実行順: runAnalysis が pasteEvents/dropEvents の集計 (verify.ts:159-160) や summarizeProcess (:219) より先 に走る。exit code / assurance は汚染されないが、表示上の統計は外部 analyzer に汚染されうる。凍結ビューを渡すか統計を先に計算しておくと不変条件が明快になる
editor
OperationDetector.ts:83-106,146-151: 削除分類が粗い (rangeLength 2..49 は複数行でも deleteWordBackward、コメントとコード不一致)。advisory メタデータのみだが分析層の入力品質を下げる
EventRecorder.ts:86-107 + TypingProof.ts:413-423: 記録エラー時のフォールバック index {index: events.length-1} により直前のイベント を二重処理する (LogViewer 二重表示 + IDB 再 append)
dead code: TabManager.exportSingleTab / exportAllTabs / TabManager.reset() / SessionStorageService.pruneOldSessions
StaticEventListeners.ts:331-333: beforeunload の deleteScreenshotsDB() は legacy DB のみ削除。コメントと実挙動が不一致
TabManager.ts:685-699: 復元時の合成 tabSwitch (fromTabId=null) が sessionStorage 復元では蓄積し IDB 復旧では消失する。監査証跡が復元経路に依存して非決定的
TypingProof.ts:927-929: 旧 API 名 waitForProcessingComplete() を参照する stale コメント
workers
checkpoint.ts:99-122: 署名鍵キャッシュが keyId のみをキーにする。同一 keyId で JWK を差し替えると isolate が生きている限り旧鍵で署名する。「ローテは必ず keyId 変更を伴う」を CLAUDE.md に注記したい
index.ts:270,359,428-433: /api/session/start /api/verify-captcha /api/verify-attestation に body サイズ上限が無い (MAX_BODY_BYTES は sign のみ)。turnstileToken の長さ上限も無い
index.ts:326-341: handleVerifyCaptcha の catch がログなしの汎用 500。[workers] fetch ハンドラに包括 try/catch が無く未捕捉例外が 1101 (CORS/JSON なし) に落ちる #153 で session/start は揃えたが verify-captcha に残存
API 応答に X-Content-Type-Options: nosniff 等のセキュリティヘッダが無い (純 JSON API なので実害は小)
e2e
tests/helpers/app.ts:50-60: waitForSynced がイベント数安定を最大 ~9 秒で諦めて黙って続行 する。flake 調査時に「同期未達のまま進んだ」ことがログから読めない
2026-08-02 のプロジェクト全体レビューで見つかった、単独では Issue にするほどでない小さな問題をまとめる。個別に片付けても、まとめて 1 PR にしてもよい。
verify (web)
TrustCalculator.ts:57-63: issue メッセージに shared の英語文言が素通しされる (message: verificationResult.message || t('trust.issueChainInvalid'))。ja ロケールでPrevious hash mismatch at event 42: ...のような英文が混ざるTabBar.ts:79-93:removeTabがTabBar.activeTabIdを無通知で付け替えるがVerifyTabManager.activeTabIdは同期されない (TabController.handleTabClose:111-126)。タブを閉じた直後、選択タブと表示中の結果が別ファイルになるResultPanel.ts:552-565:trustResult未指定時のフォールバックisSuccess = result.chainValid && result.pureTypingが metadata 不正・exam 束縛失敗・スクショ改竄を無視する。現状は到達不能だが overclaim を生む地雷なのでフォールバックごと削除が安全ScreenshotLightbox.ts:294:screenshot.displayInfo.widthは攻撃者制御の manifest 由来。displayInfo欠落で TypeErrorResultPanel.ts:878-883: exam カードが package 未提供時に緑バッジ。文言は正直だが、カードが既定折りたたみのため未提供注記が隠れる。warning 色 + 既定展開が望ましいVerificationController.ts:135-139: 複数 proof の ZIP で「最初に完了した proof」を自動で開くため、緑のタブが開いた状態で赤い兄弟タブを見落としうる (CLI にはあるSummary: N/M proofs passed相当の集約表示が web に無い)VerificationQueue.ts:246-266:clear()/terminate()がmanifestMapを消していない (parsedDataMap/modeMapと非対称)verify-cli
cli.ts:221:process.exit()によるパイプ時の stdout 切り捨て。typedcode-verify x.zip | tee report.txtで末尾が欠けうる。process.exitCode = ...にして自然終了させるoutput.ts:397:auditモードの help がfast + deterministic PoSW sampling (placeholder)(= fast 相当) と読めるが、実装は full と同等 (spec §6.1 と一致)。あわせてresult.poswSampled(サンプリング (audit)) が到達不能な dead string--analyzerの実行順:runAnalysisがpasteEvents/dropEventsの集計 (verify.ts:159-160) やsummarizeProcess(:219) より先に走る。exit code / assurance は汚染されないが、表示上の統計は外部 analyzer に汚染されうる。凍結ビューを渡すか統計を先に計算しておくと不変条件が明快になるeditor
OperationDetector.ts:83-106,146-151: 削除分類が粗い (rangeLength 2..49 は複数行でもdeleteWordBackward、コメントとコード不一致)。advisory メタデータのみだが分析層の入力品質を下げるEventRecorder.ts:86-107+TypingProof.ts:413-423: 記録エラー時のフォールバック index{index: events.length-1}により直前のイベントを二重処理する (LogViewer 二重表示 + IDB 再 append)TabManager.exportSingleTab/exportAllTabs/TabManager.reset()/SessionStorageService.pruneOldSessionsStaticEventListeners.ts:331-333:beforeunloadのdeleteScreenshotsDB()は legacy DB のみ削除。コメントと実挙動が不一致TabManager.ts:685-699: 復元時の合成 tabSwitch (fromTabId=null) が sessionStorage 復元では蓄積し IDB 復旧では消失する。監査証跡が復元経路に依存して非決定的TypingProof.ts:927-929: 旧 API 名waitForProcessingComplete()を参照する stale コメントworkers
checkpoint.ts:99-122: 署名鍵キャッシュが keyId のみをキーにする。同一 keyId で JWK を差し替えると isolate が生きている限り旧鍵で署名する。「ローテは必ず keyId 変更を伴う」を CLAUDE.md に注記したいindex.ts:270,359,428-433:/api/session/start/api/verify-captcha/api/verify-attestationに body サイズ上限が無い (MAX_BODY_BYTESは sign のみ)。turnstileTokenの長さ上限も無いindex.ts:326-341:handleVerifyCaptchaの catch がログなしの汎用 500。[workers] fetch ハンドラに包括 try/catch が無く未捕捉例外が 1101 (CORS/JSON なし) に落ちる #153 で session/start は揃えたが verify-captcha に残存X-Content-Type-Options: nosniff等のセキュリティヘッダが無い (純 JSON API なので実害は小)e2e
tests/helpers/app.ts:50-60:waitForSyncedがイベント数安定を最大 ~9 秒で諦めて黙って続行する。flake 調査時に「同期未達のまま進んだ」ことがログから読めない