#238 (2026-08 レビューのまとめ Issue) をサブシステム別に分割したうちの verify (web) 分。
項目番号 (v1〜v7) は #238 のトリアージコメントの採番。現存は 2026-08-24 / HEAD d61f126 で再確認済み。
項目
v1 — shared の英語文言が issue メッセージに素通しする
packages/verify/src/services/TrustCalculator.ts:62
message: verificationResult.message || t('trust.issueChainInvalid'),
英文の源は shared/src/verification.ts:724 / ChainVerifier.ts:103,483。ja ロケールで
Previous hash mismatch at event 42: ... のような英文が信頼バッジに混ざる。
技術的な英文は chain カードに別途出るので、ここは常に翻訳済み文言にしてよい。1 行。
v2 — TabBar.removeTab が activeTabId を無通知で付け替える
packages/verify/src/ui/TabBar.ts:79-92 / packages/verify/src/ui/controllers/TabController.ts:102-117
removeTab が TabBar.activeTabId を付け替えるが VerifyTabManager.activeTabId は同期されない
(handleTabClose は switchTab も sidebar.setActiveFile も呼ばない)。タブを閉じた直後、
選択タブと表示中の結果が別ファイルになる。~5 行。
#215 と同じ TabController の表示一貫性問題。#215 と同一 PR で直すのが望ましい。
補足 (#238 本文未記載): AppController.ts:320-337 handleFileRemove も
manager (tabOrder[idx-1]) と bar (tabOrder[0]) で次タブの選び方が違い、3 タブ以上で同種のずれが出る。
v3 — trustResult 未指定時のフォールバックが overclaim を生む
packages/verify/src/ui/ResultPanel.ts:555-569
isSuccess = result.chainValid && result.pureTyping は metadata 不正・exam 束縛失敗・スクショ改竄を無視する。
到達不能を確認済み (resultPanel.render( の呼び出し元は TabController.ts:303 の 1 箇所のみで
TrustResult を必ず渡す) だが、地雷なのでフォールバックごと削除するのが安全。−14 行。
v4 — displayInfo 欠落で TypeError
packages/verify/src/ui/ScreenshotLightbox.ts:294
screenshot.displayInfo.width は攻撃者制御の manifest 由来。screenshotManifest.ts:15-38 は
entry の中身を検証しないので displayInfo が無い manifest で TypeError。1-3 行。
v5 — exam カードが package 未提供時に緑バッジ + 既定折りたたみ
packages/verify/src/ui/ResultPanel.ts:826-841
renderCard は success / error / pending しか持たず、package 未提供でも緑。文言自体は正直だが、
注記行 #exam-note-row は .expanded が付くまで非表示で、描画時に付ける箇所が無い
(reset() :1083-1118 は呼び出し元ゼロ)。結果として「未提供」の注記が採点者に見えない。
overclaim 抑止の方針に反するので warning 色 + 既定展開にしたい。~10 行 (warning クラスは CSS に既存)。
v7 — clear() / terminate() が manifestMap を消さない
packages/verify/src/services/VerificationQueue.ts:244-249, 254-264
parsedDataMap / modeMap は消すのに manifestMap だけ残る非対称。
ただし両メソッドとも呼び出し元ゼロで実害なし。2 行 (dead メソッドごと消す選択もある)。
(c2 の web 側) dead な PoswMode = 'sampled' の掃除
poswModeFor (packages/verify/src/services/proofVerification.ts:72-79) は 'skipped' | 'full' しか
返さないので 'sampled' は生成箇所ゼロ。次から落とす:
packages/verify/src/types.ts:67 — PoswMode から 'sampled' を削除
packages/verify/src/ui/ResultPanel.ts:611-612 — 分岐を削除
packages/verify/src/i18n/types.ts:125 + translations/{ja,en}.ts — poswSampled キー削除
CLI 側の対になる修正 (audit の help 文言) は verify-cli 側の Issue で扱う。
spec §8.2 の「将来 audit で決定的サンプリングをする設計余地」の記述自体は残す
(復活させるときは poswModeFor と同時に足す)。
備考
- 深刻度は二層。medium 相当: v2、v5 (package 未提供が緑で隠れる = overclaim 抑止方針に反する)。
low: v1 v3 v4 v7 + 'sampled' 掃除
- v6 (複数 proof ZIP の集約表示) は UI 設計が要るので別 Issue に切り出した
Refs #238 #243
#238 (2026-08 レビューのまとめ Issue) をサブシステム別に分割したうちの verify (web) 分。
項目番号 (v1〜v7) は #238 のトリアージコメントの採番。現存は 2026-08-24 / HEAD
d61f126で再確認済み。項目
v1 — shared の英語文言が issue メッセージに素通しする
packages/verify/src/services/TrustCalculator.ts:62英文の源は
shared/src/verification.ts:724/ChainVerifier.ts:103,483。ja ロケールでPrevious hash mismatch at event 42: ...のような英文が信頼バッジに混ざる。技術的な英文は chain カードに別途出るので、ここは常に翻訳済み文言にしてよい。1 行。
v2 —
TabBar.removeTabが activeTabId を無通知で付け替えるpackages/verify/src/ui/TabBar.ts:79-92/packages/verify/src/ui/controllers/TabController.ts:102-117removeTabがTabBar.activeTabIdを付け替えるがVerifyTabManager.activeTabIdは同期されない(
handleTabCloseはswitchTabもsidebar.setActiveFileも呼ばない)。タブを閉じた直後、選択タブと表示中の結果が別ファイルになる。~5 行。
補足 (#238 本文未記載):
AppController.ts:320-337 handleFileRemoveもmanager (
tabOrder[idx-1]) と bar (tabOrder[0]) で次タブの選び方が違い、3 タブ以上で同種のずれが出る。v3 —
trustResult未指定時のフォールバックが overclaim を生むpackages/verify/src/ui/ResultPanel.ts:555-569isSuccess = result.chainValid && result.pureTypingは metadata 不正・exam 束縛失敗・スクショ改竄を無視する。到達不能を確認済み (
resultPanel.render(の呼び出し元はTabController.ts:303の 1 箇所のみでTrustResultを必ず渡す) だが、地雷なのでフォールバックごと削除するのが安全。−14 行。v4 —
displayInfo欠落で TypeErrorpackages/verify/src/ui/ScreenshotLightbox.ts:294screenshot.displayInfo.widthは攻撃者制御の manifest 由来。screenshotManifest.ts:15-38はentry の中身を検証しないので
displayInfoが無い manifest で TypeError。1-3 行。v5 — exam カードが package 未提供時に緑バッジ + 既定折りたたみ
packages/verify/src/ui/ResultPanel.ts:826-841renderCardは success / error / pending しか持たず、package 未提供でも緑。文言自体は正直だが、注記行
#exam-note-rowは.expandedが付くまで非表示で、描画時に付ける箇所が無い(
reset():1083-1118は呼び出し元ゼロ)。結果として「未提供」の注記が採点者に見えない。overclaim 抑止の方針に反するので warning 色 + 既定展開にしたい。~10 行 (
warningクラスは CSS に既存)。v7 —
clear()/terminate()がmanifestMapを消さないpackages/verify/src/services/VerificationQueue.ts:244-249, 254-264parsedDataMap/modeMapは消すのにmanifestMapだけ残る非対称。ただし両メソッドとも呼び出し元ゼロで実害なし。2 行 (dead メソッドごと消す選択もある)。
(c2 の web 側) dead な
PoswMode = 'sampled'の掃除poswModeFor(packages/verify/src/services/proofVerification.ts:72-79) は'skipped' | 'full'しか返さないので
'sampled'は生成箇所ゼロ。次から落とす:packages/verify/src/types.ts:67—PoswModeから'sampled'を削除packages/verify/src/ui/ResultPanel.ts:611-612— 分岐を削除packages/verify/src/i18n/types.ts:125+translations/{ja,en}.ts—poswSampledキー削除CLI 側の対になる修正 (
auditの help 文言) は verify-cli 側の Issue で扱う。spec §8.2 の「将来 audit で決定的サンプリングをする設計余地」の記述自体は残す
(復活させるときは
poswModeForと同時に足す)。備考
low: v1 v3 v4 v7 +
'sampled'掃除Refs #238 #243