Skip to content

feat(computer-use): #500 S5-c-2 PR-3 Explorer の実ファイル名をフォルダのパスと前方一致の列挙で取る - #818

Merged
yusei531642 merged 8 commits into
mainfrom
feat/500-s5c2-3-explorer-enum
Oct 17, 2026
Merged

yusei531642 merged 8 commits into
mainfrom
feat/500-s5c2-3-explorer-enum

Conversation

@yusei531642

Copy link
Copy Markdown
Collaborator

概要

#500 S5-c-2 の PR-3 です。Explorer の項目の実ファイル名を、フォルダのパスを 1 回だけ取り、自分のプロセスで前方一致の列挙をして照合する方式に変えます。

#777 の実測では、旧方式が全項目を走査して名前が一意かを確かめていたため、項目が約 100 を超えるフォルダでは内側の予算 60 ms を超えていました。その結果、そうしたフォルダでは常に「判定なし」になり、E1 が効きませんでした。拒否はまだ有効にしていません(PR-5 で有効にします)。

変更

  • 新規 computer_use_windows_shell_name_match.h(portable)
    • MatchShellDisplayName(display, candidates, extensions_shown, equals) を置きました。
    • 候補は、次の 2 つの和集合です。
      • 名前が表示名と完全一致するもの
      • 「表示名 + . + 拡張子 1 つ」のうち、Explorer が隠しうるもの。拡張子を隠す設定ではどの拡張子でも候補にし、表示する設定では lnk / url / pif / scf / shb / appref-ms / library-ms だけを候補にします。
    • 候補が 1 件ならその実パスを返します。次の場合は判定なしです。
      • 0 件
      • 2 件以上
      • 候補が 64 件を超える
      • 表示名にワイルドカードや区切りが入っている
    • 比較は大文字小文字を区別しない序数比較です(host は CompareStringOrdinal)。長い名前で比べるので、8.3 名だけで一致したものは外れます。
  • computer_use_windows_uia_source.h の ShellItemPathByName
    • フォルダのパスを 1 回だけ取ります(SHGetIDListFromObject と SHGetPathFromIDListEx)。検索、ライブラリ、PC など、ファイルシステムでない場所は kAbsent です。
    • 同じ lookup のスレッドで、FindFirstFileExW(folder\display*, FindExInfoBasic, FIND_FIRST_EX_LARGE_FETCH) を呼びます。項目ごとに still_valid と期限を確かめます。
    • 拡張子を表示するかどうかは SSF_SHOWEXTENSIONS で読みます。フォルダかどうかは FILE_ATTRIBUTE_DIRECTORY で判断します。
    • IFolderView2::Item の走査と kShellLookupMaxItems は廃止しました。
    • 150 ms の待ち、PR-1 の枠の引数、「実パスの無いファイル項目は kIncomplete」という規則は変えていません。
  • harness: CheckWindowsShellNameMatch を足しました。
  • source 契約: 新しい列挙に合わせて更新しました。
  • ADR: PR-3 の段落を足しました。

検証

  • harness は全件 PASS です。照合関数は変異で RED になることを確かめました。
    • 表示する設定で、語幹も許す変異
    • 2 件で曖昧にしない変異
    • 上限を外す変異
  • vitest(computer-use-windows と computer-use-native)は 313 件が通りました。tsc と prettier も通り、host.cc は警告なくビルドできました。
  • 実機(拡張子を表示する設定)で測りました。自作の一時フォルダを、Explorer の新しい窓で開いて試しています。
項目数 実パス 1 回の時間(平均)
4 取れた 9.2 ms(初回は最大 31 ms)
120 取れた 3.6 ms
500 取れた 4.1 ms
5,000 取れた 5.8 ms(最大 16 ms)

留意点

  • 拡張子を隠す設定と、同じ名前の .lnk は、実機では試していません(開発機の設定を変えないため)。harness の表で確かめています。
  • UNC や遅いフォルダでの時間は、実機では測っていません。
  • パスが MAX_PATH 以上のフォルダは、判定なしになります。

Refs #500

🤖 Generated with Claude Code

ShellItemPathByName は view の項目の走査をやめ、フォルダのパスを 1 回取り、自分のプロセスの
FindFirstFileExW(表示名*) で候補を集め、portable の MatchShellDisplayName で実パスを決める
(隠れる拡張子・.lnk の衝突・8.3 名・同名は判定なし)。動作不変。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sprintreviewer

sprintreviewer Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

🗺️ PR Walkthrough

Note

Explorer の表示名から実ファイル名を特定する処理を、フォルダを一度列挙して候補だけを照合する方式に変更。リンク先や desktop.ini の影響を確認し、安全性や期限を判断できない場合は判定なしにします。

