yoi/docs/report/test-validity-20260612/session-analytics.md

5.5 KiB

テスト妥当性レビュー: session-analytics

  • 評価: 概ね良い

確認した範囲

  • 対象 crate: crates/session-analytics
  • 実装: crates/session-analytics/src/lib.rs
  • crate 内のテストは src/lib.rs の inline unit tests のみ。
  • crates/yoi/src/session_cli.rs も参照し、session-analyticsyoi session analyze ... --json から呼ばれる境界を確認した。
  • ソースファイル・Ticket は変更していない。

現在のテストがよくカバーしていること

  • read-only な session JSONL analyzer としての主要な集計軸はかなり押さえられている。
    • repeated Read と intervening Edit の相関。
    • large Edit argument、replace_all、path 別 edit stats。
    • failed tool result count と turn ごとの tool call count。
    • large/truncated tool result の検出と、raw tool output を report JSON に混ぜないことの基本確認。
    • compaction/context lifecycle 後の repeated read を「correlation only」として扱う方針。
    • malformed JSONL / unknown entry の tolerant parsing。
    • Bash による file inspection の observation。
    • assistant response 単位の tool batching metrics。
    • same-file multi-edit、edit-only streak、Read/Bash/test interleave を含む edit round-trip metrics。
    • edits がない session の empty metrics。
  • fixture は小さく、各テストの意図が読みやすい。crate の責務である「実 session log を直接型依存せず、serde_json::Value で寛容に読む」性質にも合っている。
  • privacy/safety 重要点である「raw content を出さない」方向は、少なくとも large result について回帰テストがある。
  • cargo test -p session-analytics は全 12 unit tests と doc-tests が成功した。

不足 / 疑問のあるテスト

  • 実 session JSONL に近い golden/contract fixture がない。現在の tests はすべて手作り最小 fixture なので、実ログ形式の変化、複数 kind の混在、長い session の代表ケースに対する report schema の安定性は十分には保証していない。
  • JSON report が CLI-facing な機械可読出力である割に、serialize 後の schema/field contract をまとめて確認する snapshot/golden test がない。
  • privacy invariant は一部のみ。raw user input、tool arguments の old_string / new_string / content、tool result content に sentinel を入れて、serialized report 全体に出ないことを横断的に確認するテストが欲しい。
  • tolerant parsing の edge cases が薄い。
    • invalid arguments JSON。
    • missing tool_call.name
    • Read / Edit / Write の path 欠落。
    • segment_start.history に seeded tool calls が入る場合。
    • top-level/synthetic response boundary diagnostic。
    • empty file / nonexistent file error。
  • response batching の境界条件が不足している。
    • message/reasoning-only assistant_item
    • assistant response が non-assistant_item で閉じられるケース。
    • 複数 response にまたがる percentile/distribution。
    • top_tool_call_responses の sort/truncate。
  • tool classification / observation 系の coverage が偏っている。
    • counts_by_kind は total の間接確認程度で、pod/memory/ticket/task/web/other 分類は未確認。
    • Write stats、large Write.contentpath alias、large Read.limit、large Grep.head_limit は未確認。
  • diagnostic bounding はテスト名に “bounded” とあるが、実際には 3 件の diagnostic を見るだけで、MAX_DIAGNOSTICS で打ち止めになることは検証していない。
  • 一部の assertion は observation 文言の substring に依存している。policy 表現を守る意図なら妥当だが、単なる説明文変更で壊れやすい。可能なら stable な kind や boolean/metric を主に検証し、文言は最小限にした方がよい。

追加を提案するテスト

  • 実ログに近い小さな golden fixture を tests/fixtures 相当で持ち、serialized JSON report の主要 schema と代表値を固定する。
  • sentinel privacy test を追加する。
    • user_input の本文。
    • Edit.old_string / Edit.new_string
    • Write.content
    • tool_result.content
    • これらが serialized SessionReport に含まれないことを一括確認する。
  • tolerant parsing/error-path tests を追加する。
    • invalid tool arguments JSON。
    • missing fields。
    • nonexistent input path。
    • empty JSONL file。
    • MAX_DIAGNOSTICS + n 件の malformed entries。
  • response boundary tests を追加する。
    • segment_start.history seeded calls が tool usage には数えられるが response batching からは除外され、diagnostic/observation が出ること。
    • assistant message-only response と mixed message/tool calls。
    • multiple responses distribution と top-response ordering/truncation。
  • less-covered metric tests を追加する。
    • Write stats と large content。
    • path vs file_path
    • large Read と large Grep
    • pod/memory/ticket/task/web/other に対する counts_by_kind
    • threshold boundary: >= LARGE_* と just-below cases。

実行したコマンド

  • cd /home/hare/Projects/yoi && cargo test -p session-analytics
    • 結果: 成功。12 unit tests passed, doc-tests 0 passed.
  • cd /home/hare/Projects/yoi && cargo test -p session-analytics -- --nocapture
    • 結果: 成功。12 unit tests passed, doc-tests 0 passed.