9.5 KiB
Phase 9 — Form A consultation isolated-test integration
Recorded: 2026-10-29 UTC
Scope: Form A (262946078314059) consultation context in local, non-indexing isolated-test builds
Status: implemented and locally verified without a Jotform submission; owner acceptance pending
Purpose and boundary
This batch retires no additional physical form: Form A serves the owner-reported configured consultation context and Form C remains the future professional-referral form. It does not activate a production consultation route, modify the Jotform account, submit a form, route answers through Astro or Contabo, or add analytics, advertising, conversion tracking, webhooks, cookies, query forwarding, service preselection, child/clinical/payment/booking collection, a Jotform helper, cross-origin DOM access, or postMessage handling.
The pre-existing production resolver remains frozen at seven Form A contact/landing paths. The following nine paths are a separate isolated-test allowlist:
| Surface | Route | Locale | Fixed context and browser behavior |
|---|---|---|---|
| Standalone | /client-consultation |
EN | formContext=consultation&language=en; iframe receives its fixed source during render |
| Standalone | /es/client-consultation |
ES | formContext=consultation&language=es; iframe receives its fixed source during render |
| Standalone | /schedule-consultation |
EN | formContext=consultation&language=en; iframe receives its fixed source during render |
| Service drawer | /aba-therapy |
EN | Explicit opener assigns the fixed EN source only after the native dialog opens |
| Service drawer | /autism-evaluations |
EN | Explicit opener assigns the fixed EN source only after the native dialog opens |
| Service drawer | /learner-social-club |
EN | Explicit opener assigns the fixed EN source only after the native dialog opens |
| Service drawer | /es/aba-therapy |
ES | Explicit opener assigns the fixed ES source only after the native dialog opens |
| Service drawer | /es/autism-evaluations |
ES | Explicit opener assigns the fixed ES source only after the native dialog opens |
| Service drawer | /es/learner-social-club |
ES | Explicit opener assigns the fixed ES source only after the native dialog opens |
Each URL comes from the typed, fixed route/locale/context mapping. No route may derive the form ID, language, context or parameter values from visitor input, queries, referrers or page labels.
Activation contract
All six values are required for the nine consultation surfaces:
PUBLIC_AIA_FORMS_MODE=isolated-test
PUBLIC_AIA_FORMS_ENVIRONMENT=isolated-test
PUBLIC_AIA_FORMS_ISOLATED_TEST_APPROVED=true
PUBLIC_AIA_FORMS_LIVE_APPROVED=false
PUBLIC_AIA_FORMS_CONSULTATION_TEST_APPROVED=true
PUBLIC_ALLOW_INDEXING=false
Missing, invalid, contradictory or indexing-enabled values fail closed. The production values PUBLIC_AIA_FORMS_MODE=live, PUBLIC_AIA_FORMS_LIVE_APPROVED=true, PUBLIC_AIA_FORMS_ENVIRONMENT=production and PUBLIC_AIA_FORM_A_PRODUCTION_APPROVED=true continue to permit only /contact, /es/contact, the four named ABA landing pages and /lp/early-intervention. The consultation-test flag cannot expand that production list.
The adapter retains referrerpolicy="no-referrer", sandbox="allow-forms allow-scripts allow-same-origin", fixed context-sensitive dimensions, localized accessible titles, its conditional 15-second hosted-form fallback and localized no-JavaScript fallback. A frame load only stops the fallback timer; it is not evidence of Jotform initialization, an accepted submission, a conversion or a healthy cross-origin application.
Shared bilingual drawer behavior
ServiceInquiryDrawer.astro now uses one typed English/Spanish implementation. In authorized consultation-test mode it removes the legacy child-information surface, renders a visible keyboard-accessible opener and uses a native dialog with a localized close name. The drawer does not auto-open. Opening assigns the already validated source once, starts the adapter timer and focuses the close control. Escape, close-button and backdrop paths use the existing dialog behavior and restore focus to the trigger. Closing and reopening does not create another iframe or reset its source. The rendered parent supplies localized instructions and a no-JavaScript hosted path; Jotform's child text remains a separate owner language-acceptance item.
The owner superseded the earlier diagnostic-evaluation explanatory-note requirement. The implementation adds no conditional note. AIA's client advocate will discuss available options and coordination with qualified diagnostic providers in the later conversation. The parent and Form A must not imply current in-clinic diagnostic availability, a diagnosis or a completed diagnostic-provider hire.
Verification record
npm run check: passed with 0 errors, 0 warnings and 0 hints.- Focused resolver, artifact and nonproduction tests: 21 passing tests.
- Guarded browser verification uses loopback Astro preview, blocks every external request before transmission and supplies only a local Jotform fixture. It verifies all nine routes at 320, 390, 768 and 1440px; static rendering and deferred drawer loads are recorded separately. Result details, screenshot directory and the final validation/audit outcomes are added to this report after the complete regression pass.
No automated check submits form data or treats a frame load as a conversion. The guarded tests establish parent-page routing, gating, accessibility hooks and request timing only; they cannot verify the actual Jotform dropdown, conditions, localized child UI, validation, confirmation, notification or telemetry behavior.
Remaining acceptance
The Jotform owner and applicable operations, clinical, privacy/security and English/Spanish reviewers must still accept the actual consultation dropdown's visibility, requiredness, five display choices, condition behavior, translations, validation, confirmation and notification boundary. Required browser acceptance includes real embedded loading, responsive/error expansion, keyboard traversal across the iframe boundary, no-JavaScript hosted fallback, real screen-reader behavior and Jotform runtime/telemetry privacy review. A separate owner decision and production allowlist change are required before any consultation surface is eligible for production. Form C remains uncreated and unmapped.
Completed local evidence
The guarded consultation browser runner passed 45 checks: nine routes at 320, 390, 768 and 1440px, plus nine no-JavaScript checks. It recorded 36 full-page screenshots in /tmp/aia-form-a-consultation-NUdKYz and one held-request timeout check. The local request guard intercepted 40 attempted Jotform GETs, all to one of the two fixed consultation URLs; it fulfilled ordinary checks from a local fixture and held one timeout request. No request was transmitted to Jotform. It observed no non-GET/HEAD request, production API request, analytics request, advertising request or WebSocket request. This is parent-page browser evidence only, not a test of the real Jotform child application.
The original seven Form A routes were also rerun with the guarded isolated-test browser runner: 35 checks across the seven paths at the same four widths plus no-JavaScript and fallback states. The resulting request ledger contains only intercepted GET attempts to the fixed Form A URLs and pre-existing Leaflet resources; no request was transmitted and no non-read request was attempted.
Focused resolver/artifact/nonproduction tests passed 21/21. The existing Form A preview stylesheet test was reconciled to the owner-maintained .form-all Jotform selector and passed 4/4 without modifying integrations/jotform/aia-form-a.css. Campaign tests passed 11/11. Core suites passed: Markdown 20/20, publication 33/33, SEO 35/35, Library 53/53, routes 10/10 and Phase 8 contrast 5/5. astro check reported zero diagnostics. Normal staging, mock, indexing-enabled, production-gated and isolated-test artifacts all passed the artifact verifier:
| Artifact mode | HTML routes | Sitemap URLs | hreflang links | Form A frames | Deferred drawer frames |
|---|---|---|---|---|---|
| Normal staging/off | 128 | 0 | 0 | 0 | 0 |
| Mock | 128 | 0 | 0 | 0 | 0 |
| Indexing-enabled/off | 127 | 109 | 180 | 0 | 0 |
| Production-gated | 127 | 109 | 180 | 7 | 0 |
| Consultation isolated-test | 128 | 0 | 0 | 10 | 6 |
In the isolated artifact, ten static frames are the seven frozen contact/landing paths plus the three standalone consultation pages. The six service-drawer adapters retain an approved source only as deferred data until a visitor opens the dialog. The final normal staging build was restored: 128 noindex,nofollow pages, an empty sitemap, zero hreflang links and zero Form A frames. Link, image and blog audits reported 0 broken internal links, 0 missing mapped page images and 0 blog-audit failures.
Later consolidated owner revision, 2026-10-30
The explicit-only drawer behavior above is the earlier checkpoint's historical evidence. The subsequent consolidated pass replaces it with four-second/50% automatic opening, global 30-day expiry-only suppression, existing CTA override and bilingual service-specific introductory copy. Iframe sources remain deferred until opening, which may now be automatic under the authorized test mode. The production allowlist is unchanged. See the current consolidated report for tests, privacy boundaries and remaining owner acceptance. Historical test counts above are not claims about the revised behavior.