Changed files (6)
File Summary
apps/desktop/computer-use-native/computer_use_windows_shell_name_match.h 候補の絞り込み、表示名の一致判定、desktop.ini とリンク先の安全性に関する判定関数を追加。
apps/desktop/computer-use-native/computer_use_windows_uia_source.h フォルダのパスを取得して一度列挙し、候補の表示名を照合。ローカルフォルダや候補の安全性、期限を確認します。
apps/desktop/computer-use-native/computer_use_windows_shadow_reader.h Explorer の項目ビュー内にある ListItem のみ実パスを照会するよう変更。
apps/desktop/computer-use-native/computer_use_protocol_fuzz.cc 照合、リンク、desktop.ini、項目ビューの条件に関する harness ケースを追加。
apps/desktop/src/main/computer-use-windows-shadow-reader.test.ts Windows shadow reader のテストを更新。
tasks/designs/adr-computer-use-agent-driven-v2.md PR-3 の設計判断を ADR に追記。

Reviewed by vibe-editor-reviewer — head fa9f4a6

@sprintreviewer sprintreviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧭 Code review

Warning

3 actionable finding(s) — review recommended

Critical Warning Nitpick Info
🔴 0 🟡 3 💬 0 💡 0

確認内容

  • ✅ 変更箇所と関連するコード経路を確認
  • ✅ 独立した差分レビュー(Claude)を確認
  • ✅ リードが指定した重点ファイルの精査(Claude)を確認

レビュー所感

固定 HEAD を確認し、表示名照合、取消し・期限、実パスが分類へ渡る経路を静的に追跡しました。Explorer のローカライズされた表示名とフォルダの拡張子処理に、従来取得できた実パスを失う回帰があります。実行検証は行っていません。

🔍 Verification: 全 3 件の指摘を検証パス(gpt-6.1-sol / high)でクロスチェック済み(コード引用を固定base/headと照合) — 0 件を反証・重複確認により除外


Reviewed by vibe-editor-reviewer — head c302e98

Review coverage & tooling
  • Files: 5 reviewed (+349 / -63)
  • Full file bodies included: 0 / 5
  • Reviewer roles: numeric_consistency (deterministic), codex_deep (gpt-6.1-sol), claude_peer (claude-opus-5-5, fixed-diff only, partial), claude_specialist (claude-opus-5-5, fixed-diff only, partial)
  • Verification: 全 3 件の指摘を検証パス(gpt-6.1-sol / high)でクロスチェック済み(コード引用を固定base/headと照合) — 0 件を反証・重複確認により除外

Comment thread apps/desktop/computer-use-native/computer_use_windows_uia_source.h Outdated
Comment thread apps/desktop/computer-use-native/computer_use_windows_shell_name_match.h Outdated
Comment thread apps/desktop/computer-use-native/computer_use_windows_shell_name_match.h Outdated
…・取消し可能な lookup)

- 照合を規則から、候補ごとにシェルが出す表示名の比較へ(拡張子・ローカライズ・フォルダ名のドット)
- 入口で外す: 空の ID リスト、ISSLOW、UNC/リモート/光学ドライブ、Desktop/PublicDesktop、[LocalizedFileNames] のある desktop.ini
- フォルダを 1 回列挙し、前方一致と読み取り専用/system ディレクトリだけシェル名を取る
- 待ち切れの lookup に放棄と CancelSynchronousIo を送る

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@sprintreviewer sprintreviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧭 Code review

Warning

1 actionable finding(s) — review recommended

Critical Warning Nitpick Info
🔴 0 🟡 1 💬 0 💡 0

確認内容

  • ✅ 変更箇所と関連するコード経路を確認
  • ✅ 独立した差分レビュー(Claude)を確認
  • ✅ リードが指定した重点ファイルの精査(Claude)を確認

レビュー所感

固定 HEAD を確認し、表示名照合、呼び出し元の分類処理、取消しと単一実行枠の寿命を確認しました。放棄済みの lookup が新しい同期 I/O を開始し、後続の lookup を止める経路があるため修正が必要です。実行検証は行っていません。

🔍 Verification: 全 1 件の指摘を検証パス(gpt-6.1-sol / high)でクロスチェック済み(コード引用を固定base/headと照合) — 0 件を反証・重複確認により除外


Reviewed by vibe-editor-reviewer — head b0ce45c

Review coverage & tooling
  • Files: 5 reviewed (+586 / -66)
  • Full file bodies included: 0 / 5
  • Reviewer roles: numeric_consistency (deterministic), codex_deep (gpt-6.1-sol), claude_peer (claude-opus-5-5, fixed-diff only, partial), claude_specialist (claude-opus-5-5, fixed-diff only, partial)
  • Verification: 全 1 件の指摘を検証パス(gpt-6.1-sol / high)でクロスチェック済み(コード引用を固定base/headと照合) — 0 件を反証・重複確認により除外

