Skip to content

[verify] レビュー由来の表示不整合まとめ (v1-v5, v7 + dead な PoswMode sampled) #281

Description

@shinyaoguri

#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

removeTabTabBar.activeTabId を付け替えるが VerifyTabManager.activeTabId は同期されない
(handleTabCloseswitchTabsidebar.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:67PoswMode から 'sampled' を削除
  • packages/verify/src/ui/ResultPanel.ts:611-612 — 分岐を削除
  • packages/verify/src/i18n/types.ts:125 + translations/{ja,en}.tsposwSampled キー削除

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    code-review2026-07 多角レビュー由来pkg:verifypackages/verify + verify-cliseverity:medium中程度の問題

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions