Skip to content

fix(verify): fast モードで PoSW 未検証を明示し整合性を proven にしない - #253

Merged
shinyaoguri merged 2 commits into
mainfrom
fix/fast-mode-posw-overclaim
Aug 5, 2026
Merged

fix(verify): fast モードで PoSW 未検証を明示し整合性を proven にしない#253
shinyaoguri merged 2 commits into
mainfrom
fix/fast-mode-posw-overclaim

Conversation

@shinyaoguri

Copy link
Copy Markdown
Owner

目的

fast モードは PoSW の反復再計算をスキップする (docs/system-spec.md §8.2) が、verify (web) も verify-cli も 決定的保証を意味する語彙で結果を出していた。

  • web: TrustCalculator.calculateposwMode を見ないため issue 0 件 → 「検証成功」。deriveAssurance の入力にも PoSW 情報が無いため 整合性: 証明済み
  • CLI: PoSW 行に SKIPPED (fast mode) は出るが、ヘッダは ✓ Verification PASSED / Integrity: PROVEN

verify の ActivityBar のモードトグルは fast → audit → full を巡回するため、採点者が fast のまま複数の提出物を流すと**全件が「検証成功・整合性: 証明済み」**になる。実際に保証されているのは「申告 PoSW 値が proof 全体とハッシュ的に一貫していること」までで、「実際に 10,000 回反復したか」は未検証。

Closes #214

変更点

shared (assurance.ts)

  • IntegrityLevelpartial を追加 ('proven' | 'partial' | 'failed')。「実施していない検査がある」の意で、改ざんの疑い (failed) とは別
  • AssuranceInputposwSkipped: boolean を追加。optional にしていない — 渡し忘れが「未検証なのに proven」= overclaim に倒れるため (検証側は常に自分のモードを知っており「不明」という状態は存在しない)
  • 導出は failed > partial > proven の順。改ざん検出は fast でも成立するので failed が優先。temporal / provenance の意味は一切変えていない

verify (web)

  • buildAssuranceInputposwSkipped (= poswMode === 'skipped') を渡す
  • TrustCalculatorposwwarning issue (既に用意されていた getComponentLabelposw ラベルを活用)
  • VerificationController.handleComplete のタブ status も warning 軸に合流 (ここを揃えないと「タブは緑なのにバッジは警告」になり fast のまま流した提出物が全件緑で素通りする)
  • 整合性チップを warning 色 + 専用の説明ツールチップで表示

verify-cli

  • 合否ヘッダ直下に ! fast mode: PoSW was NOT recomputed — sequential work is unverified を追加
  • --- Assurance --- の Integrity を PARTIAL (黄) + 2 行の説明

不変に保ったもの

  • verifyProofFilevalid 判定・exit code・proof フォーマットは変更なし。fast は「速い改ざん検出」という正当な用途を持つので fail させない
  • 分析層 (ADR-0023) の直交性

docs / i18n

  • docs/system-spec.md §8.2 に表示規約を追記 + 変更履歴に 1 行
  • i18n は ja / en + types.ts を同時更新 (trust.issuePoswSkipped / assurance.integrityPartial / assurance.integrityPartialHint)

確認方法

先に失敗する再現テストを書き、赤を確認してから修正しています。

  • packages/shared/src/__tests__/assurance.test.ts: fast 相当入力で partial / 改ざん時は failed 優先 / full は proven / temporal・provenance 不変
  • packages/verify/src/services/__tests__/TrustCalculator.test.ts: fast で posw warning + level partial、full では issue なし
  • packages/verify/src/ui/__tests__/ResultPanel.test.ts: 整合性チップが success ではなく warning
  • packages/verify-cli/src/__tests__/output.test.ts (新規): ヘッダ注記 / Integrity: PARTIAL / full は PROVEN のまま / 実失敗時は FAILED
  • packages/verify/src/services/__tests__/webCliParity.test.ts: fast / full の観点を追加。既存ケースは fast 経路なので期待値を更新し、新ケースは実 PoSW を計算する Worker スタブで「fast は partial・full は proven」を web↔CLI 両経路で突き合わせる

ミューテーション確認 (一時的に実装を壊して赤を確認):

  • deriveAssurancepartial 分岐を戻す → パリティ 3 件が赤
  • CLI 側だけ poswSkipped: false 固定にする → パリティ 9 件が赤 (片側だけ直すと落ちる)

ローカルで全て green:

npm ci
npm run lint          # Found 60 warnings (main と同数・error 0)
npm run typecheck
npm run test:run --workspaces --if-present   # 728 passed / 3 skipped
npm run build

補足 (レビュー観点)

ADR-0020 は整合性を「二値 (proven/failed)」と記述しているため、partial の追加で ADR と実装がずれます。ADR は append-only 運用のため本 PR では書き換えず、追補 ADR を切るかどうかは別途判断をお願いします (spec §8.2 と変更履歴には反映済み)。

🤖 Generated with Claude Code

`fast` モードは PoSW の反復再計算をスキップする (spec §8.2) のに、web も CLI も
決定的保証の語彙 (「検証成功 / 整合性: 証明済み」「Verification PASSED /
Integrity: PROVEN」) で結果を出していた。採点者が fast のまま複数の提出物を流すと
全件が「証明済み」に見える overclaim になる。

- shared: `IntegrityLevel` に `partial` を追加し、`AssuranceInput.poswSkipped`
  (必須。optional にすると渡し忘れが overclaim に倒れる) から fast を proven に
  上げないよう `deriveAssurance` を変更。temporal / provenance の意味は不変
- verify (web): 整合性チップを warning 表示 (専用の説明ツールチップ)、
  `TrustCalculator` に `posw` の warning issue、タブ status も警告に揃える
- verify-cli: 合否ヘッダ直下と `--- Assurance ---` に PoSW 未再計算を明記
- 判定 (`verifyProofFile` の valid / exit code) と proof フォーマットは不変。
  fast は「速い改ざん検出」という正当な用途を持つため fail させない
- web↔CLI の一致は `webCliParity.test.ts` に fast / full の観点を追加して固定

Closes #214

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation pkg:shared packages/shared pkg:verify packages/verify + verify-cli pkg:repo リポジトリ横断 (docs/CI/依存) labels Aug 5, 2026
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🚀 Preview Deployment

Name URL
Preview https://96de97d5.typedcode.pages.dev

Deployed from commit 708325a
API: staging Workers

ADR-0020 は整合性を「決定的・二値 (proven/failed)」と定義していたが、これは
「検証器は常に全レイヤを実行する」という暗黙の前提に立っていた。実際には fast
モードが PoSW の反復再計算を省略するため、二値のままでは overclaim (省略した
のに proven) か誤った改ざん告発 (failed) のどちらかになる。

省略した検査があるときは proven に上げない、という規則を ADR-0031 として残し、
ADR-0020 の Status に参照を付けた (原典を読んだ人が古い値域を信じないため)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@shinyaoguri
shinyaoguri merged commit cb261f0 into main Aug 5, 2026
7 checks passed
@shinyaoguri
shinyaoguri deleted the fix/fast-mode-posw-overclaim branch August 5, 2026 03:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation pkg:repo リポジトリ横断 (docs/CI/依存) pkg:shared packages/shared pkg:verify packages/verify + verify-cli

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[verify/verify-cli] fast モードで PoSW 未実施なのに「整合性: 証明済み」と表示される (overclaim)

1 participant