@aglyn/plugins-ai 1.0.0-beta.151 → 1.0.0-beta.153

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 (29) hide show
  1. package/package.json +17 -17
  2. package/src/lib/jobs/ai-job-component-step.d.ts +27 -1
  3. package/src/lib/jobs/ai-job-component-step.js +68 -3
  4. package/src/lib/jobs/ai-job-component-step.js.map +1 -1
  5. package/src/lib/jobs/ai-job-drafts.d.ts +19 -0
  6. package/src/lib/jobs/ai-job-drafts.js +22 -0
  7. package/src/lib/jobs/ai-job-drafts.js.map +1 -1
  8. package/src/lib/jobs/ai-job-form-step.d.ts +22 -1
  9. package/src/lib/jobs/ai-job-form-step.js +69 -1
  10. package/src/lib/jobs/ai-job-form-step.js.map +1 -1
  11. package/src/lib/jobs/ai-job-layout-step.js +6 -1
  12. package/src/lib/jobs/ai-job-layout-step.js.map +1 -1
  13. package/src/lib/jobs/ai-job-page-sections.d.ts +19 -6
  14. package/src/lib/jobs/ai-job-page-sections.js +20 -7
  15. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  16. package/src/lib/jobs/ai-job-template-step.d.ts +22 -1
  17. package/src/lib/jobs/ai-job-template-step.js +59 -3
  18. package/src/lib/jobs/ai-job-template-step.js.map +1 -1
  19. package/src/lib/jobs/fixtures/ai-page-briefs.d.ts +18 -1
  20. package/src/lib/jobs/fixtures/ai-page-briefs.js +79 -0
  21. package/src/lib/jobs/fixtures/ai-page-briefs.js.map +1 -1
  22. package/src/lib/runtime/ai-doctrine-validators.d.ts +21 -0
  23. package/src/lib/runtime/ai-doctrine-validators.js +50 -0
  24. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  25. package/src/lib/runtime/ai-palette.generated.js +2 -2
  26. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  27. package/src/lib/runtime/ai-repeated-items.d.ts +13 -2
  28. package/src/lib/runtime/ai-repeated-items.js +41 -17
  29. package/src/lib/runtime/ai-repeated-items.js.map +1 -1
@@ -165,6 +165,85 @@ function cards(prefix, input) {
165
165
  return framed(add, children, 'lg', 8);
166
166
  });
167
167
  }
