Author SHA1 Message Date
DeCentN2Madness 0ab08131d6 style(portal): remove underline text decoration from links 2026-11-01 14:12:29 -07:00
AIAMarketing b0cf2d7119 docs(portal): staff button and Management Templates layout parity 2026-11-01 14:05:35 -07:00
AIAMarketing 3e05458944 test(portal): staff buttons, management-template grid, isolated management view 2026-11-01 14:05:35 -07:00
AIAMarketing 4d7955fb48 test(portal): pin staff-template styling and safe resource rules 2026-11-01 14:05:35 -07:00
AIAMarketing 81d1f21236 style(portal): two-column management template buttons on desktop 2026-11-01 14:05:35 -07:00
AIAMarketing aa406e623d fix(portal): restore staff resource buttons and tag template list 2026-11-01 14:05:35 -07:00
AIAMarketing 5d6d4af8bd docs(portal): record screenshot-driven styling corrections 2026-10-30 15:40:57 -07:00
AIAMarketing d944cb0afe test(portal): exercise live-style report buttons and orange markers 2026-10-30 15:40:57 -07:00
AIAMarketing 9d6e0b982e test(portal): cover legacy report labels without class inheritance 2026-10-30 15:40:57 -07:00
AIAMarketing 167277b037 style(portal): restore orange list markers in unlocked views 2026-10-30 15:40:57 -07:00
AIAMarketing db8d90f579 fix(portal): classify sanitized report anchors by visible label 2026-10-30 15:40:57 -07:00
AIAMarketing 16a72caa00 fix(portal): recognize legacy lineup report links as resource buttons 2026-10-30 15:40:57 -07:00
DeCentN2Madness 95c5f229f5 refactor(forms): enable approved Form A placements by default 2026-10-30 15:08:02 -07:00
DeCentN2Madness 55adb79705 fix(forms): close completed drawers and restore portal styling 2026-10-30 14:21:27 -07:00
DeCentN2Madness e97f0ea9b4 feat(portal): add service drawers and employee portal preview 2026-10-30 00:03:21 -07:00
DeCentN2Madness ff80ee516f feat(forms): add isolated Form A consultation testing 2026-10-29 10:21:45 -07:00
DeCentN2Madness 6a5e54e130 docs(forms): adopt two-form consultation architecture 2026-10-28 18:51:42 -07:00
DeCentN2Madness ebc99c0f36 chore(reports): archive superseded reconciliation evidence 2026-10-28 18:45:02 -07:00
DeCentN2Madness 0eb3fcc3f6 feat(forms): gate Form A production embedding 2026-10-28 18:29:32 -07:00
DeCentN2Madness 1a56cd7603 feat(forms): add Form A iframe fallback safeguards 2026-10-28 18:29:32 -07:00
DeCentN2Madness 7cdf209032 test(routing): cover nginx slashless serving template 2026-10-28 17:19:56 -07:00
DeCentN2Madness eecb582665 docs(forms): record Form A privacy verification 2026-10-28 17:19:56 -07:00
DeCentN2Madness 61b2bd0f1e feat(forms): add isolated Form A iframe adapter 2026-10-28 17:19:56 -07:00
AIAMarketing a635a5f55c docs(forms): link Form A runtime evidence from P9-03 plan 2026-10-25 13:37:01 -07:00
AIAMarketing 63806f106c docs(forms): record Form A unique-name and locale verification 2026-10-25 13:37:01 -07:00
DeCentN2Madness f41af1966e fix(routing): enforce slashless public URLs 2026-10-25 13:13:46 -07:00
DeCentN2Madness 7a6cab29db feat(forms): add local Form A presentation preview 2026-10-25 13:04:00 -07:00
DeCentN2Madness b102a061fe fix(landing): remove inactive-form availability copy 2026-10-25 12:52:38 -07:00
DeCentN2Madness 356282f61c fix(landing): align early intervention campaign header 2026-10-25 12:38:03 -07:00
DeCentN2Madness ce17728e0b docs(phase10): record technical QA and release readiness 2026-10-21 23:02:35 -07:00
DeCentN2Madness 704c8d27c9 fix(phase10): harden responsive layouts and release validation 2026-10-21 23:02:25 -07:00
DeCentN2Madness d20372fe33 feat(phase9): isolate forms and counters for nonproduction 2026-10-21 23:02:13 -07:00
DeCentN2Madness e874b26bb9 docs(forms): adopt new Jotform form architecture 2026-10-21 20:31:08 -07:00
DeCentN2Madness 08612d97e6 fix(landing): reconcile inactive forms and release copy 2026-10-21 20:31:01 -07:00
DeCentN2Madness f98576f3ae feat(landing): integrate campaign and early intervention pages 2026-10-20 17:50:56 -07:00
DeCentN2Madness 537f9864a0 docs(forms): record P9-03 Jotform integration contract and inventory 2026-10-18 13:30:46 -07:00
DeCentN2Madness 59911eb929 fix(a11y): reconcile responsive layouts and multilingual UI 2026-10-15 12:18:44 -07:00
DeCentN2Madness 8e64d32209 feat(i18n): reconcile multilingual pages and shared forms 2026-10-13 23:01:38 -07:00
DeCentN2Madness b5bc95bc2b feat(library): complete multilingual content parity reconciliation 2026-10-13 14:18:24 -07:00
DeCentN2Madness a699d467f1 feat(i18n): reconcile multilingual navigation and RTL rendering 2026-10-10 20:15:25 -07:00
DeCentN2Madness 8192ea71c4 feat(seo): reconcile URLs and author page-one redirects 2026-10-11 00:43:45 +00:00
DeCentN2Madness 8646792d46 feat(library): add multilingual author archives and linked bylines 2026-10-10 00:17:25 -07:00
AIAMarketing 0957c06a18 docs(migration): add living handoff after Phase 6B.2 2026-10-09 20:15:34 -07:00
DeCentN2Madness 6f5ac3c0d2 feat(library): add static pagination and page-one redirects 2026-10-09 20:00:26 -07:00
DeCentN2Madness b20c253383 feat(library): implement multilingual static search 2026-10-09 19:26:58 -07:00
DeCentN2Madness 76a035424d docs(migration): propose Phase 6A Library architecture 2026-10-09 12:31:25 -07:00
DeCentN2Madness 34d5394b3c fix(content): reconcile published team roster and assets 2026-10-09 10:40:08 -07:00
DeCentN2Madness bc399b43b6 feat(content): reconcile homepages and restore HSA/FSA section 2026-10-08 23:23:23 -07:00
DeCentN2Madness 051fb7c108 fix(content): reconcile service eligibility and consultation pages 2026-10-08 20:43:25 -07:00
DeCentN2Madness 4079156776 feat(seo): add validated article and FAQ structured data 2026-10-08 17:38:06 -07:00
413 changed files with 90404 additions and 1583 deletions

No files matched your search

