Commit Graph
1274 Commits
Author SHA1 Message Date
ciregenzandClaude Fable 5 102ba3927a arena: v3/v4 ingest rounds + the dedupe bug those rounds exposed in the shipped ranker
v3 (44.8%, beats the browser-use-shaped arm's 36.0% by 8.8 points at 3x the speed):
page-text panel, select options on the row, input twins exempt from dedupe. v4 queued:
DOM-attribute names for nameless icons and deep sibling context, which turn the email
suite's unlabeled trash/star icons into addressable rows.

Product fix landed with tests: interactiveRanking.ts collapsed adjacent same-named
inputs and adjacent nameless icons as twins -- measured on MiniWoB, that single
collapse cost enter-password and the whole email suite. Inputs and nameless rows are
now exempt; named icon+label pairs still collapse. 17/17 tests, tsc clean.

ARENA.md carries the full scoreboard, per-category verdicts, what was ingested from
whom, and the honest gaps (drag and vision-less spatial) neither stack solves.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WsbS5x2rYsMDxP2kW3qqmQ
2026-08-09 16:17:11 -07:00
ciregenz 7a942fa9fa Merge remote-tracking branch 'origin/eric/dev' into eric/browser-merged 2026-08-08 09:22:33 -07:00
ciregenz 256e922886 [eric] canvas: browsers and apps share one 10-renderer ceiling, so the two caps can no longer stack to 14 2026-08-07 20:10:59 -07:00
ciregenz a276a5d64d [eric] canvas: a browser leaving the rail lands on its snapshot and attaches the guest after the motion, killing the browser-only jank 2026-08-07 19:28:17 -07:00
ciregenz 8c8a9fe120 [eric] canvas: a card leaving the minimized rail lands in its tile in one frame, instead of flying in from a home nobody saw 2026-08-07 19:22:19 -07:00
ciregenz ab875d5894 [eric] canvas: the tiling settle waits for the camera to demonstrably rest, not for a guessed delay 2026-08-07 19:13:57 -07:00
ciregenz c8df096520 [eric] canvas: revert the top inset, the tiled window already sits above the drag strip and did not need it 2026-08-07 19:09:24 -07:00
ciregenz c8dd05ddf4 [eric] canvas: tiling insets below the top drag strip, so a fullscreen window stops losing its top edge to window-drag 2026-08-07 19:00:58 -07:00
ciregenz 863a8274f9 [eric] canvas: stop re-solving a tile origin that was already right, which is what put fullscreen a few px off 2026-08-07 18:57:12 -07:00
ciregenz 85e50f029a [eric] canvas: a browser card too small to read goes to sleep on zoom-out, not just stays asleep on zoom-in 2026-08-07 18:43:42 -07:00
ciregenz 31a45b003a [eric] canvas: a tiling settle waits for the camera to stop moving, and re-measures once the rail lets the card go 2026-08-07 18:25:08 -07:00
ciregenz dc1896c91f [eric] canvas: tiling diagnostics log one flat line, since devtools ate the nested arrays on copy 2026-08-07 18:17:53 -07:00
ciregenz 088a31973b [eric] canvas: temporary tiling diagnostics, so the minimized-to-fullscreen offset can be read off numbers 2026-08-07 18:12:58 -07:00
ciregenz 901d9ff070 [eric] browser: back, forward and reload lose their tooltips, which only ever landed on top of the page 2026-08-07 18:10:25 -07:00
ciregenz df85b17100 [eric] canvas: fullscreen from the minimized rail lands square, instead of taking its origin from the -100000 park 2026-08-07 18:02:21 -07:00
ciregenz 0c83bb8f78 [eric] canvas: an app window owns its wheel whether or not you clicked in first; workflow tests wait on progress, not a clock 2026-08-07 17:37:30 -07:00
ciregenz b16c31b8c2 [eric] canvas: scroll over an unfocused card drives the canvas again, and a scroll inside one never chains out of it 2026-08-07 16:52:55 -07:00
ciregenz 6d8ecc6fd4 [eric] canvas: the host window allows visual zoom, so macOS actually delivers a trackpad pinch to the dashboard (ENG-186) 2026-08-07 16:24:07 -07:00
ciregenz b37509894d [eric] tests: two suites imported a .js that never existed, so 13 assertions had never run once 2026-08-07 16:06:57 -07:00
ciregenz 9b0ca9f2fc [eric] canvas: double-click to frame everything keeps a readable floor instead of bottoming out at 15% 2026-08-07 16:04:42 -07:00
ciregenz 5b63c98854 [eric] dictation: the cursor wins, so a transcript lands where you clicked, not where you started (reverts ENG-176) 2026-08-07 16:01:05 -07:00
ciregenz 4293904214 [eric] canvas: the stock wash is one flat colour, so a default install has no texture left to tear 2026-08-07 15:41:07 -07:00
ciregenz ec0d706a80 [eric] canvas: cut the evictable full-window texture 98MB to 43MB, so the wash has far less left to drop as a band 2026-08-07 15:23:43 -07:00
ciregenz e53d01f9ef [eric] canvas: wash and grain paint on the viewport itself, so there is no second layer to lose 2026-08-07 14:45:43 -07:00
ciregenz 8364864f9f [eric] canvas: the wash is a real gradient, not a 119KB image the GPU can drop 2026-08-07 14:41:08 -07:00
ciregenz 2287c1244b [eric] canvas: browser cards past the first actually load their page again 2026-08-07 13:56:41 -07:00
ciregenz 86f92164b6 [eric] canvas: a card finishes its own attach work before the next webview starts 2026-08-07 13:50:16 -07:00
ciregenz 3c711d0f85 [eric] canvas: the next webview waits for the last one to attach, not for the next frame 2026-08-07 13:44:30 -07:00
ciregenz 5eed1385be [eric] canvas: webview attaches go one per frame, so opening a loaded dashboard stops locking the app for 4.7s 2026-08-07 13:39:03 -07:00
ciregenzandClaude Opus 5 0a56eb1a85 [eric] browser: take browser-use's visibility rule, drop our arbitrary size floor
Read browser-use's own DOM code (dom/service.py,
is_element_visible_according_to_all_parents) and it decides visibility on CSS
alone: display, visibility, opacity, plus bounds existence and a viewport
intersection with 1000px of slack. There is NO minimum size gate anywhere.