Comment thread apps/desktop/computer-use-native/computer_use_windows_uia_source.h
yusei531642 and others added 2 commits October 17, 2026 01:51
…の停止確認・リンク/ボリューム判定・純粋関数化)

- 解決先は SIGDN_FILESYSPATH の末尾が候補名と一致するときだけ採る(末尾ドット/空白は採らない)
- ListItem が SHELLDLL_DefView / UIItemsView の中にあるときだけ shell に尋ねる
- 新しい I/O の直前ごとに取消しと期限を確認、KF_FLAG_DONT_VERIFY、GetVolumePathNameW と symlink/mount point の除外
- lookup スレッドを try/catch と RAII で包む
- 候補の選び方・desktop.ini 判定・解決名の判定を portable の純粋関数にして harness で固定

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rer-enum

# Conflicts:
#	apps/desktop/computer-use-native/computer_use_protocol_fuzz.cc

@sprintreviewer sprintreviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧭 Code review

Warning

2 actionable finding(s) — review recommended

Critical Warning Nitpick Info
🔴 0 🟡 2 💬 0 💡 0

確認内容

  • ✅ 変更箇所と関連するコード経路を確認
  • ✅ 独立した差分レビュー(Claude)を確認
  • ✅ リードが指定した重点ファイルの精査(Claude)を確認

レビュー所感

指定 HEAD を確認し、表示名照合、実パス取得、取消しとスレッド終了処理を静的に追跡しました。desktop.ini の読み取りには、ローカル限定の検査を迂回してネットワークへアクセスできる経路があり、修正が必要です。実行検証は行っていません。

🔍 Verification: 全 1 件の指摘を検証パス(gpt-6.1-sol / high)でクロスチェック済み(コード引用を固定base/headと照合) — 0 件を反証・重複確認により除外

⏳ 過去のレビューで指摘済み・未解決のスレッド 1 件(🟡 1)が open のままです。対応済みであればスレッドを resolve してください(verdict に反映されます)。


Reviewed by vibe-editor-reviewer — head c11f156

Review coverage & tooling
  • Files: 6 reviewed (+938 / -91)
  • Full file bodies included: 0 / 6
  • Reviewer roles: numeric_consistency (deterministic), codex_deep (gpt-6.1-sol), claude_peer (claude-opus-5-5, fixed-diff only, partial), claude_specialist (claude-opus-5-5, fixed-diff only, partial)
  • Verification: 全 1 件の指摘を検証パス(gpt-6.1-sol / high)でクロスチェック済み(コード引用を固定base/headと照合) — 0 件を反証・重複確認により除外

Comment thread apps/desktop/computer-use-native/computer_use_windows_uia_source.h Outdated
…扱い・I/O 前の停止確認・ドライブ判定の 2 段階化)

- desktop.ini は読み取り専用/system のフォルダでだけ読み、desktop.ini 自体が reparse point なら読まずに「あり」とする
- symlink / mount point の候補は表示名を取らず unknown にする
- GetDriveTypeW(先頭 3 文字) を I/O なしで先に判定し、その後に GetVolumePathNameW
- ShellFolderMayBeListed / ShellPathHasLink / desktop.ini の各 I/O の前に取消しと期限を確認
- 候補上限・TOCTOU・マウントルートのコメント、列挙ループを ShellLookupMustStop に統一

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@sprintreviewer sprintreviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Code review

Tip

LGTM — actionable issues were not found.

確認内容

  • ✅ 変更箇所と関連するコード経路を確認
  • ✅ 独立した差分レビュー(Claude)を確認
  • ✅ リードが指定した重点ファイルの精査(Claude)を確認

レビュー所感

固定 HEAD の一致を確認し、表示名から実パスへの照合、リンク・desktop.ini の扱い、非同期 lookup の停止と既存呼び出し側を確認しました。静的に追跡した範囲では、本 PR が導入する重大な再現可能欠陥は確定しませんでした。実行時検証は行っていません。

🛡️ blockingな指摘はありません。bot側の安全設定により、merge-relevantなAPPROVEではなくCOMMENTとして投稿します。

Review coverage & tooling
  • Files: 6 reviewed (+1146 / -95)
  • Full file bodies included: 0 / 6
  • Reviewer roles: numeric_consistency (deterministic), codex_deep (gpt-6.1-sol), claude_peer (claude-opus-5-5, fixed-diff only, partial), claude_specialist (claude-opus-5-5, fixed-diff only, partial)

Reviewed by vibe-editor-reviewer — head dca9240

…ディレクトリの desktop.ini・リンクの緩和と順序)

