Skip to content

Read back ACT fills, type quoted text as written, and add an 80-row eval - #19

Merged
brynary merged 3 commits into
act-evals-harderfrom
act-fill-checks
Oct 5, 2026
Merged

brynary merged 3 commits into
act-evals-harderfrom
act-fill-checks

Conversation

@brynary

@brynary brynary commented Sep 27, 2026

Copy link
Copy Markdown
Contributor

Stacked on #18.

Three ideas from Stagehand's experimental Jev act path (browserbase/stagehand#2952, #2953, #2960), one commit each.

1. Read back the value ACT fills

A fill can pass while the field does not keep the value: a maxlength cuts it short, or a script clears it. After an ACT fill, Whirl now reads the field's value with the shim's existing read command. The step fails with the new code act-fill-mismatch when the value is different:

act-fill-mismatch: after FILL role:textbox "Code" "ABC-12345", the field holds "ABC-"
  • Case, spaces, and punctuation do not count, so a field that formats its value (5551234567 shown as (555) 123-4567) still passes. Jev compares exactly, but a mismatch there only hands the act to the LLM. Here it fails the step, so an exact comparison would fail valid fills.
  • The check is skipped when the element has no value to read (such as contenteditable), is gone, or the step budget is spent.
  • A message never shows a masked value.

2. Type the characters an instruction quotes

A model can change the case or spacing of text it copies. When the text for fill or type matches a quoted string in the instruction, ignoring case, spaces, and punctuation, Whirl types the instruction's characters: ACT "type \"AbC 123\" into Search" types AbC 123 even if the model answers abc 123.

  • Only a match counts, because a quoted string can also name the field.
  • A select option keeps the model's text, because it must match the page's option label.
  • Quoted strings follow Jev's quotedStrings rules: double quotes, curly quotes, and single quotes at word boundaries (so user's opens no quote).

3. An 80-row eval task

delete-account-among-80: delete the Acme account from 80 rows with identical Delete buttons. The 60 rows before the target all say "Account" twice. This follows Jev's hardest generated ranking case.

The local summary is a fresh run of all 48 tasks with the three default models on this branch's code (-n 3):

model pass p50 ACT $/task
Gemini 3.1 Flash-Lite 0.99 1.0s $0.0009
GPT-5.6 Luna 0.99 1.3s $0.0004
GPT-5.6 Terra 0.99 1.2s $0.0040

All three passed the new task 3/3. The four failures are model mistakes; no run hit act-fill-mismatch.

Docs and tests

  • SPEC §7.4, machine-output.md, and CHANGELOG describe both ACT changes and the new error code.
  • Acceptance tests: a truncated fill fails, a formatted fill passes, and quoted text is typed as written. Unit tests cover the comparison, the quoting rules, grounding, and masked messages.
  • mise run check passes.

🤖 Generated with Claude Code

brynary and others added 3 commits September 26, 2026 20:03
A fill can pass while the field does not keep the value: a maxlength
cuts it short, or a script clears it. After an ACT fill, Whirl now reads
the field's value with the shim's read command. The line fails with
act-fill-mismatch when the value is different. Case, spaces, and
punctuation do not count, so a field that formats its value, such as a
phone number, still passes. The check is skipped when the element has no
value to read or is gone. A message never shows a masked value.

Stagehand's Jev act path (browserbase/stagehand#2953) makes the same
check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A model can change the case, spacing, or punctuation of text it copies
from the instruction. When the text for fill or type matches a quoted
string in the instruction, ignoring case, spaces, and punctuation, Whirl
now types the instruction's characters. Only a match counts, because a
quoted string can also name the field. A select option keeps the model's
text, because it must match the page's option label.

Quoted strings follow Stagehand's quotedStrings rules (Jev act path,
browserbase/stagehand#2952): double quotes, curly quotes, and single
quotes at word boundaries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
delete-account-among-80 asks ACT to delete the Acme account from a table
of 80 rows, each with an identical Delete button. The 60 rows before the
target all say "Account" twice, a trap for a model that matches words.
It follows the hardest generated case in Stagehand's Jev ranking work
(browserbase/stagehand#2960).

The local summary is a new run of all 48 tasks with the three default
models, on the code that reads back fills and grounds typed text. All
three passed the new task in 3 of 3 runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brynary
brynary added this pull request to stack #56 October 5, 2026 13:22
@brynary
brynary merged commit fc13a32 into main Oct 5, 2026
3 checks passed
@brynary
brynary deleted the act-fill-checks branch October 5, 2026 18:29
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