From d6cfea463a2eea99570c989f6d6644f2e0665103 Mon Sep 17 00:00:00 2001 From: Hare Date: Wed, 13 May 2026 06:30:45 +0900 Subject: [PATCH] review: file-ref-directory --- tickets/file-ref-directory.md | 5 +++++ tickets/file-ref-directory.review.md | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tickets/file-ref-directory.review.md diff --git a/tickets/file-ref-directory.md b/tickets/file-ref-directory.md index cb1e68ab..995dfef4 100644 --- a/tickets/file-ref-directory.md +++ b/tickets/file-ref-directory.md @@ -62,3 +62,8 @@ submit 時に `Segment::FileRef` がディレクトリを指している場合 - `crates/tools/src/scoped_fs.rs` `read_bytes` - `tickets/file-ref-symlink-diagnostics.md` - `tickets/manifest-output-upload-limits.md` + +## Review +- 状態: Approve +- レビュー詳細: [./file-ref-directory.review.md](./file-ref-directory.review.md) +- 日付: 2026-05-12 diff --git a/tickets/file-ref-directory.review.md b/tickets/file-ref-directory.review.md new file mode 100644 index 00000000..e7c4b784 --- /dev/null +++ b/tickets/file-ref-directory.review.md @@ -0,0 +1,25 @@ +# Review: Submit 時 FileRef でディレクトリを参照したときの挙動 + +## 前提・要件の確認 +- 通常ディレクトリの FileRef が `IsDirectory` Warn で黙って捨てられないこと: 満たされています。`PodFsView::resolve_file_ref` が symlink を含まない通常ディレクトリを検出し、`[Dir: ]` system message に展開する経路へ分岐しています(`crates/pod/src/fs_view.rs:124-143`, `crates/pod/src/fs_view.rs:240-304`)。Pod 側の alert 文脈も `[File]` / `[Dir]` 両対応に更新されています(`crates/pod/src/pod.rs:1019-1044`)。 +- 採用する挙動の明確化: 満たされています。通常ディレクトリは浅い entry listing として `[Dir: ]` で返す仕様になっており、再帰走査やファイル本文集約には踏み込んでいません(`crates/pod/src/fs_view.rs:114-123`, `crates/pod/src/fs_view.rs:240-304`)。 +- listing 上限: 満たされています。entry 件数は TUI completion と同じ `COMPLETION_LIMIT` を `DIR_FILE_REF_ENTRY_LIMIT` として使い、本文 byte 数は既存の `file_upload.max_bytes` を使う設計です(`crates/pod/src/fs_view.rs:21-25`, `crates/pod/src/fs_view.rs:278-291`, `crates/manifest/src/lib.rs:228-239`)。 +- 隠しファイル・gitignore・scope 外 entry の扱い: 満たされています。hidden / gitignore は特別扱いせず、scope 上 readable な直下 entry のみを返します(`crates/pod/src/fs_view.rs:117-123`, `crates/pod/src/fs_view.rs:249-269`)。テストでも hidden / gitignore を含め、deny された entry を除外する挙動が確認されています(`crates/pod/src/fs_view.rs:456-514`)。 +- symlink entry / symlink directory との整合: 満たされています。解決対象パス自体に symlink が含まれる場合は従来の `ScopedFs::read_bytes` 経路に委ね、通常ディレクトリ listing 内の symlink entry は `@` 付きで表示しています(`crates/pod/src/fs_view.rs:132-146`, `crates/pod/src/fs_view.rs:263-265`, `crates/pod/src/fs_view.rs:549-563`)。 +- TUI completion とのギャップ解消: 満たされています。completion がディレクトリ候補を出す前提を維持し、submit 側でも通常ディレクトリを扱う方向に寄せています。TUI 側コメントもその仕様に更新されています(`crates/tui/src/input.rs:35-37`)。 +- `Segment::FileRef` のドキュメント / コメント更新: 満たされています。Protocol 上の `Segment::FileRef` と flatten の説明が `[Dir: ]` listing に追従しています(`crates/protocol/src/lib.rs:127-130`, `crates/protocol/src/lib.rs:154-159`)。 + +## アーキテクチャ・スコープ +- FileRef 解決は既存の `PodFsView` に集約されており、Pod 本体には alert 化と attachment 組み立て以上の責務を増やしていません。層の置き方は妥当です。 +- TUI completion の挙動変更ではなく、submit 側の意味論を completion に合わせる実装で、チケットの UX ギャップに対して最小限です。 +- directory listing は浅い直下列挙に留まり、範囲外の再帰走査・glob 展開・ファイル本文集約には踏み込んでいません。 +- `ScopedFs::read_bytes` の symlink 診断経路を温存しつつ、通常ディレクトリだけを新仕様にしているため、`file-ref-symlink-diagnostics` 側の関心と衝突していません。 + +## 判断 +Approve — チケットで求められた通常ディレクトリ FileRef の仕様化・実装・テスト・コメント更新が揃っており、Blocking 指摘はありません。 + +## 確認 +- `cargo fmt --check` +- `cargo test -p pod` +- `cargo test -p pod fs_view::tests::resolve_file_ref -- --nocapture` +- `cargo test -p tui input::tests -- --nocapture`