Ours had `r.width >= 80 && r.height >= 16`, and that floor was the entire reason
ACE / CodeMirror-5 / Monaco composers were unreachable: their real input is a ~1x1
offscreen textarea that paints into a sibling div, so it fails a size test by
construction while being the correct fill target. Measured: w3schools and onlinegdb
scored 0/3 while every contenteditable editor (CodeMirror 6, Quill, TinyMCE,
CKEditor) passed -- the input MECHANISM split the suite, not the site.

This replaces the proxyHost patch from the previous commit, which reached the same
sites by walking up to a composer-sized ancestor. Their rule is simpler, more
general, and needs no ancestor heuristic, so proxyHost is deleted rather than kept
alongside. The floor was also doing less work than it looked: junk is excluded by
requiring a rich role or a nearby submit AND score >= 2, and a honeypot is
display:none / opacity:0, which still fails.

Measured on the merged tree, same lane (OSW_MODEL=opus-4-8-cc):
- anon w3schools 3/3, i.e. ACE still reached with proxyHost gone
- holdout 18/20 = 90%, byte-identical to before: no regression
- other_ms unchanged at 1211ms

deepl regressed to not_measurable in the same sweep and it is NOT this change:
A/B'd by restoring the old floor and re-running, it fails identically. deepl now
redirects to /en/translator/l/en/pt-BR and serves one textbox; the redirect predates
the change in the logs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 13:11:37 -07:00
ciregenz eaecf19579 [eric] usage: agent time stops billing idle cards as work, and the panel gains real figures 2026-08-07 11:07:43 -07:00
ciregenz 307c0647d7 [eric] settings: the shortcut chip takes focus when armed, so a blur cannot disarm it before a key lands 2026-08-07 10:09:48 -07:00
ciregenz 85fa639de7 [eric] apps: the composer's Add app opens the same Applications window as the dock, not the legacy inline picker 2026-08-07 10:04:14 -07:00
ciregenz 511e2b0029 [eric] dictation: a field that dies mid-decode drops the words instead of typing them into a stranger's box 2026-08-07 06:42:41 -07:00
ciregenz 820bd922a2 [eric] telemetry: a crashed browser card reports itself instead of going silently blank 2026-08-07 04:59:30 -07:00
ciregenz 3324d63ab1 [eric] release: What's New card + endpoint serve the same story as Help and GitHub, header punctuation fixed 2026-08-07 01:05:05 -07:00
ciregenz 37f5c35244 [eric] windows: Settings and Marketplace honor bring-to-front, clicking one actually raises it 2026-08-07 00:52:35 -07:00
ciregenz 3ba65bedb7 [eric] ux: marketplace joins click-to-fit, camera flights land soft (340ms quintic), browser-agent runs show one view not two 2026-08-07 00:43:23 -07:00
ciregenz 7a1518df32 [eric] telemetry: memory sensor reports cap crossings and leak-shaped growth, silent on healthy sessions 2026-08-07 00:08:53 -07:00
ciregenz 29f7bd5837 [eric] canvas: scroll containment covers every surface, a wheel inside any card stays in that card 2026-08-07 00:06:58 -07:00
ciregenz b233178c8c [eric] canvas: a wheel that starts inside a scrollable surface or an app window stays there, no more scroll leaking into pan/zoom 2026-08-06 23:51:30 -07:00
ciregenz 313e3fd07d [eric] dictation: dev-only seam proves the focus-drift guarantee against the real module 2026-08-06 23:47:36 -07:00
ciregenz 0914b276d7 [eric] dictation: the paste target is snapshotted at press-start, so focus drift during decode cannot steal the transcript (ENG-176) 2026-08-06 23:46:09 -07:00
ciregenz c4ff6dad93 Merge remote-tracking branch 'origin/eric/dev' into eric/browser-merged
# Conflicts:
#	electron/package-lock.json
2026-08-06 23:22:12 -07:00
ciregenzandClaude Opus 5 3c50359146 [eric] browser-v3: fix the instrument first, then the two composer bugs it could finally see
Six of the eleven defects here were in the MEASUREMENT, not the product, and they
were wrong in both directions.

Harness, all of which silently produced wrong numbers:
- coverage.py preflight refused every sweep on a box holding exactly one backend:
  stack.sh's supervisor is a `bash -c` quoting the whole uvicorn line, so it carries
  both "-m uvicorn backend.main" AND the venv python path. Discriminate on POSITION.
- stack.sh status reported 2 backends over 1 and 0 webpack over a live dev server
  (webpack retitles its process). A status check whose job is preventing a second
  stack, failing in the direction that lets one land.
- c7_run.sh/c8_run.sh slice r6_be.log while stack.sh names logs by TAG: a stack under
  any other tag hands every trial an empty slice and the sweep reports a confident
  0/108. Now refuses loudly; it caught this exact mistake on first use.
- "Browser command timed out" was bucketed infra. It is ONE command blowing its own
  budget, not a dead webview: all 4 such rows were BrowserFindComposer at exactly its
  30s cap, every run completed after, zero card-gone markers in the whole log. Filed
  as infra it read as 11.8% flake AND lifted holdout reach 70% -> 84%.
- api_retry / rate_limit_error now grade as infra. A provider 429 storm turned clean
  15-21s exclusions into 188s product_no_composer rows.
- bench.py prints reach BOTH ways when a row is UNVERIFIED. An exclusion resting on
  the agent's own word quietly flatters the score, and coverage.py's own instruction
  to confirm it by hand goes unread (I quoted a 100% that excluded onlinegdb).

Timing was measuring 0.2% of the run: prestage completes BEFORE metrics_started_at,
so other_ms was 25ms of a 12700ms median while prestage (4146ms, ~61%) sat in no
bucket at all. prestage_ms/task_ms are now recorded; total_ms is deliberately NOT
redefined, which would invalidate every before/after already taken against it.

Product:
- find_composer rejected ACE/CodeMirror-5/Monaco composers. Their input is a ~1x1
  offscreen textarea that paints into a sibling div, so it can never pass a size
  gate. Accept it when a VISIBLE ancestor is composer-sized; honeypots stay out
  because the input itself must not be display:none/visibility:hidden/opacity:0.
  anon reach 80% -> 100%, holdout 89% -> 90%, p95 38.6s -> 9.7s.
- the composer poll slept a blind 0+1.2+1.4 = 2.6s whenever prestage staged nothing,
  which is nearly every run, and it was the whole of other_ms's suspicious constancy
  (2610-2613ms regardless of tools_ms). Stop when two reads are identical, the rule
  the opener poll 40 lines below already applies. other_ms -53.7%, tools_ms flat.
- prestage no longer navigates to the page it is already on, nor sleeps 0.35s before
  its first settle probe.
- is_replay_boundary reasoned from the NAME alone, so x.com's composer textbox named
  "Post text" was ruled an irreversible send and truncated its replay to a bare
  navigate. Excluded by ROLE; first_unsafe_step now passes role through at all.

Measured on this box: reach 100% (83% if onlinegdb's unverified exclusion is bogus),
0 false successes in ~155 runs, prestage tier-0/1 2702ms, other_ms -53.7%, infra
flake 0/158, holdout 18/20. Criteria 2/4/9 need live writes and are untouched.
Full evidence, including what did NOT work, in e2e/browser-v3/RESULTS_2026-08-06.md.

Also drops the tracked electron/node_modules symlink pointing at another machine's
Downloads folder; it is dangling on every other checkout and re-breaks the install on
any stash or checkout.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 23:21:05 -07:00
ciregenz c3635062a1 [eric] telemetry: long-task observer is the primary wedge sensor, Chromium unresponsive stays as a second witness 2026-08-06 23:05:09 -07:00
ciregenz 751747b293 [eric] telemetry: crash recoveries, wedge recoveries, and rage clicks reach analytics (silent-failure family A) 2026-08-06 22:45:32 -07:00
ciregenz 474a6fdbb0 [eric] chat: connection-hiccup and provider-refresh failures get honest cards instead of the generic snag 2026-08-06 21:03:32 -07:00
ciregenz d1d6e0e0e5 [eric] health: one banner line per provider, a 401 naming its own reset window is mid-refresh not dead 2026-08-06 20:58:42 -07:00
ciregenz d2ff1bdae7 [eric] experimental: quick pill overlay unwired and parked in .claude/slime-parked 2026-08-06 20:50:13 -07:00