168
+ /**
169
+ * The same cards written once (AGL-3024): ONE Grid item holding ONE instance,
170
+ * `{{n}}` through the values that instance fills, and its copies' values
171
+ * listed — the shape a workspace that KEEPS reusable components answers a
172
+ * repeating section in, beside `cards`, which writes every copy out.
173
+ *
174
+ * The two draw to the same page. What differs is what the answer spends: a
175
+ * cell and an instance are written once rather than once a card, which is the
176
+ * difference between a six-card section that fits a pass's ceiling and one cut
177
+ * off twice — the live failure of 2026-09-21, where a job ended with no page.
178
+ */ function cardsOnce(prefix, input) {
179
+ return section(prefix, input.name, [
180
+ input.componentId
181
+ ], input.items.length, (add)=>{
182
+ var _input_items_;
183
+ const keys = Object.keys((_input_items_ = input.items[0]) != null ? _input_items_ : {});
184
+ const propValues = Object.fromEntries(keys.map((key, at)=>[
185
+ key,
186
+ `{{${at + 1}}}`
187
+ ]));
188
+ const copies = input.items.map((item)=>keys.map((key)=>item[key]));
189
+ const instance = add({
190
+ componentId: 'reusableInstance',
191
+ props: {
192
+ refId: input.componentId,
193
+ propValues
194
+ }
195
+ });
196
+ const children = [
197
+ add(typography('h2', input.heading, 'h2'))
198
+ ];
199
+ if (input.intro) children.push(add(typography('body1', input.intro)));
200
+ children.push(row(add, [
201
+ cell(add, input.items.length, instance, copies)
202
+ ]));
203
+ return framed(add, children, 'lg', 8);
204
+ });
205
+ }
206
+ /**
207
+ * One section of cards on a workspace that keeps reusable components, written
208
+ * once and written out, for the check to draw one into the other (AGL-3024).
209
+ */ export const AI_INSTANCE_CARDS_FIXTURE = (()=>{
210
+ const input = {
211
+ name: 'what the inspection covers',
212
+ heading: 'What the inspection covers',
213
+ componentId: 'cmp-service-card',
214
+ items: [
215
+ {
216
+ title: 'Shingles and flashing',
217
+ summary: 'Lifted, cracked or missing shingles, and the seals around chimneys and vents.'
218
+ },
219
+ {
220
+ title: 'Gutters and drainage',
221
+ summary: 'Clogs, sagging runs and downspouts that send water toward the foundation.'
222
+ },
223
+ {
224
+ title: 'Attic and ventilation',
225
+ summary: 'Signs of leaks, damp insulation and blocked soffit vents.'
226
+ },
227
+ {
228
+ title: 'Chimneys and skylights',
229
+ summary: 'Cracked crowns, worn flashing and the seals around every roof opening.'
230
+ },
231
+ {
232
+ title: 'Valleys and eaves',
233
+ summary: 'Where two roof planes meet, and the ice-damming the eaves take each winter.'
234
+ },
235
+ {
236
+ title: 'Soffits and fascia',
237
+ summary: 'Rot, pest damage and the vents that keep an attic breathing.'
238
+ }
239
+ ]
240
+ };
241
+ return {
242
+ once: cardsOnce('r', input),
243
+ full: cards('r', input),
244
+ items: input.items
245
+ };
246
+ })();
168
247
  /** A short list: fewer rows than the plan rules count as repeated items. */ function list(prefix, input) {
169
248
  return section(prefix, input.name, [], input.items.length, (add)=>{
170
249
  const rows = input.items.map((item)=>add({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/ai/src/lib/jobs/fixtures/ai-page-briefs.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { AiBuildPlan, AiBuildPlanReuse, AiBuildPlanSection } from '../../model/ai-build-plan'\nimport type { AiPageType } from '../../model/ai-page-job'\nimport {\n emptyAiSiteInventory,\n type AiInventoryComponent,\n type AiInventoryForm,\n type AiInventoryLayout,\n type AiInventoryScreen,\n type AiSiteInventory,\n} from '../../model/ai-site-inventory'\n\n/**\n * Ten page briefs across the ICPs, with golden answers (AGL-2907): four agency\n * client sites, three multi-brand businesses and three single small\n * businesses, over seven page types.\n *\n * GOLDEN, NOT RECORDED. Each answer is written by hand in the shape a model\n * answers a section in — the tree a `submit_section` call carries — and no\n * provider produced it. The evals replay them through the real page step,\n * plan rules, doctrine and draft writer, so they prove the step and the\n * rules, never a model's quality, and the credits they add up to are an\n * estimate from their size, labeled as one wherever it is quoted.\n *\n * Every plan is one a page job can build: one screen that places what its\n * site already has — components by id, forms by id, links to its screens —\n * and creates nothing. Rows that repeat are a component the site keeps, as\n * the plan rules require. Copy leaves every fact a brief would not give in\n * square brackets, as the building rules ask a model to.\n */\n\n/** One node as a model writes it: its own id is the key it sits under. */\nexport interface AiGoldenNode {\n componentId: string\n props?: Record<string, unknown>\n sx?: Record<string, unknown>\n nodes?: string[]\n /**\n * A repeated item written once (AGL-3053): each copy's values, in the order\n * of the `{{1}}`, `{{2}}` placeholders its subtree carries.\n */\n repeat?: string[][]\n}\n\n/** A section as the model answers it: the document wrapper holding one Section. */\nexport interface AiGoldenSection {\n rootId: string\n nodes: Record<string, AiGoldenNode>\n}\n\nexport interface AiPageBriefFixture {\n id: string\n icp: 'agency' | 'multi-brand' | 'small-business'\n pageType: AiPageType\n brief: string\n inventory: AiSiteInventory\n /** The plan a member confirmed: one screen, reusing what the site has, creating nothing. */\n plan: AiBuildPlan\n /** The golden answer to each section pass, in the plan's order. */\n answers: AiGoldenSection[]\n /** The listing the golden SEO answer proposes. */\n seo: { title: string; description: string }\n}\n\ninterface Built {\n answer: AiGoldenSection\n section: AiBuildPlanSection\n}\n\ntype Add = (node: AiGoldenNode, id?: string) => string\n\nfunction section(prefix: string, name: string, uses: string[], items: number, build: (add: Add) => AiGoldenNode): Built {\n const nodes: Record<string, AiGoldenNode> = {}\n let counter = 0\n const add: Add = (node, id) => {\n const key = id ?? `${prefix}${++counter}`\n nodes[key] = node\n return key\n }\n const root = add(build(add), `${prefix}section`)\n nodes['root'] = { componentId: 'div', nodes: [root] }\n return { answer: { rootId: 'root', nodes }, section: { name, uses, items } }\n}\n\nconst typography = (variant: string, children: string, component?: string): AiGoldenNode => ({\n componentId: 'muiTypography',\n props: { variant, children, ...(component ? { component } : {}) },\n})\n\n/** A Section holding a Container holding a column Stack: the frame every golden section uses. */\nfunction framed(add: Add, children: string[], maxWidth: string, py: number, stack: Record<string, unknown> = {}): AiGoldenNode {\n const column = add({ componentId: 'muiStack', props: { direction: 'column', ...stack }, sx: { gap: 2 }, nodes: children })\n const container = add({ componentId: 'muiContainer', props: { maxWidth }, sx: { py }, nodes: [column] })\n return { componentId: 'section', props: { element: 'section' }, nodes: [container] }\n}\n\nfunction hero(prefix: string, input: { name?: string; title: string; lead: string; cta?: { label: string; screenId: string }; image?: string }): Built {\n return section(prefix, input.name ?? 'hero', input.cta ? [input.cta.screenId] : [], 0, (add) => {\n const children = [add(typography('h1', input.title, 'h1')), add(typography('body1', input.lead))]\n if (input.cta) {\n children.push(add({ componentId: 'muiButton', props: { children: input.cta.label, variant: 'contained', screenId: input.cta.screenId } }))\n }\n if (input.image) children.push(add({ componentId: 'image', props: { alt: input.image } }))\n return framed(add, children, 'md', 8, { alignItems: 'flex-start' })\n })\n}\n\n/**\n * The size each item of a golden row takes (AGL-3055): full width on a phone,\n * two across from sm where four or more share the row, and two, three or four\n * across from md, as the stored string the Grid renderer reads.\n */\nfunction span(items: number): string {\n if (items <= 2) return 'xs:12 md:6'\n if (items === 3) return 'xs:12 md:4'\n return items === 4 ? 'xs:12 sm:6 md:3' : 'xs:12 sm:6 md:4'\n}\n\n/** A Grid item of a row of `items`, holding one element. */\nfunction cell(add: Add, items: number, child: string, repeat?: string[][]): string {\n return add({ componentId: 'muiGrid', props: { size: span(items) }, nodes: [child], ...(repeat ? { repeat } : {}) })\n}\n\n/** A row of Grid items: a Grid container spaced by its own spacing (AGL-3055). */\nfunction row(add: Add, cells: string[]): string {\n return add({ componentId: 'muiGrid', props: { container: true, spacing: 3 }, nodes: cells })\n}\n\nfunction cards(prefix: string, input: { name: string; heading: string; intro?: string; componentId: string; items: Array<Record<string, string>> }): Built {\n return section(prefix, input.name, [input.componentId], input.items.length, (add) => {\n const cells = input.items.map((propValues) =>\n cell(add, input.items.length, add({ componentId: 'reusableInstance', props: { refId: input.componentId, propValues } })),\n )\n const children = [add(typography('h2', input.heading, 'h2'))]\n if (input.intro) children.push(add(typography('body1', input.intro)))\n children.push(row(add, cells))\n return framed(add, children, 'lg', 8)\n })\n}\n\n/** A short list: fewer rows than the plan rules count as repeated items. */\nfunction list(prefix: string, input: { name: string; heading: string; items: Array<{ primary: string; secondary?: string }> }): Built {\n return section(prefix, input.name, [], input.items.length, (add) => {\n const rows = input.items.map((item) =>\n add({\n componentId: 'muiListItem',\n nodes: [add({ componentId: 'muiListItemText', props: { primary: item.primary, ...(item.secondary ? { secondary: item.secondary } : {}) } })],\n }),\n )\n return framed(add, [add(typography('h2', input.heading, 'h2')), add({ componentId: 'muiList', props: { dense: false }, nodes: rows })], 'md', 6)\n })\n}\n\nfunction prose(prefix: string, input: { name: string; heading: string; paragraphs: string[] }): Built {\n return section(prefix, input.name, [], 0, (add) =>\n framed(add, [add(typography('h2', input.heading, 'h2')), ...input.paragraphs.map((copy) => add(typography('body1', copy)))], 'md', 6),\n )\n}\n\nfunction form(prefix: string, input: { name: string; heading: string; intro: string; formId: string }): Built {\n return section(prefix, input.name, [input.formId], 0, (add) =>\n framed(\n add,\n [add(typography('h2', input.heading, 'h2')), add(typography('body1', input.intro)), add({ componentId: 'form', props: { formId: input.formId } })],\n 'sm',\n 8,\n ),\n )\n}\n\n/**\n * Items drawn where they repeat, each a Card: what a workspace that keeps no\n * reusable components builds instead of placing a component (AGL-3030).\n */\nfunction inlineCards(prefix: string, input: { name: string; heading: string; items: Array<{ title: string; summary: string }> }): Built {\n return section(prefix, input.name, [], input.items.length, (add) => {\n const cells = input.items.map((item) =>\n cell(\n add,\n input.items.length,\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n nodes: [add({ componentId: 'muiCardContent', nodes: [add(typography('h3', item.title, 'h3')), add(typography('body2', item.summary))] })],\n }),\n ),\n )\n return framed(add, [add(typography('h2', input.heading, 'h2')), row(add, cells)], 'lg', 8)\n })\n}\n\n/**\n * The same cards written once (AGL-3053): one Grid item holding a Card whose\n * title is `{{1}}` and whose summary is `{{2}}`, with every card's pair listed\n * on the item, which the section check draws into exactly the cells\n * `inlineCards` writes out.\n */\nfunction inlineCardsOnce(prefix: string, input: { name: string; heading: string; items: Array<{ title: string; summary: string }> }): Built {\n return section(prefix, input.name, [], input.items.length, (add) => {\n const item = cell(\n add,\n input.items.length,\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n nodes: [add({ componentId: 'muiCardContent', nodes: [add(typography('h3', '{{1}}', 'h3')), add(typography('body2', '{{2}}'))] })],\n }),\n input.items.map((entry) => [entry.title, entry.summary]),\n )\n return framed(add, [add(typography('h2', input.heading, 'h2')), row(add, [item])], 'lg', 8)\n })\n}\n\n/**\n * A form the page carries itself: a Form with no formId, holding its Form\n * Fields — what a workspace that keeps no saved forms builds instead of\n * placing one (AGL-3030). The site's submit route collects it by its name.\n */\nfunction inlineForm(\n prefix: string,\n input: {\n name: string\n heading: string\n intro: string\n formName: string\n submitLabel: string\n fields: Array<{ fieldName: string; label: string; fieldType: string; required?: boolean }>\n },\n): Built {\n return section(prefix, input.name, [], 0, (add) =>\n framed(\n add,\n [\n add(typography('h2', input.heading, 'h2')),\n add(typography('body1', input.intro)),\n add({\n componentId: 'form',\n props: { formName: input.formName, submitLabel: input.submitLabel },\n nodes: input.fields.map((field) => add({ componentId: 'formField', props: { ...field } })),\n }),\n ],\n 'sm',\n 8,\n ),\n )\n}\n\nfunction callToAction(prefix: string, input: { name: string; heading: string; body: string; label: string; screenId: string }): Built {\n return section(prefix, input.name, [input.screenId], 0, (add) =>\n framed(\n add,\n [\n add(typography('h2', input.heading, 'h2')),\n add(typography('body1', input.body)),\n add({ componentId: 'muiButton', props: { children: input.label, variant: 'contained', screenId: input.screenId } }),\n ],\n 'md',\n 8,\n { alignItems: 'center' },\n ),\n )\n}\n\nconst THEME = { summary: ['Light scheme with the theme’s default type'], colors: { 'primary.main': '#1f5fa8', 'secondary.main': '#c2410c' }, fonts: ['Inter'] }\nconst SITE_LAYOUT: AiInventoryLayout = { id: 'lay-site', name: 'Site layout', parentId: null }\nconst HOME: AiInventoryScreen = { id: 'scr-home', name: 'Home', slug: '/', layoutId: 'lay-site', template: false }\n\nfunction site(\n hostId: string,\n parts: {\n components?: AiInventoryComponent[]\n forms?: AiInventoryForm[]\n layouts?: AiInventoryLayout[]\n screens?: AiInventoryScreen[]\n },\n): AiSiteInventory {\n return {\n ...emptyAiSiteInventory(hostId),\n components: parts.components ?? [],\n forms: parts.forms ?? [],\n layouts: parts.layouts ?? [SITE_LAYOUT],\n screens: [HOME, ...(parts.screens ?? [])],\n theme: THEME,\n }\n}\n\nfunction brief(input: {\n id: string\n icp: AiPageBriefFixture['icp']\n pageType: AiPageType\n brief: string\n inventory: AiSiteInventory\n title: string\n slug: string\n layout: string\n nav: boolean\n seo: { title: string; description: string }\n sections: Built[]\n}): AiPageBriefFixture {\n const components = new Set(input.inventory.components.map((row) => row.id))\n const forms = new Set(input.inventory.forms.map((row) => row.id))\n const screens = new Set(input.inventory.screens.map((row) => row.id))\n const reuse: AiBuildPlanReuse[] = [{ kind: 'layout', id: input.layout, purpose: 'the page renders inside it' }]\n const seen = new Set<string>([input.layout])\n for (const { section: planned } of input.sections) {\n for (const ref of planned.uses) {\n if (seen.has(ref)) continue\n seen.add(ref)\n if (components.has(ref)) reuse.push({ kind: 'component', id: ref, purpose: planned.name })\n else if (forms.has(ref)) reuse.push({ kind: 'form', id: ref, purpose: planned.name })\n else if (screens.has(ref)) reuse.push({ kind: 'screen', id: ref, purpose: `linked from ${planned.name}` })\n }\n }\n return {\n id: input.id,\n icp: input.icp,\n pageType: input.pageType,\n brief: input.brief,\n inventory: input.inventory,\n plan: {\n reuse,\n create: [],\n screens: [\n {\n title: input.title,\n slug: input.slug,\n layout: input.layout,\n template: null,\n duplicateOf: null,\n nav: input.nav,\n seoTitle: input.seo.title,\n seoDescription: input.seo.description,\n sections: input.sections.map((entry) => entry.section),\n },\n ],\n },\n answers: input.sections.map((entry) => entry.answer),\n seo: input.seo,\n }\n}\n\nexport const AI_PAGE_BRIEF_FIXTURES: readonly AiPageBriefFixture[] = [\n // ── Agency client sites ─────────────────────────────────────────────────\n brief({\n id: 'agency-roofing-landing',\n icp: 'agency',\n pageType: 'landing',\n brief: 'A landing page for our spring roof inspection offer in Springfield: what the inspection covers, two customer quotes, and the quote request form.',\n inventory: site('host-acme-roofing', {\n components: [\n { id: 'cmp-service-card', name: 'Service card', props: { title: 'text', summary: 'text' } },\n { id: 'cmp-testimonial', name: 'Testimonial', props: { quote: 'text', name: 'text', role: 'text' } },\n ],\n forms: [{ id: 'frm-quote', name: 'Quote request', fields: ['name', 'email', 'phone', 'message'] }],\n screens: [{ id: 'scr-contact', name: 'Contact', slug: 'contact', layoutId: 'lay-site', template: false }],\n }),\n title: 'Spring roof inspections',\n slug: '/spring-roof-inspection',\n layout: 'lay-site',\n nav: false,\n seo: {\n title: 'Spring Roof Inspections in Springfield',\n description: 'A licensed roofer checks shingles, flashing and gutters, then sends photos and a written report within two days.',\n },\n sections: [\n hero('a', {\n title: 'Spring roof inspections in Springfield',\n lead: 'A licensed roofer checks shingles, flashing and gutters, and sends you photos and a written report within two days.',\n cta: { label: 'Request a quote', screenId: 'scr-contact' },\n image: 'A roofer inspecting shingles on a two-story house',\n }),\n cards('b', {\n name: 'what the inspection covers',\n heading: 'What the inspection covers',\n componentId: 'cmp-service-card',\n items: [\n { title: 'Shingles and flashing', summary: 'Lifted, cracked or missing shingles, and the seals around chimneys and vents.' },\n { title: 'Gutters and drainage', summary: 'Clogs, sagging runs and downspouts that send water toward the foundation.' },\n { title: 'Attic and ventilation', summary: 'Signs of leaks, damp insulation and blocked soffit vents.' },\n ],\n }),\n cards('c', {\n name: 'customer quotes',\n heading: 'What homeowners say',\n componentId: 'cmp-testimonial',\n items: [\n { quote: 'They found a failed vent boot before it leaked into the bedroom.', name: '[customer name]', role: 'Homeowner, Springfield' },\n { quote: 'The report had photos of every problem and a price for each fix.', name: '[customer name]', role: 'Homeowner, Riverton' },\n ],\n }),\n form('d', {\n name: 'quote request form',\n heading: 'Book your inspection',\n intro: 'Tell us about your roof and when you are home. We confirm a time within one business day.',\n formId: 'frm-quote',\n }),\n ],\n }),\n brief({\n id: 'agency-dental-implants-service',\n icp: 'agency',\n pageType: 'service',\n brief: 'A service page for dental implants: how treatment works step by step, our two implant dentists, and the appointment request form.',\n inventory: site('host-lakeside-dental', {\n components: [\n { id: 'cmp-dentist-card', name: 'Dentist card', props: { name: 'text', credentials: 'text', bio: 'text' } },\n { id: 'cmp-treatment-step', name: 'Treatment step', props: { step: 'text', detail: 'text' } },\n ],\n forms: [{ id: 'frm-appointment', name: 'Appointment request', fields: ['name', 'email', 'phone', 'preferred time'] }],\n }),\n title: 'Dental implants',\n slug: '/dental-implants',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Dental Implants at Lakeside Dental',\n description: 'Permanent tooth replacement placed and restored in one office, from the first 3D scan to the final crown.',\n },\n sections: [\n hero('a', {\n title: 'Dental implants at Lakeside Dental',\n lead: 'A permanent tooth replacement placed and restored in one office, from the first scan to the final crown.',\n image: 'A dentist showing a patient an implant model',\n }),\n cards('b', {\n name: 'how treatment works',\n heading: 'How treatment works',\n componentId: 'cmp-treatment-step',\n items: [\n { step: 'Consultation and 3D scan', detail: 'We check bone density and plan the implant position.' },\n { step: 'Implant placement', detail: 'A short procedure under local anesthetic.' },\n { step: 'Healing', detail: 'Usually three to six months while the implant bonds with the bone.' },\n { step: 'Crown fitting', detail: 'A custom crown matched to your natural teeth.' },\n ],\n }),\n cards('c', {\n name: 'implant dentists',\n heading: 'Your implant team',\n componentId: 'cmp-dentist-card',\n items: [\n { name: '[dentist name]', credentials: 'DDS, implant fellowship', bio: 'Places and restores implants in the same office.' },\n { name: '[dentist name]', credentials: 'DMD, prosthodontist', bio: 'Designs crowns, bridges and full-arch restorations.' },\n ],\n }),\n form('d', {\n name: 'appointment request form',\n heading: 'Ask for a consultation',\n intro: 'Send a few details and we call you to find a time. Bring any X-rays you already have.',\n formId: 'frm-appointment',\n }),\n ],\n }),\n brief({\n id: 'agency-law-firm-about',\n icp: 'agency',\n pageType: 'about',\n brief: 'An about page for a family law firm: how the firm works with clients, the three attorneys and what each practices, and a link to book a consultation.',\n inventory: site('host-hart-law', {\n components: [{ id: 'cmp-attorney-card', name: 'Attorney card', props: { name: 'text', practice: 'text' } }],\n screens: [{ id: 'scr-contact', name: 'Contact', slug: 'contact', layoutId: 'lay-site', template: false }],\n }),\n title: 'About the firm',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Hart & Owens Family Law',\n description: 'A family law practice in Marion County. One attorney from first meeting to final order, and a written estimate before filing.',\n },\n sections: [\n hero('a', {\n title: 'About Hart & Owens',\n lead: 'A family law practice that has represented parents and spouses in Marion County since [founding year].',\n }),\n prose('b', {\n name: 'how we work',\n heading: 'How we work',\n paragraphs: [\n 'Every client works with one attorney from the first meeting to the final order, and gets a written estimate before any filing.',\n 'We settle when settlement protects you, and we go to trial when it does not.',\n ],\n }),\n cards('c', {\n name: 'attorneys',\n heading: 'Our attorneys',\n componentId: 'cmp-attorney-card',\n items: [\n { name: '[attorney name]', practice: 'Divorce and property division' },\n { name: '[attorney name]', practice: 'Custody and parenting plans' },\n { name: '[attorney name]', practice: 'Adoption and guardianship' },\n ],\n }),\n callToAction('d', {\n name: 'book a consultation',\n heading: 'Talk to an attorney',\n body: 'The first consultation covers your situation, your options and what each would cost.',\n label: 'Schedule a consultation',\n screenId: 'scr-contact',\n }),\n ],\n }),\n brief({\n id: 'agency-hvac-pricing',\n icp: 'agency',\n pageType: 'pricing',\n brief: 'A pricing page for heating and cooling maintenance plans: the three plans, what every visit includes, and a button to schedule service.',\n inventory: site('host-northside-hvac', {\n components: [\n { id: 'cmp-plan-card', name: 'Plan card', props: { name: 'text', price: 'text', summary: 'text' } },\n { id: 'cmp-checklist-item', name: 'Checklist item', props: { item: 'text' } },\n ],\n screens: [{ id: 'scr-schedule', name: 'Schedule service', slug: 'schedule', layoutId: 'lay-site', template: false }],\n }),\n title: 'Maintenance plans',\n slug: '/maintenance-plans',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Heating and Cooling Maintenance Plans',\n description: 'Two tune-ups a year, priority scheduling and a repair discount for one yearly price. Plans for one system or the whole home.',\n },\n sections: [\n hero('a', {\n title: 'Heating and cooling maintenance plans',\n lead: 'Two tune-ups a year, priority scheduling and a discount on repairs, for one flat yearly price.',\n }),\n cards('b', {\n name: 'plans',\n heading: 'Choose a plan',\n componentId: 'cmp-plan-card',\n items: [\n { name: 'Single system', price: '[price] a year', summary: 'One furnace or one air conditioner.' },\n { name: 'Whole home', price: '[price] a year', summary: 'A furnace and an air conditioner.' },\n { name: 'Multi-zone', price: '[price] a year', summary: 'Up to three systems at one address.' },\n ],\n }),\n cards('c', {\n name: 'what every visit includes',\n heading: 'Every visit includes',\n componentId: 'cmp-checklist-item',\n items: [\n { item: 'Filter change and coil cleaning' },\n { item: 'Refrigerant and pressure checks' },\n { item: 'A written report on the system’s condition' },\n ],\n }),\n callToAction('d', {\n name: 'schedule service',\n heading: 'Start with a tune-up',\n body: 'Pick a time and we sign you up at the visit.',\n label: 'Schedule service',\n screenId: 'scr-schedule',\n }),\n ],\n }),\n // ── Multi-brand businesses ──────────────────────────────────────────────\n brief({\n id: 'multibrand-restaurant-group-event',\n icp: 'multi-brand',\n pageType: 'event',\n brief: 'An event page for the Piedmont wine dinner at Osteria Lume, one of our group’s restaurants: the courses and pairings, a note about the winemaker, and the reservation form.',\n inventory: site('host-harbor-group-osteria', {\n components: [{ id: 'cmp-menu-item', name: 'Menu item', props: { dish: 'text', pairing: 'text' } }],\n layouts: [\n { id: 'lay-osteria', name: 'Osteria layout', parentId: null },\n { id: 'lay-grill', name: 'Harbor Grill layout', parentId: null },\n ],\n forms: [{ id: 'frm-reservation', name: 'Event reservation', fields: ['name', 'email', 'party size'] }],\n screens: [{ id: 'scr-menu', name: 'Menu', slug: 'menu', layoutId: 'lay-osteria', template: false }],\n }),\n title: 'Piedmont wine dinner',\n slug: '/events/piedmont-wine-dinner',\n layout: 'lay-osteria',\n nav: false,\n seo: {\n title: 'Piedmont Wine Dinner at Osteria Lume',\n description: 'Five courses paired with wines from one family vineyard, with a tasting led by the winemaker. Reserve seats online.',\n },\n sections: [\n hero('a', {\n title: 'Piedmont wine dinner at Osteria Lume',\n lead: 'Five courses paired with wines from one family vineyard, on [event date] at 7 p.m.',\n image: 'A long table set for dinner with wine glasses',\n }),\n cards('b', {\n name: 'courses and pairings',\n heading: 'The menu',\n componentId: 'cmp-menu-item',\n items: [\n { dish: 'Vitello tonnato', pairing: 'Paired with Arneis' },\n { dish: 'Agnolotti del plin', pairing: 'Paired with Dolcetto' },\n { dish: 'Braised short rib', pairing: 'Paired with Barbaresco' },\n { dish: 'Hazelnut torte', pairing: 'Paired with Moscato d’Asti' },\n ],\n }),\n prose('c', {\n name: 'about the winemaker',\n heading: 'About the winemaker',\n paragraphs: ['The vineyard’s third-generation winemaker leads a short tasting before the first course and answers questions at each table.'],\n }),\n form('d', {\n name: 'reservation form',\n heading: 'Reserve seats',\n intro: 'Seats are limited to [number of seats]. We confirm by email and hold your table until 7:15 p.m.',\n formId: 'frm-reservation',\n }),\n ],\n }),\n brief({\n id: 'multibrand-home-goods-product',\n icp: 'multi-brand',\n pageType: 'product',\n brief: 'A product page for the Hearth cast iron skillet on the Hearth brand site: three features, two reviews from home cooks, and a link to where to buy.',\n inventory: site('host-hearth-and-grain', {\n components: [\n { id: 'cmp-feature', name: 'Feature', props: { title: 'text', body: 'text' } },\n { id: 'cmp-review', name: 'Review', props: { quote: 'text', name: 'text' } },\n ],\n layouts: [\n { id: 'lay-hearth', name: 'Hearth layout', parentId: null },\n { id: 'lay-grain', name: 'Grain layout', parentId: null },\n ],\n screens: [{ id: 'scr-stores', name: 'Where to buy', slug: 'where-to-buy', layoutId: 'lay-hearth', template: false }],\n }),\n title: 'Cast iron skillet',\n slug: '/cast-iron-skillet',\n layout: 'lay-hearth',\n nav: false,\n seo: {\n title: 'Hearth 12-Inch Cast Iron Skillet',\n description: 'A seasoned 12-inch skillet with a milled cooking surface, a thick base that holds heat and a helper handle.',\n },\n sections: [\n hero('a', {\n title: 'The Hearth cast iron skillet',\n lead: 'A 12-inch skillet with a smooth-milled cooking surface, seasoned and ready to use.',\n image: 'A cast iron skillet searing vegetables on a stovetop',\n }),\n cards('b', {\n name: 'features',\n heading: 'Why it cooks evenly',\n componentId: 'cmp-feature',\n items: [\n { title: 'Milled surface', body: 'Food releases without a thick coat of oil.' },\n { title: 'Thick base', body: 'Holds heat when cold food hits the pan.' },\n { title: 'Helper handle', body: 'A second grip for lifting a full pan.' },\n ],\n }),\n cards('c', {\n name: 'reviews',\n heading: 'From home cooks',\n componentId: 'cmp-review',\n items: [\n { quote: 'Eggs slide right off after a week of use.', name: '[reviewer name]' },\n { quote: 'Heavy, but it holds a sear better than anything I own.', name: '[reviewer name]' },\n ],\n }),\n callToAction('d', {\n name: 'where to buy',\n heading: 'Find it near you',\n body: 'Hearth skillets are sold in kitchen stores and online.',\n label: 'Where to buy',\n screenId: 'scr-stores',\n }),\n ],\n }),\n brief({\n id: 'multibrand-fitness-studios-pricing',\n icp: 'multi-brand',\n pageType: 'pricing',\n brief: 'A pricing page for Pulse Cycle memberships across all Pulse Cycle studios: the three memberships, the questions riders ask most, and the free class form.',\n inventory: site('host-pulse-studios-cycle', {\n components: [\n { id: 'cmp-plan-card', name: 'Membership card', props: { name: 'text', price: 'text', summary: 'text' } },\n { id: 'cmp-faq-item', name: 'FAQ item', props: { question: 'text', answer: 'text' } },\n ],\n layouts: [\n { id: 'lay-cycle', name: 'Pulse Cycle layout', parentId: null },\n { id: 'lay-yoga', name: 'Pulse Yoga layout', parentId: null },\n ],\n forms: [{ id: 'frm-trial', name: 'Free class', fields: ['name', 'email', 'studio'] }],\n }),\n title: 'Memberships',\n slug: '/memberships',\n layout: 'lay-cycle',\n nav: true,\n seo: {\n title: 'Pulse Cycle Memberships',\n description: 'Ride at any Pulse Cycle studio with a monthly membership or a class pack. Every membership starts with a free class.',\n },\n sections: [\n hero('a', {\n title: 'Pulse Cycle memberships',\n lead: 'Ride at any Pulse Cycle studio. Every membership starts with a free class.',\n }),\n cards('b', {\n name: 'memberships',\n heading: 'Memberships',\n componentId: 'cmp-plan-card',\n items: [\n { name: 'Four classes', price: '[price] a month', summary: 'Four rides a month, booked up to a week ahead.' },\n { name: 'Unlimited', price: '[price] a month', summary: 'Ride as often as you like, booked two weeks ahead.' },\n { name: 'Class pack', price: '[price] for ten', summary: 'Ten rides to use within three months.' },\n ],\n }),\n cards('c', {\n name: 'questions riders ask',\n heading: 'Questions riders ask',\n componentId: 'cmp-faq-item',\n items: [\n { question: 'Can I pause my membership?', answer: 'Yes, for up to two months a year.' },\n { question: 'Do I need cycling shoes?', answer: 'No. Every studio lends shoes at no charge.' },\n { question: 'Can I ride at another studio?', answer: 'Yes, at every Pulse Cycle location.' },\n ],\n }),\n form('d', {\n name: 'free class form',\n heading: 'Book a free class',\n intro: 'Choose your studio and we send the schedule for the week.',\n formId: 'frm-trial',\n }),\n ],\n }),\n // ── Single small businesses ─────────────────────────────────────────────\n brief({\n id: 'smallbiz-bakery-contact',\n icp: 'small-business',\n pageType: 'contact',\n brief: 'A contact page for our bakery with the opening hours and the contact form for custom cake and wholesale questions.',\n inventory: site('host-corner-bakery', {\n forms: [{ id: 'frm-contact', name: 'Contact', fields: ['name', 'email', 'message'] }],\n }),\n title: 'Contact',\n slug: '/contact',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Visit or Contact the Bakery',\n description: 'Opening hours for the bakery, and a form for custom cake and wholesale questions. We answer within a day.',\n },\n sections: [\n hero('a', { title: 'Visit or call the bakery', lead: 'Fresh bread from 7 a.m., six days a week, at [street address].' }),\n prose('b', {\n name: 'opening hours',\n heading: 'Opening hours',\n paragraphs: [\n 'Open Tuesday to Friday from 7 a.m. to 3 p.m., and Saturday and Sunday from 8 a.m. to 2 p.m. Closed on Mondays.',\n ],\n }),\n form('c', {\n name: 'contact form',\n heading: 'Send us a message',\n intro: 'Ask about custom cakes and wholesale orders. We answer within a day.',\n formId: 'frm-contact',\n }),\n ],\n }),\n brief({\n id: 'smallbiz-yoga-teacher-about',\n icp: 'small-business',\n pageType: 'about',\n brief: 'An about page for my yoga teaching: why I teach, my training, and a link to the class schedule.',\n inventory: site('host-maya-yoga', {\n screens: [{ id: 'scr-classes', name: 'Classes', slug: 'classes', layoutId: 'lay-site', template: false }],\n }),\n title: 'About',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Maya: Slow Flow and Restorative Yoga',\n description: 'Small-group slow flow and restorative yoga classes under twelve students, with room for questions in every class.',\n },\n sections: [\n hero('a', {\n title: 'About Maya',\n lead: 'I teach slow flow and restorative yoga in small groups, with room for questions in every class.',\n image: 'A yoga teacher guiding a small class in a sunlit studio',\n }),\n prose('b', {\n name: 'why I teach',\n heading: 'Why I teach',\n paragraphs: [\n 'I started yoga to recover from a running injury, and kept practicing because it made the rest of my week calmer.',\n 'My classes stay under twelve students, so I can offer a change for each body in the room.',\n ],\n }),\n list('c', {\n name: 'training',\n heading: 'Training',\n items: [\n { primary: '500-hour yoga teacher training', secondary: '[school name]' },\n { primary: 'Restorative yoga certificate', secondary: '[school name]' },\n ],\n }),\n callToAction('d', {\n name: 'class schedule',\n heading: 'Come to a class',\n body: 'New students can try any class at the drop-in rate.',\n label: 'See the schedule',\n screenId: 'scr-classes',\n }),\n ],\n }),\n brief({\n id: 'smallbiz-bike-repair-service',\n icp: 'small-business',\n pageType: 'service',\n brief: 'A service page for bike tune-ups and repairs: the three tune-up levels, how long repairs take, and the drop-off booking form.',\n inventory: site('host-spoke-bike-repair', {\n components: [{ id: 'cmp-service-item', name: 'Service item', props: { name: 'text', detail: 'text' } }],\n forms: [{ id: 'frm-booking', name: 'Repair booking', fields: ['name', 'email', 'bike type', 'drop-off day'] }],\n }),\n title: 'Tune-ups and repairs',\n slug: '/repairs',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Bike Tune-Ups and Repairs',\n description: 'Drop off your bike any weekday morning. Three tune-up levels, most ready the next day, with a call before any extra cost.',\n },\n sections: [\n hero('a', {\n title: 'Bike tune-ups and repairs',\n lead: 'Drop off your bike any weekday morning and pick it up ready to ride, most often the next day.',\n }),\n cards('b', {\n name: 'tune-up levels',\n heading: 'Tune-up levels',\n componentId: 'cmp-service-item',\n items: [\n { name: 'Safety check', detail: 'Brakes, tires and a full bolt check. [price]' },\n { name: 'Standard tune-up', detail: 'Adds gear and brake adjustment and wheel truing. [price]' },\n { name: 'Overhaul', detail: 'Adds a full strip-down, cleaning and new cables. [price]' },\n ],\n }),\n prose('c', {\n name: 'how long repairs take',\n heading: 'How long it takes',\n paragraphs: ['Most tune-ups are ready the next day. We call before any repair that costs more than the estimate.'],\n }),\n form('d', {\n name: 'drop-off booking form',\n heading: 'Book a drop-off',\n intro: 'Tell us about the bike and the day you can bring it in.',\n formId: 'frm-booking',\n }),\n ],\n }),\n]\n\n/**\n * A page brief for a workspace that keeps no reusable components, answered the\n * way such a workspace answers (AGL-3053): every repeated item written once\n * with its copies' values listed. `writtenOut` is the same page with every\n * repeated item written out card by card — the control, which the section\n * check draws the golden answers into, node for node apart from ids.\n */\nexport interface AiFreePageFixture extends AiPageBriefFixture {\n /** The golden answers, in the plan's order, with every repeated item written out in full. */\n writtenOut: AiGoldenSection[]\n}\n\ntype PracticeAreas = { name: string; heading: string; items: Array<{ title: string; summary: string }> }\n\n/** A Free page brief whose card sections are written once, with the page written out in full beside it. */\nfunction freeBrief(input: Omit<Parameters<typeof brief>[0], 'sections'> & { sections: Array<Built | { once: Built; full: Built }> }): AiFreePageFixture {\n const once = input.sections.map((entry) => ('once' in entry ? entry.once : entry))\n const full = input.sections.map((entry) => ('full' in entry ? entry.full : entry))\n return { ...brief({ ...input, sections: once }), writtenOut: full.map((entry) => entry.answer) }\n}\n\n/** A section of cards, written once and written out. */\nfunction repeatedCards(prefix: string, input: PracticeAreas): { once: Built; full: Built } {\n return { once: inlineCardsOnce(prefix, input), full: inlineCards(prefix, input) }\n}\n\n/**\n * A page brief for a Free workspace (AGL-3030): a site that keeps no reusable\n * components and no saved forms, with the one layout its plan includes. Its\n * practice areas repeat and its consultation request is a form, so the page\n * is built the one way such a workspace can build it — the cards drawn where\n * they repeat, written once in the answer (AGL-3053), and the form carried by\n * the page with its fields inside it. The plan the page job keeps for it is\n * held to the Free workspace's capabilities, never the whole doctrine.\n */\nexport const AI_FREE_PAGE_FIXTURE: AiFreePageFixture = freeBrief({\n id: 'free-law-firm-about',\n icp: 'small-business',\n pageType: 'about',\n brief: 'An about page for Brightwater Law: who we are, the four areas we practice, how we work with clients, and a form to request a consultation.',\n inventory: site('host-brightwater-law', {}),\n title: 'About Brightwater Law',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Brightwater Law',\n description: 'A small firm for families and small businesses: estate planning, real estate, business formation and landlord-tenant matters.',\n },\n sections: [\n hero('a', {\n title: 'About Brightwater Law',\n lead: 'We are a small firm that helps families and small businesses in [city] plan ahead and settle disputes before they reach a courtroom.',\n }),\n repeatedCards('b', {\n name: 'practice areas',\n heading: 'What we help with',\n items: [\n { title: 'Estate planning', summary: 'Wills, trusts and powers of attorney, written so your family knows what you wanted.' },\n { title: 'Real estate', summary: 'Purchase agreements, title questions and closings for homes and small commercial property.' },\n { title: 'Business formation', summary: 'Choosing an entity, operating agreements and the contracts a new business signs first.' },\n { title: 'Landlord and tenant', summary: 'Leases, deposits and notices, for owners with a few units and the people who rent from them.' },\n ],\n }),\n prose('c', {\n name: 'how we work',\n heading: 'How we work with you',\n paragraphs: [\n 'Your first call is with the attorney who will handle the matter. We quote a flat fee where the work allows one, and we say so before we start when it does not.',\n ],\n }),\n inlineForm('d', {\n name: 'consultation request form',\n heading: 'Request a consultation',\n intro: 'Tell us a little about what you need. We reply within one business day.',\n formName: 'Consultation request',\n submitLabel: 'Request a consultation',\n fields: [\n { fieldName: 'name', label: 'Your name', fieldType: 'text', required: true },\n { fieldName: 'email', label: 'Email', fieldType: 'email', required: true },\n { fieldName: 'phone', label: 'Phone', fieldType: 'text' },\n { fieldName: 'matter', label: 'What can we help with?', fieldType: 'textarea', required: true },\n ],\n }),\n ],\n})\n\n/**\n * A Free law firm's practice areas with copy of the length a firm writes\n * (AGL-3053): four areas for families and six for businesses and property\n * owners, 25 to 29 words a summary. A live Free About page's four practice\n * areas, drawn card by card, were cut off at their pass's ceiling on their\n * answer and on their re-ask. Written once, four and six such cards each fit a\n * balanced-tier pass; written out card by card, neither does\n * (`ai-job-page-evals.spec.ts`).\n */\nexport const AI_FREE_PRACTICE_AREAS_FIXTURE: AiFreePageFixture = freeBrief({\n id: 'free-law-firm-practice-areas',\n icp: 'small-business',\n pageType: 'about',\n brief: 'An about page for Cedar Point Law: who we are, the four ways we help families, and the six ways we help businesses and property owners, a few sentences on each.',\n inventory: site('host-cedar-point-law', {}),\n title: 'About Cedar Point Law',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Cedar Point Law',\n description: 'A general practice for families, businesses and property owners in [county], from estate planning and probate to leases and closings.',\n },\n sections: [\n hero('a', {\n title: 'About Cedar Point Law',\n lead: 'A general practice in [town] for families, small businesses and property owners, with the same attorney answering your calls from the first meeting to the last filing.',\n }),\n repeatedCards('b', {\n name: 'four ways we help families',\n heading: 'For families',\n items: [\n { title: 'Estate planning', summary: 'Wills, revocable trusts, powers of attorney and health care directives, drafted after a conversation about your family, your property and who should decide for you if you cannot.' },\n { title: 'Divorce and custody', summary: 'Uncontested and contested divorces, parenting plans and support, with a written estimate before anything is filed and a schedule for the children that both households can follow.' },\n { title: 'Probate', summary: 'Opening probate, listing assets, paying debts and distributing property for personal representatives, with a written timeline so heirs know what happens next and about how long it takes.' },\n { title: 'Guardianship and elder law', summary: 'Guardianship and conservatorship petitions, long-term care planning and help for adult children managing a parent’s money, with meetings at home or at a care facility when travel is hard.' },\n ],\n }),\n repeatedCards('c', {\n name: 'six ways we help businesses and property owners',\n heading: 'For businesses and property owners',\n items: [\n { title: 'Business formation', summary: 'Choosing between an LLC and a corporation, operating agreements, partner buyout terms and the first contracts a new business signs with its landlord, lenders and first employees.' },\n { title: 'Contracts', summary: 'Vendor, customer and service agreements drafted or reviewed in plain language, with the payment terms, termination rights and limits on liability explained before you sign anything.' },\n { title: 'Commercial leases', summary: 'First leases and renewals for shops, offices and restaurants, including build-out allowances, personal guarantees, rent increases and what happens when the business outgrows the space.' },\n { title: 'Real estate closings', summary: 'Purchase agreements, title review, boundary questions and closings for homes, rental property and small commercial buildings, with one attorney following the file from contract to keys.' },\n { title: 'Landlord and tenant', summary: 'Leases, security deposits, repair disputes and eviction notices, for owners with a few rental units and for tenants who need to know where they stand before they answer.' },\n { title: 'Employment matters', summary: 'Offer letters, handbooks, contractor questions and separation agreements for businesses with fewer than fifty employees, written to fit the state rules that apply to them.' },\n ],\n }),\n ],\n})\n\n/**\n * A page brief whose plan creates what its site lacks (AGL-3031): a layout, a\n * reusable component and a saved form, on a Starter site that has none of\n * them. The page job builds all three first — each through the step that\n * builds its kind, answering with the golden that step's own spec holds —\n * and then the page, which places the component and binds the form by the\n * ids the job built them under, and renders inside the layout.\n *\n * Every draft is named by the id the job recorded for it before anything was\n * built (AGL-3079): each creation by the id on its plan entry, which the\n * section answers name, and the page by the id on the job's generation step.\n */\nexport interface AiPageCreationFixture extends AiPageBriefFixture {\n /** The job the page is built under. */\n jobId: string\n /** The id the job recorded for its page on its generation step. */\n screenId: string\n /** The layout step's golden answer: a header of screen links, the slot and a footer. */\n layout: AiGoldenSection\n /** The component step's golden, by its file under `jobs/goldens`. */\n componentGolden: string\n /** The form step's golden, by its key in `fixtures/ai-job-form-goldens.json`. */\n formGolden: string\n}\n\nconst CREATION_JOB = 'job-golden-creations'\n\n/** The ids the plan recorded for what it creates, as a kept plan carries them. */\nconst CREATION_IDS = { component: 'tstmnlCard', layout: 'hrbrLayout', form: 'roofQuoteF' }\n\nexport const AI_PAGE_CREATION_FIXTURE: AiPageCreationFixture = (() => {\n const component = CREATION_IDS.component\n const form = CREATION_IDS.form\n const opener = hero('a', {\n title: 'Roof repair in Harbor County',\n lead: 'A local crew that finds the leak, fixes it the same week and sends you photos of the work.',\n cta: { label: 'Meet the crew', screenId: 'scr-about' },\n })\n const quotes = section('b', 'customer words', ['new:Testimonial card'], 3, (add) => {\n // The brief names no customer's role, so each card leaves it to the card's default (AGL-3056).\n const cells = [\n { quote: 'They found the leak two other companies missed.', name: '[customer name]' },\n { quote: 'On time, tidy, and the photos made the invoice easy to trust.', name: '[customer name]' },\n { quote: 'The same crew came back to check the repair after the first storm.', name: '[customer name]' },\n ].map((propValues) => cell(add, 3, add({ componentId: 'reusableInstance', props: { refId: component, propValues } })))\n return framed(add, [add(typography('h2', 'What homeowners say', 'h2')), row(add, cells)], 'lg', 8)\n })\n const request = section('c', 'quote request form', ['new:Roof quote request'], 0, (add) =>\n framed(\n add,\n [\n add(typography('h2', 'Request a quote', 'h2')),\n add(typography('body1', 'Tell us about the roof. We call back within one business day.')),\n add({ componentId: 'form', props: { formId: form } }),\n ],\n 'sm',\n 8,\n ),\n )\n const seo = {\n title: 'Roof Repair in Harbor County',\n description: 'Same-week roof repair from a local crew, with photos of every fix and a callback within one business day.',\n }\n return {\n id: 'agency-roofing-creations',\n icp: 'agency',\n pageType: 'service',\n brief: 'A roof repair page for Harbor Roofing: what we fix, three things customers have said, and a form to request a quote. The site is new and has no layout, cards or forms yet.',\n inventory: site('host-harbor-new', {\n layouts: [],\n screens: [{ id: 'scr-about', name: 'About', slug: 'about', layoutId: null, template: false }],\n }),\n plan: {\n reuse: [{ kind: 'screen', id: 'scr-about', purpose: 'linked from the hero' }],\n create: [\n {\n kind: 'component',\n name: 'Testimonial card',\n why: 'Three quotes share one card, and the site has no card yet.',\n duplicateOf: null,\n fields: ['quote:richText', 'name:text', 'role:text', 'photo:image'],\n id: CREATION_IDS.component,\n },\n {\n kind: 'layout',\n name: 'Harbor Roofing site',\n why: 'The site has no layout, so every page would otherwise carry its own header and footer.',\n duplicateOf: null,\n fields: [],\n id: CREATION_IDS.layout,\n },\n {\n kind: 'form',\n name: 'Roof quote request',\n why: 'The site has no form to request a quote.',\n duplicateOf: null,\n fields: [],\n id: CREATION_IDS.form,\n },\n ],\n screens: [\n {\n title: 'Roof repair',\n slug: '/roof-repair',\n layout: 'new:Harbor Roofing site',\n template: null,\n duplicateOf: null,\n nav: true,\n seoTitle: seo.title,\n seoDescription: seo.description,\n sections: [opener.section, quotes.section, request.section],\n },\n ],\n },\n answers: [opener.answer, quotes.answer, request.answer],\n seo,\n jobId: CREATION_JOB,\n screenId: 'roofRepair',\n layout: {\n rootId: 'root',\n nodes: {\n root: { componentId: 'div', nodes: ['header', 'slot', 'footer'] },\n header: { componentId: 'muiAppBar', props: { position: 'static', color: 'default' }, nodes: ['bar'] },\n bar: { componentId: 'muiToolbar', nodes: ['brand', 'home', 'about'] },\n brand: { componentId: 'muiTypography', props: { variant: 'h6', component: 'p', children: 'Harbor Roofing' } },\n home: { componentId: 'muiScreenLink', props: { screenId: 'scr-home', children: 'Home' } },\n about: { componentId: 'muiScreenLink', props: { screenId: 'scr-about', children: 'About' } },\n slot: { componentId: 'layoutSlot' },\n footer: { componentId: 'section', props: { element: 'footer' }, nodes: ['tagline'] },\n tagline: { componentId: 'muiTypography', props: { variant: 'body2', children: 'Family-run roofers in Harbor County since 1998.' } },\n },\n },\n componentGolden: 'component-testimonial-card',\n formGolden: 'roofingQuote',\n }\n})()\n\n/**\n * A page whose second section introduces two people (AGL-3042): a photo, a\n * name, a role and a short bio for each, as a law firm's About page asks for\n * its attorneys, on a paid workspace whose site keeps no card for a person.\n * Two items are fewer than a component is required for, so the section draws\n * both where they stand.\n *\n * The golden answer is the drawing a section's request asks for at the\n * balanced tier's ceiling: a Card a person holding the four, in fifteen\n * elements. `roomier` is the same two people drawn the way a model reaches for\n * with more elements to spend — a grid cell, a card body and styles a person,\n * and an introduction — in twenty, inside the twenty-three a budget counted in\n * estimated tokens allows. The page's evals measure both against the ceiling.\n */\nexport interface AiTwoPersonPageFixture extends AiPageBriefFixture {\n /** The introduction drawn in twenty elements: a valid section, and past the ceiling in real tokens. */\n roomier: AiGoldenSection\n}\n\nconst ATTORNEYS = [\n {\n photo: 'A portrait of [attorney name], the founding partner, in the firm’s office',\n name: '[attorney name]',\n role: 'Founding partner, family law',\n bio: 'Has represented parents and spouses in [county] for [years] years, and settles most cases before they reach a courtroom.',\n },\n {\n photo: 'A portrait of [attorney name] at a conference table',\n name: '[attorney name]',\n role: 'Partner, estate planning and real estate',\n bio: 'Writes wills and trusts for young families, and handles closings for homes and small commercial property.',\n },\n]\n\nexport const AI_TWO_PERSON_PAGE_FIXTURE: AiTwoPersonPageFixture = (() => {\n const introduction = section('b', 'meet our attorneys', [], ATTORNEYS.length, (add) => {\n const cards = ATTORNEYS.map((person) =>\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { flex: 1 },\n nodes: [\n add({ componentId: 'image', props: { alt: person.photo } }),\n add(typography('h3', person.name, 'h3')),\n add(typography('subtitle1', person.role)),\n add(typography('body2', person.bio)),\n ],\n }),\n )\n // A Grid of two would take two more elements than the fifteen the pass\n // asks for (AGL-3055); a Stack that turns from a column into a row at md\n // is the same responsive pair in none.\n return framed(\n add,\n [\n add(typography('h2', 'Meet our attorneys', 'h2')),\n add({ componentId: 'muiStack', sx: { flexDirection: { xs: 'column', md: 'row' }, gap: 3 }, nodes: cards }),\n ],\n 'lg',\n 8,\n )\n })\n const roomier = section('b', 'meet our attorneys', [], ATTORNEYS.length, (add) => {\n const cells = ATTORNEYS.map((person) =>\n add({\n componentId: 'muiGrid',\n props: { size: span(ATTORNEYS.length) },\n nodes: [\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { height: '100%' },\n nodes: [\n add({ componentId: 'image', props: { alt: person.photo, objectFit: 'cover', loading: 'lazy' }, sx: { width: '100%' } }),\n add({\n componentId: 'muiCardContent',\n nodes: [\n add(typography('h3', person.name, 'h3')),\n add({ componentId: 'muiTypography', props: { variant: 'subtitle1', children: person.role }, sx: { color: 'text.secondary' } }),\n add(typography('body2', person.bio)),\n ],\n }),\n ],\n }),\n ],\n }),\n )\n return framed(\n add,\n [\n add(typography('h2', 'Meet our attorneys', 'h2')),\n add(typography('body1', 'Two attorneys, and one of them handles your matter from the first meeting to the final order.')),\n row(add, cells),\n ],\n 'lg',\n 8,\n )\n })\n const fixture = brief({\n id: 'agency-law-firm-two-attorneys',\n icp: 'agency',\n pageType: 'about',\n brief: 'An about page for Harborline Law: who we are, and our two attorneys with a photo, their role and a short bio for each.',\n inventory: site('host-harborline-law', {\n screens: [{ id: 'scr-contact', name: 'Contact', slug: 'contact', layoutId: 'lay-site', template: false }],\n }),\n title: 'About Harborline Law',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Harborline Law',\n description: 'A coastal law firm for families and homeowners: family law, estate planning and real estate closings.',\n },\n sections: [\n hero('a', {\n title: 'About Harborline Law',\n lead: 'A small coastal firm for families and homeowners, in family law, estate planning and real estate closings.',\n cta: { label: 'Request a consultation', screenId: 'scr-contact' },\n }),\n introduction,\n ],\n })\n return { ...fixture, roomier: roomier.answer }\n})()\n"],"names":["emptyAiSiteInventory","section","prefix","name","uses","items","build","nodes","counter","add","node","id","key","root","componentId","answer","rootId","typography","variant","children","component","props","framed","maxWidth","py","stack","column","direction","sx","gap","container","element","hero","input","cta","screenId","title","lead","push","label","image","alt","alignItems","span","cell","child","repeat","size","row","cells","spacing","cards","length","map","propValues","refId","heading","intro","list","rows","item","primary","secondary","dense","prose","paragraphs","copy","form","formId","inlineCards","summary","inlineCardsOnce","entry","inlineForm","formName","submitLabel","fields","field","callToAction","body","THEME","colors","fonts","SITE_LAYOUT","parentId","HOME","slug","layoutId","template","site","hostId","parts","components","forms","layouts","screens","theme","brief","Set","inventory","reuse","kind","layout","purpose","seen","planned","sections","ref","has","icp","pageType","plan","create","duplicateOf","nav","seoTitle","seo","seoDescription","description","answers","AI_PAGE_BRIEF_FIXTURES","quote","role","credentials","bio","step","detail","practice","price","dish","pairing","question","freeBrief","once","full","writtenOut","repeatedCards","AI_FREE_PAGE_FIXTURE","fieldName","fieldType","required","AI_FREE_PRACTICE_AREAS_FIXTURE","CREATION_JOB","CREATION_IDS","AI_PAGE_CREATION_FIXTURE","opener","quotes","request","why","jobId","header","position","color","bar","brand","home","about","slot","footer","tagline","componentGolden","formGolden","ATTORNEYS","photo","AI_TWO_PERSON_PAGE_FIXTURE","introduction","person","flex","flexDirection","xs","md","roomier","height","objectFit","loading","width","fixture"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/ai/src/lib/jobs/fixtures/ai-page-briefs.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { AiBuildPlan, AiBuildPlanReuse, AiBuildPlanSection } from '../../model/ai-build-plan'\nimport type { AiPageType } from '../../model/ai-page-job'\nimport {\n emptyAiSiteInventory,\n type AiInventoryComponent,\n type AiInventoryForm,\n type AiInventoryLayout,\n type AiInventoryScreen,\n type AiSiteInventory,\n} from '../../model/ai-site-inventory'\n\n/**\n * Ten page briefs across the ICPs, with golden answers (AGL-2907): four agency\n * client sites, three multi-brand businesses and three single small\n * businesses, over seven page types.\n *\n * GOLDEN, NOT RECORDED. Each answer is written by hand in the shape a model\n * answers a section in — the tree a `submit_section` call carries — and no\n * provider produced it. The evals replay them through the real page step,\n * plan rules, doctrine and draft writer, so they prove the step and the\n * rules, never a model's quality, and the credits they add up to are an\n * estimate from their size, labeled as one wherever it is quoted.\n *\n * Every plan is one a page job can build: one screen that places what its\n * site already has — components by id, forms by id, links to its screens —\n * and creates nothing. Rows that repeat are a component the site keeps, as\n * the plan rules require. Copy leaves every fact a brief would not give in\n * square brackets, as the building rules ask a model to.\n */\n\n/** One node as a model writes it: its own id is the key it sits under. */\nexport interface AiGoldenNode {\n componentId: string\n props?: Record<string, unknown>\n sx?: Record<string, unknown>\n nodes?: string[]\n /**\n * A repeated item written once (AGL-3053): each copy's values, in the order\n * of the `{{1}}`, `{{2}}` placeholders its subtree carries.\n */\n repeat?: string[][]\n}\n\n/** A section as the model answers it: the document wrapper holding one Section. */\nexport interface AiGoldenSection {\n rootId: string\n nodes: Record<string, AiGoldenNode>\n}\n\nexport interface AiPageBriefFixture {\n id: string\n icp: 'agency' | 'multi-brand' | 'small-business'\n pageType: AiPageType\n brief: string\n inventory: AiSiteInventory\n /** The plan a member confirmed: one screen, reusing what the site has, creating nothing. */\n plan: AiBuildPlan\n /** The golden answer to each section pass, in the plan's order. */\n answers: AiGoldenSection[]\n /** The listing the golden SEO answer proposes. */\n seo: { title: string; description: string }\n}\n\ninterface Built {\n answer: AiGoldenSection\n section: AiBuildPlanSection\n}\n\ntype Add = (node: AiGoldenNode, id?: string) => string\n\nfunction section(prefix: string, name: string, uses: string[], items: number, build: (add: Add) => AiGoldenNode): Built {\n const nodes: Record<string, AiGoldenNode> = {}\n let counter = 0\n const add: Add = (node, id) => {\n const key = id ?? `${prefix}${++counter}`\n nodes[key] = node\n return key\n }\n const root = add(build(add), `${prefix}section`)\n nodes['root'] = { componentId: 'div', nodes: [root] }\n return { answer: { rootId: 'root', nodes }, section: { name, uses, items } }\n}\n\nconst typography = (variant: string, children: string, component?: string): AiGoldenNode => ({\n componentId: 'muiTypography',\n props: { variant, children, ...(component ? { component } : {}) },\n})\n\n/** A Section holding a Container holding a column Stack: the frame every golden section uses. */\nfunction framed(add: Add, children: string[], maxWidth: string, py: number, stack: Record<string, unknown> = {}): AiGoldenNode {\n const column = add({ componentId: 'muiStack', props: { direction: 'column', ...stack }, sx: { gap: 2 }, nodes: children })\n const container = add({ componentId: 'muiContainer', props: { maxWidth }, sx: { py }, nodes: [column] })\n return { componentId: 'section', props: { element: 'section' }, nodes: [container] }\n}\n\nfunction hero(prefix: string, input: { name?: string; title: string; lead: string; cta?: { label: string; screenId: string }; image?: string }): Built {\n return section(prefix, input.name ?? 'hero', input.cta ? [input.cta.screenId] : [], 0, (add) => {\n const children = [add(typography('h1', input.title, 'h1')), add(typography('body1', input.lead))]\n if (input.cta) {\n children.push(add({ componentId: 'muiButton', props: { children: input.cta.label, variant: 'contained', screenId: input.cta.screenId } }))\n }\n if (input.image) children.push(add({ componentId: 'image', props: { alt: input.image } }))\n return framed(add, children, 'md', 8, { alignItems: 'flex-start' })\n })\n}\n\n/**\n * The size each item of a golden row takes (AGL-3055): full width on a phone,\n * two across from sm where four or more share the row, and two, three or four\n * across from md, as the stored string the Grid renderer reads.\n */\nfunction span(items: number): string {\n if (items <= 2) return 'xs:12 md:6'\n if (items === 3) return 'xs:12 md:4'\n return items === 4 ? 'xs:12 sm:6 md:3' : 'xs:12 sm:6 md:4'\n}\n\n/** A Grid item of a row of `items`, holding one element. */\nfunction cell(add: Add, items: number, child: string, repeat?: string[][]): string {\n return add({ componentId: 'muiGrid', props: { size: span(items) }, nodes: [child], ...(repeat ? { repeat } : {}) })\n}\n\n/** A row of Grid items: a Grid container spaced by its own spacing (AGL-3055). */\nfunction row(add: Add, cells: string[]): string {\n return add({ componentId: 'muiGrid', props: { container: true, spacing: 3 }, nodes: cells })\n}\n\nfunction cards(prefix: string, input: { name: string; heading: string; intro?: string; componentId: string; items: Array<Record<string, string>> }): Built {\n return section(prefix, input.name, [input.componentId], input.items.length, (add) => {\n const cells = input.items.map((propValues) =>\n cell(add, input.items.length, add({ componentId: 'reusableInstance', props: { refId: input.componentId, propValues } })),\n )\n const children = [add(typography('h2', input.heading, 'h2'))]\n if (input.intro) children.push(add(typography('body1', input.intro)))\n children.push(row(add, cells))\n return framed(add, children, 'lg', 8)\n })\n}\n\n/**\n * The same cards written once (AGL-3024): ONE Grid item holding ONE instance,\n * `{{n}}` through the values that instance fills, and its copies' values\n * listed — the shape a workspace that KEEPS reusable components answers a\n * repeating section in, beside `cards`, which writes every copy out.\n *\n * The two draw to the same page. What differs is what the answer spends: a\n * cell and an instance are written once rather than once a card, which is the\n * difference between a six-card section that fits a pass's ceiling and one cut\n * off twice — the live failure of 2026-09-21, where a job ended with no page.\n */\nfunction cardsOnce(prefix: string, input: { name: string; heading: string; intro?: string; componentId: string; items: Array<Record<string, string>> }): Built {\n return section(prefix, input.name, [input.componentId], input.items.length, (add) => {\n const keys = Object.keys(input.items[0] ?? {})\n const propValues = Object.fromEntries(keys.map((key, at) => [key, `{{${at + 1}}}`]))\n const copies = input.items.map((item) => keys.map((key) => item[key]))\n const instance = add({ componentId: 'reusableInstance', props: { refId: input.componentId, propValues } })\n const children = [add(typography('h2', input.heading, 'h2'))]\n if (input.intro) children.push(add(typography('body1', input.intro)))\n children.push(row(add, [cell(add, input.items.length, instance, copies)]))\n return framed(add, children, 'lg', 8)\n })\n}\n\n/**\n * One section of cards on a workspace that keeps reusable components, written\n * once and written out, for the check to draw one into the other (AGL-3024).\n */\nexport const AI_INSTANCE_CARDS_FIXTURE = (() => {\n const input = {\n name: 'what the inspection covers',\n heading: 'What the inspection covers',\n componentId: 'cmp-service-card',\n items: [\n { title: 'Shingles and flashing', summary: 'Lifted, cracked or missing shingles, and the seals around chimneys and vents.' },\n { title: 'Gutters and drainage', summary: 'Clogs, sagging runs and downspouts that send water toward the foundation.' },\n { title: 'Attic and ventilation', summary: 'Signs of leaks, damp insulation and blocked soffit vents.' },\n { title: 'Chimneys and skylights', summary: 'Cracked crowns, worn flashing and the seals around every roof opening.' },\n { title: 'Valleys and eaves', summary: 'Where two roof planes meet, and the ice-damming the eaves take each winter.' },\n { title: 'Soffits and fascia', summary: 'Rot, pest damage and the vents that keep an attic breathing.' },\n ],\n }\n return { once: cardsOnce('r', input), full: cards('r', input), items: input.items }\n})()\n\n/** A short list: fewer rows than the plan rules count as repeated items. */\nfunction list(prefix: string, input: { name: string; heading: string; items: Array<{ primary: string; secondary?: string }> }): Built {\n return section(prefix, input.name, [], input.items.length, (add) => {\n const rows = input.items.map((item) =>\n add({\n componentId: 'muiListItem',\n nodes: [add({ componentId: 'muiListItemText', props: { primary: item.primary, ...(item.secondary ? { secondary: item.secondary } : {}) } })],\n }),\n )\n return framed(add, [add(typography('h2', input.heading, 'h2')), add({ componentId: 'muiList', props: { dense: false }, nodes: rows })], 'md', 6)\n })\n}\n\nfunction prose(prefix: string, input: { name: string; heading: string; paragraphs: string[] }): Built {\n return section(prefix, input.name, [], 0, (add) =>\n framed(add, [add(typography('h2', input.heading, 'h2')), ...input.paragraphs.map((copy) => add(typography('body1', copy)))], 'md', 6),\n )\n}\n\nfunction form(prefix: string, input: { name: string; heading: string; intro: string; formId: string }): Built {\n return section(prefix, input.name, [input.formId], 0, (add) =>\n framed(\n add,\n [add(typography('h2', input.heading, 'h2')), add(typography('body1', input.intro)), add({ componentId: 'form', props: { formId: input.formId } })],\n 'sm',\n 8,\n ),\n )\n}\n\n/**\n * Items drawn where they repeat, each a Card: what a workspace that keeps no\n * reusable components builds instead of placing a component (AGL-3030).\n */\nfunction inlineCards(prefix: string, input: { name: string; heading: string; items: Array<{ title: string; summary: string }> }): Built {\n return section(prefix, input.name, [], input.items.length, (add) => {\n const cells = input.items.map((item) =>\n cell(\n add,\n input.items.length,\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n nodes: [add({ componentId: 'muiCardContent', nodes: [add(typography('h3', item.title, 'h3')), add(typography('body2', item.summary))] })],\n }),\n ),\n )\n return framed(add, [add(typography('h2', input.heading, 'h2')), row(add, cells)], 'lg', 8)\n })\n}\n\n/**\n * The same cards written once (AGL-3053): one Grid item holding a Card whose\n * title is `{{1}}` and whose summary is `{{2}}`, with every card's pair listed\n * on the item, which the section check draws into exactly the cells\n * `inlineCards` writes out.\n */\nfunction inlineCardsOnce(prefix: string, input: { name: string; heading: string; items: Array<{ title: string; summary: string }> }): Built {\n return section(prefix, input.name, [], input.items.length, (add) => {\n const item = cell(\n add,\n input.items.length,\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n nodes: [add({ componentId: 'muiCardContent', nodes: [add(typography('h3', '{{1}}', 'h3')), add(typography('body2', '{{2}}'))] })],\n }),\n input.items.map((entry) => [entry.title, entry.summary]),\n )\n return framed(add, [add(typography('h2', input.heading, 'h2')), row(add, [item])], 'lg', 8)\n })\n}\n\n/**\n * A form the page carries itself: a Form with no formId, holding its Form\n * Fields — what a workspace that keeps no saved forms builds instead of\n * placing one (AGL-3030). The site's submit route collects it by its name.\n */\nfunction inlineForm(\n prefix: string,\n input: {\n name: string\n heading: string\n intro: string\n formName: string\n submitLabel: string\n fields: Array<{ fieldName: string; label: string; fieldType: string; required?: boolean }>\n },\n): Built {\n return section(prefix, input.name, [], 0, (add) =>\n framed(\n add,\n [\n add(typography('h2', input.heading, 'h2')),\n add(typography('body1', input.intro)),\n add({\n componentId: 'form',\n props: { formName: input.formName, submitLabel: input.submitLabel },\n nodes: input.fields.map((field) => add({ componentId: 'formField', props: { ...field } })),\n }),\n ],\n 'sm',\n 8,\n ),\n )\n}\n\nfunction callToAction(prefix: string, input: { name: string; heading: string; body: string; label: string; screenId: string }): Built {\n return section(prefix, input.name, [input.screenId], 0, (add) =>\n framed(\n add,\n [\n add(typography('h2', input.heading, 'h2')),\n add(typography('body1', input.body)),\n add({ componentId: 'muiButton', props: { children: input.label, variant: 'contained', screenId: input.screenId } }),\n ],\n 'md',\n 8,\n { alignItems: 'center' },\n ),\n )\n}\n\nconst THEME = { summary: ['Light scheme with the theme’s default type'], colors: { 'primary.main': '#1f5fa8', 'secondary.main': '#c2410c' }, fonts: ['Inter'] }\nconst SITE_LAYOUT: AiInventoryLayout = { id: 'lay-site', name: 'Site layout', parentId: null }\nconst HOME: AiInventoryScreen = { id: 'scr-home', name: 'Home', slug: '/', layoutId: 'lay-site', template: false }\n\nfunction site(\n hostId: string,\n parts: {\n components?: AiInventoryComponent[]\n forms?: AiInventoryForm[]\n layouts?: AiInventoryLayout[]\n screens?: AiInventoryScreen[]\n },\n): AiSiteInventory {\n return {\n ...emptyAiSiteInventory(hostId),\n components: parts.components ?? [],\n forms: parts.forms ?? [],\n layouts: parts.layouts ?? [SITE_LAYOUT],\n screens: [HOME, ...(parts.screens ?? [])],\n theme: THEME,\n }\n}\n\nfunction brief(input: {\n id: string\n icp: AiPageBriefFixture['icp']\n pageType: AiPageType\n brief: string\n inventory: AiSiteInventory\n title: string\n slug: string\n layout: string\n nav: boolean\n seo: { title: string; description: string }\n sections: Built[]\n}): AiPageBriefFixture {\n const components = new Set(input.inventory.components.map((row) => row.id))\n const forms = new Set(input.inventory.forms.map((row) => row.id))\n const screens = new Set(input.inventory.screens.map((row) => row.id))\n const reuse: AiBuildPlanReuse[] = [{ kind: 'layout', id: input.layout, purpose: 'the page renders inside it' }]\n const seen = new Set<string>([input.layout])\n for (const { section: planned } of input.sections) {\n for (const ref of planned.uses) {\n if (seen.has(ref)) continue\n seen.add(ref)\n if (components.has(ref)) reuse.push({ kind: 'component', id: ref, purpose: planned.name })\n else if (forms.has(ref)) reuse.push({ kind: 'form', id: ref, purpose: planned.name })\n else if (screens.has(ref)) reuse.push({ kind: 'screen', id: ref, purpose: `linked from ${planned.name}` })\n }\n }\n return {\n id: input.id,\n icp: input.icp,\n pageType: input.pageType,\n brief: input.brief,\n inventory: input.inventory,\n plan: {\n reuse,\n create: [],\n screens: [\n {\n title: input.title,\n slug: input.slug,\n layout: input.layout,\n template: null,\n duplicateOf: null,\n nav: input.nav,\n seoTitle: input.seo.title,\n seoDescription: input.seo.description,\n sections: input.sections.map((entry) => entry.section),\n },\n ],\n },\n answers: input.sections.map((entry) => entry.answer),\n seo: input.seo,\n }\n}\n\nexport const AI_PAGE_BRIEF_FIXTURES: readonly AiPageBriefFixture[] = [\n // ── Agency client sites ─────────────────────────────────────────────────\n brief({\n id: 'agency-roofing-landing',\n icp: 'agency',\n pageType: 'landing',\n brief: 'A landing page for our spring roof inspection offer in Springfield: what the inspection covers, two customer quotes, and the quote request form.',\n inventory: site('host-acme-roofing', {\n components: [\n { id: 'cmp-service-card', name: 'Service card', props: { title: 'text', summary: 'text' } },\n { id: 'cmp-testimonial', name: 'Testimonial', props: { quote: 'text', name: 'text', role: 'text' } },\n ],\n forms: [{ id: 'frm-quote', name: 'Quote request', fields: ['name', 'email', 'phone', 'message'] }],\n screens: [{ id: 'scr-contact', name: 'Contact', slug: 'contact', layoutId: 'lay-site', template: false }],\n }),\n title: 'Spring roof inspections',\n slug: '/spring-roof-inspection',\n layout: 'lay-site',\n nav: false,\n seo: {\n title: 'Spring Roof Inspections in Springfield',\n description: 'A licensed roofer checks shingles, flashing and gutters, then sends photos and a written report within two days.',\n },\n sections: [\n hero('a', {\n title: 'Spring roof inspections in Springfield',\n lead: 'A licensed roofer checks shingles, flashing and gutters, and sends you photos and a written report within two days.',\n cta: { label: 'Request a quote', screenId: 'scr-contact' },\n image: 'A roofer inspecting shingles on a two-story house',\n }),\n cards('b', {\n name: 'what the inspection covers',\n heading: 'What the inspection covers',\n componentId: 'cmp-service-card',\n items: [\n { title: 'Shingles and flashing', summary: 'Lifted, cracked or missing shingles, and the seals around chimneys and vents.' },\n { title: 'Gutters and drainage', summary: 'Clogs, sagging runs and downspouts that send water toward the foundation.' },\n { title: 'Attic and ventilation', summary: 'Signs of leaks, damp insulation and blocked soffit vents.' },\n ],\n }),\n cards('c', {\n name: 'customer quotes',\n heading: 'What homeowners say',\n componentId: 'cmp-testimonial',\n items: [\n { quote: 'They found a failed vent boot before it leaked into the bedroom.', name: '[customer name]', role: 'Homeowner, Springfield' },\n { quote: 'The report had photos of every problem and a price for each fix.', name: '[customer name]', role: 'Homeowner, Riverton' },\n ],\n }),\n form('d', {\n name: 'quote request form',\n heading: 'Book your inspection',\n intro: 'Tell us about your roof and when you are home. We confirm a time within one business day.',\n formId: 'frm-quote',\n }),\n ],\n }),\n brief({\n id: 'agency-dental-implants-service',\n icp: 'agency',\n pageType: 'service',\n brief: 'A service page for dental implants: how treatment works step by step, our two implant dentists, and the appointment request form.',\n inventory: site('host-lakeside-dental', {\n components: [\n { id: 'cmp-dentist-card', name: 'Dentist card', props: { name: 'text', credentials: 'text', bio: 'text' } },\n { id: 'cmp-treatment-step', name: 'Treatment step', props: { step: 'text', detail: 'text' } },\n ],\n forms: [{ id: 'frm-appointment', name: 'Appointment request', fields: ['name', 'email', 'phone', 'preferred time'] }],\n }),\n title: 'Dental implants',\n slug: '/dental-implants',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Dental Implants at Lakeside Dental',\n description: 'Permanent tooth replacement placed and restored in one office, from the first 3D scan to the final crown.',\n },\n sections: [\n hero('a', {\n title: 'Dental implants at Lakeside Dental',\n lead: 'A permanent tooth replacement placed and restored in one office, from the first scan to the final crown.',\n image: 'A dentist showing a patient an implant model',\n }),\n cards('b', {\n name: 'how treatment works',\n heading: 'How treatment works',\n componentId: 'cmp-treatment-step',\n items: [\n { step: 'Consultation and 3D scan', detail: 'We check bone density and plan the implant position.' },\n { step: 'Implant placement', detail: 'A short procedure under local anesthetic.' },\n { step: 'Healing', detail: 'Usually three to six months while the implant bonds with the bone.' },\n { step: 'Crown fitting', detail: 'A custom crown matched to your natural teeth.' },\n ],\n }),\n cards('c', {\n name: 'implant dentists',\n heading: 'Your implant team',\n componentId: 'cmp-dentist-card',\n items: [\n { name: '[dentist name]', credentials: 'DDS, implant fellowship', bio: 'Places and restores implants in the same office.' },\n { name: '[dentist name]', credentials: 'DMD, prosthodontist', bio: 'Designs crowns, bridges and full-arch restorations.' },\n ],\n }),\n form('d', {\n name: 'appointment request form',\n heading: 'Ask for a consultation',\n intro: 'Send a few details and we call you to find a time. Bring any X-rays you already have.',\n formId: 'frm-appointment',\n }),\n ],\n }),\n brief({\n id: 'agency-law-firm-about',\n icp: 'agency',\n pageType: 'about',\n brief: 'An about page for a family law firm: how the firm works with clients, the three attorneys and what each practices, and a link to book a consultation.',\n inventory: site('host-hart-law', {\n components: [{ id: 'cmp-attorney-card', name: 'Attorney card', props: { name: 'text', practice: 'text' } }],\n screens: [{ id: 'scr-contact', name: 'Contact', slug: 'contact', layoutId: 'lay-site', template: false }],\n }),\n title: 'About the firm',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Hart & Owens Family Law',\n description: 'A family law practice in Marion County. One attorney from first meeting to final order, and a written estimate before filing.',\n },\n sections: [\n hero('a', {\n title: 'About Hart & Owens',\n lead: 'A family law practice that has represented parents and spouses in Marion County since [founding year].',\n }),\n prose('b', {\n name: 'how we work',\n heading: 'How we work',\n paragraphs: [\n 'Every client works with one attorney from the first meeting to the final order, and gets a written estimate before any filing.',\n 'We settle when settlement protects you, and we go to trial when it does not.',\n ],\n }),\n cards('c', {\n name: 'attorneys',\n heading: 'Our attorneys',\n componentId: 'cmp-attorney-card',\n items: [\n { name: '[attorney name]', practice: 'Divorce and property division' },\n { name: '[attorney name]', practice: 'Custody and parenting plans' },\n { name: '[attorney name]', practice: 'Adoption and guardianship' },\n ],\n }),\n callToAction('d', {\n name: 'book a consultation',\n heading: 'Talk to an attorney',\n body: 'The first consultation covers your situation, your options and what each would cost.',\n label: 'Schedule a consultation',\n screenId: 'scr-contact',\n }),\n ],\n }),\n brief({\n id: 'agency-hvac-pricing',\n icp: 'agency',\n pageType: 'pricing',\n brief: 'A pricing page for heating and cooling maintenance plans: the three plans, what every visit includes, and a button to schedule service.',\n inventory: site('host-northside-hvac', {\n components: [\n { id: 'cmp-plan-card', name: 'Plan card', props: { name: 'text', price: 'text', summary: 'text' } },\n { id: 'cmp-checklist-item', name: 'Checklist item', props: { item: 'text' } },\n ],\n screens: [{ id: 'scr-schedule', name: 'Schedule service', slug: 'schedule', layoutId: 'lay-site', template: false }],\n }),\n title: 'Maintenance plans',\n slug: '/maintenance-plans',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Heating and Cooling Maintenance Plans',\n description: 'Two tune-ups a year, priority scheduling and a repair discount for one yearly price. Plans for one system or the whole home.',\n },\n sections: [\n hero('a', {\n title: 'Heating and cooling maintenance plans',\n lead: 'Two tune-ups a year, priority scheduling and a discount on repairs, for one flat yearly price.',\n }),\n cards('b', {\n name: 'plans',\n heading: 'Choose a plan',\n componentId: 'cmp-plan-card',\n items: [\n { name: 'Single system', price: '[price] a year', summary: 'One furnace or one air conditioner.' },\n { name: 'Whole home', price: '[price] a year', summary: 'A furnace and an air conditioner.' },\n { name: 'Multi-zone', price: '[price] a year', summary: 'Up to three systems at one address.' },\n ],\n }),\n cards('c', {\n name: 'what every visit includes',\n heading: 'Every visit includes',\n componentId: 'cmp-checklist-item',\n items: [\n { item: 'Filter change and coil cleaning' },\n { item: 'Refrigerant and pressure checks' },\n { item: 'A written report on the system’s condition' },\n ],\n }),\n callToAction('d', {\n name: 'schedule service',\n heading: 'Start with a tune-up',\n body: 'Pick a time and we sign you up at the visit.',\n label: 'Schedule service',\n screenId: 'scr-schedule',\n }),\n ],\n }),\n // ── Multi-brand businesses ──────────────────────────────────────────────\n brief({\n id: 'multibrand-restaurant-group-event',\n icp: 'multi-brand',\n pageType: 'event',\n brief: 'An event page for the Piedmont wine dinner at Osteria Lume, one of our group’s restaurants: the courses and pairings, a note about the winemaker, and the reservation form.',\n inventory: site('host-harbor-group-osteria', {\n components: [{ id: 'cmp-menu-item', name: 'Menu item', props: { dish: 'text', pairing: 'text' } }],\n layouts: [\n { id: 'lay-osteria', name: 'Osteria layout', parentId: null },\n { id: 'lay-grill', name: 'Harbor Grill layout', parentId: null },\n ],\n forms: [{ id: 'frm-reservation', name: 'Event reservation', fields: ['name', 'email', 'party size'] }],\n screens: [{ id: 'scr-menu', name: 'Menu', slug: 'menu', layoutId: 'lay-osteria', template: false }],\n }),\n title: 'Piedmont wine dinner',\n slug: '/events/piedmont-wine-dinner',\n layout: 'lay-osteria',\n nav: false,\n seo: {\n title: 'Piedmont Wine Dinner at Osteria Lume',\n description: 'Five courses paired with wines from one family vineyard, with a tasting led by the winemaker. Reserve seats online.',\n },\n sections: [\n hero('a', {\n title: 'Piedmont wine dinner at Osteria Lume',\n lead: 'Five courses paired with wines from one family vineyard, on [event date] at 7 p.m.',\n image: 'A long table set for dinner with wine glasses',\n }),\n cards('b', {\n name: 'courses and pairings',\n heading: 'The menu',\n componentId: 'cmp-menu-item',\n items: [\n { dish: 'Vitello tonnato', pairing: 'Paired with Arneis' },\n { dish: 'Agnolotti del plin', pairing: 'Paired with Dolcetto' },\n { dish: 'Braised short rib', pairing: 'Paired with Barbaresco' },\n { dish: 'Hazelnut torte', pairing: 'Paired with Moscato d’Asti' },\n ],\n }),\n prose('c', {\n name: 'about the winemaker',\n heading: 'About the winemaker',\n paragraphs: ['The vineyard’s third-generation winemaker leads a short tasting before the first course and answers questions at each table.'],\n }),\n form('d', {\n name: 'reservation form',\n heading: 'Reserve seats',\n intro: 'Seats are limited to [number of seats]. We confirm by email and hold your table until 7:15 p.m.',\n formId: 'frm-reservation',\n }),\n ],\n }),\n brief({\n id: 'multibrand-home-goods-product',\n icp: 'multi-brand',\n pageType: 'product',\n brief: 'A product page for the Hearth cast iron skillet on the Hearth brand site: three features, two reviews from home cooks, and a link to where to buy.',\n inventory: site('host-hearth-and-grain', {\n components: [\n { id: 'cmp-feature', name: 'Feature', props: { title: 'text', body: 'text' } },\n { id: 'cmp-review', name: 'Review', props: { quote: 'text', name: 'text' } },\n ],\n layouts: [\n { id: 'lay-hearth', name: 'Hearth layout', parentId: null },\n { id: 'lay-grain', name: 'Grain layout', parentId: null },\n ],\n screens: [{ id: 'scr-stores', name: 'Where to buy', slug: 'where-to-buy', layoutId: 'lay-hearth', template: false }],\n }),\n title: 'Cast iron skillet',\n slug: '/cast-iron-skillet',\n layout: 'lay-hearth',\n nav: false,\n seo: {\n title: 'Hearth 12-Inch Cast Iron Skillet',\n description: 'A seasoned 12-inch skillet with a milled cooking surface, a thick base that holds heat and a helper handle.',\n },\n sections: [\n hero('a', {\n title: 'The Hearth cast iron skillet',\n lead: 'A 12-inch skillet with a smooth-milled cooking surface, seasoned and ready to use.',\n image: 'A cast iron skillet searing vegetables on a stovetop',\n }),\n cards('b', {\n name: 'features',\n heading: 'Why it cooks evenly',\n componentId: 'cmp-feature',\n items: [\n { title: 'Milled surface', body: 'Food releases without a thick coat of oil.' },\n { title: 'Thick base', body: 'Holds heat when cold food hits the pan.' },\n { title: 'Helper handle', body: 'A second grip for lifting a full pan.' },\n ],\n }),\n cards('c', {\n name: 'reviews',\n heading: 'From home cooks',\n componentId: 'cmp-review',\n items: [\n { quote: 'Eggs slide right off after a week of use.', name: '[reviewer name]' },\n { quote: 'Heavy, but it holds a sear better than anything I own.', name: '[reviewer name]' },\n ],\n }),\n callToAction('d', {\n name: 'where to buy',\n heading: 'Find it near you',\n body: 'Hearth skillets are sold in kitchen stores and online.',\n label: 'Where to buy',\n screenId: 'scr-stores',\n }),\n ],\n }),\n brief({\n id: 'multibrand-fitness-studios-pricing',\n icp: 'multi-brand',\n pageType: 'pricing',\n brief: 'A pricing page for Pulse Cycle memberships across all Pulse Cycle studios: the three memberships, the questions riders ask most, and the free class form.',\n inventory: site('host-pulse-studios-cycle', {\n components: [\n { id: 'cmp-plan-card', name: 'Membership card', props: { name: 'text', price: 'text', summary: 'text' } },\n { id: 'cmp-faq-item', name: 'FAQ item', props: { question: 'text', answer: 'text' } },\n ],\n layouts: [\n { id: 'lay-cycle', name: 'Pulse Cycle layout', parentId: null },\n { id: 'lay-yoga', name: 'Pulse Yoga layout', parentId: null },\n ],\n forms: [{ id: 'frm-trial', name: 'Free class', fields: ['name', 'email', 'studio'] }],\n }),\n title: 'Memberships',\n slug: '/memberships',\n layout: 'lay-cycle',\n nav: true,\n seo: {\n title: 'Pulse Cycle Memberships',\n description: 'Ride at any Pulse Cycle studio with a monthly membership or a class pack. Every membership starts with a free class.',\n },\n sections: [\n hero('a', {\n title: 'Pulse Cycle memberships',\n lead: 'Ride at any Pulse Cycle studio. Every membership starts with a free class.',\n }),\n cards('b', {\n name: 'memberships',\n heading: 'Memberships',\n componentId: 'cmp-plan-card',\n items: [\n { name: 'Four classes', price: '[price] a month', summary: 'Four rides a month, booked up to a week ahead.' },\n { name: 'Unlimited', price: '[price] a month', summary: 'Ride as often as you like, booked two weeks ahead.' },\n { name: 'Class pack', price: '[price] for ten', summary: 'Ten rides to use within three months.' },\n ],\n }),\n cards('c', {\n name: 'questions riders ask',\n heading: 'Questions riders ask',\n componentId: 'cmp-faq-item',\n items: [\n { question: 'Can I pause my membership?', answer: 'Yes, for up to two months a year.' },\n { question: 'Do I need cycling shoes?', answer: 'No. Every studio lends shoes at no charge.' },\n { question: 'Can I ride at another studio?', answer: 'Yes, at every Pulse Cycle location.' },\n ],\n }),\n form('d', {\n name: 'free class form',\n heading: 'Book a free class',\n intro: 'Choose your studio and we send the schedule for the week.',\n formId: 'frm-trial',\n }),\n ],\n }),\n // ── Single small businesses ─────────────────────────────────────────────\n brief({\n id: 'smallbiz-bakery-contact',\n icp: 'small-business',\n pageType: 'contact',\n brief: 'A contact page for our bakery with the opening hours and the contact form for custom cake and wholesale questions.',\n inventory: site('host-corner-bakery', {\n forms: [{ id: 'frm-contact', name: 'Contact', fields: ['name', 'email', 'message'] }],\n }),\n title: 'Contact',\n slug: '/contact',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Visit or Contact the Bakery',\n description: 'Opening hours for the bakery, and a form for custom cake and wholesale questions. We answer within a day.',\n },\n sections: [\n hero('a', { title: 'Visit or call the bakery', lead: 'Fresh bread from 7 a.m., six days a week, at [street address].' }),\n prose('b', {\n name: 'opening hours',\n heading: 'Opening hours',\n paragraphs: [\n 'Open Tuesday to Friday from 7 a.m. to 3 p.m., and Saturday and Sunday from 8 a.m. to 2 p.m. Closed on Mondays.',\n ],\n }),\n form('c', {\n name: 'contact form',\n heading: 'Send us a message',\n intro: 'Ask about custom cakes and wholesale orders. We answer within a day.',\n formId: 'frm-contact',\n }),\n ],\n }),\n brief({\n id: 'smallbiz-yoga-teacher-about',\n icp: 'small-business',\n pageType: 'about',\n brief: 'An about page for my yoga teaching: why I teach, my training, and a link to the class schedule.',\n inventory: site('host-maya-yoga', {\n screens: [{ id: 'scr-classes', name: 'Classes', slug: 'classes', layoutId: 'lay-site', template: false }],\n }),\n title: 'About',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Maya: Slow Flow and Restorative Yoga',\n description: 'Small-group slow flow and restorative yoga classes under twelve students, with room for questions in every class.',\n },\n sections: [\n hero('a', {\n title: 'About Maya',\n lead: 'I teach slow flow and restorative yoga in small groups, with room for questions in every class.',\n image: 'A yoga teacher guiding a small class in a sunlit studio',\n }),\n prose('b', {\n name: 'why I teach',\n heading: 'Why I teach',\n paragraphs: [\n 'I started yoga to recover from a running injury, and kept practicing because it made the rest of my week calmer.',\n 'My classes stay under twelve students, so I can offer a change for each body in the room.',\n ],\n }),\n list('c', {\n name: 'training',\n heading: 'Training',\n items: [\n { primary: '500-hour yoga teacher training', secondary: '[school name]' },\n { primary: 'Restorative yoga certificate', secondary: '[school name]' },\n ],\n }),\n callToAction('d', {\n name: 'class schedule',\n heading: 'Come to a class',\n body: 'New students can try any class at the drop-in rate.',\n label: 'See the schedule',\n screenId: 'scr-classes',\n }),\n ],\n }),\n brief({\n id: 'smallbiz-bike-repair-service',\n icp: 'small-business',\n pageType: 'service',\n brief: 'A service page for bike tune-ups and repairs: the three tune-up levels, how long repairs take, and the drop-off booking form.',\n inventory: site('host-spoke-bike-repair', {\n components: [{ id: 'cmp-service-item', name: 'Service item', props: { name: 'text', detail: 'text' } }],\n forms: [{ id: 'frm-booking', name: 'Repair booking', fields: ['name', 'email', 'bike type', 'drop-off day'] }],\n }),\n title: 'Tune-ups and repairs',\n slug: '/repairs',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'Bike Tune-Ups and Repairs',\n description: 'Drop off your bike any weekday morning. Three tune-up levels, most ready the next day, with a call before any extra cost.',\n },\n sections: [\n hero('a', {\n title: 'Bike tune-ups and repairs',\n lead: 'Drop off your bike any weekday morning and pick it up ready to ride, most often the next day.',\n }),\n cards('b', {\n name: 'tune-up levels',\n heading: 'Tune-up levels',\n componentId: 'cmp-service-item',\n items: [\n { name: 'Safety check', detail: 'Brakes, tires and a full bolt check. [price]' },\n { name: 'Standard tune-up', detail: 'Adds gear and brake adjustment and wheel truing. [price]' },\n { name: 'Overhaul', detail: 'Adds a full strip-down, cleaning and new cables. [price]' },\n ],\n }),\n prose('c', {\n name: 'how long repairs take',\n heading: 'How long it takes',\n paragraphs: ['Most tune-ups are ready the next day. We call before any repair that costs more than the estimate.'],\n }),\n form('d', {\n name: 'drop-off booking form',\n heading: 'Book a drop-off',\n intro: 'Tell us about the bike and the day you can bring it in.',\n formId: 'frm-booking',\n }),\n ],\n }),\n]\n\n/**\n * A page brief for a workspace that keeps no reusable components, answered the\n * way such a workspace answers (AGL-3053): every repeated item written once\n * with its copies' values listed. `writtenOut` is the same page with every\n * repeated item written out card by card — the control, which the section\n * check draws the golden answers into, node for node apart from ids.\n */\nexport interface AiFreePageFixture extends AiPageBriefFixture {\n /** The golden answers, in the plan's order, with every repeated item written out in full. */\n writtenOut: AiGoldenSection[]\n}\n\ntype PracticeAreas = { name: string; heading: string; items: Array<{ title: string; summary: string }> }\n\n/** A Free page brief whose card sections are written once, with the page written out in full beside it. */\nfunction freeBrief(input: Omit<Parameters<typeof brief>[0], 'sections'> & { sections: Array<Built | { once: Built; full: Built }> }): AiFreePageFixture {\n const once = input.sections.map((entry) => ('once' in entry ? entry.once : entry))\n const full = input.sections.map((entry) => ('full' in entry ? entry.full : entry))\n return { ...brief({ ...input, sections: once }), writtenOut: full.map((entry) => entry.answer) }\n}\n\n/** A section of cards, written once and written out. */\nfunction repeatedCards(prefix: string, input: PracticeAreas): { once: Built; full: Built } {\n return { once: inlineCardsOnce(prefix, input), full: inlineCards(prefix, input) }\n}\n\n/**\n * A page brief for a Free workspace (AGL-3030): a site that keeps no reusable\n * components and no saved forms, with the one layout its plan includes. Its\n * practice areas repeat and its consultation request is a form, so the page\n * is built the one way such a workspace can build it — the cards drawn where\n * they repeat, written once in the answer (AGL-3053), and the form carried by\n * the page with its fields inside it. The plan the page job keeps for it is\n * held to the Free workspace's capabilities, never the whole doctrine.\n */\nexport const AI_FREE_PAGE_FIXTURE: AiFreePageFixture = freeBrief({\n id: 'free-law-firm-about',\n icp: 'small-business',\n pageType: 'about',\n brief: 'An about page for Brightwater Law: who we are, the four areas we practice, how we work with clients, and a form to request a consultation.',\n inventory: site('host-brightwater-law', {}),\n title: 'About Brightwater Law',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Brightwater Law',\n description: 'A small firm for families and small businesses: estate planning, real estate, business formation and landlord-tenant matters.',\n },\n sections: [\n hero('a', {\n title: 'About Brightwater Law',\n lead: 'We are a small firm that helps families and small businesses in [city] plan ahead and settle disputes before they reach a courtroom.',\n }),\n repeatedCards('b', {\n name: 'practice areas',\n heading: 'What we help with',\n items: [\n { title: 'Estate planning', summary: 'Wills, trusts and powers of attorney, written so your family knows what you wanted.' },\n { title: 'Real estate', summary: 'Purchase agreements, title questions and closings for homes and small commercial property.' },\n { title: 'Business formation', summary: 'Choosing an entity, operating agreements and the contracts a new business signs first.' },\n { title: 'Landlord and tenant', summary: 'Leases, deposits and notices, for owners with a few units and the people who rent from them.' },\n ],\n }),\n prose('c', {\n name: 'how we work',\n heading: 'How we work with you',\n paragraphs: [\n 'Your first call is with the attorney who will handle the matter. We quote a flat fee where the work allows one, and we say so before we start when it does not.',\n ],\n }),\n inlineForm('d', {\n name: 'consultation request form',\n heading: 'Request a consultation',\n intro: 'Tell us a little about what you need. We reply within one business day.',\n formName: 'Consultation request',\n submitLabel: 'Request a consultation',\n fields: [\n { fieldName: 'name', label: 'Your name', fieldType: 'text', required: true },\n { fieldName: 'email', label: 'Email', fieldType: 'email', required: true },\n { fieldName: 'phone', label: 'Phone', fieldType: 'text' },\n { fieldName: 'matter', label: 'What can we help with?', fieldType: 'textarea', required: true },\n ],\n }),\n ],\n})\n\n/**\n * A Free law firm's practice areas with copy of the length a firm writes\n * (AGL-3053): four areas for families and six for businesses and property\n * owners, 25 to 29 words a summary. A live Free About page's four practice\n * areas, drawn card by card, were cut off at their pass's ceiling on their\n * answer and on their re-ask. Written once, four and six such cards each fit a\n * balanced-tier pass; written out card by card, neither does\n * (`ai-job-page-evals.spec.ts`).\n */\nexport const AI_FREE_PRACTICE_AREAS_FIXTURE: AiFreePageFixture = freeBrief({\n id: 'free-law-firm-practice-areas',\n icp: 'small-business',\n pageType: 'about',\n brief: 'An about page for Cedar Point Law: who we are, the four ways we help families, and the six ways we help businesses and property owners, a few sentences on each.',\n inventory: site('host-cedar-point-law', {}),\n title: 'About Cedar Point Law',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Cedar Point Law',\n description: 'A general practice for families, businesses and property owners in [county], from estate planning and probate to leases and closings.',\n },\n sections: [\n hero('a', {\n title: 'About Cedar Point Law',\n lead: 'A general practice in [town] for families, small businesses and property owners, with the same attorney answering your calls from the first meeting to the last filing.',\n }),\n repeatedCards('b', {\n name: 'four ways we help families',\n heading: 'For families',\n items: [\n { title: 'Estate planning', summary: 'Wills, revocable trusts, powers of attorney and health care directives, drafted after a conversation about your family, your property and who should decide for you if you cannot.' },\n { title: 'Divorce and custody', summary: 'Uncontested and contested divorces, parenting plans and support, with a written estimate before anything is filed and a schedule for the children that both households can follow.' },\n { title: 'Probate', summary: 'Opening probate, listing assets, paying debts and distributing property for personal representatives, with a written timeline so heirs know what happens next and about how long it takes.' },\n { title: 'Guardianship and elder law', summary: 'Guardianship and conservatorship petitions, long-term care planning and help for adult children managing a parent’s money, with meetings at home or at a care facility when travel is hard.' },\n ],\n }),\n repeatedCards('c', {\n name: 'six ways we help businesses and property owners',\n heading: 'For businesses and property owners',\n items: [\n { title: 'Business formation', summary: 'Choosing between an LLC and a corporation, operating agreements, partner buyout terms and the first contracts a new business signs with its landlord, lenders and first employees.' },\n { title: 'Contracts', summary: 'Vendor, customer and service agreements drafted or reviewed in plain language, with the payment terms, termination rights and limits on liability explained before you sign anything.' },\n { title: 'Commercial leases', summary: 'First leases and renewals for shops, offices and restaurants, including build-out allowances, personal guarantees, rent increases and what happens when the business outgrows the space.' },\n { title: 'Real estate closings', summary: 'Purchase agreements, title review, boundary questions and closings for homes, rental property and small commercial buildings, with one attorney following the file from contract to keys.' },\n { title: 'Landlord and tenant', summary: 'Leases, security deposits, repair disputes and eviction notices, for owners with a few rental units and for tenants who need to know where they stand before they answer.' },\n { title: 'Employment matters', summary: 'Offer letters, handbooks, contractor questions and separation agreements for businesses with fewer than fifty employees, written to fit the state rules that apply to them.' },\n ],\n }),\n ],\n})\n\n/**\n * A page brief whose plan creates what its site lacks (AGL-3031): a layout, a\n * reusable component and a saved form, on a Starter site that has none of\n * them. The page job builds all three first — each through the step that\n * builds its kind, answering with the golden that step's own spec holds —\n * and then the page, which places the component and binds the form by the\n * ids the job built them under, and renders inside the layout.\n *\n * Every draft is named by the id the job recorded for it before anything was\n * built (AGL-3079): each creation by the id on its plan entry, which the\n * section answers name, and the page by the id on the job's generation step.\n */\nexport interface AiPageCreationFixture extends AiPageBriefFixture {\n /** The job the page is built under. */\n jobId: string\n /** The id the job recorded for its page on its generation step. */\n screenId: string\n /** The layout step's golden answer: a header of screen links, the slot and a footer. */\n layout: AiGoldenSection\n /** The component step's golden, by its file under `jobs/goldens`. */\n componentGolden: string\n /** The form step's golden, by its key in `fixtures/ai-job-form-goldens.json`. */\n formGolden: string\n}\n\nconst CREATION_JOB = 'job-golden-creations'\n\n/** The ids the plan recorded for what it creates, as a kept plan carries them. */\nconst CREATION_IDS = { component: 'tstmnlCard', layout: 'hrbrLayout', form: 'roofQuoteF' }\n\nexport const AI_PAGE_CREATION_FIXTURE: AiPageCreationFixture = (() => {\n const component = CREATION_IDS.component\n const form = CREATION_IDS.form\n const opener = hero('a', {\n title: 'Roof repair in Harbor County',\n lead: 'A local crew that finds the leak, fixes it the same week and sends you photos of the work.',\n cta: { label: 'Meet the crew', screenId: 'scr-about' },\n })\n const quotes = section('b', 'customer words', ['new:Testimonial card'], 3, (add) => {\n // The brief names no customer's role, so each card leaves it to the card's default (AGL-3056).\n const cells = [\n { quote: 'They found the leak two other companies missed.', name: '[customer name]' },\n { quote: 'On time, tidy, and the photos made the invoice easy to trust.', name: '[customer name]' },\n { quote: 'The same crew came back to check the repair after the first storm.', name: '[customer name]' },\n ].map((propValues) => cell(add, 3, add({ componentId: 'reusableInstance', props: { refId: component, propValues } })))\n return framed(add, [add(typography('h2', 'What homeowners say', 'h2')), row(add, cells)], 'lg', 8)\n })\n const request = section('c', 'quote request form', ['new:Roof quote request'], 0, (add) =>\n framed(\n add,\n [\n add(typography('h2', 'Request a quote', 'h2')),\n add(typography('body1', 'Tell us about the roof. We call back within one business day.')),\n add({ componentId: 'form', props: { formId: form } }),\n ],\n 'sm',\n 8,\n ),\n )\n const seo = {\n title: 'Roof Repair in Harbor County',\n description: 'Same-week roof repair from a local crew, with photos of every fix and a callback within one business day.',\n }\n return {\n id: 'agency-roofing-creations',\n icp: 'agency',\n pageType: 'service',\n brief: 'A roof repair page for Harbor Roofing: what we fix, three things customers have said, and a form to request a quote. The site is new and has no layout, cards or forms yet.',\n inventory: site('host-harbor-new', {\n layouts: [],\n screens: [{ id: 'scr-about', name: 'About', slug: 'about', layoutId: null, template: false }],\n }),\n plan: {\n reuse: [{ kind: 'screen', id: 'scr-about', purpose: 'linked from the hero' }],\n create: [\n {\n kind: 'component',\n name: 'Testimonial card',\n why: 'Three quotes share one card, and the site has no card yet.',\n duplicateOf: null,\n fields: ['quote:richText', 'name:text', 'role:text', 'photo:image'],\n id: CREATION_IDS.component,\n },\n {\n kind: 'layout',\n name: 'Harbor Roofing site',\n why: 'The site has no layout, so every page would otherwise carry its own header and footer.',\n duplicateOf: null,\n fields: [],\n id: CREATION_IDS.layout,\n },\n {\n kind: 'form',\n name: 'Roof quote request',\n why: 'The site has no form to request a quote.',\n duplicateOf: null,\n fields: [],\n id: CREATION_IDS.form,\n },\n ],\n screens: [\n {\n title: 'Roof repair',\n slug: '/roof-repair',\n layout: 'new:Harbor Roofing site',\n template: null,\n duplicateOf: null,\n nav: true,\n seoTitle: seo.title,\n seoDescription: seo.description,\n sections: [opener.section, quotes.section, request.section],\n },\n ],\n },\n answers: [opener.answer, quotes.answer, request.answer],\n seo,\n jobId: CREATION_JOB,\n screenId: 'roofRepair',\n layout: {\n rootId: 'root',\n nodes: {\n root: { componentId: 'div', nodes: ['header', 'slot', 'footer'] },\n header: { componentId: 'muiAppBar', props: { position: 'static', color: 'default' }, nodes: ['bar'] },\n bar: { componentId: 'muiToolbar', nodes: ['brand', 'home', 'about'] },\n brand: { componentId: 'muiTypography', props: { variant: 'h6', component: 'p', children: 'Harbor Roofing' } },\n home: { componentId: 'muiScreenLink', props: { screenId: 'scr-home', children: 'Home' } },\n about: { componentId: 'muiScreenLink', props: { screenId: 'scr-about', children: 'About' } },\n slot: { componentId: 'layoutSlot' },\n footer: { componentId: 'section', props: { element: 'footer' }, nodes: ['tagline'] },\n tagline: { componentId: 'muiTypography', props: { variant: 'body2', children: 'Family-run roofers in Harbor County since 1998.' } },\n },\n },\n componentGolden: 'component-testimonial-card',\n formGolden: 'roofingQuote',\n }\n})()\n\n/**\n * A page whose second section introduces two people (AGL-3042): a photo, a\n * name, a role and a short bio for each, as a law firm's About page asks for\n * its attorneys, on a paid workspace whose site keeps no card for a person.\n * Two items are fewer than a component is required for, so the section draws\n * both where they stand.\n *\n * The golden answer is the drawing a section's request asks for at the\n * balanced tier's ceiling: a Card a person holding the four, in fifteen\n * elements. `roomier` is the same two people drawn the way a model reaches for\n * with more elements to spend — a grid cell, a card body and styles a person,\n * and an introduction — in twenty, inside the twenty-three a budget counted in\n * estimated tokens allows. The page's evals measure both against the ceiling.\n */\nexport interface AiTwoPersonPageFixture extends AiPageBriefFixture {\n /** The introduction drawn in twenty elements: a valid section, and past the ceiling in real tokens. */\n roomier: AiGoldenSection\n}\n\nconst ATTORNEYS = [\n {\n photo: 'A portrait of [attorney name], the founding partner, in the firm’s office',\n name: '[attorney name]',\n role: 'Founding partner, family law',\n bio: 'Has represented parents and spouses in [county] for [years] years, and settles most cases before they reach a courtroom.',\n },\n {\n photo: 'A portrait of [attorney name] at a conference table',\n name: '[attorney name]',\n role: 'Partner, estate planning and real estate',\n bio: 'Writes wills and trusts for young families, and handles closings for homes and small commercial property.',\n },\n]\n\nexport const AI_TWO_PERSON_PAGE_FIXTURE: AiTwoPersonPageFixture = (() => {\n const introduction = section('b', 'meet our attorneys', [], ATTORNEYS.length, (add) => {\n const cards = ATTORNEYS.map((person) =>\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { flex: 1 },\n nodes: [\n add({ componentId: 'image', props: { alt: person.photo } }),\n add(typography('h3', person.name, 'h3')),\n add(typography('subtitle1', person.role)),\n add(typography('body2', person.bio)),\n ],\n }),\n )\n // A Grid of two would take two more elements than the fifteen the pass\n // asks for (AGL-3055); a Stack that turns from a column into a row at md\n // is the same responsive pair in none.\n return framed(\n add,\n [\n add(typography('h2', 'Meet our attorneys', 'h2')),\n add({ componentId: 'muiStack', sx: { flexDirection: { xs: 'column', md: 'row' }, gap: 3 }, nodes: cards }),\n ],\n 'lg',\n 8,\n )\n })\n const roomier = section('b', 'meet our attorneys', [], ATTORNEYS.length, (add) => {\n const cells = ATTORNEYS.map((person) =>\n add({\n componentId: 'muiGrid',\n props: { size: span(ATTORNEYS.length) },\n nodes: [\n add({\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { height: '100%' },\n nodes: [\n add({ componentId: 'image', props: { alt: person.photo, objectFit: 'cover', loading: 'lazy' }, sx: { width: '100%' } }),\n add({\n componentId: 'muiCardContent',\n nodes: [\n add(typography('h3', person.name, 'h3')),\n add({ componentId: 'muiTypography', props: { variant: 'subtitle1', children: person.role }, sx: { color: 'text.secondary' } }),\n add(typography('body2', person.bio)),\n ],\n }),\n ],\n }),\n ],\n }),\n )\n return framed(\n add,\n [\n add(typography('h2', 'Meet our attorneys', 'h2')),\n add(typography('body1', 'Two attorneys, and one of them handles your matter from the first meeting to the final order.')),\n row(add, cells),\n ],\n 'lg',\n 8,\n )\n })\n const fixture = brief({\n id: 'agency-law-firm-two-attorneys',\n icp: 'agency',\n pageType: 'about',\n brief: 'An about page for Harborline Law: who we are, and our two attorneys with a photo, their role and a short bio for each.',\n inventory: site('host-harborline-law', {\n screens: [{ id: 'scr-contact', name: 'Contact', slug: 'contact', layoutId: 'lay-site', template: false }],\n }),\n title: 'About Harborline Law',\n slug: '/about',\n layout: 'lay-site',\n nav: true,\n seo: {\n title: 'About Harborline Law',\n description: 'A coastal law firm for families and homeowners: family law, estate planning and real estate closings.',\n },\n sections: [\n hero('a', {\n title: 'About Harborline Law',\n lead: 'A small coastal firm for families and homeowners, in family law, estate planning and real estate closings.',\n cta: { label: 'Request a consultation', screenId: 'scr-contact' },\n }),\n introduction,\n ],\n })\n return { ...fixture, roomier: roomier.answer }\n})()\n"],"names":["emptyAiSiteInventory","section","prefix","name","uses","items","build","nodes","counter","add","node","id","key","root","componentId","answer","rootId","typography","variant","children","component","props","framed","maxWidth","py","stack","column","direction","sx","gap","container","element","hero","input","cta","screenId","title","lead","push","label","image","alt","alignItems","span","cell","child","repeat","size","row","cells","spacing","cards","length","map","propValues","refId","heading","intro","cardsOnce","keys","Object","fromEntries","at","copies","item","instance","AI_INSTANCE_CARDS_FIXTURE","summary","once","full","list","rows","primary","secondary","dense","prose","paragraphs","copy","form","formId","inlineCards","inlineCardsOnce","entry","inlineForm","formName","submitLabel","fields","field","callToAction","body","THEME","colors","fonts","SITE_LAYOUT","parentId","HOME","slug","layoutId","template","site","hostId","parts","components","forms","layouts","screens","theme","brief","Set","inventory","reuse","kind","layout","purpose","seen","planned","sections","ref","has","icp","pageType","plan","create","duplicateOf","nav","seoTitle","seo","seoDescription","description","answers","AI_PAGE_BRIEF_FIXTURES","quote","role","credentials","bio","step","detail","practice","price","dish","pairing","question","freeBrief","writtenOut","repeatedCards","AI_FREE_PAGE_FIXTURE","fieldName","fieldType","required","AI_FREE_PRACTICE_AREAS_FIXTURE","CREATION_JOB","CREATION_IDS","AI_PAGE_CREATION_FIXTURE","opener","quotes","request","why","jobId","header","position","color","bar","brand","home","about","slot","footer","tagline","componentGolden","formGolden","ATTORNEYS","photo","AI_TWO_PERSON_PAGE_FIXTURE","introduction","person","flex","flexDirection","xs","md","roomier","height","objectFit","loading","width","fixture"],"mappings":"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"}
@@ -280,6 +280,27 @@ export declare function detectOffBrandEmail(tree: AiDoctrineTree, outputKind: Ai
280
280
  * Section is one group.
281
281
  */
282
282
  export declare function detectTypedData(tree: AiDoctrineTree): AiDoctrineViolation[];
283
+ /**
284
+ * An instance that fills none of the props its component declares (AGL-3024).
285
+ *
286
+ * Rule 1 says an instance is `"reusableInstance"` whose `refId` names the
287
+ * component and whose `propValues` FILL its props, and until now nothing read
288
+ * the second half back. A placed instance with no `propValues` is not empty on
289
+ * the page: it renders the component's own `defaultValue` for every prop, so
290
+ * three of them render three identical cards of placeholder text.
291
+ *
292
+ * MEASURED 2026-09-21 on `attorney-profile-template-v2` (`sak5ei_9Wv`), whose
293
+ * three instances of `practice-area-card` each carried `{"refId": …}` and
294
+ * nothing else. It was recorded as the component shipping placeholder content;
295
+ * the component is correct and declares `title`, `description` and `icon` with
296
+ * labels and descriptions. The template placed it three times and filled
297
+ * nothing, so every attorney's page showed the same `[Practice area name]`.
298
+ *
299
+ * Only an instance filling NOTHING is refused. A component may declare a prop
300
+ * whose default is right for most placements, and a partly filled instance is
301
+ * a judgment the doctrine does not have the information to second-guess.
302
+ */
303
+ export declare function detectUnfilledInstances(tree: AiDoctrineTree, context: Pick<AiDoctrineTreeContext, 'componentProps'>): AiDoctrineViolation[];
283
304
  /**
284
305
  * Rule 9. Images are placed from the media library — an asset, or an empty
285
306
  * slot for the author to fill — never hot-linked from another site, and