Repository navigation
fix(computer-use): #823 Windows の V1 の UI Automation で、値を返した遅い成功を時間切れにしない - #824
Merged
Merged
Conversation
…にしない #820(PR #821)の規則 4 は、270 ms(最初の接触は 470 ms)以上かかって成功した呼び出しを一律に 時間切れとしていた。応答している app でも負荷が高いと 1 回の呼び出しがこの値を超えることがあり、 経路全体が打ち切られて target_unclassified で拒否されていた(PR #821 の CI の deep tree)。 - WindowsV1UiaTimed は、呼び出しが書く出力そのものを受け取り、遅い成功を時間切れとするのは 出力が空のとき(WindowsV1UiaEmpty)だけにする。空の形は型ごとに 1 つ: 要素・pattern・ SAFEARRAY は null、BSTR は null か長さ 0、RECT はすべて 0、値の型(BOOL / int / enum)は 0。 0 が正しい答えでもありうるもの(空の名前、子なし、FALSE、ToggleState_Off など)は、遅ければ 従来どおり時間切れ(fail closed。IsPassword の遅い FALSE を「password ではない」と読まない)。 - 最初の接触(ElementFromHandle / ElementFromPoint / GetFocusedElement)は例外で、遅ければ 要素を返しても時間切れのまま。UI Automation は provider が切れても HWND から要素を作るため (ローカルの live seam で 1026 ms・S_OK・要素ありを観測。成功扱いにすると observe が 2.5 s に 延びた)。 - すべての UIA 呼び出しの呼び出し元が出力を名指しすることを source 契約で数える (ラップ済み 38 == 全 38、渡す出力がその呼び出しの書く変数であること)。 - live seam の C++ に、窓を使わない決定的なケースを足した: 閾値を超えて眠り S_OK と値を返す 呼び出しは成功で経路が続き、空を返す呼び出し(空の BSTR、null の要素、FALSE)と要素を返した 遅い最初の接触は時間切れで経路を終える。 - live seam の 1 ケースの上限を、数えた 1 回の最悪値(Connection 500 + Transaction 300)と 余裕 150 ms の 950 ms にした(host の定数から求め、1 s の Cancel 確認未満を static_assert と 契約で固定)。PR #822 の CI で連鎖が 844 ms で実際に起きて、旧上限(700 ms)で失敗したため。 - host のコメントと ADR の #820 の段落を更新した。 Refs #823 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
🗺️ PR Walkthrough Note UI Automation の遅い成功を出力値で判定し、空の値だけを時間切れとして扱うよう変更しました。最初の接触は要素を返しても時間切れを維持し、ライブ seam の上限を 950 ms に更新しています。 Changed files (3)
Reviewed by vibe-editor-reviewer — head |
There was a problem hiding this comment.
✅ Code review
Tip
LGTM — actionable issues were not found.
確認内容
- ✅ 変更箇所と関連するコード経路を確認
- ✅ 独立した差分レビュー(Claude)を確認
レビュー所感
固定 HEAD を確認し、遅い成功の出力判定、分類・操作への伝播、取消し、リソース解放と関連テストを精査しました。静的確認では、この変更が導入する重大な不具合は確認できませんでした。実行による検証は行っていません。
🛡️ blockingな指摘はありません。bot側の安全設定により、merge-relevantなAPPROVEではなくCOMMENTとして投稿します。
Review coverage & tooling
- Files: 3 reviewed (+257 / -95)
- Full file bodies included: 0 / 3
- Reviewer roles: numeric_consistency (deterministic), codex_deep (gpt-6.1-sol), claude_peer (claude-opus-5-5, fixed-diff only, partial)
Reviewed by vibe-editor-reviewer — head a21c09b
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
何を変えたか
WindowsV1UiaTimed(computer_use_windows_host.cc)で、遅い成功(読み取りは 270 ms 以上、最初の接触は 470 ms 以上)を時間切れとして扱うのは、呼び出しの出力が空のときだけにしました。値を返した遅い成功は成功です。WindowsV1UiaEmptyで、型ごとに 1 つです。semantic_state_unavailableで拒否します。ElementFromHandleが 1026 ms かかったうえで S_OK と要素を返しました(UI Automation が HWND から要素を作るためです)。これを成功として扱うと、その後の呼び出しが続き、observe が 2.5 s かかりました。なぜ
応答している app でも、負荷が高いと 1 回の呼び出しが閾値を超えることがあります。#821 の規則ではその時点で経路全体が打ち切られ、
target_unclassifiedで拒否されていました(PR #821 の CI の deep tree ケース)。時間切れの読み取りが残すのは空の値なので、空の値の遅い成功だけを時間切れとします。どう確かめたか(ローカル Windows、MSVC 2022)
npx tsc --noEmit -p .は成功、npx prettier --checkも成功node build-computer-use-native.mjs(vcvars64)は成功computer-use-windows-v1-uia-timeout-live-seam.test.ts: 契約 6 件はすべて PASS。新しく足した決定的な SeamCheck もすべて PASS(遅い値あり → 成功で経路が続く/遅い空 → 時間切れで経路が終わる/遅い FALSE → 時間切れ/遅い TRUE → 成功/要素を返した遅い接触 → 時間切れ)the_first_call_of_a_new_process_reads_an_ordinary_windowとReadUiaObservation@provider-answers-0(1027 ms)。ただし、変更前の main(cc59e6a0)でも同じ 2 件が同じように失敗することを確かめました。環境に依存する既存の失敗で、CI の結果で確かめます。a_slow_read_with_a_value_is_a_success_and_the_path_lives、a_slow_value_type_read_with_a_value_is_a_success、a_slow_move_with_an_element_is_a_success、a_slow_true_is_an_answer)と契約が FAIL しました。その後、元に戻しました。a_slow_contact_with_an_element_is_still_a_timeoutが FAIL し、provider-answers-0 の observe は 2537 ms になりました。その後、元に戻しました。Refs #823
🤖 Generated with Claude Code