create-ailk 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/README.md +87 -14
  2. package/component-catalog.json +735 -95
  3. package/component-catalog.md +13 -7
  4. package/dist/add-module-core.d.ts +22 -0
  5. package/dist/add-module-core.js +50 -0
  6. package/dist/add-module.d.ts +89 -0
  7. package/dist/add-module.js +334 -0
  8. package/dist/category-profile.d.ts +126 -0
  9. package/dist/category-profile.js +262 -0
  10. package/dist/cli.js +89 -29
  11. package/dist/index.d.ts +4 -2
  12. package/dist/index.js +6 -1
  13. package/dist/lib/extract-module-bundle.d.ts +56 -1
  14. package/dist/lib/extract-module-bundle.js +170 -14
  15. package/dist/lib/license-key-files.d.ts +15 -0
  16. package/dist/lib/license-key-files.js +102 -0
  17. package/dist/lib/module-license-gate.d.ts +79 -0
  18. package/dist/lib/module-license-gate.js +160 -12
  19. package/dist/lib/module-tier.d.ts +45 -16
  20. package/dist/lib/module-tier.js +76 -0
  21. package/dist/lib/pro-callout.d.ts +16 -10
  22. package/dist/lib/pro-callout.js +34 -3
  23. package/dist/license-set.d.ts +34 -0
  24. package/dist/license-set.js +194 -0
  25. package/dist/module-architecture.d.ts +20 -0
  26. package/dist/module-architecture.js +77 -19
  27. package/dist/modules/commerce/0.6.1.tar.gz +0 -0
  28. package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
  29. package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
  30. package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
  31. package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
  32. package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
  33. package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
  34. package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
  35. package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
  36. package/dist/modules/workspace/0.6.1.tar.gz +0 -0
  37. package/dist/parse-args.d.ts +85 -10
  38. package/dist/parse-args.js +227 -15
  39. package/dist/programmatic.d.ts +81 -5
  40. package/dist/programmatic.js +291 -32
  41. package/dist/site-chrome.d.ts +18 -7
  42. package/dist/site-chrome.js +32 -14
  43. package/dist/site-roster.d.ts +127 -0
  44. package/dist/site-roster.js +499 -0
  45. package/dist/starter-grid.d.ts +216 -0
  46. package/dist/starter-grid.js +449 -0
  47. package/dist/surfaces.d.ts +20 -7
  48. package/dist/surfaces.js +204 -24
  49. package/dist/sync-routes.d.ts +9 -0
  50. package/dist/sync-routes.js +2 -2
  51. package/dist/template-manifest.d.ts +94 -19
  52. package/dist/template-manifest.js +170 -289
  53. package/dist/template-names.d.ts +14 -12
  54. package/dist/template-names.js +13 -17
  55. package/package.json +6 -4
  56. package/site-templates/_base/content/en/BookCall/book-call.mdx +52 -0
  57. package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
  58. package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
  59. package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
  60. package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
  61. package/site-templates/_base/content/en/GlossaryList/glossary.mdx +65 -0
  62. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +67 -0
  63. package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
  64. package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
  65. package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
  66. package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
  67. package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
  68. package/site-templates/_base/content/en/Pricing/pricing.mdx +71 -62
  69. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +17 -3
  70. package/site-templates/_base/content/en/TermsPage/terms.mdx +2 -3
  71. package/site-templates/_base/content/en/UseCase/persona-1.mdx +69 -0
  72. package/site-templates/_base/content/en/UseCase/persona-2.mdx +69 -0
  73. package/site-templates/_base/content/en/UseCase/persona-3.mdx +69 -0
  74. package/site-templates/designs/minimalism/DESIGN.md +162 -0
  75. package/site-templates/designs/standard/DESIGN.md +167 -0
  76. package/site-templates/marketing-site/DESIGN.md +59 -40
  77. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +376 -57
  78. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +230 -90
  79. package/site-templates/marketing-site/ailk-template.json +1 -0
  80. package/site-templates/marketing-site-free/DESIGN.md +59 -40
  81. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +323 -63
  82. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +323 -113
  83. package/site-templates/marketing-site-free/ailk-template.json +3 -2
  84. package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
  85. package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
  86. package/site-templates/minimalism-site/DESIGN.md +54 -40
  87. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +246 -19
  88. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +173 -51
  89. package/site-templates/minimalism-site/ailk-template.json +3 -2
  90. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +52 -0
  91. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +3 -37
  92. package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  93. package/site-templates/saas-product/DESIGN.md +59 -40
  94. package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
  95. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +369 -0
  96. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +302 -0
  97. package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
  98. package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
  99. package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
  100. package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  101. package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
  102. package/site-templates/shapes/local-business-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  103. package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
  104. package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
  105. package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
  106. package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
  107. package/site-templates/shapes/local-business-service/provenance.json +4 -0
  108. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +362 -0
  109. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +300 -0
  110. package/site-templates/shapes/organization-service/ailk-template.json +10 -0
  111. package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
  112. package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
  113. package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  114. package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
  115. package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  116. package/site-templates/shapes/organization-service/content/en/Service/first-engagement.mdx +38 -0
  117. package/site-templates/shapes/organization-service/content/en/Service/second-engagement.mdx +38 -0
  118. package/site-templates/shapes/organization-service/content/en/Service/third-engagement.mdx +38 -0
  119. package/site-templates/shapes/organization-service/content/en/ServicesList/services.mdx +72 -0
  120. package/site-templates/shapes/organization-service/provenance.json +4 -0
  121. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +369 -0
  122. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +299 -0
  123. package/site-templates/shapes/person-service/ailk-template.json +10 -0
  124. package/site-templates/shapes/person-service/content/_site.mdx +85 -0
  125. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
  126. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
  127. package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  128. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +169 -0
  129. package/site-templates/shapes/person-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  130. package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
  131. package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
  132. package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
  133. package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
  134. package/site-templates/shapes/person-service/provenance.json +4 -0
  135. package/templates/.claude/settings.json +15 -0
  136. package/templates/.claude/skills/README.md +10 -9
  137. package/templates/.claude/skills/{scaffold-auth → add-auth}/SKILL.md +7 -7
  138. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/env-vars.md +2 -2
  139. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/oauth-app-setup.md +3 -3
  140. package/templates/.claude/skills/{scaffold-page → add-page}/SKILL.md +76 -62
  141. package/templates/.claude/skills/add-page/references/page-types.md +115 -0
  142. package/templates/.claude/skills/{scaffold-page → add-page}/templates/content.mdx.tmpl +4 -4
  143. package/templates/.claude/skills/{scaffold-page → add-page}/templates/route.tsx.tmpl +1 -1
  144. package/templates/.claude/skills/{audit-site → check-site}/SKILL.md +16 -17
  145. package/templates/.claude/skills/{audit-site → check-site}/references/common-errors.md +3 -3
  146. package/templates/.claude/skills/{audit-site → check-site}/references/findings-glossary.md +16 -14
  147. package/templates/.claude/skills/{audit-site → check-site}/references/severity-levels.md +1 -1
  148. package/templates/.claude/skills/fill-page/SKILL.md +180 -0
  149. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +80 -0
  150. package/templates/.claude/skills/fill-page/references/section-sources.md +41 -0
  151. package/templates/.claude/skills/setup-database/SKILL.md +156 -0
  152. package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
  153. package/templates/.claude/skills/{provision-config → setup-deploy}/SKILL.md +73 -41
  154. package/templates/.claude/skills/{provision-config → setup-deploy}/references/env-vars-template.md +21 -30
  155. package/templates/.claude/skills/setup-deploy/references/runbook-template.md +204 -0
  156. package/templates/.claude/skills/{provision-config → setup-deploy}/references/vercel-json-template.md +1 -1
  157. package/templates/.claude/skills/upgrade-plan/SKILL.md +117 -0
  158. package/templates/.claude/skills/upgrade-plan/references/options.md +24 -0
  159. package/templates/.claude/skills/upgrade-plan/scripts/upgrade-plan.ts +527 -0
  160. package/templates/.github/workflows/ci.yml +5 -0
  161. package/templates/CLAUDE.md +8 -2
  162. package/templates/DESIGN.md +56 -44
  163. package/templates/README.md +116 -46
  164. package/templates/apps/api/.env.example +2 -1
  165. package/templates/apps/api/CLAUDE.md +3 -2
  166. package/templates/apps/api/package.json +1 -1
  167. package/templates/apps/api/src/config/__tests__/index.test.ts +146 -10
  168. package/templates/apps/api/src/config/index.ts +46 -14
  169. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
  170. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
  171. package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
  172. package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
  173. package/templates/apps/api/src/lib/license-key-store.ts +45 -0
  174. package/templates/apps/api/src/lib/site.ts +5 -3
  175. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +97 -0
  176. package/templates/apps/api/src/middleware/auth.ts +9 -0
  177. package/templates/apps/api/src/openapi/spec.ts +63 -12
  178. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +127 -5
  179. package/templates/apps/api/src/routes/content/get-page.ts +86 -2
  180. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
  181. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
  182. package/templates/apps/api/src/routes/leads/index.ts +46 -1
  183. package/templates/apps/api/src/server.ts +13 -0
  184. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
  185. package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
  186. package/templates/apps/api/src/services/lead-routing.ts +140 -30
  187. package/templates/apps/api/src/services/leads-inbox.ts +48 -11
  188. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +75 -1
  189. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +57 -9
  190. package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
  191. package/templates/apps/mcp/package.json +2 -1
  192. package/templates/apps/mcp/src/index.ts +7 -0
  193. package/templates/apps/mcp/src/lib/audit-single-page.ts +36 -10
  194. package/templates/apps/mcp/src/lib/license-key-store.ts +45 -0
  195. package/templates/apps/mcp/src/tools/create_project.ts +21 -6
  196. package/templates/apps/web/__tests__/setup.ts +18 -0
  197. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +10 -2
  198. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +2 -2
  199. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +10 -4
  200. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +22 -14
  201. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +26 -18
  202. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +12 -4
  203. package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +35 -4
  204. package/templates/apps/web/app/[locale]/[slug]/page.tsx +49 -9
  205. package/templates/apps/web/app/[locale]/book-a-call/page.tsx +50 -0
  206. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +3 -3
  207. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +3 -3
  208. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +3 -4
  209. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +67 -29
  210. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +94 -11
  211. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
  212. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
  213. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +228 -86
  214. package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
  215. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
  216. package/templates/apps/web/app/[locale]/contact/page.tsx +115 -7
  217. package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
  218. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +3 -3
  219. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +3 -4
  220. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +4 -5
  221. package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
  222. package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
  223. package/templates/apps/web/app/[locale]/glossary/page.tsx +50 -0
  224. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
  225. package/templates/apps/web/app/[locale]/how-to/page.tsx +25 -15
  226. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +3 -3
  227. package/templates/apps/web/app/[locale]/layout.tsx +146 -52
  228. package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
  229. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
  230. package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
  231. package/templates/apps/web/app/[locale]/newsletter/page.tsx +142 -0
  232. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +3 -3
  233. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
  234. package/templates/apps/web/app/[locale]/portfolio/page.tsx +49 -0
  235. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +3 -3
  236. package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +4 -5
  237. package/templates/apps/web/app/[locale]/{cancellation → purchase-policy}/page.tsx +15 -10
  238. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +4 -5
  239. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +3 -3
  240. package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +14 -1
  241. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
  242. package/templates/apps/web/app/[locale]/software/page.tsx +25 -15
  243. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
  244. package/templates/apps/web/app/[locale]/tech-articles/page.tsx +25 -15
  245. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +3 -4
  246. package/templates/apps/web/app/[locale]/use-cases/[slug]/page.tsx +63 -0
  247. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +3 -4
  248. package/templates/apps/web/app/[locale]/use-cases/page.tsx +15 -2
  249. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
  250. package/templates/apps/web/app/[locale]/whitepapers/page.tsx +25 -15
  251. package/templates/apps/web/app/error-fallback.tsx +17 -45
  252. package/templates/apps/web/app/not-found.tsx +14 -38
  253. package/templates/apps/web/app/og/route.tsx +6 -0
  254. package/templates/apps/web/eslint.config.mjs +3 -0
  255. package/templates/apps/web/instrumentation.ts +14 -0
  256. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +38 -0
  257. package/templates/apps/web/lib/license-key-store.ts +52 -0
  258. package/templates/apps/web/lib/nav-config.ts +82 -18
  259. package/templates/apps/web/lib/prisma-for-auth.ts +9 -6
  260. package/templates/apps/web/lib/site-brand.tsx +1 -1
  261. package/templates/apps/web/lib/site-chrome.ts +3 -3
  262. package/templates/apps/web/lib/site-identity.ts +148 -0
  263. package/templates/apps/web/lib/site-theme.ts +11 -0
  264. package/templates/apps/web/messages/en.json +78 -37
  265. package/templates/apps/web/public/android-chrome-192x192.png +0 -0
  266. package/templates/apps/web/public/android-chrome-512x512.png +0 -0
  267. package/templates/apps/web/public/apple-touch-icon.png +0 -0
  268. package/templates/apps/web/public/favicon-16x16.png +0 -0
  269. package/templates/apps/web/public/favicon-32x32.png +0 -0
  270. package/templates/apps/web/public/favicon.ico +0 -0
  271. package/templates/apps/web/public/favicon.svg +3 -3
  272. package/templates/apps/web/public/logomark.svg +6 -3
  273. package/templates/apps/web/public/logos/ai-launch-kit-light.svg +4 -0
  274. package/templates/apps/web/public/logos/ai-launch-kit.svg +4 -0
  275. package/templates/apps/web/public/logos/atomic-agent-light.svg +4 -0
  276. package/templates/apps/web/public/logos/atomic-agent.svg +4 -0
  277. package/templates/apps/web/public/logos/salessmyth-light.svg +4 -0
  278. package/templates/apps/web/public/logos/salessmyth.svg +4 -0
  279. package/templates/apps/web/public/site.webmanifest +4 -4
  280. package/templates/apps/web/public/wordmark-light.svg +4 -0
  281. package/templates/apps/web/public/wordmark.svg +3 -3
  282. package/templates/apps/web/security-headers.config.ts +5 -1
  283. package/templates/content/_site.mdx +25 -0
  284. package/templates/content/en/AboutPage/about.mdx +150 -144
  285. package/templates/content/en/BlogList/blog.mdx +126 -0
  286. package/templates/content/en/ContactPage/contact.mdx +21 -92
  287. package/templates/content/en/FAQPage/faq.mdx +86 -57
  288. package/templates/content/en/HomePage/home.mdx +268 -217
  289. package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +181 -0
  290. package/templates/content/en/UseCasesList/use-cases.mdx +170 -0
  291. package/templates/database/CHANGELOG.md +14 -0
  292. package/templates/database/package.json +1 -1
  293. package/templates/package.json +3 -1
  294. package/templates/tools/lint-architecture.ts +315 -0
  295. package/templates/tools/tsconfig.json +14 -0
  296. package/versions.json +33 -33
  297. package/site-templates/simple-service/DESIGN.md +0 -148
  298. package/site-templates/simple-service/TEMPLATE-MANIFEST.json +0 -240
  299. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -278
  300. package/site-templates/simple-service/ailk-template.json +0 -10
  301. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -67
  302. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
  303. package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
  304. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
  305. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
  306. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
  307. package/site-templates/simple-service/provenance.json +0 -4
  308. package/templates/.claude/skills/add-schema/SKILL.md +0 -277
  309. package/templates/.claude/skills/add-schema/references/conflict-handling.md +0 -200
  310. package/templates/.claude/skills/add-schema/references/file-finding.md +0 -123
  311. package/templates/.claude/skills/add-schema/references/schema-types.md +0 -234
  312. package/templates/.claude/skills/provision-config/references/runbook-template.md +0 -248
  313. package/templates/.claude/skills/scaffold-page/references/page-types.md +0 -169
  314. package/templates/.claude/skills/suggest-site-pages/SKILL.md +0 -242
  315. package/templates/.claude/skills/suggest-site-pages/references/categories.md +0 -287
  316. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -150
  317. package/templates/apps/web/app/[locale]/returns/page.tsx +0 -44
  318. package/templates/apps/web/app/[locale]/shipping/page.tsx +0 -44
  319. package/templates/content/en/CancellationPolicyPage/cancellation.mdx +0 -108
  320. package/templates/content/en/LandingPage/blog.mdx +0 -83
  321. package/templates/content/en/LandingPage/features.mdx +0 -103
  322. package/templates/content/en/LandingPage/how-it-works.mdx +0 -143
  323. package/templates/content/en/ReturnsPolicyPage/returns.mdx +0 -108
  324. package/templates/content/en/ShippingPolicyPage/shipping.mdx +0 -108
