yoi/docs/report/test-validity-20260612/client.md

6.7 KiB

テスト妥当性レビュー: client

  • 評価: 概ね良い

確認範囲

  • crates/client/Cargo.toml と crate の全ソースファイルを確認した:
    • src/lib.rs
    • src/runtime_command.rs
    • src/spawn.rs
    • src/pod_client.rs
    • src/ticket_role.rs
  • runtime_commandspawnpod_clientticket_role の既存 unit tests を確認した。
  • crates/client/tests/ 配下に integration tests がないことを確認した。
  • ソースファイルや Tickets は変更していない。

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

  • runtime_command のカバレッジは焦点が絞られていて適切:
    • runtime executable には常に pod prefix が付与される;
    • YOI_POD_RUNTIME_COMMAND は executable path だけを置き換える;
    • 空の override は current_exe にフォールバックする。
  • spawn::runtime_args tests は重要な引数 invariants をカバーしている:
    • workspace、pod identity、profile が分離されたままである;
    • session restore mode では profile が省略される;
    • child cwd は CLI argument として渡されない;
    • ticket_role が存在する場合は明示的に渡される。
  • pod_client tests は mock だけでなく実際の Unix sockets を使っている:
    • client が生存している間に events を受信する;
    • Method JSON lines を送信する;
    • drop された clients は connections を速やかに閉じる;
    • blocked reader tasks は drop 時に abort される。
  • ticket_role は planning について広いカバレッジがある:
    • role config 欠落と backend-only config が拒否される;
    • inherit profile は top-level launches で拒否される;
    • 解決不能な profile selectors は spawn 前に失敗する;
    • concrete role config と scaffold config が launch plans を生成する;
    • 設定された workflow/profile/launch prompt refs が表面化される;
    • spawn config が pod name、profile、role、workspace root、cwd 境界を正しく保持する;
    • prompt override precedence がテストされている;
    • role-specific launch prompts が intake、orchestrator、coder、reviewer 向けの重要な運用ガイダンスを含む。
  • pre-run peer registration tests は、実際の PodClient framing path を通し、最初の Run 前の ordering を検証しているため有用。

ギャップ / 疑問のあるテスト

  • 最大のギャップは spawn_pod の readiness behavior。実際の subprocess launch path、stderr file polling、YOI-READY parsing、socket wait loop、early-exit handling、stderr tail collection、malformed ready line handling、timeout behavior はほとんど未テスト。現在の spawn tests は純粋な argument construction だけをカバーしている。
  • launch_ticket_role_pod_with_options は end-to-end の host-side launch flow としてテストされていない。planning と pre-run send tests に分解されているが、YOI-READY を出力し、socket を bind し、最初の Run を受け取り、acceptance evidence を返す fake runtime process がない。
  • wait_for_run_acceptance は重要な分岐が直接カバーされていない:
    • 一致する Event::UserMessage を受理する;
    • InvokeStart(UserSend) / TurnStart を受理する;
    • Event::Error で拒否する;
    • closed / timeout errors を返す;
    • unrelated events を安全に無視する。
  • Pre-run peer registration は success と explicit error のカバレッジがあるが、timeout、connection-closed、empty peer name、multiple peer registrations、response 前の unrelated-event cases が不足している。
  • Prompt tests は prompt resources から多数の exact substrings を assert している。prompt text は product contract の一部なのでこの一部は有益だが、大量の substring lists は脆く、無害な prompt wording edits が behavioral regressions に見える可能性がある。
  • Default pod-name generation と sanitization は、planning cases と caller-provided name 経由の間接テストを除き、直接テストされていない。whitespace ticket ids、punctuation-heavy ids、MAX_POD_NAME_CHARS への truncation、空の explicit pod names のような edge cases はカバーする価値がある。
  • PodClient tests は malformed JSON、EOF behavior、try_next_event、reader-channel backpressure をカバーしていない。これらは spawn/launch gaps より優先度は低いが、それでも crate の protocol boundary の一部である。
  • doc tests や integration tests はない。小さな client crate としては許容できるが、この crate の責務には process/socket orchestration が含まれるため、少なくとも 1 つの lightweight fake-runtime integration-style unit test があると信頼性が実質的に向上する。

追加提案

  • 小さな test executable または shell script を使って、spawn_pod 用の fake-runtime tests を追加する:
    • 通常の stderr progress lines を書く;
    • YOI-READY\t<pod>\t<socket> を出力する;
    • 短い delay の後に socket を bind する;
    • failure cases では早期終了する。
  • readiness parsing について焦点を絞った unit tests を追加する:
    • malformed ready line;
    • socket なしの ready line;
    • ready line 後、socket が connectable になる前に child が終了する;
    • stderr tail が bounded tail だけを保持し、最後に flush された lines を含む。
  • in-process Unix socket server を使って wait_for_run_acceptance 周辺の tests を追加する:
    • UserMessage exact segment match;
    • InvokeStart(UserSend) acceptance;
    • TurnStart acceptance;
    • Event::Error rejection;
    • connection close;
    • unrelated events がある timeout。
  • pre-run peer registration の edge-case tests を追加する:
    • empty peer name は warning を出し、それでも Run を送信する;
    • timeout warning でも Run を送信する;
    • closed connection warning または send error path;
    • multiple peers が ordering を保持する。
  • Pod identity stability は user-visible で runtime state paths に影響するため、default_pod_name / sanitization / truncation について小さな pure tests を追加する。
  • exact wording が意図的に stable contract として扱われている場合を除き、prompt resource ごとに小さめの semantic sentinel assertions を維持することで、prompt の脆さを減らすことを検討する。

実行したコマンド

cd /home/hare/Projects/yoi && cargo test -p client

結果: passed。29 unit tests が passed; doc-tests は 0 tests。このコマンドは 2 回実行され、どちらも passed。