[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-match-section":3,"mdc--511j6l-key":36,"related-org-automattic-match-section":2373,"related-repo-automattic-match-section":2557},{"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},"match-section","match section design to WordPress blocks","Reach VISUAL parity for ONE section by guiding AI to apply the captured design data (colors, padding, margins, full-bleed, font sizes, line-heights, families, alignment) to that section's WordPress block markup, then VERIFYING by looking at the source section and the built section side-by-side and iterating until they are visually identical. Non-deterministic on purpose — deterministic emission gets the structure right but misses visual parity; this skill closes the gap with an AI eyes-on loop. The per-section EXECUTOR called by `match-page` (which runs the batch Phase-1 assessment first, then dispatches this per divergent section). Do not drive whole-page parity by hand-rolling per-section work — run `match-page` so the batch assessment happens first. Dispatched per section (subagent) by match-page\u002Freplicate-with-blocks\u002Fdesign-qa. Not user-invocable directly.",{"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},"WordPress","wordpress","tag",{"name":17,"slug":18,"type":15},"Block Editor","block-editor",{"name":20,"slug":21,"type":15},"Frontend","frontend",{"name":23,"slug":24,"type":15},"Design","design",31,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fdata-liberation-agent","2026-06-08T08:17:36.85987",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\u002Fmatch-section","---\nname: match-section\ndescription: Reach VISUAL parity for ONE section by guiding AI to apply the captured design data (colors, padding, margins, full-bleed, font sizes, line-heights, families, alignment) to that section's WordPress block markup, then VERIFYING by looking at the source section and the built section side-by-side and iterating until they are visually identical. Non-deterministic on purpose — deterministic emission gets the structure right but misses visual parity; this skill closes the gap with an AI eyes-on loop. The per-section EXECUTOR called by `match-page` (which runs the batch Phase-1 assessment first, then dispatches this per divergent section). Do not drive whole-page parity by hand-rolling per-section work — run `match-page` so the batch assessment happens first. Dispatched per section (subagent) by match-page\u002Freplicate-with-blocks\u002Fdesign-qa. Not user-invocable directly.\ndisable-model-invocation: true\nallowed-tools:\n  - Bash\n  - Read\n  - Edit\n  - Write\n  - mcp__plugin_playwright_playwright__browser_navigate\n  - mcp__plugin_playwright_playwright__browser_resize\n  - mcp__plugin_playwright_playwright__browser_take_screenshot\n  - mcp__plugin_playwright_playwright__browser_evaluate\n---\n\n## What you do\n\nYou make ONE section of the replica look visually identical to the same section on the source site. You are given everything the pipeline captured about that section. **Use it.** Then you LOOK at both — source section and your built section — and you do not stop until they match. Deterministic code already ran and got the structure roughly right; your job is the visual gap it cannot close.\n\nThis is an eyes-on loop, not a one-shot emit. Apply → render → **look at both images** → name every difference → fix → render → look again. Move to \"done\" ONLY when the two images are visually identical (allowing for font-substitution and text-reflow noise — NOT for wrong color, wrong size, wrong spacing, wrong alignment, dropped media, or wrong width).\n\n## Inputs the orchestrator gives you\n\n- `outputDir` (e.g. `~\u002FStudio\u002F_liberations\u002Fexample.com`), `studioSitePath` (e.g. `~\u002FStudio\u002Fexample-com`), `themeSlug`, the page `slug` + `sourceUrl`, and the **section index** `i` within that page.\n- The replica preview URL (e.g. `http:\u002F\u002Flocalhost:8881`).\n\nEverything else you READ yourself from the captured data below.\n\n## The refine report — your audit trail (MANDATORY)\n\nYou own ONE file: `\u003CoutputDir>\u002Frefine\u002F\u003Cslug>\u002F\u003CsectionIndex>.json`. Write it atomically (write `\u003Cfile>.tmp`, then rename). Shape:\n\n```json\n{\n  \"schema\": 1, \"slug\": \"\u003Cpage slug>\", \"sourceUrl\": \"\u003Csource URL>\", \"index\": \u003CsectionIndex>,\n  \"findings\": [{ \"id\": \"kebab-stable-id\", \"region\": \"human label\", \"severity\": \"high|medium|low\", \"description\": \"design shows X, replica shows Y\", \"block_change\": \"wp:paragraph → wp:heading level=2 (or null)\", \"style_change\": \"fontSize → preset:large (or null)\", \"affects_layout\": true }],\n  \"applied\": [{ \"id\": \"...\", \"summary\": \"what you changed\" }],\n  \"skipped\": [{ \"id\": \"...\", \"reason\": \"one sentence\" }]\n}\n```\n\nWork in three phases:\n\n**Phase 1 — DIAGNOSE (no edits).** Look at source vs built side-by-side. Write EVERY visible difference as a finding — wrong color, size, spacing, alignment, dropped media, wrong width, layout overrun. Ids are kebab-case, unique, stable on re-runs (`hero-heading-size`, not `finding-1`). Populate `block_change` whenever a block swap\u002Fattribute change is implied, `style_change` whenever a measurable style value is implied — a finding with neither is acceptable only for free-form content differences. Write the report file with `applied: []`, `skipped: []` BEFORE touching markup.\n\n**Phase 2 — FIX (the eyes-on loop, unchanged).** Apply → render → look at both → iterate, exactly as described below.\n\n**Phase 3 — ACCOUNT.** Update the report: every finding id lands in exactly one of `applied` (with a summary of the actual change) or `skipped` (with a one-sentence reason — \"within font-substitution tolerance\" is legal; silence is not). Then call `liberate_refine_report {outputDir, slug}`. If it fails, fix the accounting (or the section) — a section with unaccounted findings is NOT done.\n\n## The captured data — this is your fuel. Read ALL of it for the section.\n\nFor section index `i` of the page:\n\n1. **`outputDir\u002Fsections\u002F\u003Cslug>.json`** → `sections[i]` — the `SectionSpec`. Read every field:\n   - `backgroundColor` (rgb\u002Frgba), `gradient`\n   - `layout.padTopPx` \u002F `layout.padBottomPx` \u002F `layout.padding` \u002F `layout.gap` \u002F `layout.containerWidth` \u002F `layout.columnCount`\n   - `fullBleed` (true → section spans the viewport edge-to-edge)\n   - `headings[]`, `headingSizes[]` (px), `headingLineHeights[]`, `headingFamilies[]`\n   - `bodyText[]`, `bodyTextSizes[]`, `bodyLineHeights[]`, `bodyFamilies[]`\n   - `buttonLabels[]` \u002F `buttons[]`, `images[]` (url, width, height, alt), `cells[]`, `textAlign`, `mediaLayout`\n   - **`styledHtml`** — a snapshot of the source subtree with every computed style inlined. This is your FIDELITY ORACLE: when in doubt about any value (a padding, a color, a font-size on a specific element), read it straight out of `styledHtml`. It is the source's exact rendered design.\n2. **`outputDir\u002Fdesign-foundation.json`** — the theme's semantic tokens (color roles, type families, spacing). Prefer a token slug when the captured value maps to one; use an explicit value when it does not.\n3. **`outputDir\u002Ftheme\u002Ftheme.json`** — the registered `fontFamilies` slugs, `fontSizes`, `color.palette` slugs you can reference.\n4. **Source section image** — the cropped source screenshot for this section (see \"Looking\", below).\n5. **`\u003CoutputDir>\u002Fasset-triage.json` (when present)** — decoration entries for your section explain imagery that was deliberately NOT emitted — the `description` tells you what the visual was. Reproduce its intent STRUCTURALLY (`wp:separator`, parent border, background color\u002Fgradient) per styling-priority.md; do not re-add the image, and do not flag its absence as a parity gap.\n\nIf a value is missing from the spec, get it from `styledHtml`. Do not guess.\n\n**Captured px are measured at the desktop capture width (≈1440).** A FIXED dimension (a cover `minHeight`, a fixed section height) copied verbatim will be too tall at a narrower compare width — convert proportional dimensions to `vw` (e.g. a 733px hero at 1440 → `51vw`). Padding\u002Ffont-size carried as `clamp()` already scale; fixed `minHeight`\u002F`height` do not. Always compare at the SOURCE screenshot's real width so px line up.\n\n**Lazy images:** below-fold cover\u002Fsection images decode lazily — a screenshot taken before they load shows a GREY block (looks like a \"lost background\"). Scroll the whole page to force-load (the `scripts\u002F_shot.ts` helper does this with `mouse.wheel`, not `page.evaluate`) BEFORE judging a missing\u002Fgrey background, or you will chase a phantom.\n\n## Apply it to the block markup — core attributes only\n\nThe section's blocks live in the page's `post_content` and in `outputDir\u002Ftheme\u002Ftheme\u002Fpatterns\u002Fpage-\u003Cslug>.php`. Edit the markup for THIS section. Map each captured axis to a CORE block attribute — these survive `@wordpress\u002Fblocks` canonicalization; inline `\u003Cfigure style>` and ad-hoc wrapper styles do NOT (they get stripped — [[project_block_fixer_canonicalization_constraint]]):\n\n| Captured | Apply as |\n|---|---|\n| heading\u002Fbody font-size | `style.typography.fontSize` (px or a `clamp()` whose max = captured px) |\n| line-height | `style.typography.lineHeight` (carry it WITH the size — never split them) |\n| font-family | `fontFamily` slug (`display`\u002F`body`\u002F…); match the source face |\n| font-weight \u002F letter-spacing \u002F transform \u002F align | `style.typography.fontWeight`\u002F`.letterSpacing`\u002F`.textTransform`, `textAlign` |\n| section padTopPx\u002FpadBottomPx, padding | `style.spacing.padding` on the section group |\n| inter-band margin | `style.spacing.margin` |\n| gap between columns\u002Fitems | `style.spacing.blockGap` |\n| backgroundColor | `backgroundColor` slug or `style.color.background` |\n| text color | `textColor` slug or `style.color.text` |\n| fullBleed = true | `align:full` on the section group + zero side padding |\n| not full-bleed | constrained (content width from `layout.containerWidth`) |\n| columnCount | a `core\u002Fcolumns` with that many `core\u002Fcolumn` (do NOT flatten) |\n| cover image focal point | inline `style=\"object-position:X% Y%\"` DIRECTLY on the `\u003Cimg>` tag — NOT `focalPoint` block JSON. Static-HTML patterns bypass server-side cover rendering, so `focalPoint` JSON does nothing; the inline `object-position` is what actually moves the crop. |\n\n**Styling decisions:** follow `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). Native blocks only; core\u002Fhtml islands are exempt.\n\n**Existing block style variations — inventory first.** Before emitting ANY new style, list `\u003CstudioSitePath>\u002Fwp-content\u002Fthemes\u002F\u003CthemeSlug>\u002Fstyles\u002Fblocks\u002F*.json`. Each file is a registered variation (`slug`, `title`, `blockTypes`, `styles`). When one matches what the section needs, REUSE it: apply `is-style-\u003Cslug>` on the block. NEVER redeclare an existing slug, never invent an `is-style-*` class with no backing file. New variations follow styling-priority.md option 5 (recurring + nameable only) and are written as a new `styles\u002Fblocks\u002F\u003Cslug>.json` file (slug `lib-` prefixed) plus the class on each claiming block.\n\n**Preserve ALL content** — every heading, paragraph, list item, button, image the source shows ([[feedback_never_lose_source_content]]). Never drop an image to \"simplify.\"\n\n## Render your change\n\nAfter editing the section's markup:\n1. Write the updated full `post_content` for the page to a temp file, then push it:\n   `studio wp --path \u003CstudioSitePath> post update \u003CpageId> --post_content=\"$(cat \u002Ftmp\u002Fsection-content.html)\"`\n   (Get `\u003CpageId>`: `studio wp --path \u003CstudioSitePath> post list --post_type=page --fields=ID,post_name --format=csv`.)\n   Mirror the same block edit into `outputDir\u002Ftheme\u002Ftheme\u002Fpatterns\u002Fpage-\u003Cslug>.php` and the installed copy under `\u003CstudioSitePath>\u002Fwp-content\u002Fthemes\u002F\u003CthemeSlug>\u002Fpatterns\u002F` so the theme + editor stay in sync.\n2. Flush: `studio wp --path \u003CstudioSitePath> cache flush`.\n\n## Looking — the gate. You MUST do this every iteration.\n\n1. **Source section image.** The full-page source screenshot is `outputDir\u002Fscreenshots\u002Fdesktop\u002F\u003Cslug>.png`. FIRST read its real width (`identify -format \"%w\" \u003Csrc>`) — it is often ~1008px, NOT 1440. Crop to this section's vertical band using the spec's `top` + `height` (`convert \u003Csrc> -crop WxH+0+TOP +repage outputDir\u002Fscreenshots\u002Fsrc-section-\u003Ci>.png`, width = the image's real width). Staging note: write all crops\u002Fscreenshots under `outputDir\u002Fscreenshots\u002F` — `\u002Ftmp` is OUTSIDE the Playwright MCP allowed roots and will be rejected.\n2. **Built section image.** Resize the Playwright viewport to the SOURCE screenshot's real width (e.g. 1008×900, not 1440) so the two are pixel-comparable — a width mismatch changes responsive crops and would create phantom \"differences.\" Navigate to `\u003CpreviewUrl>\u002F\u003Cslug>\u002F` (cache-bust with `?v=\u003Cn>`; for the front page the content may be at `\u003CpreviewUrl>\u002F`), then crop the rendered section to its bounding box (`browser_evaluate` the element's rect → `convert` crop) and save under `outputDir\u002Fscreenshots\u002F`.\n\n   A composition difference that comes from the SOURCE's pre-cropped CDN asset (e.g. a Wix image served pre-cropped at a width you don't have the exact pixels for) is NOT a markup bug — note it as residual, don't chase it with markup changes.\n3. **Read BOTH images** (Read tool on the two PNGs). Put them next to each other in your reasoning.\n   **Diff-image hygiene:** a `.diff.png` \u002F `.padded.png` marks WHERE pixels differ — never read a color, font, or size from it. Red is the difference marker; magenta (in `.padded.png`) means one side has no content at that location (layout overrun — high severity). Read every actual value from the SOURCE screenshot.\n4. **Name every difference** — bluntly, itemized ([[feedback_honest_visual_assessment]]): background color? section padding (too tight \u002F too loose)? heading size? line-height (cramped\u002Foverlapping)? body font wrong face? alignment (centered vs left)? full-bleed vs boxed? column count flattened? missing image? button style?\n5. If ANY real difference remains → fix it in the markup (map back to the table above, pulling exact values from the spec \u002F `styledHtml`), re-render, re-look. Loop.\n6. Only when the two images are **visually identical** (modulo font-substitution + minor text reflow) do you finish this section.\n\n**Do not rationalize a miss.** \"Close enough\", \"known gap\", \"the source is just different\" are not finishes — fix it or, if you genuinely cannot (a true WP rendering constraint), report it explicitly with both images, do not silently ship it.\n\n## Repair order — attack diffs in this sequence\n\nWhen you name multiple differences, fix them in this order. Each rung's diffs usually CAUSE the rungs below it (wrong macro layout shifts everything downstream, so fixing a font-size first just gets undone) — climbing in order converges; jumping around oscillates.\n\n1. **Content** — is everything the source shows actually present? A dropped image\u002Fheading\u002Flist-item\u002Fbutton is the first thing to restore ([[feedback_never_lose_source_content]]). Never proceed past a content gap.\n2. **Semantics** — right block for the role (heading is a heading, list is a list, columns are columns — not a flattened stack). Wrong structure can't be styled into parity.\n3. **Macro layout** — section width (full-bleed vs constrained), column count, media-vs-text order, major padding bands. The page's vertical rhythm rides on these.\n4. **Responsive** — does it hold at the compare width AND reflow sanely narrower? Fixed dimensions that only work at 1440 belong here (see scale, below).\n5. **Editor drift** — if an `editor-report.json` \u002F editorScore surface flags this page, the markup renders differently in the block editor than on the frontend (block recovery, save-validation drift). Reconcile both surfaces — a block that's invalid in the editor is not done even if the frontend looks right.\n6. **Scale** — per-axis sizing: font-size, line-height (always carried WITH the size), letter-spacing, gap. Convert fixed `minHeight`\u002F`height` captured at ≈1440 to `vw` so they scale.\n7. **Polish** — color exactness, focal point, button treatment, the last sub-pixel spacing.\n\n## Anti-gaming rules — what \"done\" is NOT\n\nThe diff score is a proxy for fidelity, not the goal. A change that improves the number while degrading the truth is a regression, not progress:\n\n- **Never hide a source-visible element to improve the diff.** Deleting\u002F`display:none`-ing content that the source shows lowers the pixel delta and destroys fidelity — the exact opposite of the job. If an element is hard to match, match it; do not make it disappear.\n- **A repair that regresses another surface reverts.** If closing the frontend diff worsens the editor surface (or mobile, or another section), it is not a fix — back it out and find one that holds on every surface. Don't trade one surface's score for another's.\n- **Blocked ≠ done.** A genuine WP rendering constraint you cannot close is REPORTED (RESIDUAL, with both images + the reason), never silently shipped as MATCHED. \"Blocked\" and \"matched\" are different statuses — conflating them launders a gap into a pass.\n\n## Output\n\nReport: the section, the iterations you ran, the diffs you closed each round (before→after), the final source-vs-built crops, and STATUS = MATCHED (visually identical) \u002F RESIDUAL (list the exact remaining differences + why you could not close them — for the operator). Never report MATCHED without having looked at both images in the final iteration.\n\n## Stay generic\n\nDerive every value from THIS section's captured data. Never hardcode a site's colors, fonts, filenames, copy, or section order ([[feedback_scripts_must_be_site_agnostic]]). The same loop must match any platform's section.\n",{"data":37,"body":48},{"name":4,"description":6,"disable-model-invocation":38,"allowed-tools":39},true,[40,41,42,43,44,45,46,47],"Bash","Read","Edit","Write","mcp__plugin_playwright_playwright__browser_navigate","mcp__plugin_playwright_playwright__browser_resize","mcp__plugin_playwright_playwright__browser_take_screenshot","mcp__plugin_playwright_playwright__browser_evaluate",{"type":49,"children":50},"root",[51,60,74,86,92,183,188,194,215,820,825,881,891,923,929,941,1270,1282,1339,1372,1378,1415,1779,1797,1875,1885,1891,1896,1963,1969,2171,2181,2187,2192,2293,2299,2304,2345,2351,2356,2362,2367],{"type":52,"tag":53,"props":54,"children":56},"element","h2",{"id":55},"what-you-do",[57],{"type":58,"value":59},"text","What you do",{"type":52,"tag":61,"props":62,"children":63},"p",{},[64,66,72],{"type":58,"value":65},"You make ONE section of the replica look visually identical to the same section on the source site. You are given everything the pipeline captured about that section. ",{"type":52,"tag":67,"props":68,"children":69},"strong",{},[70],{"type":58,"value":71},"Use it.",{"type":58,"value":73}," Then you LOOK at both — source section and your built section — and you do not stop until they match. Deterministic code already ran and got the structure roughly right; your job is the visual gap it cannot close.",{"type":52,"tag":61,"props":75,"children":76},{},[77,79,84],{"type":58,"value":78},"This is an eyes-on loop, not a one-shot emit. Apply → render → ",{"type":52,"tag":67,"props":80,"children":81},{},[82],{"type":58,"value":83},"look at both images",{"type":58,"value":85}," → name every difference → fix → render → look again. Move to \"done\" ONLY when the two images are visually identical (allowing for font-substitution and text-reflow noise — NOT for wrong color, wrong size, wrong spacing, wrong alignment, dropped media, or wrong width).",{"type":52,"tag":53,"props":87,"children":89},{"id":88},"inputs-the-orchestrator-gives-you",[90],{"type":58,"value":91},"Inputs the orchestrator gives you",{"type":52,"tag":93,"props":94,"children":95},"ul",{},[96,170],{"type":52,"tag":97,"props":98,"children":99},"li",{},[100,107,109,115,117,123,124,130,131,137,139,145,147,153,155,160,162,168],{"type":52,"tag":101,"props":102,"children":104},"code",{"className":103},[],[105],{"type":58,"value":106},"outputDir",{"type":58,"value":108}," (e.g. ",{"type":52,"tag":101,"props":110,"children":112},{"className":111},[],[113],{"type":58,"value":114},"~\u002FStudio\u002F_liberations\u002Fexample.com",{"type":58,"value":116},"), ",{"type":52,"tag":101,"props":118,"children":120},{"className":119},[],[121],{"type":58,"value":122},"studioSitePath",{"type":58,"value":108},{"type":52,"tag":101,"props":125,"children":127},{"className":126},[],[128],{"type":58,"value":129},"~\u002FStudio\u002Fexample-com",{"type":58,"value":116},{"type":52,"tag":101,"props":132,"children":134},{"className":133},[],[135],{"type":58,"value":136},"themeSlug",{"type":58,"value":138},", the page ",{"type":52,"tag":101,"props":140,"children":142},{"className":141},[],[143],{"type":58,"value":144},"slug",{"type":58,"value":146}," + ",{"type":52,"tag":101,"props":148,"children":150},{"className":149},[],[151],{"type":58,"value":152},"sourceUrl",{"type":58,"value":154},", and the ",{"type":52,"tag":67,"props":156,"children":157},{},[158],{"type":58,"value":159},"section index",{"type":58,"value":161}," ",{"type":52,"tag":101,"props":163,"children":165},{"className":164},[],[166],{"type":58,"value":167},"i",{"type":58,"value":169}," within that page.",{"type":52,"tag":97,"props":171,"children":172},{},[173,175,181],{"type":58,"value":174},"The replica preview URL (e.g. ",{"type":52,"tag":101,"props":176,"children":178},{"className":177},[],[179],{"type":58,"value":180},"http:\u002F\u002Flocalhost:8881",{"type":58,"value":182},").",{"type":52,"tag":61,"props":184,"children":185},{},[186],{"type":58,"value":187},"Everything else you READ yourself from the captured data below.",{"type":52,"tag":53,"props":189,"children":191},{"id":190},"the-refine-report-your-audit-trail-mandatory",[192],{"type":58,"value":193},"The refine report — your audit trail (MANDATORY)",{"type":52,"tag":61,"props":195,"children":196},{},[197,199,205,207,213],{"type":58,"value":198},"You own ONE file: ",{"type":52,"tag":101,"props":200,"children":202},{"className":201},[],[203],{"type":58,"value":204},"\u003CoutputDir>\u002Frefine\u002F\u003Cslug>\u002F\u003CsectionIndex>.json",{"type":58,"value":206},". Write it atomically (write ",{"type":52,"tag":101,"props":208,"children":210},{"className":209},[],[211],{"type":58,"value":212},"\u003Cfile>.tmp",{"type":58,"value":214},", then rename). Shape:",{"type":52,"tag":216,"props":217,"children":222},"pre",{"className":218,"code":219,"language":220,"meta":221,"style":221},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"schema\": 1, \"slug\": \"\u003Cpage slug>\", \"sourceUrl\": \"\u003Csource URL>\", \"index\": \u003CsectionIndex>,\n  \"findings\": [{ \"id\": \"kebab-stable-id\", \"region\": \"human label\", \"severity\": \"high|medium|low\", \"description\": \"design shows X, replica shows Y\", \"block_change\": \"wp:paragraph → wp:heading level=2 (or null)\", \"style_change\": \"fontSize → preset:large (or null)\", \"affects_layout\": true }],\n  \"applied\": [{ \"id\": \"...\", \"summary\": \"what you changed\" }],\n  \"skipped\": [{ \"id\": \"...\", \"reason\": \"one sentence\" }]\n}\n","json","",[223],{"type":52,"tag":101,"props":224,"children":225},{"__ignoreMap":221},[226,237,369,627,719,811],{"type":52,"tag":227,"props":228,"children":230},"span",{"class":229,"line":29},"line",[231],{"type":52,"tag":227,"props":232,"children":234},{"style":233},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[235],{"type":58,"value":236},"{\n",{"type":52,"tag":227,"props":238,"children":240},{"class":229,"line":239},2,[241,246,252,257,262,268,273,278,282,286,290,294,300,304,308,312,316,320,324,328,333,337,341,345,350,354,358,364],{"type":52,"tag":227,"props":242,"children":243},{"style":233},[244],{"type":58,"value":245},"  \"",{"type":52,"tag":227,"props":247,"children":249},{"style":248},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[250],{"type":58,"value":251},"schema",{"type":52,"tag":227,"props":253,"children":254},{"style":233},[255],{"type":58,"value":256},"\"",{"type":52,"tag":227,"props":258,"children":259},{"style":233},[260],{"type":58,"value":261},":",{"type":52,"tag":227,"props":263,"children":265},{"style":264},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[266],{"type":58,"value":267}," 1",{"type":52,"tag":227,"props":269,"children":270},{"style":233},[271],{"type":58,"value":272},",",{"type":52,"tag":227,"props":274,"children":275},{"style":233},[276],{"type":58,"value":277}," \"",{"type":52,"tag":227,"props":279,"children":280},{"style":248},[281],{"type":58,"value":144},{"type":52,"tag":227,"props":283,"children":284},{"style":233},[285],{"type":58,"value":256},{"type":52,"tag":227,"props":287,"children":288},{"style":233},[289],{"type":58,"value":261},{"type":52,"tag":227,"props":291,"children":292},{"style":233},[293],{"type":58,"value":277},{"type":52,"tag":227,"props":295,"children":297},{"style":296},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[298],{"type":58,"value":299},"\u003Cpage slug>",{"type":52,"tag":227,"props":301,"children":302},{"style":233},[303],{"type":58,"value":256},{"type":52,"tag":227,"props":305,"children":306},{"style":233},[307],{"type":58,"value":272},{"type":52,"tag":227,"props":309,"children":310},{"style":233},[311],{"type":58,"value":277},{"type":52,"tag":227,"props":313,"children":314},{"style":248},[315],{"type":58,"value":152},{"type":52,"tag":227,"props":317,"children":318},{"style":233},[319],{"type":58,"value":256},{"type":52,"tag":227,"props":321,"children":322},{"style":233},[323],{"type":58,"value":261},{"type":52,"tag":227,"props":325,"children":326},{"style":233},[327],{"type":58,"value":277},{"type":52,"tag":227,"props":329,"children":330},{"style":296},[331],{"type":58,"value":332},"\u003Csource URL>",{"type":52,"tag":227,"props":334,"children":335},{"style":233},[336],{"type":58,"value":256},{"type":52,"tag":227,"props":338,"children":339},{"style":233},[340],{"type":58,"value":272},{"type":52,"tag":227,"props":342,"children":343},{"style":233},[344],{"type":58,"value":277},{"type":52,"tag":227,"props":346,"children":347},{"style":248},[348],{"type":58,"value":349},"index",{"type":52,"tag":227,"props":351,"children":352},{"style":233},[353],{"type":58,"value":256},{"type":52,"tag":227,"props":355,"children":356},{"style":233},[357],{"type":58,"value":261},{"type":52,"tag":227,"props":359,"children":361},{"style":360},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[362],{"type":58,"value":363}," \u003CsectionIndex>",{"type":52,"tag":227,"props":365,"children":366},{"style":233},[367],{"type":58,"value":368},",\n",{"type":52,"tag":227,"props":370,"children":372},{"class":229,"line":371},3,[373,377,382,386,390,395,399,405,409,413,417,422,426,430,434,439,443,447,451,456,460,464,468,473,477,481,485,490,494,498,502,507,511,515,519,524,528,532,536,541,545,549,553,558,562,566,570,575,579,583,587,592,596,600,604,609,613,617,622],{"type":52,"tag":227,"props":374,"children":375},{"style":233},[376],{"type":58,"value":245},{"type":52,"tag":227,"props":378,"children":379},{"style":248},[380],{"type":58,"value":381},"findings",{"type":52,"tag":227,"props":383,"children":384},{"style":233},[385],{"type":58,"value":256},{"type":52,"tag":227,"props":387,"children":388},{"style":233},[389],{"type":58,"value":261},{"type":52,"tag":227,"props":391,"children":392},{"style":233},[393],{"type":58,"value":394}," [{",{"type":52,"tag":227,"props":396,"children":397},{"style":233},[398],{"type":58,"value":277},{"type":52,"tag":227,"props":400,"children":402},{"style":401},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[403],{"type":58,"value":404},"id",{"type":52,"tag":227,"props":406,"children":407},{"style":233},[408],{"type":58,"value":256},{"type":52,"tag":227,"props":410,"children":411},{"style":233},[412],{"type":58,"value":261},{"type":52,"tag":227,"props":414,"children":415},{"style":233},[416],{"type":58,"value":277},{"type":52,"tag":227,"props":418,"children":419},{"style":296},[420],{"type":58,"value":421},"kebab-stable-id",{"type":52,"tag":227,"props":423,"children":424},{"style":233},[425],{"type":58,"value":256},{"type":52,"tag":227,"props":427,"children":428},{"style":233},[429],{"type":58,"value":272},{"type":52,"tag":227,"props":431,"children":432},{"style":233},[433],{"type":58,"value":277},{"type":52,"tag":227,"props":435,"children":436},{"style":401},[437],{"type":58,"value":438},"region",{"type":52,"tag":227,"props":440,"children":441},{"style":233},[442],{"type":58,"value":256},{"type":52,"tag":227,"props":444,"children":445},{"style":233},[446],{"type":58,"value":261},{"type":52,"tag":227,"props":448,"children":449},{"style":233},[450],{"type":58,"value":277},{"type":52,"tag":227,"props":452,"children":453},{"style":296},[454],{"type":58,"value":455},"human label",{"type":52,"tag":227,"props":457,"children":458},{"style":233},[459],{"type":58,"value":256},{"type":52,"tag":227,"props":461,"children":462},{"style":233},[463],{"type":58,"value":272},{"type":52,"tag":227,"props":465,"children":466},{"style":233},[467],{"type":58,"value":277},{"type":52,"tag":227,"props":469,"children":470},{"style":401},[471],{"type":58,"value":472},"severity",{"type":52,"tag":227,"props":474,"children":475},{"style":233},[476],{"type":58,"value":256},{"type":52,"tag":227,"props":478,"children":479},{"style":233},[480],{"type":58,"value":261},{"type":52,"tag":227,"props":482,"children":483},{"style":233},[484],{"type":58,"value":277},{"type":52,"tag":227,"props":486,"children":487},{"style":296},[488],{"type":58,"value":489},"high|medium|low",{"type":52,"tag":227,"props":491,"children":492},{"style":233},[493],{"type":58,"value":256},{"type":52,"tag":227,"props":495,"children":496},{"style":233},[497],{"type":58,"value":272},{"type":52,"tag":227,"props":499,"children":500},{"style":233},[501],{"type":58,"value":277},{"type":52,"tag":227,"props":503,"children":504},{"style":401},[505],{"type":58,"value":506},"description",{"type":52,"tag":227,"props":508,"children":509},{"style":233},[510],{"type":58,"value":256},{"type":52,"tag":227,"props":512,"children":513},{"style":233},[514],{"type":58,"value":261},{"type":52,"tag":227,"props":516,"children":517},{"style":233},[518],{"type":58,"value":277},{"type":52,"tag":227,"props":520,"children":521},{"style":296},[522],{"type":58,"value":523},"design shows X, replica shows Y",{"type":52,"tag":227,"props":525,"children":526},{"style":233},[527],{"type":58,"value":256},{"type":52,"tag":227,"props":529,"children":530},{"style":233},[531],{"type":58,"value":272},{"type":52,"tag":227,"props":533,"children":534},{"style":233},[535],{"type":58,"value":277},{"type":52,"tag":227,"props":537,"children":538},{"style":401},[539],{"type":58,"value":540},"block_change",{"type":52,"tag":227,"props":542,"children":543},{"style":233},[544],{"type":58,"value":256},{"type":52,"tag":227,"props":546,"children":547},{"style":233},[548],{"type":58,"value":261},{"type":52,"tag":227,"props":550,"children":551},{"style":233},[552],{"type":58,"value":277},{"type":52,"tag":227,"props":554,"children":555},{"style":296},[556],{"type":58,"value":557},"wp:paragraph → wp:heading level=2 (or null)",{"type":52,"tag":227,"props":559,"children":560},{"style":233},[561],{"type":58,"value":256},{"type":52,"tag":227,"props":563,"children":564},{"style":233},[565],{"type":58,"value":272},{"type":52,"tag":227,"props":567,"children":568},{"style":233},[569],{"type":58,"value":277},{"type":52,"tag":227,"props":571,"children":572},{"style":401},[573],{"type":58,"value":574},"style_change",{"type":52,"tag":227,"props":576,"children":577},{"style":233},[578],{"type":58,"value":256},{"type":52,"tag":227,"props":580,"children":581},{"style":233},[582],{"type":58,"value":261},{"type":52,"tag":227,"props":584,"children":585},{"style":233},[586],{"type":58,"value":277},{"type":52,"tag":227,"props":588,"children":589},{"style":296},[590],{"type":58,"value":591},"fontSize → preset:large (or null)",{"type":52,"tag":227,"props":593,"children":594},{"style":233},[595],{"type":58,"value":256},{"type":52,"tag":227,"props":597,"children":598},{"style":233},[599],{"type":58,"value":272},{"type":52,"tag":227,"props":601,"children":602},{"style":233},[603],{"type":58,"value":277},{"type":52,"tag":227,"props":605,"children":606},{"style":401},[607],{"type":58,"value":608},"affects_layout",{"type":52,"tag":227,"props":610,"children":611},{"style":233},[612],{"type":58,"value":256},{"type":52,"tag":227,"props":614,"children":615},{"style":233},[616],{"type":58,"value":261},{"type":52,"tag":227,"props":618,"children":619},{"style":233},[620],{"type":58,"value":621}," true",{"type":52,"tag":227,"props":623,"children":624},{"style":233},[625],{"type":58,"value":626}," }],\n",{"type":52,"tag":227,"props":628,"children":630},{"class":229,"line":629},4,[631,635,640,644,648,652,656,660,664,668,672,677,681,685,689,694,698,702,706,711,715],{"type":52,"tag":227,"props":632,"children":633},{"style":233},[634],{"type":58,"value":245},{"type":52,"tag":227,"props":636,"children":637},{"style":248},[638],{"type":58,"value":639},"applied",{"type":52,"tag":227,"props":641,"children":642},{"style":233},[643],{"type":58,"value":256},{"type":52,"tag":227,"props":645,"children":646},{"style":233},[647],{"type":58,"value":261},{"type":52,"tag":227,"props":649,"children":650},{"style":233},[651],{"type":58,"value":394},{"type":52,"tag":227,"props":653,"children":654},{"style":233},[655],{"type":58,"value":277},{"type":52,"tag":227,"props":657,"children":658},{"style":401},[659],{"type":58,"value":404},{"type":52,"tag":227,"props":661,"children":662},{"style":233},[663],{"type":58,"value":256},{"type":52,"tag":227,"props":665,"children":666},{"style":233},[667],{"type":58,"value":261},{"type":52,"tag":227,"props":669,"children":670},{"style":233},[671],{"type":58,"value":277},{"type":52,"tag":227,"props":673,"children":674},{"style":296},[675],{"type":58,"value":676},"...",{"type":52,"tag":227,"props":678,"children":679},{"style":233},[680],{"type":58,"value":256},{"type":52,"tag":227,"props":682,"children":683},{"style":233},[684],{"type":58,"value":272},{"type":52,"tag":227,"props":686,"children":687},{"style":233},[688],{"type":58,"value":277},{"type":52,"tag":227,"props":690,"children":691},{"style":401},[692],{"type":58,"value":693},"summary",{"type":52,"tag":227,"props":695,"children":696},{"style":233},[697],{"type":58,"value":256},{"type":52,"tag":227,"props":699,"children":700},{"style":233},[701],{"type":58,"value":261},{"type":52,"tag":227,"props":703,"children":704},{"style":233},[705],{"type":58,"value":277},{"type":52,"tag":227,"props":707,"children":708},{"style":296},[709],{"type":58,"value":710},"what you changed",{"type":52,"tag":227,"props":712,"children":713},{"style":233},[714],{"type":58,"value":256},{"type":52,"tag":227,"props":716,"children":717},{"style":233},[718],{"type":58,"value":626},{"type":52,"tag":227,"props":720,"children":722},{"class":229,"line":721},5,[723,727,732,736,740,744,748,752,756,760,764,768,772,776,780,785,789,793,797,802,806],{"type":52,"tag":227,"props":724,"children":725},{"style":233},[726],{"type":58,"value":245},{"type":52,"tag":227,"props":728,"children":729},{"style":248},[730],{"type":58,"value":731},"skipped",{"type":52,"tag":227,"props":733,"children":734},{"style":233},[735],{"type":58,"value":256},{"type":52,"tag":227,"props":737,"children":738},{"style":233},[739],{"type":58,"value":261},{"type":52,"tag":227,"props":741,"children":742},{"style":233},[743],{"type":58,"value":394},{"type":52,"tag":227,"props":745,"children":746},{"style":233},[747],{"type":58,"value":277},{"type":52,"tag":227,"props":749,"children":750},{"style":401},[751],{"type":58,"value":404},{"type":52,"tag":227,"props":753,"children":754},{"style":233},[755],{"type":58,"value":256},{"type":52,"tag":227,"props":757,"children":758},{"style":233},[759],{"type":58,"value":261},{"type":52,"tag":227,"props":761,"children":762},{"style":233},[763],{"type":58,"value":277},{"type":52,"tag":227,"props":765,"children":766},{"style":296},[767],{"type":58,"value":676},{"type":52,"tag":227,"props":769,"children":770},{"style":233},[771],{"type":58,"value":256},{"type":52,"tag":227,"props":773,"children":774},{"style":233},[775],{"type":58,"value":272},{"type":52,"tag":227,"props":777,"children":778},{"style":233},[779],{"type":58,"value":277},{"type":52,"tag":227,"props":781,"children":782},{"style":401},[783],{"type":58,"value":784},"reason",{"type":52,"tag":227,"props":786,"children":787},{"style":233},[788],{"type":58,"value":256},{"type":52,"tag":227,"props":790,"children":791},{"style":233},[792],{"type":58,"value":261},{"type":52,"tag":227,"props":794,"children":795},{"style":233},[796],{"type":58,"value":277},{"type":52,"tag":227,"props":798,"children":799},{"style":296},[800],{"type":58,"value":801},"one sentence",{"type":52,"tag":227,"props":803,"children":804},{"style":233},[805],{"type":58,"value":256},{"type":52,"tag":227,"props":807,"children":808},{"style":233},[809],{"type":58,"value":810}," }]\n",{"type":52,"tag":227,"props":812,"children":814},{"class":229,"line":813},6,[815],{"type":52,"tag":227,"props":816,"children":817},{"style":233},[818],{"type":58,"value":819},"}\n",{"type":52,"tag":61,"props":821,"children":822},{},[823],{"type":58,"value":824},"Work in three phases:",{"type":52,"tag":61,"props":826,"children":827},{},[828,833,835,841,843,849,851,856,858,863,865,871,873,879],{"type":52,"tag":67,"props":829,"children":830},{},[831],{"type":58,"value":832},"Phase 1 — DIAGNOSE (no edits).",{"type":58,"value":834}," Look at source vs built side-by-side. Write EVERY visible difference as a finding — wrong color, size, spacing, alignment, dropped media, wrong width, layout overrun. Ids are kebab-case, unique, stable on re-runs (",{"type":52,"tag":101,"props":836,"children":838},{"className":837},[],[839],{"type":58,"value":840},"hero-heading-size",{"type":58,"value":842},", not ",{"type":52,"tag":101,"props":844,"children":846},{"className":845},[],[847],{"type":58,"value":848},"finding-1",{"type":58,"value":850},"). Populate ",{"type":52,"tag":101,"props":852,"children":854},{"className":853},[],[855],{"type":58,"value":540},{"type":58,"value":857}," whenever a block swap\u002Fattribute change is implied, ",{"type":52,"tag":101,"props":859,"children":861},{"className":860},[],[862],{"type":58,"value":574},{"type":58,"value":864}," whenever a measurable style value is implied — a finding with neither is acceptable only for free-form content differences. Write the report file with ",{"type":52,"tag":101,"props":866,"children":868},{"className":867},[],[869],{"type":58,"value":870},"applied: []",{"type":58,"value":872},", ",{"type":52,"tag":101,"props":874,"children":876},{"className":875},[],[877],{"type":58,"value":878},"skipped: []",{"type":58,"value":880}," BEFORE touching markup.",{"type":52,"tag":61,"props":882,"children":883},{},[884,889],{"type":52,"tag":67,"props":885,"children":886},{},[887],{"type":58,"value":888},"Phase 2 — FIX (the eyes-on loop, unchanged).",{"type":58,"value":890}," Apply → render → look at both → iterate, exactly as described below.",{"type":52,"tag":61,"props":892,"children":893},{},[894,899,901,906,908,913,915,921],{"type":52,"tag":67,"props":895,"children":896},{},[897],{"type":58,"value":898},"Phase 3 — ACCOUNT.",{"type":58,"value":900}," Update the report: every finding id lands in exactly one of ",{"type":52,"tag":101,"props":902,"children":904},{"className":903},[],[905],{"type":58,"value":639},{"type":58,"value":907}," (with a summary of the actual change) or ",{"type":52,"tag":101,"props":909,"children":911},{"className":910},[],[912],{"type":58,"value":731},{"type":58,"value":914}," (with a one-sentence reason — \"within font-substitution tolerance\" is legal; silence is not). Then call ",{"type":52,"tag":101,"props":916,"children":918},{"className":917},[],[919],{"type":58,"value":920},"liberate_refine_report {outputDir, slug}",{"type":58,"value":922},". If it fails, fix the accounting (or the section) — a section with unaccounted findings is NOT done.",{"type":52,"tag":53,"props":924,"children":926},{"id":925},"the-captured-data-this-is-your-fuel-read-all-of-it-for-the-section",[927],{"type":58,"value":928},"The captured data — this is your fuel. Read ALL of it for the section.",{"type":52,"tag":61,"props":930,"children":931},{},[932,934,939],{"type":58,"value":933},"For section index ",{"type":52,"tag":101,"props":935,"children":937},{"className":936},[],[938],{"type":58,"value":167},{"type":58,"value":940}," of the page:",{"type":52,"tag":942,"props":943,"children":944},"ol",{},[945,1178,1192,1229,1239],{"type":52,"tag":97,"props":946,"children":947},{},[948,957,959,965,967,973,975],{"type":52,"tag":67,"props":949,"children":950},{},[951],{"type":52,"tag":101,"props":952,"children":954},{"className":953},[],[955],{"type":58,"value":956},"outputDir\u002Fsections\u002F\u003Cslug>.json",{"type":58,"value":958}," → ",{"type":52,"tag":101,"props":960,"children":962},{"className":961},[],[963],{"type":58,"value":964},"sections[i]",{"type":58,"value":966}," — the ",{"type":52,"tag":101,"props":968,"children":970},{"className":969},[],[971],{"type":58,"value":972},"SectionSpec",{"type":58,"value":974},". Read every field:\n",{"type":52,"tag":93,"props":976,"children":977},{},[978,995,1040,1051,1082,1112,1157],{"type":52,"tag":97,"props":979,"children":980},{},[981,987,989],{"type":52,"tag":101,"props":982,"children":984},{"className":983},[],[985],{"type":58,"value":986},"backgroundColor",{"type":58,"value":988}," (rgb\u002Frgba), ",{"type":52,"tag":101,"props":990,"children":992},{"className":991},[],[993],{"type":58,"value":994},"gradient",{"type":52,"tag":97,"props":996,"children":997},{},[998,1004,1006,1012,1013,1019,1020,1026,1027,1033,1034],{"type":52,"tag":101,"props":999,"children":1001},{"className":1000},[],[1002],{"type":58,"value":1003},"layout.padTopPx",{"type":58,"value":1005}," \u002F ",{"type":52,"tag":101,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":58,"value":1011},"layout.padBottomPx",{"type":58,"value":1005},{"type":52,"tag":101,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":58,"value":1018},"layout.padding",{"type":58,"value":1005},{"type":52,"tag":101,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":58,"value":1025},"layout.gap",{"type":58,"value":1005},{"type":52,"tag":101,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":58,"value":1032},"layout.containerWidth",{"type":58,"value":1005},{"type":52,"tag":101,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":58,"value":1039},"layout.columnCount",{"type":52,"tag":97,"props":1041,"children":1042},{},[1043,1049],{"type":52,"tag":101,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":58,"value":1048},"fullBleed",{"type":58,"value":1050}," (true → section spans the viewport edge-to-edge)",{"type":52,"tag":97,"props":1052,"children":1053},{},[1054,1060,1061,1067,1069,1075,1076],{"type":52,"tag":101,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":58,"value":1059},"headings[]",{"type":58,"value":872},{"type":52,"tag":101,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":58,"value":1066},"headingSizes[]",{"type":58,"value":1068}," (px), ",{"type":52,"tag":101,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":58,"value":1074},"headingLineHeights[]",{"type":58,"value":872},{"type":52,"tag":101,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":58,"value":1081},"headingFamilies[]",{"type":52,"tag":97,"props":1083,"children":1084},{},[1085,1091,1092,1098,1099,1105,1106],{"type":52,"tag":101,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":58,"value":1090},"bodyText[]",{"type":58,"value":872},{"type":52,"tag":101,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":58,"value":1097},"bodyTextSizes[]",{"type":58,"value":872},{"type":52,"tag":101,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":58,"value":1104},"bodyLineHeights[]",{"type":58,"value":872},{"type":52,"tag":101,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":58,"value":1111},"bodyFamilies[]",{"type":52,"tag":97,"props":1113,"children":1114},{},[1115,1121,1122,1128,1129,1135,1137,1143,1144,1150,1151],{"type":52,"tag":101,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":58,"value":1120},"buttonLabels[]",{"type":58,"value":1005},{"type":52,"tag":101,"props":1123,"children":1125},{"className":1124},[],[1126],{"type":58,"value":1127},"buttons[]",{"type":58,"value":872},{"type":52,"tag":101,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":58,"value":1134},"images[]",{"type":58,"value":1136}," (url, width, height, alt), ",{"type":52,"tag":101,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":58,"value":1142},"cells[]",{"type":58,"value":872},{"type":52,"tag":101,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":58,"value":1149},"textAlign",{"type":58,"value":872},{"type":52,"tag":101,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":58,"value":1156},"mediaLayout",{"type":52,"tag":97,"props":1158,"children":1159},{},[1160,1169,1171,1176],{"type":52,"tag":67,"props":1161,"children":1162},{},[1163],{"type":52,"tag":101,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":58,"value":1168},"styledHtml",{"type":58,"value":1170}," — a snapshot of the source subtree with every computed style inlined. This is your FIDELITY ORACLE: when in doubt about any value (a padding, a color, a font-size on a specific element), read it straight out of ",{"type":52,"tag":101,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":58,"value":1168},{"type":58,"value":1177},". It is the source's exact rendered design.",{"type":52,"tag":97,"props":1179,"children":1180},{},[1181,1190],{"type":52,"tag":67,"props":1182,"children":1183},{},[1184],{"type":52,"tag":101,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":58,"value":1189},"outputDir\u002Fdesign-foundation.json",{"type":58,"value":1191}," — the theme's semantic tokens (color roles, type families, spacing). Prefer a token slug when the captured value maps to one; use an explicit value when it does not.",{"type":52,"tag":97,"props":1193,"children":1194},{},[1195,1204,1206,1212,1214,1220,1221,1227],{"type":52,"tag":67,"props":1196,"children":1197},{},[1198],{"type":52,"tag":101,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":58,"value":1203},"outputDir\u002Ftheme\u002Ftheme.json",{"type":58,"value":1205}," — the registered ",{"type":52,"tag":101,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":58,"value":1211},"fontFamilies",{"type":58,"value":1213}," slugs, ",{"type":52,"tag":101,"props":1215,"children":1217},{"className":1216},[],[1218],{"type":58,"value":1219},"fontSizes",{"type":58,"value":872},{"type":52,"tag":101,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":58,"value":1226},"color.palette",{"type":58,"value":1228}," slugs you can reference.",{"type":52,"tag":97,"props":1230,"children":1231},{},[1232,1237],{"type":52,"tag":67,"props":1233,"children":1234},{},[1235],{"type":58,"value":1236},"Source section image",{"type":58,"value":1238}," — the cropped source screenshot for this section (see \"Looking\", below).",{"type":52,"tag":97,"props":1240,"children":1241},{},[1242,1253,1255,1260,1262,1268],{"type":52,"tag":67,"props":1243,"children":1244},{},[1245,1251],{"type":52,"tag":101,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":58,"value":1250},"\u003CoutputDir>\u002Fasset-triage.json",{"type":58,"value":1252}," (when present)",{"type":58,"value":1254}," — decoration entries for your section explain imagery that was deliberately NOT emitted — the ",{"type":52,"tag":101,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":58,"value":506},{"type":58,"value":1261}," tells you what the visual was. Reproduce its intent STRUCTURALLY (",{"type":52,"tag":101,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":58,"value":1267},"wp:separator",{"type":58,"value":1269},", parent border, background color\u002Fgradient) per styling-priority.md; do not re-add the image, and do not flag its absence as a parity gap.",{"type":52,"tag":61,"props":1271,"children":1272},{},[1273,1275,1280],{"type":58,"value":1274},"If a value is missing from the spec, get it from ",{"type":52,"tag":101,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":58,"value":1168},{"type":58,"value":1281},". Do not guess.",{"type":52,"tag":61,"props":1283,"children":1284},{},[1285,1290,1292,1298,1300,1306,1308,1314,1316,1322,1324,1329,1331,1337],{"type":52,"tag":67,"props":1286,"children":1287},{},[1288],{"type":58,"value":1289},"Captured px are measured at the desktop capture width (≈1440).",{"type":58,"value":1291}," A FIXED dimension (a cover ",{"type":52,"tag":101,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":58,"value":1297},"minHeight",{"type":58,"value":1299},", a fixed section height) copied verbatim will be too tall at a narrower compare width — convert proportional dimensions to ",{"type":52,"tag":101,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":58,"value":1305},"vw",{"type":58,"value":1307}," (e.g. a 733px hero at 1440 → ",{"type":52,"tag":101,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":58,"value":1313},"51vw",{"type":58,"value":1315},"). Padding\u002Ffont-size carried as ",{"type":52,"tag":101,"props":1317,"children":1319},{"className":1318},[],[1320],{"type":58,"value":1321},"clamp()",{"type":58,"value":1323}," already scale; fixed ",{"type":52,"tag":101,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":58,"value":1297},{"type":58,"value":1330},"\u002F",{"type":52,"tag":101,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":58,"value":1336},"height",{"type":58,"value":1338}," do not. Always compare at the SOURCE screenshot's real width so px line up.",{"type":52,"tag":61,"props":1340,"children":1341},{},[1342,1347,1349,1355,1357,1363,1364,1370],{"type":52,"tag":67,"props":1343,"children":1344},{},[1345],{"type":58,"value":1346},"Lazy images:",{"type":58,"value":1348}," below-fold cover\u002Fsection images decode lazily — a screenshot taken before they load shows a GREY block (looks like a \"lost background\"). Scroll the whole page to force-load (the ",{"type":52,"tag":101,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":58,"value":1354},"scripts\u002F_shot.ts",{"type":58,"value":1356}," helper does this with ",{"type":52,"tag":101,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":58,"value":1362},"mouse.wheel",{"type":58,"value":842},{"type":52,"tag":101,"props":1365,"children":1367},{"className":1366},[],[1368],{"type":58,"value":1369},"page.evaluate",{"type":58,"value":1371},") BEFORE judging a missing\u002Fgrey background, or you will chase a phantom.",{"type":52,"tag":53,"props":1373,"children":1375},{"id":1374},"apply-it-to-the-block-markup-core-attributes-only",[1376],{"type":58,"value":1377},"Apply it to the block markup — core attributes only",{"type":52,"tag":61,"props":1379,"children":1380},{},[1381,1383,1389,1391,1397,1399,1405,1407,1413],{"type":58,"value":1382},"The section's blocks live in the page's ",{"type":52,"tag":101,"props":1384,"children":1386},{"className":1385},[],[1387],{"type":58,"value":1388},"post_content",{"type":58,"value":1390}," and in ",{"type":52,"tag":101,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":58,"value":1396},"outputDir\u002Ftheme\u002Ftheme\u002Fpatterns\u002Fpage-\u003Cslug>.php",{"type":58,"value":1398},". Edit the markup for THIS section. Map each captured axis to a CORE block attribute — these survive ",{"type":52,"tag":101,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":58,"value":1404},"@wordpress\u002Fblocks",{"type":58,"value":1406}," canonicalization; inline ",{"type":52,"tag":101,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":58,"value":1412},"\u003Cfigure style>",{"type":58,"value":1414}," and ad-hoc wrapper styles do NOT (they get stripped — [[project_block_fixer_canonicalization_constraint]]):",{"type":52,"tag":1416,"props":1417,"children":1418},"table",{},[1419,1438],{"type":52,"tag":1420,"props":1421,"children":1422},"thead",{},[1423],{"type":52,"tag":1424,"props":1425,"children":1426},"tr",{},[1427,1433],{"type":52,"tag":1428,"props":1429,"children":1430},"th",{},[1431],{"type":58,"value":1432},"Captured",{"type":52,"tag":1428,"props":1434,"children":1435},{},[1436],{"type":58,"value":1437},"Apply as",{"type":52,"tag":1439,"props":1440,"children":1441},"tbody",{},[1442,1469,1488,1522,1559,1578,1595,1612,1635,1659,1678,1698,1727],{"type":52,"tag":1424,"props":1443,"children":1444},{},[1445,1451],{"type":52,"tag":1446,"props":1447,"children":1448},"td",{},[1449],{"type":58,"value":1450},"heading\u002Fbody font-size",{"type":52,"tag":1446,"props":1452,"children":1453},{},[1454,1460,1462,1467],{"type":52,"tag":101,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":58,"value":1459},"style.typography.fontSize",{"type":58,"value":1461}," (px or a ",{"type":52,"tag":101,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":58,"value":1321},{"type":58,"value":1468}," whose max = captured px)",{"type":52,"tag":1424,"props":1470,"children":1471},{},[1472,1477],{"type":52,"tag":1446,"props":1473,"children":1474},{},[1475],{"type":58,"value":1476},"line-height",{"type":52,"tag":1446,"props":1478,"children":1479},{},[1480,1486],{"type":52,"tag":101,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":58,"value":1485},"style.typography.lineHeight",{"type":58,"value":1487}," (carry it WITH the size — never split them)",{"type":52,"tag":1424,"props":1489,"children":1490},{},[1491,1496],{"type":52,"tag":1446,"props":1492,"children":1493},{},[1494],{"type":58,"value":1495},"font-family",{"type":52,"tag":1446,"props":1497,"children":1498},{},[1499,1505,1507,1513,1514,1520],{"type":52,"tag":101,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":58,"value":1504},"fontFamily",{"type":58,"value":1506}," slug (",{"type":52,"tag":101,"props":1508,"children":1510},{"className":1509},[],[1511],{"type":58,"value":1512},"display",{"type":58,"value":1330},{"type":52,"tag":101,"props":1515,"children":1517},{"className":1516},[],[1518],{"type":58,"value":1519},"body",{"type":58,"value":1521},"\u002F…); match the source face",{"type":52,"tag":1424,"props":1523,"children":1524},{},[1525,1530],{"type":52,"tag":1446,"props":1526,"children":1527},{},[1528],{"type":58,"value":1529},"font-weight \u002F letter-spacing \u002F transform \u002F align",{"type":52,"tag":1446,"props":1531,"children":1532},{},[1533,1539,1540,1546,1547,1553,1554],{"type":52,"tag":101,"props":1534,"children":1536},{"className":1535},[],[1537],{"type":58,"value":1538},"style.typography.fontWeight",{"type":58,"value":1330},{"type":52,"tag":101,"props":1541,"children":1543},{"className":1542},[],[1544],{"type":58,"value":1545},".letterSpacing",{"type":58,"value":1330},{"type":52,"tag":101,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":58,"value":1552},".textTransform",{"type":58,"value":872},{"type":52,"tag":101,"props":1555,"children":1557},{"className":1556},[],[1558],{"type":58,"value":1149},{"type":52,"tag":1424,"props":1560,"children":1561},{},[1562,1567],{"type":52,"tag":1446,"props":1563,"children":1564},{},[1565],{"type":58,"value":1566},"section padTopPx\u002FpadBottomPx, padding",{"type":52,"tag":1446,"props":1568,"children":1569},{},[1570,1576],{"type":52,"tag":101,"props":1571,"children":1573},{"className":1572},[],[1574],{"type":58,"value":1575},"style.spacing.padding",{"type":58,"value":1577}," on the section group",{"type":52,"tag":1424,"props":1579,"children":1580},{},[1581,1586],{"type":52,"tag":1446,"props":1582,"children":1583},{},[1584],{"type":58,"value":1585},"inter-band margin",{"type":52,"tag":1446,"props":1587,"children":1588},{},[1589],{"type":52,"tag":101,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":58,"value":1594},"style.spacing.margin",{"type":52,"tag":1424,"props":1596,"children":1597},{},[1598,1603],{"type":52,"tag":1446,"props":1599,"children":1600},{},[1601],{"type":58,"value":1602},"gap between columns\u002Fitems",{"type":52,"tag":1446,"props":1604,"children":1605},{},[1606],{"type":52,"tag":101,"props":1607,"children":1609},{"className":1608},[],[1610],{"type":58,"value":1611},"style.spacing.blockGap",{"type":52,"tag":1424,"props":1613,"children":1614},{},[1615,1619],{"type":52,"tag":1446,"props":1616,"children":1617},{},[1618],{"type":58,"value":986},{"type":52,"tag":1446,"props":1620,"children":1621},{},[1622,1627,1629],{"type":52,"tag":101,"props":1623,"children":1625},{"className":1624},[],[1626],{"type":58,"value":986},{"type":58,"value":1628}," slug or ",{"type":52,"tag":101,"props":1630,"children":1632},{"className":1631},[],[1633],{"type":58,"value":1634},"style.color.background",{"type":52,"tag":1424,"props":1636,"children":1637},{},[1638,1643],{"type":52,"tag":1446,"props":1639,"children":1640},{},[1641],{"type":58,"value":1642},"text color",{"type":52,"tag":1446,"props":1644,"children":1645},{},[1646,1652,1653],{"type":52,"tag":101,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":58,"value":1651},"textColor",{"type":58,"value":1628},{"type":52,"tag":101,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":58,"value":1658},"style.color.text",{"type":52,"tag":1424,"props":1660,"children":1661},{},[1662,1667],{"type":52,"tag":1446,"props":1663,"children":1664},{},[1665],{"type":58,"value":1666},"fullBleed = true",{"type":52,"tag":1446,"props":1668,"children":1669},{},[1670,1676],{"type":52,"tag":101,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":58,"value":1675},"align:full",{"type":58,"value":1677}," on the section group + zero side padding",{"type":52,"tag":1424,"props":1679,"children":1680},{},[1681,1686],{"type":52,"tag":1446,"props":1682,"children":1683},{},[1684],{"type":58,"value":1685},"not full-bleed",{"type":52,"tag":1446,"props":1687,"children":1688},{},[1689,1691,1696],{"type":58,"value":1690},"constrained (content width from ",{"type":52,"tag":101,"props":1692,"children":1694},{"className":1693},[],[1695],{"type":58,"value":1032},{"type":58,"value":1697},")",{"type":52,"tag":1424,"props":1699,"children":1700},{},[1701,1706],{"type":52,"tag":1446,"props":1702,"children":1703},{},[1704],{"type":58,"value":1705},"columnCount",{"type":52,"tag":1446,"props":1707,"children":1708},{},[1709,1711,1717,1719,1725],{"type":58,"value":1710},"a ",{"type":52,"tag":101,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":58,"value":1716},"core\u002Fcolumns",{"type":58,"value":1718}," with that many ",{"type":52,"tag":101,"props":1720,"children":1722},{"className":1721},[],[1723],{"type":58,"value":1724},"core\u002Fcolumn",{"type":58,"value":1726}," (do NOT flatten)",{"type":52,"tag":1424,"props":1728,"children":1729},{},[1730,1735],{"type":52,"tag":1446,"props":1731,"children":1732},{},[1733],{"type":58,"value":1734},"cover image focal point",{"type":52,"tag":1446,"props":1736,"children":1737},{},[1738,1740,1746,1748,1754,1756,1762,1764,1769,1771,1777],{"type":58,"value":1739},"inline ",{"type":52,"tag":101,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":58,"value":1745},"style=\"object-position:X% Y%\"",{"type":58,"value":1747}," DIRECTLY on the ",{"type":52,"tag":101,"props":1749,"children":1751},{"className":1750},[],[1752],{"type":58,"value":1753},"\u003Cimg>",{"type":58,"value":1755}," tag — NOT ",{"type":52,"tag":101,"props":1757,"children":1759},{"className":1758},[],[1760],{"type":58,"value":1761},"focalPoint",{"type":58,"value":1763}," block JSON. Static-HTML patterns bypass server-side cover rendering, so ",{"type":52,"tag":101,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":58,"value":1761},{"type":58,"value":1770}," JSON does nothing; the inline ",{"type":52,"tag":101,"props":1772,"children":1774},{"className":1773},[],[1775],{"type":58,"value":1776},"object-position",{"type":58,"value":1778}," is what actually moves the crop.",{"type":52,"tag":61,"props":1780,"children":1781},{},[1782,1787,1789,1795],{"type":52,"tag":67,"props":1783,"children":1784},{},[1785],{"type":58,"value":1786},"Styling decisions:",{"type":58,"value":1788}," follow ",{"type":52,"tag":101,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":58,"value":1794},"skills\u002Freplicate-with-blocks\u002Fstyling-priority.md",{"type":58,"value":1796}," — 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). Native blocks only; core\u002Fhtml islands are exempt.",{"type":52,"tag":61,"props":1798,"children":1799},{},[1800,1805,1807,1813,1815,1820,1821,1827,1828,1834,1835,1841,1843,1849,1851,1857,1859,1865,1867,1873],{"type":52,"tag":67,"props":1801,"children":1802},{},[1803],{"type":58,"value":1804},"Existing block style variations — inventory first.",{"type":58,"value":1806}," Before emitting ANY new style, list ",{"type":52,"tag":101,"props":1808,"children":1810},{"className":1809},[],[1811],{"type":58,"value":1812},"\u003CstudioSitePath>\u002Fwp-content\u002Fthemes\u002F\u003CthemeSlug>\u002Fstyles\u002Fblocks\u002F*.json",{"type":58,"value":1814},". Each file is a registered variation (",{"type":52,"tag":101,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":58,"value":144},{"type":58,"value":872},{"type":52,"tag":101,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":58,"value":1826},"title",{"type":58,"value":872},{"type":52,"tag":101,"props":1829,"children":1831},{"className":1830},[],[1832],{"type":58,"value":1833},"blockTypes",{"type":58,"value":872},{"type":52,"tag":101,"props":1836,"children":1838},{"className":1837},[],[1839],{"type":58,"value":1840},"styles",{"type":58,"value":1842},"). When one matches what the section needs, REUSE it: apply ",{"type":52,"tag":101,"props":1844,"children":1846},{"className":1845},[],[1847],{"type":58,"value":1848},"is-style-\u003Cslug>",{"type":58,"value":1850}," on the block. NEVER redeclare an existing slug, never invent an ",{"type":52,"tag":101,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":58,"value":1856},"is-style-*",{"type":58,"value":1858}," class with no backing file. New variations follow styling-priority.md option 5 (recurring + nameable only) and are written as a new ",{"type":52,"tag":101,"props":1860,"children":1862},{"className":1861},[],[1863],{"type":58,"value":1864},"styles\u002Fblocks\u002F\u003Cslug>.json",{"type":58,"value":1866}," file (slug ",{"type":52,"tag":101,"props":1868,"children":1870},{"className":1869},[],[1871],{"type":58,"value":1872},"lib-",{"type":58,"value":1874}," prefixed) plus the class on each claiming block.",{"type":52,"tag":61,"props":1876,"children":1877},{},[1878,1883],{"type":52,"tag":67,"props":1879,"children":1880},{},[1881],{"type":58,"value":1882},"Preserve ALL content",{"type":58,"value":1884}," — every heading, paragraph, list item, button, image the source shows ([[feedback_never_lose_source_content]]). Never drop an image to \"simplify.\"",{"type":52,"tag":53,"props":1886,"children":1888},{"id":1887},"render-your-change",[1889],{"type":58,"value":1890},"Render your change",{"type":52,"tag":61,"props":1892,"children":1893},{},[1894],{"type":58,"value":1895},"After editing the section's markup:",{"type":52,"tag":942,"props":1897,"children":1898},{},[1899,1950],{"type":52,"tag":97,"props":1900,"children":1901},{},[1902,1904,1909,1911,1917,1919,1925,1927,1933,1935,1940,1942,1948],{"type":58,"value":1903},"Write the updated full ",{"type":52,"tag":101,"props":1905,"children":1907},{"className":1906},[],[1908],{"type":58,"value":1388},{"type":58,"value":1910}," for the page to a temp file, then push it:\n",{"type":52,"tag":101,"props":1912,"children":1914},{"className":1913},[],[1915],{"type":58,"value":1916},"studio wp --path \u003CstudioSitePath> post update \u003CpageId> --post_content=\"$(cat \u002Ftmp\u002Fsection-content.html)\"",{"type":58,"value":1918},"\n(Get ",{"type":52,"tag":101,"props":1920,"children":1922},{"className":1921},[],[1923],{"type":58,"value":1924},"\u003CpageId>",{"type":58,"value":1926},": ",{"type":52,"tag":101,"props":1928,"children":1930},{"className":1929},[],[1931],{"type":58,"value":1932},"studio wp --path \u003CstudioSitePath> post list --post_type=page --fields=ID,post_name --format=csv",{"type":58,"value":1934},".)\nMirror the same block edit into ",{"type":52,"tag":101,"props":1936,"children":1938},{"className":1937},[],[1939],{"type":58,"value":1396},{"type":58,"value":1941}," and the installed copy under ",{"type":52,"tag":101,"props":1943,"children":1945},{"className":1944},[],[1946],{"type":58,"value":1947},"\u003CstudioSitePath>\u002Fwp-content\u002Fthemes\u002F\u003CthemeSlug>\u002Fpatterns\u002F",{"type":58,"value":1949}," so the theme + editor stay in sync.",{"type":52,"tag":97,"props":1951,"children":1952},{},[1953,1955,1961],{"type":58,"value":1954},"Flush: ",{"type":52,"tag":101,"props":1956,"children":1958},{"className":1957},[],[1959],{"type":58,"value":1960},"studio wp --path \u003CstudioSitePath> cache flush",{"type":58,"value":1962},".",{"type":52,"tag":53,"props":1964,"children":1966},{"id":1965},"looking-the-gate-you-must-do-this-every-iteration",[1967],{"type":58,"value":1968},"Looking — the gate. You MUST do this every iteration.",{"type":52,"tag":942,"props":1970,"children":1971},{},[1972,2036,2098,2137,2147,2159],{"type":52,"tag":97,"props":1973,"children":1974},{},[1975,1980,1982,1988,1990,1996,1998,2004,2005,2010,2012,2018,2020,2026,2028,2034],{"type":52,"tag":67,"props":1976,"children":1977},{},[1978],{"type":58,"value":1979},"Source section image.",{"type":58,"value":1981}," The full-page source screenshot is ",{"type":52,"tag":101,"props":1983,"children":1985},{"className":1984},[],[1986],{"type":58,"value":1987},"outputDir\u002Fscreenshots\u002Fdesktop\u002F\u003Cslug>.png",{"type":58,"value":1989},". FIRST read its real width (",{"type":52,"tag":101,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":58,"value":1995},"identify -format \"%w\" \u003Csrc>",{"type":58,"value":1997},") — it is often ~1008px, NOT 1440. Crop to this section's vertical band using the spec's ",{"type":52,"tag":101,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":58,"value":2003},"top",{"type":58,"value":146},{"type":52,"tag":101,"props":2006,"children":2008},{"className":2007},[],[2009],{"type":58,"value":1336},{"type":58,"value":2011}," (",{"type":52,"tag":101,"props":2013,"children":2015},{"className":2014},[],[2016],{"type":58,"value":2017},"convert \u003Csrc> -crop WxH+0+TOP +repage outputDir\u002Fscreenshots\u002Fsrc-section-\u003Ci>.png",{"type":58,"value":2019},", width = the image's real width). Staging note: write all crops\u002Fscreenshots under ",{"type":52,"tag":101,"props":2021,"children":2023},{"className":2022},[],[2024],{"type":58,"value":2025},"outputDir\u002Fscreenshots\u002F",{"type":58,"value":2027}," — ",{"type":52,"tag":101,"props":2029,"children":2031},{"className":2030},[],[2032],{"type":58,"value":2033},"\u002Ftmp",{"type":58,"value":2035}," is OUTSIDE the Playwright MCP allowed roots and will be rejected.",{"type":52,"tag":97,"props":2037,"children":2038},{},[2039,2044,2046,2052,2054,2060,2062,2068,2070,2076,2078,2084,2086,2091,2092,2096],{"type":52,"tag":67,"props":2040,"children":2041},{},[2042],{"type":58,"value":2043},"Built section image.",{"type":58,"value":2045}," Resize the Playwright viewport to the SOURCE screenshot's real width (e.g. 1008×900, not 1440) so the two are pixel-comparable — a width mismatch changes responsive crops and would create phantom \"differences.\" Navigate to ",{"type":52,"tag":101,"props":2047,"children":2049},{"className":2048},[],[2050],{"type":58,"value":2051},"\u003CpreviewUrl>\u002F\u003Cslug>\u002F",{"type":58,"value":2053}," (cache-bust with ",{"type":52,"tag":101,"props":2055,"children":2057},{"className":2056},[],[2058],{"type":58,"value":2059},"?v=\u003Cn>",{"type":58,"value":2061},"; for the front page the content may be at ",{"type":52,"tag":101,"props":2063,"children":2065},{"className":2064},[],[2066],{"type":58,"value":2067},"\u003CpreviewUrl>\u002F",{"type":58,"value":2069},"), then crop the rendered section to its bounding box (",{"type":52,"tag":101,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":58,"value":2075},"browser_evaluate",{"type":58,"value":2077}," the element's rect → ",{"type":52,"tag":101,"props":2079,"children":2081},{"className":2080},[],[2082],{"type":58,"value":2083},"convert",{"type":58,"value":2085}," crop) and save under ",{"type":52,"tag":101,"props":2087,"children":2089},{"className":2088},[],[2090],{"type":58,"value":2025},{"type":58,"value":1962},{"type":52,"tag":2093,"props":2094,"children":2095},"br",{},[],{"type":58,"value":2097},"A composition difference that comes from the SOURCE's pre-cropped CDN asset (e.g. a Wix image served pre-cropped at a width you don't have the exact pixels for) is NOT a markup bug — note it as residual, don't chase it with markup changes.",{"type":52,"tag":97,"props":2099,"children":2100},{},[2101,2106,2108,2113,2115,2121,2122,2128,2130,2135],{"type":52,"tag":67,"props":2102,"children":2103},{},[2104],{"type":58,"value":2105},"Read BOTH images",{"type":58,"value":2107}," (Read tool on the two PNGs). Put them next to each other in your reasoning.\n",{"type":52,"tag":67,"props":2109,"children":2110},{},[2111],{"type":58,"value":2112},"Diff-image hygiene:",{"type":58,"value":2114}," a ",{"type":52,"tag":101,"props":2116,"children":2118},{"className":2117},[],[2119],{"type":58,"value":2120},".diff.png",{"type":58,"value":1005},{"type":52,"tag":101,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":58,"value":2127},".padded.png",{"type":58,"value":2129}," marks WHERE pixels differ — never read a color, font, or size from it. Red is the difference marker; magenta (in ",{"type":52,"tag":101,"props":2131,"children":2133},{"className":2132},[],[2134],{"type":58,"value":2127},{"type":58,"value":2136},") means one side has no content at that location (layout overrun — high severity). Read every actual value from the SOURCE screenshot.",{"type":52,"tag":97,"props":2138,"children":2139},{},[2140,2145],{"type":52,"tag":67,"props":2141,"children":2142},{},[2143],{"type":58,"value":2144},"Name every difference",{"type":58,"value":2146}," — bluntly, itemized ([[feedback_honest_visual_assessment]]): background color? section padding (too tight \u002F too loose)? heading size? line-height (cramped\u002Foverlapping)? body font wrong face? alignment (centered vs left)? full-bleed vs boxed? column count flattened? missing image? button style?",{"type":52,"tag":97,"props":2148,"children":2149},{},[2150,2152,2157],{"type":58,"value":2151},"If ANY real difference remains → fix it in the markup (map back to the table above, pulling exact values from the spec \u002F ",{"type":52,"tag":101,"props":2153,"children":2155},{"className":2154},[],[2156],{"type":58,"value":1168},{"type":58,"value":2158},"), re-render, re-look. Loop.",{"type":52,"tag":97,"props":2160,"children":2161},{},[2162,2164,2169],{"type":58,"value":2163},"Only when the two images are ",{"type":52,"tag":67,"props":2165,"children":2166},{},[2167],{"type":58,"value":2168},"visually identical",{"type":58,"value":2170}," (modulo font-substitution + minor text reflow) do you finish this section.",{"type":52,"tag":61,"props":2172,"children":2173},{},[2174,2179],{"type":52,"tag":67,"props":2175,"children":2176},{},[2177],{"type":58,"value":2178},"Do not rationalize a miss.",{"type":58,"value":2180}," \"Close enough\", \"known gap\", \"the source is just different\" are not finishes — fix it or, if you genuinely cannot (a true WP rendering constraint), report it explicitly with both images, do not silently ship it.",{"type":52,"tag":53,"props":2182,"children":2184},{"id":2183},"repair-order-attack-diffs-in-this-sequence",[2185],{"type":58,"value":2186},"Repair order — attack diffs in this sequence",{"type":52,"tag":61,"props":2188,"children":2189},{},[2190],{"type":58,"value":2191},"When you name multiple differences, fix them in this order. Each rung's diffs usually CAUSE the rungs below it (wrong macro layout shifts everything downstream, so fixing a font-size first just gets undone) — climbing in order converges; jumping around oscillates.",{"type":52,"tag":942,"props":2193,"children":2194},{},[2195,2205,2215,2225,2235,2253,2283],{"type":52,"tag":97,"props":2196,"children":2197},{},[2198,2203],{"type":52,"tag":67,"props":2199,"children":2200},{},[2201],{"type":58,"value":2202},"Content",{"type":58,"value":2204}," — is everything the source shows actually present? A dropped image\u002Fheading\u002Flist-item\u002Fbutton is the first thing to restore ([[feedback_never_lose_source_content]]). Never proceed past a content gap.",{"type":52,"tag":97,"props":2206,"children":2207},{},[2208,2213],{"type":52,"tag":67,"props":2209,"children":2210},{},[2211],{"type":58,"value":2212},"Semantics",{"type":58,"value":2214}," — right block for the role (heading is a heading, list is a list, columns are columns — not a flattened stack). Wrong structure can't be styled into parity.",{"type":52,"tag":97,"props":2216,"children":2217},{},[2218,2223],{"type":52,"tag":67,"props":2219,"children":2220},{},[2221],{"type":58,"value":2222},"Macro layout",{"type":58,"value":2224}," — section width (full-bleed vs constrained), column count, media-vs-text order, major padding bands. The page's vertical rhythm rides on these.",{"type":52,"tag":97,"props":2226,"children":2227},{},[2228,2233],{"type":52,"tag":67,"props":2229,"children":2230},{},[2231],{"type":58,"value":2232},"Responsive",{"type":58,"value":2234}," — does it hold at the compare width AND reflow sanely narrower? Fixed dimensions that only work at 1440 belong here (see scale, below).",{"type":52,"tag":97,"props":2236,"children":2237},{},[2238,2243,2245,2251],{"type":52,"tag":67,"props":2239,"children":2240},{},[2241],{"type":58,"value":2242},"Editor drift",{"type":58,"value":2244}," — if an ",{"type":52,"tag":101,"props":2246,"children":2248},{"className":2247},[],[2249],{"type":58,"value":2250},"editor-report.json",{"type":58,"value":2252}," \u002F editorScore surface flags this page, the markup renders differently in the block editor than on the frontend (block recovery, save-validation drift). Reconcile both surfaces — a block that's invalid in the editor is not done even if the frontend looks right.",{"type":52,"tag":97,"props":2254,"children":2255},{},[2256,2261,2263,2268,2269,2274,2276,2281],{"type":52,"tag":67,"props":2257,"children":2258},{},[2259],{"type":58,"value":2260},"Scale",{"type":58,"value":2262}," — per-axis sizing: font-size, line-height (always carried WITH the size), letter-spacing, gap. Convert fixed ",{"type":52,"tag":101,"props":2264,"children":2266},{"className":2265},[],[2267],{"type":58,"value":1297},{"type":58,"value":1330},{"type":52,"tag":101,"props":2270,"children":2272},{"className":2271},[],[2273],{"type":58,"value":1336},{"type":58,"value":2275}," captured at ≈1440 to ",{"type":52,"tag":101,"props":2277,"children":2279},{"className":2278},[],[2280],{"type":58,"value":1305},{"type":58,"value":2282}," so they scale.",{"type":52,"tag":97,"props":2284,"children":2285},{},[2286,2291],{"type":52,"tag":67,"props":2287,"children":2288},{},[2289],{"type":58,"value":2290},"Polish",{"type":58,"value":2292}," — color exactness, focal point, button treatment, the last sub-pixel spacing.",{"type":52,"tag":53,"props":2294,"children":2296},{"id":2295},"anti-gaming-rules-what-done-is-not",[2297],{"type":58,"value":2298},"Anti-gaming rules — what \"done\" is NOT",{"type":52,"tag":61,"props":2300,"children":2301},{},[2302],{"type":58,"value":2303},"The diff score is a proxy for fidelity, not the goal. A change that improves the number while degrading the truth is a regression, not progress:",{"type":52,"tag":93,"props":2305,"children":2306},{},[2307,2325,2335],{"type":52,"tag":97,"props":2308,"children":2309},{},[2310,2315,2317,2323],{"type":52,"tag":67,"props":2311,"children":2312},{},[2313],{"type":58,"value":2314},"Never hide a source-visible element to improve the diff.",{"type":58,"value":2316}," Deleting\u002F",{"type":52,"tag":101,"props":2318,"children":2320},{"className":2319},[],[2321],{"type":58,"value":2322},"display:none",{"type":58,"value":2324},"-ing content that the source shows lowers the pixel delta and destroys fidelity — the exact opposite of the job. If an element is hard to match, match it; do not make it disappear.",{"type":52,"tag":97,"props":2326,"children":2327},{},[2328,2333],{"type":52,"tag":67,"props":2329,"children":2330},{},[2331],{"type":58,"value":2332},"A repair that regresses another surface reverts.",{"type":58,"value":2334}," If closing the frontend diff worsens the editor surface (or mobile, or another section), it is not a fix — back it out and find one that holds on every surface. Don't trade one surface's score for another's.",{"type":52,"tag":97,"props":2336,"children":2337},{},[2338,2343],{"type":52,"tag":67,"props":2339,"children":2340},{},[2341],{"type":58,"value":2342},"Blocked ≠ done.",{"type":58,"value":2344}," A genuine WP rendering constraint you cannot close is REPORTED (RESIDUAL, with both images + the reason), never silently shipped as MATCHED. \"Blocked\" and \"matched\" are different statuses — conflating them launders a gap into a pass.",{"type":52,"tag":53,"props":2346,"children":2348},{"id":2347},"output",[2349],{"type":58,"value":2350},"Output",{"type":52,"tag":61,"props":2352,"children":2353},{},[2354],{"type":58,"value":2355},"Report: the section, the iterations you ran, the diffs you closed each round (before→after), the final source-vs-built crops, and STATUS = MATCHED (visually identical) \u002F RESIDUAL (list the exact remaining differences + why you could not close them — for the operator). Never report MATCHED without having looked at both images in the final iteration.",{"type":52,"tag":53,"props":2357,"children":2359},{"id":2358},"stay-generic",[2360],{"type":58,"value":2361},"Stay generic",{"type":52,"tag":61,"props":2363,"children":2364},{},[2365],{"type":58,"value":2366},"Derive every value from THIS section's captured data. Never hardcode a site's colors, fonts, filenames, copy, or section order ([[feedback_scripts_must_be_site_agnostic]]). The same loop must match any platform's section.",{"type":52,"tag":2368,"props":2369,"children":2370},"style",{},[2371],{"type":58,"value":2372},"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":2374,"total":2556},[2375,2394,2409,2423,2440,2455,2469,2484,2499,2510,2525,2541],{"slug":2376,"name":2376,"fn":2377,"description":2378,"org":2379,"tags":2380,"stars":2391,"repoUrl":2392,"updatedAt":2393},"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},[2381,2382,2385,2388],{"name":20,"slug":21,"type":15},{"name":2383,"slug":2384,"type":15},"Productivity","productivity",{"name":2386,"slug":2387,"type":15},"UX Copy","ux-copy",{"name":2389,"slug":2390,"type":15},"UX Design","ux-design",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-06T05:40:01.516544",{"slug":2395,"name":2395,"fn":2396,"description":2397,"org":2398,"tags":2399,"stars":2391,"repoUrl":2392,"updatedAt":2408},"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},[2400,2401,2404,2407],{"name":17,"slug":18,"type":15},{"name":2402,"slug":2403,"type":15},"CSS","css",{"name":2405,"slug":2406,"type":15},"HTML","html",{"name":13,"slug":14,"type":15},"2026-05-27T07:01:55.629681",{"slug":2410,"name":2410,"fn":2411,"description":2412,"org":2413,"tags":2414,"stars":2391,"repoUrl":2392,"updatedAt":2422},"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},[2415,2418,2421],{"name":2416,"slug":2417,"type":15},"Pricing","pricing",{"name":2419,"slug":2420,"type":15},"Reference","reference",{"name":13,"slug":14,"type":15},"2026-07-02T07:42:33.654791",{"slug":2424,"name":2424,"fn":2425,"description":2426,"org":2427,"tags":2428,"stars":2391,"repoUrl":2392,"updatedAt":2439},"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},[2429,2432,2435,2438],{"name":2430,"slug":2431,"type":15},"CMS","cms",{"name":2433,"slug":2434,"type":15},"Migration","migration",{"name":2436,"slug":2437,"type":15},"Web Development","web-development",{"name":13,"slug":14,"type":15},"2026-07-09T06:47:33.454311",{"slug":2441,"name":2441,"fn":2442,"description":2443,"org":2444,"tags":2445,"stars":2391,"repoUrl":2392,"updatedAt":2454},"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},[2446,2449,2450,2453],{"name":2447,"slug":2448,"type":15},"Audit","audit",{"name":20,"slug":21,"type":15},{"name":2451,"slug":2452,"type":15},"Performance","performance",{"name":13,"slug":14,"type":15},"2026-05-06T05:40:06.433267",{"slug":2456,"name":2456,"fn":2457,"description":2458,"org":2459,"tags":2460,"stars":2391,"repoUrl":2392,"updatedAt":2468},"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},[2461,2464,2467],{"name":2462,"slug":2463,"type":15},"Content Creation","content-creation",{"name":2465,"slug":2466,"type":15},"Plugin Development","plugin-development",{"name":13,"slug":14,"type":15},"2026-05-27T07:01:58.249105",{"slug":2470,"name":2470,"fn":2471,"description":2472,"org":2473,"tags":2474,"stars":2391,"repoUrl":2392,"updatedAt":2483},"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},[2475,2476,2479,2482],{"name":2447,"slug":2448,"type":15},{"name":2477,"slug":2478,"type":15},"Marketing","marketing",{"name":2480,"slug":2481,"type":15},"SEO","seo",{"name":13,"slug":14,"type":15},"2026-05-06T05:40:05.196367",{"slug":2485,"name":2485,"fn":2486,"description":2487,"org":2488,"tags":2489,"stars":2391,"repoUrl":2392,"updatedAt":2498},"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},[2490,2491,2494,2497],{"name":23,"slug":24,"type":15},{"name":2492,"slug":2493,"type":15},"Product Management","product-management",{"name":2495,"slug":2496,"type":15},"Specs","specs",{"name":13,"slug":14,"type":15},"2026-05-06T05:40:02.739409",{"slug":2500,"name":2500,"fn":2501,"description":2502,"org":2503,"tags":2504,"stars":2391,"repoUrl":2392,"updatedAt":2509},"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},[2505,2508],{"name":2506,"slug":2507,"type":15},"CLI","cli",{"name":13,"slug":14,"type":15},"2026-04-06T18:02:57.150231",{"slug":2511,"name":2511,"fn":2512,"description":2513,"org":2514,"tags":2515,"stars":2391,"repoUrl":2392,"updatedAt":2524},"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},[2516,2519,2522,2523],{"name":2517,"slug":2518,"type":15},"Content Strategy","content-strategy",{"name":2520,"slug":2521,"type":15},"Data Cleaning","data-cleaning",{"name":2480,"slug":2481,"type":15},{"name":13,"slug":14,"type":15},"2026-05-06T05:40:03.966799",{"slug":2526,"name":2526,"fn":2527,"description":2528,"org":2529,"tags":2530,"stars":2391,"repoUrl":2392,"updatedAt":2540},"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},[2531,2534,2535,2538],{"name":2532,"slug":2533,"type":15},"Animation","animation",{"name":23,"slug":24,"type":15},{"name":2536,"slug":2537,"type":15},"Typography","typography",{"name":2539,"slug":2526,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":2542,"name":2542,"fn":2543,"description":2544,"org":2545,"tags":2546,"stars":2391,"repoUrl":2392,"updatedAt":2555},"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},[2547,2550,2551,2554],{"name":2548,"slug":2549,"type":15},"Debugging","debugging",{"name":20,"slug":21,"type":15},{"name":2552,"slug":2553,"type":15},"Screenshots","screenshots",{"name":2539,"slug":2526,"type":15},"2026-06-06T07:09:59.809812",81,{"items":2558,"total":2655},[2559,2574,2585,2598,2611,2626,2642],{"slug":2560,"name":2560,"fn":2561,"description":2562,"org":2563,"tags":2564,"stars":25,"repoUrl":26,"updatedAt":2573},"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},[2565,2568,2569,2572],{"name":2566,"slug":2567,"type":15},"Automation","automation",{"name":2520,"slug":2521,"type":15},{"name":2570,"slug":2571,"type":15},"Data Engineering","data-engineering",{"name":13,"slug":14,"type":15},"2026-05-09T05:32:13.987972",{"slug":2575,"name":2575,"fn":2576,"description":2577,"org":2578,"tags":2579,"stars":25,"repoUrl":26,"updatedAt":2584},"compose-page-blocks","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},[2580,2581,2582,2583],{"name":17,"slug":18,"type":15},{"name":2462,"slug":2463,"type":15},{"name":2405,"slug":2406,"type":15},{"name":13,"slug":14,"type":15},"2026-06-08T08:17:34.212397",{"slug":2586,"name":2586,"fn":2587,"description":2588,"org":2589,"tags":2590,"stars":25,"repoUrl":26,"updatedAt":2597},"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},[2591,2592,2595,2596],{"name":17,"slug":18,"type":15},{"name":2593,"slug":2594,"type":15},"Full Site Editing","full-site-editing",{"name":2465,"slug":2466,"type":15},{"name":13,"slug":14,"type":15},"2026-06-08T08:17:49.413995",{"slug":2599,"name":2599,"fn":2600,"description":2601,"org":2602,"tags":2603,"stars":25,"repoUrl":26,"updatedAt":2610},"creating-themes","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},[2604,2605,2606,2609],{"name":17,"slug":18,"type":15},{"name":2593,"slug":2594,"type":15},{"name":2607,"slug":2608,"type":15},"Themes","themes",{"name":13,"slug":14,"type":15},"2026-06-08T08:17:50.666611",{"slug":2612,"name":2612,"fn":2613,"description":2614,"org":2615,"tags":2616,"stars":25,"repoUrl":26,"updatedAt":2625},"design-foundations","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},[2617,2620,2621,2624],{"name":2618,"slug":2619,"type":15},"Data Modeling","data-modeling",{"name":23,"slug":24,"type":15},{"name":2622,"slug":2623,"type":15},"Design System","design-system",{"name":20,"slug":21,"type":15},"2026-06-08T08:17:44.457834",{"slug":2627,"name":2627,"fn":2628,"description":2629,"org":2630,"tags":2631,"stars":25,"repoUrl":26,"updatedAt":2641},"design-qa","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},[2632,2635,2636,2639,2640],{"name":2633,"slug":2634,"type":15},"QA","qa",{"name":2552,"slug":2553,"type":15},{"name":2637,"slug":2638,"type":15},"Testing","testing",{"name":2607,"slug":2608,"type":15},{"name":13,"slug":14,"type":15},"2026-06-08T08:17:45.698278",{"slug":2643,"name":2643,"fn":2644,"description":2645,"org":2646,"tags":2647,"stars":25,"repoUrl":26,"updatedAt":2654},"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},[2648,2649,2650,2653],{"name":2570,"slug":2571,"type":15},{"name":2548,"slug":2549,"type":15},{"name":2651,"slug":2652,"type":15},"Logs","logs",{"name":2633,"slug":2634,"type":15},"2026-05-10T05:48:11.267642",21]