- desktop.ini は CreateFileW(FILE_FLAG_OPEN_REPARSE_POINT) で 1 回だけ開き、同じハンドルで reparse 判定・64 KB 上限・読み取りを行い、自前のパーサ (UTF-16/ANSI) で判定する
- 読み取り専用/system の候補ディレクトリは、シェルに尋ねる前にその desktop.ini を読み、UNC/非ローカルのリソース参照や CLSID があれば unknown にする
- パスのリンク確認をドライブのルートから先に行い、その後に GetVolumePathNameW。ローカルを指すジャンクションは通す
- リンクは IsReparseTagNameSurrogate (bit 29) で判定、リンクの候補は matcher で一致させず、見つけた時点で全体を判定なしにする
- フォルダに対するシェル呼び出しの前にも取消しと期限を確認、kAbsent と kNoShellMatch の対応のコメント

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@sprintreviewer sprintreviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧭 Code review

Caution

未検証の指摘候補 3 件 — 根拠の確認が必要です

Critical Warning Nitpick Info
🔴 2 🟡 1 💬 0 💡 0

確認内容

  • ✅ 変更箇所と関連するコード経路を確認
  • ✅ 独立した差分レビュー(Claude)を確認
  • ✅ リードが指定した重点ファイルの精査(Claude)を確認

レビュー所感

全差分と関連呼び出しを静的に確認し、表示名の照合、リンク・desktop.ini、キャンセル境界を重点的に追いました。junction の検査を迂回してネットワークへ到達する経路があり、修正が必要です。実行検証は行っていません。

🔍 Verification: 3 件は 未検証の指摘候補(必要な判定・コード根拠の照合が未完了です)。検証による除外や重要度の引き下げは行っていません。

指摘の正しさは未確定です。見逃し防止のため候補と現在の判定を保持しています。

根拠の確認は該当スレッドに返信してください。PR全体の再レビューは /reviewer full review、検証設定の確認は /reviewer config で行えます。既存スレッドは再レビューで自動解決されません。


Reviewed by vibe-editor-reviewer — head 0f30d81

Review coverage & tooling
  • Files: 6 reviewed (+1860 / -95)
  • Full file bodies included: 0 / 6
  • Diff coverage: ✅ complete; reviewed in 2 chunks
  • Reviewer roles: numeric_consistency (deterministic), codex_deep (gpt-6-astra), claude_peer (claude-opus-5-5, fixed-diff only, partial), claude_specialist (claude-opus-5-5, fixed-diff only, partial)
  • Verification: 3 件は 未検証の指摘候補(必要な判定・コード根拠の照合が未完了です)。検証による除外や重要度の引き下げは行っていません。

Comment thread apps/desktop/computer-use-native/computer_use_windows_uia_source.h Outdated
Comment thread apps/desktop/computer-use-native/computer_use_windows_shell_name_match.h Outdated
Comment thread apps/desktop/computer-use-native/computer_use_windows_shell_name_match.h Outdated
yusei531642 and others added 2 commits October 17, 2026 11:48
…ni の許可リスト・ドライブルート)

- ジャンクションの行き先のパスも、ドライブのルートから要素ごとにリンクを確認する(深さ 1、再帰しない)
- desktop.ini の値は拒否リストをやめ許可リストにする(両方の引用符を外し、プレーンテキストか既知の環境変数で始まるパスだけ。X:\ の絶対パスは外す)
- ドライブのルートで directory の区切りが二重になり全候補が unknown になる不具合を ShellDirectoryWithSeparator で修正
- 実行されない is_link の continue を削除、古いコメントを修正、ADR を更新

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…クを実装に合わせる

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@sprintreviewer sprintreviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Code review

Tip

LGTM — actionable issues were not found.

確認内容

  • ✅ 変更箇所と関連するコード経路を確認
  • ✅ 独立した差分レビュー(Claude)を確認
  • ✅ リードが指定した重点ファイルの精査(Claude)を確認

レビュー所感

全7差分と関連する呼び出し元を確認し、名前照合、desktop.ini・リンクの信頼境界、取消しとスレッド寿命を重点的に調査しました。重大な新規不具合を裏付ける証拠はなく、取得不能時に判定なしへ戻る経路も確認しました。実行検証は行っていません。

🛡️ blockingな指摘はありません。bot側の安全設定により、merge-relevantなAPPROVEではなくCOMMENTとして投稿します。

Review coverage & tooling
  • Files: 6 reviewed (+1951 / -95)
  • Full file bodies included: 0 / 6
  • Diff coverage: ✅ complete; reviewed in 2 chunks
  • Reviewer roles: numeric_consistency (deterministic), codex_deep (gpt-6-astra), claude_peer (claude-opus-5-5, fixed-diff only, partial), claude_specialist (claude-opus-5-5, fixed-diff only, partial)

Reviewed by vibe-editor-reviewer — head fa9f4a6

@yusei531642
yusei531642 merged commit 637abdd into main Oct 17, 2026
39 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant