Hand the token to the live captcha widget, not a dead one

First live run reset one account, then failed on the second: the confirm
button never enabled and the step reported it covered by a bare `div`.

reCAPTCHA adds a client to ___grecaptcha_cfg.clients per rendered widget and
removes none, so the second modal leaves two — and the callback walk fired the
first it found, the one belonging to the modal that already closed. The token
goes to a widget nobody is listening to, the live modal never hears it was
solved, and its button stays dark. Iteration 1 worked only because there was
one client to find. Now the newest wins: hook widgets are walked in reverse,
clients sorted by descending key, and the count of candidates is reported so
`2 widgets on the page, used the newest` says plainly when a page is stacking
stale ones.

Also from that run:

- coveredBy printed `div` and nothing else, which diagnoses nothing. It only
  ever reported tag and id, and modal backdrops and captcha overlays carry
  neither. It now names classes too.
- A covered target gets 8s to clear before the step fails. Most things over a
  button are on their way out — a backdrop mid-fade, an overlay closing. This
  does not weaken the check: still covered at the deadline still fails, and
  nothing is clicked while anything is on top of it.
- The reset list's scroll container is confirmed as a class, so the
  class-or-id hedge is trimmed. The run reported it as
  `dashboard_body MuiBox-root mui-0`.

Extension to 0.11.1 so the dashboard can confirm the reload took. Runner
VERSION deliberately unchanged — the step vocabulary is the same, and a bump
would raise the mismatch banner for a change that does not need it. The
runner does still need restarting to pick up the covered-retry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Brandon Li
2026-08-31 00:56:47 -05:00
co-authored by Claude Opus 5
parent 5538215650
commit 2d53639c82
5 changed files with 78 additions and 16 deletions
+3 -3
View File
@@ -199,12 +199,12 @@ export const FIRMS: Firm[] = [
// the automatic guess walks up from a match looking for an
// overflow ancestor, and setting scrollTop on the wrong
// element scrolls nothing at all. Named here so it cannot
// guess wrong. Trim the pair once you know whether the site
// spells it as a class or an id.
// guess wrong; confirmed against a live run, which reported
// the container as `dashboard_body MuiBox-root mui-0`.
{
action: 'scrollToLoad',
selector: '.status-failed button.reset_btn',
containerSelector: '.dashboard_body, #dashboard_body',
containerSelector: '.dashboard_body',
label: 'Load every failed account',
},