[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-replicate-with-blocks":3,"mdc-p27mdj-key":36,"related-org-automattic-replicate-with-blocks":6390,"related-repo-automattic-replicate-with-blocks":6578},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"replicate-with-blocks","reconstruct WordPress sites with block themes","Spec-driven, whole-site block-theme reconstruction for a liberated site. Invokes design-foundations → creating-themes → clustering → spec extraction → generating-patterns (fan-out, per cluster) → assemble → validate → install → design-qa to produce a responsive, editable WordPress block theme that matches the source site's layout, content structure, and visual design. Call after `liberate` (extraction) and before content import, or re-run standalone to re-theme an already-extracted site. Use when the user says \"rebuild this site,\" \"replicate the design,\" \"make a theme that matches,\" \"recreate the layout,\" or asks for a WordPress version of a liberated site.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"automattic","Automattic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fautomattic.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Full Site Editing","full-site-editing","tag",{"name":17,"slug":18,"type":15},"WordPress","wordpress",{"name":20,"slug":21,"type":15},"Migration","migration",{"name":23,"slug":24,"type":15},"Themes","themes",31,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fdata-liberation-agent","2026-06-08T08:17:35.493495",null,1,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Extract content from closed web platforms into WordPress-compatible WXR files.","https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fdata-liberation-agent\u002Ftree\u002FHEAD\u002Fskills\u002Freplicate-with-blocks","---\nname: replicate-with-blocks\ndescription: Spec-driven, whole-site block-theme reconstruction for a liberated site. Invokes design-foundations → creating-themes → clustering → spec extraction → generating-patterns (fan-out, per cluster) → assemble → validate → install → design-qa to produce a responsive, editable WordPress block theme that matches the source site's layout, content structure, and visual design. Call after `liberate` (extraction) and before content import, or re-run standalone to re-theme an already-extracted site. Use when the user says \"rebuild this site,\" \"replicate the design,\" \"make a theme that matches,\" \"recreate the layout,\" or asks for a WordPress version of a liberated site.\nallowed-tools:\n  - Bash\n  - Read\n  - Write\n  - Edit\n  - Glob\n  - Grep\n  - AskUserQuestion\ndisable-model-invocation: true\n---\n\n# Replicate\n\nYou are a **design sub-orchestrator**. You drive the spec-driven whole-site block-reconstruction flow, delegating judgment to the composable skills below and determinism to MCP tools, then assembling and validating what they return. The `\u002Fliberate` root orchestrator calls you inline; you are also independently invocable to re-theme an already-extracted site.\n\n> **Entry contract.** Dispatched by `\u002Fliberate` after extraction — the `siteDir` from `liberate_paths` is the resolved `\u003CoutputDir>`. **Assume it already holds the capture** (`output.wxr`, `html\u002F*.html`, `screenshots\u002Fmanifest.json`, media). If they're missing\u002Fincomplete, STOP and tell the operator to run `\u002Fliberate \u003Curl>` first; do not capture here. (Note: the `src\u002Flib\u002Freplicate\u002F` library namespace is shared plumbing, distinct from this skill's name `replicate-with-blocks`.)\n\nThe acceptance bar is source parity, not a pleasant approximation:\n\n- Preserve observed section order, header\u002Ffooter structure, navigation labels, CTA placement, media placement\u002Faspect ratios, column counts, alignment, spacing rhythm, and responsive stacking.\n- Use source text and uploaded media only. Do not invent copy, placeholder cards, stock-like sections, or generic marketing layouts.\n- Templates render imported post\u002Fproduct content through proper WP template hierarchy; patterns and layout skeletons are for pages. Do not reconstruct posts or products section-by-section — that is handled by templates + Query Loop + WooCommerce.\n- Do not hand-author Custom HTML blocks (`core\u002Fhtml` \u002F `wp:html`) for layout or styling. Use core blocks first; embed a custom block inside the theme (`blocks\u002F\u003Cslug>\u002F`) only when a source component cannot be expressed any other way (see anti-patterns). **One sanctioned exception:** the deterministic per-section *coverage-gated verbatim fallback* (`src\u002Flib\u002Freplicate\u002Fhtml-fallback.ts`) emits a section's sanitized source HTML as a `core\u002Fhtml` island when the structured render would otherwise DROP content — see \"core\u002Fhtml fallback\" below. You never author these by hand; `reconstructPagePattern` emits them automatically when a render is badly lossy.\n- The old 27-pattern library is now seed material in the `section-mapping` catalog — it is not the primary mechanism. Builders pick block templates from the catalog; they do not pick-tweak from the 27-pattern library.\n\n## Prerequisites\n\nConfirm these exist in `\u003CoutputDir>\u002F` (the resolved site dir from `liberate_paths` \u002F provided `siteDir`) before starting:\n\n- `design-foundation.json` — produced by `design-foundations`. **Required.** If missing, stop and tell the caller to run `design-foundations` first.\n- `design.md` — frozen brief from `design-foundations`. Required (written in the same step).\n- `html\u002F*.html` — rendered HTML per page from the capture stage. If missing, stop: the screenshot\u002FHTML capture stage was skipped. Re-run extraction with screenshots enabled.\n- `screenshots\u002Fdesktop\u002F*.png` + `screenshots\u002Fmobile\u002F*.png` — for verification and QA.\n- `screenshots\u002Fmanifest.json` — URL → file map.\n- `output.wxr` — and optionally `products.jsonl` \u002F `products.csv` for Woo sites.\n\n`palette.json`, `typography.json`, and `breakpoints.json` (from screenshot aggregation) are consumed by `design-foundations` and baked into `design-foundation.json`; you do not read them directly.\n\n## MCP tools you call\n\nUse these tools rather than reimplementing their logic in Bash. Each has a typed I\u002FO schema in the codebase.\n\n| Tool | What it does |\n|---|---|\n| `liberate_section_extract({ url\\|html, mediaMap, detail })` | `detail:\"signature\"` → ordered section-type sequence + structural attrs (all pages, off saved `html\u002F\u003Cslug>.html`); `detail:\"full\"` → `specs\u002F\u003Crep>\u002Fsection-\u003Cn>-\u003Ctype>.md` (computed styles, interaction model, uploaded WP media URLs, brightness, motion — reps only) |\n| `liberate_cluster_pages({ outputDir, signatures })` | Groups pages by exact layout signature → `cluster-map.json` (cluster per unique signature, representative = richest HTML) |\n| `liberate_reconstruct_pages({ outputDir, studioSitePath, themeSlug, pages })` | **PRIMARY page path.** Reconstructs EVERY content page from its OWN captured section specs (no shared cluster skeleton): per page → capture specs, download+install its media, reconstruct gated block markup, install `patterns\u002Fpage-\u003Cslug>.php` + `templates\u002Fpage-\u003Cslug>.html` (+ `front-page.html` for home), force a pattern re-scan. Replaces cluster-rep-only reconstruction + carried-HTML fallback |\n| `liberate_compose_instantiate({ outputDir, skeleton, pageContent, mediaMap })` | LEGACY (superseded by `liberate_reconstruct_pages` for pages). Deterministic slot-fill: cluster layout skeleton + this page's content → `post_content` block markup; returns `{ postContent, misfit }` |\n| `liberate_validate_artifacts({ patterns: ArtifactPattern[] })` | Security + quality trust boundary. Asserts: escaping (`esc_html`\u002F`esc_attr`\u002F`esc_url`), no raw `\u003C?php`\u002F`\u003Cscript>`\u002F`on*=`, emitted text ⊆ spec captured text (provenance), no remote CDN URLs, no `{{placeholder}}` text, block-comment-only markup. **Takes `patterns`, not `outputDir`.** NOTE: `liberate_reconstruct_pages` already runs this gate per-page against each page's OWN spec corpus and refuses to install a failing page — that internal gate is AUTHORITATIVE. `scripts\u002F_validate.ts \u003CoutputDir>` is a convenience sweep over the on-disk `theme\u002Fpatterns\u002F*.php`, but its provenance corpus is APPROXIMATE (sourced from `html\u002F\u003Cslug>.html`), so it can emit provenance FALSE-POSITIVES (e.g. text the renderer concatenated across source elements). Treat its provenance flags as \"verify against the source,\" not as gate failures; security\u002Finjection\u002Fdrift checks are exact. |\n| `liberate_install_theme({ outputDir, studioSitePath, themeFiles, themeSlug })` | Writes theme files into a running Studio site and activates the theme (streaming \u002F watch-loop context) |\n| `liberate_preview({ outputDir, themeFiles, themeSlug, open?, port? })` | Standalone context: creates\u002Freuses a Studio site, imports WXR + products.csv, writes + activates the theme |\n\n## Sub-skills you invoke\n\nRead each skill's SKILL.md before using it.\n\n- **`design-qa` is `disable-model-invocation: true`** — the Skill tool will REFUSE to launch it. Do not try to \"invoke\" it; READ its `SKILL.md` and follow it inline in this shared context, driving its MCP tools (`liberate_replicate_verify`, `evaluateResponsive`) yourself.\n- **`design-foundations` is model-invocable** (a user may run it standalone), but in THIS flow you still run it inline for shared context — read its `SKILL.md` and drive `liberate_design_foundation_scaffold`\u002F`_save`\u002F`_validate` yourself.\n- **`generating-patterns` \u002F `compose-page-blocks` \u002F `editing-themes` \u002F `editing-blocks` are ALSO `disable-model-invocation: true`** — you cannot `Skill`-launch them. Invoke each by **dispatching a subagent whose prompt points it at the skill's `SKILL.md`** (the builder fan-out in Step 4 already works this way); the subagent reads the file and follows it. This matches the subagent-dispatch convention and keeps the workflow from stalling on a refused Skill call.\n\n| Skill | When |\n|---|---|\n| `design-foundations` | Step 1 — if `design-foundation.json` or `design.md` are missing |\n| `creating-themes` | Step 1 — emits `theme.json`, `style.css`, `functions.php`, parts skeleton, base templates, self-hosted fonts |\n| `generating-patterns` | Step 4 — one builder per cluster representative (fan-out, concurrency-capped). SUPPLEMENTARY — skip when `liberate_reconstruct_pages` (Step 5) covers every page (the default) |\n| `compose-page-blocks` | Step 5 — misfit pages only (post-compose sanity check flagged them as unmatched) |\n| `design-qa` | Step 7 — visual QA loop after install |\n| `editing-themes` | Step 7 — apply fix directives from `design-qa` |\n\n## The 8-step flow\n\n> **Page path is deterministic-first.** `liberate_reconstruct_pages` (Step 5) is the PRIMARY, self-contained page path: it captures each page's OWN computed-style specs, reconstructs gated block markup, and installs per-page patterns + templates. It does **not** consume `cluster-map.json` or the Step 3\u002F4 spec+builder artifacts. So in the default flow:\n> - **Step 2 (cluster) is INFORMATIONAL** — it surfaces sitewide-shared chrome and an archetype map for the run-report, but does not gate reconstruction. Where the layout signature is unreliable (e.g. Wix serves CSS cross-origin, collapsing nearly every page to one signature) clustering is near-useless — that's expected, and fine; `reconstruct_pages` still works per-page.\n> - **Steps 3–4 (per-cluster specs → `generating-patterns` builder fan-out) are SUPPLEMENTARY.** Skip the fan-out when `reconstruct_pages` covers every page (the default). Reach for it only when reconstruct leaves a real gap (a bespoke section it can't map) or is unavailable (legacy `compose-instantiate` path). Step 3.5 (asset triage) applies to the primary path and is NOT supplementary.\n> - Header\u002Ffooter chrome comes from `liberate_theme_scaffold` (Step 1), not the builders.\n\n### Step 1 — Foundation + theme scaffold\n\n**If `design-foundation.json` and `design.md` already exist, skip to the build gate check and continue.**\n\n1a. Invoke `design-foundations`. It reads `html\u002F`, `screenshots\u002F`, `palette.json`, `typography.json`, `breakpoints.json`, and `manifest.json`; emits `design-foundation.json` (semantic token roles: `color.accent.primary`, `typography.families.display`, etc.) and freezes `design.md`. Do not proceed with raw aggregates.\n\n1b. Invoke `creating-themes`. It reads `design-foundation.json` + `design.md` and emits:\n  - `theme\u002Ftheme.json` (schema v3, token roles mapped from foundation — see token mapping below)\n  - `theme\u002Fstyle.css` (with the correct theme header)\n  - `theme\u002Ffunctions.php`\n  - `theme\u002Fparts\u002Fheader.html` and `theme\u002Fparts\u002Ffooter.html` (skeleton — overwritten in step 5)\n  - `theme\u002Ftemplates\u002Findex.html`, `theme\u002Ftemplates\u002Fpage.html`, `theme\u002Ftemplates\u002Fsingle.html`, `theme\u002Ftemplates\u002Fsingle-product.html`, `theme\u002Ftemplates\u002Farchive-product.html` (base — content slots filled in step 5)\n  - Self-hosted font declarations\n\n**Build gate (after foundation):** validate `theme.json` against schema v3 and run the known-activation-fatals lint via `lintThemeJson` in `src\u002Flib\u002Freplicate\u002Ftheme-json-lint.ts` (e.g. `spacingScale.theme:false` fatal, missing `version` field). Fail → fix `theme.json` before continuing. Do not skip the gate.\n\n**Token mapping (theme.json from design-foundation.json):**\n\n- `color.surface.*` → `settings.color.palette` entries: `surface-base`, `surface-raised`, `surface-inverse`\n- `color.text.*` → `text-default`, `text-muted`, `text-subtle`, `text-inverse`\n- `color.accent.*` → `accent-primary`, `accent-warning`, `accent-warm`, `accent-highlight`\n- `color.border.*` → `border-default`, `border-subtle`\n- `typography.families.body` → `settings.typography.fontFamilies[0]`\n- `typography.families.display` → `settings.typography.fontFamilies[1]` (omit if `null` — do NOT hallucinate a serif)\n- `typography.families.mono` → `settings.typography.fontFamilies[2]` (omit if `null`)\n- `breakpoints.lg` → `settings.layout.contentSize`; `breakpoints.xl` → `settings.layout.wideSize`\n- `components.*` → `styles.blocks.core\u002F*` overrides (button, paragraph, separator, etc.)\n\nIf you provide explicit `settings.spacing.spacingSizes`, omit `settings.spacing.spacingScale` entirely. Do not set `settings.spacing.spacingScale.theme` to `false`.\n\n### Step 2 — Cluster\n\n2a. Call `liberate_section_extract` with `detail:\"signature\"` for every page in `html\u002F*.html`. This is a batch call over saved HTML — no re-navigation, no Playwright.\n\n2b. Call `liberate_cluster_pages` with all page signatures → `cluster-map.json`. Pages with identical section-type sequences join one cluster. Near-matches (edit-distance ≤ 1) merge with a note. The representative is the cluster member with the most sections (richest HTML by byte size). Exact-signature clustering only — fuzzy deferred.\n\nRead `cluster-map.json` and note: how many clusters, which pages are in each, who the representative is.\n\n### Step 3 — Per-cluster representative specs\n\nFor each cluster representative, call `liberate_section_extract` with `detail:\"full\"`. This emits `\u003CoutputDir>\u002Fspecs\u002F\u003Crep>\u002Fsection-\u003Cn>-\u003Ctype>.md` for each section of the representative page.\n\nSpec files are the contract between extraction and pattern generation. Each spec contains: interaction model, Y band, background color + brightness, text\u002Faccent colors, overlay flags, headings (verbatim), body text (verbatim), buttons (label\u002Fhref\u002Fcolors), list items, and image references (uploaded WP-library URLs or `assets\u002F\u003Clocal-filename>`). For a `review-grid` section the spec also carries `reviews[]` — source-VERBATIM `{ category, stars, quote, author }` records pulled from the served HTML by the deterministic `review-extract.ts` extractor. When `reviews[]` is present, the builder MUST render them verbatim and MUST NOT synthesize review prose; when a review band is detected but `reviews[]` is empty, use the missing-content fallback (placeholder + run-report flag).\n\n**Per-cluster readiness check:** before dispatching a builder, verify each spec has: interaction model set, computed styles present, media local-pathed (no CDN URLs), brightness recorded. Incomplete spec → fix it, don't dispatch.\n\n**Page-builder sections (Shopify\u002FReplo, Shogun):** these stores have rich repeated components — `product-card-row` (image + title + price), `review-grid` (star rating + quote + name), `app-download` (store-badge images), and email-capture heroes. `liberate_section_extract detail:\"full\"` now classifies these as their own interaction models; the builder maps each to the matching `references\u002Fsection-mapping.md` template. Don't let a product\u002Freview row collapse to generic `static`\u002F`columns`. Note: page-builder review carousels nest their slides too deep for the geometry classifier to read as repeated children, so a review band can first classify as `static` — but `liberate_section_extract` runs the deterministic review extractor over the section's served HTML and, when it finds star-rated quotes, promotes the model to `review-grid` and attaches the verbatim `reviews[]`. So the real reviews are captured even when the band \"looked\" static. Never assume reviews are unreachable JS and never invent them.\n\n**Missing-media:** if a spec's image slot has no local\u002FWP-library URL (capture failed), the builder must emit a sized placeholder and add a `details.provenanceFlags` entry — NOT substitute an unrelated photo. A non-zero provenance count is a `warn`, not a silent pass. The extractor now captures page-builder CDN imagery (Replo `assets.replocdn.com`, etc.) regardless of host\u002Fextension, so genuine misses should be rare.\n\nSitewide-shared sections (header, footer, a recurring CTA band that appears identically across clusters) are identified here and built once — deduplicated before builder dispatch.\n\n### Step 3.5 — Asset triage (decorative imagery → structural intent)\n\nClassify decorative-looking assets BEFORE reconstruction so the builder expresses them structurally instead of emitting broken\u002Fcluttered images.\n\n1. Candidates are deterministic — pipe a short script to `npx tsx --input-type=module` (from the repo root): `import { selectTriageCandidates } from '.\u002Fsrc\u002Flib\u002Freplicate\u002Ftriage-candidates.js'` over every captured page's SectionSpecs (`\u003CoutputDir>\u002Fsections\u002F\u003Cslug>.json`). Zero candidates → skip this step entirely.\n2. For EACH candidate, LOOK at it (fetch the asset file, or crop the section screenshot at the candidate's position). Classify:\n   - `keep` — real content: logo, illustration, product shot, photo, meaningful icon. When in doubt, KEEP (never-lose-source-content).\n   - `decoration` — divider line, ornament, gradient stripe, background blob. Write a 1-sentence description of what the visual IS (e.g. \"thin full-width horizontal rule between sections\") — downstream uses it to pick a structural replacement (`wp:separator` \u002F parent `border.*` \u002F parent `background`); `wp:html` is banned.\n3. Write `\u003CoutputDir>\u002Fasset-triage.json` atomically (tmp + rename): `{\"schema\":1,\"site\":\"\u003Corigin>\",\"entries\":[{\"url\",\"sectionSelector\",\"verdict\",\"description\"}]}`. COPY `url` and `sectionSelector` VERBATIM from the `selectTriageCandidates` output — the downstream join is exact-string on both fields; rewriting, normalizing, or trimming either breaks the match silently. The reconstruct handler consumes the file automatically; absent file = no behavior change. Capture-once: an existing file is reused on re-runs — delete it to re-triage.\n\n### Step 4 — Build (fan-out) — SUPPLEMENTARY (skip when `reconstruct_pages` covers all pages)\n\n> **Default flow skips this.** Page content is reconstructed per-page in Step 5 (`liberate_reconstruct_pages`), not from cluster skeletons. Run this fan-out ONLY when reconstruct can't map a bespoke section (needs a custom builder) or is unavailable.\n\nInvoke one `generating-patterns` builder **per cluster representative**. Builders are run in parallel, concurrency-capped to ~4–6. On Codex\u002FGemini, run sequentially.\n\nEach builder receives (by path — builders are read-only on shared artifacts):\n- `design.md` path\n- Theme slug\n- Token snapshot from `design-foundation.json`\n- Uploaded media URL map\n- The cluster's spec files (`specs\u002F\u003Crep>\u002Fsection-*.md`)\n- The section-mapping catalog (`skills\u002Fgenerating-patterns\u002Freferences\u002Fsection-mapping.md`)\n- The spec-files contract (`skills\u002Fgenerating-patterns\u002Freferences\u002Fspec-files.md`)\n\nEach builder returns a **structured JSON envelope** — `{ patterns: [{ slug, php }], sitewideFlags: [...], notes: [...] }` — validated by `parseBuilderEnvelope` in `src\u002Flib\u002Freplicate\u002Fbuilder-envelope.ts`. A malformed or partial return is a builder failure → retry once → fall back to sequential for that cluster. Never silently use partial output.\n\nBuilders emit **layout skeletons per cluster** (section-mapping templates with content slots filled from the spec's verbatim content), not finished per-page markup. Sitewide-shared sections (flagged in `sitewideFlags`) become registered WP patterns or template parts referenced by slug.\n\nPersist each cluster's patterns **before** marking it built in `session.json` (write-then-mark for resume). Log failures to `theme\u002Fdebug\u002Fcluster-\u003Cn>.json` and `theme\u002Fnotes.md`.\n\nCheckpoint by cluster-group with a compaction\u002Fhandoff between groups (full state in `session.json` + a short design-state summary) so the orchestrator's context can reset without losing contract artifacts.\n\n### Step 5 — Assemble\n\n**PRIMARY PAGE PATH — reconstruct EVERY content page (not just cluster reps).** Call `liberate_reconstruct_pages({ outputDir, studioSitePath, themeSlug, pages: [...] })` with **every** content page (`{ slug, sourceUrl, title, isHome }`), where home page sets `isHome:true`. For each page it captures computed-style section specs, downloads + installs that page's section media (incl. sibling background-image heroes), reconstructs verbatim block-pattern markup from THAT page's own specs (grids, FAQ accordions, icon assets, 2-column photo heroes, source section background colors), GATES it through `validate_artifacts`, installs `patterns\u002Fpage-\u003Cslug>.php` + `templates\u002Fpage-\u003Cslug>.html` (+ `front-page.html` for home), and forces a pattern re-scan so it renders immediately. It reconstructs each page from its OWN specs — no shared cluster skeleton — so heterogeneous pages don't depend on a matching representative.\n\n**This replaces the cluster-representative-only reconstruction.** Do NOT leave non-representative pages rendering carried `wp:post-content` through `page.html` — that renders raw source-platform HTML and looks drastically different from the source. Every content page gets reconstructed. A page whose pattern FAILS the gate is reported (not installed) — fix the tooling\u002Fspec, never ship carried HTML as the \"faithful\" answer.\n\n**core\u002Fhtml verbatim fallback (per-section, renderer-emitted).** Inside `reconstructPagePattern`, each section's structured render is checked for content loss (`measureSectionCoverage`): if a captured image is dropped, or rendered text coverage falls below `TEXT_FLOOR` (0.5), the renderer emits the section's sanitized source HTML as a `core\u002Fhtml` island instead (`html-fallback.ts`) and records an `html-fallback#\u003Cn>` flag. This preserves content the structured path would otherwise silently drop ([[feedback_never_lose_source_content]]) — the provenance gate guards against INVENTED text, NOT DROPPED text. **The trigger is deliberately conservative (only when badly broken) because an island carries the source HTML but NOT its CSS, so a CSS-styled section renders UNSTYLED inside it — worse than an incomplete-but-styled structured render.** Surfaced as `run-report.htmlFallbackSections` (a warning, not a pass\u002Ffail): in QA, vision-check each island — text-heavy sections render fine verbatim, but a CSS-layout section that fell back will look unstyled and should be treated as a fidelity gap. Note: coverage measures text PRESENCE, not semantic correctness — a paragraph mis-rendered as a heading still \"covers\" its text and won't trip the fallback.\n\n**Legacy cluster-skeleton path (`liberate_compose_instantiate` + `compose-page-blocks`):** superseded for page faithfulness by `liberate_reconstruct_pages`. Clustering (Step 2) is still useful for identifying sitewide-shared chrome and for posts\u002Fproducts *templates*, but page CONTENT is reconstructed per-page. Only fall back to compose-instantiate if `liberate_reconstruct_pages` is unavailable.\n\n**Header\u002Ffooter:** reconstruct the header from the SOURCE header — never from WordPress's page list. The deterministic `liberate_theme_scaffold` handler does this for you: it reads the captured `html\u002Fhomepage.html`, extracts the real **logo image** + the **primary top-level nav** (label + href) via `extractThemeChromeFromHtml`, infers light\u002Fdark header tone, and emits explicit `wp:navigation-link`s + a `core\u002Fimage` logo. Requirements for any header you build or refine:\n\n- **Logo:** use the source's real logo image (`\u003Cheader>`'s logo `\u003Cimg>`\u002FSVG — NOT a product image, NOT `wp:site-title` text). Fall back to `wp:site-title` only when no logo image exists.\n- **Nav:** explicit `wp:navigation-link`s for the source's **top-level primary menu only** (e.g. Shopify `nav.header__inline-menu` top-level items). NEVER use `wp:page-list` — it dumps every published WP page (Sample Page, Checkout, account, recall notices) as junk. Drop mega-menu sub-links, the mobile-drawer duplicate, and social\u002Faccount\u002Fcart\u002Fsearch affordances. Map nav items to local pages where they exist; keep external destinations (e.g. Support→Zendesk) as-is.\n- **Announcement bar:** preserve the source's top announcement\u002Futility bar when present.\n\nBuild the footer from the cluster representative's footer spec. Write both to `theme\u002Fparts\u002Fheader.html` and `theme\u002Fparts\u002Ffooter.html`.\n\n**Self-host source fonts:** `liberate_theme_scaffold` parses `@font-face` rules from the captured HTML\u002FCSS, downloads the referenced font files into the theme `assets\u002Ffonts\u002F`, emits matching `@font-face` rules into `style.css`, and binds the captured family in `theme.json` `settings.typography.fontFamilies` (with `fontFace[]`). This is generic — it captures whatever the source self-hosts (e.g. getsnooz.com loads **Larsseit** from the Shopify CDN), not a hardcoded list. The display\u002Fheading family is rebound to the real captured typeface even when `design-foundation.json` recorded an open *substitute* (e.g. \"Poppins, sans-serif\" → corrected back to self-hosted Larsseit). Never leave headings\u002Fbody in a system fallback when the source's font is self-hostable. Bogus captured line-heights (`0` \u002F `0px`) are sanitized to a sane default.\n\n**Posts:** render through `templates\u002Fsingle.html` + blog\u002Farchive template + Query Loop. No per-post section reconstruction.\n\n**Products:** render through `templates\u002Fsingle-product.html` + `templates\u002Farchive-product.html` + WooCommerce. No per-product section reconstruction.\n\nAssemble all theme files into a single in-memory array for install:\n\n```ts\nthemeFiles: [\n  { relativePath: \"style.css\", content: \"\u002F* Theme Name: ... *\u002F\" },\n  { relativePath: \"theme.json\", content: \"...\" },\n  { relativePath: \"functions.php\", content: \"\u003C?php ...\" },\n  { relativePath: \"templates\u002Findex.html\", content: \"\u003C!-- wp:... -->\" },\n  { relativePath: \"templates\u002Fpage.html\", content: \"...\" },\n  { relativePath: \"templates\u002Fsingle.html\", content: \"...\" },\n  { relativePath: \"templates\u002Fsingle-product.html\", content: \"...\" },\n  { relativePath: \"templates\u002Farchive-product.html\", content: \"...\" },\n  { relativePath: \"parts\u002Fheader.html\", content: \"...\" },\n  { relativePath: \"parts\u002Ffooter.html\", content: \"...\" },\n  { relativePath: \"patterns\u002F\u003Ccluster-slug>.php\", content: \"\u003C?php \u002F** Title: ... *\u002F ?> ...\" },\n  \u002F\u002F ...one pattern file per cluster representative's built layout skeleton\n]\n```\n\nCustom blocks (rare — only when core blocks cannot express a real source interactive component) embed in the theme as `blocks\u002F\u003Cslug>\u002Fsrc\u002F` + `blocks\u002F\u003Cslug>\u002Fbuild\u002F`. Register from `build\u002F` in `functions.php` via `register_block_type`. Emit both `src\u002F` and `build\u002F` in `themeFiles[]`. Namespace: `\u003CsiteSlug>-replica\u002F\u003Cblock-name>`. Use `\"supports\": { \"html\": false }` and `\"apiVersion\": 3`.\n\n### Step 6 — Validate\n\n`liberate_reconstruct_pages` ALREADY gates every page through `validate_artifacts` against that page's own spec corpus and refuses to install a failing page — that is the authoritative trust boundary and it ran in Step 5. For an independent on-disk sweep, run `scripts\u002F_validate.ts \u003CoutputDir>` (auto-discovers `theme\u002Fpatterns\u002F*.php`). Its security\u002Finjection\u002Fdrift checks are exact; its provenance check is APPROXIMATE (corpus from `html\u002F\u003Cslug>.html`) and can FALSE-POSITIVE when the renderer concatenated text across source elements — verify any provenance flag against the source before treating it as real. The raw `liberate_validate_artifacts` MCP tool takes `{ patterns: ArtifactPattern[] }` (not `{ outputDir }`).\n\nIt asserts:\n- All source-derived text is escaped (`esc_html`\u002F`esc_attr`\u002F`esc_url`)\n- No raw `\u003C?php` \u002F `\u003Cscript>` \u002F `on*=` handlers in emitted markup (PHP injection + stored XSS defense)\n- Emitted text is a subset of spec captured text (provenance — flags invented prose)\n- No remote CDN URLs (all assets must be uploaded WP-library URLs or theme-shipped `assets\u002F`)\n- No unresolved `{{placeholder}}` text\n- Block-comment-only markup\n\n**Fail → fix the patterns\u002Ftemplates, do not install.** Gate failures surface in `run-report.json`.\n\n### Step 7 — Install + QA\n\n**Blockify post\u002Fpage bodies (blocks path only):** BEFORE importing, call `liberate_blockify_wxr({ outputDir })`. It rewrites every post\u002Fpage `content:encoded` body in `output.wxr` through the source adapter's block recipe (seam 2) so imported posts land as editable Gutenberg blocks instead of one Classic block (e.g. Squarespace `sqs-block` bodies). No-op when the platform adapter has no recipe (`skipped:true`); lossless otherwise — bodies it can't convert stay verbatim, and attachments\u002Fnav\u002Fterms are untouched. It mutates `output.wxr` in place, so it MUST run before the import below. (Blog posts are imported as-is — not section-reconstructed — so this is the only thing that blockifies their bodies. The theme\u002Fcarry path never calls this.)\n\n**Install:**\n\n- **Streaming \u002F watch-loop context:** call `liberate_install_theme({ outputDir, studioSitePath, themeFiles, themeSlug })` using the exact `themeSlug` value from the runner prompt. Writes files into the running Studio site and activates. No site creation, no duplicate WXR import.\n- **Standalone replicate:** call `liberate_preview({ outputDir, themeFiles, themeSlug: \"\u003CsiteSlug>-replica\" })`. Creates\u002Freuses a Studio site (clean site on full re-run; keep existing on resume) and imports `output.wxr` + `products.csv`.\n\n**Binary assets:** `themeFiles[]` is text-only — the self-hosted fonts (`.woff2`), localized `logo.png`, and icon SVGs live on disk at `\u003CoutputDir>\u002Ftheme\u002Fassets\u002F` (written by `liberate_theme_scaffold persist:true`). Both `liberate_install_theme` and `liberate_preview` now bridge them via `assetSourceDir`. If you install by some other path (e.g. a manual copy), you MUST also copy `\u003CoutputDir>\u002Ftheme\u002Fassets\u002F` into the live theme or the replica renders with system fonts and a broken logo.\n\n**Reconstruct order:** `liberate_reconstruct_pages` requires the theme already installed in the live Studio site, so install (above) FIRST, then run Step 5's reconstruct against the resulting `studioSitePath` (`~\u002FStudio\u002F\u003CsiteName>`). `liberate_preview` returns `siteName`, not the path.\n\nVerify: `themeWritten > 0` and `warnings` empty. Capture the replica URL.\n\n**Site hygiene (verify after install — the WXR imports onto a fresh WP install):**\n- **Static front page.** `liberate_reconstruct_pages` sets `show_on_front=page` + `page_on_front` to the `isHome` page. Confirm `wp option get show_on_front` == `page`; otherwise `\u002F` renders the blog index, not the homepage reconstruction.\n- **WP-default junk + slug collisions.** A fresh WP install ships `Sample Page`, a `Hello world!` post, and an auto-drafted `Privacy Policy`. The default `privacy-policy` draft STEALS the slug, forcing the source privacy page to import as `privacy-policy-2` — which then mismatches the `slug` you pass to `reconstruct_pages` (it would write the reconstruction into the wrong post). `startStudioPreview` deletes these defaults before import; if you import some other way, delete them first (`wp post delete` by slug `sample-page`\u002F`hello-world`\u002F`privacy-policy`) and confirm imported pages kept their source slugs (`wp post list --post_type=page --fields=ID,post_name`).\n\n**QA:** run `liberate_compare` to write comparison.json (v2) with per-viewport height metrics, then invoke `design-qa` with the replica screenshots directory passed as `replicaShotsDir` so the parity gate can use the comparison data. `design-qa` captures replica desktop + mobile screenshots, pairs them with source screenshots, runs the responsiveness gate (390px — HARD: no horizontal overflow, sections reflow), and produces qualitative observations + A\u002FB\u002FC classification per archetype representative.\n\n- **Responsiveness gate is hard.** A theme that overflows at 390px fails, full stop.\n- **Grade EVERY page, not just one representative per archetype** — the user sees every page, and a cluster's non-rep members can differ sharply from its rep. QA must screenshot + classify each reconstructed page.\n- **A page rendering carried `wp:post-content` (raw source-platform HTML) through `page.html` is a FAIL (C), never a B\u002F\"pass-with-notes\".** It is not a faithful reconstruction — it is the absence of one. The overall verdict cannot be \"pass\" while any content page is carried-HTML; fix it by running that page through `liberate_reconstruct_pages`.\n- **Visual parity is a hard gate.** Every content-page section gets a measured `SectionParity` record; any unaccepted `divergent` section (flattened columns, wrong band color, dropped media, unstyled island) keeps the run at `fail`. Pixel-diff is a forces-inspection signal, not the gate value.\n- Between iterations, climb the escalation ladder (R1 CSS → R2 rebuild block markup → R3 re-extract spec → R4 styled rebuild) — each iteration a STRONGER rung, not the same tweak; reinstall via `liberate_install_theme`; re-run `design-qa`.\n- **3 iterations is a circuit-breaker checkpoint, not an exit.** If the ladder is exhausted without `match`, do NOT log-and-ship: stop and ask the operator (raise budget · accept-with-sign-off · abandon page). Only an operator `acceptance: { by: 'human', proof }` (or a Class-C constraint with sampled-pixel proof) lets a `divergent` section ship; everything else stays `fail`. A larger foundation problem may still warrant amending `design.md` + re-running `creating-themes` (full invalidation) as one rung.\n\n**Return** a structured summary to the caller:\n\n```json\n{\n  \"siteSlug\": \"example-com-replica\",\n  \"themeSlug\": \"example-com-replica\",\n  \"target\": { \"kind\": \"studio\", \"siteId\": \"...\", \"url\": \"https:\u002F\u002Fexample-com-replica.wp.local\" },\n  \"archetypes\": [\"homepage\", \"page\", \"post\", \"product\"],\n  \"clustersBuilt\": 5,\n  \"clustersFailed\": 0,\n  \"misfitPages\": [],\n  \"qa\": { \"responsivePass\": true, \"qualitative\": \"B\", \"itersUsed\": 2 },\n  \"openQuestions\": [],\n  \"runReport\": \"\u003CoutputDir>\u002Frun-report.json\"\n}\n```\n\n## Gates summary\n\n| Gate | When | Hard? |\n|---|---|---|\n| Build gate (theme.json schema v3 + lintThemeJson activation fatals) | After step 1 | Yes — fix before continuing |\n| Per-cluster readiness check (specs complete before builder dispatch) | Before step 4 | Yes — fix spec, don't dispatch |\n| Builder envelope validation (parseBuilderEnvelope) | After step 4 each builder | Yes — retry → sequential, never use partial |\n| validate-artifacts (escaping + provenance + injection + placeholders) | Step 6, before every install | Yes — fix, don't install |\n| Responsiveness gate (390px, no overflow, sections reflow) | Step 7 QA | Hard — fail = not done |\n| Visual-parity gate (measured `SectionParity` per section; verdict via `buildRunReport`) | Step 7 QA | **Hard** — any unaccepted `divergent` section, or a reconstructed page with no sampled sections, = `fail` |\n| Qualitative observations (typography nuance, micro-spacing) | Step 7 QA | Soft — surfaced, not blocking |\n\n## Decision rules\n\n- **Never claim a match you haven't measured.** Default to skepticism. \"Matches\" \u002F \"looks good\" \u002F \"close enough\" \u002F \"strong parity\" are STOP signs — open source vs replica, sample pixels, and itemize the concrete differences (lead with what's WRONG) before any positive claim. When the operator says it doesn't match, they're right: apologize, re-measure brutally, list every gap, fix, re-measure. Under-claim and keep working; never over-claim and stop. (Full rule in `design-qa` SKILL → \"Honesty discipline.\")\n- **Keep all guidance and code GENERIC.** Reconstruction logic, classifiers, and skill rules must work for ANY source site — derive everything from the captured artifacts (specs, screenshots, computed styles), never hardcode a site's colors, image filenames, copy, or section order. A one-off hand-patch to make a single site look right is not a fix; the fix lives in the generic pipeline.\n- **Trust `design-foundation.json`** for tokens. Don't reinterpret colors from raw palette. Don't hallucinate a display font when `typography.families.display: null`.\n- **Reach parity with core blocks + SCOPED THEME CSS — this is the primary parity lever, not optional polish.** Core-block *attributes* alone cannot express many bespoke source sections (overlapping\u002Fpositioned hero, circular icon rows, colored pill-tag rows, two-tone split rows, exact band colors at exact positions, gapless full-bleed stacking). The answer is NOT to flatten to an approximate generic layout and call it \"close.\" It is: keep the structure + content in editable core blocks, give the section (or block) a stable `className` (e.g. `specialty-grid`, `pill-row`, `is-replica-card`), and add a **scoped CSS rule in `style.css`** (enqueued via `functions.php`) that reproduces the source's exact treatment (shape, position, size, color, spacing). Blocks stay editable; CSS closes the pixel gap. A per-block `className` + theme CSS rule is the sanctioned way to pixel-match — use it whenever attributes fall short, every time, rather than settling. (This is distinct from hand-authored `core\u002Fhtml`, which is still banned — see below. CSS in `style.css` is encouraged; `\u003Cstyle>`\u002Fmarkup soup in content is not.)\n- **Drive every divergent section to `match` — do not stop at \"improved.\"** If a section doesn't match the source, climb the ladder (R1 token\u002FCSS → R2 rebuild block markup → R3 re-extract spec → R4 styled rebuild: core blocks + a scoped `style.css` rule) and re-measure until it matches. The 3-iteration checkpoint exists to ask for more BUDGET, not as license to ship a divergence. Reaching parity is the default expectation; you should not need to ask the operator whether to proceed to parity — proceed.\n- **Prefer core blocks for STRUCTURE.** `wp:columns`, `wp:cover`, `wp:group`, `wp:buttons`, `wp:details`, `wp:navigation` cover most observed layouts; pair them with theme CSS for exact visuals (above).\n- **Common bespoke section recipes (block + CSS), so they don't flatten:**\n  - *Full-bleed hero* (image + overlay headline) → `wp:cover` (image as `url`, `dimRatio` overlay, inner heading in `text-inverse`). NEVER a `wp:group` with a flat dark `background-color` + a `text-default` heading (that renders an invisible black-on-black title). If the captured hero `\u003Cimg>` src is empty, recover it from the page's largest captured image \u002F media library and build the cover from that.\n  - *Numbered\u002Ffeature card row* → `wp:columns` of equal-height `wp:column`s, each a `wp:group.is-replica-card` (number + title + desc + `wp:button`). Match the source card background (often white\u002Fnone — don't over-tint).\n  - *Circular icon\u002Fspecialty row* → `wp:columns`; each item a `wp:group` with `className:\"...-disc\"` + a token background, sized to a circle via `style.css` (`width\u002Fheight` + `border-radius:50%`), label paragraph below.\n  - *Pill \u002F tag row* → `wp:buttons` with each `wp:button` border-radius `999px` + a token background, OR styled groups; row class for `flex-wrap` + gap in `style.css`.\n  - *Two-tone split row* (e.g. peach block │ photo │ coral block) → `wp:columns` with per-column `backgroundColor` tokens — one color per column, not one tint for the whole section.\n  - *Gapless full-bleed bands* → every section group zeroes its own top\u002Fbottom margin; rhythm comes from each section's captured padding (so colored bands butt edge-to-edge).\n- **No hand-authored `core\u002Fhtml`.** Never reach for `wp:html` to express layout or CSS — CSS goes in `style.css` (encouraged, per the parity rule above); structure goes in core block markup. The ONLY `wp:html` that ships is the automatic coverage-gated verbatim fallback (below), which the renderer emits — not you.\n- **One layout skeleton per cluster, not per page.** Builders emit layout templates; `liberate_compose_instantiate` fills content.\n- **Posts and products are data.** Route through templates + Query Loop + WooCommerce. No per-post or per-product section reconstruction.\n- **Skip archetypes with `count === 0`** silently.\n- **Skip count=0 archetypes** and do not build templates for hypothetical content types.\n- **Sitewide sections (header, footer, recurring CTA bands) are built once** and deduped before builder dispatch.\n- **Builders are pure.** They never write to disk — only return strings. The orchestrator persists and marks built.\n- **Budget guard:** a run exceeding the configurable subagent\u002Fcluster\u002Felapsed ceiling pauses and asks the operator rather than running away.\n\n## Anti-patterns\n\n- **Picking and tweaking from the 27-pattern library directly.** The 27-pattern library is now seed material folded into the `section-mapping` catalog. Builders read `section-mapping.md` and `spec-files.md`. Do not reach back to `skills\u002Freplicate-with-blocks\u002Freferences\u002Fpatterns\u002F`.\n- **Generating patterns from scratch without a catalog match.** Check `section-mapping.md` first. Fresh generation is the last resort.\n- **Reading WXR `\u003Cwp:post_content>` and recreating it as blocks.** Content transformation is out of scope. The theme renders what's already in WXR; it doesn't reconstruct it.\n- **Generating a pleasant generic theme.** A clean generic layout is failure when the source has a different section order, grid, spacing, media treatment, header, footer, or responsive stack.\n- **Hallucinating tokens.** `display: null` → omit, don't invent. No hex values in patterns — always token slugs.\n- **Running `liberate_validate_artifacts` and ignoring failures.** The gate is a trust boundary. Failures mean injected\u002Finvented text could reach the installed theme.\n- **Skipping the responsiveness gate.** A theme that overflows at 390px is not done, regardless of how it looks on desktop.\n- **Documenting a layout divergence as a \"known gap\" and shipping it.** A flattened section, wrong band color, or dropped grid is not a gap to log — it is work to do. Climb the escalation ladder (R1→R4) or escalate to the operator. \"Known gap\" \u002F \"where it falls short\" is an escalation trigger, never the terminal state of a shipped run.\n- **Emitting a verdict not backed by the sampled `SectionParity` table.** \"Looks good\" \u002F \"honest rundown\" prose cannot move a `divergent` section to pass. A reconstructed page with no sampled sections is `fail (unverified)`, not a pass — measure, don't assert.\n- **Hand-authored Custom HTML for layout or CSS.** Inline `\u003Cstyle>`, raw SVG sets, embedded `\u003Cscript>`, hidden `\u003Cform>` → all rejected. Use core blocks + `style.css` or a real theme-embedded custom block. (The automatic coverage-gated verbatim fallback is the one exception — it is renderer-emitted and sanitized, never hand-written.)\n- **Custom blocks for layout-only differences.** If the only issue is \"columns aren't quite right,\" edit the layout skeleton instead. Custom blocks are for interactive components that core blocks genuinely cannot express (multi-step form, non-standard carousel with computed state, pricing table with toggles). If the source's interactivity didn't survive extraction, use core blocks + honest static content — not a non-functional custom block.\n- **Telex-flavored output.** Footer credits, plugin namespaces, and author fields use `\u003CsiteSlug>-replica`, not `telex\u002F`.\n\n## Reference files\n\nRead these when the relevant step comes up — not all are needed on every run:\n\n- **`skills\u002Fgenerating-patterns\u002Freferences\u002Fsection-mapping.md`** — interaction-model → WP block template catalog; brightness rule, gradient rule, divider rule, styling rule. Read in step 4 before dispatching builders.\n- **`skills\u002Fgenerating-patterns\u002Freferences\u002Fspec-files.md`** — the spec file contract (template, field definitions, media note). Read in step 3 when writing or auditing specs.\n- **`skills\u002Fdesign-foundations\u002Freferences\u002Fdesign-brief.md`** — the `design.md` 10-section template; what each section fills from, lifecycle. Read in step 1 if `design-foundations` is being invoked.\n- **`skills\u002Fdesign-foundations\u002Freferences\u002Ftheme-tokens.md`** — token-role → theme.json mapping detail. Read in step 1 when token mapping is ambiguous.\n- **`skills\u002Fdesign-qa\u002Freferences\u002Fvisual-qa.md`** — QA loop mechanics, failure classes A\u002FB\u002FC, iteration budget, run-report output. Read in step 7 before invoking `design-qa`.\n- **`skills\u002Freplicate-with-blocks\u002Fstyling-priority.md`** — the preset→patch→instance→variation→layout→CSS cascade, the structured-props cheat sheet, and the hard bans (no raw style=\"\" attrs, no invented className CSS hooks). Applies to native block output; core\u002Fhtml islands exempt.\n",{"data":37,"body":47},{"name":4,"description":6,"allowed-tools":38,"disable-model-invocation":46},[39,40,41,42,43,44,45],"Bash","Read","Write","Edit","Glob","Grep","AskUserQuestion",true,{"type":48,"children":49},"root",[50,59,82,180,185,284,291,318,435,475,481,486,827,833,838,992,1158,1164,1264,1271,1293,1374,1398,1494,1550,1558,1810,1846,1852,1879,1899,1911,1917,1943,2002,2012,2104,2138,2143,2149,2154,2290,2303,2323,2342,2347,2416,2451,2471,2505,2517,2523,2590,2616,2687,2732,2795,2889,2906,3010,3028,3052,3057,3745,3830,3836,3898,3903,3987,4004,4010,4066,4074,4131,4209,4255,4275,4283,4457,4497,4656,4666,5232,5238,5419,5425,6016,6022,6268,6274,6279,6384],{"type":51,"tag":52,"props":53,"children":55},"element","h1",{"id":54},"replicate",[56],{"type":57,"value":58},"text","Replicate",{"type":51,"tag":60,"props":61,"children":62},"p",{},[63,65,71,73,80],{"type":57,"value":64},"You are a ",{"type":51,"tag":66,"props":67,"children":68},"strong",{},[69],{"type":57,"value":70},"design sub-orchestrator",{"type":57,"value":72},". You drive the spec-driven whole-site block-reconstruction flow, delegating judgment to the composable skills below and determinism to MCP tools, then assembling and validating what they return. The ",{"type":51,"tag":74,"props":75,"children":77},"code",{"className":76},[],[78],{"type":57,"value":79},"\u002Fliberate",{"type":57,"value":81}," root orchestrator calls you inline; you are also independently invocable to re-theme an already-extracted site.",{"type":51,"tag":83,"props":84,"children":85},"blockquote",{},[86],{"type":51,"tag":60,"props":87,"children":88},{},[89,94,96,101,103,109,111,117,119,125,127,132,134,140,142,148,149,155,157,163,165,171,173,178],{"type":51,"tag":66,"props":90,"children":91},{},[92],{"type":57,"value":93},"Entry contract.",{"type":57,"value":95}," Dispatched by ",{"type":51,"tag":74,"props":97,"children":99},{"className":98},[],[100],{"type":57,"value":79},{"type":57,"value":102}," after extraction — the ",{"type":51,"tag":74,"props":104,"children":106},{"className":105},[],[107],{"type":57,"value":108},"siteDir",{"type":57,"value":110}," from ",{"type":51,"tag":74,"props":112,"children":114},{"className":113},[],[115],{"type":57,"value":116},"liberate_paths",{"type":57,"value":118}," is the resolved ",{"type":51,"tag":74,"props":120,"children":122},{"className":121},[],[123],{"type":57,"value":124},"\u003CoutputDir>",{"type":57,"value":126},". ",{"type":51,"tag":66,"props":128,"children":129},{},[130],{"type":57,"value":131},"Assume it already holds the capture",{"type":57,"value":133}," (",{"type":51,"tag":74,"props":135,"children":137},{"className":136},[],[138],{"type":57,"value":139},"output.wxr",{"type":57,"value":141},", ",{"type":51,"tag":74,"props":143,"children":145},{"className":144},[],[146],{"type":57,"value":147},"html\u002F*.html",{"type":57,"value":141},{"type":51,"tag":74,"props":150,"children":152},{"className":151},[],[153],{"type":57,"value":154},"screenshots\u002Fmanifest.json",{"type":57,"value":156},", media). If they're missing\u002Fincomplete, STOP and tell the operator to run ",{"type":51,"tag":74,"props":158,"children":160},{"className":159},[],[161],{"type":57,"value":162},"\u002Fliberate \u003Curl>",{"type":57,"value":164}," first; do not capture here. (Note: the ",{"type":51,"tag":74,"props":166,"children":168},{"className":167},[],[169],{"type":57,"value":170},"src\u002Flib\u002Freplicate\u002F",{"type":57,"value":172}," library namespace is shared plumbing, distinct from this skill's name ",{"type":51,"tag":74,"props":174,"children":176},{"className":175},[],[177],{"type":57,"value":4},{"type":57,"value":179},".)",{"type":51,"tag":60,"props":181,"children":182},{},[183],{"type":57,"value":184},"The acceptance bar is source parity, not a pleasant approximation:",{"type":51,"tag":186,"props":187,"children":188},"ul",{},[189,195,200,205,271],{"type":51,"tag":190,"props":191,"children":192},"li",{},[193],{"type":57,"value":194},"Preserve observed section order, header\u002Ffooter structure, navigation labels, CTA placement, media placement\u002Faspect ratios, column counts, alignment, spacing rhythm, and responsive stacking.",{"type":51,"tag":190,"props":196,"children":197},{},[198],{"type":57,"value":199},"Use source text and uploaded media only. Do not invent copy, placeholder cards, stock-like sections, or generic marketing layouts.",{"type":51,"tag":190,"props":201,"children":202},{},[203],{"type":57,"value":204},"Templates render imported post\u002Fproduct content through proper WP template hierarchy; patterns and layout skeletons are for pages. Do not reconstruct posts or products section-by-section — that is handled by templates + Query Loop + WooCommerce.",{"type":51,"tag":190,"props":206,"children":207},{},[208,210,216,218,224,226,232,234,239,241,247,248,254,256,261,263,269],{"type":57,"value":209},"Do not hand-author Custom HTML blocks (",{"type":51,"tag":74,"props":211,"children":213},{"className":212},[],[214],{"type":57,"value":215},"core\u002Fhtml",{"type":57,"value":217}," \u002F ",{"type":51,"tag":74,"props":219,"children":221},{"className":220},[],[222],{"type":57,"value":223},"wp:html",{"type":57,"value":225},") for layout or styling. Use core blocks first; embed a custom block inside the theme (",{"type":51,"tag":74,"props":227,"children":229},{"className":228},[],[230],{"type":57,"value":231},"blocks\u002F\u003Cslug>\u002F",{"type":57,"value":233},") only when a source component cannot be expressed any other way (see anti-patterns). ",{"type":51,"tag":66,"props":235,"children":236},{},[237],{"type":57,"value":238},"One sanctioned exception:",{"type":57,"value":240}," the deterministic per-section ",{"type":51,"tag":242,"props":243,"children":244},"em",{},[245],{"type":57,"value":246},"coverage-gated verbatim fallback",{"type":57,"value":133},{"type":51,"tag":74,"props":249,"children":251},{"className":250},[],[252],{"type":57,"value":253},"src\u002Flib\u002Freplicate\u002Fhtml-fallback.ts",{"type":57,"value":255},") emits a section's sanitized source HTML as a ",{"type":51,"tag":74,"props":257,"children":259},{"className":258},[],[260],{"type":57,"value":215},{"type":57,"value":262}," island when the structured render would otherwise DROP content — see \"core\u002Fhtml fallback\" below. You never author these by hand; ",{"type":51,"tag":74,"props":264,"children":266},{"className":265},[],[267],{"type":57,"value":268},"reconstructPagePattern",{"type":57,"value":270}," emits them automatically when a render is badly lossy.",{"type":51,"tag":190,"props":272,"children":273},{},[274,276,282],{"type":57,"value":275},"The old 27-pattern library is now seed material in the ",{"type":51,"tag":74,"props":277,"children":279},{"className":278},[],[280],{"type":57,"value":281},"section-mapping",{"type":57,"value":283}," catalog — it is not the primary mechanism. Builders pick block templates from the catalog; they do not pick-tweak from the 27-pattern library.",{"type":51,"tag":285,"props":286,"children":288},"h2",{"id":287},"prerequisites",[289],{"type":57,"value":290},"Prerequisites",{"type":51,"tag":60,"props":292,"children":293},{},[294,296,302,304,309,311,316],{"type":57,"value":295},"Confirm these exist in ",{"type":51,"tag":74,"props":297,"children":299},{"className":298},[],[300],{"type":57,"value":301},"\u003CoutputDir>\u002F",{"type":57,"value":303}," (the resolved site dir from ",{"type":51,"tag":74,"props":305,"children":307},{"className":306},[],[308],{"type":57,"value":116},{"type":57,"value":310}," \u002F provided ",{"type":51,"tag":74,"props":312,"children":314},{"className":313},[],[315],{"type":57,"value":108},{"type":57,"value":317},") before starting:",{"type":51,"tag":186,"props":319,"children":320},{},[321,353,371,381,400,410],{"type":51,"tag":190,"props":322,"children":323},{},[324,330,332,338,339,344,346,351],{"type":51,"tag":74,"props":325,"children":327},{"className":326},[],[328],{"type":57,"value":329},"design-foundation.json",{"type":57,"value":331}," — produced by ",{"type":51,"tag":74,"props":333,"children":335},{"className":334},[],[336],{"type":57,"value":337},"design-foundations",{"type":57,"value":126},{"type":51,"tag":66,"props":340,"children":341},{},[342],{"type":57,"value":343},"Required.",{"type":57,"value":345}," If missing, stop and tell the caller to run ",{"type":51,"tag":74,"props":347,"children":349},{"className":348},[],[350],{"type":57,"value":337},{"type":57,"value":352}," first.",{"type":51,"tag":190,"props":354,"children":355},{},[356,362,364,369],{"type":51,"tag":74,"props":357,"children":359},{"className":358},[],[360],{"type":57,"value":361},"design.md",{"type":57,"value":363}," — frozen brief from ",{"type":51,"tag":74,"props":365,"children":367},{"className":366},[],[368],{"type":57,"value":337},{"type":57,"value":370},". Required (written in the same step).",{"type":51,"tag":190,"props":372,"children":373},{},[374,379],{"type":51,"tag":74,"props":375,"children":377},{"className":376},[],[378],{"type":57,"value":147},{"type":57,"value":380}," — rendered HTML per page from the capture stage. If missing, stop: the screenshot\u002FHTML capture stage was skipped. Re-run extraction with screenshots enabled.",{"type":51,"tag":190,"props":382,"children":383},{},[384,390,392,398],{"type":51,"tag":74,"props":385,"children":387},{"className":386},[],[388],{"type":57,"value":389},"screenshots\u002Fdesktop\u002F*.png",{"type":57,"value":391}," + ",{"type":51,"tag":74,"props":393,"children":395},{"className":394},[],[396],{"type":57,"value":397},"screenshots\u002Fmobile\u002F*.png",{"type":57,"value":399}," — for verification and QA.",{"type":51,"tag":190,"props":401,"children":402},{},[403,408],{"type":51,"tag":74,"props":404,"children":406},{"className":405},[],[407],{"type":57,"value":154},{"type":57,"value":409}," — URL → file map.",{"type":51,"tag":190,"props":411,"children":412},{},[413,418,420,426,427,433],{"type":51,"tag":74,"props":414,"children":416},{"className":415},[],[417],{"type":57,"value":139},{"type":57,"value":419}," — and optionally ",{"type":51,"tag":74,"props":421,"children":423},{"className":422},[],[424],{"type":57,"value":425},"products.jsonl",{"type":57,"value":217},{"type":51,"tag":74,"props":428,"children":430},{"className":429},[],[431],{"type":57,"value":432},"products.csv",{"type":57,"value":434}," for Woo sites.",{"type":51,"tag":60,"props":436,"children":437},{},[438,444,445,451,453,459,461,466,468,473],{"type":51,"tag":74,"props":439,"children":441},{"className":440},[],[442],{"type":57,"value":443},"palette.json",{"type":57,"value":141},{"type":51,"tag":74,"props":446,"children":448},{"className":447},[],[449],{"type":57,"value":450},"typography.json",{"type":57,"value":452},", and ",{"type":51,"tag":74,"props":454,"children":456},{"className":455},[],[457],{"type":57,"value":458},"breakpoints.json",{"type":57,"value":460}," (from screenshot aggregation) are consumed by ",{"type":51,"tag":74,"props":462,"children":464},{"className":463},[],[465],{"type":57,"value":337},{"type":57,"value":467}," and baked into ",{"type":51,"tag":74,"props":469,"children":471},{"className":470},[],[472],{"type":57,"value":329},{"type":57,"value":474},"; you do not read them directly.",{"type":51,"tag":285,"props":476,"children":478},{"id":477},"mcp-tools-you-call",[479],{"type":57,"value":480},"MCP tools you call",{"type":51,"tag":60,"props":482,"children":483},{},[484],{"type":57,"value":485},"Use these tools rather than reimplementing their logic in Bash. Each has a typed I\u002FO schema in the codebase.",{"type":51,"tag":487,"props":488,"children":489},"table",{},[490,509],{"type":51,"tag":491,"props":492,"children":493},"thead",{},[494],{"type":51,"tag":495,"props":496,"children":497},"tr",{},[498,504],{"type":51,"tag":499,"props":500,"children":501},"th",{},[502],{"type":57,"value":503},"Tool",{"type":51,"tag":499,"props":505,"children":506},{},[507],{"type":57,"value":508},"What it does",{"type":51,"tag":510,"props":511,"children":512},"tbody",{},[513,561,586,631,670,793,810],{"type":51,"tag":495,"props":514,"children":515},{},[516,526],{"type":51,"tag":517,"props":518,"children":519},"td",{},[520],{"type":51,"tag":74,"props":521,"children":523},{"className":522},[],[524],{"type":57,"value":525},"liberate_section_extract({ url|html, mediaMap, detail })",{"type":51,"tag":517,"props":527,"children":528},{},[529,535,537,543,545,551,553,559],{"type":51,"tag":74,"props":530,"children":532},{"className":531},[],[533],{"type":57,"value":534},"detail:\"signature\"",{"type":57,"value":536}," → ordered section-type sequence + structural attrs (all pages, off saved ",{"type":51,"tag":74,"props":538,"children":540},{"className":539},[],[541],{"type":57,"value":542},"html\u002F\u003Cslug>.html",{"type":57,"value":544},"); ",{"type":51,"tag":74,"props":546,"children":548},{"className":547},[],[549],{"type":57,"value":550},"detail:\"full\"",{"type":57,"value":552}," → ",{"type":51,"tag":74,"props":554,"children":556},{"className":555},[],[557],{"type":57,"value":558},"specs\u002F\u003Crep>\u002Fsection-\u003Cn>-\u003Ctype>.md",{"type":57,"value":560}," (computed styles, interaction model, uploaded WP media URLs, brightness, motion — reps only)",{"type":51,"tag":495,"props":562,"children":563},{},[564,573],{"type":51,"tag":517,"props":565,"children":566},{},[567],{"type":51,"tag":74,"props":568,"children":570},{"className":569},[],[571],{"type":57,"value":572},"liberate_cluster_pages({ outputDir, signatures })",{"type":51,"tag":517,"props":574,"children":575},{},[576,578,584],{"type":57,"value":577},"Groups pages by exact layout signature → ",{"type":51,"tag":74,"props":579,"children":581},{"className":580},[],[582],{"type":57,"value":583},"cluster-map.json",{"type":57,"value":585}," (cluster per unique signature, representative = richest HTML)",{"type":51,"tag":495,"props":587,"children":588},{},[589,598],{"type":51,"tag":517,"props":590,"children":591},{},[592],{"type":51,"tag":74,"props":593,"children":595},{"className":594},[],[596],{"type":57,"value":597},"liberate_reconstruct_pages({ outputDir, studioSitePath, themeSlug, pages })",{"type":51,"tag":517,"props":599,"children":600},{},[601,606,608,614,615,621,623,629],{"type":51,"tag":66,"props":602,"children":603},{},[604],{"type":57,"value":605},"PRIMARY page path.",{"type":57,"value":607}," Reconstructs EVERY content page from its OWN captured section specs (no shared cluster skeleton): per page → capture specs, download+install its media, reconstruct gated block markup, install ",{"type":51,"tag":74,"props":609,"children":611},{"className":610},[],[612],{"type":57,"value":613},"patterns\u002Fpage-\u003Cslug>.php",{"type":57,"value":391},{"type":51,"tag":74,"props":616,"children":618},{"className":617},[],[619],{"type":57,"value":620},"templates\u002Fpage-\u003Cslug>.html",{"type":57,"value":622}," (+ ",{"type":51,"tag":74,"props":624,"children":626},{"className":625},[],[627],{"type":57,"value":628},"front-page.html",{"type":57,"value":630}," for home), force a pattern re-scan. Replaces cluster-rep-only reconstruction + carried-HTML fallback",{"type":51,"tag":495,"props":632,"children":633},{},[634,643],{"type":51,"tag":517,"props":635,"children":636},{},[637],{"type":51,"tag":74,"props":638,"children":640},{"className":639},[],[641],{"type":57,"value":642},"liberate_compose_instantiate({ outputDir, skeleton, pageContent, mediaMap })",{"type":51,"tag":517,"props":644,"children":645},{},[646,648,654,656,662,664],{"type":57,"value":647},"LEGACY (superseded by ",{"type":51,"tag":74,"props":649,"children":651},{"className":650},[],[652],{"type":57,"value":653},"liberate_reconstruct_pages",{"type":57,"value":655}," for pages). Deterministic slot-fill: cluster layout skeleton + this page's content → ",{"type":51,"tag":74,"props":657,"children":659},{"className":658},[],[660],{"type":57,"value":661},"post_content",{"type":57,"value":663}," block markup; returns ",{"type":51,"tag":74,"props":665,"children":667},{"className":666},[],[668],{"type":57,"value":669},"{ postContent, misfit }",{"type":51,"tag":495,"props":671,"children":672},{},[673,682],{"type":51,"tag":517,"props":674,"children":675},{},[676],{"type":51,"tag":74,"props":677,"children":679},{"className":678},[],[680],{"type":57,"value":681},"liberate_validate_artifacts({ patterns: ArtifactPattern[] })",{"type":51,"tag":517,"props":683,"children":684},{},[685,687,693,695,701,702,708,710,716,717,723,724,730,732,738,740,761,763,768,770,776,778,784,786,791],{"type":57,"value":686},"Security + quality trust boundary. Asserts: escaping (",{"type":51,"tag":74,"props":688,"children":690},{"className":689},[],[691],{"type":57,"value":692},"esc_html",{"type":57,"value":694},"\u002F",{"type":51,"tag":74,"props":696,"children":698},{"className":697},[],[699],{"type":57,"value":700},"esc_attr",{"type":57,"value":694},{"type":51,"tag":74,"props":703,"children":705},{"className":704},[],[706],{"type":57,"value":707},"esc_url",{"type":57,"value":709},"), no raw ",{"type":51,"tag":74,"props":711,"children":713},{"className":712},[],[714],{"type":57,"value":715},"\u003C?php",{"type":57,"value":694},{"type":51,"tag":74,"props":718,"children":720},{"className":719},[],[721],{"type":57,"value":722},"\u003Cscript>",{"type":57,"value":694},{"type":51,"tag":74,"props":725,"children":727},{"className":726},[],[728],{"type":57,"value":729},"on*=",{"type":57,"value":731},", emitted text ⊆ spec captured text (provenance), no remote CDN URLs, no ",{"type":51,"tag":74,"props":733,"children":735},{"className":734},[],[736],{"type":57,"value":737},"{{placeholder}}",{"type":57,"value":739}," text, block-comment-only markup. ",{"type":51,"tag":66,"props":741,"children":742},{},[743,745,751,753,759],{"type":57,"value":744},"Takes ",{"type":51,"tag":74,"props":746,"children":748},{"className":747},[],[749],{"type":57,"value":750},"patterns",{"type":57,"value":752},", not ",{"type":51,"tag":74,"props":754,"children":756},{"className":755},[],[757],{"type":57,"value":758},"outputDir",{"type":57,"value":760},".",{"type":57,"value":762}," NOTE: ",{"type":51,"tag":74,"props":764,"children":766},{"className":765},[],[767],{"type":57,"value":653},{"type":57,"value":769}," already runs this gate per-page against each page's OWN spec corpus and refuses to install a failing page — that internal gate is AUTHORITATIVE. ",{"type":51,"tag":74,"props":771,"children":773},{"className":772},[],[774],{"type":57,"value":775},"scripts\u002F_validate.ts \u003CoutputDir>",{"type":57,"value":777}," is a convenience sweep over the on-disk ",{"type":51,"tag":74,"props":779,"children":781},{"className":780},[],[782],{"type":57,"value":783},"theme\u002Fpatterns\u002F*.php",{"type":57,"value":785},", but its provenance corpus is APPROXIMATE (sourced from ",{"type":51,"tag":74,"props":787,"children":789},{"className":788},[],[790],{"type":57,"value":542},{"type":57,"value":792},"), so it can emit provenance FALSE-POSITIVES (e.g. text the renderer concatenated across source elements). Treat its provenance flags as \"verify against the source,\" not as gate failures; security\u002Finjection\u002Fdrift checks are exact.",{"type":51,"tag":495,"props":794,"children":795},{},[796,805],{"type":51,"tag":517,"props":797,"children":798},{},[799],{"type":51,"tag":74,"props":800,"children":802},{"className":801},[],[803],{"type":57,"value":804},"liberate_install_theme({ outputDir, studioSitePath, themeFiles, themeSlug })",{"type":51,"tag":517,"props":806,"children":807},{},[808],{"type":57,"value":809},"Writes theme files into a running Studio site and activates the theme (streaming \u002F watch-loop context)",{"type":51,"tag":495,"props":811,"children":812},{},[813,822],{"type":51,"tag":517,"props":814,"children":815},{},[816],{"type":51,"tag":74,"props":817,"children":819},{"className":818},[],[820],{"type":57,"value":821},"liberate_preview({ outputDir, themeFiles, themeSlug, open?, port? })",{"type":51,"tag":517,"props":823,"children":824},{},[825],{"type":57,"value":826},"Standalone context: creates\u002Freuses a Studio site, imports WXR + products.csv, writes + activates the theme",{"type":51,"tag":285,"props":828,"children":830},{"id":829},"sub-skills-you-invoke",[831],{"type":57,"value":832},"Sub-skills you invoke",{"type":51,"tag":60,"props":834,"children":835},{},[836],{"type":57,"value":837},"Read each skill's SKILL.md before using it.",{"type":51,"tag":186,"props":839,"children":840},{},[841,886,930],{"type":51,"tag":190,"props":842,"children":843},{},[844,861,863,869,871,877,878,884],{"type":51,"tag":66,"props":845,"children":846},{},[847,853,855],{"type":51,"tag":74,"props":848,"children":850},{"className":849},[],[851],{"type":57,"value":852},"design-qa",{"type":57,"value":854}," is ",{"type":51,"tag":74,"props":856,"children":858},{"className":857},[],[859],{"type":57,"value":860},"disable-model-invocation: true",{"type":57,"value":862}," — the Skill tool will REFUSE to launch it. Do not try to \"invoke\" it; READ its ",{"type":51,"tag":74,"props":864,"children":866},{"className":865},[],[867],{"type":57,"value":868},"SKILL.md",{"type":57,"value":870}," and follow it inline in this shared context, driving its MCP tools (",{"type":51,"tag":74,"props":872,"children":874},{"className":873},[],[875],{"type":57,"value":876},"liberate_replicate_verify",{"type":57,"value":141},{"type":51,"tag":74,"props":879,"children":881},{"className":880},[],[882],{"type":57,"value":883},"evaluateResponsive",{"type":57,"value":885},") yourself.",{"type":51,"tag":190,"props":887,"children":888},{},[889,899,901,906,908,914,915,921,922,928],{"type":51,"tag":66,"props":890,"children":891},{},[892,897],{"type":51,"tag":74,"props":893,"children":895},{"className":894},[],[896],{"type":57,"value":337},{"type":57,"value":898}," is model-invocable",{"type":57,"value":900}," (a user may run it standalone), but in THIS flow you still run it inline for shared context — read its ",{"type":51,"tag":74,"props":902,"children":904},{"className":903},[],[905],{"type":57,"value":868},{"type":57,"value":907}," and drive ",{"type":51,"tag":74,"props":909,"children":911},{"className":910},[],[912],{"type":57,"value":913},"liberate_design_foundation_scaffold",{"type":57,"value":694},{"type":51,"tag":74,"props":916,"children":918},{"className":917},[],[919],{"type":57,"value":920},"_save",{"type":57,"value":694},{"type":51,"tag":74,"props":923,"children":925},{"className":924},[],[926],{"type":57,"value":927},"_validate",{"type":57,"value":929}," yourself.",{"type":51,"tag":190,"props":931,"children":932},{},[933,970,972,978,980,990],{"type":51,"tag":66,"props":934,"children":935},{},[936,942,943,949,950,956,957,963,965],{"type":51,"tag":74,"props":937,"children":939},{"className":938},[],[940],{"type":57,"value":941},"generating-patterns",{"type":57,"value":217},{"type":51,"tag":74,"props":944,"children":946},{"className":945},[],[947],{"type":57,"value":948},"compose-page-blocks",{"type":57,"value":217},{"type":51,"tag":74,"props":951,"children":953},{"className":952},[],[954],{"type":57,"value":955},"editing-themes",{"type":57,"value":217},{"type":51,"tag":74,"props":958,"children":960},{"className":959},[],[961],{"type":57,"value":962},"editing-blocks",{"type":57,"value":964}," are ALSO ",{"type":51,"tag":74,"props":966,"children":968},{"className":967},[],[969],{"type":57,"value":860},{"type":57,"value":971}," — you cannot ",{"type":51,"tag":74,"props":973,"children":975},{"className":974},[],[976],{"type":57,"value":977},"Skill",{"type":57,"value":979},"-launch them. Invoke each by ",{"type":51,"tag":66,"props":981,"children":982},{},[983,985],{"type":57,"value":984},"dispatching a subagent whose prompt points it at the skill's ",{"type":51,"tag":74,"props":986,"children":988},{"className":987},[],[989],{"type":57,"value":868},{"type":57,"value":991}," (the builder fan-out in Step 4 already works this way); the subagent reads the file and follows it. This matches the subagent-dispatch convention and keeps the workflow from stalling on a refused Skill call.",{"type":51,"tag":487,"props":993,"children":994},{},[995,1010],{"type":51,"tag":491,"props":996,"children":997},{},[998],{"type":51,"tag":495,"props":999,"children":1000},{},[1001,1005],{"type":51,"tag":499,"props":1002,"children":1003},{},[1004],{"type":57,"value":977},{"type":51,"tag":499,"props":1006,"children":1007},{},[1008],{"type":57,"value":1009},"When",{"type":51,"tag":510,"props":1011,"children":1012},{},[1013,1043,1082,1105,1121,1137],{"type":51,"tag":495,"props":1014,"children":1015},{},[1016,1024],{"type":51,"tag":517,"props":1017,"children":1018},{},[1019],{"type":51,"tag":74,"props":1020,"children":1022},{"className":1021},[],[1023],{"type":57,"value":337},{"type":51,"tag":517,"props":1025,"children":1026},{},[1027,1029,1034,1036,1041],{"type":57,"value":1028},"Step 1 — if ",{"type":51,"tag":74,"props":1030,"children":1032},{"className":1031},[],[1033],{"type":57,"value":329},{"type":57,"value":1035}," or ",{"type":51,"tag":74,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":57,"value":361},{"type":57,"value":1042}," are missing",{"type":51,"tag":495,"props":1044,"children":1045},{},[1046,1055],{"type":51,"tag":517,"props":1047,"children":1048},{},[1049],{"type":51,"tag":74,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":57,"value":1054},"creating-themes",{"type":51,"tag":517,"props":1056,"children":1057},{},[1058,1060,1066,1067,1073,1074,1080],{"type":57,"value":1059},"Step 1 — emits ",{"type":51,"tag":74,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":57,"value":1065},"theme.json",{"type":57,"value":141},{"type":51,"tag":74,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":57,"value":1072},"style.css",{"type":57,"value":141},{"type":51,"tag":74,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":57,"value":1079},"functions.php",{"type":57,"value":1081},", parts skeleton, base templates, self-hosted fonts",{"type":51,"tag":495,"props":1083,"children":1084},{},[1085,1093],{"type":51,"tag":517,"props":1086,"children":1087},{},[1088],{"type":51,"tag":74,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":57,"value":941},{"type":51,"tag":517,"props":1094,"children":1095},{},[1096,1098,1103],{"type":57,"value":1097},"Step 4 — one builder per cluster representative (fan-out, concurrency-capped). SUPPLEMENTARY — skip when ",{"type":51,"tag":74,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":57,"value":653},{"type":57,"value":1104}," (Step 5) covers every page (the default)",{"type":51,"tag":495,"props":1106,"children":1107},{},[1108,1116],{"type":51,"tag":517,"props":1109,"children":1110},{},[1111],{"type":51,"tag":74,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":57,"value":948},{"type":51,"tag":517,"props":1117,"children":1118},{},[1119],{"type":57,"value":1120},"Step 5 — misfit pages only (post-compose sanity check flagged them as unmatched)",{"type":51,"tag":495,"props":1122,"children":1123},{},[1124,1132],{"type":51,"tag":517,"props":1125,"children":1126},{},[1127],{"type":51,"tag":74,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":57,"value":852},{"type":51,"tag":517,"props":1133,"children":1134},{},[1135],{"type":57,"value":1136},"Step 7 — visual QA loop after install",{"type":51,"tag":495,"props":1138,"children":1139},{},[1140,1148],{"type":51,"tag":517,"props":1141,"children":1142},{},[1143],{"type":51,"tag":74,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":57,"value":955},{"type":51,"tag":517,"props":1149,"children":1150},{},[1151,1153],{"type":57,"value":1152},"Step 7 — apply fix directives from ",{"type":51,"tag":74,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":57,"value":852},{"type":51,"tag":285,"props":1159,"children":1161},{"id":1160},"the-8-step-flow",[1162],{"type":57,"value":1163},"The 8-step flow",{"type":51,"tag":83,"props":1165,"children":1166},{},[1167,1198],{"type":51,"tag":60,"props":1168,"children":1169},{},[1170,1175,1177,1182,1184,1189,1191,1196],{"type":51,"tag":66,"props":1171,"children":1172},{},[1173],{"type":57,"value":1174},"Page path is deterministic-first.",{"type":57,"value":1176}," ",{"type":51,"tag":74,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":57,"value":653},{"type":57,"value":1183}," (Step 5) is the PRIMARY, self-contained page path: it captures each page's OWN computed-style specs, reconstructs gated block markup, and installs per-page patterns + templates. It does ",{"type":51,"tag":66,"props":1185,"children":1186},{},[1187],{"type":57,"value":1188},"not",{"type":57,"value":1190}," consume ",{"type":51,"tag":74,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":57,"value":583},{"type":57,"value":1197}," or the Step 3\u002F4 spec+builder artifacts. So in the default flow:",{"type":51,"tag":186,"props":1199,"children":1200},{},[1201,1219,1251],{"type":51,"tag":190,"props":1202,"children":1203},{},[1204,1209,1211,1217],{"type":51,"tag":66,"props":1205,"children":1206},{},[1207],{"type":57,"value":1208},"Step 2 (cluster) is INFORMATIONAL",{"type":57,"value":1210}," — it surfaces sitewide-shared chrome and an archetype map for the run-report, but does not gate reconstruction. Where the layout signature is unreliable (e.g. Wix serves CSS cross-origin, collapsing nearly every page to one signature) clustering is near-useless — that's expected, and fine; ",{"type":51,"tag":74,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":57,"value":1216},"reconstruct_pages",{"type":57,"value":1218}," still works per-page.",{"type":51,"tag":190,"props":1220,"children":1221},{},[1222,1234,1236,1241,1243,1249],{"type":51,"tag":66,"props":1223,"children":1224},{},[1225,1227,1232],{"type":57,"value":1226},"Steps 3–4 (per-cluster specs → ",{"type":51,"tag":74,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":57,"value":941},{"type":57,"value":1233}," builder fan-out) are SUPPLEMENTARY.",{"type":57,"value":1235}," Skip the fan-out when ",{"type":51,"tag":74,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":57,"value":1216},{"type":57,"value":1242}," covers every page (the default). Reach for it only when reconstruct leaves a real gap (a bespoke section it can't map) or is unavailable (legacy ",{"type":51,"tag":74,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":57,"value":1248},"compose-instantiate",{"type":57,"value":1250}," path). Step 3.5 (asset triage) applies to the primary path and is NOT supplementary.",{"type":51,"tag":190,"props":1252,"children":1253},{},[1254,1256,1262],{"type":57,"value":1255},"Header\u002Ffooter chrome comes from ",{"type":51,"tag":74,"props":1257,"children":1259},{"className":1258},[],[1260],{"type":57,"value":1261},"liberate_theme_scaffold",{"type":57,"value":1263}," (Step 1), not the builders.",{"type":51,"tag":1265,"props":1266,"children":1268},"h3",{"id":1267},"step-1-foundation-theme-scaffold",[1269],{"type":57,"value":1270},"Step 1 — Foundation + theme scaffold",{"type":51,"tag":60,"props":1272,"children":1273},{},[1274],{"type":51,"tag":66,"props":1275,"children":1276},{},[1277,1279,1284,1286,1291],{"type":57,"value":1278},"If ",{"type":51,"tag":74,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":57,"value":329},{"type":57,"value":1285}," and ",{"type":51,"tag":74,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":57,"value":361},{"type":57,"value":1292}," already exist, skip to the build gate check and continue.",{"type":51,"tag":60,"props":1294,"children":1295},{},[1296,1298,1303,1305,1311,1312,1318,1319,1324,1325,1330,1331,1336,1337,1343,1345,1350,1352,1358,1359,1365,1367,1372],{"type":57,"value":1297},"1a. Invoke ",{"type":51,"tag":74,"props":1299,"children":1301},{"className":1300},[],[1302],{"type":57,"value":337},{"type":57,"value":1304},". It reads ",{"type":51,"tag":74,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":57,"value":1310},"html\u002F",{"type":57,"value":141},{"type":51,"tag":74,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":57,"value":1317},"screenshots\u002F",{"type":57,"value":141},{"type":51,"tag":74,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":57,"value":443},{"type":57,"value":141},{"type":51,"tag":74,"props":1326,"children":1328},{"className":1327},[],[1329],{"type":57,"value":450},{"type":57,"value":141},{"type":51,"tag":74,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":57,"value":458},{"type":57,"value":452},{"type":51,"tag":74,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":57,"value":1342},"manifest.json",{"type":57,"value":1344},"; emits ",{"type":51,"tag":74,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":57,"value":329},{"type":57,"value":1351}," (semantic token roles: ",{"type":51,"tag":74,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":57,"value":1357},"color.accent.primary",{"type":57,"value":141},{"type":51,"tag":74,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":57,"value":1364},"typography.families.display",{"type":57,"value":1366},", etc.) and freezes ",{"type":51,"tag":74,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":57,"value":361},{"type":57,"value":1373},". Do not proceed with raw aggregates.",{"type":51,"tag":60,"props":1375,"children":1376},{},[1377,1379,1384,1385,1390,1391,1396],{"type":57,"value":1378},"1b. Invoke ",{"type":51,"tag":74,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":57,"value":1054},{"type":57,"value":1304},{"type":51,"tag":74,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":57,"value":329},{"type":57,"value":391},{"type":51,"tag":74,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":57,"value":361},{"type":57,"value":1397}," and emits:",{"type":51,"tag":186,"props":1399,"children":1400},{},[1401,1412,1423,1432,1450,1489],{"type":51,"tag":190,"props":1402,"children":1403},{},[1404,1410],{"type":51,"tag":74,"props":1405,"children":1407},{"className":1406},[],[1408],{"type":57,"value":1409},"theme\u002Ftheme.json",{"type":57,"value":1411}," (schema v3, token roles mapped from foundation — see token mapping below)",{"type":51,"tag":190,"props":1413,"children":1414},{},[1415,1421],{"type":51,"tag":74,"props":1416,"children":1418},{"className":1417},[],[1419],{"type":57,"value":1420},"theme\u002Fstyle.css",{"type":57,"value":1422}," (with the correct theme header)",{"type":51,"tag":190,"props":1424,"children":1425},{},[1426],{"type":51,"tag":74,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":57,"value":1431},"theme\u002Ffunctions.php",{"type":51,"tag":190,"props":1433,"children":1434},{},[1435,1441,1442,1448],{"type":51,"tag":74,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":57,"value":1440},"theme\u002Fparts\u002Fheader.html",{"type":57,"value":1285},{"type":51,"tag":74,"props":1443,"children":1445},{"className":1444},[],[1446],{"type":57,"value":1447},"theme\u002Fparts\u002Ffooter.html",{"type":57,"value":1449}," (skeleton — overwritten in step 5)",{"type":51,"tag":190,"props":1451,"children":1452},{},[1453,1459,1460,1466,1467,1473,1474,1480,1481,1487],{"type":51,"tag":74,"props":1454,"children":1456},{"className":1455},[],[1457],{"type":57,"value":1458},"theme\u002Ftemplates\u002Findex.html",{"type":57,"value":141},{"type":51,"tag":74,"props":1461,"children":1463},{"className":1462},[],[1464],{"type":57,"value":1465},"theme\u002Ftemplates\u002Fpage.html",{"type":57,"value":141},{"type":51,"tag":74,"props":1468,"children":1470},{"className":1469},[],[1471],{"type":57,"value":1472},"theme\u002Ftemplates\u002Fsingle.html",{"type":57,"value":141},{"type":51,"tag":74,"props":1475,"children":1477},{"className":1476},[],[1478],{"type":57,"value":1479},"theme\u002Ftemplates\u002Fsingle-product.html",{"type":57,"value":141},{"type":51,"tag":74,"props":1482,"children":1484},{"className":1483},[],[1485],{"type":57,"value":1486},"theme\u002Ftemplates\u002Farchive-product.html",{"type":57,"value":1488}," (base — content slots filled in step 5)",{"type":51,"tag":190,"props":1490,"children":1491},{},[1492],{"type":57,"value":1493},"Self-hosted font declarations",{"type":51,"tag":60,"props":1495,"children":1496},{},[1497,1502,1504,1509,1511,1517,1519,1525,1527,1533,1535,1541,1543,1548],{"type":51,"tag":66,"props":1498,"children":1499},{},[1500],{"type":57,"value":1501},"Build gate (after foundation):",{"type":57,"value":1503}," validate ",{"type":51,"tag":74,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":57,"value":1065},{"type":57,"value":1510}," against schema v3 and run the known-activation-fatals lint via ",{"type":51,"tag":74,"props":1512,"children":1514},{"className":1513},[],[1515],{"type":57,"value":1516},"lintThemeJson",{"type":57,"value":1518}," in ",{"type":51,"tag":74,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":57,"value":1524},"src\u002Flib\u002Freplicate\u002Ftheme-json-lint.ts",{"type":57,"value":1526}," (e.g. ",{"type":51,"tag":74,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":57,"value":1532},"spacingScale.theme:false",{"type":57,"value":1534}," fatal, missing ",{"type":51,"tag":74,"props":1536,"children":1538},{"className":1537},[],[1539],{"type":57,"value":1540},"version",{"type":57,"value":1542}," field). Fail → fix ",{"type":51,"tag":74,"props":1544,"children":1546},{"className":1545},[],[1547],{"type":57,"value":1065},{"type":57,"value":1549}," before continuing. Do not skip the gate.",{"type":51,"tag":60,"props":1551,"children":1552},{},[1553],{"type":51,"tag":66,"props":1554,"children":1555},{},[1556],{"type":57,"value":1557},"Token mapping (theme.json from design-foundation.json):",{"type":51,"tag":186,"props":1559,"children":1560},{},[1561,1599,1636,1673,1696,1712,1737,1761,1792],{"type":51,"tag":190,"props":1562,"children":1563},{},[1564,1570,1571,1577,1579,1585,1586,1592,1593],{"type":51,"tag":74,"props":1565,"children":1567},{"className":1566},[],[1568],{"type":57,"value":1569},"color.surface.*",{"type":57,"value":552},{"type":51,"tag":74,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":57,"value":1576},"settings.color.palette",{"type":57,"value":1578}," entries: ",{"type":51,"tag":74,"props":1580,"children":1582},{"className":1581},[],[1583],{"type":57,"value":1584},"surface-base",{"type":57,"value":141},{"type":51,"tag":74,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":57,"value":1591},"surface-raised",{"type":57,"value":141},{"type":51,"tag":74,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":57,"value":1598},"surface-inverse",{"type":51,"tag":190,"props":1600,"children":1601},{},[1602,1608,1609,1615,1616,1622,1623,1629,1630],{"type":51,"tag":74,"props":1603,"children":1605},{"className":1604},[],[1606],{"type":57,"value":1607},"color.text.*",{"type":57,"value":552},{"type":51,"tag":74,"props":1610,"children":1612},{"className":1611},[],[1613],{"type":57,"value":1614},"text-default",{"type":57,"value":141},{"type":51,"tag":74,"props":1617,"children":1619},{"className":1618},[],[1620],{"type":57,"value":1621},"text-muted",{"type":57,"value":141},{"type":51,"tag":74,"props":1624,"children":1626},{"className":1625},[],[1627],{"type":57,"value":1628},"text-subtle",{"type":57,"value":141},{"type":51,"tag":74,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":57,"value":1635},"text-inverse",{"type":51,"tag":190,"props":1637,"children":1638},{},[1639,1645,1646,1652,1653,1659,1660,1666,1667],{"type":51,"tag":74,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":57,"value":1644},"color.accent.*",{"type":57,"value":552},{"type":51,"tag":74,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":57,"value":1651},"accent-primary",{"type":57,"value":141},{"type":51,"tag":74,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":57,"value":1658},"accent-warning",{"type":57,"value":141},{"type":51,"tag":74,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":57,"value":1665},"accent-warm",{"type":57,"value":141},{"type":51,"tag":74,"props":1668,"children":1670},{"className":1669},[],[1671],{"type":57,"value":1672},"accent-highlight",{"type":51,"tag":190,"props":1674,"children":1675},{},[1676,1682,1683,1689,1690],{"type":51,"tag":74,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":57,"value":1681},"color.border.*",{"type":57,"value":552},{"type":51,"tag":74,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":57,"value":1688},"border-default",{"type":57,"value":141},{"type":51,"tag":74,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":57,"value":1695},"border-subtle",{"type":51,"tag":190,"props":1697,"children":1698},{},[1699,1705,1706],{"type":51,"tag":74,"props":1700,"children":1702},{"className":1701},[],[1703],{"type":57,"value":1704},"typography.families.body",{"type":57,"value":552},{"type":51,"tag":74,"props":1707,"children":1709},{"className":1708},[],[1710],{"type":57,"value":1711},"settings.typography.fontFamilies[0]",{"type":51,"tag":190,"props":1713,"children":1714},{},[1715,1720,1721,1727,1729,1735],{"type":51,"tag":74,"props":1716,"children":1718},{"className":1717},[],[1719],{"type":57,"value":1364},{"type":57,"value":552},{"type":51,"tag":74,"props":1722,"children":1724},{"className":1723},[],[1725],{"type":57,"value":1726},"settings.typography.fontFamilies[1]",{"type":57,"value":1728}," (omit if ",{"type":51,"tag":74,"props":1730,"children":1732},{"className":1731},[],[1733],{"type":57,"value":1734},"null",{"type":57,"value":1736}," — do NOT hallucinate a serif)",{"type":51,"tag":190,"props":1738,"children":1739},{},[1740,1746,1747,1753,1754,1759],{"type":51,"tag":74,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":57,"value":1745},"typography.families.mono",{"type":57,"value":552},{"type":51,"tag":74,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":57,"value":1752},"settings.typography.fontFamilies[2]",{"type":57,"value":1728},{"type":51,"tag":74,"props":1755,"children":1757},{"className":1756},[],[1758],{"type":57,"value":1734},{"type":57,"value":1760},")",{"type":51,"tag":190,"props":1762,"children":1763},{},[1764,1770,1771,1777,1779,1785,1786],{"type":51,"tag":74,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":57,"value":1769},"breakpoints.lg",{"type":57,"value":552},{"type":51,"tag":74,"props":1772,"children":1774},{"className":1773},[],[1775],{"type":57,"value":1776},"settings.layout.contentSize",{"type":57,"value":1778},"; ",{"type":51,"tag":74,"props":1780,"children":1782},{"className":1781},[],[1783],{"type":57,"value":1784},"breakpoints.xl",{"type":57,"value":552},{"type":51,"tag":74,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":57,"value":1791},"settings.layout.wideSize",{"type":51,"tag":190,"props":1793,"children":1794},{},[1795,1801,1802,1808],{"type":51,"tag":74,"props":1796,"children":1798},{"className":1797},[],[1799],{"type":57,"value":1800},"components.*",{"type":57,"value":552},{"type":51,"tag":74,"props":1803,"children":1805},{"className":1804},[],[1806],{"type":57,"value":1807},"styles.blocks.core\u002F*",{"type":57,"value":1809}," overrides (button, paragraph, separator, etc.)",{"type":51,"tag":60,"props":1811,"children":1812},{},[1813,1815,1821,1823,1829,1831,1837,1839,1845],{"type":57,"value":1814},"If you provide explicit ",{"type":51,"tag":74,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":57,"value":1820},"settings.spacing.spacingSizes",{"type":57,"value":1822},", omit ",{"type":51,"tag":74,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":57,"value":1828},"settings.spacing.spacingScale",{"type":57,"value":1830}," entirely. Do not set ",{"type":51,"tag":74,"props":1832,"children":1834},{"className":1833},[],[1835],{"type":57,"value":1836},"settings.spacing.spacingScale.theme",{"type":57,"value":1838}," to ",{"type":51,"tag":74,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":57,"value":1844},"false",{"type":57,"value":760},{"type":51,"tag":1265,"props":1847,"children":1849},{"id":1848},"step-2-cluster",[1850],{"type":57,"value":1851},"Step 2 — Cluster",{"type":51,"tag":60,"props":1853,"children":1854},{},[1855,1857,1863,1865,1870,1872,1877],{"type":57,"value":1856},"2a. Call ",{"type":51,"tag":74,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":57,"value":1862},"liberate_section_extract",{"type":57,"value":1864}," with ",{"type":51,"tag":74,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":57,"value":534},{"type":57,"value":1871}," for every page in ",{"type":51,"tag":74,"props":1873,"children":1875},{"className":1874},[],[1876],{"type":57,"value":147},{"type":57,"value":1878},". This is a batch call over saved HTML — no re-navigation, no Playwright.",{"type":51,"tag":60,"props":1880,"children":1881},{},[1882,1884,1890,1892,1897],{"type":57,"value":1883},"2b. Call ",{"type":51,"tag":74,"props":1885,"children":1887},{"className":1886},[],[1888],{"type":57,"value":1889},"liberate_cluster_pages",{"type":57,"value":1891}," with all page signatures → ",{"type":51,"tag":74,"props":1893,"children":1895},{"className":1894},[],[1896],{"type":57,"value":583},{"type":57,"value":1898},". Pages with identical section-type sequences join one cluster. Near-matches (edit-distance ≤ 1) merge with a note. The representative is the cluster member with the most sections (richest HTML by byte size). Exact-signature clustering only — fuzzy deferred.",{"type":51,"tag":60,"props":1900,"children":1901},{},[1902,1904,1909],{"type":57,"value":1903},"Read ",{"type":51,"tag":74,"props":1905,"children":1907},{"className":1906},[],[1908],{"type":57,"value":583},{"type":57,"value":1910}," and note: how many clusters, which pages are in each, who the representative is.",{"type":51,"tag":1265,"props":1912,"children":1914},{"id":1913},"step-3-per-cluster-representative-specs",[1915],{"type":57,"value":1916},"Step 3 — Per-cluster representative specs",{"type":51,"tag":60,"props":1918,"children":1919},{},[1920,1922,1927,1928,1933,1935,1941],{"type":57,"value":1921},"For each cluster representative, call ",{"type":51,"tag":74,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":57,"value":1862},{"type":57,"value":1864},{"type":51,"tag":74,"props":1929,"children":1931},{"className":1930},[],[1932],{"type":57,"value":550},{"type":57,"value":1934},". This emits ",{"type":51,"tag":74,"props":1936,"children":1938},{"className":1937},[],[1939],{"type":57,"value":1940},"\u003CoutputDir>\u002Fspecs\u002F\u003Crep>\u002Fsection-\u003Cn>-\u003Ctype>.md",{"type":57,"value":1942}," for each section of the representative page.",{"type":51,"tag":60,"props":1944,"children":1945},{},[1946,1948,1954,1956,1962,1964,1970,1972,1978,1980,1986,1988,1993,1995,2000],{"type":57,"value":1947},"Spec files are the contract between extraction and pattern generation. Each spec contains: interaction model, Y band, background color + brightness, text\u002Faccent colors, overlay flags, headings (verbatim), body text (verbatim), buttons (label\u002Fhref\u002Fcolors), list items, and image references (uploaded WP-library URLs or ",{"type":51,"tag":74,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":57,"value":1953},"assets\u002F\u003Clocal-filename>",{"type":57,"value":1955},"). For a ",{"type":51,"tag":74,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":57,"value":1961},"review-grid",{"type":57,"value":1963}," section the spec also carries ",{"type":51,"tag":74,"props":1965,"children":1967},{"className":1966},[],[1968],{"type":57,"value":1969},"reviews[]",{"type":57,"value":1971}," — source-VERBATIM ",{"type":51,"tag":74,"props":1973,"children":1975},{"className":1974},[],[1976],{"type":57,"value":1977},"{ category, stars, quote, author }",{"type":57,"value":1979}," records pulled from the served HTML by the deterministic ",{"type":51,"tag":74,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":57,"value":1985},"review-extract.ts",{"type":57,"value":1987}," extractor. When ",{"type":51,"tag":74,"props":1989,"children":1991},{"className":1990},[],[1992],{"type":57,"value":1969},{"type":57,"value":1994}," is present, the builder MUST render them verbatim and MUST NOT synthesize review prose; when a review band is detected but ",{"type":51,"tag":74,"props":1996,"children":1998},{"className":1997},[],[1999],{"type":57,"value":1969},{"type":57,"value":2001}," is empty, use the missing-content fallback (placeholder + run-report flag).",{"type":51,"tag":60,"props":2003,"children":2004},{},[2005,2010],{"type":51,"tag":66,"props":2006,"children":2007},{},[2008],{"type":57,"value":2009},"Per-cluster readiness check:",{"type":57,"value":2011}," before dispatching a builder, verify each spec has: interaction model set, computed styles present, media local-pathed (no CDN URLs), brightness recorded. Incomplete spec → fix it, don't dispatch.",{"type":51,"tag":60,"props":2013,"children":2014},{},[2015,2020,2022,2028,2030,2035,2037,2043,2045,2051,2053,2059,2061,2067,2068,2074,2076,2081,2083,2088,2090,2095,2097,2102],{"type":51,"tag":66,"props":2016,"children":2017},{},[2018],{"type":57,"value":2019},"Page-builder sections (Shopify\u002FReplo, Shogun):",{"type":57,"value":2021}," these stores have rich repeated components — ",{"type":51,"tag":74,"props":2023,"children":2025},{"className":2024},[],[2026],{"type":57,"value":2027},"product-card-row",{"type":57,"value":2029}," (image + title + price), ",{"type":51,"tag":74,"props":2031,"children":2033},{"className":2032},[],[2034],{"type":57,"value":1961},{"type":57,"value":2036}," (star rating + quote + name), ",{"type":51,"tag":74,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":57,"value":2042},"app-download",{"type":57,"value":2044}," (store-badge images), and email-capture heroes. ",{"type":51,"tag":74,"props":2046,"children":2048},{"className":2047},[],[2049],{"type":57,"value":2050},"liberate_section_extract detail:\"full\"",{"type":57,"value":2052}," now classifies these as their own interaction models; the builder maps each to the matching ",{"type":51,"tag":74,"props":2054,"children":2056},{"className":2055},[],[2057],{"type":57,"value":2058},"references\u002Fsection-mapping.md",{"type":57,"value":2060}," template. Don't let a product\u002Freview row collapse to generic ",{"type":51,"tag":74,"props":2062,"children":2064},{"className":2063},[],[2065],{"type":57,"value":2066},"static",{"type":57,"value":694},{"type":51,"tag":74,"props":2069,"children":2071},{"className":2070},[],[2072],{"type":57,"value":2073},"columns",{"type":57,"value":2075},". Note: page-builder review carousels nest their slides too deep for the geometry classifier to read as repeated children, so a review band can first classify as ",{"type":51,"tag":74,"props":2077,"children":2079},{"className":2078},[],[2080],{"type":57,"value":2066},{"type":57,"value":2082}," — but ",{"type":51,"tag":74,"props":2084,"children":2086},{"className":2085},[],[2087],{"type":57,"value":1862},{"type":57,"value":2089}," runs the deterministic review extractor over the section's served HTML and, when it finds star-rated quotes, promotes the model to ",{"type":51,"tag":74,"props":2091,"children":2093},{"className":2092},[],[2094],{"type":57,"value":1961},{"type":57,"value":2096}," and attaches the verbatim ",{"type":51,"tag":74,"props":2098,"children":2100},{"className":2099},[],[2101],{"type":57,"value":1969},{"type":57,"value":2103},". So the real reviews are captured even when the band \"looked\" static. Never assume reviews are unreachable JS and never invent them.",{"type":51,"tag":60,"props":2105,"children":2106},{},[2107,2112,2114,2120,2122,2128,2130,2136],{"type":51,"tag":66,"props":2108,"children":2109},{},[2110],{"type":57,"value":2111},"Missing-media:",{"type":57,"value":2113}," if a spec's image slot has no local\u002FWP-library URL (capture failed), the builder must emit a sized placeholder and add a ",{"type":51,"tag":74,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":57,"value":2119},"details.provenanceFlags",{"type":57,"value":2121}," entry — NOT substitute an unrelated photo. A non-zero provenance count is a ",{"type":51,"tag":74,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":57,"value":2127},"warn",{"type":57,"value":2129},", not a silent pass. The extractor now captures page-builder CDN imagery (Replo ",{"type":51,"tag":74,"props":2131,"children":2133},{"className":2132},[],[2134],{"type":57,"value":2135},"assets.replocdn.com",{"type":57,"value":2137},", etc.) regardless of host\u002Fextension, so genuine misses should be rare.",{"type":51,"tag":60,"props":2139,"children":2140},{},[2141],{"type":57,"value":2142},"Sitewide-shared sections (header, footer, a recurring CTA band that appears identically across clusters) are identified here and built once — deduplicated before builder dispatch.",{"type":51,"tag":1265,"props":2144,"children":2146},{"id":2145},"step-35-asset-triage-decorative-imagery-structural-intent",[2147],{"type":57,"value":2148},"Step 3.5 — Asset triage (decorative imagery → structural intent)",{"type":51,"tag":60,"props":2150,"children":2151},{},[2152],{"type":57,"value":2153},"Classify decorative-looking assets BEFORE reconstruction so the builder expresses them structurally instead of emitting broken\u002Fcluttered images.",{"type":51,"tag":2155,"props":2156,"children":2157},"ol",{},[2158,2187,2246],{"type":51,"tag":190,"props":2159,"children":2160},{},[2161,2163,2169,2171,2177,2179,2185],{"type":57,"value":2162},"Candidates are deterministic — pipe a short script to ",{"type":51,"tag":74,"props":2164,"children":2166},{"className":2165},[],[2167],{"type":57,"value":2168},"npx tsx --input-type=module",{"type":57,"value":2170}," (from the repo root): ",{"type":51,"tag":74,"props":2172,"children":2174},{"className":2173},[],[2175],{"type":57,"value":2176},"import { selectTriageCandidates } from '.\u002Fsrc\u002Flib\u002Freplicate\u002Ftriage-candidates.js'",{"type":57,"value":2178}," over every captured page's SectionSpecs (",{"type":51,"tag":74,"props":2180,"children":2182},{"className":2181},[],[2183],{"type":57,"value":2184},"\u003CoutputDir>\u002Fsections\u002F\u003Cslug>.json",{"type":57,"value":2186},"). Zero candidates → skip this step entirely.",{"type":51,"tag":190,"props":2188,"children":2189},{},[2190,2192],{"type":57,"value":2191},"For EACH candidate, LOOK at it (fetch the asset file, or crop the section screenshot at the candidate's position). Classify:\n",{"type":51,"tag":186,"props":2193,"children":2194},{},[2195,2206],{"type":51,"tag":190,"props":2196,"children":2197},{},[2198,2204],{"type":51,"tag":74,"props":2199,"children":2201},{"className":2200},[],[2202],{"type":57,"value":2203},"keep",{"type":57,"value":2205}," — real content: logo, illustration, product shot, photo, meaningful icon. When in doubt, KEEP (never-lose-source-content).",{"type":51,"tag":190,"props":2207,"children":2208},{},[2209,2215,2217,2223,2225,2231,2232,2238,2239,2244],{"type":51,"tag":74,"props":2210,"children":2212},{"className":2211},[],[2213],{"type":57,"value":2214},"decoration",{"type":57,"value":2216}," — divider line, ornament, gradient stripe, background blob. Write a 1-sentence description of what the visual IS (e.g. \"thin full-width horizontal rule between sections\") — downstream uses it to pick a structural replacement (",{"type":51,"tag":74,"props":2218,"children":2220},{"className":2219},[],[2221],{"type":57,"value":2222},"wp:separator",{"type":57,"value":2224}," \u002F parent ",{"type":51,"tag":74,"props":2226,"children":2228},{"className":2227},[],[2229],{"type":57,"value":2230},"border.*",{"type":57,"value":2224},{"type":51,"tag":74,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":57,"value":2237},"background",{"type":57,"value":544},{"type":51,"tag":74,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":57,"value":223},{"type":57,"value":2245}," is banned.",{"type":51,"tag":190,"props":2247,"children":2248},{},[2249,2251,2257,2259,2265,2267,2273,2274,2280,2282,2288],{"type":57,"value":2250},"Write ",{"type":51,"tag":74,"props":2252,"children":2254},{"className":2253},[],[2255],{"type":57,"value":2256},"\u003CoutputDir>\u002Fasset-triage.json",{"type":57,"value":2258}," atomically (tmp + rename): ",{"type":51,"tag":74,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":57,"value":2264},"{\"schema\":1,\"site\":\"\u003Corigin>\",\"entries\":[{\"url\",\"sectionSelector\",\"verdict\",\"description\"}]}",{"type":57,"value":2266},". COPY ",{"type":51,"tag":74,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":57,"value":2272},"url",{"type":57,"value":1285},{"type":51,"tag":74,"props":2275,"children":2277},{"className":2276},[],[2278],{"type":57,"value":2279},"sectionSelector",{"type":57,"value":2281}," VERBATIM from the ",{"type":51,"tag":74,"props":2283,"children":2285},{"className":2284},[],[2286],{"type":57,"value":2287},"selectTriageCandidates",{"type":57,"value":2289}," output — the downstream join is exact-string on both fields; rewriting, normalizing, or trimming either breaks the match silently. The reconstruct handler consumes the file automatically; absent file = no behavior change. Capture-once: an existing file is reused on re-runs — delete it to re-triage.",{"type":51,"tag":1265,"props":2291,"children":2293},{"id":2292},"step-4-build-fan-out-supplementary-skip-when-reconstruct_pages-covers-all-pages",[2294,2296,2301],{"type":57,"value":2295},"Step 4 — Build (fan-out) — SUPPLEMENTARY (skip when ",{"type":51,"tag":74,"props":2297,"children":2299},{"className":2298},[],[2300],{"type":57,"value":1216},{"type":57,"value":2302}," covers all pages)",{"type":51,"tag":83,"props":2304,"children":2305},{},[2306],{"type":51,"tag":60,"props":2307,"children":2308},{},[2309,2314,2316,2321],{"type":51,"tag":66,"props":2310,"children":2311},{},[2312],{"type":57,"value":2313},"Default flow skips this.",{"type":57,"value":2315}," Page content is reconstructed per-page in Step 5 (",{"type":51,"tag":74,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":57,"value":653},{"type":57,"value":2322},"), not from cluster skeletons. Run this fan-out ONLY when reconstruct can't map a bespoke section (needs a custom builder) or is unavailable.",{"type":51,"tag":60,"props":2324,"children":2325},{},[2326,2328,2333,2335,2340],{"type":57,"value":2327},"Invoke one ",{"type":51,"tag":74,"props":2329,"children":2331},{"className":2330},[],[2332],{"type":57,"value":941},{"type":57,"value":2334}," builder ",{"type":51,"tag":66,"props":2336,"children":2337},{},[2338],{"type":57,"value":2339},"per cluster representative",{"type":57,"value":2341},". Builders are run in parallel, concurrency-capped to ~4–6. On Codex\u002FGemini, run sequentially.",{"type":51,"tag":60,"props":2343,"children":2344},{},[2345],{"type":57,"value":2346},"Each builder receives (by path — builders are read-only on shared artifacts):",{"type":51,"tag":186,"props":2348,"children":2349},{},[2350,2360,2365,2375,2380,2392,2404],{"type":51,"tag":190,"props":2351,"children":2352},{},[2353,2358],{"type":51,"tag":74,"props":2354,"children":2356},{"className":2355},[],[2357],{"type":57,"value":361},{"type":57,"value":2359}," path",{"type":51,"tag":190,"props":2361,"children":2362},{},[2363],{"type":57,"value":2364},"Theme slug",{"type":51,"tag":190,"props":2366,"children":2367},{},[2368,2370],{"type":57,"value":2369},"Token snapshot from ",{"type":51,"tag":74,"props":2371,"children":2373},{"className":2372},[],[2374],{"type":57,"value":329},{"type":51,"tag":190,"props":2376,"children":2377},{},[2378],{"type":57,"value":2379},"Uploaded media URL map",{"type":51,"tag":190,"props":2381,"children":2382},{},[2383,2385,2391],{"type":57,"value":2384},"The cluster's spec files (",{"type":51,"tag":74,"props":2386,"children":2388},{"className":2387},[],[2389],{"type":57,"value":2390},"specs\u002F\u003Crep>\u002Fsection-*.md",{"type":57,"value":1760},{"type":51,"tag":190,"props":2393,"children":2394},{},[2395,2397,2403],{"type":57,"value":2396},"The section-mapping catalog (",{"type":51,"tag":74,"props":2398,"children":2400},{"className":2399},[],[2401],{"type":57,"value":2402},"skills\u002Fgenerating-patterns\u002Freferences\u002Fsection-mapping.md",{"type":57,"value":1760},{"type":51,"tag":190,"props":2405,"children":2406},{},[2407,2409,2415],{"type":57,"value":2408},"The spec-files contract (",{"type":51,"tag":74,"props":2410,"children":2412},{"className":2411},[],[2413],{"type":57,"value":2414},"skills\u002Fgenerating-patterns\u002Freferences\u002Fspec-files.md",{"type":57,"value":1760},{"type":51,"tag":60,"props":2417,"children":2418},{},[2419,2421,2426,2428,2434,2436,2442,2443,2449],{"type":57,"value":2420},"Each builder returns a ",{"type":51,"tag":66,"props":2422,"children":2423},{},[2424],{"type":57,"value":2425},"structured JSON envelope",{"type":57,"value":2427}," — ",{"type":51,"tag":74,"props":2429,"children":2431},{"className":2430},[],[2432],{"type":57,"value":2433},"{ patterns: [{ slug, php }], sitewideFlags: [...], notes: [...] }",{"type":57,"value":2435}," — validated by ",{"type":51,"tag":74,"props":2437,"children":2439},{"className":2438},[],[2440],{"type":57,"value":2441},"parseBuilderEnvelope",{"type":57,"value":1518},{"type":51,"tag":74,"props":2444,"children":2446},{"className":2445},[],[2447],{"type":57,"value":2448},"src\u002Flib\u002Freplicate\u002Fbuilder-envelope.ts",{"type":57,"value":2450},". A malformed or partial return is a builder failure → retry once → fall back to sequential for that cluster. Never silently use partial output.",{"type":51,"tag":60,"props":2452,"children":2453},{},[2454,2456,2461,2463,2469],{"type":57,"value":2455},"Builders emit ",{"type":51,"tag":66,"props":2457,"children":2458},{},[2459],{"type":57,"value":2460},"layout skeletons per cluster",{"type":57,"value":2462}," (section-mapping templates with content slots filled from the spec's verbatim content), not finished per-page markup. Sitewide-shared sections (flagged in ",{"type":51,"tag":74,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":57,"value":2468},"sitewideFlags",{"type":57,"value":2470},") become registered WP patterns or template parts referenced by slug.",{"type":51,"tag":60,"props":2472,"children":2473},{},[2474,2476,2481,2483,2489,2491,2497,2498,2504],{"type":57,"value":2475},"Persist each cluster's patterns ",{"type":51,"tag":66,"props":2477,"children":2478},{},[2479],{"type":57,"value":2480},"before",{"type":57,"value":2482}," marking it built in ",{"type":51,"tag":74,"props":2484,"children":2486},{"className":2485},[],[2487],{"type":57,"value":2488},"session.json",{"type":57,"value":2490}," (write-then-mark for resume). Log failures to ",{"type":51,"tag":74,"props":2492,"children":2494},{"className":2493},[],[2495],{"type":57,"value":2496},"theme\u002Fdebug\u002Fcluster-\u003Cn>.json",{"type":57,"value":1285},{"type":51,"tag":74,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":57,"value":2503},"theme\u002Fnotes.md",{"type":57,"value":760},{"type":51,"tag":60,"props":2506,"children":2507},{},[2508,2510,2515],{"type":57,"value":2509},"Checkpoint by cluster-group with a compaction\u002Fhandoff between groups (full state in ",{"type":51,"tag":74,"props":2511,"children":2513},{"className":2512},[],[2514],{"type":57,"value":2488},{"type":57,"value":2516}," + a short design-state summary) so the orchestrator's context can reset without losing contract artifacts.",{"type":51,"tag":1265,"props":2518,"children":2520},{"id":2519},"step-5-assemble",[2521],{"type":57,"value":2522},"Step 5 — Assemble",{"type":51,"tag":60,"props":2524,"children":2525},{},[2526,2531,2533,2539,2540,2545,2547,2553,2555,2561,2563,2569,2571,2576,2577,2582,2583,2588],{"type":51,"tag":66,"props":2527,"children":2528},{},[2529],{"type":57,"value":2530},"PRIMARY PAGE PATH — reconstruct EVERY content page (not just cluster reps).",{"type":57,"value":2532}," Call ",{"type":51,"tag":74,"props":2534,"children":2536},{"className":2535},[],[2537],{"type":57,"value":2538},"liberate_reconstruct_pages({ outputDir, studioSitePath, themeSlug, pages: [...] })",{"type":57,"value":1864},{"type":51,"tag":66,"props":2541,"children":2542},{},[2543],{"type":57,"value":2544},"every",{"type":57,"value":2546}," content page (",{"type":51,"tag":74,"props":2548,"children":2550},{"className":2549},[],[2551],{"type":57,"value":2552},"{ slug, sourceUrl, title, isHome }",{"type":57,"value":2554},"), where home page sets ",{"type":51,"tag":74,"props":2556,"children":2558},{"className":2557},[],[2559],{"type":57,"value":2560},"isHome:true",{"type":57,"value":2562},". For each page it captures computed-style section specs, downloads + installs that page's section media (incl. sibling background-image heroes), reconstructs verbatim block-pattern markup from THAT page's own specs (grids, FAQ accordions, icon assets, 2-column photo heroes, source section background colors), GATES it through ",{"type":51,"tag":74,"props":2564,"children":2566},{"className":2565},[],[2567],{"type":57,"value":2568},"validate_artifacts",{"type":57,"value":2570},", installs ",{"type":51,"tag":74,"props":2572,"children":2574},{"className":2573},[],[2575],{"type":57,"value":613},{"type":57,"value":391},{"type":51,"tag":74,"props":2578,"children":2580},{"className":2579},[],[2581],{"type":57,"value":620},{"type":57,"value":622},{"type":51,"tag":74,"props":2584,"children":2586},{"className":2585},[],[2587],{"type":57,"value":628},{"type":57,"value":2589}," for home), and forces a pattern re-scan so it renders immediately. It reconstructs each page from its OWN specs — no shared cluster skeleton — so heterogeneous pages don't depend on a matching representative.",{"type":51,"tag":60,"props":2591,"children":2592},{},[2593,2598,2600,2606,2608,2614],{"type":51,"tag":66,"props":2594,"children":2595},{},[2596],{"type":57,"value":2597},"This replaces the cluster-representative-only reconstruction.",{"type":57,"value":2599}," Do NOT leave non-representative pages rendering carried ",{"type":51,"tag":74,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":57,"value":2605},"wp:post-content",{"type":57,"value":2607}," through ",{"type":51,"tag":74,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":57,"value":2613},"page.html",{"type":57,"value":2615}," — that renders raw source-platform HTML and looks drastically different from the source. Every content page gets reconstructed. A page whose pattern FAILS the gate is reported (not installed) — fix the tooling\u002Fspec, never ship carried HTML as the \"faithful\" answer.",{"type":51,"tag":60,"props":2617,"children":2618},{},[2619,2624,2626,2631,2633,2639,2641,2647,2649,2654,2656,2662,2664,2670,2672,2677,2679,2685],{"type":51,"tag":66,"props":2620,"children":2621},{},[2622],{"type":57,"value":2623},"core\u002Fhtml verbatim fallback (per-section, renderer-emitted).",{"type":57,"value":2625}," Inside ",{"type":51,"tag":74,"props":2627,"children":2629},{"className":2628},[],[2630],{"type":57,"value":268},{"type":57,"value":2632},", each section's structured render is checked for content loss (",{"type":51,"tag":74,"props":2634,"children":2636},{"className":2635},[],[2637],{"type":57,"value":2638},"measureSectionCoverage",{"type":57,"value":2640},"): if a captured image is dropped, or rendered text coverage falls below ",{"type":51,"tag":74,"props":2642,"children":2644},{"className":2643},[],[2645],{"type":57,"value":2646},"TEXT_FLOOR",{"type":57,"value":2648}," (0.5), the renderer emits the section's sanitized source HTML as a ",{"type":51,"tag":74,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":57,"value":215},{"type":57,"value":2655}," island instead (",{"type":51,"tag":74,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":57,"value":2661},"html-fallback.ts",{"type":57,"value":2663},") and records an ",{"type":51,"tag":74,"props":2665,"children":2667},{"className":2666},[],[2668],{"type":57,"value":2669},"html-fallback#\u003Cn>",{"type":57,"value":2671}," flag. This preserves content the structured path would otherwise silently drop ([[feedback_never_lose_source_content]]) — the provenance gate guards against INVENTED text, NOT DROPPED text. ",{"type":51,"tag":66,"props":2673,"children":2674},{},[2675],{"type":57,"value":2676},"The trigger is deliberately conservative (only when badly broken) because an island carries the source HTML but NOT its CSS, so a CSS-styled section renders UNSTYLED inside it — worse than an incomplete-but-styled structured render.",{"type":57,"value":2678}," Surfaced as ",{"type":51,"tag":74,"props":2680,"children":2682},{"className":2681},[],[2683],{"type":57,"value":2684},"run-report.htmlFallbackSections",{"type":57,"value":2686}," (a warning, not a pass\u002Ffail): in QA, vision-check each island — text-heavy sections render fine verbatim, but a CSS-layout section that fell back will look unstyled and should be treated as a fidelity gap. Note: coverage measures text PRESENCE, not semantic correctness — a paragraph mis-rendered as a heading still \"covers\" its text and won't trip the fallback.",{"type":51,"tag":60,"props":2688,"children":2689},{},[2690,2709,2711,2716,2718,2723,2725,2730],{"type":51,"tag":66,"props":2691,"children":2692},{},[2693,2695,2701,2702,2707],{"type":57,"value":2694},"Legacy cluster-skeleton path (",{"type":51,"tag":74,"props":2696,"children":2698},{"className":2697},[],[2699],{"type":57,"value":2700},"liberate_compose_instantiate",{"type":57,"value":391},{"type":51,"tag":74,"props":2703,"children":2705},{"className":2704},[],[2706],{"type":57,"value":948},{"type":57,"value":2708},"):",{"type":57,"value":2710}," superseded for page faithfulness by ",{"type":51,"tag":74,"props":2712,"children":2714},{"className":2713},[],[2715],{"type":57,"value":653},{"type":57,"value":2717},". Clustering (Step 2) is still useful for identifying sitewide-shared chrome and for posts\u002Fproducts ",{"type":51,"tag":242,"props":2719,"children":2720},{},[2721],{"type":57,"value":2722},"templates",{"type":57,"value":2724},", but page CONTENT is reconstructed per-page. Only fall back to compose-instantiate if ",{"type":51,"tag":74,"props":2726,"children":2728},{"className":2727},[],[2729],{"type":57,"value":653},{"type":57,"value":2731}," is unavailable.",{"type":51,"tag":60,"props":2733,"children":2734},{},[2735,2740,2742,2747,2749,2755,2757,2762,2764,2769,2771,2777,2779,2785,2787,2793],{"type":51,"tag":66,"props":2736,"children":2737},{},[2738],{"type":57,"value":2739},"Header\u002Ffooter:",{"type":57,"value":2741}," reconstruct the header from the SOURCE header — never from WordPress's page list. The deterministic ",{"type":51,"tag":74,"props":2743,"children":2745},{"className":2744},[],[2746],{"type":57,"value":1261},{"type":57,"value":2748}," handler does this for you: it reads the captured ",{"type":51,"tag":74,"props":2750,"children":2752},{"className":2751},[],[2753],{"type":57,"value":2754},"html\u002Fhomepage.html",{"type":57,"value":2756},", extracts the real ",{"type":51,"tag":66,"props":2758,"children":2759},{},[2760],{"type":57,"value":2761},"logo image",{"type":57,"value":2763}," + the ",{"type":51,"tag":66,"props":2765,"children":2766},{},[2767],{"type":57,"value":2768},"primary top-level nav",{"type":57,"value":2770}," (label + href) via ",{"type":51,"tag":74,"props":2772,"children":2774},{"className":2773},[],[2775],{"type":57,"value":2776},"extractThemeChromeFromHtml",{"type":57,"value":2778},", infers light\u002Fdark header tone, and emits explicit ",{"type":51,"tag":74,"props":2780,"children":2782},{"className":2781},[],[2783],{"type":57,"value":2784},"wp:navigation-link",{"type":57,"value":2786},"s + a ",{"type":51,"tag":74,"props":2788,"children":2790},{"className":2789},[],[2791],{"type":57,"value":2792},"core\u002Fimage",{"type":57,"value":2794}," logo. Requirements for any header you build or refine:",{"type":51,"tag":186,"props":2796,"children":2797},{},[2798,2839,2879],{"type":51,"tag":190,"props":2799,"children":2800},{},[2801,2806,2808,2814,2816,2822,2824,2830,2832,2837],{"type":51,"tag":66,"props":2802,"children":2803},{},[2804],{"type":57,"value":2805},"Logo:",{"type":57,"value":2807}," use the source's real logo image (",{"type":51,"tag":74,"props":2809,"children":2811},{"className":2810},[],[2812],{"type":57,"value":2813},"\u003Cheader>",{"type":57,"value":2815},"'s logo ",{"type":51,"tag":74,"props":2817,"children":2819},{"className":2818},[],[2820],{"type":57,"value":2821},"\u003Cimg>",{"type":57,"value":2823},"\u002FSVG — NOT a product image, NOT ",{"type":51,"tag":74,"props":2825,"children":2827},{"className":2826},[],[2828],{"type":57,"value":2829},"wp:site-title",{"type":57,"value":2831}," text). Fall back to ",{"type":51,"tag":74,"props":2833,"children":2835},{"className":2834},[],[2836],{"type":57,"value":2829},{"type":57,"value":2838}," only when no logo image exists.",{"type":51,"tag":190,"props":2840,"children":2841},{},[2842,2847,2849,2854,2856,2861,2863,2869,2871,2877],{"type":51,"tag":66,"props":2843,"children":2844},{},[2845],{"type":57,"value":2846},"Nav:",{"type":57,"value":2848}," explicit ",{"type":51,"tag":74,"props":2850,"children":2852},{"className":2851},[],[2853],{"type":57,"value":2784},{"type":57,"value":2855},"s for the source's ",{"type":51,"tag":66,"props":2857,"children":2858},{},[2859],{"type":57,"value":2860},"top-level primary menu only",{"type":57,"value":2862}," (e.g. Shopify ",{"type":51,"tag":74,"props":2864,"children":2866},{"className":2865},[],[2867],{"type":57,"value":2868},"nav.header__inline-menu",{"type":57,"value":2870}," top-level items). NEVER use ",{"type":51,"tag":74,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":57,"value":2876},"wp:page-list",{"type":57,"value":2878}," — it dumps every published WP page (Sample Page, Checkout, account, recall notices) as junk. Drop mega-menu sub-links, the mobile-drawer duplicate, and social\u002Faccount\u002Fcart\u002Fsearch affordances. Map nav items to local pages where they exist; keep external destinations (e.g. Support→Zendesk) as-is.",{"type":51,"tag":190,"props":2880,"children":2881},{},[2882,2887],{"type":51,"tag":66,"props":2883,"children":2884},{},[2885],{"type":57,"value":2886},"Announcement bar:",{"type":57,"value":2888}," preserve the source's top announcement\u002Futility bar when present.",{"type":51,"tag":60,"props":2890,"children":2891},{},[2892,2894,2899,2900,2905],{"type":57,"value":2893},"Build the footer from the cluster representative's footer spec. Write both to ",{"type":51,"tag":74,"props":2895,"children":2897},{"className":2896},[],[2898],{"type":57,"value":1440},{"type":57,"value":1285},{"type":51,"tag":74,"props":2901,"children":2903},{"className":2902},[],[2904],{"type":57,"value":1447},{"type":57,"value":760},{"type":51,"tag":60,"props":2907,"children":2908},{},[2909,2914,2915,2920,2922,2928,2930,2936,2938,2943,2945,2950,2952,2957,2958,2964,2966,2972,2974,2979,2981,2986,2988,2993,2995,3001,3002,3008],{"type":51,"tag":66,"props":2910,"children":2911},{},[2912],{"type":57,"value":2913},"Self-host source fonts:",{"type":57,"value":1176},{"type":51,"tag":74,"props":2916,"children":2918},{"className":2917},[],[2919],{"type":57,"value":1261},{"type":57,"value":2921}," parses ",{"type":51,"tag":74,"props":2923,"children":2925},{"className":2924},[],[2926],{"type":57,"value":2927},"@font-face",{"type":57,"value":2929}," rules from the captured HTML\u002FCSS, downloads the referenced font files into the theme ",{"type":51,"tag":74,"props":2931,"children":2933},{"className":2932},[],[2934],{"type":57,"value":2935},"assets\u002Ffonts\u002F",{"type":57,"value":2937},", emits matching ",{"type":51,"tag":74,"props":2939,"children":2941},{"className":2940},[],[2942],{"type":57,"value":2927},{"type":57,"value":2944}," rules into ",{"type":51,"tag":74,"props":2946,"children":2948},{"className":2947},[],[2949],{"type":57,"value":1072},{"type":57,"value":2951},", and binds the captured family in ",{"type":51,"tag":74,"props":2953,"children":2955},{"className":2954},[],[2956],{"type":57,"value":1065},{"type":57,"value":1176},{"type":51,"tag":74,"props":2959,"children":2961},{"className":2960},[],[2962],{"type":57,"value":2963},"settings.typography.fontFamilies",{"type":57,"value":2965}," (with ",{"type":51,"tag":74,"props":2967,"children":2969},{"className":2968},[],[2970],{"type":57,"value":2971},"fontFace[]",{"type":57,"value":2973},"). This is generic — it captures whatever the source self-hosts (e.g. getsnooz.com loads ",{"type":51,"tag":66,"props":2975,"children":2976},{},[2977],{"type":57,"value":2978},"Larsseit",{"type":57,"value":2980}," from the Shopify CDN), not a hardcoded list. The display\u002Fheading family is rebound to the real captured typeface even when ",{"type":51,"tag":74,"props":2982,"children":2984},{"className":2983},[],[2985],{"type":57,"value":329},{"type":57,"value":2987}," recorded an open ",{"type":51,"tag":242,"props":2989,"children":2990},{},[2991],{"type":57,"value":2992},"substitute",{"type":57,"value":2994}," (e.g. \"Poppins, sans-serif\" → corrected back to self-hosted Larsseit). Never leave headings\u002Fbody in a system fallback when the source's font is self-hostable. Bogus captured line-heights (",{"type":51,"tag":74,"props":2996,"children":2998},{"className":2997},[],[2999],{"type":57,"value":3000},"0",{"type":57,"value":217},{"type":51,"tag":74,"props":3003,"children":3005},{"className":3004},[],[3006],{"type":57,"value":3007},"0px",{"type":57,"value":3009},") are sanitized to a sane default.",{"type":51,"tag":60,"props":3011,"children":3012},{},[3013,3018,3020,3026],{"type":51,"tag":66,"props":3014,"children":3015},{},[3016],{"type":57,"value":3017},"Posts:",{"type":57,"value":3019}," render through ",{"type":51,"tag":74,"props":3021,"children":3023},{"className":3022},[],[3024],{"type":57,"value":3025},"templates\u002Fsingle.html",{"type":57,"value":3027}," + blog\u002Farchive template + Query Loop. No per-post section reconstruction.",{"type":51,"tag":60,"props":3029,"children":3030},{},[3031,3036,3037,3043,3044,3050],{"type":51,"tag":66,"props":3032,"children":3033},{},[3034],{"type":57,"value":3035},"Products:",{"type":57,"value":3019},{"type":51,"tag":74,"props":3038,"children":3040},{"className":3039},[],[3041],{"type":57,"value":3042},"templates\u002Fsingle-product.html",{"type":57,"value":391},{"type":51,"tag":74,"props":3045,"children":3047},{"className":3046},[],[3048],{"type":57,"value":3049},"templates\u002Farchive-product.html",{"type":57,"value":3051}," + WooCommerce. No per-product section reconstruction.",{"type":51,"tag":60,"props":3053,"children":3054},{},[3055],{"type":57,"value":3056},"Assemble all theme files into a single in-memory array for install:",{"type":51,"tag":3058,"props":3059,"children":3064},"pre",{"className":3060,"code":3061,"language":3062,"meta":3063,"style":3063},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","themeFiles: [\n  { relativePath: \"style.css\", content: \"\u002F* Theme Name: ... *\u002F\" },\n  { relativePath: \"theme.json\", content: \"...\" },\n  { relativePath: \"functions.php\", content: \"\u003C?php ...\" },\n  { relativePath: \"templates\u002Findex.html\", content: \"\u003C!-- wp:... -->\" },\n  { relativePath: \"templates\u002Fpage.html\", content: \"...\" },\n  { relativePath: \"templates\u002Fsingle.html\", content: \"...\" },\n  { relativePath: \"templates\u002Fsingle-product.html\", content: \"...\" },\n  { relativePath: \"templates\u002Farchive-product.html\", content: \"...\" },\n  { relativePath: \"parts\u002Fheader.html\", content: \"...\" },\n  { relativePath: \"parts\u002Ffooter.html\", content: \"...\" },\n  { relativePath: \"patterns\u002F\u003Ccluster-slug>.php\", content: \"\u003C?php \u002F** Title: ... *\u002F ?> ...\" },\n  \u002F\u002F ...one pattern file per cluster representative's built layout skeleton\n]\n","ts","",[3065],{"type":51,"tag":74,"props":3066,"children":3067},{"__ignoreMap":3063},[3068,3091,3157,3214,3271,3329,3386,3442,3498,3554,3611,3668,3726,3736],{"type":51,"tag":3069,"props":3070,"children":3072},"span",{"class":3071,"line":29},"line",[3073,3079,3085],{"type":51,"tag":3069,"props":3074,"children":3076},{"style":3075},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[3077],{"type":57,"value":3078},"themeFiles",{"type":51,"tag":3069,"props":3080,"children":3082},{"style":3081},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[3083],{"type":57,"value":3084},":",{"type":51,"tag":3069,"props":3086,"children":3088},{"style":3087},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[3089],{"type":57,"value":3090}," [\n",{"type":51,"tag":3069,"props":3092,"children":3094},{"class":3071,"line":3093},2,[3095,3100,3106,3110,3115,3120,3125,3130,3135,3139,3143,3148,3152],{"type":51,"tag":3069,"props":3096,"children":3097},{"style":3081},[3098],{"type":57,"value":3099},"  {",{"type":51,"tag":3069,"props":3101,"children":3103},{"style":3102},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[3104],{"type":57,"value":3105}," relativePath",{"type":51,"tag":3069,"props":3107,"children":3108},{"style":3081},[3109],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3111,"children":3112},{"style":3081},[3113],{"type":57,"value":3114}," \"",{"type":51,"tag":3069,"props":3116,"children":3118},{"style":3117},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[3119],{"type":57,"value":1072},{"type":51,"tag":3069,"props":3121,"children":3122},{"style":3081},[3123],{"type":57,"value":3124},"\"",{"type":51,"tag":3069,"props":3126,"children":3127},{"style":3081},[3128],{"type":57,"value":3129},",",{"type":51,"tag":3069,"props":3131,"children":3132},{"style":3102},[3133],{"type":57,"value":3134}," content",{"type":51,"tag":3069,"props":3136,"children":3137},{"style":3081},[3138],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3140,"children":3141},{"style":3081},[3142],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3144,"children":3145},{"style":3117},[3146],{"type":57,"value":3147},"\u002F* Theme Name: ... *\u002F",{"type":51,"tag":3069,"props":3149,"children":3150},{"style":3081},[3151],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3153,"children":3154},{"style":3081},[3155],{"type":57,"value":3156}," },\n",{"type":51,"tag":3069,"props":3158,"children":3160},{"class":3071,"line":3159},3,[3161,3165,3169,3173,3177,3181,3185,3189,3193,3197,3201,3206,3210],{"type":51,"tag":3069,"props":3162,"children":3163},{"style":3081},[3164],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3166,"children":3167},{"style":3102},[3168],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3170,"children":3171},{"style":3081},[3172],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3174,"children":3175},{"style":3081},[3176],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3178,"children":3179},{"style":3117},[3180],{"type":57,"value":1065},{"type":51,"tag":3069,"props":3182,"children":3183},{"style":3081},[3184],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3186,"children":3187},{"style":3081},[3188],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3190,"children":3191},{"style":3102},[3192],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3194,"children":3195},{"style":3081},[3196],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3198,"children":3199},{"style":3081},[3200],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3202,"children":3203},{"style":3117},[3204],{"type":57,"value":3205},"...",{"type":51,"tag":3069,"props":3207,"children":3208},{"style":3081},[3209],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3211,"children":3212},{"style":3081},[3213],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3215,"children":3217},{"class":3071,"line":3216},4,[3218,3222,3226,3230,3234,3238,3242,3246,3250,3254,3258,3263,3267],{"type":51,"tag":3069,"props":3219,"children":3220},{"style":3081},[3221],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3223,"children":3224},{"style":3102},[3225],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3227,"children":3228},{"style":3081},[3229],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3231,"children":3232},{"style":3081},[3233],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3235,"children":3236},{"style":3117},[3237],{"type":57,"value":1079},{"type":51,"tag":3069,"props":3239,"children":3240},{"style":3081},[3241],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3243,"children":3244},{"style":3081},[3245],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3247,"children":3248},{"style":3102},[3249],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3251,"children":3252},{"style":3081},[3253],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3255,"children":3256},{"style":3081},[3257],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3259,"children":3260},{"style":3117},[3261],{"type":57,"value":3262},"\u003C?php ...",{"type":51,"tag":3069,"props":3264,"children":3265},{"style":3081},[3266],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3268,"children":3269},{"style":3081},[3270],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3272,"children":3274},{"class":3071,"line":3273},5,[3275,3279,3283,3287,3291,3296,3300,3304,3308,3312,3316,3321,3325],{"type":51,"tag":3069,"props":3276,"children":3277},{"style":3081},[3278],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3280,"children":3281},{"style":3102},[3282],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3284,"children":3285},{"style":3081},[3286],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3288,"children":3289},{"style":3081},[3290],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3292,"children":3293},{"style":3117},[3294],{"type":57,"value":3295},"templates\u002Findex.html",{"type":51,"tag":3069,"props":3297,"children":3298},{"style":3081},[3299],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3301,"children":3302},{"style":3081},[3303],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3305,"children":3306},{"style":3102},[3307],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3309,"children":3310},{"style":3081},[3311],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3313,"children":3314},{"style":3081},[3315],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3317,"children":3318},{"style":3117},[3319],{"type":57,"value":3320},"\u003C!-- wp:... -->",{"type":51,"tag":3069,"props":3322,"children":3323},{"style":3081},[3324],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3326,"children":3327},{"style":3081},[3328],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3330,"children":3332},{"class":3071,"line":3331},6,[3333,3337,3341,3345,3349,3354,3358,3362,3366,3370,3374,3378,3382],{"type":51,"tag":3069,"props":3334,"children":3335},{"style":3081},[3336],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3338,"children":3339},{"style":3102},[3340],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3342,"children":3343},{"style":3081},[3344],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3346,"children":3347},{"style":3081},[3348],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3350,"children":3351},{"style":3117},[3352],{"type":57,"value":3353},"templates\u002Fpage.html",{"type":51,"tag":3069,"props":3355,"children":3356},{"style":3081},[3357],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3359,"children":3360},{"style":3081},[3361],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3363,"children":3364},{"style":3102},[3365],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3367,"children":3368},{"style":3081},[3369],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3371,"children":3372},{"style":3081},[3373],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3375,"children":3376},{"style":3117},[3377],{"type":57,"value":3205},{"type":51,"tag":3069,"props":3379,"children":3380},{"style":3081},[3381],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3383,"children":3384},{"style":3081},[3385],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3387,"children":3389},{"class":3071,"line":3388},7,[3390,3394,3398,3402,3406,3410,3414,3418,3422,3426,3430,3434,3438],{"type":51,"tag":3069,"props":3391,"children":3392},{"style":3081},[3393],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3395,"children":3396},{"style":3102},[3397],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3399,"children":3400},{"style":3081},[3401],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3403,"children":3404},{"style":3081},[3405],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3407,"children":3408},{"style":3117},[3409],{"type":57,"value":3025},{"type":51,"tag":3069,"props":3411,"children":3412},{"style":3081},[3413],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3415,"children":3416},{"style":3081},[3417],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3419,"children":3420},{"style":3102},[3421],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3423,"children":3424},{"style":3081},[3425],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3427,"children":3428},{"style":3081},[3429],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3431,"children":3432},{"style":3117},[3433],{"type":57,"value":3205},{"type":51,"tag":3069,"props":3435,"children":3436},{"style":3081},[3437],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3439,"children":3440},{"style":3081},[3441],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3443,"children":3445},{"class":3071,"line":3444},8,[3446,3450,3454,3458,3462,3466,3470,3474,3478,3482,3486,3490,3494],{"type":51,"tag":3069,"props":3447,"children":3448},{"style":3081},[3449],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3451,"children":3452},{"style":3102},[3453],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3455,"children":3456},{"style":3081},[3457],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3459,"children":3460},{"style":3081},[3461],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3463,"children":3464},{"style":3117},[3465],{"type":57,"value":3042},{"type":51,"tag":3069,"props":3467,"children":3468},{"style":3081},[3469],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3471,"children":3472},{"style":3081},[3473],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3475,"children":3476},{"style":3102},[3477],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3479,"children":3480},{"style":3081},[3481],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3483,"children":3484},{"style":3081},[3485],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3487,"children":3488},{"style":3117},[3489],{"type":57,"value":3205},{"type":51,"tag":3069,"props":3491,"children":3492},{"style":3081},[3493],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3495,"children":3496},{"style":3081},[3497],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3499,"children":3501},{"class":3071,"line":3500},9,[3502,3506,3510,3514,3518,3522,3526,3530,3534,3538,3542,3546,3550],{"type":51,"tag":3069,"props":3503,"children":3504},{"style":3081},[3505],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3507,"children":3508},{"style":3102},[3509],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3511,"children":3512},{"style":3081},[3513],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3515,"children":3516},{"style":3081},[3517],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3519,"children":3520},{"style":3117},[3521],{"type":57,"value":3049},{"type":51,"tag":3069,"props":3523,"children":3524},{"style":3081},[3525],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3527,"children":3528},{"style":3081},[3529],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3531,"children":3532},{"style":3102},[3533],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3535,"children":3536},{"style":3081},[3537],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3539,"children":3540},{"style":3081},[3541],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3543,"children":3544},{"style":3117},[3545],{"type":57,"value":3205},{"type":51,"tag":3069,"props":3547,"children":3548},{"style":3081},[3549],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3551,"children":3552},{"style":3081},[3553],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3555,"children":3557},{"class":3071,"line":3556},10,[3558,3562,3566,3570,3574,3579,3583,3587,3591,3595,3599,3603,3607],{"type":51,"tag":3069,"props":3559,"children":3560},{"style":3081},[3561],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3563,"children":3564},{"style":3102},[3565],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3567,"children":3568},{"style":3081},[3569],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3571,"children":3572},{"style":3081},[3573],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3575,"children":3576},{"style":3117},[3577],{"type":57,"value":3578},"parts\u002Fheader.html",{"type":51,"tag":3069,"props":3580,"children":3581},{"style":3081},[3582],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3584,"children":3585},{"style":3081},[3586],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3588,"children":3589},{"style":3102},[3590],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3592,"children":3593},{"style":3081},[3594],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3596,"children":3597},{"style":3081},[3598],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3600,"children":3601},{"style":3117},[3602],{"type":57,"value":3205},{"type":51,"tag":3069,"props":3604,"children":3605},{"style":3081},[3606],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3608,"children":3609},{"style":3081},[3610],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3612,"children":3614},{"class":3071,"line":3613},11,[3615,3619,3623,3627,3631,3636,3640,3644,3648,3652,3656,3660,3664],{"type":51,"tag":3069,"props":3616,"children":3617},{"style":3081},[3618],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3620,"children":3621},{"style":3102},[3622],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3624,"children":3625},{"style":3081},[3626],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3628,"children":3629},{"style":3081},[3630],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3632,"children":3633},{"style":3117},[3634],{"type":57,"value":3635},"parts\u002Ffooter.html",{"type":51,"tag":3069,"props":3637,"children":3638},{"style":3081},[3639],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3641,"children":3642},{"style":3081},[3643],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3645,"children":3646},{"style":3102},[3647],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3649,"children":3650},{"style":3081},[3651],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3653,"children":3654},{"style":3081},[3655],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3657,"children":3658},{"style":3117},[3659],{"type":57,"value":3205},{"type":51,"tag":3069,"props":3661,"children":3662},{"style":3081},[3663],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3665,"children":3666},{"style":3081},[3667],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3669,"children":3671},{"class":3071,"line":3670},12,[3672,3676,3680,3684,3688,3693,3697,3701,3705,3709,3713,3718,3722],{"type":51,"tag":3069,"props":3673,"children":3674},{"style":3081},[3675],{"type":57,"value":3099},{"type":51,"tag":3069,"props":3677,"children":3678},{"style":3102},[3679],{"type":57,"value":3105},{"type":51,"tag":3069,"props":3681,"children":3682},{"style":3081},[3683],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3685,"children":3686},{"style":3081},[3687],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3689,"children":3690},{"style":3117},[3691],{"type":57,"value":3692},"patterns\u002F\u003Ccluster-slug>.php",{"type":51,"tag":3069,"props":3694,"children":3695},{"style":3081},[3696],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3698,"children":3699},{"style":3081},[3700],{"type":57,"value":3129},{"type":51,"tag":3069,"props":3702,"children":3703},{"style":3102},[3704],{"type":57,"value":3134},{"type":51,"tag":3069,"props":3706,"children":3707},{"style":3081},[3708],{"type":57,"value":3084},{"type":51,"tag":3069,"props":3710,"children":3711},{"style":3081},[3712],{"type":57,"value":3114},{"type":51,"tag":3069,"props":3714,"children":3715},{"style":3117},[3716],{"type":57,"value":3717},"\u003C?php \u002F** Title: ... *\u002F ?> ...",{"type":51,"tag":3069,"props":3719,"children":3720},{"style":3081},[3721],{"type":57,"value":3124},{"type":51,"tag":3069,"props":3723,"children":3724},{"style":3081},[3725],{"type":57,"value":3156},{"type":51,"tag":3069,"props":3727,"children":3729},{"class":3071,"line":3728},13,[3730],{"type":51,"tag":3069,"props":3731,"children":3733},{"style":3732},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[3734],{"type":57,"value":3735},"  \u002F\u002F ...one pattern file per cluster representative's built layout skeleton\n",{"type":51,"tag":3069,"props":3737,"children":3739},{"class":3071,"line":3738},14,[3740],{"type":51,"tag":3069,"props":3741,"children":3742},{"style":3087},[3743],{"type":57,"value":3744},"]\n",{"type":51,"tag":60,"props":3746,"children":3747},{},[3748,3750,3756,3757,3763,3765,3771,3772,3777,3779,3785,3787,3793,3794,3799,3800,3806,3808,3814,3816,3822,3823,3829],{"type":57,"value":3749},"Custom blocks (rare — only when core blocks cannot express a real source interactive component) embed in the theme as ",{"type":51,"tag":74,"props":3751,"children":3753},{"className":3752},[],[3754],{"type":57,"value":3755},"blocks\u002F\u003Cslug>\u002Fsrc\u002F",{"type":57,"value":391},{"type":51,"tag":74,"props":3758,"children":3760},{"className":3759},[],[3761],{"type":57,"value":3762},"blocks\u002F\u003Cslug>\u002Fbuild\u002F",{"type":57,"value":3764},". Register from ",{"type":51,"tag":74,"props":3766,"children":3768},{"className":3767},[],[3769],{"type":57,"value":3770},"build\u002F",{"type":57,"value":1518},{"type":51,"tag":74,"props":3773,"children":3775},{"className":3774},[],[3776],{"type":57,"value":1079},{"type":57,"value":3778}," via ",{"type":51,"tag":74,"props":3780,"children":3782},{"className":3781},[],[3783],{"type":57,"value":3784},"register_block_type",{"type":57,"value":3786},". Emit both ",{"type":51,"tag":74,"props":3788,"children":3790},{"className":3789},[],[3791],{"type":57,"value":3792},"src\u002F",{"type":57,"value":1285},{"type":51,"tag":74,"props":3795,"children":3797},{"className":3796},[],[3798],{"type":57,"value":3770},{"type":57,"value":1518},{"type":51,"tag":74,"props":3801,"children":3803},{"className":3802},[],[3804],{"type":57,"value":3805},"themeFiles[]",{"type":57,"value":3807},". Namespace: ",{"type":51,"tag":74,"props":3809,"children":3811},{"className":3810},[],[3812],{"type":57,"value":3813},"\u003CsiteSlug>-replica\u002F\u003Cblock-name>",{"type":57,"value":3815},". Use ",{"type":51,"tag":74,"props":3817,"children":3819},{"className":3818},[],[3820],{"type":57,"value":3821},"\"supports\": { \"html\": false }",{"type":57,"value":1285},{"type":51,"tag":74,"props":3824,"children":3826},{"className":3825},[],[3827],{"type":57,"value":3828},"\"apiVersion\": 3",{"type":57,"value":760},{"type":51,"tag":1265,"props":3831,"children":3833},{"id":3832},"step-6-validate",[3834],{"type":57,"value":3835},"Step 6 — Validate",{"type":51,"tag":60,"props":3837,"children":3838},{},[3839,3844,3846,3851,3853,3858,3860,3865,3867,3872,3874,3880,3882,3888,3890,3896],{"type":51,"tag":74,"props":3840,"children":3842},{"className":3841},[],[3843],{"type":57,"value":653},{"type":57,"value":3845}," ALREADY gates every page through ",{"type":51,"tag":74,"props":3847,"children":3849},{"className":3848},[],[3850],{"type":57,"value":2568},{"type":57,"value":3852}," against that page's own spec corpus and refuses to install a failing page — that is the authoritative trust boundary and it ran in Step 5. For an independent on-disk sweep, run ",{"type":51,"tag":74,"props":3854,"children":3856},{"className":3855},[],[3857],{"type":57,"value":775},{"type":57,"value":3859}," (auto-discovers ",{"type":51,"tag":74,"props":3861,"children":3863},{"className":3862},[],[3864],{"type":57,"value":783},{"type":57,"value":3866},"). Its security\u002Finjection\u002Fdrift checks are exact; its provenance check is APPROXIMATE (corpus from ",{"type":51,"tag":74,"props":3868,"children":3870},{"className":3869},[],[3871],{"type":57,"value":542},{"type":57,"value":3873},") and can FALSE-POSITIVE when the renderer concatenated text across source elements — verify any provenance flag against the source before treating it as real. The raw ",{"type":51,"tag":74,"props":3875,"children":3877},{"className":3876},[],[3878],{"type":57,"value":3879},"liberate_validate_artifacts",{"type":57,"value":3881}," MCP tool takes ",{"type":51,"tag":74,"props":3883,"children":3885},{"className":3884},[],[3886],{"type":57,"value":3887},"{ patterns: ArtifactPattern[] }",{"type":57,"value":3889}," (not ",{"type":51,"tag":74,"props":3891,"children":3893},{"className":3892},[],[3894],{"type":57,"value":3895},"{ outputDir }",{"type":57,"value":3897},").",{"type":51,"tag":60,"props":3899,"children":3900},{},[3901],{"type":57,"value":3902},"It asserts:",{"type":51,"tag":186,"props":3904,"children":3905},{},[3906,3929,3953,3958,3970,3982],{"type":51,"tag":190,"props":3907,"children":3908},{},[3909,3911,3916,3917,3922,3923,3928],{"type":57,"value":3910},"All source-derived text is escaped (",{"type":51,"tag":74,"props":3912,"children":3914},{"className":3913},[],[3915],{"type":57,"value":692},{"type":57,"value":694},{"type":51,"tag":74,"props":3918,"children":3920},{"className":3919},[],[3921],{"type":57,"value":700},{"type":57,"value":694},{"type":51,"tag":74,"props":3924,"children":3926},{"className":3925},[],[3927],{"type":57,"value":707},{"type":57,"value":1760},{"type":51,"tag":190,"props":3930,"children":3931},{},[3932,3934,3939,3940,3945,3946,3951],{"type":57,"value":3933},"No raw ",{"type":51,"tag":74,"props":3935,"children":3937},{"className":3936},[],[3938],{"type":57,"value":715},{"type":57,"value":217},{"type":51,"tag":74,"props":3941,"children":3943},{"className":3942},[],[3944],{"type":57,"value":722},{"type":57,"value":217},{"type":51,"tag":74,"props":3947,"children":3949},{"className":3948},[],[3950],{"type":57,"value":729},{"type":57,"value":3952}," handlers in emitted markup (PHP injection + stored XSS defense)",{"type":51,"tag":190,"props":3954,"children":3955},{},[3956],{"type":57,"value":3957},"Emitted text is a subset of spec captured text (provenance — flags invented prose)",{"type":51,"tag":190,"props":3959,"children":3960},{},[3961,3963,3969],{"type":57,"value":3962},"No remote CDN URLs (all assets must be uploaded WP-library URLs or theme-shipped ",{"type":51,"tag":74,"props":3964,"children":3966},{"className":3965},[],[3967],{"type":57,"value":3968},"assets\u002F",{"type":57,"value":1760},{"type":51,"tag":190,"props":3971,"children":3972},{},[3973,3975,3980],{"type":57,"value":3974},"No unresolved ",{"type":51,"tag":74,"props":3976,"children":3978},{"className":3977},[],[3979],{"type":57,"value":737},{"type":57,"value":3981}," text",{"type":51,"tag":190,"props":3983,"children":3984},{},[3985],{"type":57,"value":3986},"Block-comment-only markup",{"type":51,"tag":60,"props":3988,"children":3989},{},[3990,3995,3997,4003],{"type":51,"tag":66,"props":3991,"children":3992},{},[3993],{"type":57,"value":3994},"Fail → fix the patterns\u002Ftemplates, do not install.",{"type":57,"value":3996}," Gate failures surface in ",{"type":51,"tag":74,"props":3998,"children":4000},{"className":3999},[],[4001],{"type":57,"value":4002},"run-report.json",{"type":57,"value":760},{"type":51,"tag":1265,"props":4005,"children":4007},{"id":4006},"step-7-install-qa",[4008],{"type":57,"value":4009},"Step 7 — Install + QA",{"type":51,"tag":60,"props":4011,"children":4012},{},[4013,4018,4020,4026,4028,4034,4036,4041,4043,4049,4051,4057,4059,4064],{"type":51,"tag":66,"props":4014,"children":4015},{},[4016],{"type":57,"value":4017},"Blockify post\u002Fpage bodies (blocks path only):",{"type":57,"value":4019}," BEFORE importing, call ",{"type":51,"tag":74,"props":4021,"children":4023},{"className":4022},[],[4024],{"type":57,"value":4025},"liberate_blockify_wxr({ outputDir })",{"type":57,"value":4027},". It rewrites every post\u002Fpage ",{"type":51,"tag":74,"props":4029,"children":4031},{"className":4030},[],[4032],{"type":57,"value":4033},"content:encoded",{"type":57,"value":4035}," body in ",{"type":51,"tag":74,"props":4037,"children":4039},{"className":4038},[],[4040],{"type":57,"value":139},{"type":57,"value":4042}," through the source adapter's block recipe (seam 2) so imported posts land as editable Gutenberg blocks instead of one Classic block (e.g. Squarespace ",{"type":51,"tag":74,"props":4044,"children":4046},{"className":4045},[],[4047],{"type":57,"value":4048},"sqs-block",{"type":57,"value":4050}," bodies). No-op when the platform adapter has no recipe (",{"type":51,"tag":74,"props":4052,"children":4054},{"className":4053},[],[4055],{"type":57,"value":4056},"skipped:true",{"type":57,"value":4058},"); lossless otherwise — bodies it can't convert stay verbatim, and attachments\u002Fnav\u002Fterms are untouched. It mutates ",{"type":51,"tag":74,"props":4060,"children":4062},{"className":4061},[],[4063],{"type":57,"value":139},{"type":57,"value":4065}," in place, so it MUST run before the import below. (Blog posts are imported as-is — not section-reconstructed — so this is the only thing that blockifies their bodies. The theme\u002Fcarry path never calls this.)",{"type":51,"tag":60,"props":4067,"children":4068},{},[4069],{"type":51,"tag":66,"props":4070,"children":4071},{},[4072],{"type":57,"value":4073},"Install:",{"type":51,"tag":186,"props":4075,"children":4076},{},[4077,4102],{"type":51,"tag":190,"props":4078,"children":4079},{},[4080,4085,4087,4092,4094,4100],{"type":51,"tag":66,"props":4081,"children":4082},{},[4083],{"type":57,"value":4084},"Streaming \u002F watch-loop context:",{"type":57,"value":4086}," call ",{"type":51,"tag":74,"props":4088,"children":4090},{"className":4089},[],[4091],{"type":57,"value":804},{"type":57,"value":4093}," using the exact ",{"type":51,"tag":74,"props":4095,"children":4097},{"className":4096},[],[4098],{"type":57,"value":4099},"themeSlug",{"type":57,"value":4101}," value from the runner prompt. Writes files into the running Studio site and activates. No site creation, no duplicate WXR import.",{"type":51,"tag":190,"props":4103,"children":4104},{},[4105,4110,4111,4117,4119,4124,4125,4130],{"type":51,"tag":66,"props":4106,"children":4107},{},[4108],{"type":57,"value":4109},"Standalone replicate:",{"type":57,"value":4086},{"type":51,"tag":74,"props":4112,"children":4114},{"className":4113},[],[4115],{"type":57,"value":4116},"liberate_preview({ outputDir, themeFiles, themeSlug: \"\u003CsiteSlug>-replica\" })",{"type":57,"value":4118},". Creates\u002Freuses a Studio site (clean site on full re-run; keep existing on resume) and imports ",{"type":51,"tag":74,"props":4120,"children":4122},{"className":4121},[],[4123],{"type":57,"value":139},{"type":57,"value":391},{"type":51,"tag":74,"props":4126,"children":4128},{"className":4127},[],[4129],{"type":57,"value":432},{"type":57,"value":760},{"type":51,"tag":60,"props":4132,"children":4133},{},[4134,4139,4140,4145,4147,4153,4155,4161,4163,4169,4171,4177,4179,4185,4186,4192,4194,4200,4202,4207],{"type":51,"tag":66,"props":4135,"children":4136},{},[4137],{"type":57,"value":4138},"Binary assets:",{"type":57,"value":1176},{"type":51,"tag":74,"props":4141,"children":4143},{"className":4142},[],[4144],{"type":57,"value":3805},{"type":57,"value":4146}," is text-only — the self-hosted fonts (",{"type":51,"tag":74,"props":4148,"children":4150},{"className":4149},[],[4151],{"type":57,"value":4152},".woff2",{"type":57,"value":4154},"), localized ",{"type":51,"tag":74,"props":4156,"children":4158},{"className":4157},[],[4159],{"type":57,"value":4160},"logo.png",{"type":57,"value":4162},", and icon SVGs live on disk at ",{"type":51,"tag":74,"props":4164,"children":4166},{"className":4165},[],[4167],{"type":57,"value":4168},"\u003CoutputDir>\u002Ftheme\u002Fassets\u002F",{"type":57,"value":4170}," (written by ",{"type":51,"tag":74,"props":4172,"children":4174},{"className":4173},[],[4175],{"type":57,"value":4176},"liberate_theme_scaffold persist:true",{"type":57,"value":4178},"). Both ",{"type":51,"tag":74,"props":4180,"children":4182},{"className":4181},[],[4183],{"type":57,"value":4184},"liberate_install_theme",{"type":57,"value":1285},{"type":51,"tag":74,"props":4187,"children":4189},{"className":4188},[],[4190],{"type":57,"value":4191},"liberate_preview",{"type":57,"value":4193}," now bridge them via ",{"type":51,"tag":74,"props":4195,"children":4197},{"className":4196},[],[4198],{"type":57,"value":4199},"assetSourceDir",{"type":57,"value":4201},". If you install by some other path (e.g. a manual copy), you MUST also copy ",{"type":51,"tag":74,"props":4203,"children":4205},{"className":4204},[],[4206],{"type":57,"value":4168},{"type":57,"value":4208}," into the live theme or the replica renders with system fonts and a broken logo.",{"type":51,"tag":60,"props":4210,"children":4211},{},[4212,4217,4218,4223,4225,4231,4232,4238,4240,4245,4247,4253],{"type":51,"tag":66,"props":4213,"children":4214},{},[4215],{"type":57,"value":4216},"Reconstruct order:",{"type":57,"value":1176},{"type":51,"tag":74,"props":4219,"children":4221},{"className":4220},[],[4222],{"type":57,"value":653},{"type":57,"value":4224}," requires the theme already installed in the live Studio site, so install (above) FIRST, then run Step 5's reconstruct against the resulting ",{"type":51,"tag":74,"props":4226,"children":4228},{"className":4227},[],[4229],{"type":57,"value":4230},"studioSitePath",{"type":57,"value":133},{"type":51,"tag":74,"props":4233,"children":4235},{"className":4234},[],[4236],{"type":57,"value":4237},"~\u002FStudio\u002F\u003CsiteName>",{"type":57,"value":4239},"). ",{"type":51,"tag":74,"props":4241,"children":4243},{"className":4242},[],[4244],{"type":57,"value":4191},{"type":57,"value":4246}," returns ",{"type":51,"tag":74,"props":4248,"children":4250},{"className":4249},[],[4251],{"type":57,"value":4252},"siteName",{"type":57,"value":4254},", not the path.",{"type":51,"tag":60,"props":4256,"children":4257},{},[4258,4260,4266,4267,4273],{"type":57,"value":4259},"Verify: ",{"type":51,"tag":74,"props":4261,"children":4263},{"className":4262},[],[4264],{"type":57,"value":4265},"themeWritten > 0",{"type":57,"value":1285},{"type":51,"tag":74,"props":4268,"children":4270},{"className":4269},[],[4271],{"type":57,"value":4272},"warnings",{"type":57,"value":4274}," empty. Capture the replica URL.",{"type":51,"tag":60,"props":4276,"children":4277},{},[4278],{"type":51,"tag":66,"props":4279,"children":4280},{},[4281],{"type":57,"value":4282},"Site hygiene (verify after install — the WXR imports onto a fresh WP install):",{"type":51,"tag":186,"props":4284,"children":4285},{},[4286,4348],{"type":51,"tag":190,"props":4287,"children":4288},{},[4289,4294,4295,4300,4302,4308,4309,4315,4317,4323,4325,4331,4333,4339,4341,4346],{"type":51,"tag":66,"props":4290,"children":4291},{},[4292],{"type":57,"value":4293},"Static front page.",{"type":57,"value":1176},{"type":51,"tag":74,"props":4296,"children":4298},{"className":4297},[],[4299],{"type":57,"value":653},{"type":57,"value":4301}," sets ",{"type":51,"tag":74,"props":4303,"children":4305},{"className":4304},[],[4306],{"type":57,"value":4307},"show_on_front=page",{"type":57,"value":391},{"type":51,"tag":74,"props":4310,"children":4312},{"className":4311},[],[4313],{"type":57,"value":4314},"page_on_front",{"type":57,"value":4316}," to the ",{"type":51,"tag":74,"props":4318,"children":4320},{"className":4319},[],[4321],{"type":57,"value":4322},"isHome",{"type":57,"value":4324}," page. Confirm ",{"type":51,"tag":74,"props":4326,"children":4328},{"className":4327},[],[4329],{"type":57,"value":4330},"wp option get show_on_front",{"type":57,"value":4332}," == ",{"type":51,"tag":74,"props":4334,"children":4336},{"className":4335},[],[4337],{"type":57,"value":4338},"page",{"type":57,"value":4340},"; otherwise ",{"type":51,"tag":74,"props":4342,"children":4344},{"className":4343},[],[4345],{"type":57,"value":694},{"type":57,"value":4347}," renders the blog index, not the homepage reconstruction.",{"type":51,"tag":190,"props":4349,"children":4350},{},[4351,4356,4358,4364,4366,4372,4374,4380,4382,4388,4390,4396,4398,4404,4406,4411,4413,4419,4421,4427,4429,4435,4436,4442,4443,4448,4450,4456],{"type":51,"tag":66,"props":4352,"children":4353},{},[4354],{"type":57,"value":4355},"WP-default junk + slug collisions.",{"type":57,"value":4357}," A fresh WP install ships ",{"type":51,"tag":74,"props":4359,"children":4361},{"className":4360},[],[4362],{"type":57,"value":4363},"Sample Page",{"type":57,"value":4365},", a ",{"type":51,"tag":74,"props":4367,"children":4369},{"className":4368},[],[4370],{"type":57,"value":4371},"Hello world!",{"type":57,"value":4373}," post, and an auto-drafted ",{"type":51,"tag":74,"props":4375,"children":4377},{"className":4376},[],[4378],{"type":57,"value":4379},"Privacy Policy",{"type":57,"value":4381},". The default ",{"type":51,"tag":74,"props":4383,"children":4385},{"className":4384},[],[4386],{"type":57,"value":4387},"privacy-policy",{"type":57,"value":4389}," draft STEALS the slug, forcing the source privacy page to import as ",{"type":51,"tag":74,"props":4391,"children":4393},{"className":4392},[],[4394],{"type":57,"value":4395},"privacy-policy-2",{"type":57,"value":4397}," — which then mismatches the ",{"type":51,"tag":74,"props":4399,"children":4401},{"className":4400},[],[4402],{"type":57,"value":4403},"slug",{"type":57,"value":4405}," you pass to ",{"type":51,"tag":74,"props":4407,"children":4409},{"className":4408},[],[4410],{"type":57,"value":1216},{"type":57,"value":4412}," (it would write the reconstruction into the wrong post). ",{"type":51,"tag":74,"props":4414,"children":4416},{"className":4415},[],[4417],{"type":57,"value":4418},"startStudioPreview",{"type":57,"value":4420}," deletes these defaults before import; if you import some other way, delete them first (",{"type":51,"tag":74,"props":4422,"children":4424},{"className":4423},[],[4425],{"type":57,"value":4426},"wp post delete",{"type":57,"value":4428}," by slug ",{"type":51,"tag":74,"props":4430,"children":4432},{"className":4431},[],[4433],{"type":57,"value":4434},"sample-page",{"type":57,"value":694},{"type":51,"tag":74,"props":4437,"children":4439},{"className":4438},[],[4440],{"type":57,"value":4441},"hello-world",{"type":57,"value":694},{"type":51,"tag":74,"props":4444,"children":4446},{"className":4445},[],[4447],{"type":57,"value":4387},{"type":57,"value":4449},") and confirm imported pages kept their source slugs (",{"type":51,"tag":74,"props":4451,"children":4453},{"className":4452},[],[4454],{"type":57,"value":4455},"wp post list --post_type=page --fields=ID,post_name",{"type":57,"value":3897},{"type":51,"tag":60,"props":4458,"children":4459},{},[4460,4465,4467,4473,4475,4480,4482,4488,4490,4495],{"type":51,"tag":66,"props":4461,"children":4462},{},[4463],{"type":57,"value":4464},"QA:",{"type":57,"value":4466}," run ",{"type":51,"tag":74,"props":4468,"children":4470},{"className":4469},[],[4471],{"type":57,"value":4472},"liberate_compare",{"type":57,"value":4474}," to write comparison.json (v2) with per-viewport height metrics, then invoke ",{"type":51,"tag":74,"props":4476,"children":4478},{"className":4477},[],[4479],{"type":57,"value":852},{"type":57,"value":4481}," with the replica screenshots directory passed as ",{"type":51,"tag":74,"props":4483,"children":4485},{"className":4484},[],[4486],{"type":57,"value":4487},"replicaShotsDir",{"type":57,"value":4489}," so the parity gate can use the comparison data. ",{"type":51,"tag":74,"props":4491,"children":4493},{"className":4492},[],[4494],{"type":57,"value":852},{"type":57,"value":4496}," captures replica desktop + mobile screenshots, pairs them with source screenshots, runs the responsiveness gate (390px — HARD: no horizontal overflow, sections reflow), and produces qualitative observations + A\u002FB\u002FC classification per archetype representative.",{"type":51,"tag":186,"props":4498,"children":4499},{},[4500,4510,4520,4550,4584,4602],{"type":51,"tag":190,"props":4501,"children":4502},{},[4503,4508],{"type":51,"tag":66,"props":4504,"children":4505},{},[4506],{"type":57,"value":4507},"Responsiveness gate is hard.",{"type":57,"value":4509}," A theme that overflows at 390px fails, full stop.",{"type":51,"tag":190,"props":4511,"children":4512},{},[4513,4518],{"type":51,"tag":66,"props":4514,"children":4515},{},[4516],{"type":57,"value":4517},"Grade EVERY page, not just one representative per archetype",{"type":57,"value":4519}," — the user sees every page, and a cluster's non-rep members can differ sharply from its rep. QA must screenshot + classify each reconstructed page.",{"type":51,"tag":190,"props":4521,"children":4522},{},[4523,4542,4544,4549],{"type":51,"tag":66,"props":4524,"children":4525},{},[4526,4528,4533,4535,4540],{"type":57,"value":4527},"A page rendering carried ",{"type":51,"tag":74,"props":4529,"children":4531},{"className":4530},[],[4532],{"type":57,"value":2605},{"type":57,"value":4534}," (raw source-platform HTML) through ",{"type":51,"tag":74,"props":4536,"children":4538},{"className":4537},[],[4539],{"type":57,"value":2613},{"type":57,"value":4541}," is a FAIL (C), never a B\u002F\"pass-with-notes\".",{"type":57,"value":4543}," It is not a faithful reconstruction — it is the absence of one. The overall verdict cannot be \"pass\" while any content page is carried-HTML; fix it by running that page through ",{"type":51,"tag":74,"props":4545,"children":4547},{"className":4546},[],[4548],{"type":57,"value":653},{"type":57,"value":760},{"type":51,"tag":190,"props":4551,"children":4552},{},[4553,4558,4560,4566,4568,4574,4576,4582],{"type":51,"tag":66,"props":4554,"children":4555},{},[4556],{"type":57,"value":4557},"Visual parity is a hard gate.",{"type":57,"value":4559}," Every content-page section gets a measured ",{"type":51,"tag":74,"props":4561,"children":4563},{"className":4562},[],[4564],{"type":57,"value":4565},"SectionParity",{"type":57,"value":4567}," record; any unaccepted ",{"type":51,"tag":74,"props":4569,"children":4571},{"className":4570},[],[4572],{"type":57,"value":4573},"divergent",{"type":57,"value":4575}," section (flattened columns, wrong band color, dropped media, unstyled island) keeps the run at ",{"type":51,"tag":74,"props":4577,"children":4579},{"className":4578},[],[4580],{"type":57,"value":4581},"fail",{"type":57,"value":4583},". Pixel-diff is a forces-inspection signal, not the gate value.",{"type":51,"tag":190,"props":4585,"children":4586},{},[4587,4589,4594,4596,4601],{"type":57,"value":4588},"Between iterations, climb the escalation ladder (R1 CSS → R2 rebuild block markup → R3 re-extract spec → R4 styled rebuild) — each iteration a STRONGER rung, not the same tweak; reinstall via ",{"type":51,"tag":74,"props":4590,"children":4592},{"className":4591},[],[4593],{"type":57,"value":4184},{"type":57,"value":4595},"; re-run ",{"type":51,"tag":74,"props":4597,"children":4599},{"className":4598},[],[4600],{"type":57,"value":852},{"type":57,"value":760},{"type":51,"tag":190,"props":4603,"children":4604},{},[4605,4610,4612,4618,4620,4626,4628,4633,4635,4640,4642,4647,4649,4654],{"type":51,"tag":66,"props":4606,"children":4607},{},[4608],{"type":57,"value":4609},"3 iterations is a circuit-breaker checkpoint, not an exit.",{"type":57,"value":4611}," If the ladder is exhausted without ",{"type":51,"tag":74,"props":4613,"children":4615},{"className":4614},[],[4616],{"type":57,"value":4617},"match",{"type":57,"value":4619},", do NOT log-and-ship: stop and ask the operator (raise budget · accept-with-sign-off · abandon page). Only an operator ",{"type":51,"tag":74,"props":4621,"children":4623},{"className":4622},[],[4624],{"type":57,"value":4625},"acceptance: { by: 'human', proof }",{"type":57,"value":4627}," (or a Class-C constraint with sampled-pixel proof) lets a ",{"type":51,"tag":74,"props":4629,"children":4631},{"className":4630},[],[4632],{"type":57,"value":4573},{"type":57,"value":4634}," section ship; everything else stays ",{"type":51,"tag":74,"props":4636,"children":4638},{"className":4637},[],[4639],{"type":57,"value":4581},{"type":57,"value":4641},". A larger foundation problem may still warrant amending ",{"type":51,"tag":74,"props":4643,"children":4645},{"className":4644},[],[4646],{"type":57,"value":361},{"type":57,"value":4648}," + re-running ",{"type":51,"tag":74,"props":4650,"children":4652},{"className":4651},[],[4653],{"type":57,"value":1054},{"type":57,"value":4655}," (full invalidation) as one rung.",{"type":51,"tag":60,"props":4657,"children":4658},{},[4659,4664],{"type":51,"tag":66,"props":4660,"children":4661},{},[4662],{"type":57,"value":4663},"Return",{"type":57,"value":4665}," a structured summary to the caller:",{"type":51,"tag":3058,"props":4667,"children":4671},{"className":4668,"code":4669,"language":4670,"meta":3063,"style":3063},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"siteSlug\": \"example-com-replica\",\n  \"themeSlug\": \"example-com-replica\",\n  \"target\": { \"kind\": \"studio\", \"siteId\": \"...\", \"url\": \"https:\u002F\u002Fexample-com-replica.wp.local\" },\n  \"archetypes\": [\"homepage\", \"page\", \"post\", \"product\"],\n  \"clustersBuilt\": 5,\n  \"clustersFailed\": 0,\n  \"misfitPages\": [],\n  \"qa\": { \"responsivePass\": true, \"qualitative\": \"B\", \"itersUsed\": 2 },\n  \"openQuestions\": [],\n  \"runReport\": \"\u003CoutputDir>\u002Frun-report.json\"\n}\n","json",[4672],{"type":51,"tag":74,"props":4673,"children":4674},{"__ignoreMap":3063},[4675,4683,4723,4758,4883,4976,5006,5035,5060,5166,5190,5224],{"type":51,"tag":3069,"props":4676,"children":4677},{"class":3071,"line":29},[4678],{"type":51,"tag":3069,"props":4679,"children":4680},{"style":3081},[4681],{"type":57,"value":4682},"{\n",{"type":51,"tag":3069,"props":4684,"children":4685},{"class":3071,"line":3093},[4686,4691,4697,4701,4705,4709,4714,4718],{"type":51,"tag":3069,"props":4687,"children":4688},{"style":3081},[4689],{"type":57,"value":4690},"  \"",{"type":51,"tag":3069,"props":4692,"children":4694},{"style":4693},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[4695],{"type":57,"value":4696},"siteSlug",{"type":51,"tag":3069,"props":4698,"children":4699},{"style":3081},[4700],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4702,"children":4703},{"style":3081},[4704],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4706,"children":4707},{"style":3081},[4708],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4710,"children":4711},{"style":3117},[4712],{"type":57,"value":4713},"example-com-replica",{"type":51,"tag":3069,"props":4715,"children":4716},{"style":3081},[4717],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4719,"children":4720},{"style":3081},[4721],{"type":57,"value":4722},",\n",{"type":51,"tag":3069,"props":4724,"children":4725},{"class":3071,"line":3159},[4726,4730,4734,4738,4742,4746,4750,4754],{"type":51,"tag":3069,"props":4727,"children":4728},{"style":3081},[4729],{"type":57,"value":4690},{"type":51,"tag":3069,"props":4731,"children":4732},{"style":4693},[4733],{"type":57,"value":4099},{"type":51,"tag":3069,"props":4735,"children":4736},{"style":3081},[4737],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4739,"children":4740},{"style":3081},[4741],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4743,"children":4744},{"style":3081},[4745],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4747,"children":4748},{"style":3117},[4749],{"type":57,"value":4713},{"type":51,"tag":3069,"props":4751,"children":4752},{"style":3081},[4753],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4755,"children":4756},{"style":3081},[4757],{"type":57,"value":4722},{"type":51,"tag":3069,"props":4759,"children":4760},{"class":3071,"line":3216},[4761,4765,4770,4774,4778,4783,4787,4792,4796,4800,4804,4809,4813,4817,4821,4826,4830,4834,4838,4842,4846,4850,4854,4858,4862,4866,4870,4875,4879],{"type":51,"tag":3069,"props":4762,"children":4763},{"style":3081},[4764],{"type":57,"value":4690},{"type":51,"tag":3069,"props":4766,"children":4767},{"style":4693},[4768],{"type":57,"value":4769},"target",{"type":51,"tag":3069,"props":4771,"children":4772},{"style":3081},[4773],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4775,"children":4776},{"style":3081},[4777],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4779,"children":4780},{"style":3081},[4781],{"type":57,"value":4782}," {",{"type":51,"tag":3069,"props":4784,"children":4785},{"style":3081},[4786],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4788,"children":4789},{"style":3075},[4790],{"type":57,"value":4791},"kind",{"type":51,"tag":3069,"props":4793,"children":4794},{"style":3081},[4795],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4797,"children":4798},{"style":3081},[4799],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4801,"children":4802},{"style":3081},[4803],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4805,"children":4806},{"style":3117},[4807],{"type":57,"value":4808},"studio",{"type":51,"tag":3069,"props":4810,"children":4811},{"style":3081},[4812],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4814,"children":4815},{"style":3081},[4816],{"type":57,"value":3129},{"type":51,"tag":3069,"props":4818,"children":4819},{"style":3081},[4820],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4822,"children":4823},{"style":3075},[4824],{"type":57,"value":4825},"siteId",{"type":51,"tag":3069,"props":4827,"children":4828},{"style":3081},[4829],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4831,"children":4832},{"style":3081},[4833],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4835,"children":4836},{"style":3081},[4837],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4839,"children":4840},{"style":3117},[4841],{"type":57,"value":3205},{"type":51,"tag":3069,"props":4843,"children":4844},{"style":3081},[4845],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4847,"children":4848},{"style":3081},[4849],{"type":57,"value":3129},{"type":51,"tag":3069,"props":4851,"children":4852},{"style":3081},[4853],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4855,"children":4856},{"style":3075},[4857],{"type":57,"value":2272},{"type":51,"tag":3069,"props":4859,"children":4860},{"style":3081},[4861],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4863,"children":4864},{"style":3081},[4865],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4867,"children":4868},{"style":3081},[4869],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4871,"children":4872},{"style":3117},[4873],{"type":57,"value":4874},"https:\u002F\u002Fexample-com-replica.wp.local",{"type":51,"tag":3069,"props":4876,"children":4877},{"style":3081},[4878],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4880,"children":4881},{"style":3081},[4882],{"type":57,"value":3156},{"type":51,"tag":3069,"props":4884,"children":4885},{"class":3071,"line":3273},[4886,4890,4895,4899,4903,4908,4912,4917,4921,4925,4929,4933,4937,4941,4945,4950,4954,4958,4962,4967,4971],{"type":51,"tag":3069,"props":4887,"children":4888},{"style":3081},[4889],{"type":57,"value":4690},{"type":51,"tag":3069,"props":4891,"children":4892},{"style":4693},[4893],{"type":57,"value":4894},"archetypes",{"type":51,"tag":3069,"props":4896,"children":4897},{"style":3081},[4898],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4900,"children":4901},{"style":3081},[4902],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4904,"children":4905},{"style":3081},[4906],{"type":57,"value":4907}," [",{"type":51,"tag":3069,"props":4909,"children":4910},{"style":3081},[4911],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4913,"children":4914},{"style":3117},[4915],{"type":57,"value":4916},"homepage",{"type":51,"tag":3069,"props":4918,"children":4919},{"style":3081},[4920],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4922,"children":4923},{"style":3081},[4924],{"type":57,"value":3129},{"type":51,"tag":3069,"props":4926,"children":4927},{"style":3081},[4928],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4930,"children":4931},{"style":3117},[4932],{"type":57,"value":4338},{"type":51,"tag":3069,"props":4934,"children":4935},{"style":3081},[4936],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4938,"children":4939},{"style":3081},[4940],{"type":57,"value":3129},{"type":51,"tag":3069,"props":4942,"children":4943},{"style":3081},[4944],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4946,"children":4947},{"style":3117},[4948],{"type":57,"value":4949},"post",{"type":51,"tag":3069,"props":4951,"children":4952},{"style":3081},[4953],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4955,"children":4956},{"style":3081},[4957],{"type":57,"value":3129},{"type":51,"tag":3069,"props":4959,"children":4960},{"style":3081},[4961],{"type":57,"value":3114},{"type":51,"tag":3069,"props":4963,"children":4964},{"style":3117},[4965],{"type":57,"value":4966},"product",{"type":51,"tag":3069,"props":4968,"children":4969},{"style":3081},[4970],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4972,"children":4973},{"style":3081},[4974],{"type":57,"value":4975},"],\n",{"type":51,"tag":3069,"props":4977,"children":4978},{"class":3071,"line":3331},[4979,4983,4988,4992,4996,5002],{"type":51,"tag":3069,"props":4980,"children":4981},{"style":3081},[4982],{"type":57,"value":4690},{"type":51,"tag":3069,"props":4984,"children":4985},{"style":4693},[4986],{"type":57,"value":4987},"clustersBuilt",{"type":51,"tag":3069,"props":4989,"children":4990},{"style":3081},[4991],{"type":57,"value":3124},{"type":51,"tag":3069,"props":4993,"children":4994},{"style":3081},[4995],{"type":57,"value":3084},{"type":51,"tag":3069,"props":4997,"children":4999},{"style":4998},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[5000],{"type":57,"value":5001}," 5",{"type":51,"tag":3069,"props":5003,"children":5004},{"style":3081},[5005],{"type":57,"value":4722},{"type":51,"tag":3069,"props":5007,"children":5008},{"class":3071,"line":3388},[5009,5013,5018,5022,5026,5031],{"type":51,"tag":3069,"props":5010,"children":5011},{"style":3081},[5012],{"type":57,"value":4690},{"type":51,"tag":3069,"props":5014,"children":5015},{"style":4693},[5016],{"type":57,"value":5017},"clustersFailed",{"type":51,"tag":3069,"props":5019,"children":5020},{"style":3081},[5021],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5023,"children":5024},{"style":3081},[5025],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5027,"children":5028},{"style":4998},[5029],{"type":57,"value":5030}," 0",{"type":51,"tag":3069,"props":5032,"children":5033},{"style":3081},[5034],{"type":57,"value":4722},{"type":51,"tag":3069,"props":5036,"children":5037},{"class":3071,"line":3444},[5038,5042,5047,5051,5055],{"type":51,"tag":3069,"props":5039,"children":5040},{"style":3081},[5041],{"type":57,"value":4690},{"type":51,"tag":3069,"props":5043,"children":5044},{"style":4693},[5045],{"type":57,"value":5046},"misfitPages",{"type":51,"tag":3069,"props":5048,"children":5049},{"style":3081},[5050],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5052,"children":5053},{"style":3081},[5054],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5056,"children":5057},{"style":3081},[5058],{"type":57,"value":5059}," [],\n",{"type":51,"tag":3069,"props":5061,"children":5062},{"class":3071,"line":3500},[5063,5067,5072,5076,5080,5084,5088,5093,5097,5101,5106,5110,5115,5119,5123,5127,5132,5136,5140,5144,5149,5153,5157,5162],{"type":51,"tag":3069,"props":5064,"children":5065},{"style":3081},[5066],{"type":57,"value":4690},{"type":51,"tag":3069,"props":5068,"children":5069},{"style":4693},[5070],{"type":57,"value":5071},"qa",{"type":51,"tag":3069,"props":5073,"children":5074},{"style":3081},[5075],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5077,"children":5078},{"style":3081},[5079],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5081,"children":5082},{"style":3081},[5083],{"type":57,"value":4782},{"type":51,"tag":3069,"props":5085,"children":5086},{"style":3081},[5087],{"type":57,"value":3114},{"type":51,"tag":3069,"props":5089,"children":5090},{"style":3075},[5091],{"type":57,"value":5092},"responsivePass",{"type":51,"tag":3069,"props":5094,"children":5095},{"style":3081},[5096],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5098,"children":5099},{"style":3081},[5100],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5102,"children":5103},{"style":3081},[5104],{"type":57,"value":5105}," true,",{"type":51,"tag":3069,"props":5107,"children":5108},{"style":3081},[5109],{"type":57,"value":3114},{"type":51,"tag":3069,"props":5111,"children":5112},{"style":3075},[5113],{"type":57,"value":5114},"qualitative",{"type":51,"tag":3069,"props":5116,"children":5117},{"style":3081},[5118],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5120,"children":5121},{"style":3081},[5122],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5124,"children":5125},{"style":3081},[5126],{"type":57,"value":3114},{"type":51,"tag":3069,"props":5128,"children":5129},{"style":3117},[5130],{"type":57,"value":5131},"B",{"type":51,"tag":3069,"props":5133,"children":5134},{"style":3081},[5135],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5137,"children":5138},{"style":3081},[5139],{"type":57,"value":3129},{"type":51,"tag":3069,"props":5141,"children":5142},{"style":3081},[5143],{"type":57,"value":3114},{"type":51,"tag":3069,"props":5145,"children":5146},{"style":3075},[5147],{"type":57,"value":5148},"itersUsed",{"type":51,"tag":3069,"props":5150,"children":5151},{"style":3081},[5152],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5154,"children":5155},{"style":3081},[5156],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5158,"children":5159},{"style":4998},[5160],{"type":57,"value":5161}," 2",{"type":51,"tag":3069,"props":5163,"children":5164},{"style":3081},[5165],{"type":57,"value":3156},{"type":51,"tag":3069,"props":5167,"children":5168},{"class":3071,"line":3556},[5169,5173,5178,5182,5186],{"type":51,"tag":3069,"props":5170,"children":5171},{"style":3081},[5172],{"type":57,"value":4690},{"type":51,"tag":3069,"props":5174,"children":5175},{"style":4693},[5176],{"type":57,"value":5177},"openQuestions",{"type":51,"tag":3069,"props":5179,"children":5180},{"style":3081},[5181],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5183,"children":5184},{"style":3081},[5185],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5187,"children":5188},{"style":3081},[5189],{"type":57,"value":5059},{"type":51,"tag":3069,"props":5191,"children":5192},{"class":3071,"line":3613},[5193,5197,5202,5206,5210,5214,5219],{"type":51,"tag":3069,"props":5194,"children":5195},{"style":3081},[5196],{"type":57,"value":4690},{"type":51,"tag":3069,"props":5198,"children":5199},{"style":4693},[5200],{"type":57,"value":5201},"runReport",{"type":51,"tag":3069,"props":5203,"children":5204},{"style":3081},[5205],{"type":57,"value":3124},{"type":51,"tag":3069,"props":5207,"children":5208},{"style":3081},[5209],{"type":57,"value":3084},{"type":51,"tag":3069,"props":5211,"children":5212},{"style":3081},[5213],{"type":57,"value":3114},{"type":51,"tag":3069,"props":5215,"children":5216},{"style":3117},[5217],{"type":57,"value":5218},"\u003CoutputDir>\u002Frun-report.json",{"type":51,"tag":3069,"props":5220,"children":5221},{"style":3081},[5222],{"type":57,"value":5223},"\"\n",{"type":51,"tag":3069,"props":5225,"children":5226},{"class":3071,"line":3670},[5227],{"type":51,"tag":3069,"props":5228,"children":5229},{"style":3081},[5230],{"type":57,"value":5231},"}\n",{"type":51,"tag":285,"props":5233,"children":5235},{"id":5234},"gates-summary",[5236],{"type":57,"value":5237},"Gates summary",{"type":51,"tag":487,"props":5239,"children":5240},{},[5241,5261],{"type":51,"tag":491,"props":5242,"children":5243},{},[5244],{"type":51,"tag":495,"props":5245,"children":5246},{},[5247,5252,5256],{"type":51,"tag":499,"props":5248,"children":5249},{},[5250],{"type":57,"value":5251},"Gate",{"type":51,"tag":499,"props":5253,"children":5254},{},[5255],{"type":57,"value":1009},{"type":51,"tag":499,"props":5257,"children":5258},{},[5259],{"type":57,"value":5260},"Hard?",{"type":51,"tag":510,"props":5262,"children":5263},{},[5264,5282,5300,5318,5336,5354,5402],{"type":51,"tag":495,"props":5265,"children":5266},{},[5267,5272,5277],{"type":51,"tag":517,"props":5268,"children":5269},{},[5270],{"type":57,"value":5271},"Build gate (theme.json schema v3 + lintThemeJson activation fatals)",{"type":51,"tag":517,"props":5273,"children":5274},{},[5275],{"type":57,"value":5276},"After step 1",{"type":51,"tag":517,"props":5278,"children":5279},{},[5280],{"type":57,"value":5281},"Yes — fix before continuing",{"type":51,"tag":495,"props":5283,"children":5284},{},[5285,5290,5295],{"type":51,"tag":517,"props":5286,"children":5287},{},[5288],{"type":57,"value":5289},"Per-cluster readiness check (specs complete before builder dispatch)",{"type":51,"tag":517,"props":5291,"children":5292},{},[5293],{"type":57,"value":5294},"Before step 4",{"type":51,"tag":517,"props":5296,"children":5297},{},[5298],{"type":57,"value":5299},"Yes — fix spec, don't dispatch",{"type":51,"tag":495,"props":5301,"children":5302},{},[5303,5308,5313],{"type":51,"tag":517,"props":5304,"children":5305},{},[5306],{"type":57,"value":5307},"Builder envelope validation (parseBuilderEnvelope)",{"type":51,"tag":517,"props":5309,"children":5310},{},[5311],{"type":57,"value":5312},"After step 4 each builder",{"type":51,"tag":517,"props":5314,"children":5315},{},[5316],{"type":57,"value":5317},"Yes — retry → sequential, never use partial",{"type":51,"tag":495,"props":5319,"children":5320},{},[5321,5326,5331],{"type":51,"tag":517,"props":5322,"children":5323},{},[5324],{"type":57,"value":5325},"validate-artifacts (escaping + provenance + injection + placeholders)",{"type":51,"tag":517,"props":5327,"children":5328},{},[5329],{"type":57,"value":5330},"Step 6, before every install",{"type":51,"tag":517,"props":5332,"children":5333},{},[5334],{"type":57,"value":5335},"Yes — fix, don't install",{"type":51,"tag":495,"props":5337,"children":5338},{},[5339,5344,5349],{"type":51,"tag":517,"props":5340,"children":5341},{},[5342],{"type":57,"value":5343},"Responsiveness gate (390px, no overflow, sections reflow)",{"type":51,"tag":517,"props":5345,"children":5346},{},[5347],{"type":57,"value":5348},"Step 7 QA",{"type":51,"tag":517,"props":5350,"children":5351},{},[5352],{"type":57,"value":5353},"Hard — fail = not done",{"type":51,"tag":495,"props":5355,"children":5356},{},[5357,5376,5380],{"type":51,"tag":517,"props":5358,"children":5359},{},[5360,5362,5367,5369,5375],{"type":57,"value":5361},"Visual-parity gate (measured ",{"type":51,"tag":74,"props":5363,"children":5365},{"className":5364},[],[5366],{"type":57,"value":4565},{"type":57,"value":5368}," per section; verdict via ",{"type":51,"tag":74,"props":5370,"children":5372},{"className":5371},[],[5373],{"type":57,"value":5374},"buildRunReport",{"type":57,"value":1760},{"type":51,"tag":517,"props":5377,"children":5378},{},[5379],{"type":57,"value":5348},{"type":51,"tag":517,"props":5381,"children":5382},{},[5383,5388,5390,5395,5397],{"type":51,"tag":66,"props":5384,"children":5385},{},[5386],{"type":57,"value":5387},"Hard",{"type":57,"value":5389}," — any unaccepted ",{"type":51,"tag":74,"props":5391,"children":5393},{"className":5392},[],[5394],{"type":57,"value":4573},{"type":57,"value":5396}," section, or a reconstructed page with no sampled sections, = ",{"type":51,"tag":74,"props":5398,"children":5400},{"className":5399},[],[5401],{"type":57,"value":4581},{"type":51,"tag":495,"props":5403,"children":5404},{},[5405,5410,5414],{"type":51,"tag":517,"props":5406,"children":5407},{},[5408],{"type":57,"value":5409},"Qualitative observations (typography nuance, micro-spacing)",{"type":51,"tag":517,"props":5411,"children":5412},{},[5413],{"type":57,"value":5348},{"type":51,"tag":517,"props":5415,"children":5416},{},[5417],{"type":57,"value":5418},"Soft — surfaced, not blocking",{"type":51,"tag":285,"props":5420,"children":5422},{"id":5421},"decision-rules",[5423],{"type":57,"value":5424},"Decision rules",{"type":51,"tag":186,"props":5426,"children":5427},{},[5428,5445,5455,5477,5571,5595,5647,5896,5933,5950,5960,5976,5986,5996,6006],{"type":51,"tag":190,"props":5429,"children":5430},{},[5431,5436,5438,5443],{"type":51,"tag":66,"props":5432,"children":5433},{},[5434],{"type":57,"value":5435},"Never claim a match you haven't measured.",{"type":57,"value":5437}," Default to skepticism. \"Matches\" \u002F \"looks good\" \u002F \"close enough\" \u002F \"strong parity\" are STOP signs — open source vs replica, sample pixels, and itemize the concrete differences (lead with what's WRONG) before any positive claim. When the operator says it doesn't match, they're right: apologize, re-measure brutally, list every gap, fix, re-measure. Under-claim and keep working; never over-claim and stop. (Full rule in ",{"type":51,"tag":74,"props":5439,"children":5441},{"className":5440},[],[5442],{"type":57,"value":852},{"type":57,"value":5444}," SKILL → \"Honesty discipline.\")",{"type":51,"tag":190,"props":5446,"children":5447},{},[5448,5453],{"type":51,"tag":66,"props":5449,"children":5450},{},[5451],{"type":57,"value":5452},"Keep all guidance and code GENERIC.",{"type":57,"value":5454}," Reconstruction logic, classifiers, and skill rules must work for ANY source site — derive everything from the captured artifacts (specs, screenshots, computed styles), never hardcode a site's colors, image filenames, copy, or section order. A one-off hand-patch to make a single site look right is not a fix; the fix lives in the generic pipeline.",{"type":51,"tag":190,"props":5456,"children":5457},{},[5458,5468,5470,5476],{"type":51,"tag":66,"props":5459,"children":5460},{},[5461,5463],{"type":57,"value":5462},"Trust ",{"type":51,"tag":74,"props":5464,"children":5466},{"className":5465},[],[5467],{"type":57,"value":329},{"type":57,"value":5469}," for tokens. Don't reinterpret colors from raw palette. Don't hallucinate a display font when ",{"type":51,"tag":74,"props":5471,"children":5473},{"className":5472},[],[5474],{"type":57,"value":5475},"typography.families.display: null",{"type":57,"value":760},{"type":51,"tag":190,"props":5478,"children":5479},{},[5480,5485,5487,5492,5494,5500,5501,5507,5508,5514,5515,5521,5523,5533,5535,5540,5542,5547,5549,5554,5556,5561,5563,5569],{"type":51,"tag":66,"props":5481,"children":5482},{},[5483],{"type":57,"value":5484},"Reach parity with core blocks + SCOPED THEME CSS — this is the primary parity lever, not optional polish.",{"type":57,"value":5486}," Core-block ",{"type":51,"tag":242,"props":5488,"children":5489},{},[5490],{"type":57,"value":5491},"attributes",{"type":57,"value":5493}," alone cannot express many bespoke source sections (overlapping\u002Fpositioned hero, circular icon rows, colored pill-tag rows, two-tone split rows, exact band colors at exact positions, gapless full-bleed stacking). The answer is NOT to flatten to an approximate generic layout and call it \"close.\" It is: keep the structure + content in editable core blocks, give the section (or block) a stable ",{"type":51,"tag":74,"props":5495,"children":5497},{"className":5496},[],[5498],{"type":57,"value":5499},"className",{"type":57,"value":1526},{"type":51,"tag":74,"props":5502,"children":5504},{"className":5503},[],[5505],{"type":57,"value":5506},"specialty-grid",{"type":57,"value":141},{"type":51,"tag":74,"props":5509,"children":5511},{"className":5510},[],[5512],{"type":57,"value":5513},"pill-row",{"type":57,"value":141},{"type":51,"tag":74,"props":5516,"children":5518},{"className":5517},[],[5519],{"type":57,"value":5520},"is-replica-card",{"type":57,"value":5522},"), and add a ",{"type":51,"tag":66,"props":5524,"children":5525},{},[5526,5528],{"type":57,"value":5527},"scoped CSS rule in ",{"type":51,"tag":74,"props":5529,"children":5531},{"className":5530},[],[5532],{"type":57,"value":1072},{"type":57,"value":5534}," (enqueued via ",{"type":51,"tag":74,"props":5536,"children":5538},{"className":5537},[],[5539],{"type":57,"value":1079},{"type":57,"value":5541},") that reproduces the source's exact treatment (shape, position, size, color, spacing). Blocks stay editable; CSS closes the pixel gap. A per-block ",{"type":51,"tag":74,"props":5543,"children":5545},{"className":5544},[],[5546],{"type":57,"value":5499},{"type":57,"value":5548}," + theme CSS rule is the sanctioned way to pixel-match — use it whenever attributes fall short, every time, rather than settling. (This is distinct from hand-authored ",{"type":51,"tag":74,"props":5550,"children":5552},{"className":5551},[],[5553],{"type":57,"value":215},{"type":57,"value":5555},", which is still banned — see below. CSS in ",{"type":51,"tag":74,"props":5557,"children":5559},{"className":5558},[],[5560],{"type":57,"value":1072},{"type":57,"value":5562}," is encouraged; ",{"type":51,"tag":74,"props":5564,"children":5566},{"className":5565},[],[5567],{"type":57,"value":5568},"\u003Cstyle>",{"type":57,"value":5570},"\u002Fmarkup soup in content is not.)",{"type":51,"tag":190,"props":5572,"children":5573},{},[5574,5586,5588,5593],{"type":51,"tag":66,"props":5575,"children":5576},{},[5577,5579,5584],{"type":57,"value":5578},"Drive every divergent section to ",{"type":51,"tag":74,"props":5580,"children":5582},{"className":5581},[],[5583],{"type":57,"value":4617},{"type":57,"value":5585}," — do not stop at \"improved.\"",{"type":57,"value":5587}," If a section doesn't match the source, climb the ladder (R1 token\u002FCSS → R2 rebuild block markup → R3 re-extract spec → R4 styled rebuild: core blocks + a scoped ",{"type":51,"tag":74,"props":5589,"children":5591},{"className":5590},[],[5592],{"type":57,"value":1072},{"type":57,"value":5594}," rule) and re-measure until it matches. The 3-iteration checkpoint exists to ask for more BUDGET, not as license to ship a divergence. Reaching parity is the default expectation; you should not need to ask the operator whether to proceed to parity — proceed.",{"type":51,"tag":190,"props":5596,"children":5597},{},[5598,5603,5604,5610,5611,5617,5618,5624,5625,5631,5632,5638,5639,5645],{"type":51,"tag":66,"props":5599,"children":5600},{},[5601],{"type":57,"value":5602},"Prefer core blocks for STRUCTURE.",{"type":57,"value":1176},{"type":51,"tag":74,"props":5605,"children":5607},{"className":5606},[],[5608],{"type":57,"value":5609},"wp:columns",{"type":57,"value":141},{"type":51,"tag":74,"props":5612,"children":5614},{"className":5613},[],[5615],{"type":57,"value":5616},"wp:cover",{"type":57,"value":141},{"type":51,"tag":74,"props":5619,"children":5621},{"className":5620},[],[5622],{"type":57,"value":5623},"wp:group",{"type":57,"value":141},{"type":51,"tag":74,"props":5626,"children":5628},{"className":5627},[],[5629],{"type":57,"value":5630},"wp:buttons",{"type":57,"value":141},{"type":51,"tag":74,"props":5633,"children":5635},{"className":5634},[],[5636],{"type":57,"value":5637},"wp:details",{"type":57,"value":141},{"type":51,"tag":74,"props":5640,"children":5642},{"className":5641},[],[5643],{"type":57,"value":5644},"wp:navigation",{"type":57,"value":5646}," cover most observed layouts; pair them with theme CSS for exact visuals (above).",{"type":51,"tag":190,"props":5648,"children":5649},{},[5650,5655],{"type":51,"tag":66,"props":5651,"children":5652},{},[5653],{"type":57,"value":5654},"Common bespoke section recipes (block + CSS), so they don't flatten:",{"type":51,"tag":186,"props":5656,"children":5657},{},[5658,5725,5765,5816,5861,5886],{"type":51,"tag":190,"props":5659,"children":5660},{},[5661,5666,5668,5673,5675,5680,5681,5687,5689,5694,5696,5701,5703,5709,5711,5716,5718,5723],{"type":51,"tag":242,"props":5662,"children":5663},{},[5664],{"type":57,"value":5665},"Full-bleed hero",{"type":57,"value":5667}," (image + overlay headline) → ",{"type":51,"tag":74,"props":5669,"children":5671},{"className":5670},[],[5672],{"type":57,"value":5616},{"type":57,"value":5674}," (image as ",{"type":51,"tag":74,"props":5676,"children":5678},{"className":5677},[],[5679],{"type":57,"value":2272},{"type":57,"value":141},{"type":51,"tag":74,"props":5682,"children":5684},{"className":5683},[],[5685],{"type":57,"value":5686},"dimRatio",{"type":57,"value":5688}," overlay, inner heading in ",{"type":51,"tag":74,"props":5690,"children":5692},{"className":5691},[],[5693],{"type":57,"value":1635},{"type":57,"value":5695},"). NEVER a ",{"type":51,"tag":74,"props":5697,"children":5699},{"className":5698},[],[5700],{"type":57,"value":5623},{"type":57,"value":5702}," with a flat dark ",{"type":51,"tag":74,"props":5704,"children":5706},{"className":5705},[],[5707],{"type":57,"value":5708},"background-color",{"type":57,"value":5710}," + a ",{"type":51,"tag":74,"props":5712,"children":5714},{"className":5713},[],[5715],{"type":57,"value":1614},{"type":57,"value":5717}," heading (that renders an invisible black-on-black title). If the captured hero ",{"type":51,"tag":74,"props":5719,"children":5721},{"className":5720},[],[5722],{"type":57,"value":2821},{"type":57,"value":5724}," src is empty, recover it from the page's largest captured image \u002F media library and build the cover from that.",{"type":51,"tag":190,"props":5726,"children":5727},{},[5728,5733,5734,5739,5741,5747,5749,5755,5757,5763],{"type":51,"tag":242,"props":5729,"children":5730},{},[5731],{"type":57,"value":5732},"Numbered\u002Ffeature card row",{"type":57,"value":552},{"type":51,"tag":74,"props":5735,"children":5737},{"className":5736},[],[5738],{"type":57,"value":5609},{"type":57,"value":5740}," of equal-height ",{"type":51,"tag":74,"props":5742,"children":5744},{"className":5743},[],[5745],{"type":57,"value":5746},"wp:column",{"type":57,"value":5748},"s, each a ",{"type":51,"tag":74,"props":5750,"children":5752},{"className":5751},[],[5753],{"type":57,"value":5754},"wp:group.is-replica-card",{"type":57,"value":5756}," (number + title + desc + ",{"type":51,"tag":74,"props":5758,"children":5760},{"className":5759},[],[5761],{"type":57,"value":5762},"wp:button",{"type":57,"value":5764},"). Match the source card background (often white\u002Fnone — don't over-tint).",{"type":51,"tag":190,"props":5766,"children":5767},{},[5768,5773,5774,5779,5781,5786,5787,5793,5795,5800,5801,5807,5808,5814],{"type":51,"tag":242,"props":5769,"children":5770},{},[5771],{"type":57,"value":5772},"Circular icon\u002Fspecialty row",{"type":57,"value":552},{"type":51,"tag":74,"props":5775,"children":5777},{"className":5776},[],[5778],{"type":57,"value":5609},{"type":57,"value":5780},"; each item a ",{"type":51,"tag":74,"props":5782,"children":5784},{"className":5783},[],[5785],{"type":57,"value":5623},{"type":57,"value":1864},{"type":51,"tag":74,"props":5788,"children":5790},{"className":5789},[],[5791],{"type":57,"value":5792},"className:\"...-disc\"",{"type":57,"value":5794}," + a token background, sized to a circle via ",{"type":51,"tag":74,"props":5796,"children":5798},{"className":5797},[],[5799],{"type":57,"value":1072},{"type":57,"value":133},{"type":51,"tag":74,"props":5802,"children":5804},{"className":5803},[],[5805],{"type":57,"value":5806},"width\u002Fheight",{"type":57,"value":391},{"type":51,"tag":74,"props":5809,"children":5811},{"className":5810},[],[5812],{"type":57,"value":5813},"border-radius:50%",{"type":57,"value":5815},"), label paragraph below.",{"type":51,"tag":190,"props":5817,"children":5818},{},[5819,5824,5825,5830,5832,5837,5839,5845,5847,5853,5855,5860],{"type":51,"tag":242,"props":5820,"children":5821},{},[5822],{"type":57,"value":5823},"Pill \u002F tag row",{"type":57,"value":552},{"type":51,"tag":74,"props":5826,"children":5828},{"className":5827},[],[5829],{"type":57,"value":5630},{"type":57,"value":5831}," with each ",{"type":51,"tag":74,"props":5833,"children":5835},{"className":5834},[],[5836],{"type":57,"value":5762},{"type":57,"value":5838}," border-radius ",{"type":51,"tag":74,"props":5840,"children":5842},{"className":5841},[],[5843],{"type":57,"value":5844},"999px",{"type":57,"value":5846}," + a token background, OR styled groups; row class for ",{"type":51,"tag":74,"props":5848,"children":5850},{"className":5849},[],[5851],{"type":57,"value":5852},"flex-wrap",{"type":57,"value":5854}," + gap in ",{"type":51,"tag":74,"props":5856,"children":5858},{"className":5857},[],[5859],{"type":57,"value":1072},{"type":57,"value":760},{"type":51,"tag":190,"props":5862,"children":5863},{},[5864,5869,5871,5876,5878,5884],{"type":51,"tag":242,"props":5865,"children":5866},{},[5867],{"type":57,"value":5868},"Two-tone split row",{"type":57,"value":5870}," (e.g. peach block │ photo │ coral block) → ",{"type":51,"tag":74,"props":5872,"children":5874},{"className":5873},[],[5875],{"type":57,"value":5609},{"type":57,"value":5877}," with per-column ",{"type":51,"tag":74,"props":5879,"children":5881},{"className":5880},[],[5882],{"type":57,"value":5883},"backgroundColor",{"type":57,"value":5885}," tokens — one color per column, not one tint for the whole section.",{"type":51,"tag":190,"props":5887,"children":5888},{},[5889,5894],{"type":51,"tag":242,"props":5890,"children":5891},{},[5892],{"type":57,"value":5893},"Gapless full-bleed bands",{"type":57,"value":5895}," → every section group zeroes its own top\u002Fbottom margin; rhythm comes from each section's captured padding (so colored bands butt edge-to-edge).",{"type":51,"tag":190,"props":5897,"children":5898},{},[5899,5910,5912,5917,5919,5924,5926,5931],{"type":51,"tag":66,"props":5900,"children":5901},{},[5902,5904,5909],{"type":57,"value":5903},"No hand-authored ",{"type":51,"tag":74,"props":5905,"children":5907},{"className":5906},[],[5908],{"type":57,"value":215},{"type":57,"value":760},{"type":57,"value":5911}," Never reach for ",{"type":51,"tag":74,"props":5913,"children":5915},{"className":5914},[],[5916],{"type":57,"value":223},{"type":57,"value":5918}," to express layout or CSS — CSS goes in ",{"type":51,"tag":74,"props":5920,"children":5922},{"className":5921},[],[5923],{"type":57,"value":1072},{"type":57,"value":5925}," (encouraged, per the parity rule above); structure goes in core block markup. The ONLY ",{"type":51,"tag":74,"props":5927,"children":5929},{"className":5928},[],[5930],{"type":57,"value":223},{"type":57,"value":5932}," that ships is the automatic coverage-gated verbatim fallback (below), which the renderer emits — not you.",{"type":51,"tag":190,"props":5934,"children":5935},{},[5936,5941,5943,5948],{"type":51,"tag":66,"props":5937,"children":5938},{},[5939],{"type":57,"value":5940},"One layout skeleton per cluster, not per page.",{"type":57,"value":5942}," Builders emit layout templates; ",{"type":51,"tag":74,"props":5944,"children":5946},{"className":5945},[],[5947],{"type":57,"value":2700},{"type":57,"value":5949}," fills content.",{"type":51,"tag":190,"props":5951,"children":5952},{},[5953,5958],{"type":51,"tag":66,"props":5954,"children":5955},{},[5956],{"type":57,"value":5957},"Posts and products are data.",{"type":57,"value":5959}," Route through templates + Query Loop + WooCommerce. No per-post or per-product section reconstruction.",{"type":51,"tag":190,"props":5961,"children":5962},{},[5963,5974],{"type":51,"tag":66,"props":5964,"children":5965},{},[5966,5968],{"type":57,"value":5967},"Skip archetypes with ",{"type":51,"tag":74,"props":5969,"children":5971},{"className":5970},[],[5972],{"type":57,"value":5973},"count === 0",{"type":57,"value":5975}," silently.",{"type":51,"tag":190,"props":5977,"children":5978},{},[5979,5984],{"type":51,"tag":66,"props":5980,"children":5981},{},[5982],{"type":57,"value":5983},"Skip count=0 archetypes",{"type":57,"value":5985}," and do not build templates for hypothetical content types.",{"type":51,"tag":190,"props":5987,"children":5988},{},[5989,5994],{"type":51,"tag":66,"props":5990,"children":5991},{},[5992],{"type":57,"value":5993},"Sitewide sections (header, footer, recurring CTA bands) are built once",{"type":57,"value":5995}," and deduped before builder dispatch.",{"type":51,"tag":190,"props":5997,"children":5998},{},[5999,6004],{"type":51,"tag":66,"props":6000,"children":6001},{},[6002],{"type":57,"value":6003},"Builders are pure.",{"type":57,"value":6005}," They never write to disk — only return strings. The orchestrator persists and marks built.",{"type":51,"tag":190,"props":6007,"children":6008},{},[6009,6014],{"type":51,"tag":66,"props":6010,"children":6011},{},[6012],{"type":57,"value":6013},"Budget guard:",{"type":57,"value":6015}," a run exceeding the configurable subagent\u002Fcluster\u002Felapsed ceiling pauses and asks the operator rather than running away.",{"type":51,"tag":285,"props":6017,"children":6019},{"id":6018},"anti-patterns",[6020],{"type":57,"value":6021},"Anti-patterns",{"type":51,"tag":186,"props":6023,"children":6024},{},[6025,6064,6081,6099,6109,6126,6143,6153,6163,6195,6234,6244],{"type":51,"tag":190,"props":6026,"children":6027},{},[6028,6033,6035,6040,6042,6048,6049,6055,6057,6063],{"type":51,"tag":66,"props":6029,"children":6030},{},[6031],{"type":57,"value":6032},"Picking and tweaking from the 27-pattern library directly.",{"type":57,"value":6034}," The 27-pattern library is now seed material folded into the ",{"type":51,"tag":74,"props":6036,"children":6038},{"className":6037},[],[6039],{"type":57,"value":281},{"type":57,"value":6041}," catalog. Builders read ",{"type":51,"tag":74,"props":6043,"children":6045},{"className":6044},[],[6046],{"type":57,"value":6047},"section-mapping.md",{"type":57,"value":1285},{"type":51,"tag":74,"props":6050,"children":6052},{"className":6051},[],[6053],{"type":57,"value":6054},"spec-files.md",{"type":57,"value":6056},". Do not reach back to ",{"type":51,"tag":74,"props":6058,"children":6060},{"className":6059},[],[6061],{"type":57,"value":6062},"skills\u002Freplicate-with-blocks\u002Freferences\u002Fpatterns\u002F",{"type":57,"value":760},{"type":51,"tag":190,"props":6065,"children":6066},{},[6067,6072,6074,6079],{"type":51,"tag":66,"props":6068,"children":6069},{},[6070],{"type":57,"value":6071},"Generating patterns from scratch without a catalog match.",{"type":57,"value":6073}," Check ",{"type":51,"tag":74,"props":6075,"children":6077},{"className":6076},[],[6078],{"type":57,"value":6047},{"type":57,"value":6080}," first. Fresh generation is the last resort.",{"type":51,"tag":190,"props":6082,"children":6083},{},[6084,6097],{"type":51,"tag":66,"props":6085,"children":6086},{},[6087,6089,6095],{"type":57,"value":6088},"Reading WXR ",{"type":51,"tag":74,"props":6090,"children":6092},{"className":6091},[],[6093],{"type":57,"value":6094},"\u003Cwp:post_content>",{"type":57,"value":6096}," and recreating it as blocks.",{"type":57,"value":6098}," Content transformation is out of scope. The theme renders what's already in WXR; it doesn't reconstruct it.",{"type":51,"tag":190,"props":6100,"children":6101},{},[6102,6107],{"type":51,"tag":66,"props":6103,"children":6104},{},[6105],{"type":57,"value":6106},"Generating a pleasant generic theme.",{"type":57,"value":6108}," A clean generic layout is failure when the source has a different section order, grid, spacing, media treatment, header, footer, or responsive stack.",{"type":51,"tag":190,"props":6110,"children":6111},{},[6112,6117,6118,6124],{"type":51,"tag":66,"props":6113,"children":6114},{},[6115],{"type":57,"value":6116},"Hallucinating tokens.",{"type":57,"value":1176},{"type":51,"tag":74,"props":6119,"children":6121},{"className":6120},[],[6122],{"type":57,"value":6123},"display: null",{"type":57,"value":6125}," → omit, don't invent. No hex values in patterns — always token slugs.",{"type":51,"tag":190,"props":6127,"children":6128},{},[6129,6141],{"type":51,"tag":66,"props":6130,"children":6131},{},[6132,6134,6139],{"type":57,"value":6133},"Running ",{"type":51,"tag":74,"props":6135,"children":6137},{"className":6136},[],[6138],{"type":57,"value":3879},{"type":57,"value":6140}," and ignoring failures.",{"type":57,"value":6142}," The gate is a trust boundary. Failures mean injected\u002Finvented text could reach the installed theme.",{"type":51,"tag":190,"props":6144,"children":6145},{},[6146,6151],{"type":51,"tag":66,"props":6147,"children":6148},{},[6149],{"type":57,"value":6150},"Skipping the responsiveness gate.",{"type":57,"value":6152}," A theme that overflows at 390px is not done, regardless of how it looks on desktop.",{"type":51,"tag":190,"props":6154,"children":6155},{},[6156,6161],{"type":51,"tag":66,"props":6157,"children":6158},{},[6159],{"type":57,"value":6160},"Documenting a layout divergence as a \"known gap\" and shipping it.",{"type":57,"value":6162}," A flattened section, wrong band color, or dropped grid is not a gap to log — it is work to do. Climb the escalation ladder (R1→R4) or escalate to the operator. \"Known gap\" \u002F \"where it falls short\" is an escalation trigger, never the terminal state of a shipped run.",{"type":51,"tag":190,"props":6164,"children":6165},{},[6166,6178,6180,6185,6187,6193],{"type":51,"tag":66,"props":6167,"children":6168},{},[6169,6171,6176],{"type":57,"value":6170},"Emitting a verdict not backed by the sampled ",{"type":51,"tag":74,"props":6172,"children":6174},{"className":6173},[],[6175],{"type":57,"value":4565},{"type":57,"value":6177}," table.",{"type":57,"value":6179}," \"Looks good\" \u002F \"honest rundown\" prose cannot move a ",{"type":51,"tag":74,"props":6181,"children":6183},{"className":6182},[],[6184],{"type":57,"value":4573},{"type":57,"value":6186}," section to pass. A reconstructed page with no sampled sections is ",{"type":51,"tag":74,"props":6188,"children":6190},{"className":6189},[],[6191],{"type":57,"value":6192},"fail (unverified)",{"type":57,"value":6194},", not a pass — measure, don't assert.",{"type":51,"tag":190,"props":6196,"children":6197},{},[6198,6203,6205,6210,6212,6217,6219,6225,6227,6232],{"type":51,"tag":66,"props":6199,"children":6200},{},[6201],{"type":57,"value":6202},"Hand-authored Custom HTML for layout or CSS.",{"type":57,"value":6204}," Inline ",{"type":51,"tag":74,"props":6206,"children":6208},{"className":6207},[],[6209],{"type":57,"value":5568},{"type":57,"value":6211},", raw SVG sets, embedded ",{"type":51,"tag":74,"props":6213,"children":6215},{"className":6214},[],[6216],{"type":57,"value":722},{"type":57,"value":6218},", hidden ",{"type":51,"tag":74,"props":6220,"children":6222},{"className":6221},[],[6223],{"type":57,"value":6224},"\u003Cform>",{"type":57,"value":6226}," → all rejected. Use core blocks + ",{"type":51,"tag":74,"props":6228,"children":6230},{"className":6229},[],[6231],{"type":57,"value":1072},{"type":57,"value":6233}," or a real theme-embedded custom block. (The automatic coverage-gated verbatim fallback is the one exception — it is renderer-emitted and sanitized, never hand-written.)",{"type":51,"tag":190,"props":6235,"children":6236},{},[6237,6242],{"type":51,"tag":66,"props":6238,"children":6239},{},[6240],{"type":57,"value":6241},"Custom blocks for layout-only differences.",{"type":57,"value":6243}," If the only issue is \"columns aren't quite right,\" edit the layout skeleton instead. Custom blocks are for interactive components that core blocks genuinely cannot express (multi-step form, non-standard carousel with computed state, pricing table with toggles). If the source's interactivity didn't survive extraction, use core blocks + honest static content — not a non-functional custom block.",{"type":51,"tag":190,"props":6245,"children":6246},{},[6247,6252,6254,6260,6261,6267],{"type":51,"tag":66,"props":6248,"children":6249},{},[6250],{"type":57,"value":6251},"Telex-flavored output.",{"type":57,"value":6253}," Footer credits, plugin namespaces, and author fields use ",{"type":51,"tag":74,"props":6255,"children":6257},{"className":6256},[],[6258],{"type":57,"value":6259},"\u003CsiteSlug>-replica",{"type":57,"value":752},{"type":51,"tag":74,"props":6262,"children":6264},{"className":6263},[],[6265],{"type":57,"value":6266},"telex\u002F",{"type":57,"value":760},{"type":51,"tag":285,"props":6269,"children":6271},{"id":6270},"reference-files",[6272],{"type":57,"value":6273},"Reference files",{"type":51,"tag":60,"props":6275,"children":6276},{},[6277],{"type":57,"value":6278},"Read these when the relevant step comes up — not all are needed on every run:",{"type":51,"tag":186,"props":6280,"children":6281},{},[6282,6295,6308,6336,6350,6370],{"type":51,"tag":190,"props":6283,"children":6284},{},[6285,6293],{"type":51,"tag":66,"props":6286,"children":6287},{},[6288],{"type":51,"tag":74,"props":6289,"children":6291},{"className":6290},[],[6292],{"type":57,"value":2402},{"type":57,"value":6294}," — interaction-model → WP block template catalog; brightness rule, gradient rule, divider rule, styling rule. Read in step 4 before dispatching builders.",{"type":51,"tag":190,"props":6296,"children":6297},{},[6298,6306],{"type":51,"tag":66,"props":6299,"children":6300},{},[6301],{"type":51,"tag":74,"props":6302,"children":6304},{"className":6303},[],[6305],{"type":57,"value":2414},{"type":57,"value":6307}," — the spec file contract (template, field definitions, media note). Read in step 3 when writing or auditing specs.",{"type":51,"tag":190,"props":6309,"children":6310},{},[6311,6320,6322,6327,6329,6334],{"type":51,"tag":66,"props":6312,"children":6313},{},[6314],{"type":51,"tag":74,"props":6315,"children":6317},{"className":6316},[],[6318],{"type":57,"value":6319},"skills\u002Fdesign-foundations\u002Freferences\u002Fdesign-brief.md",{"type":57,"value":6321}," — the ",{"type":51,"tag":74,"props":6323,"children":6325},{"className":6324},[],[6326],{"type":57,"value":361},{"type":57,"value":6328}," 10-section template; what each section fills from, lifecycle. Read in step 1 if ",{"type":51,"tag":74,"props":6330,"children":6332},{"className":6331},[],[6333],{"type":57,"value":337},{"type":57,"value":6335}," is being invoked.",{"type":51,"tag":190,"props":6337,"children":6338},{},[6339,6348],{"type":51,"tag":66,"props":6340,"children":6341},{},[6342],{"type":51,"tag":74,"props":6343,"children":6345},{"className":6344},[],[6346],{"type":57,"value":6347},"skills\u002Fdesign-foundations\u002Freferences\u002Ftheme-tokens.md",{"type":57,"value":6349}," — token-role → theme.json mapping detail. Read in step 1 when token mapping is ambiguous.",{"type":51,"tag":190,"props":6351,"children":6352},{},[6353,6362,6364,6369],{"type":51,"tag":66,"props":6354,"children":6355},{},[6356],{"type":51,"tag":74,"props":6357,"children":6359},{"className":6358},[],[6360],{"type":57,"value":6361},"skills\u002Fdesign-qa\u002Freferences\u002Fvisual-qa.md",{"type":57,"value":6363}," — QA loop mechanics, failure classes A\u002FB\u002FC, iteration budget, run-report output. Read in step 7 before invoking ",{"type":51,"tag":74,"props":6365,"children":6367},{"className":6366},[],[6368],{"type":57,"value":852},{"type":57,"value":760},{"type":51,"tag":190,"props":6371,"children":6372},{},[6373,6382],{"type":51,"tag":66,"props":6374,"children":6375},{},[6376],{"type":51,"tag":74,"props":6377,"children":6379},{"className":6378},[],[6380],{"type":57,"value":6381},"skills\u002Freplicate-with-blocks\u002Fstyling-priority.md",{"type":57,"value":6383}," — the preset→patch→instance→variation→layout→CSS cascade, the structured-props cheat sheet, and the hard bans (no raw style=\"\" attrs, no invented className CSS hooks). Applies to native block output; core\u002Fhtml islands exempt.",{"type":51,"tag":6385,"props":6386,"children":6387},"style",{},[6388],{"type":57,"value":6389},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":6391,"total":6577},[6392,6413,6430,6444,6459,6474,6488,6503,6520,6531,6546,6562],{"slug":6393,"name":6393,"fn":6394,"description":6395,"org":6396,"tags":6397,"stars":6410,"repoUrl":6411,"updatedAt":6412},"annotate","collect visual feedback with browser annotation tools","Open a browser with visual annotation tools. The user clicks elements on their site and leaves feedback — the agent reads annotations and makes changes. Use this when the user wants to point at specific elements to fix, tweak, or redesign.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6398,6401,6404,6407],{"name":6399,"slug":6400,"type":15},"Frontend","frontend",{"name":6402,"slug":6403,"type":15},"Productivity","productivity",{"name":6405,"slug":6406,"type":15},"UX Copy","ux-copy",{"name":6408,"slug":6409,"type":15},"UX Design","ux-design",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-06T05:40:01.516544",{"slug":6414,"name":6414,"fn":6415,"description":6416,"org":6417,"tags":6418,"stars":6410,"repoUrl":6411,"updatedAt":6429},"block-content","write editable WordPress block markup","Write editable WordPress block markup for local Studio sites, including core\u002Fhtml limits, block-theme layout rules, full-width sections, validation, and skeleton-first page\u002FCSS recipes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6419,6422,6425,6428],{"name":6420,"slug":6421,"type":15},"Block Editor","block-editor",{"name":6423,"slug":6424,"type":15},"CSS","css",{"name":6426,"slug":6427,"type":15},"HTML","html",{"name":17,"slug":18,"type":15},"2026-05-27T07:01:55.629681",{"slug":6431,"name":6431,"fn":6432,"description":6433,"org":6434,"tags":6435,"stars":6410,"repoUrl":6411,"updatedAt":6443},"hosting-plans-helper","provide WordPress.com hosting plan information","Answer WordPress.com plan, pricing, upgrade, and feature-tier questions (plan names, what each tier unlocks — plugins, themes, custom code, SSH, hosting — and current prices) from authoritative live data. Load before answering ANY plan, pricing, or feature-gating question; never answer these from memory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6436,6439,6442],{"name":6437,"slug":6438,"type":15},"Pricing","pricing",{"name":6440,"slug":6441,"type":15},"Reference","reference",{"name":17,"slug":18,"type":15},"2026-07-02T07:42:33.654791",{"slug":6445,"name":6445,"fn":6446,"description":6447,"org":6448,"tags":6449,"stars":6410,"repoUrl":6411,"updatedAt":6458},"liberate","migrate websites to WordPress","Import and rebuild a website from a closed platform (Wix, Squarespace, Webflow, Shopify, GoDaddy, Hostinger, HubSpot, Weebly) into a Studio WordPress site. Extracts pages\u002Fposts\u002Fproducts + media, then reconstructs the design as editable blocks + WooCommerce OR as a high-fidelity replica theme. Invoke when the user wants to migrate, import, liberate, or rebuild a site from one of these platforms.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6450,6453,6454,6457],{"name":6451,"slug":6452,"type":15},"CMS","cms",{"name":20,"slug":21,"type":15},{"name":6455,"slug":6456,"type":15},"Web Development","web-development",{"name":17,"slug":18,"type":15},"2026-07-09T06:47:33.454311",{"slug":6460,"name":6460,"fn":6461,"description":6462,"org":6463,"tags":6464,"stars":6410,"repoUrl":6411,"updatedAt":6473},"need-for-speed","run frontend performance audits for WordPress sites","Run a frontend performance audit on a WordPress site and get actionable optimization recommendations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6465,6468,6469,6472],{"name":6466,"slug":6467,"type":15},"Audit","audit",{"name":6399,"slug":6400,"type":15},{"name":6470,"slug":6471,"type":15},"Performance","performance",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:06.433267",{"slug":6475,"name":6475,"fn":6476,"description":6477,"org":6478,"tags":6479,"stars":6410,"repoUrl":6411,"updatedAt":6487},"plugin-recommendations","recommend WordPress plugins for site features","Choose recommended plugins and plugin-provided blocks for features core WordPress blocks do not cover - ecommerce (WooCommerce), forms and newsletters (Jetpack), online courses and quizzes (Sensei LMS), polls, surveys and ratings (Crowdsignal), spam protection (Akismet) - while keeping generated content editable and avoiding raw HTML fallbacks. Any request to sell products or build a shop, store, or storefront requires WooCommerce with products.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6480,6483,6486],{"name":6481,"slug":6482,"type":15},"Content Creation","content-creation",{"name":6484,"slug":6485,"type":15},"Plugin Development","plugin-development",{"name":17,"slug":18,"type":15},"2026-05-27T07:01:58.249105",{"slug":6489,"name":6489,"fn":6490,"description":6491,"org":6492,"tags":6493,"stars":6410,"repoUrl":6411,"updatedAt":6502},"rank-me-up","run on-page SEO audits for WordPress sites","Run an on-page SEO audit on a WordPress site and get actionable recommendations to improve search visibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6494,6495,6498,6501],{"name":6466,"slug":6467,"type":15},{"name":6496,"slug":6497,"type":15},"Marketing","marketing",{"name":6499,"slug":6500,"type":15},"SEO","seo",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:05.196367",{"slug":6504,"name":6504,"fn":6505,"description":6506,"org":6507,"tags":6508,"stars":6410,"repoUrl":6411,"updatedAt":6519},"site-spec","gather specifications for new WordPress sites","Gather the site name and layout preference before building a WordPress site. Run this before creating any new site.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6509,6512,6515,6518],{"name":6510,"slug":6511,"type":15},"Design","design",{"name":6513,"slug":6514,"type":15},"Product Management","product-management",{"name":6516,"slug":6517,"type":15},"Specs","specs",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:02.739409",{"slug":6521,"name":6521,"fn":6522,"description":6523,"org":6524,"tags":6525,"stars":6410,"repoUrl":6411,"updatedAt":6530},"studio-cli","manage local WordPress sites with Studio CLI","Use the Studio CLI to manage local WordPress sites, authentication, and preview sites. Invoke this skill when you need to run Studio CLI commands, manage sites, or troubleshoot site issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6526,6529],{"name":6527,"slug":6528,"type":15},"CLI","cli",{"name":17,"slug":18,"type":15},"2026-04-06T18:02:57.150231",{"slug":6532,"name":6532,"fn":6533,"description":6534,"org":6535,"tags":6536,"stars":6410,"repoUrl":6411,"updatedAt":6545},"taxonomist","optimize WordPress category taxonomy","Analyze and optimize a WordPress site's category taxonomy. Exports all posts, uses AI to suggest an improved category structure — merging duplicates, retiring dead categories, creating missing ones, writing descriptions, and re-categorizing posts. Run this when the user wants to clean up or improve their categories.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6537,6540,6543,6544],{"name":6538,"slug":6539,"type":15},"Content Strategy","content-strategy",{"name":6541,"slug":6542,"type":15},"Data Cleaning","data-cleaning",{"name":6499,"slug":6500,"type":15},{"name":17,"slug":18,"type":15},"2026-05-06T05:40:03.966799",{"slug":6547,"name":6547,"fn":6548,"description":6549,"org":6550,"tags":6551,"stars":6410,"repoUrl":6411,"updatedAt":6561},"visual-design","plan and execute visual design direction","Plan and execute high-quality visual direction for site creation, redesign, layout, typography, color, motion, and visual polish.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6552,6555,6556,6559],{"name":6553,"slug":6554,"type":15},"Animation","animation",{"name":6510,"slug":6511,"type":15},{"name":6557,"slug":6558,"type":15},"Typography","typography",{"name":6560,"slug":6547,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":6563,"name":6563,"fn":6564,"description":6565,"org":6566,"tags":6567,"stars":6410,"repoUrl":6411,"updatedAt":6576},"visual-polish","verify and polish website visual design","Verify and polish a built or redesigned site by diagnosing rendered-DOM issues against intent and fixing them in a planned, batched screenshot-and-fix loop.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6568,6571,6572,6575],{"name":6569,"slug":6570,"type":15},"Debugging","debugging",{"name":6399,"slug":6400,"type":15},{"name":6573,"slug":6574,"type":15},"Screenshots","screenshots",{"name":6560,"slug":6547,"type":15},"2026-06-06T07:09:59.809812",81,{"items":6579,"total":6667},[6580,6595,6605,6616,6626,6640,6654],{"slug":6581,"name":6581,"fn":6582,"description":6583,"org":6584,"tags":6585,"stars":25,"repoUrl":26,"updatedAt":6594},"adapt","build platform adapters for content extraction","Build a new platform adapter to extract content from an unsupported platform (Blogger, Ghost, Tumblr, etc.)",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6586,6589,6590,6593],{"name":6587,"slug":6588,"type":15},"Automation","automation",{"name":6541,"slug":6542,"type":15},{"name":6591,"slug":6592,"type":15},"Data Engineering","data-engineering",{"name":17,"slug":18,"type":15},"2026-05-09T05:32:13.987972",{"slug":948,"name":948,"fn":6596,"description":6597,"org":6598,"tags":6599,"stars":25,"repoUrl":26,"updatedAt":6604},"compose WordPress block markup from HTML","Compose a single liberated page's WordPress block-editor markup from its rendered HTML and screenshot. Inputs are a sanitized HTML file, a desktop screenshot, the design-foundation tokens, the URL's archetype (page\u002Fpost\u002Fproduct\u002Fetc.), and the source URL. Output is a string of valid block markup that round-trips through parse_blocks, uses theme tokens (no inlined hex colors), and contains only text drawn from the source HTML. Call per-page during the streaming watch loop after extraction has produced HTML+screenshot for that URL. Use when a freshly-imported page needs `post_content` upgraded from raw HTML into block-editor markup so the replica theme's tokens, gradients, and patterns actually render.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6600,6601,6602,6603],{"name":6420,"slug":6421,"type":15},{"name":6481,"slug":6482,"type":15},{"name":6426,"slug":6427,"type":15},{"name":17,"slug":18,"type":15},"2026-06-08T08:17:34.212397",{"slug":6606,"name":6606,"fn":6607,"description":6608,"org":6609,"tags":6610,"stars":25,"repoUrl":26,"updatedAt":6615},"creating-blocks","create new WordPress blocks","Templates and guidelines for creating new WordPress blocks from scratch — load this before generating block files",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6611,6612,6613,6614],{"name":6420,"slug":6421,"type":15},{"name":13,"slug":14,"type":15},{"name":6484,"slug":6485,"type":15},{"name":17,"slug":18,"type":15},"2026-06-08T08:17:49.413995",{"slug":1054,"name":1054,"fn":6617,"description":6618,"org":6619,"tags":6620,"stars":25,"repoUrl":26,"updatedAt":6625},"create WordPress block themes","Guidelines for creating new WordPress block themes from scratch — load this before generating theme files",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6621,6622,6623,6624],{"name":6420,"slug":6421,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-06-08T08:17:50.666611",{"slug":337,"name":337,"fn":6627,"description":6628,"org":6629,"tags":6630,"stars":25,"repoUrl":26,"updatedAt":6639},"build design foundation JSON from sites","Build a coherent design-foundation JSON from a liberated site — semantic color\u002Ftypography\u002Fspacing roles with evidence trails. Consumes the partial scaffold produced by liberate_design_foundation_scaffold plus aggregate HTML\u002FCSS analysis and representative rendered HTML; produces a complete design-foundation matching the schema. Call after liberation, before theme generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6631,6634,6635,6638],{"name":6632,"slug":6633,"type":15},"Data Modeling","data-modeling",{"name":6510,"slug":6511,"type":15},{"name":6636,"slug":6637,"type":15},"Design System","design-system",{"name":6399,"slug":6400,"type":15},"2026-06-08T08:17:44.457834",{"slug":852,"name":852,"fn":6641,"description":6642,"org":6643,"tags":6644,"stars":25,"repoUrl":26,"updatedAt":6653},"run visual QA on WordPress themes","Visual-QA loop run after replica theme install and content import. Captures replica screenshots, applies a hard responsiveness gate at 390px AND a hard per-section visual-parity gate (measured SectionParity records, verdict computed by buildRunReport), runs qualitative vision review of source\u002Freplica pairs, checks accessibility, and drives a per-section escalation ladder of fixes via editing-themes\u002Fediting-blocks\u002Frebuild-section (R1 CSS → R2 spec-rebuild → R3 re-extract → R4a AI canonical-block rebuild → R4b deterministic styled-island floor) — escalating unresolved divergences to the operator rather than shipping them. Orchestration-internal — invoked by the replicate-with-blocks\u002Fliberate orchestrators, not directly by users.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6645,6647,6648,6651,6652],{"name":6646,"slug":5071,"type":15},"QA",{"name":6573,"slug":6574,"type":15},{"name":6649,"slug":6650,"type":15},"Testing","testing",{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-06-08T08:17:45.698278",{"slug":6655,"name":6655,"fn":6656,"description":6657,"org":6658,"tags":6659,"stars":25,"repoUrl":26,"updatedAt":6666},"diagnose","debug failed data extraction processes","Debug failed or low-quality extractions by analyzing logs, probing the source site, and identifying root causes",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6660,6661,6662,6665],{"name":6591,"slug":6592,"type":15},{"name":6569,"slug":6570,"type":15},{"name":6663,"slug":6664,"type":15},"Logs","logs",{"name":6646,"slug":5071,"type":15},"2026-05-10T05:48:11.267642",21]