fix(shared): VALID_EVENT_TYPES を型から導出し isPureTyping 判定を一本化する (#222 #235) - #264
Merged
Merged
Conversation
#222: VALID_EVENT_TYPES が 26 種の手書き Set で、EventType union の 29 種から 取り残されていた (environmentProbe / fullscreenChange / examOpened が欠落。 いずれも editor から実際に発火する)。手書きをやめ Record<EventType, true> の キーから導出することで、以後 union に型を足すと tsc が記入漏れを検出する。 VALID_INPUT_TYPES は差分ゼロだったが、同じ drift を将来止めるため同じ型導出に 揃えた。validateEventType の検証経路への配線は行わない (未知イベント型を fail-closed で弾く判断は後方互換の議論が要る。#223 と同じ論点)。 #235: isPureTyping に 3 つの別々の式があり、export 時の自己申告だけが benign 除外なしの bulkInsertEvents === 0 だった。Monaco の括弧自動閉じ (既定 on) で "(" を 1 つ打つだけで自己申告が false に落ち、採点側の true と食い違う値が proof に焼かれていた。判定を structuralEdit の evaluatePureTyping に集約し、 verifyProofMetadata と TypingProof の双方がこれを呼ぶ。副次的に、export 側で 素通しだった複数行の一括投入 (insertParagraph) も申告に反映されるようになる。 後方互換: metadata.isPureTyping は typingProofData に含まれず typingProofHash の入力ではないため、値が変わっても既存 proof のハッシュ照合に影響しない。 metadata.bulkInsertEvents は isSuspiciousBulkInsert の素のカウントのままで、 verifyProofMetadata の完全一致検査も不変。webCliParity は 12 件 green。 Closes #222 Closes #235 Assisted-by: Claude <noreply@anthropic.com>
🚀 Preview Deployment
Deployed from commit 1231213 |
33 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
目的
2026-08 レビュー (#243) の残件のうち shared の 2 件。どちらも「同じことを決める式が複数箇所にあり、片方が取り残される」という同型の問題なので、文書ルールではなく機械 (tsc / 単一関数) で同期を強制する形に直す。
#222 — VALID_EVENT_TYPES が union から取り残されていた
InputTypeValidator.tsの手書き Set は 26 種、types/events.tsのEventTypeunion は 29 種。機械差分の結果、欠落は次の 3 種ちょうど・余分は 0 種で、いずれも editor から実際に発火する:environmentProbetracking/EnvironmentTracker.ts:63fullscreenChangetracking/FullscreenTracker.ts:143examOpenedui/tabs/TabManager.ts:362手書きをやめ
Record<EventType, true>のキーから導出した。以後 union に型を足すと tsc が Set 側の記入漏れを検出するのが本質で、欠落 3 種が埋まるのは副産物。VALID_INPUT_TYPESは差分ゼロだったが、同じ drift を将来止めるため同じ形に揃えた。現時点の実害はゼロであることの確認
validateEventTypeはどの検証経路にも配線されていません (定義と re-export のみ)。本 PR でも配線しません — 未知イベント型を持つ将来 proof を fail-closed で弾く判断には後方互換の議論が要り、#223 と同じ論点になるためです。危険なのは「#246 で構造検証の置き場ができたので、誰かが何気なく配線した瞬間に exam proof が全滅する」という時限性で、そこは本 PR で解消されます。#235 — isPureTyping の判定が 3 箇所にあった
verification.tsrecomputeProofMetadata(採点側の正)TypingProof.ts:822(export 時の自己申告)bulkInsertEvents === 0TypingProof.ts:867付近 (自己検証)metadata.bulkInsertEvents === 0Monaco の括弧自動閉じは既定 on (
monaco.editor.createはautoClosingBracketsを指定しておらず'languageDefined') なので、(を 1 つ打つだけで自己申告が false に落ち、採点側の true と食い違う値が proof に焼かれていた。structuralEdit.tsにevaluatePureTyping(events)を新設し、SessionProvenanceLedgerの replay とisSuspiciousBulkInsert/isBenignEditorInsert/isFlaggedBulkInsert/isDivergentContentSnapshotの組み合わせをこの関数だけが持つ状態にした。recomputeProofMetadataとTypingProofの双方がこれを呼ぶ。副次的な効果: export 側は逆に緩すぎた面もあり、複数行の一括投入 (Monaco が
insertParagraphで記録するためisSuspiciousBulkInsertに載らない) が申告に反映されていなかった。一本化でこちらも塞がる。TypingProof.ts:867の扱い呼び出し元を全パッケージで grep したところ このメソッドは未使用で、引数は
proofDataのみ・events を入手する経路がありません (任意の proof を受ける API なのでthis.eventsを代用するのは不正)。そのため寄せず、JSDoc に「3 つ目の定義ではない。events が無いためメタデータのみの粗い自己チェックで、採点側とは一致しない (こちらの方が厳しく false に倒れる)。判定値はverifyProofMetadataから取ること」を明記した。後方互換
metadata.isPureTypingはtypingProofDataに含まれずtypingProofHashの入力ではない (types/proof.tsの 154-177 行 vs 245-249 行で確認) → 値が変わっても既存 proof のハッシュ照合に影響しないmetadata.bulkInsertEventsはisSuspiciousBulkInsertの素のカウントのまま。verifyProofMetadataの完全一致検査は不変 (ここを変えると既存 proof が invalid になる)isSuspiciousBulkInsert本体も未変更確認方法
テストを先に書き、実装前に赤くなることを実測してから仕上げた。
isPureTypingtrueexpected false to be trueexpected true to be falseevaluatePureTypingとrecomputeProofMetadataの結論一致expected true to be falseVALID_EVENT_TYPESが union と同集合environmentProbe: expected false to be true修正前から緑だったケース (input types 側) は、
INPUT_TYPE_MEMBERSから要素を削る / union 外の値を混ぜる、を実際に試して赤くなることを確認済み。すべて green。shared は 475 passed (修正前 468 + 新規 7)。
webCliParity.test.tsは 12 件 green のまま — ここが赤くなったら判定の一本化に失敗しているという意味で、本 PR の一番重要なゲート。packages/shared/CLAUDE.mdに不変条件 8 (isPureTypingの判定点は 1 つ) を追記し、型導出で不要になった手動同期の記述を更新した。Closes #222
Closes #235