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

80 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# テスト妥当性レビュー: manifest
- 評価: 概ね良い
## 確認範囲
- Workspace root: `/home/hare/Projects/yoi`
- Crate/package: `manifest`
- 読み取り専用のレビューのみを行い、ソースファイルと Ticket は変更していない。
- 主な責務を以下で確認した:
- `crates/manifest/src/lib.rs`
- `crates/manifest/src/config.rs`
- `crates/manifest/src/scope.rs`
- `crates/manifest/src/profile.rs`
- `crates/manifest/src/paths.rs`
- `crates/manifest/src/model.rs`
- `crates/manifest/src/defaults.rs`
- `cargo test -p manifest` を実行: passed、`129 passed; 0 failed`。
## 現在のテストがよくカバーしていること
- この crate には、中核責務である manifest/profile 設定の parse、merge、validate、resolve に対する強い unit-test suite がある。
- `config.rs` のテストは、多くの重要な manifest invariant をカバーしている:
- 最小限の TOML parse と defaulting;
- model/tool/web/memory/compaction/reasoning fields;
- TOML type mismatch を hard error として扱うこと;
- partial config cascade と upper-layer override behavior;
- deprecated/removed fields が reject されること;
- authority-bearing fields における invalid relative paths;
- feature-flag behavior、特に shell/file/web/memory/tool areas の無効化;
- prompt/resources/workflow directories と generated memory settings。
- `scope.rs` のテストは、セキュリティ上もっとも重要な path permission behavior をカバーしている:
- recursive grants と non-recursive grants;
- read/write permission matching;
- deny entries が grants を override すること;
- path traversal rejection;
- canonicalization/relative-path normalization;
- delegation subset checks;
- shared-scope add/remove/clear operations。
- `profile.rs` は、Lua profile behavior について特に広いカバレッジを持つ:
- 意図された `yoi.profile` API 経由の profile registration;
- legacy/global APIs の明示的な rejection;
- builtin role profile defaults と tool-policy boundaries;
- workspace/profile override precedence;
- `extend`、helper APIs、TOML loading、model catalog access、Lua module loading;
- multiple-profile discovery、selector handling、ambiguity、exact/unique match behavior。
- `paths.rs` のテストは、pure resolver functions によって XDG/Yoi directory precedence rules をカバーしており、global environment races を避けている。
- いくつかのテストは、単なる実装機構ではなく、重要な product decisions を regression checks として符号化している。manifest/profile semantics は durable contract なので、この crate ではそれが適切である。
## 不足 / 疑問のあるテスト
- カバレッジはほぼすべて in-module unit tests である。これは概ね適切だが、downstream crates や CLI startup の観点からの integration-style coverage は少ない。変更によってこれらの local unit tests は維持されても、`yoi`、`pod`、または profile loading が manifest API を compose する方法が壊れる可能性がある。
- Path-scope security tests は良いが、adversarial filesystem boundaries に対してはまだ網羅的ではない。workspace 内の symlink が外を指すケース、workspace 外の symlink が中を指すケース、または canonicalized symlink paths を通じた mixed deny/grant interactions に対する専用テストは見当たらなかった。この crate の authority role を考えると、これが主な残リスクである。
- Delegation subset tests は基本的な matrix をカバーしているが、より明示的な negative cases があるとよい:
- read-only grant は write delegation を満たしてはならない;
- non-recursive parent grant は child delegation を満たしてはならない;
- deny entries は direct access を制約するのと同じように delegation を制約するべきである;
- 同一 path 上の mixed read/write grants は order-independent のままであるべきである。
- 一部の default/builtin profile tests は snapshot-like で、詳細な role policy を assert している。これらは価値があるが、builtin role contracts が意図的に進化すると脆くなりうる。この脆さは、これらを policy-contract tests として扱うなら許容できる。そうでなければ、“must never regress” invariants と “current default snapshot” fixtures に分けるべきである。
- Model/auth schema coverage は manifest/profile coverage より薄い。`ModelManifest::merge` と `AuthRef` variants は単純だが、`codex_oauth`、`secret_ref`、context-window/max-context-window precedence の round-trip tests を追加すると regression risk を下げられる。
- Compact-ratio behavior には known model context lookup を含む positive coverage があるが、以下についてより明確な negative tests があるべきである:
- model context がなく、unknown model ref である場合の ratio;
- `context_window``max_context_window` より明示的に大きい場合;
- それらを reject する意図があるなら、invalid/edge ratios。
- Public path helpers は、exported environment-reading functions ではなく pure resolver helpers を通じてテストされている。これは determinism のためには良いが、ごく小さな serial/env-scoped smoke test があれば public functions の配線ミスを検出できる。
- README/doctest coverage は実質的に存在しないdoctests は `running 0 tests`)。これは config crate にとって大きな問題ではないが、README examples が public contract の一部になるなら、実行可能にするか、テストでミラーするべきである。
## 追加を提案するもの
- private helpers だけをテストするのではなく、public API 経由で代表的な manifest/profile fixtures を load する小さな integration test を `crates/manifest/tests/` 配下に追加する。
- `Scope` に symlink boundary tests を追加する:
- allowed root 内の symlink が外を指す場合は deny されるべきである;
- 外側の symlink が内側を指す場合は canonical target policy に従って振る舞うべきである;
- symlink を含む deny paths は、normalization/canonicalization 後も grants を override するべきである。
- permission、recursion、deny、path ancestry の組み合わせをカバーする delegation matrix test table を追加する。
- サポートされているすべての auth variants と context-window precedence について model/auth round-trip tests を追加する。
- missing/unknown context と invalid edge values 周辺の negative compact-ratio tests を追加する。
- snapshot-like builtin profile tests を policy-contract tests としてラベル付けするか、期待値を compact fixtures に移して、意図的な role-policy changes をレビューしやすくすることを検討する。
## 実行したコマンド
- `cargo test -p manifest`
- Result: passed
- Summary: `129 passed; 0 failed; 0 ignored; finished in 0.00s`