+3
View File
@@ -58,3 +58,6 @@ temp/
.DS_Store
Thumbs.db
Desktop.ini
# Private portal collection, mappings and ciphertext; never a public asset source.
/www/private/employee-portal/
+29
View File
@@ -82,6 +82,35 @@ sandboxed command-line tools may fail HTTPS certificate verification. Do not
disable certificate verification for package installation or sensitive
retrievals; use live web search or review the retrieval from the host instead.
## Optional local browser environment
The repository now provides a Linux-only `browser` development shell, separate
from the default content-editing shell. In a normal host terminal, from the
repository root:
```sh
nix --extra-experimental-features "nix-command flakes" develop .#browser
```
It supplies a lockfile-matched Playwright driver, Chromium, headless shell and
font configuration. New processes launched inside this shell inherit
`PLAYWRIGHT_MODULE` and `PLAYWRIGHT_BROWSERS_PATH`; existing sessions do not.
For a guarded real-page smoke test, run from `www`:
```sh
TMPDIR=/tmp npm run build
TMPDIR=/tmp node tools/playwright-smoke.mjs
```
Preview and browser run in the same process environment, avoiding dependence on
remote MCP transport or cross-execution loopback access. All non-loopback and
non-GET/HEAD browser requests are blocked. Results/screenshots stay in `/tmp`.
The tool does not grant access to files or sockets denied by the autonomous
profile. If Nix realization, Chromium startup or loopback access is denied, keep
that result as an environment limitation and use the normal host terminal;
do not weaken TLS, identity, signing or sandbox configuration. No global MCP
configuration or launcher permissions were changed for this setup.
## Git limitation
Codex always protects `.git` recursively in its `workspace-write` sandbox.
+32 -4
View File
@@ -16,9 +16,10 @@
function: nixpkgs.lib.genAttrs supportedSystems (system: function nixpkgs.legacyPackages.${system});
in
{
devShells = forAllSystems (pkgs: {
default = pkgs.mkShell {
packages = with pkgs; [
devShells = forAllSystems (
pkgs:
let
developmentPackages = with pkgs; [
nodejs_24
git
curl
@@ -27,8 +28,35 @@
fd
python3
];
in
{
default = pkgs.mkShell { packages = developmentPackages; };
}
// pkgs.lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
# Keep driver and browser revisions paired through the existing lockfile.
# Opt-in so ordinary content editing does not require browser downloads.
browser = pkgs.mkShell {
packages = developmentPackages ++ [ pkgs.playwright-driver ];
PLAYWRIGHT_MODULE = "${pkgs.playwright-driver}/index.mjs";
PLAYWRIGHT_BROWSERS_PATH = pkgs.playwright-driver.selectBrowsers {
withFirefox = false;
withWebkit = false;
withFfmpeg = false;
};
});
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "1";
# Nix supplies browser libraries via patched runtime paths, not apt.
PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS = "true";
FONTCONFIG_FILE = pkgs.makeFontsConf {
fontDirectories = with pkgs; [
dejavu_fonts
liberation_ttf
noto-fonts
];
};
ASTRO_TELEMETRY_DISABLED = "1";
};
}
);
formatter = forAllSystems (pkgs: pkgs.nixfmt);
};
+14
View File
@@ -1,2 +1,16 @@
PUBLIC_AIA_API_BASE=https://api.azinstitute4autism.com
PUBLIC_COUNTERS_MODE=off
PUBLIC_COUNTERS_LIVE_APPROVED=false
PUBLIC_COUNTERS_MOCK_RESULT=success
# Optional override only: absent/empty means live on exactly 16 approved routes.
# PUBLIC_AIA_FORMS_MODE=off
# PUBLIC_AIA_FORMS_MODE=mock
PUBLIC_AIA_FORMS_MOCK_RESULT=success
# Explicit, local-only Form A meeting preview; requires PUBLIC_AIA_FORMS_MODE=mock.
PUBLIC_AIA_FORM_A_PREVIEW=false
PUBLIC_ALLOW_INDEXING=false
# Employee portal ciphertext is an opt-in local compatibility preview only.
# Never supply a passphrase through environment variables or build arguments.
AIA_PORTAL_LOCAL_PREVIEW_APPROVED=false
# AIA_PORTAL_CIPHERTEXT_FILE=/owner-controlled/private/ciphertext.json
+110 -10
View File
@@ -26,7 +26,7 @@ edits. Stop it with `Ctrl+C`.
Requirements:
- Node.js 20.19 or newer; the Nix shell currently supplies Node.js 22
- Node.js 22.12 or newer (see `package.json`); the Nix shell supplies Node.js 24
- npm
This repository also has a Nix development shell at the repository root:
@@ -38,6 +38,40 @@ cd www
npm install
```
### Local Playwright environment (Linux)
From the repository root, enter the opt-in browser shell:
```sh
nix --extra-experimental-features "nix-command flakes" develop .#browser
cd www
TMPDIR=/tmp npm run build
TMPDIR=/tmp node tools/playwright-smoke.mjs
```
The existing `flake.lock` pairs the Nix Playwright driver and Chromium/headless
shell. `PLAYWRIGHT_MODULE` points directly to that driver; `PLAYWRIGHT_BROWSERS_PATH`
selects its matching browsers. Fontconfig supplies Latin/Arabic fallback fonts.
The ordinary development shell and npm dependencies remain unchanged. This
browser shell is offered on Linux; the existing Darwin development shell is
unchanged. Do not run `npx playwright install` or mix an unrelated npm Playwright
version with these browser revisions.
The smoke test starts Astro preview and Chromium in the **same execution** on an
ephemeral `127.0.0.1` port. It blocks external and non-GET/HEAD requests, loads the
real Spanish privacy and Library pages, verifies staging robots/title/H1, captures
two full-page screenshots in a new `/tmp/aia-playwright-smoke-*` directory, and
closes browser/preview. It does not submit forms or exercise production APIs.
Success establishes browser transport only, not Phase 8 visual or human acceptance.
Use the [Phase 8 guarded browser procedure](reports/phase-8-host-browser-verification-2026-10-14.md)
for full review. Entering the Nix shell does not repair an already-running remote
MCP transport or relax sandbox permissions. If the autonomous environment cannot
access the Nix store, trusted certificates, sockets or browser runtime files, run
the same smoke test from the host terminal. Do not disable TLS verification or
bypass the sandbox. The Nix environment needs host validation before browser
availability can be claimed.
Copy the example environment file when testing the like/view counter or staging
SEO behavior:
@@ -354,14 +388,30 @@ benefits
skills
insurance
esa
hsaFsa (optional; English only where published)
financialHelp
process
director
testimonials
logos (optional)
```
Keep homepage copy in those named blocks so the page remains easy to scan in
Front Matter CMS and VS Code. `src/content.config.ts` validates the structure.
`hsaFsa` uses `heading`, `body`, `image`, and `imageAlt`; omit the whole block
where no section is published. It renders between ESA and financial help.
`logos.items` holds `file`/`alt` pairs after testimonials. Process steps accept
an optional `href`; use an existing intake route and section ID in the same
language. Steps without a destination remain plain content.
### Edit The Team Page
The English Team page uses the validated `team:` frontmatter block in
`src/content/pages/en/team.md`. That block is the single source for the intro,
ordered clinical groups, ABA care team, member names/roles/images, and careers
content. The Markdown body contains no second roster. Update the structured
frontmatter rather than hardcoding people in `TeamPage.astro`; image filenames
refer to `public/assets/images`.
### Images And Downloads
@@ -474,12 +524,49 @@ import FAQAccordion from '../../../components/FAQAccordion.astro';
```
Edit the component's `label`, `heading`, and `items` data in the post. Keep
`answer` as plain text for JSON-LD and `answerHtml` as the matching visible
answer. Shared FAQ markup, styling, interaction, and schema generation live in
`src/components/FAQAccordion.astro`.
`answer` and `answerHtml` consistent. JSON-LD derives its answer text from the
actual visible `answerHtml` when supplied, otherwise from the rendered `answer`
fallback. Shared FAQ markup, styling, interaction, and schema generation remain
in `src/components/FAQAccordion.astro`, using `src/utils/structured-data.ts`.
The standalone FAQ page passes its rendered Markdown/MDX slot as `sourceHtml`
to the same component. Its server schema describes the direct H3 questions and
following answer nodes that the existing browser code turns into accordions.
Runtime-only sources without server content emit no invented FAQ schema. Do
not mix `items` with `sourceSelector`. Duplicate questions, multiple schema
producing accordions on one page, empty answers and conflicting canonical
props fail validation; consolidate questions into one accordion per page.
### Article and FAQ Structured Data
Article JSON-LD uses the existing SEO `title`, description, featured image,
language, `date`, optional `updatedDate`, and the exact locale/slug match in the
authors collection. Dates use calendar-day precision; article/card bylines
format that day in UTC to avoid shifting it on the build host. Missing
modification dates are omitted. Missing or ambiguous author references fail validation.
No author archive URL or publisher is invented. `displayH1` does not change
the schema headline. No new frontmatter fields are required.
BlogPosting and FAQPage emission reuse the manifest's `sitemapEligible` record
gate: drafts, noindex records and external-canonical records are excluded.
This gate is independent of the build's global indexing switch, so staging
can exercise schema while retaining its global noindex, empty sitemap and
absent hreflang. The existing site organization block remains unchanged.
These schemas describe the rendered local records; they do not certify that
older article dates or FAQ answers have been reconciled with production.
Phase 6C drift observations and validation results are recorded in
`reports/migration-summary.md`. Run `npm run test:seo` and
`npm run test:publication`, and validate both build modes before publication.
## Reports And Utilities
For the current migration checkpoint, next Codex phase, ratified decisions,
and outstanding cutover blockers, begin with the
**[living session handoff](reports/SESSION_HANDOFF.md)**. Update that short
handoff at each accepted milestone transition; detailed historical evidence
remains in `reports/migration-summary.md`.
Migration reports are stored in `reports/`.
Useful commands:
@@ -495,12 +582,25 @@ The live crawl is optional and may fail in restricted network environments.
## Forms
Forms are intentionally static and do not submit anywhere. Before production:
As of the owner decision on 2026-10-30, `npm run dev` and `npm run build`
use live Jotform Form A on exactly 16 approved placements: 10 immediate frames
and six deferred bilingual service drawers. No Form A flags are required.
Public development-host forms are owner-authorized. This does not authorize cutover.
1. Select a form backend.
2. Connect the forms.
3. Add spam protection.
4. Test validation, confirmation, and failure states.
Use `PUBLIC_AIA_FORMS_MODE=off npm run build` for an offline artifact, or
`PUBLIC_AIA_FORMS_MODE=mock npm run dev` for synthetic fixtures. Missing/empty
mode means live; obsolete `isolated-test` and other invalid values produce an
explicit configuration error. Remove old approval/environment variables from
local settings. Indexing is independent of forms; counters remain off by default.
See the [current Form A guide](integrations/jotform/README.md) for the exact
registry, safeguards, rollback and owner acceptance requirements. Form C remains
inactive. Employee-portal private input retains its own separate gates.
Verify matching output with
`node tools/phase10-artifact-verify.mjs --mode=staging --forms=live`;
use `--mode=indexing` for indexing output and `--forms=off` or `--forms=mock`
for those explicit builds. No actual submissions run in automated tests.
### Google Ads consultation-form conversion handoff
@@ -510,7 +610,7 @@ instructions are in
This is documentation only: **do not install Google tags or conversion snippets**
on health-service pages or turn on enhanced conversions until AIA's
privacy/HIPAA and advertising-policy review explicitly approves the complete
data flow. Count conversions only after the form API confirms success.
data flow. Any future measurement needs separately approved success and privacy semantics; the former API-success premise is historical and no tracking is active.
## Troubleshooting
+1
View File
@@ -49,6 +49,7 @@
"pageBundle": false,
"fields": [
{ "title": "Name", "name": "name", "type": "string", "required": true },
{ "title": "Display name (published heading/byline)", "name": "displayName", "type": "string" },
{ "title": "Slug", "name": "slug", "type": "string", "required": true },
{ "title": "Description", "name": "description", "type": "string" },
{ "title": "Avatar", "name": "avatar", "type": "image" },
+144
View File
@@ -0,0 +1,144 @@
# Employee portal compatibility and private migration
Recorded 2026-10-30. Browser-side shared-code decryption is approved only for
local compatibility development. It is not authentication, individual revocation,
a secure session or a HIPAA compliance determination. Resources need separate
server authorization before cutover.
## Source and private collection
Read-only legacy footer source:
`/home/alice/projects/wrk/aia/local-archives/aia-employee-portal-hubspot-footer-source.txt`.
The original stays outside Git as rollback evidence. No access code was available
to the agent. The exact resource count and real content compatibility remain
unverified. Do not infer the earlier approximate 43 links as a measured count.
From `www`, in the owner's private interactive terminal:
```sh
node tools/employee-portal-migrate.mjs collect \
/home/alice/projects/wrk/aia/local-archives/aia-employee-portal-hubspot-footer-source.txt
```
Enter each legitimate view code at its hidden prompt. Never place codes in
arguments, environment variables, shell history or reports. The utility checks
both streams, keeps plaintext in memory, and collects only referenced `/hubfs/`
resources from the verified source origin. Other origins require explicit
review/code allowlisting; redirects are bounded and never inherit credentials.
No Jotform, Google or other vendor forms are fetched.
Private output is `private/employee-portal/`: directories 0700, manifests and
binary resources 0600. This exact subtree is gitignored and outside Astro's
public directory. Filenames are SHA-256 hashes of source URLs, independently
verified by content hashes. The manifest retains original references, labels,
view membership, MIME, bytes, status and delivery/classification decisions.
All new resources default to UNRESOLVED. Publicly reachable does not mean public
approved. Resuming verifies an existing file's content hash; mismatches are not
overwritten. HTML error documents, executable responses, invalid known signatures,
redirects outside approved destinations and resources over 50 MiB are rejected.
The first pass allows only the verified site origin. If a legitimate `/hubfs/`
response redirects to a HubSpot CDN, inspect that exact HTTPS origin first, then
add its origin to the private manifest's `approvedOrigins` list and rerun. Never
approve a redirect based only on a failed download or a broadly shared vendor
domain. Failures remain private review items. The utility prints counts only.
Before every artifact transfer, verify that only `dist` is copied and that it
contains no private manifest, document or real ciphertext unless that ciphertext
has separately been authorized for the local preview. Never archive the whole
working directory as a deployable artifact.
## Approved rewriting
The owner classifies records as PUBLIC-APPROVED, STAFF-INTERNAL,
MANAGEMENT-INTERNAL or UNRESOLVED in the private manifest. Set `deliveryPath`,
`rewriteApproved`, `destinationImplemented`, `destinationVerified`, and (for
internal documents) `destinationAccessControlled` only with actual evidence.
The utility does not create those destinations or infer their approval.
```sh
node tools/employee-portal-migrate.mjs rewrite \
/home/alice/projects/wrk/aia/local-archives/aia-employee-portal-hubspot-footer-source.txt
```
It reauthenticates both views, changes approved quoted href/src attributes only,
preserves unrelated HTML/labels, and re-encrypts with fresh salts and IVs. It
verifies round-trip decryption and distinct codes before writing new ciphertext
with exclusive filenames. The original source is untouched. CSS/srcset mappings
require separate review and are rejected rather than silently rewritten.
Unresolved links retain their original destination as a recorded dependency,
not a claim of verified destination health. A changed manifest alone never
changes links in the encrypted stream.
## Local preview and content safety
Use a private ciphertext file generated by `collect` or `rewrite`:
```sh
AIA_PORTAL_LOCAL_PREVIEW_APPROVED=true \
AIA_PORTAL_CIPHERTEXT_FILE=/absolute/private/ciphertext-TIMESTAMP.json \
PUBLIC_AIA_FORMS_MODE=off PUBLIC_ALLOW_INDEXING=false \
npm run dev -- --host 127.0.0.1
```
The 2026-10-30 revision removes dependence on the retired Form A environment role. Form mode is independent; `off` above is optional for local testing and cannot grant portal approval. The page defaults to locked/unavailable without its own explicit approval and valid private input. Indexing
builds cannot include it. The codes never go to a server, storage or URL. No
native form submits; Enter and Unlock use local WebCrypto. Only the matching
stream is displayed; refresh or leaving the page locks it again.
The passive DOM renderer preserves headings, lists, text, tables and safe
HTTPS/mailto/tel links, with no referrer on links. It rejects scripts, inline
handlers, styles, media, embedded forms and unknown tags. Real portal markup
has not been decrypted or reviewed; any removed behavior must be reviewed with
the owner before claiming fidelity. It must not silently become arbitrary
script execution. No real encrypted stream or plaintext is in Git.
### Scoped presentation correction, 2026-10-30
The renderer now maps only `hs-button`, `content-button`, or
`portal-resource-button` anchor tokens, or exact inline AIA orange background
colors (`#ffbd59` / `#ff914d`), to the local `portal-resource-button` class.
It does not copy the original style or arbitrary classes. These are narrow
compatibility candidates, not a claim that encrypted real views have been
inspected. HTTPS/mailto/tel links retain the existing safe URL checks; contact
links receive a local dark-orange accent for readable contrast. Table scope
and bounded numeric row/column spans are preserved. All other executable or
unapproved attributes remain removed.
The follow-up styling correction recognizes the live portal's `Daily Lineup
Report` and `Monthly Lineup Report` link labels, even when their original
HubSpot classes or inline fills are absent. It maps only those links to the
existing orange resource-button style; arbitrary anchors remain ordinary links.
Both unlocked views now use the site's orange accent for list-item markers.
The source classes and styles still do not reach the passive DOM.
### Staff resources and Management Templates, 2026-11-01
The owner observed that the non-management (general-staff) portal still lost
HubSpot's resource-button presentation. After **sanitizing** the decrypted DOM,
a headed `Management Templates` section identifies the general-staff resource
view. Valid HTTP(S) resource links in that view receive only the local
`portal-resource-button` class; `mailto:` and `tel:` retain contact-link
styling. Neither destination validation nor removed legacy classes/styles,
scripts, media or HTML attributes are relaxed.
The `Management Templates` unordered list receives a local
`portal-template-grid` class: two columns at desktop widths (768px+),
one column on smaller screens. Semantic list order and keyboard tab order
are retained, with responsive full-width buttons. This is a presentation
change only: it does not infer or approve employee resource access.
Synthetic staff/management browser fixtures check the distinction and
responsive columns. The actual decrypted staff source remains private;
owner should confirm layout and links in the local preview before merging.
Scoped typography, spacing, lists, table rules and keyboard focus apply to both
unlocked streams. Synthetic staff/management fixtures exercise these mappings
at 320/390/768/1440px. Owner must inspect the real views privately to confirm
legacy button recognition and source fidelity; if a different class is used,
provide sanitized class semantics rather than decrypted content or credentials.
Before owner acceptance: validate two real view codes privately, inspect every
resource/category, responsive directories, focus, link semantics and sanitization
impact. Check wrong-code feedback, keyboard unlock, no-JS explanation and refresh.
Production must use a separately reviewed runtime ciphertext delivery mechanism;
this batch intentionally provides only a gated local build input. Browser-delivered
ciphertext is publicly downloadable by anyone able to reach that preview.
+144
View File
@@ -0,0 +1,144 @@
# AIA Form A Jotform styling and conditional-button guide
This directory contains the accepted CSS backup and integration guidance for AIA Form A. [`aia-form-a.css`](./aia-form-a.css) is intended for Jotform Classic Forms' **Form Designer → Styles → Inject Custom CSS** under owner-controlled configuration review. The existing repository CSS is the accepted backup; do not regenerate it from Astro styles.
The CSS translates the existing AIA form treatment: Rubik typography, blue labels and text, `#fcf9f5` inputs with `#edeef3` borders, the `#ffbd59` filled button, the `#ff914d` hover/focus border, four-pixel corners, visible validation errors, and strong keyboard focus. The Astro page supplies the heading, introduction, privacy-policy link, and surrounding card. The stylesheet therefore removes the Jotform surface rather than adding another header, footer, or nested card.
The selectors target Jotform Classic Forms identifiers such as `#form`, `.form-all`, `.form-line`, `.form-label`, `.form-sub-label`, `.form-required`, `.form-textbox`, `.form-dropdown`, `.form-textarea`, `.form-error-message`, and `.form-submit-button`. Jotform's final generated DOM must be checked in the account before relying on pixel-level parity. The stylesheet does not hide required indicators, error messages, honeypots, or focus outlines, and it does not request fonts or other external assets.
The current Builder theme reconciliation adds narrowly scoped `!important` declarations to the outer surface, labels, inputs, and submit-button treatments that Jotform's generated theme otherwise overrides. Error, required-indicator, and focus rules remain visible and are deliberately not reset. The account owner must still confirm the final generated DOM and rendered form after any Jotform theme or field change.
## Installation and comparison
1. Open the approved Form A in AIA's HIPAA-enabled Jotform account. Do not change its fields or settings from this repository workflow.
2. Preserve the approved account configuration; account changes and site cutover require their separate authorization.
3. Paste the contents of `aia-form-a.css` into Jotform's custom CSS area.
4. Compare the Jotform preview with the Astro Form A mock at 390px and 1440px. Check the form surface, label rhythm, input height, button fill, outlined hover/focus state, error state, and mobile reflow.
5. Check both English and Spanish configurations. Confirm translated labels, required indicators, validation messages, confirmation copy, and the accessible iframe title supplied by the parent Astro integration.
6. Test the form in a real embedded iframe and on the direct hosted-form fallback. Confirm the iframe has a practical mobile height, does not create horizontal overflow, and does not trap keyboard focus.
The optional Astro meeting preview requires `PUBLIC_AIA_FORMS_MODE=mock` and `PUBLIC_AIA_FORM_A_PREVIEW=true` in a non-indexing build. It does not load Jotform and is not a live submission test.
## Current Form A operation — superseding decision, 2026-10-30
The owner authorizes real Form A on the publicly reachable development host
`https://aia.web3app.dev/`. Normal development and static builds use **live** Form A
without environment flags. This intentionally supersedes the former isolated-test
and seven-route production approval gates. It is not site-cutover authorization.
From `www/`:
```sh
npm run dev
npm run build
# Optional offline/restricted artifact:
PUBLIC_AIA_FORMS_MODE=off npm run build
# Optional synthetic fixtures:
PUBLIC_AIA_FORMS_MODE=mock npm run dev
```
`PUBLIC_AIA_FORMS_MODE` is optional; missing/empty means `live`. The only accepted
values are `live`, `off`, and `mock`. Remove obsolete `isolated-test` settings from
local environment files; invalid explicit values stop the build with actionable
guidance. The former live/isolated/consultation/production approvals and form
environment role are removed, with no replacement gates. `PUBLIC_ALLOW_INDEXING`
controls publication independently: both staging and indexing builds use the same
16 placements. Explicit off/mock builds contain no real Form A iframe.
One typed registry in `src/utils/form-integration.ts` fixes every route, locale
and context. No visitor query, referrer, arbitrary URL or option preselection is
forwarded. The only origin/ID is `https://form.jotform.com/262946078314059`.
Every URL has exactly `formContext` and `language` parameters:
| Context | Routes | Loading |
|---|---|---|
| contact | `/contact` (en), `/es/contact` (es) | Immediate, 2 |
| landing | `/lp/aba-therapy`, `/lp/aba-insurance`, `/lp/aba-ahcccs`, `/lp/aba-private-pay`, `/lp/early-intervention` (en) | Immediate, 5 |
| consultation | `/client-consultation` (en), `/es/client-consultation` (es), `/schedule-consultation` (en) | Immediate, 3 |
| consultation | `/aba-therapy`, `/autism-evaluations`, `/learner-social-club` (en), and their `/es/` counterparts (es) | Deferred, 6 |
The context is presentation-only. Physical Form B is retired. Form C and
`/referrals` remain inactive; other routes cannot acquire Form A by setting a mode.
The typed future Academy service copy does not publish another page.
Live service drawers open at four seconds OR 50% scroll, canceling the unused
trigger. Dismissal or verified completion sets the existing shared 30-day
suppression timestamp. The existing service CTA overrides automatic suppression;
without JavaScript it remains a normal consultation-page link. Jotform loads only
when the drawer opens. Off mode never automatically opens an inactive drawer.
Mock mode retains the existing synthetic fixture workflow.
A verified `submission-completed` message must match the exact approved origin,
actual activated/open iframe window, approved form ID and action. It displays a
localized acknowledgment, waits five seconds, then uses the existing slide-out.
Duplicate messages cannot restart the countdown. Manual close/navigation cancels
it; suppression remains. Deliberate reopening after completion creates a fresh
iframe. Provider-envelope acceptance still requires the owner-controlled real
submission check; synthetic browser messages are not that acceptance.
The shared iframe preserves fixed responsive heights, accessible EN/ES titles,
`referrerpolicy="no-referrer"`, and
`sandbox="allow-forms allow-scripts allow-same-origin"`. No popup, top-navigation,
camera, microphone, payment or geolocation permissions are added. The hosted
fallback is outside the iframe and hidden without layout space until a 15-second
missing-load timeout. Late load hides it; disposal cancels timers. A localized
`noscript` fallback remains. Load does not prove application health or submission.
No helper script, cross-origin DOM inspection, arbitrary messaging or submission
forwarding is introduced. The official resize handler remains unimplemented and
conditionally acceptable only after its separate security/browser review.
Owner-reported direct EN/ES synthetic acceptance and sampled embedded acceptance
(English contact, Spanish contact and one ABA landing page) remain recorded as
owner evidence. This change does not independently verify Jotform or resolve its
Spanish consultation dropdown discrepancy, runtime telemetry, fluent-language,
screen-reader, final HTTPS-host or operational recipient review.
For form rollback, explicitly set `PUBLIC_AIA_FORMS_MODE=off`, rebuild, verify
`--forms=off`, and use the separately authorized artifact-switch procedure.
Removing that override restores live, so removing settings is **not** rollback.
Do not change the Jotform account as part of an Astro rollback.
Artifact checks (build matching output first):
```sh
node tools/phase10-artifact-verify.mjs --mode=staging --forms=live
# For PUBLIC_ALLOW_INDEXING=true output:
node tools/phase10-artifact-verify.mjs --mode=indexing --forms=live
# For explicit off or mock output, select the matching --forms value.
```
Employee-portal ciphertext remains separately gated by its own approval, private
input and non-indexing preview requirement. Form A modes cannot authorize it.
## Form context and button labels
The current Form A design uses a hidden `formContext` value with fixed, approved values such as `contact` and `landing`. Jotform does not provide a native conditional rule that changes one Submit button's accessible label safely in every context. If owner-approved context-specific labels are required, use multiple native Jotform Submit buttons and Jotform's conditional visibility rules:
- Add one native Submit button for each approved context/language label.
- Show exactly one intended Submit button for the current, validated `formContext`.
- Keep every button a real Jotform Submit control; do not use CSS `::before`/`::after` text as a label.
- Verify that every visible variant submits through the same approved form and preserves the honeypot and validation behavior.
- Make the no-context and invalid-context states fail closed: no ambiguous extra button and no unintended submission path.
- Verify keyboard order, focus visibility, screen-reader names, English/Spanish labels, and mobile layout for every variant.
All five landing routes use Form A's fixed `landing` context. The nine consultation
placements use its fixed `consultation` context. Jotform owns native Submit labels
and conditions. Do not add an external Astro button that attempts to submit a
cross-origin iframe.
## Verification checklist
- [x] Direct English/Spanish Form A language handling, conditional email requirement, synthetic submission and native thank-you were owner-verified; this is not embedded-iframe acceptance.
- [x] Direct staff-notification/autoresponder delivery, generic no-answer/no-PDF content, fixed Reply-To, recipient access/retention, and absent webhooks/integrations were owner-verified for Form A.
- [ ] Exact remaining Form A consultation question properties, choices, conditional routing and availability, plus future Form C configuration, are approved.
- [ ] English and Spanish embedded-iframe labels, validation, confirmation, and button variants are reviewed by fluent-language owners.
- [ ] The hidden honeypot remains present, effective, and excluded from user-facing visual changes.
- [ ] Exactly one native Submit button is visible for every valid context.
- [ ] Invalid or missing context does not expose an unintended submission path.
- [ ] No PHI-bearing answer, PDF, recipient, redirect, webhook, or HTTP POST forwarding is inherited without privacy/security approval.
- [x] Owner-reported embedded synthetic submission and confirmation passed on English contact, Spanish contact and one ABA landing placement; record the exact ABA path in the owner test log before release.
- [ ] All sixteen placements have final responsive, keyboard, screen-reader and fluent-language acceptance, including timeout/fallback and error expansion.
- [ ] Jotform runtime requests, telemetry and cross-origin failure behavior are reviewed with privacy/security owners.
- [ ] No Jotform, Contabo, analytics, advertising, or production API request is made by off/mock builds.
Existing owner-verification scopes remain recorded in the contract/checklist. Outstanding consultation configuration acceptance, runtime/privacy, accessibility, fluent-language and site-release gates remain open. Default-live Form A is owner-authorized; this guide does not authorize Jotform account changes or site deployment.
+252
View File
@@ -0,0 +1,252 @@
/* ==========================================================
AIA FORM A — JOTFORM CUSTOM CSS
Form ID: 262946078314059
Maximum form width: 640px
========================================================== */
/* Document and language selector */
html.supernova,
html.supernova body,
body.supernova {
background: #fff !important;
background-image: none !important;
}
/* Avoid horizontal overflow, including on the thank-you page */
body {
margin: 0 !important;
}
/* Confirmation page styling */
body.thankyou,
body.thankyou #stage {
background: #fff !important;
background-image: none !important;
}
.jfLangDd.jfLangDd--match-form {
padding: 12px 0 !important;
}
/* Form container */
form[id="262946078314059"] {
width: 100% !important;
max-width: 640px !important;
margin: 8px auto !important;
box-sizing: border-box;
}
.form-all {
width: 100% !important;
max-width: 100% !important;
margin: 0 !important;
padding: 0 !important;
background: #fff !important;
border: 0 !important;
box-shadow: none !important;
color: #254080;
font-family: Rubik, Arial, sans-serif;
}
.form-all .form-section {
margin: 0 !important;
padding: 0 !important;
}
/* Field layout */
.form-all .form-line {
margin: 0 !important;
padding: 0 0 21px !important;
background: transparent !important;
border: 0 !important;
}
.form-all .form-input-wide {
margin-top: 0 !important;
padding-top: 0 !important;
}
/* Labels and sublabels */
.form-all .form-label,
.form-all .form-label-left,
.form-all .form-label-right,
.form-all .form-label-top {
color: #254080 !important;
font-size: .875rem;
font-weight: 700;
line-height: 1.35 !important;
margin: 0 0 6px !important;
padding: 0 !important;
}
.form-all .form-sub-label {
color: #254080;
font-size: .75rem;
line-height: 1.3 !important;
margin: 4px 0 0 !important;
padding: 0 !important;
}
.form-all .form-sub-label-container {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.form-all .form-required {
color: #a21c28 !important;
margin-left: .2rem;
visibility: visible;
}
/* Inputs */
.form-all input.form-textbox,
.form-all select.form-dropdown,
.form-all textarea.form-textarea {
background: #fcf9f5 !important;
background-image: none !important;
border: 1px solid #edeef3 !important;
border-radius: 4px !important;
box-shadow: none !important;
box-sizing: border-box;
color: #254080 !important;
font-family: inherit;
font-size: 1rem;
line-height: 1.4;
min-height: 2.75rem;
padding: .55rem .7rem;
max-width: 100%;
}
/* Preserve two-column name fields */
.form-all .form-sub-label-container input.form-textbox {
width: 100% !important;
max-width: 100% !important;
}
/* Full-width phone and email fields */
.form-all
.form-line:is(
[data-type="control_phone"],
[data-type="control_email"]
)
:is(.form-input, .form-input-wide, input.form-textbox) {
width: 100% !important;
max-width: 100% !important;
}
/* Message field */
.form-all textarea.form-textarea {
width: 100% !important;
min-height: 5.5rem !important;
resize: vertical;
}
/* Radio buttons and checkboxes */
.form-all .form-radio-item,
.form-all .form-checkbox-item {
color: #254080;
line-height: 1.4;
margin: 0 .75rem .2rem 0 !important;
padding: 0;
}
.form-all .form-radio,
.form-all .form-checkbox {
accent-color: #254080;
}
/* Submit button and wrapper */
.form-all .jf-form-buttons,
.form-all .form-buttons-wrapper {
box-sizing: border-box;
width: 100% !important;
max-width: 100% !important;
margin: 0 !important;
padding: 0 !important;
background: transparent !important;
border: 0 !important;
}
.form-all .form-submit-button,
.form-all button[type="submit"] {
width: 100%;
box-sizing: border-box;
min-height: 3rem;
padding: .65rem 1.2rem;
background: #ffbd59 !important;
background-image: none !important;
border: 2px solid #ffbd59 !important;
border-radius: 4px !important;
box-shadow: none !important;
color: #254080 !important;
cursor: pointer;
font-family: inherit;
font-size: 1rem;
font-weight: 400;
line-height: 1.4;
text-shadow: none !important;
transition: background .3s linear, border-color .3s linear;
}
.form-all .form-submit-button:hover,
.form-all button[type="submit"]:hover {
background: transparent !important;
border-color: #ff914d !important;
color: #254080 !important;
}
.form-all .form-submit-button:disabled,
.form-all button[type="submit"]:disabled {
cursor: not-allowed;
opacity: .65;
}
/* Keyboard focus */
.form-all input.form-textbox:focus-visible,
.form-all select.form-dropdown:focus-visible,
.form-all textarea.form-textarea:focus-visible,
.form-all input[type="radio"]:focus-visible,
.form-all input[type="checkbox"]:focus-visible,
.form-all .form-submit-button:focus-visible {
outline: 3px solid #115bbd !important;
outline-offset: -3px;
}
/* Validation */
.form-all .form-line-error input.form-textbox,
.form-all .form-line-error select.form-dropdown,
.form-all .form-line-error textarea.form-textarea,
.form-all input.form-validation-error {
border-color: #a21c28 !important;
}
.form-all .form-error-message,
.form-all .form-line-error .form-error-message {
color: #a21c28 !important;
font-size: .8rem;
font-weight: 700;
line-height: 1.4;
margin: .3rem 0 0 !important;
visibility: visible;
}
/* Accessibility: reduced motion */
@media (prefers-reduced-motion: reduce) {
.form-all .form-submit-button,
.form-all button[type="submit"] {
transition: none;
}
}
+72
View File
@@ -0,0 +1,72 @@
# Inactive SOPS/age preparation, 2026-10-30
The owner selected SOPS, age and sops-nix. This directory is a template, not a
host configuration. The development flake remains unchanged. No real recipient,
key, encrypted secret or server user is supplied. No module is deployed.
Official references inspected for this pass:
- [SOPS documentation](https://getsops.io/docs/)
- [sops-nix installation and secret permissions](https://github.com/Mic92/sops-nix)
SOPS encrypts configuration at rest. sops-nix can supply decrypted values at
runtime under `/run/secrets` with explicit owners and modes. This does not make
browser ciphertext or publicly served documents private.
## Owner setup before activation
1. Supply the actual NixOS topology, host flake, deploy user, persisted key
location, backup owner, HTTPS termination and resource-service identity.
2. Pin a reviewed `github:Mic92/sops-nix` input in that host flake; import
`inputs.sops-nix.nixosModules.sops` and the reviewed template. Do not add the
input to the Astro development flake just to evaluate a deployment sketch.
3. The owner generates independent developer/recovery and VPS age identities in
private terminals. Record only public recipients in the reviewed SOPS
creation rule. Use distinct recipients, never a placeholder recipient. Keep
the VPS private identity on persistent root-controlled storage (0600), outside
`/nix/store`, Git, the public static root and CI artifacts.
4. Encrypt the approved credential material using SOPS with both recipients.
Review recipient access, least privilege and an offline recovery copy. SOPS
encrypted files may enter a deployment repository only after owner approval.
5. Set `aia.portalSecrets` options explicitly, then evaluate the complete host
configuration and test decryption on authorized nonproduction infrastructure.
Runtime consumers use the generated `.path`, not Nix evaluation of plaintext.
6. Decide which service reloads after rotation. Rotate application credentials
as well as SOPS recipients when revoking access: rewrapping alone does not
invalidate an already copied password. Test recovery and key restoration.
## Separate staff and management resource authorization
Keep original documents outside Astro `public`, `dist`, release archives and
CDN roots. Proposed delivery namespaces are `/staff-resources/` and
`/management-resources/`; neither is implemented or considered working here.
Use nginx `auth_request` to an approved authorization service or an equivalent
server-enforced policy with individually revocable identities and staff and
management roles. Staff credentials must not authorize management resources;
management access to staff resources must be an explicit policy. Backend file
locations must be internal, inaccessible through static aliases or alternate
paths. Never trust a browser-provided role header.
A separate shared Basic Auth credential file per namespace can be considered
only as an explicitly approved weaker interim model, not identity management or
automatic role inheritance. The template prepares separate secret inputs without
selecting that access model or installing an identity provider.
Use HTTPS, `Cache-Control: private, no-store`, no shared/CDN caching, and
`Referrer-Policy: no-referrer` for protected delivery. Avoid credentials and
sensitive resource paths in access/error logs; review monitoring and backups.
Authorization failures must fail closed, including at proxy/cache boundaries.
Test direct requests, alternate encodings, role crossover and rollback.
## Distinct boundaries and release checks
- SOPS: deployment secrets at rest and controlled runtime access.
- Portal HTML: shared-code browser decryption, offline-guessable access friction.
- Documents: require server authorization even if URLs are encrypted in the UI.
The compatibility preview cannot grant production portal access. Before cutover,
classify every document, implement and verify its delivery destination, rewrite
and re-encrypt links, test two-view separation, rotate shared codes privately,
check the public artifact for private files, and obtain owner/security approval.
Back up encrypted configuration and documents separately from keys; rehearse
restore and rollback. Revoking a static release cannot retract ciphertext or
files already downloaded by visitors. Site cutover is still unauthorized.
+26
View File
@@ -0,0 +1,26 @@
# INACTIVE TEMPLATE. Not imported by the development flake or any deployed host.
# Requires an owner-reviewed sops-nix NixOS module import in the host flake.
{ config, lib, ... }:
let cfg = config.aia.portalSecrets;
in {
options.aia.portalSecrets = {
enable = lib.mkEnableOption "owner-reviewed portal deployment secrets";
encryptedFile = lib.mkOption { type = lib.types.path; description = "SOPS-encrypted YAML only; never a plaintext file"; };
ageKeyFile = lib.mkOption { type = lib.types.str; description = "Private persisted host age key path outside the Nix store"; };
readerUser = lib.mkOption { type = lib.types.str; description = "Approved resource authorization service user"; };
};
config = lib.mkIf cfg.enable {
assertions = [{ assertion = lib.hasPrefix "/" cfg.ageKeyFile && !(lib.hasPrefix "/nix/store/" cfg.ageKeyFile);
message = "The host age identity must be an absolute runtime path outside the Nix store."; }];
sops.defaultSopsFile = cfg.encryptedFile;
sops.age.keyFile = cfg.ageKeyFile;
sops.age.generateKey = false;
sops.age.sshKeyPaths = [];
sops.gnupg.sshKeyPaths = [];
sops.secrets."portal/staff-credentials" = { owner = cfg.readerUser; mode = "0400"; };
sops.secrets."portal/management-credentials" = { owner = cfg.readerUser; mode = "0400"; };
# Consumers reference config.sops.secrets.<name>.path at runtime.
# Do not use builtins.readFile on a decrypted secret, environment.etc.text,
# PUBLIC_* values, or Astro/Vite imports to transport secrets.
};
}
+3
View File
@@ -21,6 +21,9 @@
"test:markdown": "node --test tools/markdown.test.mjs",
"test:publication": "node --experimental-strip-types --test tools/publication.test.mjs",
"test:seo": "node --experimental-strip-types --test tools/seo.test.mjs",
"test:library": "node --experimental-strip-types --test tools/library.test.mjs",
"test:campaign": "node --test tools/campaign.test.mjs",
"verify:campaign": "node tools/campaign-browser.mjs",
"generate:sitemap": "node tools/generate-sitemap.mjs",
"generate:redirects": "node tools/generate-redirects.mjs"
},
@@ -0,0 +1,93 @@
Copyright 2017 The Playfair Display Project Authors (https://github.com/clauseggers/Playfair-Display), with Reserved Font Name "Playfair Display"
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,93 @@
Copyright 2015 The Rubik Project Authors (https://github.com/googlefonts/rubik)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

@@ -0,0 +1 @@
<svg viewBox="113.85996 134.2596 679.2 315.6" xmlns="http://www.w3.org/2000/svg" id="Layer_1" style="max-height: 500px" width="679.2" height="315.6"><defs><style>.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:0px;}.cls-2{fill:#27417f;}.cls-3{fill:#554f62;}.cls-4{fill:#254080;}.cls-5{fill:#aea990;}.cls-6{fill:#f2b85b;}</style></defs><path d="m176.47,162.76l22.18,57.09c.85,2.24,1.83,3.76,2.95,4.54,1.12.79,2.17,1.21,3.14,1.27v1.82c-1.46-.12-3.17-.2-5.14-.22-1.97-.03-3.95-.05-5.95-.05-2.54,0-4.91.01-7.09.05-2.18.03-3.94.11-5.28.22v-1.82c3.09-.12,5.05-.65,5.87-1.59.82-.94.62-2.95-.59-6.04l-16.36-44.17,1.46-1.64-15.09,39.45c-1.09,2.73-1.74,5-1.95,6.82-.22,1.82-.06,3.24.45,4.27.52,1.03,1.41,1.76,2.68,2.18,1.27.43,2.85.67,4.73.73v1.82c-1.82-.12-3.65-.2-5.5-.22-1.85-.03-3.59-.05-5.23-.05-1.46,0-2.74.01-3.86.05-1.12.03-2.14.11-3.05.22v-1.82c1.27-.3,2.55-1.06,3.82-2.27,1.27-1.21,2.48-3.27,3.63-6.18l21.09-54.45h3.09Zm9.54,38.54v1.82h-27.08l.91-1.82h26.18Z" class="cls-2"/><path d="m235.82,179.3c1.76,0,3.26.37,4.5,1.09,1.24.73,2.18,1.65,2.82,2.77.64,1.12.96,2.38.96,3.77,0,1.76-.53,3.26-1.59,4.5-1.06,1.24-2.47,1.86-4.23,1.86-1.51,0-2.8-.46-3.86-1.36-1.06-.91-1.59-2.15-1.59-3.73,0-1.33.35-2.47,1.04-3.41.7-.94,1.5-1.68,2.41-2.22-.6-.49-1.33-.7-2.18-.64-1.64.06-3.15.59-4.55,1.59-1.39,1-2.58,2.27-3.54,3.82-.97,1.54-1.73,3.19-2.27,4.95-.54,1.76-.82,3.4-.82,4.91v20.91c0,2.97.82,4.96,2.46,5.95,1.63,1,3.91,1.5,6.81,1.5v1.91c-1.39-.06-3.38-.14-5.95-.22-2.58-.09-5.28-.14-8.14-.14-2.18,0-4.36.05-6.54.14-2.18.09-3.85.16-5,.22v-1.91c2.37,0,4.04-.45,5.05-1.36,1-.91,1.5-2.64,1.5-5.18v-28.54c0-2.73-.46-4.74-1.36-6.04-.91-1.3-2.64-1.95-5.18-1.95v-1.91c1.94.18,3.82.27,5.64.27,2.06,0,3.99-.11,5.77-.32,1.78-.22,3.44-.53,4.95-.96v10.46c.73-1.76,1.7-3.45,2.91-5.09,1.21-1.63,2.66-2.98,4.36-4.04,1.7-1.06,3.58-1.59,5.64-1.59Z" class="cls-2"/><path d="m264,179.57v39.45c0,2.54.5,4.27,1.5,5.18,1,.91,2.68,1.36,5.05,1.36v1.91c-1.03-.06-2.62-.14-4.77-.22-2.16-.09-4.35-.14-6.59-.14s-4.38.05-6.59.14c-2.21.09-3.86.16-4.96.22v-1.91c2.37,0,4.04-.45,5.05-1.36,1-.91,1.5-2.64,1.5-5.18v-28.54c0-2.73-.46-4.74-1.36-6.04-.91-1.3-2.64-1.95-5.18-1.95v-1.91c1.94.18,3.82.27,5.64.27,2.06,0,3.99-.11,5.77-.32,1.78-.22,3.44-.53,4.95-.96Zm-5.45-21.91c1.88,0,3.45.59,4.73,1.78,1.27,1.18,1.91,2.65,1.91,4.41s-.64,3.23-1.91,4.41c-1.27,1.18-2.85,1.77-4.73,1.77s-3.45-.59-4.73-1.77c-1.27-1.18-1.91-2.65-1.91-4.41s.64-3.23,1.91-4.41c1.27-1.18,2.85-1.78,4.73-1.78Z" class="cls-2"/><path d="m312.54,180.12l-25.09,45.99h8.18c2.42,0,4.58-.49,6.45-1.46,1.88-.97,3.42-2.57,4.64-4.81,1.21-2.24,1.94-5.21,2.18-8.91h2.09c0,4.06.03,7.45.09,10.18s.15,4.97.27,6.73c-2.72-.12-5.54-.22-8.45-.27-2.91-.06-5.79-.09-8.63-.09-3.09,0-6.23.05-9.41.14-3.18.09-6.23.2-9.14.32l25.09-45.99h-8.36c-2.6,0-4.85.5-6.73,1.5-1.88,1-3.35,2.61-4.41,4.82-1.06,2.21-1.74,5.17-2.05,8.86h-2c0-4.12-.03-7.51-.09-10.18-.06-2.66-.15-4.91-.27-6.73,2.67.12,5.45.22,8.36.27,2.91.06,5.82.09,8.73.09s6.14-.05,9.32-.14c3.18-.09,6.26-.2,9.23-.32Z" class="cls-2"/><path d="m340.81,179.3c4.06,0,7.66.85,10.82,2.55,3.15,1.7,5.66,4.36,7.55,8,1.88,3.64,2.81,8.39,2.81,14.27s-.94,10.62-2.81,14.23c-1.88,3.61-4.4,6.24-7.55,7.91-3.15,1.67-6.76,2.5-10.82,2.5s-7.6-.83-10.82-2.5c-3.21-1.67-5.74-4.3-7.59-7.91-1.85-3.61-2.77-8.35-2.77-14.23s.92-10.63,2.77-14.27c1.85-3.64,4.38-6.3,7.59-8,3.21-1.7,6.82-2.55,10.82-2.55Zm0,1.82c-3.15,0-5.73,1.8-7.73,5.41-2,3.61-3,9.47-3,17.59s1,13.95,3,17.5c2,3.55,4.58,5.32,7.73,5.32s5.65-1.77,7.68-5.32c2.03-3.55,3.05-9.38,3.05-17.5s-1.02-13.98-3.05-17.59c-2.03-3.61-4.59-5.41-7.68-5.41Z" class="cls-2"/><path d="m400.07,179.3c2.42,0,4.41.32,5.95.96,1.55.64,2.83,1.5,3.86,2.59,1.09,1.15,1.86,2.64,2.32,4.46.45,1.82.68,4.27.68,7.36v24.36c0,2.54.5,4.27,1.5,5.18,1,.91,2.68,1.36,5.05,1.36v1.91c-1.03-.06-2.64-.14-4.82-.22-2.18-.09-4.33-.14-6.45-.14s-4.11.05-6.14.14c-2.03.09-3.56.16-4.59.22v-1.91c2.06,0,3.51-.45,4.37-1.36.85-.91,1.27-2.64,1.27-5.18v-26.9c0-1.76-.15-3.35-.45-4.77-.31-1.42-.94-2.58-1.91-3.45-.97-.88-2.43-1.32-4.37-1.32-2.24,0-4.23.64-5.95,1.91-1.73,1.27-3.09,3.02-4.09,5.23-1,2.21-1.5,4.68-1.5,7.41v21.91c0,2.54.44,4.27,1.32,5.18.88.91,2.32,1.36,4.32,1.36v1.91c-.97-.06-2.44-.14-4.41-.22-1.97-.09-4.01-.14-6.14-.14s-4.21.05-6.45.14c-2.24.09-3.91.16-5,.22v-1.91c2.37,0,4.04-.45,5.05-1.36,1-.91,1.5-2.64,1.5-5.18v-28.54c0-2.73-.46-4.74-1.36-6.04-.91-1.3-2.64-1.95-5.18-1.95v-1.91c1.94.18,3.82.27,5.64.27,2.06,0,3.99-.11,5.77-.32,1.78-.22,3.44-.53,4.95-.96v9.91c1.57-3.76,3.74-6.39,6.5-7.91,2.75-1.51,5.68-2.27,8.77-2.27Z" class="cls-2"/><path d="m436.06,228.11c-2.54,0-4.73-.49-6.54-1.46-1.82-.97-3.18-2.3-4.09-4-.91-1.69-1.36-3.63-1.36-5.82,0-2.67.6-4.83,1.82-6.5,1.21-1.67,2.77-3.02,4.69-4.04,1.91-1.03,3.94-1.89,6.09-2.59,2.15-.7,4.18-1.36,6.09-2,1.91-.64,3.48-1.38,4.73-2.22,1.24-.85,1.86-1.97,1.86-3.36v-6.18c0-2.18-.35-3.93-1.05-5.23-.7-1.3-1.63-2.22-2.81-2.77-1.19-.55-2.59-.82-4.23-.82-1.4,0-2.88.2-4.46.59-1.57.39-2.81,1.17-3.72,2.32,1.33.37,2.44,1.08,3.32,2.14.88,1.06,1.32,2.38,1.32,3.95,0,1.7-.56,3.03-1.68,4s-2.53,1.45-4.Line truncated

After

Width:  |  Height:  |  Size: 33 KiB

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" fill="none" stroke="#E5AE56" stroke-width="2">
<path d="m67 13 2-10h22l2 10 13 5 9-6 16 16-6 9 5 13 10 2v22l-10 2-5 13 6 9-16 16-9-6-13 5-2 10H69l-2-10-13-5-9 6-16-16 6-9-5-13-10-2V52l10-2 5-13-6-9 16-16 9 6Z" transform="translate(0 17)"/>
<circle cx="80" cy="80" r="26"/>
</svg>

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

@@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="450" viewBox="0 0 800 450">
<title>نموذج المقدمة والسلوك والنتيجة اللاحقة</title>
<image href="data:image/webp;base64,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 truncated
<rect width="800" height="64" fill="#fbf8ef" />
<g fill="#082f55" font-family="Arial, sans-serif" font-size="25" font-weight="700" text-anchor="middle" direction="rtl">
<text x="132" y="43">المُقدِّمة</text>
<text x="400" y="43">السلوك</text>
<text x="668" y="43">النتيجة اللاحقة</text>
</g>
<g fill="none" stroke="#082f55" stroke-linecap="round" stroke-linejoin="round" stroke-width="4">
<path d="M235 37h60m-12-11 12 11-12 11" />
<path d="M507 37h57m-12-11 12 11-12 11" />
</g>
<rect x="381" y="190" width="50" height="24" rx="3" fill="#fff" opacity=".98" />
<text x="406" y="206" fill="#1f2933" font-family="Arial, sans-serif" font-size="9" text-anchor="middle" direction="rtl">المزيد</text>
<rect x="611" y="190" width="65" height="24" rx="3" fill="#fff" opacity=".98" />
<text x="643" y="205" fill="#1f2933" font-family="Arial, sans-serif" font-size="7" text-anchor="middle" direction="rtl">دقيقتان إضافيتان</text>
<rect x="531" y="351" width="255" height="91" rx="12" fill="#e8efe8" />
<g fill="#082f55" font-family="Arial, sans-serif" font-size="14" direction="rtl" text-anchor="middle">
<text x="658" y="374">◷ حصلتَ على دقيقتين إضافيتين.</text>
<text x="658" y="399">← ثم ينتهي الوقت.</text>
<text x="658" y="424">▣ تستمر خطة «أولًا/ثم».</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="450" viewBox="0 0 800 450">
<title>طفل يعمل في مساحة هادئة تقل فيها المشتتات</title>
<image href="data:image/webp;base64,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 truncated
<g transform="translate(639 35) rotate(-1 71 87)">
<rect width="142" height="174" rx="3" fill="#eee9d8" stroke="#716b5d" stroke-width="2" />
<g fill="#304c39" font-family="Arial, sans-serif" direction="rtl" text-anchor="middle">
<text x="71" y="31" font-size="17" font-weight="700">ركن الهدوء</text>
<text x="71" y="65" font-size="12">♥ كن لطيفًا</text>
<text x="71" y="95" font-size="12">◯ خذ نفسًا عميقًا</text>
<text x="71" y="125" font-size="12">★ ابذل جهدك</text>
<text x="71" y="155" font-size="12">✓ أنت قادر</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

@@ -0,0 +1,68 @@
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="533" viewBox="0 0 800 533">
<title>مقارنة بين الهروب من مهمة صعبة واستخدام سلوك بديل لطلب المساعدة</title>
<image href="data:image/webp;base64,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 truncated
<style>
text { font-family: Arial, sans-serif; }
.heading { fill: #092f54; font-weight: 700; }
.body { fill: #202b31; }
</style>
<rect width="800" height="61" fill="#fbf8ef" />
<text class="heading" x="400" y="41" font-size="24" text-anchor="middle" direction="rtl">الموقف نفسه: المهمة صعبة</text>
<rect x="18" y="69" width="91" height="185" rx="12" fill="#c75f45" />
<g fill="#fff" text-anchor="middle" direction="rtl">
<text x="63" y="96" font-size="15" font-weight="700">المسار أ</text>
<text x="63" y="119" font-size="12" font-weight="700"><tspan x="63">استجابة</tspan><tspan x="63" dy="17">غير فعّالة</tspan></text>
<text x="63" y="187" font-size="10"><tspan x="63">تُلبّى الحاجة بطريقة</tspan><tspan x="63" dy="15">لا تساعد الطفل</tspan><tspan x="63" dy="15">على التعلّم.</tspan></text>
</g>
<rect x="111" y="59" width="550" height="29" fill="#fbf8ef" />
<g class="heading" font-size="12" text-anchor="middle" direction="rtl">
<text x="190" y="79">١. تقديم المهمة</text>
<text x="374" y="79">٢. سلوك يعيق المشاركة</text>
<text x="566" y="79">٣. النتيجة اللاحقة</text>
</g>
<rect x="111" y="190" width="550" height="66" fill="#fbf8ef" />
<g class="body" font-size="10" text-anchor="middle" direction="rtl">
<text x="190" y="211"><tspan x="190">تُقدَّم مهمة</tspan><tspan x="190" dy="15">صعبة.</tspan></text>
<text x="374" y="207"><tspan x="374">يدفع الطفل المواد بعيدًا</tspan><tspan x="374" dy="15">للهروب أو التجنب.</tspan></text>
<text x="566" y="203"><tspan x="566">تُزال المهمة أو تتوقف مؤقتًا،</tspan><tspan x="566" dy="14">فيتعزز الهروب ويزداد احتمال</tspan><tspan x="566" dy="14">تكرار السلوك.</tspan></text>
</g>
<rect x="679" y="70" width="103" height="184" rx="12" fill="#f7eadf" />
<g fill="#9c452e" text-anchor="middle" direction="rtl">
<text x="731" y="99" font-size="14" font-weight="700">النتيجة</text>
<text x="731" y="153" font-size="10"><tspan x="731">يلبّي السلوك الصعب</tspan><tspan x="731" dy="15">حاجة الطفل على المدى</tspan><tspan x="731" dy="15">القصير، لكن التعلّم</tspan><tspan x="731" dy="15">لا يتقدم.</tspan></text>
</g>
<rect x="18" y="271" width="91" height="194" rx="12" fill="#3f7a65" />
<g fill="#fff" text-anchor="middle" direction="rtl">
<text x="63" y="298" font-size="15" font-weight="700">المسار ب</text>
<text x="63" y="321" font-size="12" font-weight="700">بديل فعّال</text>
<text x="63" y="388" font-size="10"><tspan x="63">تُلبّى الحاجة نفسها</tspan><tspan x="63" dy="15">بطريقة آمنة وفعّالة</tspan><tspan x="63" dy="15">تدعم التعلّم.</tspan></text>
</g>
<rect x="109" y="245" width="566" height="44" fill="#fbf8ef" />
<g fill="#316b58" font-size="11" font-weight="700" text-anchor="middle" direction="rtl">
<text x="173" y="279">١. تقديم المهمة</text>
<text x="302" y="279">٢. السلوك البديل</text>
<text x="441" y="279">٣. استجابة مفيدة</text>
<text x="593" y="279">٤. النتيجة اللاحقة</text>
</g>
<rect x="110" y="405" width="565" height="68" fill="#fbf8ef" />
<g class="body" font-size="9.5" text-anchor="middle" direction="rtl">
<text x="173" y="427"><tspan x="173">تُقدَّم مهمة</tspan><tspan x="173" dy="14">صعبة.</tspan></text>
<text x="302" y="419"><tspan x="302">يطلب الطفل المساعدة</tspan><tspan x="302" dy="14">ببطاقة أو طلب</tspan><tspan x="302" dy="14">أو إشارة.</tspan></text>
<text x="441" y="415"><tspan x="441">يستجيب البالغ بطريقة داعمة،</tspan><tspan x="441" dy="14">فيقدم المساعدة أو استراحة</tspan><tspan x="441" dy="14">مناسبة حسب الخطة.</tspan></text>
<text x="593" y="415"><tspan x="593">تُلبّى الحاجة ويستطيع الطفل</tspan><tspan x="593" dy="14">المتابعة أو العودة إلى المهمة</tspan><tspan x="593" dy="14">بدعم.</tspan></text>
</g>
<rect x="680" y="272" width="102" height="193" rx="12" fill="#e7f0e8" />
<g fill="#316b58" text-anchor="middle" direction="rtl">
<text x="731" y="301" font-size="14" font-weight="700">النتيجة</text>
<text x="731" y="350" font-size="9.5"><tspan x="731">يساعد السلوك البديل</tspan><tspan x="731" dy="14">على تلبية حاجة الطفل،</tspan><tspan x="731" dy="14">فيزداد احتمال استخدامه</tspan><tspan x="731" dy="14">مجددًا ويتقدم التعلّم.</tspan></text>
</g>
<rect x="136" y="476" width="558" height="50" rx="12" fill="#e5edf3" />
<g fill="#173b5b" text-anchor="middle" direction="rtl">
<text x="415" y="497" font-size="13" font-weight="700">التعزيز الفعّال يجعل استخدام المهارة البديلة مجديًا.</text>
<text x="415" y="516" font-size="10">عندما يُعزَّز السلوك البديل، يصبح الخيار الأسهل والأكثر فاعلية.</text>
</g>
<rect x="305" y="347" width="49" height="25" rx="2" fill="#fff" />
<text x="329" y="364" fill="#253238" font-size="8" text-anchor="middle" direction="rtl">مساعدة</text>
</svg>

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

+478
View File
@@ -0,0 +1,478 @@
# AIA Astro Migration — Living Session Handoff
**Last updated:** October 30, 2026 (UTC)
**Repository:** `AIAMarketing/azinstitute4autism.com`
**Working branch:** `faithful-astro-migration`
**Last pushed checkpoint:** `55adb797051473c3067a0d454515153237e9b8d6` — completion handling and portal styling. The new commit containing this handoff simplifies Form A to default-live without rewriting that history.
**Previous accepted checkpoint:** P9-03 documentation, signed `537f9864a0a3d0806180cbeca909bf1d03200c6f`
**Implementation checkpoint:** the commit containing this handoff update; obtain its actual SHA from Git history after the signed checkpoint is created.
**Next milestone:** continue Phase 9 owner decisions and authorized integration batches; then Phase 10 — Final QA/Cutover Readiness.
The landing-page migration is technically completed for checkpoint purposes.
Editorial, accessibility, stakeholder and production-release approval remain
separate. This handoff does not authorize deployment or integration activation.
## Current decision — 2026-10-30: default-live Form A
The owner intentionally supersedes the earlier isolated-test and seven-route
production-gate architecture. `npm run dev` and `npm run build` now enable Form A
on exactly **16 approved placements**, including the publicly reachable
`aia.web3app.dev` environment. No additional approval flags or access restriction
are required. `PUBLIC_AIA_FORMS_MODE` is optional: absent/empty means `live`;
explicit `off` and `mock` remain available. Invalid/obsolete `isolated-test`
settings produce an actionable configuration error. The former approval flags
and form environment role are retired, not renamed.
Indexing and forms are independent. Both publication modes emit ten immediate
frames (two contact, five landing, three consultation) and six deferred bilingual
service-drawer frames. The bounded registry fixes ID `262946078314059`, HTTPS
origin, context and language. Forms B/C are not activated; physical B is retired.
Live drawers retain four-second/50%-scroll opening, shared 30-day suppression,
manual CTA override, deferred loading, verified completion acknowledgment for
five seconds, animated dismissal and fresh-form reopening. Off mode does not
automatically show inactive drawers. All iframe security/fallback behavior is
preserved. Employee-portal preview remains independently gated by explicit local
approval, valid private ciphertext input and non-indexing output; Form A cannot
authorize private content. No portal private resources enter normal artifacts.
This owner authorization does not modify Jotform, authorize site cutover or
complete pending consultation-language, provider-event, accessibility, runtime
telemetry/privacy, recipient-routing or hosting acceptance. See the
[current operating guide](../integrations/jotform/README.md) and
[implementation and validation report](phase-9-form-a-default-live-2026-10-30.md).
Earlier dated decisions and test results below are historical evidence, not
current environment setup instructions.
## Latest verified validation — 2026-10-30 default-live revision
206 tests pass; Astro check has zero diagnostics. Normal default-live staging:
128 routes, empty sitemap, zero hreflang, ten immediate plus six deferred Form A
frames. Indexing-enabled: 127 routes, 109 sitemap URLs, 180 hreflang links, the
same 16 placements. Explicit off/mock artifacts contain no real Form A frames.
Guarded browser regressions preserve drawer completion/suppression and portal
fixture behavior; 128/128 staging routes open. Link/image/blog audits have zero
findings. See the current default-live report for exact overlapping check counts,
network interception evidence and remaining owner acceptance. No deployment,
Jotform mutation or new real submission was performed.
## Authority and checkpoint history
Read repository-root `AGENTS.md`, `MIGRATION_BRIEF.md` and `AUTONOMOUS-CODEX.md`,
then this handoff and the relevant [migration summary](migration-summary.md).
Later Phase 6A ratification controls conflicting original recommendations.
- Phase 5C Team: `34d5394b3ce765028a27b9cddd9952de3f09bfe7`.
- Phase 6A proposal: `76a035424dc5245443476b168d8c91ea62eed27b`.
- Phase 6B.1 search: `b20c253383440598c2d07bf6f852906ac00c42df`.
- Phase 6B.2 pagination: `6f5ac3c0d233cee5fbbb62be79bc6909e6bec183`.
- Phase 6B.3 author archives: `8646792d46a8a117ef617f5dd2582c2550b45d19`.
- Phase 6B.4 URL/SEO: `8192ea71c47a7163b40a7fad144ebbd2523282d1`.
- Phase 6B.5 multilingual navigation/RTL: the signed replacement checkpoint
`a699d467f19fafbfdda5fce1ce6226baa6e5fc3c`; do not use its superseded unsigned SHA.
- Phase 6C Library/multilingual parity: signed checkpoint
`b5bc95bc2b8e36c58e8b4d8ab4b11391374a7883`.
- Phase 7 multilingual reconciliation: signed checkpoint
`8e64d322092b1fa6e0f648ddf26a665c80588198`.
- Phase 8 visual/accessibility implementation: signed checkpoint
`59911eb929579af7bcd6c42de6476128dab62289`.
- P9-03 Jotform contract and complete owner inventory: signed checkpoint
`537f9864a0a3d0806180cbeca909bf1d03200c6f`.
- Phase 9 landing-page integration: the commit containing this handoff update;
obtain its actual SHA from Git history. It does not resolve P9-01 through P9-10.
Phase 6B.5 visitor navigation remains independent of SEO hreflang. Published
locale destinations, explicit fallback notices, native language disclosure,
Arabic contact bidi isolation and the two-line shared address remain intact.
`/ar` remains unpublished with an explicit English-home fallback.
ContactObfuscation is unchanged; reversed no-JavaScript strings are intentional.
The earlier Phase 6B.5 manual acceptance does not cover subsequent Phase 6C work.
## Completed Phase 6C technical sequence
- **6C:** restored nine missing English articles and source-backed self-hosted
media; derived English Library and author page 6 from the catalog.
- **6C.1:** restored source-supported Halloween contextual links in English
self-advocacy and AAC articles.
- **6C.2:** reconciled three materially outdated English articles and current
published Spanish school readiness; replaced the obsolete Arabic
antecedent/consequence body with a complete translation; audited all 19
established translation relationships.
- **6C.3:** reconciled featured-image alternatives, source-supported headings,
truncated descriptions and supported modification dates; retained the new
Arabic guide's intentional modification-date omission; localized three diagrams.
- **6C.4:** reconciled contextual and external links, previous/next/related
relationships, image links and fragments; added localized self-advocacy
Halloween references while preserving the landing-page ownership gate.
- **6C.5:** audited all 74 articles, corrected narrow structural/accessibility
regressions, and verified metadata, links, FAQs, translation relationships,
pagination, search and publication policies. Technical readiness has
documented nontechnical release gates.
Detailed evidence and reviewer checklists are in the
[final acceptance report](phase-6c5-final-library-acceptance-2026-10-13.md).
The [checkpoint manifest](phase-6c5-checkpoint-manifest-2026-10-13.md) lists 148
implementation/evidence paths; that checkpoint included its handoff as path 149.
Historical phase records retain their original context.
## Completed Phase 7 technical sequence
- Recovered Spanish privacy policy with February 19, 2025 revision date,
localized metadata and reciprocal English/Spanish policy navigation.
- Localized actual Spanish form labels, options, instructions, disabled notices
and Contact map text using explicitly passed publication locale; no backend enabled.
- Translated the Spanish reinforcement tip without changing article identity,
dates or surrounding content; fluent/clinical approval remains pending.
- Localized Spanish/Arabic author headings and isolated Arabic BCBA/LBA text;
biographies, identities and archive SEO unchanged.
- Prepared the [nonproduction verification plan](phase-7-nonproduction-verification-plan-2026-10-14.md)
and [Phase 9 decision register](phase-9-decision-register-2026-10-14.md).
P9-01 through P9-10 all remain **Pending decision**.
See the [Phase 7 reconciliation report](phase-7-multilingual-reconciliation-2026-10-14.md)
and [checkpoint manifest](phase-7-checkpoint-manifest-2026-10-14.md).
The non-Library matrix excludes all three Library-root content records:
20 EN / 8 ES / 1 unpublished AR draft → 20 EN / 9 ES / 1 unpublished AR draft;
28 → 29 eligible pages and 8 → 9 English–Spanish pairs. The final matrix has
30 records including the draft. Whole pages-collection counts (including roots)
are 21/9/2 → 21/10/2, with 9 → 10 English–Spanish pairs. Do not mix populations.
## Completed Phase 8 technical sequence
- Static checks and guarded Chromium smoke covered all 122 generated routes.
The original browser pass captured 50 desktop/50 mobile full pages, checked
50 routes without JavaScript, and passed 40 focused interactions, with one
native-dialog review finding subsequently compared against a native control.
- Corrected prose/FAQ/contact/form link contrast and underlines, navigation,
language-menu, skip-link, byline and diagram focus treatments; fixed the
scoped homepage director-grid overflow at 320px.
- Localized Arabic article controls and bidi counts without changing the API
script. Corrected DTT/NET peer sections and consultation heading semantics
while preserving text, fragments and appearance. Native dialogs remain intact;
Chromium's browser-chrome boundary did not establish application focus escape.
- Corrected Phase 7 carryovers: Spanish HSA/FSA section after ESA/before financial
help, Spanish alternative text and APROBADO artwork; Spanish privacy's missing
information-collection H2 (eleven sections/four items), with no legal-text change.
The final Spanish badge preserves the original alpha and every pixel outside
its lettering rectangle; the English artwork is unchanged.
- Replaced flattened Tour Markdown with one MDX publication, structured nine-photo
data and accessible carousel: captions, thumbnails, wraparound, keyboard/focus,
restrained announcements, no auto-rotation, full no-JavaScript fallback and
restored consultation link. No new dependency or production integration.
- Bounded follow-up: 30 grouped Chromium checks. Consolidated pass: 21 grouped
checks, two contrast/reduced-motion probes, five distinct routes, 20 full-page
captures, native 200% zoom on Tour/privacy (26 overlapping frames), four crops.
Earlier follow-up also tested seven routes at native 200% zoom. Badge correction:
eight EN/ES checks/crops at 320/390/768/1440px. These are distinct evidence
populations, not additional unique-site-route totals.
- Loopback-only contexts allowed only local GET/HEAD, blocked external traffic,
WebSockets and website service workers. Map-resource attempts and a synthetic
fixture POST were prevented; no production API/like/form/conversion request
was transmitted. Disabled controls/noindex remain insufficient API isolation.
See [consolidated findings](phase-8-consolidated-followup-2026-10-15.md),
[browser results](phase-8-browser-verification-2026-10-15.md),
[badge correction evidence](phase-8-badge-correction-evidence-2026-10-15.json),
and the [Phase 8 checkpoint manifest and validation](phase-8-checkpoint-manifest-2026-10-15.md).
Historical failed browser attempts remain recorded. System Playwright 1.61.0 /
Chromium 151.0.7922.75 now work; the optional Nix browser-shell realization is
not independently verified. No real screen-reader session or owner sign-off occurred.
Tour's public source passed normal TLS but was cache-qualified. Spanish privacy's
capture used a certificate-insecure fallback after validation failed. Neither
establishes current origin freshness; Spanish policy additionally requires a
trusted-source comparison. No insecure retrieval was repeated.
## Completed Phase 9 landing-page integration
- Imported four independently styled campaign routes from the sibling landing-page
repository: `/lp/aba-therapy`, `/lp/aba-insurance`, `/lp/aba-ahcccs` and
`/lp/aba-private-pay`. Their local fonts, images, components, metadata and
source noindex policy are isolated from ordinary site pages.
- Migrated the branded public `/lp/early-intervention` route with its compact
header/footer, source section order, existing byte-identical local imagery and
cache-qualified source evidence. It is self-canonical and adds one sitemap URL.
- Omitted the sibling project's API, tracking, success-state and attribution
runtime. Normal staging and indexing artifacts keep all five lead panels inactive,
with no native POST, live Jotform or conversion behavior. The later seven-route
Form A isolated-test adapter is separately gated and remains outside those artifacts.
P9-01, P9-03, P9-05 and P9-07 remain open.
- Added `/lp` as a temporary staging/testing index linking the five pages. It is
always `noindex,nofollow`, sitemap/hreflang-excluded and omitted entirely when
`PUBLIC_ALLOW_INDEXING=true`. This build gate is not access control.
- Detailed evidence is in the
[integration report](phase-9-campaign-page-integration-2026-10-20.md),
[sanitized evidence JSON](phase-9-campaign-integration-evidence-2026-10-20.json),
[early-intervention source record](phase-9-early-intervention-source-2026-10-20.json)
and [final offline reconciliation](route-reconciliation-2026-10-20-offline-18-37-43-828Z.json).
Earlier October 20 reconciliations remain superseded local evidence outside
the checkpoint.
### Current two-form status — 2026-10-29
- Form A uses one 16-placement live registry: two contact, five landing, three standalone consultation and six EN/ES service drawers. Mode defaults to live; off/mock are explicit options. See the current decision above and the two-form specification.
- Owner-confirmed direct-Jotform evidence covers synthetic EN/ES submission, native thank-you, conditional email/language, generic no-answer/no-PDF staff notification, autoresponder delivery, corrected fixed Reply-To, no webhooks/integrations, privacy scope, recipient access and retention. The owner also reports successful Astro-iframe synthetic submission and confirmation on English contact, Spanish contact and one ABA landing placement; record the exact third route before release. Functional submission acceptance is complete only for those owner-reported samples. All-sixteen-route accessibility, runtime-network/telemetry, deployment and site-release acceptance remain open.
- The adapter retains fixed URLs, responsive fixed heights, `no-referrer`, `allow-forms allow-scripts allow-same-origin`, no helper script, and a hosted fallback that is hidden without space until a 15-second missing-load timeout. A frame load only clears that timeout; it does not prove cross-origin application health or accepted submission. The official Jotform resizing handler is conditionally acceptable pending separately authorized source, origin, privilege, Firefox and error-state verification; it is not implemented. Fixed heights remain current.
- No additional Form A approval/environment flags remain. Indexing does not authorize or disable forms. Marketing-only notification routing remains a pre-cutover operational check. Rollback requires explicit mode `off`, rebuild and artifact verification; merely removing the mode restores live. Form C, counters, analytics and API forwarding remain inactive.
The indexing-enabled build has 127 HTML routes/canonicals and 109 sitemap URLs.
Normal staging has 128 `noindex,nofollow` pages because it also contains `/lp`;
its sitemap and hreflang are empty. Existing 180 hreflang links across 55 routes,
25 translation sets, 74 Library articles, nine author archives and nine redirect
definitions are unchanged. Guarded Chromium covered the four campaign routes at
320/390/768/1440px, the branded route at those widths plus no-JavaScript checks,
and `/lp` at 320/1440px. Real screen-reader, non-Chromium and authorized visual,
clinical, privacy and organizational acceptance remain pending.
## Verified technical baseline
| Metric | Result |
|---|---:|
| Library articles / locale search records | 55 EN / 12 ES / 7 AR = 74 |
| Indexing-enabled HTML routes / unique canonical targets | 127 / 127 |
| Normal staging HTML routes, including temporary `/lp` | 128 |
| Author archive routes | 9 |
| Indexing-enabled sitemap URLs | 109 |
| Hreflang links / participating routes | 180 / 55 |
| Validated page/article translation sets | 25 |
| Repository redirect definitions | 9, not activated on deployed hosts |
| Visible/schema-aligned FAQ answers / articles | 182 / 30 |
English Library and author pagination is `10/10/10/10/10/5`; Spanish is `10/2`,
Arabic is one seven-article root. Page 6 is derived, with no page 7 or page-one
HTML alias. Search remains locale-scoped, metadata-only and demand-loaded.
Publication ordering uses original dates, not modification dates. Existing
syndicated external-canonical/noindex exceptions remain unchanged.
Normal staging output is **128 `noindex,nofollow` HTML pages, an empty sitemap
and no hreflang**. Indexing-enabled validation is local only. No deployment,
redirect activation, form submission or production integration is authorized.
Final source-matching offline evidence is the
[October 20 reconciliation](route-reconciliation-2026-10-20-offline-18-37-43-828Z.json):
138 dispositions, 128 local generated routes, 70 reused historical production
requests and schema 2. Use this explicit evidence path for read-only checks.
Earlier Phase 8 and October 20 reports remain historical evidence, not the
current source fingerprint. No fresh production crawl was performed.
The historical Phase 6C.5 parity classifications were 10 confirmed, 58 with accepted intentional
deviations, one minor discrepancy, five requiring human review, zero material
discrepancies and zero insufficient-verification records against the selected
evidence. Findings rely on dated, sometimes cached/prerendered public HubSpot
representations; they do not establish independent current origin freshness.
The newer Arabic antecedent/consequence translation intentionally supersedes
its outdated public Arabic body. Machine-assisted work is not professional approval.
Phase 8 checkpoint preparation revalidation on October 15 passed sequentially
with `TMPDIR=/tmp`: Astro check (101 files, zero diagnostics), Markdown 20,
publication 33, SEO 35, **Library 53**, routes 10 and Phase 8 5 tests: **156 total**.
Both build modes and link/image/blog audits pass. The final normal staging build
and explicit offline consistency check retain the publication safeguards above.
Git identity/signing remains the user’s host-terminal responsibility.
## Outstanding Stakeholder Review and Production Release Gates
- **Clinical/organizational — AIA:** approve eligibility and program-specific
ranges against general ABA eligibility of **18 months through eight years**;
resolve the summer-routine age discrepancy. Review Preparatory Academy ages
2–6 and 1:2 delivery ratio, ABA versus education, Arizona educational guidance,
functional assessment, behavior intervention, reinforcement, extinction,
aggression, self-injury, safety, treatment/outcome claims and author roles,
credentials and biographies, including Arabic physician-like wording versus
English “clinician.” Source publication alone is not clinical approval.
- **Fluent Spanish/Arabic and clinical review:** revised Spanish school readiness,
rewritten Arabic antecedent/consequence guidance and terminology, all three
localized Arabic diagrams, localized self-advocacy Halloween additions,
operational labels and cross-language notices remain pending.
- **Spanish tip review:** Phase 7 corrected the English tip at
`/es/library/positive-reinforcement-techniques`. Its fluent-Spanish and
clinical/editorial acceptance remains open; historical Phase 6C findings remain intact.
- **Privacy/legal and trusted-source approval — P9-07:** both policy claims need
AIA privacy/legal approval. Spanish privacy was recovered from a cache-qualified
response after standard TLS certificate validation failed; fallback disabled
certificate verification. Matching captured text does not prove authenticated
origin fidelity. Before production, compare against a certificate-validated
source or owner-supplied authoritative export with provenance; no trusted
comparison is available yet. Fluent Spanish approval remains mandatory.
Do not repeat insecure retrieval or rewrite policies to hide this limitation.
- **Browser/accessibility:** guarded Chromium automation now covers desktop/mobile,
keyboard, no-JavaScript, RTL/diagram scrolling and actual 200% zoom. Authorized
visual/source-fidelity acceptance, non-Chromium coverage, native-dialog AT
behavior, Arabic visual-language acceptance and real screen-reader testing
remain pending. Earlier failed attempts remain historical; browser automation
and DOM inspection do not constitute reviewer or assistive-technology approval.
- **Spanish HSA/FSA financial claims:** fluent-Spanish and organizational/financial
review of wording, account use, pre-tax and tuition claims remains pending.
Localized artwork is not financial eligibility or reimbursement approval.
- **Landing-page integration — Phase 9 owner gate:** presentation for the four
campaign routes and `/lp/early-intervention` is now imported under explicit
owner authorization. The Library CTA remains provisionally
`/client-consultation`; its equivalence to `/lp/early-intervention`, campaign
routing, redirects and live form behavior are not approved. Do not activate
submissions or production redirects without separate authorization.
- **Employee portal — P9-02:** staff/management access separation, authentication,
authorization and employee/clinical data security remain unresolved; current
metadata-only route is not a completed portal. See the
[portal brief](employee-portal-migration-brief-2026-10-08.md).
- **Likes/views API — P9-04:** the uncommitted local implementation now defaults
to explicit fail-closed `off`, with deterministic local `mock` behavior and
no live adapter. A future live adapter still requires separate API-origin,
credential, cookie, consent and production-approval evidence.
- **Author SEO:** keep archives self-canonical, `noindex,follow` in indexing-enabled
builds, sitemap-excluded and hreflang-excluded. Changes require explicit approval.
- **Forms/privacy/analytics/advertising:** approve form destinations and submission
APIs, HIPAA/privacy safeguards, consent/analytics, Google Ads conversion tracking
and each production integration's activation. No new PHI flow is authorized.
- **Hosting/release:** separately verify Contabo/NixOS deployment assumptions,
HTTPS, canonical host, slashless URLs, query preservation, redirect targets and
loops, real 404 responses, asset delivery, sitemap/robots, reproducible deployment,
rollback and organizational release approval. The temporary Docker/nginx
trailing-slash HTTPS-to-HTTP-to-HTTPS chain remains explicitly deferred.
Static-build success does not verify these deployed behaviors.
## Uncommitted extended Phase 10 technical QA — 2026-10-22
The signed baseline remains `e874b26bb9dc24beb6bce2e83a10e7800e7e12b9` on
`faithful-astro-migration`; this section records uncommitted verification and
must not be treated as an accepted checkpoint. The local Phase 9 batches for
counter isolation, off/mock form infrastructure and Contabo release planning
were revalidated. Two bounded responsive defects were corrected: mobile
PageHero headings now fit their available width, and the Library two-column
grid allows its primary track to shrink at tablet width.
The final guarded Chromium pass opened 128/128 staging routes. The responsive
matrix passed 110/110 checks across 22 routes at 320/390/768/1024/1440px.
Four Leaflet GET requests were intercepted before transmission; no production
API, Jotform, Contabo form, analytics, advertising or WebSocket request was
transmitted. The normal staging artifact has 128 noindex,nofollow pages, an
empty sitemap and zero hreflang; the indexing artifact has 127 pages, 109
sitemap URLs and 180 hreflang links, with the temporary `/lp` review index
excluded.
New local verification tools and reports are described in the Phase 10 audit,
browser, release-rehearsal and technical-readiness reports. A loopback Node
release rehearsal passed atomic switch and rollback. nginx, Contabo topology,
real screen-reader, non-Chromium, fluent-language, clinical, privacy/legal and
all P9 owner decisions remain pending. No checkpoint SHA is assigned to this
uncommitted work; the next signed SHA must come from the user's Git history.
## Next: Phase 9 — Human-Decision Gates
Begin from the commit containing this handoff update; obtain its actual SHA from
Git history and verify branch, history and working tree. Review
[P9-01 through P9-10](phase-9-decision-register-2026-10-14.md)
and gather evidence/owner decisions before proposing bounded implementation:
landing-page ownership; portal security/access; forms/APIs; likes/views isolation;
analytics/consent/Ads; clinical/organizational claims; policy/legal/provenance;
author SEO; hosting/rollback; production authorization. All ten remain **Pending decision**.
Do not infer approval from a technically feasible option or this checkpoint.
Use the [nonproduction plan](phase-7-nonproduction-verification-plan-2026-10-14.md)
and [reviewer procedure](phase-8-host-browser-verification-2026-10-14.md) for remaining
human acceptance. No hosted preview before approved fail-closed integration
isolation. Phase 10 retains final QA, deployed routing/integration tests,
rollback rehearsal and cutover readiness. Neither phase is authorized for live
changes by this handoff. The user separately authorizes each implementation scope.
## Working protocol and protected local files
Preserve the Markdown-first manifest-driven architecture, explicit translation
relationships and ratified publication policies. Implement only authorized scope;
report evidence and structural diffs before checkpoint actions. Follow
`AUTONOMOUS-CODEX.md`; do not repair identity/signing or bypass sandbox restrictions.
Do not read, modify, move, delete, stage or checksum root `merge-plan.md`.
### Reconciliation archive — 2026-10-28
The owner explicitly superseded the former local-preservation instruction for
the seven untracked reconciliation artifacts below. They were all confirmed
untracked and moved, without overwrite, to the local archive outside this Git
repository:
`/home/alice/projects/wrk/aia/local-archives/azinstitute4autism-route-reconciliation-2026-10-28`
- `route-reconciliation-2026-10-11-offline.json`
- `route-reconciliation-2026-10-12-offline.json`
- `route-reconciliation-2026-10-13-offline.json`
- `route-reconciliation-2026-10-13-offline-06-16-06-857Z.json`
- `route-reconciliation-2026-10-20-offline.json`
- `route-reconciliation-2026-10-20-offline-18-04-39-776Z.json`
- `route-reconciliation-2026-10-22-offline.json`
They remain excluded from Git because they are superseded intermediate or
local-only evidence. Filename-reference review found historical report links
only; no runtime, test, build or audit dependency. The tracked final evidence
remains `route-reconciliation-2026-10-20-offline-18-37-43-828Z.json` and
`route-reconciliation-2026-10-22-offline-05-10-47-827Z.json`. Historical
reports may retain filename references as their contemporaneous record; no
active dependency remains unresolved. The four October 11–13 files were moved
under this explicit authorization without parsing or checksumming their
contents.
Exclude root `merge-plan.md` and temporary `.phase8-stage-paths.nul` as well.
The old `.phase7-stage-paths.nul` is absent; do not recreate it.
The staging aid is for the user's host terminal only; never stage it or use a
broad Git add. The actual future checkpoint SHA comes from Git after the user
signs; do not amend merely to insert it here.
## Consolidated service drawers and portal checkpoint, 2026-10-30
This section supersedes earlier explicit-only drawer behavior. The checkpoint
containing this update adds four-second/50%-scroll consultation opening, one
shared 30-day localStorage expiry preference, manual override through the six
existing EN/ES service CTAs, and typed bilingual service introductions. The
Academy configuration is prepared without a new page. The fixed seven production
and separate nine consultation-test route lists remain unchanged. Consultation
indexing approval must explicitly be `false`.
The employee route now has a locked, local-decryption UI and a private owner-run
collection/rewrite utility. Real passphrases were unavailable: real portal
content/resource inventory and collection remain blocked pending the owner-run
step. Do not claim approximately 43 resources as a measured inventory. Do not
commit the original source, ciphertext, decrypted views or private resources.
`www/private/employee-portal/` is ignored and outside Astro public output.
The accepted Jotform CSS backup and reconciliation archives are unchanged.
SOPS/age/sops-nix preparation is inactive, with no generated production identity,
recipient, deployed module or server-access activation. Portal browser encryption
remains access friction; internal resources require separate server-enforced
staff/management authorization. See
[consolidated implementation and validation](phase-9-service-portal-consolidated-2026-10-30.md)
and [owner utility instructions](../integrations/employee-portal/README.md).
The actual checkpoint SHA is the commit containing this section; obtain it from
Git history. No push, deployment or cutover is authorized by this work.
## Focused completion, portal styling and Spanish diagnostic — 2026-10-30
Authorized consultation drawers now accept only the documented
`submission-completed` / `formID` envelope from their activated iframe window
at the exact configured Jotform origin while the drawer is open. Object and
bounded JSON-string envelopes are supported; other actions/messages are ignored.
Completion writes the existing global 30-day expiry immediately, reveals EN/ES
acknowledgment, then starts slide-out after five seconds. Manual dismissal or
navigation cancels the countdown. Duplicate completion cannot restart it.
The next deliberate opening replaces the completed iframe; incomplete forms
remain intact across ordinary close/reopen. Load remains fallback-only, never
submission evidence. Real provider-message acceptance requires one owner-run
synthetic submission; automated tests use intercepted local fixtures only.
Portal presentation now restores scoped blue headings, spacing, directories,
orange report buttons and accessible contact accents without retaining arbitrary
classes, styles or scripts. Two synthetic encrypted views are verified. Private
source exposed no plaintext class/CSS semantics, and real view codes were not
available; exact legacy button recognition and visual parity require owner review.
No private content/resource or ciphertext was added to Git or public output.
The reported seven-option Spanish consultation dropdown is an unresolved
Jotform configuration issue: generated EN/ES URLs have identical form ID and
`formContext=consultation`, differing only in `language`. Astro neither supplies
nor edits child dropdown options. Owner should compare the direct hosted Spanish
form and review multilingual option translations/Update Options conditions.
No account changes or real submissions were performed. Seven production and
nine isolated-test placements remain unchanged; production consultation, portal
cutover and site cutover remain unauthorized. See the
[focused correction evidence](phase-9-drawer-portal-corrections-2026-10-30.md).
+275 -1
View File
@@ -1,5 +1,16 @@
# Accessibility Audit
**Checkpoint preparation — 2026-10-15:** The [exact checkpoint manifest](phase-8-checkpoint-manifest-2026-10-15.md)
records final revalidation (156 tests, including Library 53), current publication
metrics, preserved release gates and the source-matching **18:21** offline report.
The [badge correction](phase-8-badge-correction-evidence-2026-10-15.json) supersedes
the earlier white-background derivative and its captures/hash. Current Spanish
artwork preserves original geometry/alpha outside the APROBADO lettering.
Earlier browser failures, capture results and file counts below are dated history;
they are not the latest technical state. Checkpoint preparation is now authorized;
no staging, commit, production activation or human approval has occurred.
## Implemented
- Semantic header, navigation, main, article, section, and footer landmarks.
@@ -13,16 +24,279 @@
- Reduced decorative image announcements through empty alt text where appropriate.
- Responsive typography and layouts without fixed text sizing.
- Language-switcher choices are limited to routes that actually exist.
- The language selector uses native `details`/`summary` disclosure semantics and
real links. Visitor navigation is resolved independently from SEO hreflang,
so validated noindex author roots remain reachable without adding them to the
hreflang graph.
- Desktop, mobile, and footer navigation resolve against eligible generated
routes. Cross-language fallbacks are explicitly identified rather than
silently linking visitors to another language.
- Arabic footer phone, email, and Latin-script address values use narrowly
scoped left-to-right bidi isolation while the surrounding footer remains RTL.
- Like buttons expose pressed and disabled state.
- Source-faithful colors, section hierarchy, and controls were retained while
avoiding the source site's modal that obscures content on initial load.
## Manual Review
- Review extracted image alt text; source content frequently omitted or duplicated alt text.
- Have fluent Spanish/Arabic reviewers assess the newly localized article hero
descriptions and Arabic diagram alternatives in their full article context.
- Test keyboard and screen-reader behavior across all migrated pages.
- Perform contrast testing against final approved brand colors.
- Review extracted article heading hierarchy and any table markup.
- Confirm Arabic content and RTL reading order with a fluent reviewer.
- Review Spanish and Arabic operational labels and fallback-language notices
with fluent reviewers. Phase 7 localizes the existing Spanish and Arabic
author-archive labels; fluent review remains pending.
- Test the native language disclosure, mobile navigation, search announcements,
contact links, and full-page RTL reading order with screen readers. Phase
6B.5 validated generated markup and keyboard semantics, but no screen-reader
executable was available in the implementation environment.
- Validate the rebuilt mobile navigation and all full-page responsive
layouts in a browser outside the autonomous sandbox.
## Phase 6C.3 article-image update — 2026-10-12
The current 74-article Library corpus was re-audited after the Phase 6C.2
rewrites. All 74 featured images are informative in their present article
context. The 60 records that still lacked frontmatter descriptions now have
concise, locale-appropriate alt text based on direct visual inspection and the
corresponding public-page evidence. No current featured image is treated as an
accidental empty-alt fallback; this is a decision about the audited corpus, not
a rule that future decorative images must have nonempty alt text.
The three English-text diagrams in the revised Arabic antecedent/consequence
article now use separate self-hosted Arabic SVG counterparts. Each preserves
the source raster and its relationships while replacing the visible labels
with Arabic. The article also retains adjacent Arabic prose and semantic tables
that communicate the same information without relying on the images. The
causal panel order remains left-to-right where reversing it could obscure the
sequence, while Arabic labels render right-to-left within their panels.
At narrow widths, each detailed diagram sits in a keyboard-focusable,
explicitly named horizontal scroll region with a visible focus outline. This
keeps its labels at a readable minimum width without introducing page-level
horizontal overflow.
Generated-markup checks cover featured-image alt propagation to the article,
Open Graph, and Twitter metadata; localized Arabic asset references; and the
absence of the English diagram references from the Arabic body. The SVGs were
rendered locally for visual inspection at their native dimensions. A browser
was not available for desktop/390-pixel overflow checks, and no screen-reader
or fluent-Arabic review was performed. Those checks, plus clinical review of
the translated ABA terminology and diagram relationships, remain required
before cutover.
## Phase 6C.4 article-link update — 2026-10-13
Generated-HTML checks now cover every Library body link's published destination,
asset, and fragment, plus the rendered previous/next/related links. Spanish and
Arabic self-advocacy articles identify their Halloween-guide destination as
English; the two new localized sentences still require fluent-language review.
The play/leisure article retains two native image links to the full-size,
self-hosted infographics. Duplicate expanded images and orphaned lightbox close
symbols were removed. The ABC-data preview links to the existing full-size
worksheet. These static anchors do not require JavaScript; this is markup
verification, not a completed keyboard or no-JavaScript browser session.
Local Chromium failed its sandbox socket check; remote Playwright could not
reach the generated site and subsequently closed its transport. Desktop/mobile
visual checks, focus, image opening and browser Back behavior remain manual
acceptance items. No screen-reader or fluent Arabic/Spanish acceptance is
claimed. The three Phase 6C.3 Arabic diagrams still need visual-language review.
## Phase 6C.5 final verification — 2026-10-13
All 74 featured images retain the individually reviewed alternatives from Phase
6C.3. Final generated-output inspection found and corrected two flattened
screening/evaluation/diagnosis tables (English and Spanish), ten toilet-training
H3 labels that had absorbed adjacent list prose, and the opening headings in the
English/Spanish social-communication articles that had absorbed a quoted
paragraph. Words, article dates and clinical guidance were not changed. The
play/leisure closing CTA is now outside its last FAQ, matching the public page;
all 182 FAQ answers across 30 articles match their visible content and schema.
Actual raster inspection of the three Arabic SVGs found two bounded visual
issues: a replacement-behavior subtitle extended beyond its colored panel, and
a few original English calm-corner title pixels appeared above the overlay.
The subtitle now wraps and the calm-corner overlay starts 10 pixels higher.
Reinspection shows no exposed English labels or clipped Arabic text in the
inspection rasters. The previews used installed DejaVu fonts and losslessly
decoded PNG backing in temporary files because this environment's librsvg did
not render the SVGs' embedded WebP directly. Production SVGs retain their source
WebP artwork. This is raster evidence, not browser/font-fallback acceptance.
All three diagram wrappers retain a named, focusable region, narrow-screen
horizontal scrolling, a 720-pixel minimum image width and focus-outline CSS.
Browser transport remains unavailable; real desktop/390px overflow, keyboard
scrolling, no-JavaScript interactions, screen-reader and fluent Arabic checks
remain **pending**. The source-inherited English tip in the Spanish
positive-reinforcement article also remains a bounded language-review item.
See the final Phase 6C.5 report for the route-specific checklist and release gates.
## Phase 7 shared locale update — 2026-10-14
Spanish Contact and consultation forms now receive the publication locale
explicitly and render Spanish labels, service choices, instructions, submit
text and disabled-submission notices. Contact map landmark/tile alternatives
and zoom titles are localized from server-provided data. Provider/library and
contact values are unchanged. Empty form actions and disabled buttons remain;
these checks do not prove full Enter-key, scripted or no-JavaScript isolation.
Spanish and Arabic author archive eyebrows and list headings are localized.
Arabic BCBA/LBA abbreviations receive LTR isolation without changing identity,
biography or archive SEO. The Spanish reinforcement tip is now fully Spanish,
superseding the minor language finding recorded in Phase 6C.5. New wording is
still pending fluent-language and clinical/editorial acceptance. The Arabic
biography's physician-like wording versus English “clinician” is separately
flagged for organizational and fluent review; it was not silently rewritten.
The recovered Spanish privacy page preserves all ten source sections with
semantic headings, localized metadata and existing contact obfuscation.
Generated HTML tests verify labels, one H1, language, disabled form state and
translation navigation. Playwright opened about:blank, but its transport
closed on the subsequent isolated-local-preview attempt. No site browser,
keyboard, mobile, no-JavaScript or real screen-reader acceptance is claimed.
See [Phase 7 verification plan](phase-7-nonproduction-verification-plan-2026-10-14.md)
for reviewer fields and the API-isolation prerequisite for hosted review.
## Phase 8 bounded verification — 2026-10-14
Generated-HTML smoke checks now cover all 122 eligible routes: zero hard-rule
failures, two source-inherited H1→H3 review warnings (DTT/NET and schedule
consultation). These custom Cheerio rules check basic semantics, labels, alt
presence, fragments, assets and diagram regions; they are not a WCAG audit.
Two authored contrast defects were corrected without changing content or tokens:
inline prose/source-FAQ links now use primary blue and persistent underlines;
navigation/language/byline/diagram focus outlines now use primary blue. On white
and tint backgrounds the foreground contrast is 9.89:1 / 8.89:1, replacing
orange text at 2.23:1 / 2.01:1 and focus outlines at 1.66:1 / 1.49:1. Three focused
regression tests pass. Actual cascade/background/focus-clipping review remains
pending; other colors and controls have not received a complete rendered audit.
Three unchanged Arabic diagrams were rasterized and inspected again: no exposed
English labels or clipped Arabic detected in this DejaVu/librsvg rendering.
This is not browser/font-fallback or fluent-language acceptance. The earlier
statement that wrappers prevent page overflow describes CSS intent; actual
390px containment and keyboard scrolling remain unverified.
Remote browser transport closed before loading the site; only a same-execution
loopback HTTP fetch succeeded. Zero actual browser routes/screenshots, keyboard,
no-JS or real screen-reader sessions are claimed. Contact's external-map failure
fallback and all timed dialogs require actual browser checks. See the
[Phase 8 report](phase-8-visual-accessibility-acceptance-2026-10-14.md) and
[isolated host procedure](phase-8-host-browser-verification-2026-10-14.md).
All stakeholder/Phase 9 gates remain open. Phase 8 is partially verified, not
accepted, and the living handoff has not advanced.
## Phase 8 actual Chromium verification — 2026-10-15
The preceding unavailable-browser status is superseded for the system Chromium
151.0.7922.75 / Playwright 1.61.0 combination. See the
[browser report](phase-8-browser-verification-2026-10-15.md) and
[machine-readable evidence](phase-8-browser-evidence-2026-10-15.json).
All 122 routes loaded; 50 representative routes have full-page 1440/390 captures
and no-JavaScript content observations. The final source received another
122-route desktop check. Forty focused interaction checks pass; one modal focus
boundary remains Review required. No production API attempt was observed;
external map resources were blocked before transmission.
Two further bounded defects were corrected: low-contrast skip/contact/form
notice links now use primary blue and underlines; the homepage director grid
now follows the existing ≤760px single-column rule. Its scoped desktop rule had
caused 382px document width at a 320px viewport. Both homepages now pass actual
320/390/768/1440 reflow checks. Four CSS regression tests pass; full test suites
total 151 passing. These findings do not certify the rest of the palette.
All three unchanged Arabic SVGs rendered with their embedded artwork in Chromium;
inspected desktop captures showed no exposed English labels or clipped Arabic.
Named focusable regions scroll with arrow keys at 390px without page overflow.
Fluent Arabic and clinical review remain mandatory. Chromium AX-tree inspection
confirms Spanish form names/disabled state and Arabic named regions, but also
exposes inherited English “Like this article” and “Similar Blog Posts” labels.
Shared localized labels require a bounded follow-up and fluent review.
The service drawer focuses its heading, closes with Escape and restores prior
focus. Forward Tab reaches the native browser-chrome/BODY boundary before
returning to dialog controls; no background control received focus. Visible
browser/AT review remains pending, not a strict containment pass. A synthetic
fixture's scripted form submission was intercepted, demonstrating that disabled
buttons do not alone isolate submissions. No real form/server POST occurred;
P9-03 still owns the integration/isolation decision.
The two inherited heading skips, actual 200% browser zoom, broader rendered
contrast, complete source-qualified visual comparison, controlled live-map
behavior and real screen-reader acceptance remain open. Computed text resizing
and AX inspection are supplementary evidence, not substitutes. No human
sign-offs were received. All P9 decisions and the living handoff remain unchanged.
## Phase 8 bounded follow-up — 2026-10-15
[Follow-up results](phase-8-browser-verification-2026-10-15.md#bounded-follow-up--2026-10-15)
supersede the specific unresolved technical findings above. Arabic article and
archive counters/footer controls now receive publication locale explicitly;
Arabic names/views/navigation/related labels and isolated counts render correctly.
English/Spanish labels and the entire likes/views API script remain unchanged.
Fluent Arabic review is still pending.
The DTT/NET article's three primary peer sections and consultation's “Start Here”
now use H2 semantics, with identical heading text, IDs, appearance and searchable
text. Inspection established peer-section relationships; a numerical skip alone
was not treated as a WCAG violation. All-route generated audit: 122 pass, zero
hard failures or heading-review warnings.
Read More/eyebrow and selected nav/related-link states now use readable existing
primary colors. Card-author focus outlines also meet light-surface contrast.
Contact/skip links and focus clearance were rechecked. Native dialog Tab and
Shift+Tab, entry, Escape, keyboard Close and return pass at desktop/mobile.
The BODY/documentFocus=false boundary matches a minimal native control, with
background inertness preserved; no custom trap or application change was needed.
Real native tab zoom 200% passes seven high-risk pages: 1440px browser window,
720 CSS-pixel viewport, DPR 2, no page overflow. Overlapping actual viewport
captures replace an unreliable fullPage zoom capture. Both homepages pass
320/390/768/1440 and unchanged Arabic diagrams scroll/render correctly. Thirty
focused browser checks and 154 regression tests pass. This is technical
checkpoint-review readiness, not a complete WCAG audit. Human visual, fluent,
clinical/privacy, real screen-reader and source-fidelity gates remain pending;
all Phase 9 decisions remain unchanged. No production requests or activation.
## Phase 8 consolidated accessibility follow-up — 2026-10-15
See the [complete consolidated report](phase-8-consolidated-followup-2026-10-15.md)
and [evidence](phase-8-consolidated-evidence-2026-10-15.json).
- Phase 7 localization carryover: Spanish homepage now includes the faithful
HSA/FSA translation once after ESA/before Financial Help, with a separate
APROBADO graphic and Spanish alt. English content/artwork unchanged.
- Phase 7 structural carryover: Spanish privacy now has eleven H2 sections;
Información que recopilamos introduces the four existing collection items.
Policy wording/date/contact/metadata unchanged. Historical cache/insecure-TLS
provenance and trusted-source/legal review remain unresolved.
- Phase 8 Tour defect: replace flattened duplicated gallery with one enhanced
nine-slide carousel, caption, wraparound controls, named keyboard-operable
thumbnails, focus, restrained live announcements and full no-JS fallback.
Source is TLS-validated HTTP 200 but October 3 cached/prerendered content,
observed October 15. No live-page scripts executed or fresh-origin claim.
- Preserve prior Arabic UI, headings, contrast, responsive and native-dialog
findings. No changes to likes/views script, forms, publication architecture,
dependencies, hosting, SESSION_HANDOFF or pending Phase 9 decisions.
- Pass: 156 regression tests; 21 targeted Chromium checks and two actual-style/
reduced-motion probes; 122 generated-route static checks; link/image/blog
audits and both builds. Native 200% zoom on Tour/privacy adds 26 overlapping
frames, alongside 20 full-page captures and four crops (all outside Git).
- Counts unchanged: 122 routes/canonicals, 108 sitemap, 180 hreflang/55 routes,
25 sets, 74 Library records, 55/12/7 search, nine archives/redirects,
182 Library FAQ answers on 30 articles. Final staging 122 noindex,nofollow,
empty sitemap, zero hreflang. Raw all-site FAQ population is separately 254/32.
- Final explicit source-matching offline artifact:
[17-41-40-404Z](route-reconciliation-2026-10-15-offline-17-41-40-404Z.json),
133 dispositions/70 reused requests. Read-only consistency check passed.
**PHASE 8 TECHNICALLY READY FOR CHECKPOINT REVIEW**, not accepted by stakeholders.
Fluent Spanish/Arabic, HSA financial claims, clinical/organizational review,
privacy/legal/trusted-source comparison, real screen reader, native-dialog AT,
Arabic diagrams, source-design and non-Chromium acceptance remain open.
P9-01 through P9-10 all Pending decision; Phase 10 cutover remains unauthorized.
No staging, commit, checkpoint preparation, deployment or integration activation.
+3 -3
View File
@@ -1,7 +1,7 @@
# Blog Content Audit
Checked 65 blog post bodies for layout content duplicated in Markdown.
Verified 125 FAQ questions across 19 FAQ-bearing posts.
Detected 32 source-faithful blog blockquotes.
Checked 74 blog post bodies for layout content duplicated in Markdown.
Verified 182 FAQ questions across 30 FAQ-bearing posts.
Detected 58 source-faithful blog blockquotes.
No duplicated article headers or invalid MDX FAQ components were detected.
@@ -153,3 +153,26 @@ This is **documentation only**. It must not change Phase 3A publication policy,
Phase 3B hreflang implementation, Astro routing, production access, forms,
analytics, or server configuration. It does not claim authentication,
HIPAA compliance, or release readiness.
## 2026-10-30 owner authorization and implementation addendum
The owner explicitly authorized the two-stream browser-encrypted compatibility
model for development, superseding the earlier implementation hold for that
bounded scope. Production authorization and server-side resource protection are
still unresolved. The new scoped EmployeePortal component preserves the existing
route/SEO policy, local password entry, HMAC verification before decryption,
locked/unavailable default and passive content rendering.
The read-only source is at
`/home/alice/projects/wrk/aia/local-archives/aia-employee-portal-hubspot-footer-source.txt`.
Its two-stream structure and algorithm were inspected without exposing ciphertext
or plaintext. Legitimate codes were not available to the agent. Real-view
fidelity and exact resource counts remain blocked, not accepted. No real document
was fetched or published. The owner-run migration utility performs private
collection and approved link rewriting/re-encryption; see
[private workflow instructions](../integrations/employee-portal/README.md).
SOPS/age/sops-nix templates are prepared but inactive. Encryption of deployment
secrets does not authorize public delivery of staff/management documents. The
[consolidated report](phase-9-service-portal-consolidated-2026-10-30.md) records
synthetic tests and the separate remaining owner/cutover gates.
File diff suppressed because it is too large. Load diff
+20
View File
@@ -1,3 +1,23 @@
## Include these directives inside the public HTTPS server block, before the
## generic static `location /` handler. Root (`/`) is the only trailing-slash
## public URL; every other terminal slash receives a query-preserving 308.
location ~ ^(.+?)/+$ {
return 308 $1$is_args$args;
}
## The static handler must serve the generated directory artifact at its
## slashless public path. Do not use `$uri/`, which permits nginx's automatic
## directory-slash redirect before `$uri/index.html` can be served.
location / {
try_files $uri $uri/index.html $uri.html =404;
}
rewrite ^/aba$ /aba-therapy permanent;
rewrite ^/autismevaluations$ /autism-evaluations permanent;
rewrite ^/learnersocialclub$ /learner-social-club permanent;
rewrite ^/library/page/1$ /library permanent;
rewrite ^/es/library/page/1$ /es/library permanent;
rewrite ^/ar/library/page/1$ /ar/library permanent;
rewrite ^/library/author/rula-diab/page/1$ /library/author/rula-diab permanent;
rewrite ^/es/library/author/rula-diab/page/1$ /es/library/author/rula-diab permanent;
rewrite ^/ar/library/author/rula-diab/page/1$ /ar/library/author/rula-diab permanent;
+1 -1
View File
@@ -1,5 +1,5 @@
# Page Imagery Audit
Checked 85 page-banner, section-background, and blog-featured-image references.
Checked 94 page-banner, section-background, and blog-featured-image references.
No missing mapped page imagery was detected.
@@ -0,0 +1,38 @@
# Phase 10 — Guarded Browser Regression
Date: 2026-10-22 UTC
Browser: Chromium 151.0.7922.75 via Playwright 1.61.0
Transport: loopback-only Astro preview; service workers blocked; WebSockets closed; all non-loopback and non-GET/HEAD requests intercepted before transmission.
## All-route smoke
`tools/phase10-browser-regression.mjs` opened **128 of 128** generated staging routes. All returned HTTP 200, had a title, one canonical, staging `noindex,nofollow`, no page errors and no horizontal overflow failure. No production/API/Jotform/Google/HubSpot attempt was observed.
Six full-page screenshots were captured outside the repository under `/tmp/aia-phase10-browser-sxY6Bg` for representative English, Spanish, Arabic, Tour and campaign routes. They are temporary evidence, not checkpoint artifacts.
The only console errors were four blocked Leaflet resource errors on `/contact` and `/es/contact`; the guard recorded the corresponding four `unpkg.com` GET attempts. They were blocked before transmission. No OpenStreetMap request followed because Leaflet did not load.
## Responsive matrix
`tools/phase10-responsive.mjs` exercised **22 representative routes × 5 widths = 110 checks** at 320, 390, 768, 1024 and 1440px. All checks passed, including one main H1 per route, Arabic `lang="ar"`/`dir="rtl"`, and document width not exceeding the viewport. Ten selected 320/1440 screenshots were written under `/tmp/aia-phase10-responsive-h1o5Kt`.
The pass includes the five campaign pages, English/Spanish home and contact routes, consultation/referral routes, Arabic article presentation, Library pagination, search, privacy, Tour and representative service pages.
The responsive run initially exposed two reproducible defects. The final run passed after:
- constraining the mobile `PageHero` heading width; and
- changing the Library grid's first track to `minmax(0, 1fr)`.
## Existing interaction and accessibility evidence
The prior guarded Phase 9/8 interaction run remains **41 checks, zero failures**. The prior no-JavaScript browser evidence covers 50 routes. This session did not claim a new real screen-reader session. Native dialog/browser-chrome focus behavior remains a manual assistive-technology review item.
Automated checks cover keyboard-visible focus and interaction paths already encoded in the repository suites, Tour fallback/controls, localized forms in off/mock presentation, Arabic direction and diagrams, and reduced-motion CSS. These are not human WCAG or clinical-language sign-offs.
## Network result
Attempted blocked requests: four Leaflet CSS/JS GETs. Successfully transmitted production requests: **zero**. Production API, Jotform, Contabo form, advertising, analytics, authentication and WebSocket interactions: **zero**.
## Outstanding browser review
Real screen-reader testing, authorized visual acceptance, non-Chromium compatibility and fluent Spanish/Arabic review remain pending. The cache-qualified source captures for Tour and Spanish privacy do not establish current-origin parity.
@@ -0,0 +1,38 @@
# Phase 10 — Local Release and Artifact Rehearsal
Date: 2026-10-22 UTC
Status: Local-only rehearsal; no host, DNS, TLS, nginx, Cloudflare or Contabo access.
## Build artifacts
The normal staging build produced **128 HTML routes**. The final static inspection confirmed every HTML page carries `noindex,nofollow`, the sitemap has zero URLs and no hreflang links are emitted. The temporary `/lp` review index is present only in this staging artifact.
The indexing-enabled build produced **127 HTML routes**, **109 sitemap URLs** and **180 hreflang links**. `/lp` is absent from this artifact. The 74 Library articles, 55/12/7 search inventories, nine author archives and nine redirects remain unchanged.
`tools/phase10-artifact-verify.mjs` passed both modes. Final staging artifact result: 128 HTML routes, 0 sitemap URLs, 0 hreflang links, 409 files, SHA-256 `7ce4341f430a0a49ccc9f074219553c5d9967659c6cf1392042b99335d5009d9`. The indexing artifact passed with 127 HTML routes, 109 sitemap URLs, 180 hreflang links, no `/lp` review index and no active native lead actions; its previously recorded digest is `7ed57ab8089f3fa77c482e3ff229cd3179c470df2a3a1c4cb94c0c76ed02034c`.
The artifact verifier rejects non-search native form actions, active Jotform/tracking scripts, live form mode, production API origins and credential-like strings. It does not claim that static validation replaces deployment or privacy approval.
## Static-serving rehearsal
No `nginx` executable is available in the current environment, so no nginx configuration was installed or tested. `tools/phase10-release-rehearsal.mjs` used an isolated loopback Node static server and passed:
- staging artifact verification;
- root and locale routes;
- slashless and trailing-slash file resolution;
- query-string preservation;
- SVG MIME type;
- robots and empty staging sitemap;
- real 404 handling;
- atomic `current` symlink switch; and
- rollback to the prior release.
The rehearsal reported `productionContact: false`. Its temporary release root was outside the repository.
## Deployment assumptions still requiring verification
The Contabo/NixOS operating system, service user, nginx topology, TLS termination, canonical host, DNS/Cloudflare ownership, release permissions, backups, monitoring and rollback operator remain unknown. The existing P9-09 plan remains the source of the sanitized questionnaire and versioned release-directory proposal. No production rewrite, redirect, cache or security-header configuration was installed.
## Required future host rehearsal
An owner-approved staging host must serve a verified indexing artifact through the intended server, then exercise HTTPS, canonical host, redirects, query strings, static assets, 404s, cache behavior, robots/sitemap, counter/form environment gates and rollback. Staging remains nonproduction and must not be treated as access control solely because it is noindex.
@@ -0,0 +1,27 @@
# Phase 10 Slashless URL Normalization — 2026-10-25
## Scope
This local-only change aligns static-serving behavior with the live site's URL convention: root remains `/`; every other public page is served at a slashless path such as `/aba-therapy` or `/lp/aba-therapy`.
Astro was already configured with `trailingSlash: 'never'`. Generated canonicals, hreflang URLs, sitemap entries, and source links therefore use slashless paths. The remaining deployment requirement is that a static web server must serve a generated `path/index.html` artifact for a slashless request without first redirecting to a directory URL.
## Required server contract
The reviewed nginx template in `reports/nginx-rewrites.conf` must be included inside the public HTTPS server block before general static routing. It requires the server to:
- return a query-preserving `308` from `/path/` to `/path`;
- serve `/path` from `path/index.html` without nginx's automatic directory-slash redirect;
- preserve query strings, for example `/search/?term=aba` redirects to `/search?term=aba`;
- keep root `/` unchanged; and
- retain explicit legacy route redirects after URL normalization.
This is a deployment template only. No Contabo, nginx, DNS, TLS, Cloudflare, or live-site configuration was changed.
## Regression protection
`tools/phase10-artifact-verify.mjs` now rejects generated root-relative `href` or `action` URLs with a terminal slash, excluding root `/`. `tools/phase10-release-rehearsal.mjs` models the required static behavior on loopback: slashless routes return `200`, trailing variants return `308`, and query strings survive the redirect.
## Acceptance still required
The template must be applied and tested by the approved hosting owner on the actual Contabo staging topology. Phase 10 must verify HTTPS, canonical host behavior, cache headers, redirects, assets, real 404s, forms/counter isolation, and rollback before any production cutover. This change does not authorize deployment.
@@ -0,0 +1,39 @@
# Phase 10 — Extended Technical Audit
Date: 2026-10-22 UTC
Status: Local nonproduction audit; no production activation.
## Baseline and scope
The audit started from signed commit `e874b26bb9dc24beb6bce2e83a10e7800e7e12b9` on `faithful-astro-migration`. The index was empty. Existing unstaged Phase 9 work was preserved. The six superseded route-reconciliation reports and root `merge-plan.md` were excluded without reading their contents.
This audit covered the P9-04 counter isolation, P9-03 off/mock form infrastructure, the runtime outbound-request inventory, generated artifacts and local release behavior. No Jotform account mutation, form submission, production API request, analytics event, advertising request, hosting connection or deployment occurred.
## Findings
| ID | Severity | Finding | Evidence and disposition |
| --- | --- | --- | --- |
| A-01 | Fixed | Page hero headings could exceed a 320px viewport on long titles. | Chromium geometry identified 3–17px overflow on consultation/evaluation pages. `PageHero.astro` now constrains the mobile heading to the available width with border-box sizing. Responsive regression passes. |
| A-02 | Fixed | Library two-column grid retained a min-content width at 768px. | Chromium identified an 881px document width caused by `1fr 240px` plus a long-content min-content contribution. `BlogIndexLayout.astro` now uses `minmax(0, 1fr) 240px`. Responsive regression passes. |
| A-03 | Pass | Counter runtime is fail-closed. | `counter-mode.ts` defaults missing/invalid settings to `off`; `LikeViewCounter.astro` emits no API fallback, fetch, credential or cookie behavior in inactive modes. `phase9-nonproduction.test.mjs`, generated artifact inspection and guarded Chromium passed. Live mode has no adapter and remains unavailable. |
| A-04 | Pass | Form runtime is fail-closed. | `form-integration.ts` defaults missing/invalid/live-without-approval to `off`. Off mode emits no native lead form or action; mock mode is local-only. No Jotform URL, Contabo form endpoint, analytics or advertising event was present in generated output. |
| A-05 | Review | Leaflet assets are external automatic requests. | Guarded Chromium intercepted four GET requests to `https://unpkg.com/leaflet@1.9.4/` on Contact pages before transmission. This is existing map behavior, not a production API request; provider/privacy review remains a release gate. |
| A-06 | Review | Existing CentralReach/Jotform links remain operational external links. | `/client-forms` contains established third-party workflow links. They were not navigated or changed. Their owner, access and privacy behavior remain P9 decision work. |
| A-07 | Pending | Real screen-reader, non-Chromium and authorized visual acceptance. | Static DOM and Chromium checks do not constitute assistive-technology or stakeholder approval. |
## Runtime inventory
Local source review found local Library search-index fetches, existing Leaflet/unpkg and OpenStreetMap map dependencies, established CentralReach/Jotform workflow links, and guarded session-storage behavior for the service drawer. No active GA4, Google Ads, GTM or HubSpot tracking script was introduced. Counter and form integrations have no active production origin in off/mock output.
## Tests added or exercised
- `tools/phase10-artifact-verify.mjs` and `tools/phase10-artifact.test.mjs` provide deterministic staging/indexing artifact checks.
- `tools/phase10-release-rehearsal.mjs` exercises a loopback static server, release switch and rollback.
- `tools/phase10-browser-regression.mjs` checks all generated staging routes with guarded requests.
- `tools/phase10-responsive.mjs` checks representative routes at 320, 390, 768, 1024 and 1440px.
The existing Phase 9 isolation tests remain unchanged except for their prior authorized scope. No production configuration was changed.
## Remaining approvals
P9-01 through P9-10 remain pending. In particular, live counter origin/credentials, Jotform Builder settings and activation, consent/measurement, clinical claims, privacy/legal review, hosting topology and production go/no-go require owner evidence. The Phase 8 real screen-reader and fluent-language gates also remain open.
@@ -0,0 +1,115 @@
# Phase 10 — Technical Readiness Package
Date: 2026-10-22 UTC
Status: Technical handoff prepared; production gates remain open.
## Current decision — 2026-10-30: default-live Form A
The owner intentionally supersedes the earlier isolated-test and seven-route
production-gate architecture. `npm run dev` and `npm run build` now enable Form A
on exactly **16 approved placements**, including the publicly reachable
`aia.web3app.dev` environment. No additional approval flags or access restriction
are required. `PUBLIC_AIA_FORMS_MODE` is optional: absent/empty means `live`;
explicit `off` and `mock` remain available. Invalid/obsolete `isolated-test`
settings produce an actionable configuration error. The former approval flags
and form environment role are retired, not renamed.
Indexing and forms are independent. Both publication modes emit ten immediate
frames (two contact, five landing, three consultation) and six deferred bilingual
service-drawer frames. The bounded registry fixes ID `262946078314059`, HTTPS
origin, context and language. Forms B/C are not activated; physical B is retired.
Live drawers retain four-second/50%-scroll opening, shared 30-day suppression,
manual CTA override, deferred loading, verified completion acknowledgment for
five seconds, animated dismissal and fresh-form reopening. Off mode does not
automatically show inactive drawers. All iframe security/fallback behavior is
preserved. Employee-portal preview remains independently gated by explicit local
approval, valid private ciphertext input and non-indexing output; Form A cannot
authorize private content. No portal private resources enter normal artifacts.
This owner authorization does not modify Jotform, authorize site cutover or
complete pending consultation-language, provider-event, accessibility, runtime
telemetry/privacy, recipient-routing or hosting acceptance. See the
[current operating guide](../integrations/jotform/README.md) and
[implementation and validation report](phase-9-form-a-default-live-2026-10-30.md).
Earlier dated decisions and test results below are historical evidence, not
current environment setup instructions.
The following acceptance matrix records the original October 22 results; see the new report for October 30 validation.
## Acceptance matrix
| Area | Evidence | Result | Human/owner gate |
| --- | --- | --- | --- |
| Astro type/check | `npm run check` | Pass, 130 files, 0 diagnostics | None for local build |
| Content/publication | Markdown 20, publication 33, SEO 35, Library 53, routes 10 | Pass, 151 core tests | Content/clinical approvals remain separate |
| Phase 8/campaign/P9 isolation | Phase 8 5, campaign 11, P9 nonproduction 5 | Pass | Language, screen-reader and stakeholder review pending |
| Artifact integrity | staging/indexing verifier | Pass; 128/127 routes, staging 0/0 sitemap/hreflang | Hosting owner verification pending |
| Browser all-route | 128/128 opened | Pass | Non-Chromium and authorized visual review pending |
| Responsive | 110/110 checks | Pass | Human visual acceptance pending |
| Release rehearsal | Node loopback switch/rollback | Pass | nginx/Contabo rehearsal pending |
| Link/image/blog audits | all three audits | Pass, zero findings | None for local audit |
| Offline reconciliation | explicit 2026-10-22 evidence check | Pass; no fresh production crawl | Source freshness remains qualified |
| Screen reader | no real session in this environment | Pending | Authorized AT reviewer |
## Reproducible validation commands
From `www`:
```sh
TMPDIR=/tmp npm run check
npm run test:markdown
npm run test:publication
npm run test:seo
npm run test:library
npm run test:routes
node --test tools/phase8.test.mjs
node --test tools/campaign.test.mjs
node --test tools/phase9-nonproduction.test.mjs
node --test tools/phase10-artifact.test.mjs
npm run build
PUBLIC_ALLOW_INDEXING=true npm run build
node tools/phase10-artifact-verify.mjs --mode=indexing --forms=live
npm run build
npm run audit:links
npm run audit:images
npm run audit:blog
node tools/phase10-artifact-verify.mjs --mode=staging --forms=live
node tools/phase10-release-rehearsal.mjs
```
The final normal staging build was restored after the indexing build. The explicit offline route reconciliation `reports/route-reconciliation-2026-10-22-offline-05-10-47-827Z.json` passed its read-only consistency check using saved request evidence; no unrestricted crawl occurred.
## Phase 10 cutover prerequisites
1. Record a locked Node/npm/toolchain and reproducible artifact manifest.
2. Obtain sanitized Contabo/NixOS/nginx/TLS/DNS/Cloudflare facts.
3. Verify host-local serving, canonical host, redirects, 404s, cache headers and rollback on an approved staging host.
4. Default-live Form A is owner-authorized on exactly 16 placements, including public development hosting. No approval flags remain; indexing is independent. Final accessibility, Spanish options/provider-event, runtime privacy and marketing-recipient operational review remain open. Form C remains unimplemented. Site cutover still needs release authorization.
5. Obtain P9-04 counter origin/credential/consent approval before a live adapter.
6. Resolve P9-05 analytics/advertising measurement and P9-07 privacy/legal approval.
7. Obtain P9-06 clinical/organizational and fluent-language approvals, including Arabic diagrams and Spanish HSA/FSA claims.
8. Complete real screen-reader and authorized visual/non-Chromium acceptance.
9. Name release/rollback owners and record backup/monitoring readiness.
10. Obtain P9-10 go/no-go authorization; then run Phase 10 cutover and post-cutover smoke checks.
## Decision status
P9-01 through P9-10 remain **Pending decision**. No technical feasibility result in this package is an approval. Default-live Form A is explicitly owner-authorized. Counters, analytics, advertising, Form C, private portal serving and hosting activation remain separate and unauthorized by this package.
## Recommended checkpoint boundaries
Keep the existing Phase 9 implementation, audit tooling and reports as one owner-reviewed technical batch. If a signed checkpoint is requested, stage exact paths only after reviewing the final status and reports. Keep any subsequent host rehearsal, Jotform configuration, counter live adapter and measurement work in separately authorized commits.
## 2026-10-30 portal and secrets preparation addendum
The local portal compatibility implementation does not close P9-02 or P9-09.
The owner must supply legitimate codes privately to collect and classify legacy
resources, accept the two decrypted views, approve delivery per resource and
verify server-side staff/management separation. SOPS preparation is an inactive
[module and operational guide](../integrations/nixos/README.md), not deployed
infrastructure. Real age recipients, host topology, access policy, recovery and
runtime key provisioning remain pending. Do not copy `private/` into a release.
The artifact verifier now rejects private resource paths and portal ciphertext
from release artifacts. A local ciphertext preview is deliberately not a
releasable artifact. No site cutover authorization is implied.
@@ -0,0 +1,919 @@
{
"phase": "5A",
"recordedAt": "2026-10-09",
"editorialAuthority": {
"source": "User-provided AIA confirmation",
"confirmedOn": "2026-10-08",
"english": "18 months through 8 years",
"spanish": "18 meses a 8 años",
"scope": "General ABA eligibility, not all programs"
},
"method": "Sequential read-only GETs, at least 1.1 seconds between page requests; redirects not followed; no scripts, authenticated requests, submissions or APIs. Four query rechecks returned identical text/metadata. Browser attempt failed Transport closed. HTML kept only in temporary storage.",
"robots": [
{
"url": "https://www.azinstitute4autism.com/robots.txt",
"observedAt": "2026-10-09T01:26:02Z",
"status": 200,
"headers": {
"date": "Fri, 09 Oct 2026 01:26:02 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"etag": "\"dffaeb51ed776c4737cfc1b108c56515\"",
"last-modified": "Sat, 12 Sep 2026 03:33:09 GMT",
"x-hs-cf-cache-status": "REVALIDATED"
}
},
{
"url": "https://form.jotform.com/robots.txt",
"observedAt": "2026-10-09T01:28:57Z",
"status": 200,
"headers": {
"cache-control": "no-cache",
"date": "Fri, 09 Oct 2026 01:28:57 GMT"
}
}
],
"observations": [
{
"url": "https://www.azinstitute4autism.com/aba-therapy",
"observedAt": "2026-10-09T01:26:21.235860+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:21 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:27:01 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:27:01 GMT",
"server": "cloudflare",
"cf-ray": "a47998bf797c7ab3-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "3e4835ea8562169812c61b0d98603daf7124ce4006f8b37a0539beb3d837d0be",
"title": "Integrated ABA Therapy for Autism | Arizona Institute for Autism",
"description": "Empower your child for life with one-on-one integrated ABA therapy. Book a free consultation and join our supportive autism community!",
"h1": [
"Behavioral"
],
"canonical": "https://www.azinstitute4autism.com/aba-therapy",
"links": [
{
"label": "Make an Appointment",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"The ABA Therapy 1:1 program, designed for children aged 18 months to 8 years, adopts an integrative approach aimed at fostering independent learning. The Arizona Institute for Autism employs a naturalistic, neurodiversity-affirming model within its applied behavior analysis (ABA) program, incorporating essential insights from neuroscientific research.",
"The ABA Therapy 1:2 Academic Readiness Program is specifically designed for children aged 2 to 6 years and utilizes a tailored group therapy approach to prepare learners for successful integration into the mainstream classroom.This program incorporates the AIA Preparatory Academy© curriculum, combining the esteemed Montessori method with Applied Behavior Analysis (ABA). This integrated approach fosters a supportive environment tailored to the individual learning styles and strengths of our learners, facilitating the development of essential social, communication, cognitive, and motor skills necessary for success in mainstream classrooms."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/autism-evaluations",
"observedAt": "2026-10-09T01:26:22.580258+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:22 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:18 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:18 GMT",
"server": "cloudflare",
"cf-ray": "a47998c7baea1fab-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "d1da50ec570839f9ffb014a5309978d62895a286273a9b58e626843ebf53b15f",
"title": "Accurate Autism Assessment for Children | Arizona Institute for Autism",
"description": "Get comprehensive childhood autism evaluations in Scottsdale, AZ. Our expert team provides accurate assessments to support your child's unique development.",
"h1": [
"Psychological"
],
"canonical": "https://www.azinstitute4autism.com/autism-evaluations",
"links": [
{
"label": "Autism Spectrum Disorder (ASD)",
"href": "https://www.childrens.com/specialties-services/conditions/autism-spectrum-disorder"
},
{
"label": "Make an Appointment",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"At the Arizona Institute for Autism, there is no single lab test to diagnose autism. Instead, our team conducts comprehensive evaluations through a series of observations and assessments to understand the underlying causes of your child's symptoms.",
"Autism Diagnostic Observation Schedule (ADOS)",
"ADOS is a structured evaluation tool used by our specialists to assess behaviors related to autism spectrum disorders. Appropriate for children of all ages, ADOS helps us understand your child's social and language skills and overall developmental level."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/learner-social-club",
"observedAt": "2026-10-09T01:26:23.923870+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:24 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:14 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:14 GMT",
"server": "cloudflare",
"cf-ray": "a47998d04d5b19b7-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "74a812f5a6a4841bc234a8058098cbf5c37630915fde608e146b04e1a091307d",
"title": "Boost Emotional and Social Functioning with Learner Social Club at AIA",
"description": "Contact AIA for a free 1-day trial pass to see how your child's social and emotional development can benefit from our Learner Social Club for ages 8-17.",
"h1": [
"Sociological"
],
"canonical": "https://www.azinstitute4autism.com/learner-social-club",
"links": [
{
"label": "Enroll Now",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"The Learner Social Club currently serves youth learners aged 8–17 years. Our flexible scheduling options currently include:",
"Payment Type: Private Pay"
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/services",
"observedAt": "2026-10-09T01:26:25.299584+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:25 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:23 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:23 GMT",
"server": "cloudflare",
"cf-ray": "a47998d8ce0ee9df-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "dca03ba7b2e1bd543d024fea4e0a948461eff05b7c0f09cb25134eb84aaa7796",
"title": "Behavioral, Psychological, and Sociological Pediatric Autism Services",
"description": "Discover comprehensive autism services for children, from integrative ABA therapy to educational and family support, at the Arizona Institute for Autism.",
"h1": [
"ABA & Educational Services"
],
"canonical": "https://www.azinstitute4autism.com/services",
"links": [
{
"label": "Discover More",
"href": "https://www.hubspot.com/"
},
{
"label": "Get Started",
"href": "https://www.hubspot.com/"
},
{
"label": "Home",
"href": "https://www.hubspot.com/"
},
{
"label": "Consult with a Client Advocate",
"href": "https://www.azinstitute4autism.com/client-consultation?hsLang=en"
},
{
"label": "Behavioral Services",
"href": "https://www.azinstitute4autism.com/aba-therapy?hsLang=en"
},
{
"label": "Psychological Services",
"href": "https://www.azinstitute4autism.com/autism-evaluations?hsLang=en"
},
{
"label": "Sociological Services",
"href": "https://www.azinstitute4autism.com/learner-social-club?hsLang=en"
},
{
"label": "Get a Free Consultation",
"href": "https://www.azinstitute4autism.com/client-consultation?hsLang=en"
}
],
"iframes": [],
"excerpts": [
"Approximately 1 in 36 children in the United States will receive an autism diagnosis each year. If your child exhibits any of the behaviors listed above, it is possible that he or she may be diagnosed on the autism spectrum. Diagnosing children with Autism Spectrum Disorder can be challenging and complex. The most important thing you can do is consult a professional if you think your child is displaying atypical behavior.",
"To meet diagnostic criteria for ASD, a child must have persistent deficits in each of three areas of social communication and interaction plus at least two of four types of restricted repetitive behaviors. Consult with a Client Advocate today to receive individual and family support!"
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/referrals",
"observedAt": "2026-10-09T01:26:26.659817+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:26 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:45:35 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:45:35 GMT",
"server": "cloudflare",
"cf-ray": "a47998e12d16cbab-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "f26dbdbe53569db5ab4960cca51c2f78a441306f37311616e3d0816114fcb4c4",
"title": "Submit Your Autism Referral Online | Arizona Institute for Autism",
"description": "Arizona Institute for Autism simplifies autism referrals. Submit online now to connect families with the compassionate autism care specialists of AIA.",
"h1": [
"Physician & Insurer Referrals"
],
"canonical": "https://www.azinstitute4autism.com/referrals",
"links": [
{
"label": "Refer a Client",
"href": "https://form.jotform.com/231638510219149?hsCtaAttrib=203953990377"
}
],
"iframes": [],
"excerpts": [
"At the Arizona Institute for Autism, we are here to support your clients reach new milestones in a diverse integrated learning environment. Our mission is to improve special education and to strengthen neurodivergent communities. We offer dependable educational and therapeutic programs for children ages 18 months to 8 years that have been diagnosed with autism.",
"To provide the highest level of optimal care, we know that it is essential to provide a working partnership with the client’s diagnostic provider, physician, and their insurance company. To facilitate this collaboration, we have built a system of reporting metrics on the child’s treatment plan with supporting progress charts we share with our partners. This information keeps everyone involved up to date on the client’s progress and future needs. If you are an insurance company or diagnostic provider interested in working with us, contact us to learn more about our referral process."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/client-consultation",
"observedAt": "2026-10-09T01:26:28.019578+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:28 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sun, 04 Oct 2026 00:00:00 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sun, 04 Oct 2026 00:00:00 GMT",
"server": "cloudflare",
"cf-ray": "a47998e9bd89a69a-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "df31e8f2bc82d47e0cc1c2144177047d7f37fdfc39a0d18c26fca3a8db4cdf9b",
"title": "Client Consultation Form | Arizona Institute for Autism | Scottsdale",
"description": "Schedule your free consultation with a Client Advocate at Arizona Institute for Autism to find out what we can do for your child diagnosed with autism.",
"h1": [
"Schedule Your Free Consultation"
],
"canonical": "https://www.azinstitute4autism.com/client-consultation",
"links": [],
"iframes": [
"https://form.jotform.com/250727122848156"
],
"excerpts": [
"At the Arizona Institute for Autism (AIA), we have a no wait list policy and provide expert clinical care for children diagnosed with autism. We currently serve families in Scottsdale, Gilbert, Mesa, Tempe, and Phoenix Metropolitan areas."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/aba-therapy-intake-process",
"observedAt": "2026-10-09T01:26:29.339474+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:29 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:15 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:15 GMT",
"server": "cloudflare",
"cf-ray": "a47998f20f6753ca-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "f8cc3b24c506fac722aa6a20b558708e53c6ae2abf8770d09421d961f5dba2e5",
"title": "Starting ABA Therapy Step-by-Step Guide | Arizona Institute for Autism",
"description": "Discover how to begin ABA therapy at Arizona Institute for Autism. Our simple, supportive intake process guides your child toward growth and success.",
"h1": [
"Learner Intake Process"
],
"canonical": "https://www.azinstitute4autism.com/aba-therapy-intake-process",
"links": [
{
"label": "Take the First Step",
"href": "https://www.azinstitute4autism.com/client-consultation?hsLang=en"
}
],
"iframes": [],
"excerpts": [
"After submitting the packet, our Client Advocate will promptly reach out to discuss the next steps, answer your questions, and guide you through the intake process. We are here to support you every step of the way, ensuring you feel comfortable and informed from the start.",
"2. Speak with an AIA Client Advocate",
"Our dedicated Client Advocate team is passionate about assisting families through every aspect of starting ABA therapy. During this initial conversation, your Advocate will:",
"4. Verify Insurance and Billing Information",
"To ensure a smooth start to therapy, our billing manager will verify your insurance coverage and benefits once your intake packet is complete. Our billing team will:",
"Review your insurance plan details, including ABA therapy coverage.",
"Answer your billing-related questions, maintaining transparency and clarity.",
"With your intake and billing details finalized, our Client Advocate will assist you in scheduling a comprehensive assessment with our clinical team."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/es/aba-therapy",
"observedAt": "2026-10-09T01:26:30.699872+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:30 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:14 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:14 GMT",
"server": "cloudflare",
"cf-ray": "a47998fa8d5a2f0f-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "bf5c84fae42bbb11b6bd3e73cd28487bfee895769129f442b7ee92fe01e773e9",
"title": "Terapia ABA Integrada para el Autismo | Arizona Institute for Autism",
"description": "Empodere a su hijo para la vida con terapia ABA integrada individualizada. ¡Reserva una consulta gratuita y únete a nuestra comunidad de apoyo para el autismo!",
"h1": [
"Conductual"
],
"canonical": "https://www.azinstitute4autism.com/es/aba-therapy",
"links": [
{
"label": "Hacer una cita",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"El programa de Terapia ABA 1:1, diseñado para niños de 18 meses a 8 años, adopta un enfoque integrador destinado a fomentar el aprendizaje independiente. El Arizona Institute for Autism emplea un modelo naturalista y que afirma la neurodiversidad dentro de su programa de análisis de comportamiento aplicado (ABA), incorporando conocimientos esenciales de la investigación neurocientífica.",
"El programa de preparación académica 1:2 de terapia ABA está diseñado específicamente para niños de 2 a 6 años y utiliza un enfoque de terapia grupal personalizado para preparar a los estudiantes para una integración exitosa en el aula regular. Este programa incorpora el currículo de la AIA Preparatory Academy©, combinando el estimado método Montessori con el Análisis de Comportamiento Aplicado (ABA). Este enfoque integrado fomenta un entorno de apoyo adaptado a los estilos de aprendizaje y fortalezas individuales de nuestros estudiantes, facilitando el desarrollo de habilidades sociales, comunicativas, cognitivas y motoras esenciales necesarias para el éxito en las aulas regulares."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/es/autism-evaluations",
"observedAt": "2026-10-09T01:26:32.021705+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:32 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:12 GMT",
"x-hs-cf-cache-status": "MISS",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:12 GMT",
"server": "cloudflare",
"cf-ray": "a4799902b84d710a-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "2f41ce71e8108b8076f90320758ec2b8b6a2231d7f0fffeca6fd2a90ecf363c6",
"title": "Evaluación precisa del autismo para niños | Arizona Institute for Autism",
"description": "Obtenga evaluaciones integrales de autismo infantil en Scottsdale, AZ. Nuestro equipo de expertos proporciona evaluaciones precisas para apoyar el desarrollo único de su hijo.",
"h1": [
"Psicológicos"
],
"canonical": "https://www.azinstitute4autism.com/es/autism-evaluations",
"links": [
{
"label": "trastorno del espectro autista (TEA)",
"href": "https://www.childrens.com/specialties-services/conditions/autism-spectrum-disorder"
},
{
"label": "Programar una cita",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"Escala de Observación para el Diagnóstico del Autismo (ADOS)",
"ADOS es una herramienta de evaluación estructurada que utilizan nuestros especialistas para evaluar comportamientos relacionados con los trastornos del espectro autista. Apropiada para niños de todas las edades, ADOS nos ayuda a comprender las habilidades sociales y del lenguaje de su hijo/a, así como su nivel general de desarrollo."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/es/learner-social-club",
"observedAt": "2026-10-09T01:26:33.733723+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:34 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:22 GMT",
"x-hs-cf-cache-status": "MISS",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:22 GMT",
"server": "cloudflare",
"cf-ray": "a479990d5f713c7e-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "2740d0ffc65bed908841c756f68ab911c3213634391d892edc127980aca80f46",
"title": "Impulsa el funcionamiento emocional y social con Learner Social Club en AIA",
"description": "Póngase en contacto con AIA para obtener un pase de prueba gratuito de 1 día y ver cómo el desarrollo social y emocional de su hijo puede beneficiarse de nuestro Learner Social Club de 8 a 17 años.",
"h1": [
"Sociológico"
],
"canonical": "https://www.azinstitute4autism.com/es/learner-social-club",
"links": [
{
"label": "Enroll Now",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"Learner Social Club actualmente atiende a jóvenes de 8 a 17 años. Nuestras opciones de horario flexible actualmente incluyen:",
"Tipo de pago: Pago particular"
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/es/services",
"observedAt": "2026-10-09T01:26:35.259757+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:35 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:22 GMT",
"x-hs-cf-cache-status": "REVALIDATED",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:22 GMT",
"server": "cloudflare",
"cf-ray": "a4799916dd444896-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "de5dca3a3265e12d894a34f5dcddd8b3730df70829bebd3e93482367f3d60098",
"title": "Servicios pediátricos de autismo conductuales, psicológicos y sociológicos",
"description": "Descubra servicios integrales para el autismo para niños, desde terapia ABA integrativa hasta apoyo educativo y familiar, en el Instituto de Autismo de Arizona.",
"h1": [
"Servicios ABA y Educativos"
],
"canonical": "https://www.azinstitute4autism.com/es/services",
"links": [
{
"label": "Discover More",
"href": "https://www.hubspot.com/"
},
{
"label": "Get Started",
"href": "https://www.hubspot.com/"
},
{
"label": "Inicio",
"href": "https://www.azinstitute4autism.com/es/?hsLang=es"
},
{
"label": "Consulte con un Defensor del Cliente",
"href": "https://www.azinstitute4autism.com/es/client-consultation?hsLang=es"
},
{
"label": "Servicios Conductuales",
"href": "https://www.azinstitute4autism.com/aba-therapy?hsLang=es"
},
{
"label": "Servicios Psicológicos",
"href": "https://www.azinstitute4autism.com/autism-evaluations?hsLang=es"
},
{
"label": "Servicios Sociológicos",
"href": "https://www.azinstitute4autism.com/learner-social-club?hsLang=es"
},
{
"label": "Programe una consulta gratuita",
"href": "https://www.azinstitute4autism.com/client-consultation?hsLang=es"
}
],
"iframes": [],
"excerpts": [
"Aproximadamente 1 de cada 36 niños en los Estados Unidos recibirá un diagnóstico de autismo cada año. Si su hijo presenta alguno de los comportamientos enumerados anteriormente, es posible que le diagnostiquen un trastorno del espectro autista. Diagnosticar a niños con Trastorno del Espectro Autista puede ser desafiante y complejo. Lo más importante que puedes hacer es consultar a un profesional si crees que tu hijo muestra un comportamiento atípico.",
"Para cumplir los criterios diagnósticos de TEA, un niño debe tener déficits persistentes en cada una de las tres áreas de comunicación e interacción social, además de al menos dos de los cuatro tipos de comportamientos repetitivos restringidos. ¡Consulte hoy mismo a un Defensor del Cliente para recibir apoyo individual y familiar!"
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/es/client-consultation",
"observedAt": "2026-10-09T01:26:36.736417+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:37 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sun, 04 Oct 2026 00:00:44 GMT",
"x-hs-cf-cache-status": "REVALIDATED",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sun, 04 Oct 2026 00:00:44 GMT",
"server": "cloudflare",
"cf-ray": "a47999201ee950a9-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "3801f2baa73936af70c5298be91db629e0257fc5fb6e80c9ce22b79b74e3c95e",
"title": "Formulario de Consulta del Cliente | Arizona Institute for Autism | Scottsdale",
"description": "Programa tu consulta gratuita con un Defensor del Cliente en el Instituto de Autismo de Arizona para descubrir qué podemos hacer por tu hijo diagnosticado con autismo.",
"h1": [
"Programa tu consulta gratuita"
],
"canonical": "https://www.azinstitute4autism.com/es/client-consultation",
"links": [],
"iframes": [
"https://form.jotform.com/250727122848156"
],
"excerpts": [
"Aquí en el Instituto de Autismo de Arizona (AIA), tenemos una política de lista de espera cero y brindamos atención clínica experta para niños diagnosticados con autismo. Actualmente atendemos a familias en las áreas metropolitanas de Scottsdale, Gilbert, Mesa, Tempe y Phoenix."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/es/aba-therapy-intake-process",
"observedAt": "2026-10-09T01:26:38.213768+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:38 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:18 GMT",
"x-hs-cf-cache-status": "MISS",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:18 GMT",
"server": "cloudflare",
"cf-ray": "a4799929590eaebe-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "7ac84bd729ad4f07db606c01e14422fde0aad46b880bf1a10251acbf5512f97c",
"title": "Guía paso a paso para comenzar la terapia ABA | Arizona Institute for Autism",
"description": "Descubra cómo comenzar la terapia ABA en el Instituto de Autismo de Arizona. Nuestro proceso de admisión simple y de apoyo guía a su hijo hacia el crecimiento y el éxito.",
"h1": [
"Proceso de admisión de estudiantes"
],
"canonical": "https://www.azinstitute4autism.com/es/aba-therapy-intake-process",
"links": [
{
"label": "Take the First Step",
"href": "https://www.azinstitute4autism.com/client-consultation?hsLang=es"
}
],
"iframes": [],
"excerpts": [
"Comience completando nuestro Paquete de Información para Estudiantes, que recopila información esencial sobre su hijo. Este paquete proporciona a nuestro equipo información inicial para comprender las necesidades únicas de su hijo.Después de enviar el paquete, nuestro Defensor del Cliente se pondrá en contacto con usted de inmediato para discutir los próximos pasos, responder a sus preguntas y guiarlo a través del proceso de admisión. Estamos aquí para apoyarte en cada paso del camino, asegurándonos de que te sientas cómodo e informado desde el principio.",
"2. Hable con un Defensor del Cliente de AIA",
"Nuestro equipo dedicado de Defensores del Cliente es apasionado por ayudar a las familias en cada aspecto de comenzar la terapia ABA. Durante esta conversación inicial, su Defensor/a:",
"4. Verificar la información del seguro y la facturación",
"Para asegurar un inicio fluido de la terapia, nuestro gerente de facturación verificará su cobertura y beneficios de seguro una vez que su paquete de admisión esté completo. Nuestro equipo de facturación:",
"Revisa los detalles de tu plan de seguro, incluida la cobertura de terapia ABA.",
"Responda a sus preguntas relacionadas con la facturación, manteniendo la transparencia y la claridad.",
"Con sus detalles de admisión y facturación finalizados, nuestro Defensor del Cliente le ayudará a programar una evaluación exhaustiva con nuestro equipo clínico.Trabajaremos estrechamente con usted para encontrar un horario de cita que se adapte a la agenda de su familia y a la comodidad de su hijo. Esta evaluación es un paso vital para comprender las fortalezas de su hijo e identificar áreas donde necesita apoyo específico.La información recopilada durante la evaluación guiará la creación de un plan de tratamiento personalizado diseñado específicamente para apoyar el crecimiento y los hitos de desarrollo de su hijo."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/schedule-consultation",
"observedAt": "2026-10-09T01:26:39.574860+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:39 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:23 GMT",
"x-hs-cf-cache-status": "REVALIDATED",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:23 GMT",
"server": "cloudflare",
"cf-ray": "a4799931d96e2bbd-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "7254085c5296eaa0339404e05a318e4b90c69d185b4e9bf059e44cb8e8ea2ab2",
"title": "Contact Arizona Institute for Autism for Your Free ASD Consultation",
"description": "Reach out to discuss autism treatment for your child with AZ Institute for Autism. Early intervention makes a difference; schedule your consultation today!",
"h1": [
"Reach Out for Your Free Consultation"
],
"canonical": "https://www.azinstitute4autism.com/schedule-consultation",
"links": [],
"iframes": [],
"excerpts": [
"A Client Advocate from Arizona Institute for Autism will contact you within one business day upon submission of this form.",
"Arizona Institute for Autism (AIA) is home to leading experts in behavioral health and special education. We provide clinical care for children and teens diagnosed with autism and have a no wait list policy.",
"AIA currently serves families in the Greater Phoenix Metropolitan area including Scottsdale, Gilbert, Mesa, and Tempe. We also provide in-home ABA therapy services for families of children diagnosed with autism in Tucson.",
"Along with ABA therapy for children and teens diagnosed with autism, our supportive services include autism advocacy, family training, and community outreach."
],
"freshness": "potentially stale: children and teens contradicts AIA editorial confirmation on 2026-10-08",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/insurance",
"observedAt": "2026-10-09T01:26:41.054992+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:26:41 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:18 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:18 GMT",
"server": "cloudflare",
"cf-ray": "a479993b4afc2abb-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "76445f34f71556c6f738ad80458cc658ac30f19f2fa595b120ce19743a404903",
"title": "Arizona Autism Therapy Insurance Guide | AZ Institute for Autism",
"description": "Take the first step to affordable autism care for your child. Verify insurance benefits and coverage quickly and easily with Arizona Institute for Autism.",
"h1": [
"Insurance Guide"
],
"canonical": "https://www.azinstitute4autism.com/insurance",
"links": [
{
"label": "Tricare ECHO website",
"href": "https://tricare.mil/echo"
},
{
"label": "Arizona Department of Education's ESA page",
"href": "https://www.azed.gov"
}
],
"iframes": [],
"excerpts": [
"Insurance Guide",
"Insurance Coverage for Autism Treatment in Arizona",
"Navigating insurance coverage for autism therapy can be complex. At the Arizona Institute for Autism (AIA), we're committed to guiding you through your insurance options to ensure your child receives the necessary care.",
"Accepted Insurance Carriers",
"We proudly partner with most major insurance carriers providing autism treatment benefits in Arizona. Our team regularly works with insurance plans such as the following.",
"We recognize the dedication and immense effort families devote to supporting their children. Our helpful team offers personalized consultations—both in person by appointment and over the phone—to explain the billing process thoroughly. Our goal is to ensure you feel informed and supported at every stage.",
"Frequently Asked Insurance Questions"
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/aba-therapy?migration_review=20261009T0130",
"observedAt": "2026-10-09T01:28:06.181582+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:28:06 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:27:01 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:27:01 GMT",
"server": "cloudflare",
"cf-ray": "a4799b4f181ccb9a-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "3e4835ea8562169812c61b0d98603daf7124ce4006f8b37a0539beb3d837d0be",
"title": "Integrated ABA Therapy for Autism | Arizona Institute for Autism",
"description": "Empower your child for life with one-on-one integrated ABA therapy. Book a free consultation and join our supportive autism community!",
"h1": [
"Behavioral"
],
"canonical": "https://www.azinstitute4autism.com/aba-therapy",
"links": [
{
"label": "Make an Appointment",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"The ABA Therapy 1:1 program, designed for children aged 18 months to 8 years, adopts an integrative approach aimed at fostering independent learning. The Arizona Institute for Autism employs a naturalistic, neurodiversity-affirming model within its applied behavior analysis (ABA) program, incorporating essential insights from neuroscientific research.",
"The ABA Therapy 1:2 Academic Readiness Program is specifically designed for children aged 2 to 6 years and utilizes a tailored group therapy approach to prepare learners for successful integration into the mainstream classroom.This program incorporates the AIA Preparatory Academy© curriculum, combining the esteemed Montessori method with Applied Behavior Analysis (ABA). This integrated approach fosters a supportive environment tailored to the individual learning styles and strengths of our learners, facilitating the development of essential social, communication, cognitive, and motor skills necessary for success in mainstream classrooms."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/es/aba-therapy?migration_review=20261009T0130",
"observedAt": "2026-10-09T01:28:07.479861+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:28:07 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:14 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:14 GMT",
"server": "cloudflare",
"cf-ray": "a4799b575d3e2f3d-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "bf5c84fae42bbb11b6bd3e73cd28487bfee895769129f442b7ee92fe01e773e9",
"title": "Terapia ABA Integrada para el Autismo | Arizona Institute for Autism",
"description": "Empodere a su hijo para la vida con terapia ABA integrada individualizada. ¡Reserva una consulta gratuita y únete a nuestra comunidad de apoyo para el autismo!",
"h1": [
"Conductual"
],
"canonical": "https://www.azinstitute4autism.com/es/aba-therapy",
"links": [
{
"label": "Hacer una cita",
"href": "https://form.jotform.com/231638510219149"
}
],
"iframes": [],
"excerpts": [
"El programa de Terapia ABA 1:1, diseñado para niños de 18 meses a 8 años, adopta un enfoque integrador destinado a fomentar el aprendizaje independiente. El Arizona Institute for Autism emplea un modelo naturalista y que afirma la neurodiversidad dentro de su programa de análisis de comportamiento aplicado (ABA), incorporando conocimientos esenciales de la investigación neurocientífica.",
"El programa de preparación académica 1:2 de terapia ABA está diseñado específicamente para niños de 2 a 6 años y utiliza un enfoque de terapia grupal personalizado para preparar a los estudiantes para una integración exitosa en el aula regular. Este programa incorpora el currículo de la AIA Preparatory Academy©, combinando el estimado método Montessori con el Análisis de Comportamiento Aplicado (ABA). Este enfoque integrado fomenta un entorno de apoyo adaptado a los estilos de aprendizaje y fortalezas individuales de nuestros estudiantes, facilitando el desarrollo de habilidades sociales, comunicativas, cognitivas y motoras esenciales necesarias para el éxito en las aulas regulares."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/client-consultation?migration_review=20261009T0130",
"observedAt": "2026-10-09T01:28:08.800682+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:28:08 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sun, 04 Oct 2026 00:00:00 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sun, 04 Oct 2026 00:00:00 GMT",
"server": "cloudflare",
"cf-ray": "a4799b5fb92b23fc-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "df31e8f2bc82d47e0cc1c2144177047d7f37fdfc39a0d18c26fca3a8db4cdf9b",
"title": "Client Consultation Form | Arizona Institute for Autism | Scottsdale",
"description": "Schedule your free consultation with a Client Advocate at Arizona Institute for Autism to find out what we can do for your child diagnosed with autism.",
"h1": [
"Schedule Your Free Consultation"
],
"canonical": "https://www.azinstitute4autism.com/client-consultation",
"links": [],
"iframes": [
"https://form.jotform.com/250727122848156"
],
"excerpts": [
"At the Arizona Institute for Autism (AIA), we have a no wait list policy and provide expert clinical care for children diagnosed with autism. We currently serve families in Scottsdale, Gilbert, Mesa, Tempe, and Phoenix Metropolitan areas."
],
"freshness": "potentially cached; fresh retrieval does not establish origin freshness",
"method": "GET"
},
{
"url": "https://www.azinstitute4autism.com/schedule-consultation?migration_review=20261009T0130",
"observedAt": "2026-10-09T01:28:10.140915+00:00",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"headers": {
"date": "Fri, 09 Oct 2026 01:28:10 GMT",
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:23 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:23 GMT",
"server": "cloudflare",
"cf-ray": "a4799b681e092abd-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"sha256": "7254085c5296eaa0339404e05a318e4b90c69d185b4e9bf059e44cb8e8ea2ab2",
"title": "Contact Arizona Institute for Autism for Your Free ASD Consultation",
"description": "Reach out to discuss autism treatment for your child with AZ Institute for Autism. Early intervention makes a difference; schedule your consultation today!",
"h1": [
"Reach Out for Your Free Consultation"
],
"canonical": "https://www.azinstitute4autism.com/schedule-consultation",
"links": [],
"iframes": [],
"excerpts": [
"A Client Advocate from Arizona Institute for Autism will contact you within one business day upon submission of this form.",
"Arizona Institute for Autism (AIA) is home to leading experts in behavioral health and special education. We provide clinical care for children and teens diagnosed with autism and have a no wait list policy.",
"AIA currently serves families in the Greater Phoenix Metropolitan area including Scottsdale, Gilbert, Mesa, and Tempe. We also provide in-home ABA therapy services for families of children diagnosed with autism in Tucson.",
"Along with ABA therapy for children and teens diagnosed with autism, our supportive services include autism advocacy, family training, and community outreach."
],
"freshness": "potentially stale: children and teens contradicts AIA editorial confirmation on 2026-10-08",
"method": "GET"
}
],
"externalDestinationChecks": [
{
"url": "https://form.jotform.com/231638510219149",
"observedAt": "2026-10-09T01:30:34.576858+00:00",
"status": 200,
"location": null,
"note": "GET status check only; no scripts or form submission"
},
{
"url": "https://form.jotform.com/250727122848156",
"observedAt": "2026-10-09T01:30:35.880703+00:00",
"status": 200,
"location": null,
"note": "GET status check only; no scripts or form submission"
}
]
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,343 @@
{
"phase": "5C",
"recordedAt": "2026-10-09T17:13:35Z",
"startingCheckpoint": "bc399b43b65fd865526fd68fa4252c99587f59dd",
"scope": "Published English Team page roster, supporting copy, careers contact and CTA, Team photographs, and page metadata",
"method": "robots.txt followed by two bounded, sequential read-only Team-page GETs with no-cache request headers and one query recheck; ten published Team/hero image GETs and one social-image GET; no authentication, form submission, API call, script execution through direct requests, or production write. An independent web rendering matched the direct response. Playwright browser validation was attempted but failed because the browser transport closed.",
"robots": {
"url": "https://www.azinstitute4autism.com/robots.txt",
"observedAt": "2026-10-09T17:11:37Z",
"status": 200,
"cacheControl": "s-maxage=36000, max-age=5",
"etag": "\"dffaeb51ed776c4737cfc1b108c56515\"",
"lastModified": "Sat, 12 Sep 2026 03:33:09 GMT",
"hubspotCacheStatus": "HIT",
"prerendered": "Sat, 12 Sep 2026 03:33:09 GMT",
"relevantPolicy": "User-agent * allows /; HubSpot preview and hsCacheBuster query patterns are disallowed."
},
"requests": [
{
"url": "https://www.azinstitute4autism.com/team",
"observedAt": "2026-10-09T17:11:39Z",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"responseHeaders": {
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:20 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:20 GMT",
"server": "cloudflare",
"cf-ray": "a47f01762f826e62-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"bodySha256": "246f1afc7ebee26cf855f79fd82b3b734c717969bcd8e00361108d68af867adf"
},
{
"url": "https://www.azinstitute4autism.com/team?migration_review=20261009T_phase5c",
"observedAt": "2026-10-09T17:11:40Z",
"status": 200,
"requestHeaders": {
"Cache-Control": "no-cache, max-age=0",
"Pragma": "no-cache"
},
"responseHeaders": {
"cache-control": "s-maxage=36000, max-age=5",
"last-modified": "Sat, 03 Oct 2026 23:13:20 GMT",
"x-hs-cf-cache-status": "HIT",
"x-hs-cache-control": "s-maxage=36000, max-age=0",
"x-hs-prerendered": "Sat, 03 Oct 2026 23:13:20 GMT",
"server": "cloudflare",
"cf-ray": "a47f017f2e02f7bd-LAX",
"age": null,
"etag": null,
"cf-cache-status": null
},
"bodySha256": "246f1afc7ebee26cf855f79fd82b3b734c717969bcd8e00361108d68af867adf"
}
],
"sourceFreshness": {
"classification": "potentially cached but consistently publicly presented",
"reason": "Both direct responses are byte-identical HubSpot/Cloudflare HITs and identify an October 3 prerender. An independent current web rendering shows the same ordered roster, copy, links, and image assignments. No contradictory public response was found. The reconciliation describes only the current published page and makes no inference about personnel history or underlying employment records."
},
"metadata": {
"title": "Meet Our Dedicated Autism Support Team | Arizona Institute for Autism",
"description": "Meet the all-star team of compassionate, experienced professionals transforming personalized autism therapy and education at Arizona Institute for Autism.",
"canonical": "https://www.azinstitute4autism.com/team",
"h1": "Meet the Team",
"openGraphType": "website",
"socialImage": "https://www.azinstitute4autism.com/hubfs/AIALanding_BG_V2.jpg",
"socialImageAlt": "learn more about arizona institute for autism"
},
"content": {
"intro": {
"heading": "Our Clinical Team",
"organization": "Arizona Institute for Autism",
"location": "Scottsdale, Arizona",
"body": "AIA's clinical team consists of experienced professionals and paraprofessionals as well as Board Certified Behavior Analysts (BCBA) and Psychologists who have diverse experience and expertise."
},
"groups": [
{
"heading": "Board Certified Behavioral Analysts & Psychologists",
"members": [
{
"name": "Rula Diab, BCBA, LBA, M.Ed",
"role": "Clinical Director",
"image": "https://www.azinstitute4autism.com/hubfs/team-rula-diab.webp",
"sourceAlt": "chief clinical director rula diab"
},
{
"name": "Jennifer Espinoza, MAOL/ABA",
"role": "Clinical BCBA",
"image": "https://www.azinstitute4autism.com/hubfs/team-jennifer-espinoza.webp",
"sourceAlt": "team jennifer espinoza"
}
]
},
{
"heading": "Clinical Support",
"members": [
{
"name": "Jennifer Bonefont, B.A. Psy",
"role": "Clinical Client Advocate Supervisor",
"image": "https://www.azinstitute4autism.com/hubfs/team-jennifer-bonefont.webp",
"sourceAlt": "team jennifer bonefont"
}
]
},
{
"heading": "Clinical Case Supervisors",
"members": [
{
"name": "Rachael Sanchez, BS, M Psy/ABA",
"role": "Clinical Supervisor",
"image": "https://www.azinstitute4autism.com/hubfs/team-rachael-sanchez.webp",
"sourceAlt": "team rachael sanchez"
}
]
},
{
"heading": "Clinical Education Specialists",
"members": [
{
"name": "Mahima Bedi",
"role": "Clinical Instructor",
"image": "https://www.azinstitute4autism.com/hubfs/team-mahima-bedi.webp",
"sourceAlt": "team mahima bedi"
}
]
},
{
"sectionHeading": "Our ABA Care Team",
"heading": "ABA Clinic Management",
"tagline": "Applied Behavior Analysis \"(ABA) at your service\"",
"members": [
{
"name": "Mariah Marley",
"role": "Claims Billing",
"image": "https://www.azinstitute4autism.com/hubfs/team-mariah-marley.webp",
"sourceAlt": "team mariah marley"
},
{
"name": "Eney Garcia, BA",
"role": "Accounts Billing",
"image": "https://www.azinstitute4autism.com/hubfs/team-eney-garcia.webp",
"sourceAlt": "team eney garcia"
},
{
"name": "Ayah Shahbander",
"role": "Human Resources",
"image": "https://www.azinstitute4autism.com/hubfs/team-ayah-shahbander.webp",
"sourceAlt": "team ayah shahbander"
},
{
"name": "Barbara Samanich, BFA",
"role": "Creative Marketing Developer",
"image": "https://www.azinstitute4autism.com/hubfs/team-barbara-samanich.webp",
"sourceAlt": "team barbara samanich"
}
],
"closingStatement": "ABA's leading experts in special education and clinical care."
}
],
"careers": {
"eyebrow": "Join the AIA Team!",
"heading": "Employment Opportunities",
"intro": "Apply online to join the AIA team! At the Arizona Institute for Autism (AIA) we are on a mission to improve special education and strengthen communities throughout Arizona.",
"contactText": "Our talented and passionate employees are a critical piece to the high-quality ABA therapy we provide along with our commitment to behavioral health, school solutions, and community outreach. For questions regarding open positions, please contact us at",
"ctaLabel": "View Open Positions",
"ctaUrl": "https://www.azinstitute4autism.com/careers?hsLang=en",
"hrFallbackInSource": "hr [at] abaclinicaz [dot] com",
"hrScriptText": "hr@azinstitute4autism.com",
"hrScriptDestination": "mailto:hr@azinstitute4autism.com",
"contactResolution": "Use hr@azinstitute4autism.com as the single active value and generate the no-JavaScript fallback from it; this matches production's executable text and destination while removing its internal fallback mismatch."
},
"footerContact": {
"phone": "(480) 687-7099",
"email": "info@azinstitute4autism.com",
"address": "8901 E Raintree Dr Ste 160, Scottsdale, AZ 85260",
"resolution": "Existing shared site data matches production; unchanged in Phase 5C."
}
},
"reconciliation": [
{
"group": "Board Certified Behavioral Analysts & Psychologists",
"existingAstro": "Rula Diab; Jennifer Espinoza; Timirah Clay",
"production": "Rula Diab; Jennifer Espinoza",
"resolution": "Retain the first two in published order; remove the Timirah Clay entry from the migrated public roster. This is not an employment-status finding."
},
{
"group": "Clinical Support",
"existingAstro": "Carol Harrington; Rachel Crosby; Jennifer Bonefont",
"production": "Jennifer Bonefont",
"resolution": "Retain Jennifer Bonefont; remove the Carol Harrington and Rachel Crosby entries from the migrated public roster. This is not an employment-status finding."
},
{
"group": "Clinical Case Supervisors",
"existingAstro": "Rachael Sanchez",
"production": "Rachael Sanchez",
"resolution": "Retain name, credentials, role, image, and order."
},
{
"group": "Clinical Education Specialists",
"existingAstro": "Mahima Bedi",
"production": "Mahima Bedi",
"resolution": "Retain name, role, image, and order."
},
{
"group": "ABA Clinic Management",
"existingAstro": "Mariah Marley; Eney Garcia; Ayah Shahbander; Barbara Samanich",
"production": "Mariah Marley; Eney Garcia; Ayah Shahbander; Barbara Samanich",
"resolution": "Retain all names, credentials, roles, images, and order; restore the published Our ABA Care Team heading and closing statement to rendered output."
}
],
"assets": [
{
"source": "https://www.azinstitute4autism.com/hubfs/hero-meet-the-aia-team.webp",
"local": "/assets/images/hero-meet-the-aia-team.webp",
"status": 200,
"dimensions": "1200x428",
"sha256": "86e8ff93f42c93e84cd50bf0edbff2f93422decc630234f79d5f147bc5f560ac",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/AIALanding_BG_V2.jpg",
"local": "/assets/images/AIALanding_BG_V2.jpg",
"status": 200,
"dimensions": "2200x1146",
"sha256": "3036a9dc996b8ccd4672451fcc83b31b0421db4413f20d891f64f47d7707d6a8",
"localMatch": "new exact self-hosted copy",
"response": {
"observedAt": "2026-10-09T17:13:35Z",
"cf-cache-status": "HIT",
"age": "1945333",
"etag": "\"228eba211291cab48d2e9edc3c811118\"",
"last-modified": "Tue, 04 Feb 2025 22:36:06 GMT"
}
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-rula-diab.webp",
"local": "/assets/images/team-rula-diab.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "6382277beb23ff9bc98edda79d62636a01a63504ceb6d0fa2af5d9d30fa12bc0",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-jennifer-espinoza.webp",
"local": "/assets/images/team-jennifer-espinoza.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "28d3512fc70def1604320eba3336745d5c671651a2994f31eaedcce3b477dd38",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-jennifer-bonefont.webp",
"local": "/assets/images/team-jennifer-bonefont.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "f3aac4faaff9ef45c03c613c00ec41e5711de023b53c156a8f70a5225c0cc2e4",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-rachael-sanchez.webp",
"local": "/assets/images/team-rachael-sanchez.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "93f573767cef7eb5768aecbc99dee49da7cb0d5935812a3933fedd72d4771407",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-mahima-bedi.webp",
"local": "/assets/images/team-mahima-bedi.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "4253c63f9b37d00feb7dd74da19cd0a99c32c1143477fb33979932f982e10487",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-mariah-marley.webp",
"local": "/assets/images/team-mariah-marley.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "1269d1e32d8aa75c758aa68aad91866e171bce01a19be7034c6763d373e3a196",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-eney-garcia.webp",
"local": "/assets/images/team-eney-garcia.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "dac8113ad3d2424bf435ce740320d65692fd8aca1c155e62398077c578047533",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-ayah-shahbander.webp",
"local": "/assets/images/team-ayah-shahbander.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "bcece062e538264af4a250379b7e4142f369179a22b8884abbb614a28ce40c23",
"localMatch": true
},
{
"source": "https://www.azinstitute4autism.com/hubfs/team-barbara-samanich.webp",
"local": "/assets/images/team-barbara-samanich.webp",
"status": 200,
"dimensions": "342x456",
"sha256": "96b28fe1dca89cb365c7dad5710853d39406deec3ee74d8b1ad3b0c17f245a86",
"localMatch": true
}
],
"assetSafety": "All retrieved roster/hero assets identify as WebP with expected dimensions; the social image identifies as a progressive JPEG. The nine rendered portraits and hero are byte-for-byte matches to existing local files. No executable or unexpected embedded content was identified by file-type inspection.",
"validation": {
"completedAt": "2026-10-09T17:20:21Z",
"seoTests": "34 passed, including four Phase 5C Team tests",
"publicationTests": "33 passed",
"markdownTests": "20 passed",
"normalBuilds": "initial and final builds passed; Astro check reported 0 errors, 0 warnings, and 0 hints; 96 routes",
"indexingBuild": "passed; 96 routes, 92 sitemap URLs, and 174 hreflang links across 53 pages",
"routeAudit": "offline reconciliation and --check passed using 70 inherited production observations; no new production requests",
"linkAudit": "0 broken internal links",
"imageAudit": "0 missing mapped page images",
"blogAudit": "0 failures",
"finalStaging": "96 routes; all noindex,nofollow; empty sitemap; no hreflang",
"routeSet": "unchanged from the pre-Phase 5C staging artifact"
},
"browserValidation": {
"status": "unavailable",
"reason": "Playwright browser transport closed before navigation completed.",
"claim": "No browser-level desktop/mobile fidelity claim is made."
},
"limitations": [
"Current public presentation is evidence for migration output, not evidence of hiring, departure, promotion, dates, or underlying employment status.",
"Professional credentials and group membership are reproduced only as published and are not independently verified.",
"The October 3 HubSpot prerender may be cached; no conflicting public version was found, and repeated/current independent views agree.",
"Production's HR fallback domain conflicts with its executable link text and destination; Astro resolves that internal mismatch in favor of the active azinstitute4autism.com destination.",
"Raw production HTML, cookies, and removed nonpublic personnel information are not committed. Historical migration observations remain unchanged."
]
}
@@ -0,0 +1,550 @@
# Phase 6A Library Architecture Proposal
**Decision date:** 2026-10-09 UTC
**Starting checkpoint:** `34d5394b3ce765028a27b9cddd9952de3f09bfe7`
**Status:** proposal only; implementation is not authorized
## A. Executive Decision Summary
### Recommended architecture
1. **Search:** generate one compact JSON document index per language from the
existing publication manifest and blog collection. Load it on demand and use
a small dependency-free TypeScript client for normalization, ranking, result
rendering, URL state, and accessibility. Search title, description, headings,
category, author display data, and future tags. Do not index full article
bodies in the first release.
2. **Library pagination:** render ten articles per static page, matching the
verified production page size. Keep each locale's existing Library root as
page 1, generate only nonempty `/page/{n}` pages for `n >= 2`, and permanently
redirect `/page/1` aliases to the corresponding root.
3. **Author archives:** derive localized author pages and their pagination from
author records plus the same eligible-post catalog. Generate no manually
maintained post lists. Author roots use explicit author `translationKey`
relationships; numbered author pages do not become translations merely
because their numbers match.
4. **Routing and policy:** add archive/search descriptors to the shared route and
publication model rather than creating a second eligibility system. The
existing `[...slug].astro` manifest-driven route architecture should dispatch
content and generated archive kinds from one validated static-path inventory.
5. **Progressive enhancement:** server-rendered paginated Library and author
pages remain complete navigation without JavaScript. Search is an explicit
enhancement; without JavaScript the search control is not presented as
functional and visitors retain normal archive navigation.
This is preferable at the present scale because the three measured metadata
indexes total **42,090 bytes uncompressed, 12,693 bytes gzip, or 10,709 bytes
Brotli** for 65 records. English alone is 26,391/8,036/6,652 bytes. A custom
metadata index keeps queries local, adds no package or service, excludes drafts
at build time, and can implement Spanish/Arabic normalization explicitly. A
full-body prototype would be 474,623 bytes uncompressed and 135,796 bytes gzip;
that additional payload is not justified by a verified visitor requirement.
### Important tradeoffs
- Metadata search will not find a term appearing only in article body copy.
- Dependency-free ranking will be deterministic and understandable but less
sophisticated than fuzzy/stemmed third-party search.
- Production currently has 55 English articles and six ten-item pages; Astro has
46 English records and can create only five nonempty pages. The nine missing
Phase 6C articles must be reconciled before English page 6 and author page 6
can be accepted. The architecture must not create an empty page or redirect a
distinct archive page merely to satisfy a route count.
- The current localized author records are structurally usable but their names
and English-only short descriptions do not reproduce the current Spanish and
Arabic archive headings/biographies. Author content needs source-supported
reconciliation and human language review before those archives publish.
### Approval gates
Approval is required for the metadata-only search scope, the `/search`
compatibility behavior, inclusion of accessible noindex syndicated records in
listings/search, pagination/archive indexing and sitemap treatment, author
record changes, and sequencing Phase 6C before final English pagination.
## B. Current Architecture Inventory
### Rendering and routing
- `src/pages/[...slug].astro` asks `getPublicationManifest()` for every eligible
page/post route and dispatches the three `slug: library` records to separate
English, Spanish, and Arabic components. There is no generated archive kind.
- `LibraryEnglish.astro`, `LibrarySpanish.astro`, and `LibraryArabic.astro` each
independently filter the manifest by language, sort by date descending, render
every eligible post, and repeat a five-item “popular” slice. English alone
renders an inert `<input type="search">`; no script, form, filtering, state, or
announcements exist.
- `BlogIndexLayout.astro` supplies shared hero/intro/sidebar layout and delegates
list contents. `BlogCard.astro` creates localized article URLs and dates, but
hardcodes Rula Diab's English byline/avatar and does not link to an author
archive.
- `BlogPostLayout.astro` likewise hardcodes the visible English byline. Its
BlogPosting JSON-LD independently resolves an exact locale/slug author and
already fails for missing or ambiguous records.
- The three Library Markdown bodies contain old extracted listing snapshots.
`[...slug].astro` bypasses these bodies, so they do not render, but they are a
competing stale representation. Phase 6B should replace them with maintenance
notes only after the generated Library implementation is accepted.
### Publication and translation policy
- `publication.ts` combines page and blog collections and delegates route,
canonical, eligibility, sitemap, collision, and translation validation to
`publication-policy.ts`.
- Drafts are not generated. Published noindex and external-canonical records are
generated but excluded from the sitemap and hreflang graph. Staging globally
emits `noindex,nofollow`, an empty sitemap, and no hreflang.
- Translation equivalence is explicit and collection-scoped through
`translationKey`; it is never guessed from slugs.
- Authors are intentionally outside the current publication manifest. Author
records declare locale and translation keys, but no author routes exist.
### Current content inventory
The historical 65-post count remains accurate, but it was independently
recalculated from the current files and frontmatter:
| Language | Records | Generated/non-draft | Noindex + external canonical | Sitemap-eligible | Raw Markdown/MDX body bytes |
| --- | ---: | ---: | ---: | ---: | ---: |
| English | 46 | 46 | 2 | 44 | 276,099 |
| Spanish | 12 | 12 | 0 | 12 | 105,272 |
| Arabic | 7 | 7 | 0 | 7 | 41,832 |
| **Total** | **65** | **65** | **2** | **63** | **423,203** |
There are no drafts. The two exceptions are
`community-highlight-meet-rula-diab` and `new-aia-scottsdale-office`; both are
accessible local English routes with verified `noindex` and external canonicals.
Current Library components use `eligible`, not `sitemapEligible`, so all 65
appear in lists.
Every record has title, description, date, author, category, featured image,
canonical, and translation key. All use category `Library`, all have an empty
tags array, none has `updatedDate`, and none supplies image `alt` frontmatter.
The content model can support tags and modification dates later without changing
the archive algorithm. Search should not pretend empty tags add useful ranking.
Equal-date sets exist in both English and Spanish. Current ordering is date
descending with an implicit stable route order inherited from the manifest.
The new catalog should make this explicit: **date descending, then normalized
route/slug ascending**.
### Author inventory and relationships
| Language | Author records | Author slug | Referencing posts |
| --- | ---: | --- | ---: |
| English | 1 | `rula-diab` | 46 |
| Spanish | 1 | `rula-diab` | 12 |
| Arabic | 1 | `rula-diab` | 7 |
The three records share `translationKey: rula-diab`, name `Rula Diab`, one
avatar, and the same short English description. The schema has `name`, `slug`,
optional `description`, optional `avatar`, `lang`, and `translationKey`. It is
sufficient to identify and relate archives, but not to reproduce production's
localized credentialed headings and biographies without content reconciliation.
An optional locale-specific `displayName` is justified for archive presentation
while preserving `name` as the person's name in BlogPosting schema. No multiple-
author field should be added until a real multi-author record requires it.
## C. Production Behavior and URL Evidence
### Method and freshness
`robots.txt` was checked first. It allows the requested public paths. Twenty-nine
bounded sequential GETs were made from **2026-10-09 18:01:51 through 18:02:17
UTC** with no-cache request headers, no redirect following, no authentication,
and no form submission. Requests covered representative roots, first-page
aliases, last pages, first invalid boundaries, author equivalents, and search.
One headless Chromium GET then allowed the existing search JavaScript to render
one result page; it did not submit a form or write to production.
HubSpot responses variously reported `HIT`, `MISS`, or `REVALIDATED` and mostly
identified October 3–4 prerenders. `Cache-Control: no-store, no-cache,
must-revalidate` did not establish origin freshness. Findings are current public
behavior from consistent responses, with potentially cached content. The older
2026-10-07 route report remains historical evidence for URLs not repeated.
### Observed behavior
| Family | Fresh result | Visible results | Navigation / metadata |
| --- | --- | ---: | --- |
| `/library` | 200, `lang=en-us` | 10 | Pages 1–6; page 6 has 5; page 7 is 404 |
| `/es/library` | 200, `lang=es` | 10 | Pages 1–2; page 2 has 2; page 3 is 404 |
| `/ar/library` | 200, `lang=ar dir=rtl` | 7 | One page; page 2 is 404 |
| English author root | 200 | 10 | Pages 1–6; page 6 has 5; page 7 is 404 |
| Spanish author root | 200 | 10 | Pages 1–2; page 2 has 2; page 3 is 404 |
| Arabic author root | 200, RTL | 7 | One page; page 2 is 404 |
All six `/page/1` candidates return 200 and show the same ordered article links,
title, and counts as their root rather than redirecting. English trailing slashes
on `/library/` and `/library/author/rula-diab/` return 301 to their no-slash
forms. The inspected archive/listing pages expose no canonical or robots meta;
their pagination/author URLs are absent from the production sitemap.
The author roots display substantial localized bios and credentialed headings:
English `Rula Diab, Clinical Director, M.Ed, BCBA, LBA`, a Spanish localized
equivalent, and an Arabic localized equivalent. These are not represented by
the current local author records and must not be invented from this report.
### Production search
Library search forms use GET `/search` with `term` plus repeated `type=BLOG_POST`
and `type=LISTING_PAGE`. The search page's own form uses `q` and also includes
`SITE_PAGE`. Raw `/search` and `/search?term=autism` HTML contains no results;
the existing HubSpot JavaScript loads them after page load.
A browser-level GET of
`/search?term=autism&type=BLOG_POST&type=LISTING_PAGE` displayed **66 mixed-
language results**, ten per result page, and result offsets `0`, `10`, … `60`.
The first page included English and Spanish Library roots/posts, confirming that
production search is global rather than scoped to the Library page's language.
The search page has no useful document title (raw parsing resolves an SVG title),
canonical, or robots directive. With JavaScript unavailable, production shows
no results.
## D. URL Disposition Matrix
`Current` below means the October 9 check; `historical` means the accepted
October 7 route evidence. Proposed archive pages are self-canonical, indexable,
and sitemap-eligible under the shared policy. `/search` is noindex and excluded.
| Production URL or pattern | Purpose / language | Evidence and existing behavior | Proposed Astro behavior and preservation | Redirect / canonical / indexing | Phase 6B validation |
| --- | --- | --- | --- | --- | --- |
| `/library` | Library page 1, EN | Current 200, 10 results, pages 1–6 | Preserve static page 1 | Self-canonical; index; sitemap; existing EN/ES/AR root hreflang | Generated HTML, canonical, first 10 sorted posts |
| `/es/library` | Library page 1, ES | Current 200, 10 results, pages 1–2 | Preserve static page 1 | Self-canonical; index; sitemap; existing root hreflang | Locale cards/date/labels and two-page navigation |
| `/ar/library` | Library page 1, AR | Current 200, 7 results, RTL | Preserve static one-page archive | Self-canonical; index; sitemap; existing root hreflang | `lang=ar dir=rtl`; no nonexistent page 2 |
| `/library/page/1` | First-page alias, EN | Current 200 duplicate | Preserve incoming URL through **301 to `/library`** | Redirect only; canonical destination `/library`; no HTML/sitemap | Redirect map and no duplicate HTML |
| `/es/library/page/1` | First-page alias, ES | Current 200 duplicate | 301 to `/es/library` | Redirect only | Redirect test |
| `/ar/library/page/1` | First-page alias, AR | Current 200 duplicate | 301 to `/ar/library` | Redirect only | Redirect test |
| `/library/page/2`–`/5` | Library pages, EN | Current 200; `/2` historical/current, `/3`–`/5` historical 200 | Generate nonempty ten-item pages from current corpus | Self-canonical; index; sitemap; no hreflang inferred | Route/card boundaries, prev/next, direct access |
| `/library/page/6` | Library last page, EN | Current 200 with 5 production posts | Generate only after Phase 6C supplies the missing records; do not create empty/redirected substitute | Self-canonical; index; sitemap once real | Phase 6C prerequisite; assert 5 real cards |
| `/library/page/7+` | Invalid future boundary, EN | Current `/7` 404 | Generate only if eligible count later requires it; otherwise 404 | No canonical/sitemap while absent | Beyond-last route absent |
| `/es/library/page/2` | Library last page, ES | Current 200 with 2 | Generate static page | Self-canonical; index; sitemap; no page-number hreflang | Exactly 2 cards today |
| `/es/library/page/3+` | Invalid boundary, ES | Current `/3` 404 | No route until count requires it | 404 while absent | Beyond-last route absent |
| `/ar/library/page/2+` | Invalid boundary, AR | Current `/2` 404 | No route until count requires it | 404 while absent | Beyond-last route absent |
| `/library/author/rula-diab` | Author root, EN | Current 200, localized bio, pages 1–6 | Generate from EN author record and posts after author content reconciliation | Self-canonical; index; sitemap; explicit author-root hreflang only | Author resolution, bio, links, first 10 posts |
| `/es/library/author/rula-diab` | Author root, ES | Current 200, Spanish bio, pages 1–2 | Generate from ES author record; no invented copy | Self-canonical; index; sitemap; author-root hreflang | Human-reviewed source content and route test |
| `/ar/library/author/rula-diab` | Author root, AR | Current 200, Arabic bio, RTL | Generate from AR author record; no invented copy | Self-canonical; index; sitemap; author-root hreflang | RTL and human-reviewed source content |
| `/library/author/rula-diab/page/1` | Author first alias, EN | Current 200 duplicate | 301 to author root | Redirect only | Redirect test |
| `/es/library/author/rula-diab/page/1` | Author first alias, ES | Current 200 duplicate | 301 to ES author root | Redirect only | Redirect test |
| `/ar/library/author/rula-diab/page/1` | Author first alias, AR | Current 200 duplicate | 301 to AR author root | Redirect only | Redirect test |
| `/library/author/rula-diab/page/2`–`/5` | Author pages, EN | Current/historical 200 | Generate from current matching posts | Self-canonical; index; sitemap; no numbered hreflang | Same deterministic chunks as Library today |
| `/library/author/rula-diab/page/6` | Author last page, EN | Current 200 with 5 | Generate after Phase 6C; no empty substitute | Self-canonical; index; sitemap once real | Phase 6C prerequisite |
| `/library/author/rula-diab/page/7+` | Invalid boundary, EN | Current `/7` 404 | 404 until count requires route | Absent from sitemap | Beyond-last route absent |
| `/es/library/author/rula-diab/page/2` | Author last page, ES | Current 200 with 2 | Generate static page | Self-canonical; index; sitemap | Exactly 2 matching posts |
| `/es/library/author/rula-diab/page/3+` | Invalid boundary, ES | Current `/3` 404 | No route until required | 404 | Boundary test |
| `/ar/library/author/rula-diab/page/2+` | Invalid boundary, AR | Current `/2` 404 | No route until required | 404 | Boundary test |
| `/search` | Search shell, global | Current 200; client-rendered; malformed/absent SEO metadata | Preserve one static compatibility route using generated locale indexes and locale filter | Self-canonical path; **noindex,follow**; no sitemap/hreflang | Direct route, empty state, JS/no-JS behavior |
| `/search?term={query}` and repeated `type` | Legacy search state | Current form behavior; mixed-language results | Read `term`; safely ignore legacy `type`; preserve URL and client-render compatible results | Canonical `/search`; noindex; query escaped | Direct-load and XSS/Unicode tests |
| `/search?q={query}` | Search-page form state | Current search page uses `q` | Accept as alias input; normalize to one in-page state without network forwarding | Canonical `/search`; noindex | `q` and `term` equivalence test |
| `/search?...&offset={10n}` | Search pagination state | Browser verified offsets 0–60 | Honor nonnegative multiples of 10 on compatibility route; invalid values normalize to 0 | Canonical `/search`; noindex | Direct page, last/invalid offset tests |
| `/{locale?}/library/` and author trailing slash variants | Normalization | English examples current 301; other variants not individually requested | Host-level 301 to no-slash normalized route | Redirect only | Redirect-map and deployment acceptance test |
## E. Search Alternatives and Comparison
| Approach | Quality / languages | Payload and build | Accessibility / privacy | Maintenance | Decision |
| --- | --- | --- | --- | --- | --- |
| Generated metadata JSON + custom TypeScript | Explicit field weighting; deterministic Unicode normalization; Spanish accent and Arabic mark handling tested locally; no stemming/fuzzy by default | Current all-language index 42,090 raw / 12,693 gzip; one small client module; ordinary Astro static endpoints | Full control of semantic form/status/focus; queries stay in browser except legacy `/search` URLs; no third party | Small project-owned helper and tests; transparent failure modes | **Recommended** |
| MiniSearch-style client index | Built-in field boost, prefix, fuzzy matching, suggestions | Adds dependency and serialized index/client code; exact project payload not measured because no package was installed | Local/private and static; UI still project-owned | Better relevance features, but tokenizer/fuzzy behavior needs locale tuning and dependency upkeep | Defer until measured search-quality failures justify it |
| Pagefind-style post-build search | Indexes rendered pages after Astro, separates indexes by document language, supports static hosting | Adds post-build executable/runtime bundles and tends toward full-page text; changes build/deployment pipeline | Local/private; UI can be accessible but requires integration; no server | Strong general-site search, but broader than this Library and duplicates manifest eligibility/filter work | Reject for current 65-record Library; reconsider for verified site-wide full-text search |
| External hosted search/API | Potentially strongest ranking/analytics | Network/service dependency and operational credentials | Visitor terms leave the site; logging, consent, retention, failure, and cost concerns | Highest operational burden | Reject under static/data-minimization requirements |
The proposed index stores route, locale, title, description, headings, category,
future nonempty tags, author display name/slug, and publication date. It excludes
article body HTML, unpublished content, likes/views, and sensitive or runtime
data. Featured images need not be duplicated; result cards can use the existing
article metadata or omit thumbnails in the compact search view.
Normalization should use Unicode NFKC, locale-aware lowercasing, collapsed
whitespace, and Unicode punctuation separators. A secondary comparison key may
fold Latin combining marks so `evaluacion` finds `evaluación`, and remove Arabic
tashkeel/tatweel so marked and unmarked forms match, while preserving original
display text. Do not apply English stemming to Spanish or Arabic. Rank exact
title phrase, title tokens, heading matches, description, category/tags, and
author in that order; break equal scores by date descending then route ascending.
Prefix matching should require a minimum token length. Empty queries render the
normal archive; no-result queries announce zero and offer clear/reset.
## F. Pagination and Author Architecture
### Shared catalog
Add a pure `library-catalog` module that accepts the existing publication
manifest and author records and returns:
- eligible posts grouped by locale;
- explicit deterministic ordering;
- ten-item page slices and nonempty page descriptors;
- exact locale/slug author resolution with duplicate/missing validation;
- author archive descriptors derived from post relationships;
- compact locale search records.
It must not read extracted Library Markdown listing bodies or maintain manual
post arrays. Current accessible noindex/external-canonical posts remain listable
because that is established behavior, while drafts remain absent. An author
archive should require a valid locale author record and at least one eligible
post, including at least one sitemap-eligible post before the archive itself can
be indexable.
### Static route generation
Extend the manifest-driven static-path inventory with validated generated route
descriptors (`library-page`, `author-index`, `author-page`, `search`) and run
their canonical, collision, robots, and sitemap state through reusable Phase 3A
policy functions. Do not hand-author content records for numbered pages. The
catchall renderer can dispatch descriptor kinds to shared Library/archive
components while preserving content routes and collision detection.
Page 1 is always the unnumbered root. Next/previous and numbered links are real
anchors with localized accessible labels, `aria-current="page"` on the current
page, and no links to nonexistent pages. Invalid numbers, zero, negative values,
nonintegers, unknown author slugs, authors with no eligible posts, and pages past
the end produce no static route and therefore 404.
Search temporarily replaces the visible page list with all-language-appropriate
matching results and hides the archive pager; clear/reset restores the original
server-rendered page. Adding, removing, drafting, or changing an article updates
search and page chunks in one build without manual index edits.
### Author presentation
Resolve the author once by exact locale and slug. Reuse the same resolution in
BlogCard, BlogPostLayout, BlogPosting schema, and author archives. Add an optional
locale-specific `displayName` only to preserve the published credentialed archive
heading; retain `name` for the Person entity. The existing description/avatar can
drive the bio after source reconciliation. Build must fail on missing or duplicate
locale/slug records. Do not treat authors as team members or infer employment.
### Route-count model
With the current 46/12/7 corpus and ten items per page:
| Addition | HTML routes | Sitemap URLs | Hreflang links |
| --- | ---: | ---: | ---: |
| `/search` | +1 | 0 | 0 |
| Library pages 2+ (4 EN, 1 ES) | +5 | +5 | 0 |
| Three author roots | +3 | +3 | +12 if explicit author equivalence is approved |
| Author pages 2+ (4 EN, 1 ES) | +5 | +5 | 0 |
| **Projected current total** | **96 + 14 = 110** | **92 + 13 = 105** | **174 + 12 = 186** |
This current-corpus model intentionally lacks the two distinct English page-6
routes. If all nine Phase 6C English posts are ordinary eligible/indexable
records, those posts add nine HTML/sitemap URLs and produce one more Library and
one more author page. The combined projection becomes **121 HTML routes** and
**up to 116 sitemap URLs**. Exact counts must be recalculated from final policy;
new translation relationships could separately affect hreflang.
## G. Multilingual and SEO Design
- Each JSON index contains one locale only. Embedded Library search never mixes
languages. The `/search` compatibility page may search all locales but must
expose an explicit locale filter and label result language.
- Components receive localized labels/messages; none are generated by machine
translation. Missing copy blocks implementation for that locale rather than
falling back silently to English.
- Arabic uses the existing `lang=ar dir=rtl` layout. Pagination order, arrows,
search icon placement, result counts, focus order, and mixed Latin/Arabic text
require RTL browser testing. Use `Intl.DateTimeFormat`/`Intl.NumberFormat` with
the page locale; keep machine-readable dates stable.
- Existing Library roots retain their explicit three-language translation set.
Numbered pages do not receive hreflang because page N contains different
records across locales.
- Author roots may participate only through the author collection's explicit,
validated `translationKey`, with reciprocal published archives and English as
`x-default`. Numbered author pages receive no hreflang.
- `/search` has no translation graph and is noindex. JSON endpoints and redirect
sources never enter the sitemap.
- Generated archive pages self-canonicalize to normalized local URLs and use the
staging/production robots switch. Page 2+ and author archives are recommended
as indexable and sitemap-eligible to remain consistent with Phase 3A's “all
eligible self-canonical local routes” rule. This intentionally improves on
production's missing canonicals and sitemap omission and requires approval.
- LanguageSwitcher uses only the validated graph. It must not construct page-N,
author, or search equivalents from route shape.
## H. Accessibility and Progressive Enhancement
- Render complete cards and archive pagination on the server.
- Hide/reveal the enhanced search form only after its script initializes; include
a `<noscript>` explanation and links to the three Library roots. Do not show a
control that appears functional when JavaScript is unavailable.
- Use an explicit label, native search input, submit button, and clear button.
Preserve browser keyboard behavior; Escape may clear only when documented and
must not trap focus.
- Announce result counts/no-results through a persistent `aria-live="polite"`
status. Do not announce on every keystroke without debouncing.
- Keep focus in the input while typing. On explicit submission, move focus to a
results heading only when that improves navigation; clearing returns to the
input and restores the original archive.
- Use real result links and real pagination anchors. Mark current page with
`aria-current`; give previous/next localized accessible names; maintain visible
focus indication and adequate touch targets.
- New embedded searches should store state in a URL fragment to avoid sending
terms to the static server while retaining share/back-forward behavior. The
legacy `/search?term=` compatibility route necessarily sends its query and
should document that static-host access logs may retain it.
## I. Performance and Deployment
Expected static output is three JSON files such as
`/assets/search/library-en.json`, `library-es.json`, and `library-ar.json`, one
compiled client module, the generated HTML archives, and redirect-map entries.
Load only the current locale index on first interaction; `/search` can load the
selected locale and additional indexes only when requested. Cache fingerprinted
client code immutably and JSON with normal deploy revalidation so new posts are
visible after a release.
No database, persistent process, server-side search, external query service,
environment variable, or production API is required. The result works on nginx,
the current Nix environment, a Raspberry Pi serving static files, the existing
VPS, and conventional static hosts. Build cost is a small pass over content and
JSON serialization. Redirect behavior remains a deployment concern and must be
validated against the selected host; Phase 6A changes no nginx/Nix/deployment
file.
## J. Proposed Phase 6B Implementation Checkpoints
### 6B.1 — Shared catalog and search assets
- **Likely files:** new `src/utils/library-catalog.ts`; JSON endpoint(s);
`LibrarySearch.astro` and client script; existing Library components/layout;
tests and README/report.
- **Work:** derive eligible locale catalogs, explicit sort, metadata-only index,
normalization/ranking, locale messages, embedded search, and `/search`
compatibility route. Replace inert English input; add Spanish/Arabic controls.
- **Dependencies:** approval of search fields, legacy route behavior, and
noindex-record inclusion. No package dependency recommended.
- **Acceptance:** all search cases pass; JSON contains no drafts/body; current
route count increases by one for `/search`; search remains noindex/out of
sitemap; normal Library works without JavaScript.
- **Validation:** `test:library`, SEO/publication suites, both builds, route/link
audits, browser keyboard/RTL/JS-disabled checks.
### 6B.2 — Library pagination and first-page redirects
- **Likely files:** catalog helper, route manifest/catchall dispatch, shared
Library renderer/pager, redirect generator/map, tests/reports.
- **Work:** ten-item chunks, page 2+ descriptors, root page 1, invalid-page 404,
six page-1 redirects, localized pagination. Remove bypassed listing snapshots
from the three Library bodies only after rendered acceptance.
- **Prerequisite:** Phase 6C must supply the nine missing English records before
`/library/page/6` can pass preservation acceptance. If Phase 6C is not ready,
stop this checkpoint with five English pages rather than fabricating content.
- **Acceptance:** every page has unique real content, explicit sort, valid
canonicals/robots/sitemap state, no empty pages, and production URLs through
current last pages.
### 6B.3 — Author model, archive roots, and byline links
- **Likely files:** author schema/records, catalog/route descriptors, new author
archive presentation, BlogCard, BlogPostLayout, structured-data resolution
helper, tests/report.
- **Work:** optional `displayName`, source-supported localized bios/headings,
exact locale/slug resolution, archive pages/pagination, and shared linked
bylines. Preserve BlogPosting attribution semantics.
- **Dependencies:** source reconciliation and human Spanish/Arabic review;
approval of author-root hreflang and sitemap policy.
- **Acceptance:** roots and all nonempty numbered routes resolve; missing,
duplicate, zero-post, and invalid authors fail/404 appropriately; no manual
article arrays; no employment claims.
### 6B.4 — URL and SEO reconciliation
- **Likely files:** existing redirect generation/report outputs, publication
tests, route-audit evidence; no hosting config until separately authorized.
- **Work:** add exact page-1/trailing normalization decisions, verify canonical,
robots, sitemap, collisions, invalid boundaries, search noindex, and preserve
all known paths.
- **Acceptance:** disposition matrix is executable and audited; no redirect to a
generic Library root for a distinct page 2+ URL; staging safeguards remain.
### 6B.5 — Multilingual, accessibility, and performance acceptance
- **Likely files:** focused tests/report and only defect fixes in approved
components.
- **Work:** English/Spanish/Arabic search, localized counts/dates, RTL pager,
screen-reader announcements, keyboard/focus, JS-off browse, payload checks,
mobile/desktop browser review.
- **Acceptance:** no fabricated translation routes; index sizes recorded; no
external query transmission; complete build/audit matrix passes.
Each checkpoint must be an isolated reviewable diff. Failed validation stops the
sequence. Phase 6C content changes should remain a separate checkpoint even if
they are scheduled between 6B.1 and 6B.2.
## K. Test Matrix
| Area | Scenario | Test level | Expected result |
| --- | --- | --- | --- |
| Search | Empty/whitespace query | Unit + browser | Normal archive restored; no false zero-result state |
| Search | No match, one match, many matches | Unit + generated browser fixture | Correct deterministic count/order and polite announcement |
| Search | Case, repeated whitespace, punctuation | Unit | Normalized equivalent matches |
| Search | `evaluación`/`evaluacion` and Spanish punctuation | Unit + browser | Accent-folded key matches; original text displayed |
| Search | Arabic marked/unmarked query and punctuation | Unit + RTL browser | Diacritics/tatweel do not block intended match; direction stays RTL |
| Search | Clear/reset, back/forward, direct fragment | Browser | State and original page restore predictably |
| Search | Keyboard/focus/screen reader | Browser/manual assistive review | Native operation, visible focus, stable focus, live count |
| Search | JavaScript disabled | Generated HTML + browser | Paginated browse works; honest no-search message |
| Search | Draft/unpublished fixture | Unit + integration | Absent from JSON/results; body content never leaked |
| Search | Legacy `term`, `q`, `type`, valid/invalid `offset` | Integration + browser | Compatibility route safely normalizes and remains noindex |
| Pagination | First, middle, last page | Unit + generated HTML | Correct slices, count, prev/next/current links |
| Pagination | Page 1 aliases | Redirect test | Locale/author-specific 301 to root |
| Pagination | Beyond-last, zero, negative, noninteger | Route integration | No generated route; 404 |
| Pagination | Zero posts / one page | Unit | No archive for zero-post author; no pager for one page |
| Pagination | Equal publication dates | Unit | Date descending then route ascending |
| Pagination | Add/remove/draft post | Fixture build | Page counts/routes/index update without manual edits |
| Author | Existing author with multiple posts | Unit + HTML | Localized record and correctly ordered posts |
| Author | New author / zero eligible posts | Fixture build | New route derives automatically only with eligible posts |
| Author | Missing/duplicate locale record | Unit + build failure | Explicit actionable validation error |
| Author | Invalid slug and page boundary | Route integration | 404; no leakage |
| Author | Localized records and links | HTML + browser | Card/article links use matching locale archive |
| SEO | Canonical/robots/sitemap | Publication unit + both builds | Shared policy exactly matches generated descriptors |
| SEO | Hreflang | Unit + HTML | Roots only when explicitly equivalent; never page-number guessing |
| SEO | Staging versus indexing | Build integration | Global noindex/empty sitemap/no hreflang restored at end |
| Routing | Known production URLs/redirects | Route audit | Every matrix row matches route or redirect evidence |
| Quality | Internal links/assets | Existing audits | No broken links or missing images |
## L. Human-decision Register
### Established project policy
- Static Astro, Markdown/MDX content collections, TypeScript, Zod, no database or
headless CMS, no form/search backend, and no invented translations.
- Publication eligibility, canonicals, robots, sitemap, explicit translation
relationships, staging protection, and external-canonical exceptions remain
governed by Phases 3A/3B.
- Search, pagination, and author archives are required visitor capabilities;
HubSpot internals need not be copied.
### Codex recommendations requiring approval
1. Approve dependency-free generated metadata JSON search and defer full-body,
fuzzy, and stemmed search until measured failures justify them.
2. Approve ten posts per page, unnumbered page-1 canonicals, and locale-specific
301 redirects from all six `/page/1` aliases.
3. Approve `/search` as a preserved noindex compatibility page accepting `term`,
`q`, legacy `type`, and `offset`; embedded Library search remains locale-only.
4. Approve indexable, self-canonical, sitemap-listed page 2+ and author archives,
even though HubSpot omits those URLs from its sitemap and canonical markup.
5. Approve retaining accessible noindex/external-canonical articles in lists and
internal search, matching current Astro behavior; they remain excluded from
sitemap/hreflang and preserve their metadata.
6. Approve explicit author-root hreflang from author `translationKey`, with no
hreflang for numbered pages.
7. Approve an optional localized `displayName` author field and a separate
source-supported author-content reconciliation with human Spanish/Arabic
review.
8. Approve scheduling the nine-post Phase 6C reconciliation before pagination
and author page-6 acceptance. No empty or misleading page 6 should ship.
### Not yet verified or intentionally deferred
- Production-cache timestamps do not prove origin freshness.
- Search query frequency and the value of body-only/fuzzy matching have not been
measured; no analytics should be added to answer this without consent review.
- Exact hosting redirect syntax remains undecided and must be validated for the
selected deployment target.
- Current author records are not adequate evidence for localized biography copy.
- Phase 6C publication/indexing/translation status for the nine missing posts is
unknown, so the post-6C route projection is an upper-bound model.
No Phase 6B implementation, dependency installation, redirect, content edit, or
deployment change is authorized by this proposal.
File diff suppressed because it is too large. Load diff
Loaded 100 of 413 files, more files were not shown because too many files have changed in this diff. Show more