Skip to content

feat: buckets B+C+D from jnremache field report#3

Merged
kepptic merged 2 commits intomainfrom
feat/buckets-bcd
Apr 21, 2026
Merged

feat: buckets B+C+D from jnremache field report#3
kepptic merged 2 commits intomainfrom
feat/buckets-bcd

Conversation

@kepptic
Copy link
Copy Markdown
Owner

@kepptic kepptic commented Apr 21, 2026

Summary

Closes the three remaining triage buckets from the 2026-04-20 jnremache field report.

Bucket B — architectural:

  • ghax batch '<json>' (TOK-09) — one-round-trip sequence executor with auto-re-snapshot between @e-using steps (naturally fixes JNR-03 mid-sequence ref-shift).
  • Dialog-aware snapshot walker (JNR-06) — auto-scopes to top-most visible modal.
  • Framework-safe fill covers Angular blur + Material contenteditable (JNR-04).
  • Actionable state.rs errors with live-port hint (JNR-01).

Bucket C — papercuts:

  • POSIX-quiet attach on fresh success (+ --verbose) (TOK-07)
  • status surfaces active tab id + title (GHAX-FR-04)
  • eval auto-retries past nav-in-flight (GHAX-FR-01, also applies to text)
  • RPC single-retry on transient transport errors (JNR-02)
  • Help text reorg for overloaded wait line (GHAX-FR-02)

Bucket D — docs: Known-browser-quirks section in CONTRIBUTING.md for Chrome 113+ default-profile CDP restriction and Google anti-bot mitigation.

Test plan

  • npm run typecheck clean
  • npm run build clean
  • cargo build --release clean
  • Smoke covers new status fields (activeTabId/activeTabTitle/activeTabUrl) and batch round-trip
  • Manual verify: ghax attach --verbose / ghax status / ghax batch all land as expected post-install-link

kepptic added 2 commits April 21, 2026 01:28
Two not-a-ghax-bug patterns that burn anyone driving a real browser for
the first time. Document them where a new contributor is already looking.

- Chrome 113+ silently ignores --remote-debugging-port on the default
  user-data-dir. Fix: pass --user-data-dir=<path>. Edge is not affected.
- Chrome/Edge launched with --remote-debugging-port sets
  navigator.webdriver = true, which trips Google anti-bot on sensitive
  pages (Business Profile verification, Drive sharing, Google Ads edits).
  Cheap mitigation: --disable-blink-features=AutomationControlled. For
  flows where that's not enough, detach / do the step manually / reattach.
  Full stealth-mode JS injection is explicitly out of scope.

Bucket D of the 2026-04-20 jnremache field report.
Bucket B — architectural fixes (each a field-report issue):

- ghax batch '<json>' (TOK-09) one-round-trip sequence executor. Parses
  inline JSON client-side, ships the whole plan in one RPC, and
  auto-re-snapshots between steps that reference @e<n> refs so the ref
  map always resolves against the current DOM. Directly fixes JNR-03
  mid-sequence ref-shift on Material/React forms where comboboxes
  opening mid-plan reindex the ARIA tree. --no-auto-snapshot opts out.

- snapshot is dialog-aware by default (JNR-06). When a modal is open
  ([role=dialog], [role=alertdialog], <dialog open>, [aria-modal=true])
  the walker treats the top-most visible modal as the new root instead
  of inheriting aria-hidden="true" from the outer app. --no-dialog-scope
  opts out.

- fill covers Angular + Material (JNR-04). React's native-setter + input
  pattern was already there; now the handler also dispatches blur (so
  Angular FormControl validators run) and handles contenteditable hosts
  (Material chip inputs, rich editors) via textContent + a proper
  InputEvent('insertText').

- state.rs::require_daemon gives actionable errors when state is stale
  (JNR-01). Probes 9222-9230 for a live ghax daemon and hints the port
  in the "no daemon state" error; pid-mismatch branch spells out
  `ghax detach && ghax attach` as the fix.

Bucket C — papercut bundle:

- ghax attach is silent on fresh success (TOK-07, POSIX). --verbose or
  GHAX_VERBOSE=1 restore the pid/port/browser line. "already attached"
  still prints — it's informational, not success.

- ghax status surfaces active tab id + first 60 chars of title as a new
  `active` row (GHAX-FR-04). status --json gains activeTabId,
  activeTabTitle, activeTabUrl.

- ghax eval auto-retries once past a nav-in-flight (GHAX-FR-01). The
  daemon waits up to 3s for the next load event and re-issues the
  evaluate — matches what a human would do with `wait --load && eval …`.
  Also applies to `text` (same root cause).

- RPC client single-retries transient transport errors (JNR-02,
  connection refused/reset/timeout) after 50ms. Semantic errors
  (daemon answered with ok:false) are not retried.

- --help splits the overloaded wait line into three forms (GHAX-FR-02);
  eval gains an inline note about the nav retry; attach lists --verbose.

Smoke tests updated to cover the new status fields and the batch verb.
@kepptic kepptic merged commit 8273e67 into main Apr 21, 2026
2 of 4 checks passed
@kepptic kepptic deleted the feat/buckets-bcd branch April 24, 2026 03:20
kepptic added a commit that referenced this pull request Apr 24, 2026
feat: buckets B+C+D from field report
kepptic added a commit that referenced this pull request Apr 24, 2026
feat: buckets B+C+D from field report
kepptic added a commit that referenced this pull request Apr 24, 2026
feat: buckets B+C+D from field report
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