@@ -16,13 +16,13 @@
16
16
 
17
17
  ## 1. Chrome (every page)
18
18
 
19
- | Piece | Component | Props that matter | Status |
20
- | ---------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
21
- | Shell | `MarketingShell` | `gutters="plain"`, `contentOwnsMain`, `bannerPlacement="above-nav"` | ✅ |
22
- | Announcement bar | `Banner` (chrome) | `variant="contrast"`, `routes={{ include: ["/"] }}` — **home only**, no dismiss | ✅ · 🔧 #5558 message colour |
23
- | Nav | `Nav` → `BrandLogo` (mark + wordmark, mark-only < md) | items: Product (flyout: How it works · Features · FAQ) · How it works · Pricing · About; actions: Get started (primary → `/contact`), Sign in (outline → `/sign-in`); `showThemeToggle={false}`; mobile = mark + hamburger only | ✅ |
24
- | Footer | `Footer` → `FooterBottomBar` | columns: Site pages · Product · Legal · Subscribe (`Newsletter` block); bottom bar: theme toggle · © 2026 SalesSmyth LLC · Privacy Policy · Terms of Service · social ×5 · `LocaleSwitcher` | ✅ bar · 🟡 columns + subscribe · 🔧 `LanguageSwitcher` client wrapper is scaffold code, not a block |
25
- | Cookie consent | `Banner variant="info"` + `BannerConsentIsland` (bottom) | consent copy from `messages/en.json`; hidden on the sample | 🔧 #5557 |
19
+ | Piece | Component | Props that matter | Status |
20
+ | ---------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
21
+ | Shell | `MarketingShell` | `gutters="none"` (#6536 — no gutter frame, so header/sections/footer share one left/right edge), `contentOwnsMain`, `bannerPlacement="above-nav"` | ✅ |
22
+ | Announcement bar | `Banner` (chrome) | `variant="contrast"`, `routes={{ include: ["/"] }}` — **home only**, no dismiss; **off by default** (#6469), on with `layout.announcementBanner: true` | ✅ · 🔧 #5558 message colour |
23
+ | Nav | `Nav` → `BrandLogo` (mark + wordmark, mark-only < md) | items: Product (flyout: How it works · Features · FAQ) · How it works · Pricing · About; actions: Get started (primary → `/contact`), Sign in (outline → `/sign-in`); `showThemeToggle={false}`; mobile = mark + hamburger only; `frame="contained"` (#6536 — puts the header row on the section Container's edge, matching `gutters="none"`) | ✅ |
24
+ | Footer | `Footer` → `FooterBottomBar` | columns: Site pages · Product · Legal · Subscribe (`Newsletter` block); bottom bar: theme toggle · © 2026 SalesSmyth LLC · Privacy Policy · Terms of Service · social ×5 · `LocaleSwitcher`; `bottomBarAlign="content"` (#6536 — puts the footer divider on the same edge, forwarded to `FooterBottomBar`'s own `bleed={false}`) | ✅ bar · 🟡 columns + subscribe · 🔧 `LanguageSwitcher` client wrapper is scaffold code, not a block |
25
+ | Cookie consent | `Banner variant="info"` + `BannerConsentIsland` (bottom) | consent copy from `messages/en.json`; hidden on the sample | 🔧 #5557 |
26
26
 
27
27
  ### Layout knobs (#5612)
28
28
 
@@ -39,77 +39,129 @@ The template's `layout` block — resolved with `resolveSiteChrome`, defaults fi
39
39
 
40
40
  <!-- generated:end -->
41
41
 
42
+ ### Theme (locked)
43
+
44
+ The template's `theme:` block as `_site.mdx` declares it — the shape knobs and the colour overlay. Generated, so a change to a locked template's look is a red `manifest:check`, not a silent drift (starter-template contract R3.5).
45
+
46
+ <!-- generated:begin theme -->
47
+
48
+ | Setting | Value |
49
+ | ------------------------ | ---------- |
50
+ | `corners` | `square` |
51
+ | `eyebrowCase` | `sentence` |
52
+ | `placeholders` | `fill` |
53
+ | `checkmarks` | `plain` |
54
+ | `colors.light.bg` | `#ffffff` |
55
+ | `colors.light.bgMuted` | `#ffffff` |
56
+ | `colors.light.surface` | `#ffffff` |
57
+ | `colors.light.border` | `#000000` |
58
+ | `colors.light.text` | `#000000` |
59
+ | `colors.light.textMuted` | `#333333` |
60
+ | `colors.light.primary` | `#000000` |
61
+ | `colors.light.primaryFg` | `#ffffff` |
62
+ | `colors.light.accent` | `#000000` |
63
+ | `colors.dark.bg` | `#000000` |
64
+ | `colors.dark.bgMuted` | `#000000` |
65
+ | `colors.dark.surface` | `#000000` |
66
+ | `colors.dark.border` | `#ffffff` |
67
+ | `colors.dark.text` | `#ffffff` |
68
+ | `colors.dark.textMuted` | `#cccccc` |
69
+ | `colors.dark.primary` | `#ffffff` |
70
+ | `colors.dark.primaryFg` | `#000000` |
71
+ | `colors.dark.accent` | `#ffffff` |
72
+
73
+ <!-- generated:end -->
74
+
42
75
  ## 2. Pages
43
76
 
44
77
  Sections are listed in render order. Components resolve through `component-catalog.json`; every section named here exists in `packages/ui` (§ 4). _Live_ = what the scaffold rendered on 2026-09-15; _Target_ = the standardissue-matched composition. **Corrected 2026-09-15** against the captured copy (`docs/research/standardissue-capture/copy/<slug>.txt`) after a prop-coverage check of every beat against `packages/validation/src/schemas/page-sections.ts`; three bounded fields the reproduction needs are commissioned in **#5576** (Hero `checklist`, Feature `actions`, CTA `closingLine`) and are marked 🔧 #5576 below.
45
78
 
46
- **Copy rule (Sam, 2026-09-15): verbatim, mad-lib style exactly.** Every headline, body, bullet, label and CTA is the reference's text from `copy/<slug>.txt`, braces included (`{outcome}`, `{Primary CTA}`, `{Social Proof goes here}`). Lorem ipsum stays lorem ipsum where the reference has it. Nothing is paraphrased, shortened or "improved"; the operator rewrites the copy after the match is achieved. Only chrome text differs (§ 1).
79
+ **Copy rule (Sam, 2026-09-15): verbatim, mad-lib style exactly.** Every headline, body, bullet, label and CTA is the reference's text from `copy/<slug>.txt`, braces included (`{outcome}`, `{Primary CTA}`, `{Social Proof goes here}`). Lorem ipsum stays lorem ipsum where the reference has it. Nothing is paraphrased, shortened or "improved"; the operator rewrites the copy after the match is achieved. Only chrome text differs (§ 1). Superseded for the base and overlay pages by #6469 (operator, 2026-09-22): every fill-in slot is a `{brace}` instruction and every page carries the `PLACEHOLDER — REPLACE BEFORE LAUNCH` label.
47
80
 
48
81
  ### `/` — HomePage · schema `HomePage` · `MarketingShell` · chrome on
49
82
 
50
- Reference: `screenshots/home.png`, `copy/home.txt`. Nine page sections; the newsletter and the blog list on the reference are in its footer, not the page (§ 1).
83
+ Reference: `screenshots/home.png`, `copy/home.txt`. Ten page sections; the newsletter and the blog list on the reference are in its footer, not the page (§ 1).
51
84
 
52
85
  <!-- generated:begin page=/ -->
53
86
 
54
- | # | Section | Component | Copy (first line) |
55
- | --- | ------------------------------------------------------------ | --------------- | -------------------------------------------------- |
56
- | 1 | `hero` (split · checklist ×3 · 2 CTAs · closingLine) | `Hero` | How to get {outcome} without {problem} |
57
- | 2 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
58
- | 3 | `decision-split` (panels ×2) | `DecisionSplit` | There's a better way to {fix problem / get result} |
59
- | 4 | `feature` (eyebrow "Core Features" · features ×5 · 2 CTAs) | `Feature` | Everything you need to {achieve a desired outcome} |
60
- | 5 | `cta` (2 CTAs) | `CTA` | Direct integrations with your favorite tools |
61
- | 6 | `stair-steps` (tiles ×3) | `StairSteps` | Get setup in {number} easy steps |
62
- | 7 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
63
- | 8 | `content-block` (media-right · eyebrow "Manifesto" · 2 CTAs) | `ContentBlock` | We want you to {ability they couldn't do before} |
64
- | 9 | `video-section` (1 CTA · playBadge) | `VideoSection` | See {your product} in action |
87
+ | # | Section | Component | Copy (first line) |
88
+ | --- | ---------------------------------------------------------------------------------------------------------------------- | --------------- | -------------------------------------------------- |
89
+ | 1 | `hero` (illustration · imagerySlot=true · checklist ×3 · 2 CTAs · closingLine) | `Hero` | {How to get outcome without problem} |
90
+ | 2 | `logoCloud` (layout=inline · logos ×3) | `LogoCloud` | Don’t just take our word for it |
91
+ | 3 | `decision-split` (imagerySlot=true · eyebrow "Comparison" · panels ×2) | `DecisionSplit` | {There's a better way to fix problem / get result} |
92
+ | 4 | `feature` (itemStyle=plain · actionsPosition=below · eyebrow "Core Features" · features ×5 · 2 CTAs) | `Feature` | {Everything you need to achieve a desired outcome} |
93
+ | 5 | `cta` (minimal · eyebrow "Integrations" · 2 CTAs) | `CTA` | Direct integrations with your favorite tools |
94
+ | 6 | `media-band` (imagerySlot=true) | `MediaBand` | |
95
+ | 7 | `feature` (itemStyle=plain · actionsPosition=below · imagerySlot=true · eyebrow "How It Works" · features ×3 · 2 CTAs) | `Feature` | {Get set up in number easy steps} |
96
+ | 8 | `cta` (box · imagerySlot=true · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
97
+ | 9 | `content-block` (media-right · imagerySlot=true · eyebrow "Manifesto" · 2 CTAs) | `ContentBlock` | {We want you to ability they couldn't do before} |
98
+ | 10 | `content-block` (eyebrow "{Your Product} Demo" · 2 CTAs) | `ContentBlock` | {See your product in action} |
65
99
 
66
100
  <!-- generated:end -->
67
101
 
68
- ### `/how-it-works` — LandingPage · schema `WebPage` · chrome on
102
+ ### `/use-cases` — UseCasesList · schema `CollectionPage` · chrome on
69
103
 
70
- Reference: `screenshots/how-it-works.png`, `copy/how-it-works.txt`. Rendered by the generic `[slug]` route over `content/en/LandingPage/how-it-works.mdx`, emitting the LandingPage builder's `WebPage`. (`WebPage` is a schema.org @type the registry emits, not a content type the adapter accepts — the `[slug]` route's own header comment records why. A `schema` override to `HowTo` is refused by the scaffold's own `structured-data` gate, which validates every LandingPage as `WebPage`.)
104
+ Rendered by the `/use-cases` route over `content/en/UseCasesList/use-cases.mdx` — a UseCasesList page composing `sections[]` (operator ruling 2026-09-23), emitting the UseCasesList builder's `CollectionPage`. Since #6658 D4 it is a real list: one `items` section of three cards, each linking a `UseCase` page and titled with that page's title, so the `ItemList` names the three pages. The how-it-works steps moved to the product page.
71
105
 
72
- <!-- generated:begin page=/how-it-works -->
106
+ <!-- generated:begin page=/use-cases -->
73
107
 
74
- | # | Section | Component | Copy (first line) |
75
- | --- | -------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
76
- | 1 | `hero` (eyebrow "How it Works" · 2 CTAs) | `Hero` | Get set up in {number} easy steps |
77
- | 2 | `feature` (alternating · numbered · features ×3) | `Feature` | The first thing they need to do to get the outcome they want |
78
- | 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
79
- | 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
80
- | 5 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
81
- | 6 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | FAQs |
108
+ | # | Section | Component | Copy (first line) |
109
+ | --- | -------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
110
+ | 1 | `hero` (eyebrow "Use cases" · 2 CTAs) | `Hero` | {Use cases: who your product is for} |
111
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product to do} |
112
+ | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
113
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
114
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
115
+ | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen first) | `FAQ` | FAQs |
82
116
 
83
117
  <!-- generated:end -->
84
118
 
85
- ### `/features` — LandingPage · schema `WebPage` · chrome on
119
+ ### `/use-cases/<slug>` — UseCase · schema `WebPage` → `Article` · chrome on
86
120
 
87
- Reference: `screenshots/features.png`, `copy/features.txt`. Rendered by the `[slug]` route over `content/en/LandingPage/features.mdx`. No hero: the page opens on the feature grid.
121
+ Three placeholder use cases from the base layer (#6658 D4): `first-use-case`, `second-use-case` and `third-use-case`, rendered as prose by the `/use-cases/[slug]` route.
122
+
123
+ <!-- generated:begin page=/use-cases/[slug] -->
124
+
125
+ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `persona-2.mdx`, `persona-3.mdx`._
126
+ <!-- generated:end -->
127
+
128
+ ### `/software` — code route (the product listing) · chrome on
129
+
130
+ Lists every `SoftwareProduct` page by slug. The route is core since #6658: the product's own page replaced the `/features` stand-in, so every scaffold carries it.
88
131
 
89
132
  <!-- generated:begin page=/features -->
90
133
 
91
- | # | Section | Component | Copy (first line) |
92
- | --- | ------------------------------------------------- | --------- | ------------------------------------------------- |
93
- | 1 | `feature` (eyebrow "Core Features" · features ×5) | `Feature` | Medium length section heading goes here |
94
- | 2 | `cta` (2 CTAs) | `CTA` | Direct integrations with your favorite tools |
95
- | 3 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
134
+ | # | Section | Component | Copy (first line) |
135
+ | --- | ------------------------------------------------- | --------- | ----------------------------------------------- |
136
+ | 1 | `hero` (eyebrow "Features" · 2 CTAs) | `Hero` | {Features: what your product does} |
137
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {Everything your product does for the customer} |
138
+ | 3 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
96
139
 
97
140
  <!-- generated:end -->
98
141
 
142
+ ### `/features/<slug>` (seeds: `feature-1` · `feature-2` · `feature-3`) — Feature · schema `WebPage` → `SoftwareApplication` (named for the feature, `featureList: [it]`) · chrome on
143
+
144
+ Reference: `screenshots/features.png`, `copy/features.txt`, plus the how-it-works steps. One page per feature (#6721, reversing #6658 D5), rendered by the `/features/[slug]` route over `content/en/Feature/<slug>.mdx`; the `/features` hub (`FeaturesList`) lists them. Its JSON-LD is a `WebPage` whose `mainEntity` is a `SoftwareApplication` named by the page title; its feature titles become the site's `featureList` when `_site.mdx` declares a `SoftwareApplication` secondary. It carries the former `/features` sections, with their links re-pointed to in-page anchors, and the how-it-works steps that moved off `/use-cases` (the brief's "how-it-works folds into the product page"). The nav's Features links and the home page's feature links point here.
145
+
146
+ <!-- generated:begin page=/features/[slug] -->
147
+
148
+ _Detail route over `content/en/Feature/` — 3 seed pages: `feature-1.mdx`, `feature-2.mdx`, `feature-3.mdx`._
149
+ <!-- generated:end -->
150
+
99
151
  ### `/pricing` — Pricing · schema `Pricing` · chrome on
100
152
 
101
- Reference: `screenshots/pricing.png`, `copy/pricing.txt`. The reference opens on a hero (eyebrow Pricing, the headline, two CTAs) ABOVE the plans section, which repeats the headline — composed as the reference and the copy have it. Route enabled by the roster (#5469 D10).
153
+ Reference: `screenshots/pricing.png`, `copy/pricing.txt`. The reference opens on a hero that repeats the plans section's own eyebrow/headline/subtitle; the template drops that hero (operator, 2026-09-23) and the plans section leads the page and owns its `<h1>` (`ownsPageTitle`). Route enabled by the roster (#5469 D10).
102
154
 
103
155
  <!-- generated:begin page=/pricing -->
104
156
 
105
- | # | Section | Component | Copy (first line) |
106
- | --- | ---------------------------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
107
- | 1 | `hero` (eyebrow "Pricing" · 2 CTAs) | `Hero` | Pays for itself in {tangible value or outcome} |
108
- | 2 | `pricing` (three-tiers-with-toggle · eyebrow "Pricing" · plans ×3 · billingToggle) | `Pricing` | Pays for itself in {tangible value or outcome} |
109
- | 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
110
- | 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
111
- | 5 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
112
- | 6 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | FAQs |
157
+ | # | Section | Component | Copy (first line) |
158
+ | --- | ------------------------------------------------------------------------------------ | -------------- | ----------------------------------------------------------------- |
159
+ | 1 | `hero` (centered · gapBelow=tight · eyebrow "Pricing" · 2 CTAs) | `Hero` | {Upgrade to Pro with Commerce} |
160
+ | 2 | `pricing` (three-tiers-with-toggle · cardLayout=centered · plans ×3 · billingToggle) | `Pricing` | Basic plan |
161
+ | 3 | `logoCloud` (layout=inline · logos ×3) | `LogoCloud` | {Don’t just take our word for it} |
162
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
163
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
164
+ | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | {FAQs} |
113
165
 
114
166
  <!-- generated:end -->
115
167
 
@@ -119,14 +171,13 @@ Reference: `screenshots/about.png`, `copy/about.txt`. No hero: the page opens on
119
171
 
120
172
  <!-- generated:begin page=/about -->
121
173
 
122
- | # | Section | Component | Copy (first line) |
123
- | --- | -------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
124
- | 1 | `content-block` (media-right · eyebrow "Manifesto" · 2 CTAs) | `ContentBlock` | We want you to {ability they couldn't do before} |
125
- | 2 | `team` (members ×5) | `Team` | Our team |
126
- | 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
127
- | 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
128
- | 5 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
129
- | 6 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | FAQs |
174
+ | # | Section | Component | Copy (first line) |
175
+ | --- | --------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
176
+ | 1 | `content-block` (media-right · imagerySlot=true · eyebrow "About" · 2 CTAs) | `ContentBlock` | {We want you to ability they couldn't do before} |
177
+ | 2 | `team` (with-side-images · eyebrow "Tagline" · members ×5) | `Team` | Our team |
178
+ | 3 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
179
+ | 4 | `cta` (box · imagerySlot=true · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
180
+ | 5 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | FAQs |
130
181
 
131
182
  <!-- generated:end -->
132
183
 
@@ -136,11 +187,11 @@ No standardissue page; folded into the Product flyout. Copy: the reference's FAQ
136
187
 
137
188
  <!-- generated:begin page=/faq -->
138
189
 
139
- | # | Section | Component | Copy (first line) |
140
- | --- | -------------------------------------------------------------- | --------- | ---------------------------------------------------------------------- |
141
- | 1 | `hero` | `Hero` | FAQs |
142
- | 2 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | Vel odio odit voluptatum ut veritatis. Ex rerum aspernatur voluptas u… |
143
- | 3 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
190
+ | # | Section | Component | Copy (first line) |
191
+ | --- | ------------------------------------------------------- | --------- | ---------------------------------------- |
192
+ | 1 | `hero` (gapBelow=tight · eyebrow "FAQ") | `Hero` | FAQs |
193
+ | 2 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | {A question your customers actually ask} |
194
+ | 3 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | {A second group of questions} |
144
195
 
145
196
  <!-- generated:end -->
146
197
 
@@ -150,28 +201,63 @@ Reference: `screenshots/contact.png`, `copy/contact.txt`. The reference is a spl
150
201
 
151
202
  <!-- generated:begin page=/contact -->
152
203
 
153
- | # | Section | Component | Copy (first line) |
154
- | --- | ----------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
155
- | 1 | `hero` (split · eyebrow "Book a Demo" · checklist ×3) | `Hero` | Ready to {achieve a valuable outcome}? |
156
- | 2 | `contact-form` (card · fields ×3) | `ContactForm` | Name · Email · Message |
157
- | 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
158
- | 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
204
+ | # | Section | Component | Copy (first line) |
205
+ | --- | --------------------------------------------------------- | --------- | ------------------------------------- |
206
+ | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
159
207
 
160
208
  <!-- generated:end -->
161
209
 
162
- ### `/blog` — LandingPage · schema `WebPage` · chrome on (Free teaser)
210
+ ### `/glossary` — GlossaryList · schema `CollectionPage` → `DefinedTermSet` · chrome on
163
211
 
164
- Reference: `screenshots/blog.png`, `copy/blog.txt` for the opener and the newsletter. Free ships **one static page**: the reference's opener, a CTA to the Pro docs-blog module (the one non-verbatim block), the newsletter, and the reference's logo strip + testimonial. Pro replaces this route with the real listing by directory precedence (#5469 D3).
212
+ A base-layer seed every starter carries (#6658 D5): a hero, then a `glossary-index` of five placeholder terms, each a `DefinedTerm` in the page's `DefinedTermSet`. Linked from the footer's Resources column.
213
+
214
+ <!-- generated:begin page=/glossary -->
215
+
216
+ | # | Section | Component | Copy (first line) |
217
+ | --- | ----------------------------------- | --------------- | -------------------------------------------- |
218
+ | 1 | `hero` (eyebrow "Glossary" · 1 CTA) | `Hero` | {Glossary: the terms your customers look up} |
219
+ | 2 | `glossary-index` (columns) | `GlossaryIndex` | {Terms, A to Z} |
220
+
221
+ <!-- generated:end -->
222
+
223
+ ### `/newsletter` — NewsletterSignup · schema `WebPage` → `Offer` · chrome on
224
+
225
+ A base-layer seed every starter carries (#6658 D5). The form posts to lead capture (`/v1/leads/subscribe`), which records a subscriber and sends no verification email. The frontmatter `schema:` names the free subscription as the page's `Offer`. Linked from the footer's Resources column.
226
+
227
+ <!-- generated:begin page=/newsletter -->
228
+
229
+ | # | Section | Component | Copy (first line) |
230
+ | --- | -------------------------------------- | --------- | --------------------------------------- |
231
+ | 1 | `hero` (eyebrow "Newsletter" · 2 CTAs) | `Hero` | {Start a free newsletter with Substack} |
232
+ | 2 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
233
+
234
+ <!-- generated:end -->
235
+
236
+ ### `/book-a-call` — BookCall · schema `WebPage` → `Offer` · chrome on
237
+
238
+ A base-layer seed every starter carries (#6658 D5): a hero whose call to action is `/contact`, then what happens on the call. A template carrying the scheduling module overrides the seed so the call to action opens `/meet`. Linked from the footer's Site pages column.
239
+
240
+ <!-- generated:begin page=/book-a-call -->
241
+
242
+ | # | Section | Component | Copy (first line) |
243
+ | --- | -------------------------------------- | --------- | ------------------------------------------ |
244
+ | 1 | `hero` (eyebrow "Book a call" · 1 CTA) | `Hero` | {Book a call: what a visitor gets from it} |
245
+ | 2 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
246
+
247
+ <!-- generated:end -->
248
+
249
+ ### `/blog` — BlogList · schema `Blog` · chrome on (Free teaser)
250
+
251
+ Reference: `screenshots/blog.png`, `copy/blog.txt` for the opener and the newsletter. Free ships **one static page** with the correct page type — a BlogList (`content/en/BlogList/blog.mdx`, emitting the BlogList builder's `Blog` with an empty `ItemList`) served by the generic `[slug]` route, which probes BlogList after LandingPage: the reference's opener, a CTA to the Pro docs-blog module (the one non-verbatim block), the newsletter, and the reference's logo strip + testimonial. Pro replaces this route with the real listing by directory precedence (#5469 D3).
165
252
 
166
253
  <!-- generated:begin page=/blog -->
167
254
 
168
- | # | Section | Component | Copy (first line) |
169
- | --- | ------------------------------------ | -------------- | ---------------------------------------------------------------------- |
170
- | 1 | `hero` (centered · eyebrow "Blog") | `Hero` | Resources for {customer profile} |
171
- | 2 | `cta` (2 CTAs) | `CTA` | The blog listing ships with the Pro docs-blog module |
172
- | 3 | `newsletter` | `Newsletter` | Stay Up to Date with our {fequency} Newsletter |
173
- | 4 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
174
- | 5 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
255
+ | # | Section | Component | Copy (first line) |
256
+ | --- | ------------------------------------------------------------ | -------------- | ----------------------------------------------------------------- |
257
+ | 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog" · 2 CTAs) | `Hero` | Get free blog/docs from Fumadocs |
258
+ | 2 | `blog-list` (grid) | `BlogList` | |
259
+ | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
260
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
175
261
 
176
262
  <!-- generated:end -->
177
263
 
@@ -184,6 +270,15 @@ Renders the `SignInCard` client island (providers from env) inside the locale la
184
270
  _Code route — no content, no sections._
185
271
  <!-- generated:end -->
186
272
 
273
+ ### `/sign-up` — code route (sign-up form) · chrome on
274
+
275
+ The account-creation form inside the locale layout — a code route like `/sign-in`, listed so the manifest is a complete install record (#6646). No reference page.
276
+
277
+ <!-- generated:begin page=/sign-up -->
278
+
279
+ _Code route — no content, no sections._
280
+ <!-- generated:end -->
281
+
187
282
  ### `/privacy`, `/terms` — PrivacyPage / TermsPage · schema same · chrome on
188
283
 
189
284
  Reference: `screenshots/legal--privacy-policy.png`, `copy/legal--*.txt`. Content ✅ (the `document-chassis` placeholder document, not re-authored — the two pages stay as #5565 shipped them). Route enabled by the roster (#5469 D10).
@@ -192,9 +287,9 @@ Reference: `screenshots/legal--privacy-policy.png`, `copy/legal--*.txt`. Content
192
287
 
193
288
  <!-- generated:begin page=/privacy -->
194
289
 
195
- | # | Section | Component | Copy (first line) |
196
- | --- | ------------------------------------------------------------------ | ----------------- | ----------------- |
197
- | 1 | `document-chassis` (eyebrow "PLACEHOLDER — REPLACE BEFORE LAUNCH") | `DocumentChassis` | Privacy Policy |
290
+ | # | Section | Component | Copy (first line) |
291
+ | --- | ----------------------------------- | ----------------- | ----------------- |
292
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Privacy Policy |
198
293
 
199
294
  <!-- generated:end -->
200
295
 
@@ -202,35 +297,83 @@ Reference: `screenshots/legal--privacy-policy.png`, `copy/legal--*.txt`. Content
202
297
 
203
298
  <!-- generated:begin page=/terms -->
204
299
 
205
- | # | Section | Component | Copy (first line) |
206
- | --- | ------------------------------------------------------------------ | ----------------- | ----------------- |
207
- | 1 | `document-chassis` (eyebrow "PLACEHOLDER — REPLACE BEFORE LAUNCH") | `DocumentChassis` | Terms of Service |
300
+ | # | Section | Component | Copy (first line) |
301
+ | --- | ----------------------------------- | ----------------- | ----------------- |
302
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Terms of Service |
208
303
 
209
304
  <!-- generated:end -->
210
305
 
306
+ ### `/purchase-policy` — `PurchasePolicyPage` (product shape) · chrome on
307
+
308
+ One document-chassis page with the shape's policy sections — returns, shipping and refunds (#6646). Its Returns section makes the JSON-LD a `MerchantReturnPolicy` at `#return-policy`.
309
+
310
+ <!-- generated:begin page=/purchase-policy -->
311
+
312
+ | # | Section | Component | Copy (first line) |
313
+ | --- | ----------------------------------- | ----------------- | ----------------- |
314
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Purchase Policy |
315
+
316
+ <!-- generated:end -->
317
+
318
+ ### `/portfolio` — PortfolioList · chrome on
319
+
320
+ The before/after portfolio hub (#6687). A shape row since #6753: portfolio belongs to the `organization-product` shape, Free included (operator 2026-09-25).
321
+
322
+ <!-- generated:begin page=/portfolio -->
323
+
324
+ | # | Section | Component | Copy (first line) |
325
+ | --- | ---------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------- |
326
+ | 1 | `hero` (default · gapBelow=tight · size=display · surface=wash-secondary · eyebrow "{Portfolio}" · 2 CTAs) | `Hero` | {The work, before and after.} |
327
+ | 2 | `items` (tile · surface=none · columns=2 · items ×4) | `Items` | |
328
+ | 3 | `cta` (beam · chips ×3 · 2 CTAs) | `CTA` | {Is your site the before or the after?} |
329
+ | 4 | `faq` (centered · surface=gray-100 · accordion · items ×3 · initialOpen first) | `FAQ` | Frequently Asked Questions |
330
+
331
+ <!-- generated:end -->
332
+
333
+ ### `/portfolio/<slug>` (seeds: `sample-one` … `sample-four`) — PortfolioItem · chrome on
334
+
335
+ One `before-after` comparison per page, seeded from `site-templates/_base/content/en/PortfolioItem/` (#6687, #6753).
336
+
337
+ <!-- generated:begin page=/portfolio/[slug] -->
338
+
339
+ _Detail route over `content/en/PortfolioItem/` — 4 seed pages: `sample-four.mdx`, `sample-one.mdx`, `sample-three.mdx`, `sample-two.mdx`._
340
+ <!-- generated:end -->
341
+
211
342
  ### `/thanks/<slug>` — per-form confirmation (InstrumentDeliveryPage) · chrome on
212
343
 
213
344
  Not a hub page by design (#3960). Free ships none because the contact form confirms inline. Listed so nobody re-files it.
214
345
 
346
+ ## 1b. Structured data (every page)
347
+
348
+ Every content route emits one `application/ld+json` script whose `@graph` carries the site's own entity graph, built from `content/_site.mdx` `siteIdentity` — never from a page title (#6597):
349
+
350
+ | Node | `@id` | Built from | Links |
351
+ | ------------------------------------------------------ | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
352
+ | Identity (`Organization` · `Person` · `LocalBusiness`) | `<origin>/#organization` (`#person` for a Person) | `siteIdentity` `name` · `url` · `logo`/`image` · `description` · `sameAs` | — |
353
+ | Secondary (optional) | `<origin>/#product` (a `SoftwareApplication`) · `<origin>/#organization` (a Person's company) | `siteIdentity.secondary` | product `publisher` → `#organization`, `featureList` from the product page's (`/software/product`) feature items; a Person `worksFor` its company, which has the Person as `founder` |
354
+ | `WebSite` | `<origin>/#website` | `siteName` · `baseUrl` · the render locale | `publisher` → the identity node |
355
+
356
+ Each page's primary node is `isPartOf` the `WebSite`; the home page's `mainEntity` is the secondary when declared, else the identity. A testimonials `Review` points its `itemReviewed` at the identity node, declared in the same graph. Free declares no secondary, so a fresh site emits the Organization and the WebSite. `/sign-in` emits no JSON-LD.
357
+
215
358
  ## 2a. State and persistence (every interactive element)
216
359
 
217
360
  The template is content and config; the states live in the components. This table is what the local review clicks through (#5469 AC), per element: the states, where they persist, and what a returning visitor sees.
218
361
 
219
- | Element | States | Persists in | Returning visitor sees | Empty / error state |
220
- | -------------------------------------- | ------------------------------------------ | ------------------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
221
- | Announcement banner (home only) | shown; no dismiss | — | shown on `/`, never elsewhere | — |
222
- | Cookie consent (`BannerConsentIsland`) | unset → shown; accepted; declined | consent cookie (the island's) | nothing until the cookie expires | a blocked storage write leaves it shown |
223
- | Theme toggle (footer) | light · dark · system | `data-theme` + localStorage (`ThemeToggle`) | last choice | falls back to system |
224
- | Locale switcher (footer) | one of `NEXT_PUBLIC_ENABLED_LOCALES` | `NEXT_LOCALE` cookie + the URL prefix | last locale, unprefixed when default | single-locale site shows one option |
225
- | Nav (mobile) | closed · open (hamburger) | — | closed | — |
226
- | Product flyout (desktop) | closed · open on hover/focus | — | closed | — |
227
- | Contact form | idle · sending · success (inline) · error | — | idle | validation errors per field; consent unchecked blocks submit |
228
- | Newsletter (footer + `/blog`) | idle · sending · success · error | — | idle | the reference's two lines: "Thank you! Your submission has been received!" / "Oops! Something went wrong…" |
229
- | Pricing billing toggle | monthly · yearly | — | monthly | — |
230
- | FAQ accordion | per item open/closed (`initialOpen`) | — | first open | no items → section hidden |
231
- | Video section | poster · playing (`playBadge`) | — | poster | missing asset → poster only |
232
- | Sign-in card | providers listed · magic-link sent · error | session cookie (auth) | signed in → redirected by `next-path` | no provider configured → honest empty state |
233
- | Legal document chassis | contents nav scroll position | — | top | — |
362
+ | Element | States | Persists in | Returning visitor sees | Empty / error state |
363
+ | -------------------------------------- | -------------------------------------------------- | ------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
364
+ | Announcement banner (home only) | off by default (#6469); when on: shown, no dismiss | — | when on: shown on `/`, never elsewhere | — |
365
+ | Cookie consent (`BannerConsentIsland`) | unset → shown; accepted; declined | consent cookie (the island's) | nothing until the cookie expires | a blocked storage write leaves it shown |
366
+ | Theme toggle (footer) | light · dark · system | `data-theme` + localStorage (`ThemeToggle`) | last choice | falls back to system |
367
+ | Locale switcher (footer) | one of `NEXT_PUBLIC_ENABLED_LOCALES` | `NEXT_LOCALE` cookie + the URL prefix | last locale, unprefixed when default | single-locale site shows one option |
368
+ | Nav (mobile) | closed · open (hamburger) | — | closed | — |
369
+ | Product flyout (desktop) | closed · open on hover/focus | — | closed | — |
370
+ | Contact form | idle · sending · success (inline) · error | — | idle | validation errors per field; consent unchecked blocks submit |
371
+ | Newsletter (footer + `/blog`) | idle · sending · success · error | — | idle | the reference's two lines: "Thank you! Your submission has been received!" / "Oops! Something went wrong…" |
372
+ | Pricing billing toggle | monthly · yearly | — | monthly | — |
373
+ | FAQ accordion | per item open/closed (`initialOpen`) | — | first open | no items → section hidden |
374
+ | Video section | poster · playing (`playBadge`) | — | poster | missing asset → poster only |
375
+ | Sign-in card | providers listed · magic-link sent · error | session cookie (auth) | signed in → redirected by `next-path` | no provider configured → honest empty state |
376
+ | Legal document chassis | contents nav scroll position | — | top | — |
234
377
 
235
378
  ## 3. Roster, as the registry declares it
236
379
 
@@ -240,33 +383,83 @@ The template is content and config; the states live in the components. This tabl
240
383
  marketing-site-free:
241
384
  requires: [marketing]
242
385
  categories: [accounting, legal, technology]
386
+ shape: organization-product
387
+ design: standard
243
388
  roster:
244
- - { route: "/", content: ["content/en/HomePage/home.mdx"] }
245
- - { route: "/how-it-works", content: ["content/en/LandingPage/how-it-works.mdx"] }
246
- - { route: "/features", content: ["content/en/LandingPage/features.mdx"] }
247
- - { route: "/pricing", content: ["content/en/Pricing/pricing.mdx"] }
248
- - { route: "/about", content: ["content/en/AboutPage/about.mdx"] }
249
- - { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] }
250
- - { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] }
251
- - { route: "/sign-in" }
252
- - { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] }
253
- - { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] }
254
- - { route: "/blog", content: ["content/en/LandingPage/blog.mdx"] }
389
+ - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
390
+ - { route: "/features", kind: page, content: ["content/en/FeaturesList/features.mdx"] }
391
+ - { route: "/features/[slug]", kind: page, contentDir: "content/en/Feature" }
392
+ - { route: "/use-cases", kind: page, content: ["content/en/UseCasesList/use-cases.mdx"] }
393
+ - { route: "/use-cases/[slug]", kind: page, contentDir: "content/en/UseCase" }
394
+ - { route: "/pricing", kind: page, content: ["content/en/Pricing/pricing.mdx"] }
395
+ - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
396
+ - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
397
+ - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
398
+ - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
399
+ - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
400
+ - { route: "/book-a-call", kind: page, content: ["content/en/BookCall/book-call.mdx"] }
401
+ - { route: "/sign-in", kind: route }
402
+ - { route: "/sign-up", kind: route }
403
+ - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
404
+ - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
405
+ - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
406
+ - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
407
+ - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
408
+ - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
255
409
  ```
256
410
 
257
411
  <!-- generated:end -->
258
412
 
259
- All eleven rows are declared on the registry (`TEMPLATE_BASE_ROSTER` + the Free `/blog` teaser row, #5469 D3/D4), so the template is one declared page set whichever mechanism scaffolds each: the always-copied overlay for the core pages, `site-templates/marketing-site-free/content/**` for the three module-less ones.
413
+ All twenty rows are declared on the registry — the `organization-product` shape roster in `src/starter-grid.ts`: `TEMPLATE_BASE_ROSTER` + the `/blog` teaser row + the two portfolio rows (#5469 D3/D4, re-derived by #6658, portfolio added by #6753), so the template is one declared page set whichever mechanism scaffolds each: the always-copied overlay for the core pages, `site-templates/_base/content/**` for the module-less ones and the three use cases. The scaffold carries this roster as `.ailk-site-manifest.json` at its root (#6658 D7); this Markdown stays in the template.
414
+
415
+ ### 3a. Deviations from the standard roster (recorded, #6658)
416
+
417
+ The roster is the standard page set for this template's shape, edited only by
418
+ the rows below. The standard set is the `page_type` column of
419
+ `python3 scripts/derive-roster.py --entity-type software --offering-type software --primary-goal convert --scale global --registry packages/schema/src/registry/entries.ts`
420
+ (20 rows, `mainEntity: SoftwareApplication`) — the `--shape organization-product`
421
+ invocation once claude-setup#9145's `--shape` flag is vendored into this repo.
422
+ The roster's page rows equal that set minus the dropped rows, plus the added
423
+ rows (`R = (S − D) ∪ A`). This supersedes the 2026-09-23 disposition, whose
424
+ three omissions (`GlossaryList`, `BookCall`, `NewsletterSignup`) the brief
425
+ reversed (`docs/decisions/starter-roster-page-set.md` D4, D7).
426
+
427
+ **Standard rows dropped:**
428
+
429
+ | Standard row | Reason |
430
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------ |
431
+ | `IntegrationsList` | a placeholder starter has no integrations to list |
432
+ | `Integration` | a placeholder starter has no integrations to list |
433
+ | `CoursesList` | there is no course offering |
434
+ | `Course` | there is no course offering |
435
+ | `CaseStudiesList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
436
+ | `CaseStudy` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
437
+ | `TestimonialsList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
438
+ | `ClientsList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
439
+
440
+ **Rows added:**
441
+
442
+ | Added row | Reason |
443
+ | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
444
+ | `SoftwareProduct` | the single product's own detail page — the standard's multi-product opt-in, taken by the one product |
445
+ | `PurchasePolicyPage` | the product-shape purchase policy every shape carries (#6646 D3) |
446
+ | `BlogList` (the `/blog` teaser) | the standard's `convert` goal carries no blog (`blog_enabled: false`); the Free teaser stays by operator ruling 2026-09-24, and where the docs-blog module is present its own `BlogList` serves `/blog` instead |
447
+ | `/software`, `/sign-in`, `/sign-up` | code routes (`kind: route`): the product listing and the two auth pages carry no page type of their own |
448
+ | `PortfolioList`, `PortfolioItem` (`/portfolio`, `/portfolio/[slug]`) | portfolio belongs to the shape, Free included (roadmap § 4, operator 2026-09-25, reversing #6687's "Pro and up"; #6753). `pnpm starter:check` R3.2 counts two more missing anchor captures for these routes — the pre-existing, non-CI anchor gap, now 14 |
449
+
450
+ ### 3b. Site entity (operator-disposed 2026-09-24)
451
+
452
+ `derive-roster.py` names `SoftwareApplication` as the main entity for this template's inputs. The template deliberately declares the **Organization** as the site's primary node and the software as its **secondary** node (`siteIdentity.secondary`, kind `SoftwareApplication`, #6597): the Free template is a company's own site about its product, so the entity the site is _about_ is the maker. The inverse — `SoftwareApplication` primary — is for a product whose canonical site is elsewhere (Positionary, whose maker has its own site). A fresh Free scaffold declares no `secondary` until the owner names the product; the overlay `_site.mdx` documents the field.
260
453
 
261
454
  ## 4. Component inventory (Free, by tier)
262
455
 
263
456
  <!-- generated:begin inventory -->
264
457
 
265
- | Tier | Used by this template |
266
- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
267
- | Shell | `MarketingShell` |
268
- | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
269
- | Sections | `ContactForm`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `Hero`, `LogoCloud`, `Newsletter`, `Pricing`, `StairSteps`, `Team`, `Testimonials`, `VideoSection` |
458
+ | Tier | Used by this template |
459
+ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
460
+ | Shell | `MarketingShell` |
461
+ | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
462
+ | Sections | `BlogList`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `MediaBand`, `Pricing`, `Team`, `Testimonials` |
270
463
 
271
464
  <!-- generated:end -->
272
465
 
@@ -284,3 +477,20 @@ Every section above already exists in `packages/ui`; the reproduction is composi
284
477
  | Footer columns + subscribe not composed on the default path | this template's build |
285
478
  | `/meet` rename (Pro) | #5563 |
286
479
  | `ReportPage` (Pro) | #5562 |
480
+ | CTA `box` variant's checklist + imagery-slot split (the product page's switch box) | #6526 |
481
+
482
+ ## 6. Not included (starter-template contract R2.4)
483
+
484
+ Named so nothing is assumed. Each is a scaffold-time or post-launch addition, not a gap in this template.
485
+
486
+ | Not included | What the template does instead |
487
+ | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
488
+ | Email delivery of form submissions | the contact form persists in file mode (`AILK_LOCAL_LEAD_CAPTURE`) or to the leads API; no mail is sent |
489
+ | Newsletter backend | the footer Subscribe block is composed but posts nowhere until the owner wires a provider (§ 5) |
490
+ | Translated content | one locale (`en`); the i18n routing and message files ship, the copy does not |
491
+ | Error monitoring | none wired; the scaffold carries no Sentry or equivalent |
492
+ | Blog | `/blog` is a teaser (`BlogList`, empty list by design); posts need the `docs` module (Pro) |
493
+ | Auth-backed pages | `/sign-in` renders; sessions need Postgres (README § When you need a database) |
494
+ | Payments | none; commerce is the add-on (`docs/strategy/OFFERINGS.md`) |
495
+ | Analytics | `analytics.vercelAnalytics: false` in `_site.mdx`; the consent banner ships, nothing loads behind it until toggled |
496
+ | Search | none |