Page chrome: #brand-home and #nav-hub are always present — both are same-origin links to /. Bot click → URL change → PASS.
Conversion Bot Test Hub
Page role: Crawl entry point. The bot starts here, discovers every link below, and can follow them when crawl.max_pages allows.
Each list item is a normal <a href> click target. Clicking it changes the URL → bot scores PASS.
Badges document the intended outcome for elements on the destination page, not for the hub link itself.
Links & clicks
Opens the click lab: internal nav, tel/mailto/sms/whatsapp/viber/tg intents, popups, role=button, and intentional dead buttons.
Button that reveals a hidden contact form (bot “opened a visible form” path), then can submit it.
Classic form submit
Standard POST form. Successful submit redirects to /forms/thanks (URL change).
Standard POST that always redirects back with server error messages (page text changes; no thanks page).
Full-page POST that re-renders the same URL with a success banner (content change, no AJAX).
Mixed controls (select, radio, checkbox, number, date) then redirect to thanks.
AJAX form submit
fetch submit; thank-you text is injected above the form (same URL, content change).
fetch submit; thank-you modal overlay appears (DOM/text change, not a browser window).
fetch returns 422; error text is shown inline. Still an observable content change for the bot.
fetch returns 422; error modal overlay appears. Still PASS for the bot via content change.
AJAX 422 with per-field errors rendered as text under each input.
Custom JS validation: messages under inputs + setCustomValidity. Promo rule usually fails bot autofill.
* Error UX still changes visible text, so the bot may treat content change as PASS unless :invalid is reported.
Broken / intentional FAIL forms
Visible fields but no submit button — bot cannot complete submit.
Pattern field that auto-fill cannot satisfy — browser keeps :invalid after click.
preventDefault on submit — URL and page text stay unchanged.
Includes required type=file, which the bot marks unsupported.
HTTP statuses
Returns HTTP 200 with a normal body. Hub link click still PASS (navigation).
Returns HTTP 404 with a custom body (not Laravel’s generic 404 page).
Returns HTTP 500 with a custom body for status-code evidence.
Server responds 302 to /. Click follows redirect → URL change.
Server responds 301 to /. Same as above with permanent redirect.