HOME SERVICE WEBSITE ARCHITECTURE v4.2 + ANNEX - DECISION BRIEF (HVAC, plumbing, electrical, roofing) Guide: /guide | Full: /llms-full.txt | /wireframe-v4.md | /annex.md - Fortitude Creative, 2026-09-25 ARCHITECTURE (v4) 1. INTERSECTION MODEL A adopted. Money pages live at /[service]/[city]/, service first, self- canonical, never canonical to the pillar. Location hubs (/service-areas/[city]/) demote to indexes carrying the LocalBusiness entity; they do not compete for "ac repair phoenix". Model B (one fat city page per market) rejected: more content per city, one URL for a dozen money queries. 2. CONTENT FLOOR per intersection: 350-500 unique words + 1 Featured Local Project from that city for that service. Below the floor, the page does not publish. Page count is capped by project supply, not ambition. 10 projects/month = 10 pages/month. Cut count, never the floor. 3. TIERS: home > service pillars (city-agnostic) > intersections > location hubs > problem/symptom pages > comparison cluster > people/proof/trust. 4. LINKING IS CMS-ENFORCED, not documented. Required reference fields; templates generate links and anchors from relationships; editor override disabled. Nightly job flags any page under 3 inbound internal links. 5. SCHEMA IS ONE @id GRAPH: Organization > LocalBusiness (unique @id per location, own NAP/geo/ hours/GBP CID) > Service > Project > Person. Every @id referenced must resolve to a node on the site. 6. PROBLEM PAGES ASSUME ZERO CLICK: TL;DR, emergency CTA above fold, pre-filled diagnostic in URGENT framing (check-up framing belongs on home/maintenance), non-phone secondary capture, search_bounceback event (returns to search inside 7s; NOT true zero-click). 7. BUILD SEQUENCE is phase+gate, not calendar. Phase 4 (pilot) tests whether technicians actually document jobs on site, not whether pages render. Failing a gate repeats the phase. BUILD SPEC (Annex A-K) B. Slugs frozen before page one: singular service terms, trailing slash, lowercase. No query params for city, no client-side city switching. Name collisions suffix BOTH cities (portland-or AND portland-me), never just the newcomer, and the registry includes planned markets. C. JSON-LD: projects typed Article with author/about/contentLocation. The source spec's HowTo node had a performer property HowTo does not define, and HowTo rich results are retired - it would have failed validation. F. CI FAILS ON: missing meta description, non-self canonical, missing phone/breadcrumb/JSON-LD, unresolved @id, Lighthouse mobile under 80, CLS over 0.1, bad slug, no-JS body text under 400 bytes, JSON-LD injected client-side, dateModified missing or over 365 days, Person with no sameAs. G. Launch footprint: top 1-2 services x 1-2 cities WITH live projects. One project may appear on exactly one intersection page. No reuse across cities. I. One config singleton owns phone, NAP, GBP CID, legal name, and all authority claims. Editors cannot fork it. K. AI RETRIEVAL: authority claims (year established as a YEAR, licenses, certifications, fleet, dated awards) extend that SAME singleton, not a second one. 150-200 word third-person About block below H1 on every location hub, written to be quoted ("[Business] has served", never "we have served"). FAQPage ONLY on comparison pages, 3-5 genuine pairs, never on symptom pages. Person requires >=1 sameAs. Intersection H1 and first sentence both carry business name + city so attribution survives a stripped citation. Licensing stance stated explicitly; permissive for a local contractor, whose goal is to be quoted. KNOWN OPERATIONAL RISKS (not solvable by the spec) - Content supply constrains the grid below theoretical maximum. Expected, not a shortfall. - sameAs needs a real findable profile per technician; most likely field to stall the build. - Authority claims are legal claims. Wrong license number is a regulatory problem, not an SEO one. - dateModified must move only when content moves, or the freshness gate becomes a ritual.