src/pages: one file per URL

Astro turns every file here into a page at /<name>/ (trailing slash, index.html in a folder, matching the WordPress permalinks so no URL moved). A page is a stack of components from src/components/kit/ inside Base; it carries no <style>, no style="" and no <script>. npm run lint:pages enforces that and fails the build otherwise.

FileURLNotes
index.astro/Home, Marketing’s 2026 homepage (13 sections).
control-plane.astro, ai-gateway.astro, ai-gateway-architecture.astro, user-portal.astro, mcp-registry.astroPlatform menu
agents.astro, finops.astro, shadow-ai.astro, compliance.astroHow we help menu
developers.astro, mcp-developer-bootcamp.astro, mcp-workbench.astroDevelopers
pricing.astro, book-a-demo.astro, contact-us.astro, partner-with-us.astroCommercial + formsForms are HubSpot components from the kit.
white-paper-ai-systems-assurance.astro, thank-you-ai-systems-assurance.astroThe gated white paperThank-you page is noindex.
privacy-policy.astro, terms-and-conditions.astro, accessibility.astroLegalHero + Prose.
blog/index.astro/blog/Lists the blog collection: featured card + grid.
[slug].astro/<post-slug>/Renders each src/content/blog/*.mdx through layouts/BlogPost.astro.
videos.astro, glossary.astro/videos/, /glossary/Render the videos and glossary collections.
404.astro, robots.txt.ts

Writing a page

Read docs/porting-brief.md first: it is the contract (allowed components and classes, heading rules, buttons, pictures, forms, SEO). The shape of every page:

<Base title="…" description="…">
  <Hero title="…" lead="…"> …buttons, media slot… </Hero>
  <Section bg="grid"><Head eyebrow="…" title="…" lead="…" /> …Cards / Rows / Steps / Figure… </Section>
  <Rule />
  <Section bg="bone"> … </Section>
  <Cta />
</Base>

Every page passes a title (10 to 70 characters) and a description (50 to 160) to Base. Never remove or rename a URL without adding a redirect in src/data/redirects.json; npm run test:parity fails otherwise. Each page’s porting notes are in docs/port-log.md.