Page chrome: #brand-home and #nav-hub are always present — both are same-origin links to /. Bot click → URL change → PASS.
AJAX error — popup/modal
Page role: Form submit is intercepted in JS and sent with fetch (no full navigation).
Error signal: API returns HTTP 422; error modal #ajax-modal opens.
Bot scoring: same URL, page text/DOM changes → PASS* (error UX, but still observable).
Hidden field outcome=error tells the API which JSON response to return.
Inline result area — filled after AJAX completes (success or error text).
Modal overlay #ajax-modal — used on this page .