Repository navigation
[compass] Fix: seat_element set_value reports "performed" on a Chrome drop-down list that ignores it - #28
Merged
Conversation
seat_element set_value on a Chrome <select> returned {"performed":"set_value"}
while the list kept its old choice, so an agent could submit a form with the
wrong option. AccessibilityReader.Act now reads the control back after
SetValue: it waits up to 1.5 s for the value to change (Chrome shows a change
a moment later), fails with a message that says to expand the list and select
the option when the control still reads its old value, and returns what the
control reads when it reformatted the value.
The new quick check "desktop ignored set_value" drives a hidden in-process
ComboBox that applies, ignores, applies late or reformats the value. The
hidden-window plumbing of "desktop unknown control types" moves into a shared
Hosted helper.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e may have taken (review) From the second review of B-026's fix: - The failure quoted up to 200 characters of the control's old value, and the pipe server logs every handler error to anode.log, so a field's contents could reach the log. The message no longer quotes the control. - It now says the control may have taken the change and kept its old text (a tag field, a value it rewrites, a change still pending), and gives the "expand the list" advice only for a ComboBox. - A COMException, timeout or InvalidOperationException while reading back, after the value was sent, now answers "performed" with a note instead of a failure that reads as "nothing happened". - The text summary shows what a reformatting control now reads (sanitised), and PROTOCOL.md lists the optional `value`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
…ck catch and a text field (review) From the re-check of b884144: the text summary quotes what a reformatting control reads, or says "(empty)", so app text isn't read as part of Anode's note. The quick check now also covers a control that goes away after the value is sent (performed, "could not be read back") and a text field that ignores the value (no drop-down advice). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
Author
|
Compass merge: ready to merge, merging now Tested by compass-merge on 2026-10-09 on head
Review (whole diff):
Second opinion: the fixer's fresh Claude subagent reviews (two passes, no open P1 or P2). The Codex CLI is at its usage limit until 22:15 today, and Codex's GitHub review hit the same limit on this PR. Undo: |
skulitom
added a commit
that referenced
this pull request
Oct 9, 2026
…down notes compass-merge's review of #27 (2026-10-09): - GUIDE-DESKTOP-APP: build before `lease acquire`, so a long build can't expire the 120 s lease; mention `--ttl 600`; scale screenshot points back to seat pixels before `seat_click`. - GUIDE-ANDROID, ANDROID, TROUBLESHOOTING: `anode android` needs Anode running; only `--json` shows `booted`. - GUIDE-WEB-FORM: sign in before the agent takes the lease; take the next element ID from `seat_wait`'s own reply; scale screenshot points back; #28 and #29 fix the `<select>` behaviour in the next release; one `seat_type` call types at most about 3,000 characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Report
C:\DEV\Compass\ANODE-BUGS.md, B-026 (compass-followup, 2026-10-08, while recording the C-042 web-form guide in the seat): on installed Anode 0.11.0,seat_element set_valuewith "Team" on a Chrome<select>(role ComboBox, options Free/Team/Enterprise) returned{"performed":"set_value"}, but a freshseat_observestill read "Free" and the page showed Free. The same call worked on the page's text fields. An agent that trusts "performed" submits the form with the wrong choice.Root cause
AccessibilityReader.ActcalledValuePattern.SetValueand answeredperformedas soon as the call returned. UI Automation only reports whether the provider accepted the call. Chrome accepts SetValue on a<select>and doesn't change the choice. Nothing checked the effect.Fix
set_valuenow reads the control back (AccessibilityReader.SetValue):performed, as before. Anode waits up to 1.5 s, reading every 50 ms, because Chrome shows a change a moment after the call. The wait ends as soon as the value changes, so a working field answers as quickly as before.performed, plusvaluewith what the control reads now (clipped to 500 characters). The text summary shows it too.anode.log.performed, with a note that the value was sent but not read back. The call did go out, so a failure here would have told the agent nothing happened.The observation is consumed either way, as before. The
seat_elementtool description,docs/DESKTOP-TOOLS.md,docs/PROTOCOL.md(the optionalvalue) and the CHANGELOG say this.How it was tested
New quick check
desktop ignored set_value: a hidden in-process window (never shown) whose UIA provider is a ComboBox with a ValuePattern. It applies, ignores (like Chrome's<select>), applies 300 ms later, or uppercases the value. The check goes through the realObserveandAct. It also checks that the failure doesn't quote the control and gives the drop-down advice, and that the summary shows a reformatted value. The hidden-window plumbing ofdesktop unknown control typesmoved into a sharedHostedhelper, which this check uses too. That check still passes.Mutation runs (file restored byte for byte after each, then rebuilt):
set_valueput back, the check fails: a late-applied value was reported as performed before the control had it.FOCUS test command (
scripts\build.ps1 -QuickTest -OutputDirectory artifacts\pkg-build): 96/96 pass at each commit. Debugselftest --quick: pass.No seat, lease, input, browser or Android command was run, and the installed Anode's
anode-controlpipe wasn't touched.Second review: a fresh read-only Claude subagent (Codex is at its usage limit until Fri 9 Oct 22:15). First pass, on f08518f: no P1. Two P2s:
anode.log. Fixed in b884144.Its P3s are fixed in b884144: a wider read-back catch, an honest message with the drop-down advice only for a ComboBox, the reformatted value in the text summary, and PROTOCOL.md. A re-check of b884144 found no new P1/P2. Its two P3s are fixed in 1f7d5a1: the summary quotes the value, and the check now also covers the read-back catch and a text field. A mutation with that catch disabled fails the check.
Still to check in a real seat
set_valueon a<select>should now fail with the message above instead of reportingperformed.set_valueshould still succeed. This is the main risk: it holds only if Chrome's accessibility update arrives within the 1.5 s wait in a hidden seat. If it doesn't, every Chrome<input>set_valuewould now fail where it used to work.scripts/test-desktop.ps1runs WinForms TextBoxset_valuethrough the new read-back.The followup's fixture page is
C:\DEV\Compass\scratch\compass-followup\c042-media\form\index.html.🤖 Generated with Claude Code