[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-design-qa":3,"mdc--vb8age-key":39,"related-org-automattic-design-qa":3424,"related-repo-automattic-design-qa":3612},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":28,"repoUrl":29,"updatedAt":30,"license":31,"forks":32,"topics":33,"repo":34,"sourceUrl":37,"mdContent":38},"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},"automattic","Automattic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fautomattic.png",[12,16,19,22,25],{"name":13,"slug":14,"type":15},"QA","qa","tag",{"name":17,"slug":18,"type":15},"WordPress","wordpress",{"name":20,"slug":21,"type":15},"Themes","themes",{"name":23,"slug":24,"type":15},"Screenshots","screenshots",{"name":26,"slug":27,"type":15},"Testing","testing",31,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fdata-liberation-agent","2026-06-08T08:17:45.698278",null,1,[],{"repoUrl":29,"stars":28,"forks":32,"topics":35,"description":36},[],"Extract content from closed web platforms into WordPress-compatible WXR files.","https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fdata-liberation-agent\u002Ftree\u002FHEAD\u002Fskills\u002Fdesign-qa","---\nname: design-qa\ndescription: 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.\ndisable-model-invocation: true\nallowed-tools:\n  - Bash\n  - Read\n  - Write\n  - Edit\n  - Glob\n  - Grep\n---\n\n# Design QA\n\nYou are the visual-QA loop run after the replica theme is installed and content is imported. Your job is to verify that the replica matches the source site, classify every gap, apply fixes, and log what remains. You do not generate theme files from scratch — you drive `editing-themes` and `editing-blocks` for all edits.\n\nRead `skills\u002Fdesign-qa\u002Freferences\u002Fvisual-qa.md` for the detailed visual-review procedure before starting.\n\n## Honesty discipline (read first — this is the point of the whole skill)\n\n**Never declare a match you have not measured. Default to skepticism, not optimism.**\n\nThe single most damaging failure mode in this loop is announcing \"it matches\" \u002F \"looks good\" \u002F \"close enough\" \u002F \"strong parity\" when it does not. That destroys trust and ships a broken replica. Treat every such phrase as a STOP sign:\n\n- If you catch yourself about to write \"matches\", \"looks great\", \"pixel-perfect\", \"now matches\", or \"strong parity\" — **stop**. Open the source and replica screenshots side by side, sample the actual pixels (colors, positions, sizes, gaps), and write the **itemized list of concrete differences first**. Lead with what is WRONG, in specifics (alignment, font, image identity, band color, overlay, missing element), before anything positive.\n- A verdict of \"match\" requires **measured evidence per section** (sampled source vs replica values), not vision impression. No evidence ⇒ it is `fail (unverified)`, never a pass.\n- When the operator says it doesn't match, they are the ground truth. Do not argue or re-assert — apologize, re-measure brutally, and list every gap you can find. The correct reflex is: *\"You're right — it does not match. Here is every difference I can measure,\"* then fix and re-measure.\n- \"Improved\" is not \"matches.\" Reaching genuine parity is the bar; partial progress is reported as partial, with the remaining gaps named explicitly.\n- Do not send the operator a screenshot with a caption claiming parity unless the measured per-section table backs it. Show the gaps, not a victory lap.\n\nThis discipline overrides any urge to wrap up. Under-claiming and continuing to work is always safer than over-claiming and stopping.\n\n## Inputs\n\nThe orchestrator passes you:\n\n- `replicaBaseUrl` — the running replica WP install URL.\n- `outputDir` — the resolved site output dir (e.g. `~\u002FStudio\u002F_liberations\u002Fexample.com`); contains source screenshots and manifest.\n- `archetypeReps` — map of archetype → representative URL paths (one per archetype, from `liberate_replicate_inventory`).\n\n## Workflow\n\n### Step 1 — Capture replica screenshots\n\nCall `liberate_replicate_verify` with `replicaBaseUrl`, `outputDir`, and the representative URL paths from `archetypeReps`. Use the default viewports (desktop + mobile). The tool captures replica screenshots and pairs each with the matching source screenshot from `screenshots\u002Fmanifest.json`.\n\n```ts\nliberate_replicate_verify({\n  outputDir,\n  replicaBaseUrl,\n  urls: Object.values(archetypeReps),\n  outputSubdir: \"replica-screenshots\"\n})\n```\n\nRead the returned `pairs[]` manifest. You will use the paired PNGs for both the responsiveness gate and the qualitative review. Each pair also carries `sections[]` — per-section layout metrics read from the live replica DOM at desktop (`{ columnCount, bg, hasMedia }` in document order) — which feed the parity gate (Step 3).\n\n### Step 2 — Responsiveness gate (HARD)\n\nFor each captured mobile pair, evaluate responsiveness using the `evaluateResponsive` helper from `src\u002Flib\u002Freplicate\u002Fresponsive-check.ts`. The gate checks three conditions at 390px viewport width:\n\n- **No horizontal overflow:** `scrollWidth \u003C= viewportWidth` — the page must not extend beyond the viewport.\n- **Sections reflow:** `sectionsReflowed >= sectionsTotal` — every section must have stacked vertically (single-column) at mobile width.\n- **No content past the fold:** `contentPastFoldCount == 0` — read from the mobile `ViewportCapture.contentPastFold` returned by `liberate_replicate_verify`. This catches a **fixed-layout styled island** (R4b) that keeps `scrollWidth == 390` because `overflow-x:clip` hides it, while its content is amputated off-screen. `scrollWidth` alone cannot see this.\n\nA fail on ANY condition is a **hard block** — do not continue to qualitative review or acceptance. For overflow\u002Freflow, apply responsive CSS via `editing-themes`. For **content-past-fold**, a CSS tweak will NOT fix a fixed-coordinate page-builder section (Wix etc.) — the styled island is a desktop-only floor and does not reflow; the section must be rebuilt via **R4a** (`rebuild-section` → reflowing core blocks). Re-capture (return to Step 1) after the fix. If the gate still fails after the ladder is exhausted, stop, log to `theme\u002Fnotes.md` and `run-report.json`, and escalate to the operator (Step 7) without accepting.\n\n### Step 3 — Qualitative review\n\nOnce the responsiveness gate passes, read each source\u002Freplica screenshot pair with vision — desktop and mobile — for every archetype representative. Produce per-URL observations:\n\n- Section order match\n- Header\u002Ffooter structure and nav labels\n- Hero content, image crops, CTA placement and color\n- Column counts, spacing rhythm, alignment\n- Typography (family, weight, size, color) fidelity\n- Mobile stacking behavior\n\n**Measure, don't trust vision alone — sample the source.** Before asserting any band \"matches,\" SAMPLE the actual pixels of both source and replica and compare. Eyeballing repeatedly mis-judged colors, sizes, and gaps in practice; the source screenshot is ground truth. For each section band (use the section Y-bands from the spec, or scan the full-page screenshot top→bottom):\n\n- **Section background color** — sample source vs replica at the band center and at left\u002Fcenter\u002Fright thirds. A hue\u002Flightness delta beyond a small tolerance is a **real gap** (e.g. a pale-blue source band rendered grey), not \"close enough.\"\n- **Inter-section gaps** — scan a vertical strip; a white band between two colored sections in the replica that the source does not have is a gap-margin regression (sections must butt edge-to-edge).\n- **Heading vs body sizes** — sample the rendered text height of a heading vs a paragraph; if the replica heading is markedly smaller than the source's, suspect fluid-typography shrink or a too-small size.\n\nA no-PIL environment can sample PNGs with the project's `pngjs` dependency (load → index `(W*y+x)\u003C\u003C2`). Report the sampled deltas — do not write \"matches\" without them.\n\nThe per-section pixel-diff from `liberate_compare` (or `diff-pngs`) is a **forces-inspection signal**: a section whose desktop delta is high MUST be inspected. It is NOT itself the gate value (raw delta is noisy under font substitution \u002F reflow). NOTE: `liberate_compare` needs the standard layout in BOTH dirs (`manifest.json` + `desktop\u002F\u003Cslug>.png` + `mobile\u002F\u003Cslug>.png`). `liberate_replicate_verify` writes the replica PNGs in that shape but its `pairs[]` come back in the tool result; if `compare` errors with \"manifest missing,\" the replica subdir lacks a `manifest.json` — copy\u002Fsymlink the source `manifest.json` into the replica dir, then re-run (don't silently fall back to vision-only).\n\n**Build the measured `SectionParity[]` per content page — this is the gate, not your prose.** The metrics are read for you; you assemble and score them (`src\u002Flib\u002Freplicate\u002Fsection-parity.ts`):\n\n1. For each content page, pair the verify result's `pairs[].sections[i]` (live replica DOM: `{ columnCount, bg, hasMedia }`) to the source spec section `specs[...][i]` **by index**.\n2. Build a `SourceSectionDescriptor` from each spec section: `columnCount = layout.columnCount`, `backgroundColor`, `hasMedia = images.length > 0`, `isCssLayout = columnCount >= 2 || cells >= 2`, `isHtmlFallback = provenanceFlags has \\`html-fallback#\u003Ci>\\``. **Note the `#`:** a `html-fallback-styled#\u003Ci>` flag (the R4b styled-island floor) is NOT an unstyled fallback — `'html-fallback-styled#0'` does not start with `'html-fallback#'`, so it correctly does NOT set `isHtmlFallback`\u002F`fallbackUnstyled`. Only the bare unstyled island trips the signal.\n3. `toSectionParityMetrics(descriptor, replicaSection ?? null)` → `evaluateSectionParity(...)` → the five signals. A missing replica section (`null`) reads as `sectionPresent: false`.\n\nThe signals: `sectionPresent` (not dropped\u002Fmerged), `bgDeltaE` (ΔE2000 of `spec.backgroundColor` vs rendered `bg`, `> BG_DELTA_E_FLOOR` = 10 diverges), `columnCountMatch` (replica `columnCount >= source`), `mediaPresent`, `fallbackUnstyled` (island on a CSS-layout section). `evidence` carries the measured source\u002Freplica values backing the score — **no record ships without it** (prove-it-works: no evidence ≠ matches).\n\nFor each `divergent` section, state concretely what a **10** (matches the source) looks like, then **gap-to-target**: climb the escalation ladder (Step 6) to close it and re-score, showing before→after. `deriveSectionParityStatus(signals, acceptance)` decides `match` \u002F `divergent` \u002F `accepted` — and the run-report verdict re-derives from these records, so you cannot talk a `divergent` section into a pass. Pixel sampling is now only a fallback when a section has no spec-captured `backgroundColor`.\n\n**Vision review must catch what the upstream gates structurally cannot:**\n\n- **Semantic misclassification.** The reconstruction's coverage + provenance gates check that captured text is PRESENT and not invented — they do NOT check it's rendered with the right semantics. A paragraph mis-rendered as a giant `\u003Ch2>` (body-as-heading), or an eyebrow duplicated as a trailing line, passes every gate. Only vision catches it → classify as **A** (spec\u002Fextractor wrong) and flag the extractor heading\u002Fbody classification.\n- **`core\u002Fhtml` fallback islands.** Sections the renderer fell back to (`run-report.htmlFallbackSections > 0`) carry verbatim source HTML but NOT the source CSS. Text-heavy sections render fine; a CSS-styled section (cards\u002Fgrid\u002Fcolumns) that fell back renders UNSTYLED — looks broken. Vision-check every island: an unstyled-island regression is a **fidelity gap**, not a pass. (Root tuning lives in `section-coverage.ts` `TEXT_FLOOR` — see `replicate\u002FSKILL.md`.)\n\n### Step 4 — Accessibility checks (warn, not block)\n\nFor each representative page, flag the following in the run-report. Do **not** hard-fail or auto-fix — faithfulness to the source wins.\n\n- **Contrast:** text\u002Fbackground pairs below WCAG AA (4.5:1). Check the palette entries from `design-foundation.json` against the source rendering. Log each failing pair as a warning.\n- **Alt text:** images with missing or empty `alt` attributes. Carry the source's alt verbatim; flag any that are absent for human fill — never generate alt copy.\n\nAdd all flags to the run-report under `a11yWarnings[]`.\n\n### Step 5 — Classify discrepancies\n\nFor each `divergent` section from Step 3, classify — class drives which **escalation rung** (Step 6) you climb, NOT whether you ship:\n\n| Class | Meaning | Action |\n|---|---|---|\n| **A** | Spec wrong — the section spec or captured content is incorrect | Re-extract that section spec, then rebuild (rung R3) |\n| **B** | Template dropped info — the pattern\u002Ftemplate didn't carry through content that was in the spec | Fix section-mapping or rebuild the affected block markup (rungs R1–R2) |\n| **C** | WP renders differently — a genuine core-block\u002FWP rendering constraint, not a theme authoring error | Only Class C may be `accepted` by the agent, and ONLY with sampled-pixel `proof` attached |\n\n**Class C is narrow and never a flatten.** Flattening (3 cards → 1 column), wrong background color, dropped grid\u002Fcolumns, and dropped media are **fixable, never Class C** — `deriveSectionParityStatus` rejects a `class-c` acceptance for them outright. A true Class-C constraint does not trip the robust signals at all (it shows as `match` with a high pixel-delta you annotate). Accepting any *divergent* section is therefore the **operator's** call (Step 7), not the agent's.\n\nProduce the `SectionParity[]` records (Step 3) plus, per section, `{ urlPath, band, class, description, rung }`.\n\n### Step 6 — Close the gap (escalation ladder)\n\nEvery `divergent` section must be driven toward `match`. The ladder is climbed **per section** — each section gets its own climb, so a page with several bespoke sections is not capped at one section's worth of fixes. **Each iteration climbs to a STRONGER rung — never re-run the same rung.** This strictly-climbing rule is what makes the 5-rung ceiling safe: it cannot degrade into five attempts at the same tweak. Climb until the section re-scores `match`:\n\n- **R1 — theme\u002FCSS fix** (`editing-themes`): band background color, spacing, inter-section gap.\n- **R2 — rebuild block markup** (`editing-blocks`): restore the columns\u002Fgrid the structured render flattened, from the source spec.\n- **R3 — re-extract the spec** (Class A): if the section spec itself is wrong, re-extract it, then rebuild via R2.\n- **R4a — AI canonical-block rebuild** (`rebuild-section`): when R1–R3 can't reach `match`, rebuild the section into native core blocks from its **source HTML + `styledHtml` + section screenshots + spec + design tokens** (richer inputs than R2's spec-only). Assemble that input bundle, dispatch the subagent, then run the **four acceptance gates**: ① block-markup oracle (`liberate_validate_artifacts`), ② canonicalization round-trip survives `@wordpress\u002Fblocks`, ③ re-measured `section-parity` = `match`, ④ `measureSectionCoverage` = no loss. Accept the rebuild **only if all four pass** — the agent cannot self-accept; acceptance is the measured re-score. If any gate fails, fall to R4b.\n- **R4b — deterministic styled-island floor** (no AI): the section's `styledHtml` snapshot already ships through the reconstruction as a **styled** `core\u002Fhtml` island (provenance `html-fallback-styled#\u003Ci>`), which renders pixel-faithful and clears the `unstyled-island` signal. Faithful but not block-editable — the floor for genuinely bespoke sections R4a can't map to core blocks. R4b reaching `match` is a **valid pass**; R4a (editable) is always tried first.\n\nEach R4a dispatch is a **subagent**, counted toward the run's subagent ceiling in `budget-guard` — that is the per-run cost bound on AI spend.\n\n`editing-themes`, `editing-blocks`, and `rebuild-section` are `disable-model-invocation: true` — you cannot `Skill`-launch them from this inline-run loop. Apply each rung by **dispatching a subagent whose prompt points it at the skill's `SKILL.md`** (the subagent reads the file and applies the fix), matching the subagent-dispatch convention; do not stall on a refused Skill call.\n\nAfter applying a rung, reinstall the updated theme files via the orchestrator's install path and return to Step 1 to re-capture and re-score. \"Known gap\" \u002F \"where it falls short\" is an **escalation trigger, not a conclusion** — never write it as the terminal state of a shipped run.\n\n### Step 7 — Circuit-breaker checkpoint (escalate, don't surrender)\n\n**The checkpoint is \"ladder exhausted per section\" (all 5 rungs — R1, R2, R3, R4a, R4b — tried without `match`) OR the per-run cost ceiling, whichever comes first — not a per-page iteration tally.** The 5-rung ceiling is derived from the rung count, so it stays in sync if rungs change; the strictly-climbing rule (Step 6) prevents thrashing within it. Total AI spend is bounded by `budget-guard`'s subagent ceiling (`checkBudget`), which `pause`s the run when reached. When a section exhausts the ladder, or the budget guard signals `pause`, you do NOT log-and-ship. Stop and ask the **operator**, surfacing what you tried per rung and the current `SectionParity`:\n\n- **Raise the budget** — keep climbing \u002F accept more R4a subagent spend.\n- **Accept with sign-off** — the operator accepts the divergence; record it as `acceptance: { by: 'human', proof: \u003Coperator rationale> }` on that section. This is the ONLY way a `divergent` section ships.\n- **Abandon this page** — recorded explicitly, surfaced as a hard `fail` in the run-report.\n\nLog per-rung attempts to `theme\u002Fnotes.md`. Do NOT silently accept or stop. A `divergent` section with no human `acceptance` keeps the run at `fail`.\n\n## Output contract\n\nReturn to the orchestrator:\n\nPass the `pageParity[]` (`{ page, sections: SectionParity[] }` per content page) into `buildRunReport` — the verdict is computed from it. Return to the orchestrator:\n\n```json\n{\n  \"passed\": true,\n  \"iterations\": 2,\n  \"perUrl\": [\n    {\n      \"urlPath\": \"\u002F\",\n      \"archetype\": \"homepage\",\n      \"responsiveness\": { \"passed\": true },\n      \"sections\": [\n        { \"band\": \"hero\", \"score\": 10, \"status\": \"match\",\n          \"signals\": { \"sectionPresent\": true, \"bgDeltaE\": 1.2, \"columnCountMatch\": true, \"mediaPresent\": true, \"fallbackUnstyled\": false },\n          \"evidence\": { \"srcSample\": \"#d0d2cd\", \"repSample\": \"#d0d2cd\" } },\n        { \"band\": \"service-cards\", \"score\": 10, \"status\": \"match\",\n          \"signals\": { \"sectionPresent\": true, \"bgDeltaE\": 2.0, \"columnCountMatch\": true, \"mediaPresent\": true, \"fallbackUnstyled\": false },\n          \"evidence\": { \"srcSample\": \"#ccc6c6\", \"repSample\": \"#cdc7c7\" },\n          \"note\": \"was FLATTENED — cards lost bg + grid; restored via R2 iter 1, re-scored 4→10\" }\n      ],\n      \"qualitative\": \"Per-section parity above. CTA color drifted, fixed via R1 iter 1.\",\n      \"a11yWarnings\": []\n    }\n  ],\n  \"a11yWarnings\": [],\n  \"notesPath\": \"\u003CoutputDir>\u002Ftheme\u002Fnotes.md\"\n}\n```\n\n`passed` is NOT a separate assertion — it is the run-report verdict computed by `buildRunReport` over `pageParity[]`: it is `true` only when (1) the responsiveness gate passes for all archetypes, AND (2) every content-page section re-derives to `match` or `accepted` (a `divergent` section, or a reconstructed page with NO sampled sections, forces `fail`). You cannot move a section to \"accepted\" yourself except a Class-C constraint with sampled-pixel proof — flattening\u002Fwrong-bg\u002Fdropped-grid\u002Fdropped-media never qualify and require the operator's sign-off (Step 7).\n\n## Rules\n\n- The responsiveness gate is a hard pass\u002Ffail. Per-section visual parity is **also a hard gate**: any unaccepted `divergent` section fails the run.\n- **Record the measured `SectionParity[]` with `evidence` — never claim a page \"matches\" without sampled signals.** Vision + eyeballing repeatedly mis-judged color\u002Fsize\u002Fgaps; a page with no sampled sections is `fail (unverified)`, not a pass.\n- **Never self-accept a structural divergence.** Flattening, wrong bg, dropped grid\u002Fmedia → fix via the escalation ladder or escalate to the operator. Only a genuine Class-C WP constraint may be agent-accepted, and only with `proof`.\n- Never auto-fix accessibility issues — flag and move on.\n- Never accept a result that failed the responsiveness gate.\n- Never generate net-new theme structure — drive `editing-themes` and `editing-blocks` for all modifications.\n- 3 iterations per page is a circuit-breaker **checkpoint with the operator**, not a license to stop and ship. Escalate; don't surrender.\n",{"data":40,"body":49},{"name":4,"description":6,"disable-model-invocation":41,"allowed-tools":42},true,[43,44,45,46,47,48],"Bash","Read","Write","Edit","Glob","Grep",{"type":50,"children":51},"root",[52,60,83,96,103,112,117,184,189,195,200,252,258,265,307,448,477,483,504,605,661,667,672,705,715,755,776,870,896,1079,3418],{"type":53,"tag":54,"props":55,"children":56},"element","h1",{"id":4},[57],{"type":58,"value":59},"text","Design QA",{"type":53,"tag":61,"props":62,"children":63},"p",{},[64,66,73,75,81],{"type":58,"value":65},"You are the visual-QA loop run after the replica theme is installed and content is imported. Your job is to verify that the replica matches the source site, classify every gap, apply fixes, and log what remains. You do not generate theme files from scratch — you drive ",{"type":53,"tag":67,"props":68,"children":70},"code",{"className":69},[],[71],{"type":58,"value":72},"editing-themes",{"type":58,"value":74}," and ",{"type":53,"tag":67,"props":76,"children":78},{"className":77},[],[79],{"type":58,"value":80},"editing-blocks",{"type":58,"value":82}," for all edits.",{"type":53,"tag":61,"props":84,"children":85},{},[86,88,94],{"type":58,"value":87},"Read ",{"type":53,"tag":67,"props":89,"children":91},{"className":90},[],[92],{"type":58,"value":93},"skills\u002Fdesign-qa\u002Freferences\u002Fvisual-qa.md",{"type":58,"value":95}," for the detailed visual-review procedure before starting.",{"type":53,"tag":97,"props":98,"children":100},"h2",{"id":99},"honesty-discipline-read-first-this-is-the-point-of-the-whole-skill",[101],{"type":58,"value":102},"Honesty discipline (read first — this is the point of the whole skill)",{"type":53,"tag":61,"props":104,"children":105},{},[106],{"type":53,"tag":107,"props":108,"children":109},"strong",{},[110],{"type":58,"value":111},"Never declare a match you have not measured. Default to skepticism, not optimism.",{"type":53,"tag":61,"props":113,"children":114},{},[115],{"type":58,"value":116},"The single most damaging failure mode in this loop is announcing \"it matches\" \u002F \"looks good\" \u002F \"close enough\" \u002F \"strong parity\" when it does not. That destroys trust and ships a broken replica. Treat every such phrase as a STOP sign:",{"type":53,"tag":118,"props":119,"children":120},"ul",{},[121,141,161,174,179],{"type":53,"tag":122,"props":123,"children":124},"li",{},[125,127,132,134,139],{"type":58,"value":126},"If you catch yourself about to write \"matches\", \"looks great\", \"pixel-perfect\", \"now matches\", or \"strong parity\" — ",{"type":53,"tag":107,"props":128,"children":129},{},[130],{"type":58,"value":131},"stop",{"type":58,"value":133},". Open the source and replica screenshots side by side, sample the actual pixels (colors, positions, sizes, gaps), and write the ",{"type":53,"tag":107,"props":135,"children":136},{},[137],{"type":58,"value":138},"itemized list of concrete differences first",{"type":58,"value":140},". Lead with what is WRONG, in specifics (alignment, font, image identity, band color, overlay, missing element), before anything positive.",{"type":53,"tag":122,"props":142,"children":143},{},[144,146,151,153,159],{"type":58,"value":145},"A verdict of \"match\" requires ",{"type":53,"tag":107,"props":147,"children":148},{},[149],{"type":58,"value":150},"measured evidence per section",{"type":58,"value":152}," (sampled source vs replica values), not vision impression. No evidence ⇒ it is ",{"type":53,"tag":67,"props":154,"children":156},{"className":155},[],[157],{"type":58,"value":158},"fail (unverified)",{"type":58,"value":160},", never a pass.",{"type":53,"tag":122,"props":162,"children":163},{},[164,166,172],{"type":58,"value":165},"When the operator says it doesn't match, they are the ground truth. Do not argue or re-assert — apologize, re-measure brutally, and list every gap you can find. The correct reflex is: ",{"type":53,"tag":167,"props":168,"children":169},"em",{},[170],{"type":58,"value":171},"\"You're right — it does not match. Here is every difference I can measure,\"",{"type":58,"value":173}," then fix and re-measure.",{"type":53,"tag":122,"props":175,"children":176},{},[177],{"type":58,"value":178},"\"Improved\" is not \"matches.\" Reaching genuine parity is the bar; partial progress is reported as partial, with the remaining gaps named explicitly.",{"type":53,"tag":122,"props":180,"children":181},{},[182],{"type":58,"value":183},"Do not send the operator a screenshot with a caption claiming parity unless the measured per-section table backs it. Show the gaps, not a victory lap.",{"type":53,"tag":61,"props":185,"children":186},{},[187],{"type":58,"value":188},"This discipline overrides any urge to wrap up. Under-claiming and continuing to work is always safer than over-claiming and stopping.",{"type":53,"tag":97,"props":190,"children":192},{"id":191},"inputs",[193],{"type":58,"value":194},"Inputs",{"type":53,"tag":61,"props":196,"children":197},{},[198],{"type":58,"value":199},"The orchestrator passes you:",{"type":53,"tag":118,"props":201,"children":202},{},[203,214,233],{"type":53,"tag":122,"props":204,"children":205},{},[206,212],{"type":53,"tag":67,"props":207,"children":209},{"className":208},[],[210],{"type":58,"value":211},"replicaBaseUrl",{"type":58,"value":213}," — the running replica WP install URL.",{"type":53,"tag":122,"props":215,"children":216},{},[217,223,225,231],{"type":53,"tag":67,"props":218,"children":220},{"className":219},[],[221],{"type":58,"value":222},"outputDir",{"type":58,"value":224}," — the resolved site output dir (e.g. ",{"type":53,"tag":67,"props":226,"children":228},{"className":227},[],[229],{"type":58,"value":230},"~\u002FStudio\u002F_liberations\u002Fexample.com",{"type":58,"value":232},"); contains source screenshots and manifest.",{"type":53,"tag":122,"props":234,"children":235},{},[236,242,244,250],{"type":53,"tag":67,"props":237,"children":239},{"className":238},[],[240],{"type":58,"value":241},"archetypeReps",{"type":58,"value":243}," — map of archetype → representative URL paths (one per archetype, from ",{"type":53,"tag":67,"props":245,"children":247},{"className":246},[],[248],{"type":58,"value":249},"liberate_replicate_inventory",{"type":58,"value":251},").",{"type":53,"tag":97,"props":253,"children":255},{"id":254},"workflow",[256],{"type":58,"value":257},"Workflow",{"type":53,"tag":259,"props":260,"children":262},"h3",{"id":261},"step-1-capture-replica-screenshots",[263],{"type":58,"value":264},"Step 1 — Capture replica screenshots",{"type":53,"tag":61,"props":266,"children":267},{},[268,270,276,278,283,285,290,292,297,299,305],{"type":58,"value":269},"Call ",{"type":53,"tag":67,"props":271,"children":273},{"className":272},[],[274],{"type":58,"value":275},"liberate_replicate_verify",{"type":58,"value":277}," with ",{"type":53,"tag":67,"props":279,"children":281},{"className":280},[],[282],{"type":58,"value":211},{"type":58,"value":284},", ",{"type":53,"tag":67,"props":286,"children":288},{"className":287},[],[289],{"type":58,"value":222},{"type":58,"value":291},", and the representative URL paths from ",{"type":53,"tag":67,"props":293,"children":295},{"className":294},[],[296],{"type":58,"value":241},{"type":58,"value":298},". Use the default viewports (desktop + mobile). The tool captures replica screenshots and pairs each with the matching source screenshot from ",{"type":53,"tag":67,"props":300,"children":302},{"className":301},[],[303],{"type":58,"value":304},"screenshots\u002Fmanifest.json",{"type":58,"value":306},".",{"type":53,"tag":308,"props":309,"children":314},"pre",{"className":310,"code":311,"language":312,"meta":313,"style":313},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","liberate_replicate_verify({\n  outputDir,\n  replicaBaseUrl,\n  urls: Object.values(archetypeReps),\n  outputSubdir: \"replica-screenshots\"\n})\n","ts","",[315],{"type":53,"tag":67,"props":316,"children":317},{"__ignoreMap":313},[318,340,354,367,405,434],{"type":53,"tag":319,"props":320,"children":322},"span",{"class":321,"line":32},"line",[323,328,334],{"type":53,"tag":319,"props":324,"children":326},{"style":325},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[327],{"type":58,"value":275},{"type":53,"tag":319,"props":329,"children":331},{"style":330},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[332],{"type":58,"value":333},"(",{"type":53,"tag":319,"props":335,"children":337},{"style":336},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[338],{"type":58,"value":339},"{\n",{"type":53,"tag":319,"props":341,"children":343},{"class":321,"line":342},2,[344,349],{"type":53,"tag":319,"props":345,"children":346},{"style":330},[347],{"type":58,"value":348},"  outputDir",{"type":53,"tag":319,"props":350,"children":351},{"style":336},[352],{"type":58,"value":353},",\n",{"type":53,"tag":319,"props":355,"children":357},{"class":321,"line":356},3,[358,363],{"type":53,"tag":319,"props":359,"children":360},{"style":330},[361],{"type":58,"value":362},"  replicaBaseUrl",{"type":53,"tag":319,"props":364,"children":365},{"style":336},[366],{"type":58,"value":353},{"type":53,"tag":319,"props":368,"children":370},{"class":321,"line":369},4,[371,377,382,387,391,396,401],{"type":53,"tag":319,"props":372,"children":374},{"style":373},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[375],{"type":58,"value":376},"  urls",{"type":53,"tag":319,"props":378,"children":379},{"style":336},[380],{"type":58,"value":381},":",{"type":53,"tag":319,"props":383,"children":384},{"style":330},[385],{"type":58,"value":386}," Object",{"type":53,"tag":319,"props":388,"children":389},{"style":336},[390],{"type":58,"value":306},{"type":53,"tag":319,"props":392,"children":393},{"style":325},[394],{"type":58,"value":395},"values",{"type":53,"tag":319,"props":397,"children":398},{"style":330},[399],{"type":58,"value":400},"(archetypeReps)",{"type":53,"tag":319,"props":402,"children":403},{"style":336},[404],{"type":58,"value":353},{"type":53,"tag":319,"props":406,"children":408},{"class":321,"line":407},5,[409,414,418,423,429],{"type":53,"tag":319,"props":410,"children":411},{"style":373},[412],{"type":58,"value":413},"  outputSubdir",{"type":53,"tag":319,"props":415,"children":416},{"style":336},[417],{"type":58,"value":381},{"type":53,"tag":319,"props":419,"children":420},{"style":336},[421],{"type":58,"value":422}," \"",{"type":53,"tag":319,"props":424,"children":426},{"style":425},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[427],{"type":58,"value":428},"replica-screenshots",{"type":53,"tag":319,"props":430,"children":431},{"style":336},[432],{"type":58,"value":433},"\"\n",{"type":53,"tag":319,"props":435,"children":437},{"class":321,"line":436},6,[438,443],{"type":53,"tag":319,"props":439,"children":440},{"style":336},[441],{"type":58,"value":442},"}",{"type":53,"tag":319,"props":444,"children":445},{"style":330},[446],{"type":58,"value":447},")\n",{"type":53,"tag":61,"props":449,"children":450},{},[451,453,459,461,467,469,475],{"type":58,"value":452},"Read the returned ",{"type":53,"tag":67,"props":454,"children":456},{"className":455},[],[457],{"type":58,"value":458},"pairs[]",{"type":58,"value":460}," manifest. You will use the paired PNGs for both the responsiveness gate and the qualitative review. Each pair also carries ",{"type":53,"tag":67,"props":462,"children":464},{"className":463},[],[465],{"type":58,"value":466},"sections[]",{"type":58,"value":468}," — per-section layout metrics read from the live replica DOM at desktop (",{"type":53,"tag":67,"props":470,"children":472},{"className":471},[],[473],{"type":58,"value":474},"{ columnCount, bg, hasMedia }",{"type":58,"value":476}," in document order) — which feed the parity gate (Step 3).",{"type":53,"tag":259,"props":478,"children":480},{"id":479},"step-2-responsiveness-gate-hard",[481],{"type":58,"value":482},"Step 2 — Responsiveness gate (HARD)",{"type":53,"tag":61,"props":484,"children":485},{},[486,488,494,496,502],{"type":58,"value":487},"For each captured mobile pair, evaluate responsiveness using the ",{"type":53,"tag":67,"props":489,"children":491},{"className":490},[],[492],{"type":58,"value":493},"evaluateResponsive",{"type":58,"value":495}," helper from ",{"type":53,"tag":67,"props":497,"children":499},{"className":498},[],[500],{"type":58,"value":501},"src\u002Flib\u002Freplicate\u002Fresponsive-check.ts",{"type":58,"value":503},". The gate checks three conditions at 390px viewport width:",{"type":53,"tag":118,"props":505,"children":506},{},[507,525,542],{"type":53,"tag":122,"props":508,"children":509},{},[510,515,517,523],{"type":53,"tag":107,"props":511,"children":512},{},[513],{"type":58,"value":514},"No horizontal overflow:",{"type":58,"value":516}," ",{"type":53,"tag":67,"props":518,"children":520},{"className":519},[],[521],{"type":58,"value":522},"scrollWidth \u003C= viewportWidth",{"type":58,"value":524}," — the page must not extend beyond the viewport.",{"type":53,"tag":122,"props":526,"children":527},{},[528,533,534,540],{"type":53,"tag":107,"props":529,"children":530},{},[531],{"type":58,"value":532},"Sections reflow:",{"type":58,"value":516},{"type":53,"tag":67,"props":535,"children":537},{"className":536},[],[538],{"type":58,"value":539},"sectionsReflowed >= sectionsTotal",{"type":58,"value":541}," — every section must have stacked vertically (single-column) at mobile width.",{"type":53,"tag":122,"props":543,"children":544},{},[545,550,551,557,559,565,567,572,574,579,581,587,589,595,597,603],{"type":53,"tag":107,"props":546,"children":547},{},[548],{"type":58,"value":549},"No content past the fold:",{"type":58,"value":516},{"type":53,"tag":67,"props":552,"children":554},{"className":553},[],[555],{"type":58,"value":556},"contentPastFoldCount == 0",{"type":58,"value":558}," — read from the mobile ",{"type":53,"tag":67,"props":560,"children":562},{"className":561},[],[563],{"type":58,"value":564},"ViewportCapture.contentPastFold",{"type":58,"value":566}," returned by ",{"type":53,"tag":67,"props":568,"children":570},{"className":569},[],[571],{"type":58,"value":275},{"type":58,"value":573},". This catches a ",{"type":53,"tag":107,"props":575,"children":576},{},[577],{"type":58,"value":578},"fixed-layout styled island",{"type":58,"value":580}," (R4b) that keeps ",{"type":53,"tag":67,"props":582,"children":584},{"className":583},[],[585],{"type":58,"value":586},"scrollWidth == 390",{"type":58,"value":588}," because ",{"type":53,"tag":67,"props":590,"children":592},{"className":591},[],[593],{"type":58,"value":594},"overflow-x:clip",{"type":58,"value":596}," hides it, while its content is amputated off-screen. ",{"type":53,"tag":67,"props":598,"children":600},{"className":599},[],[601],{"type":58,"value":602},"scrollWidth",{"type":58,"value":604}," alone cannot see this.",{"type":53,"tag":61,"props":606,"children":607},{},[608,610,615,617,622,624,629,631,636,638,644,646,652,653,659],{"type":58,"value":609},"A fail on ANY condition is a ",{"type":53,"tag":107,"props":611,"children":612},{},[613],{"type":58,"value":614},"hard block",{"type":58,"value":616}," — do not continue to qualitative review or acceptance. For overflow\u002Freflow, apply responsive CSS via ",{"type":53,"tag":67,"props":618,"children":620},{"className":619},[],[621],{"type":58,"value":72},{"type":58,"value":623},". For ",{"type":53,"tag":107,"props":625,"children":626},{},[627],{"type":58,"value":628},"content-past-fold",{"type":58,"value":630},", a CSS tweak will NOT fix a fixed-coordinate page-builder section (Wix etc.) — the styled island is a desktop-only floor and does not reflow; the section must be rebuilt via ",{"type":53,"tag":107,"props":632,"children":633},{},[634],{"type":58,"value":635},"R4a",{"type":58,"value":637}," (",{"type":53,"tag":67,"props":639,"children":641},{"className":640},[],[642],{"type":58,"value":643},"rebuild-section",{"type":58,"value":645}," → reflowing core blocks). Re-capture (return to Step 1) after the fix. If the gate still fails after the ladder is exhausted, stop, log to ",{"type":53,"tag":67,"props":647,"children":649},{"className":648},[],[650],{"type":58,"value":651},"theme\u002Fnotes.md",{"type":58,"value":74},{"type":53,"tag":67,"props":654,"children":656},{"className":655},[],[657],{"type":58,"value":658},"run-report.json",{"type":58,"value":660},", and escalate to the operator (Step 7) without accepting.",{"type":53,"tag":259,"props":662,"children":664},{"id":663},"step-3-qualitative-review",[665],{"type":58,"value":666},"Step 3 — Qualitative review",{"type":53,"tag":61,"props":668,"children":669},{},[670],{"type":58,"value":671},"Once the responsiveness gate passes, read each source\u002Freplica screenshot pair with vision — desktop and mobile — for every archetype representative. Produce per-URL observations:",{"type":53,"tag":118,"props":673,"children":674},{},[675,680,685,690,695,700],{"type":53,"tag":122,"props":676,"children":677},{},[678],{"type":58,"value":679},"Section order match",{"type":53,"tag":122,"props":681,"children":682},{},[683],{"type":58,"value":684},"Header\u002Ffooter structure and nav labels",{"type":53,"tag":122,"props":686,"children":687},{},[688],{"type":58,"value":689},"Hero content, image crops, CTA placement and color",{"type":53,"tag":122,"props":691,"children":692},{},[693],{"type":58,"value":694},"Column counts, spacing rhythm, alignment",{"type":53,"tag":122,"props":696,"children":697},{},[698],{"type":58,"value":699},"Typography (family, weight, size, color) fidelity",{"type":53,"tag":122,"props":701,"children":702},{},[703],{"type":58,"value":704},"Mobile stacking behavior",{"type":53,"tag":61,"props":706,"children":707},{},[708,713],{"type":53,"tag":107,"props":709,"children":710},{},[711],{"type":58,"value":712},"Measure, don't trust vision alone — sample the source.",{"type":58,"value":714}," Before asserting any band \"matches,\" SAMPLE the actual pixels of both source and replica and compare. Eyeballing repeatedly mis-judged colors, sizes, and gaps in practice; the source screenshot is ground truth. For each section band (use the section Y-bands from the spec, or scan the full-page screenshot top→bottom):",{"type":53,"tag":118,"props":716,"children":717},{},[718,735,745],{"type":53,"tag":122,"props":719,"children":720},{},[721,726,728,733],{"type":53,"tag":107,"props":722,"children":723},{},[724],{"type":58,"value":725},"Section background color",{"type":58,"value":727}," — sample source vs replica at the band center and at left\u002Fcenter\u002Fright thirds. A hue\u002Flightness delta beyond a small tolerance is a ",{"type":53,"tag":107,"props":729,"children":730},{},[731],{"type":58,"value":732},"real gap",{"type":58,"value":734}," (e.g. a pale-blue source band rendered grey), not \"close enough.\"",{"type":53,"tag":122,"props":736,"children":737},{},[738,743],{"type":53,"tag":107,"props":739,"children":740},{},[741],{"type":58,"value":742},"Inter-section gaps",{"type":58,"value":744}," — scan a vertical strip; a white band between two colored sections in the replica that the source does not have is a gap-margin regression (sections must butt edge-to-edge).",{"type":53,"tag":122,"props":746,"children":747},{},[748,753],{"type":53,"tag":107,"props":749,"children":750},{},[751],{"type":58,"value":752},"Heading vs body sizes",{"type":58,"value":754}," — sample the rendered text height of a heading vs a paragraph; if the replica heading is markedly smaller than the source's, suspect fluid-typography shrink or a too-small size.",{"type":53,"tag":61,"props":756,"children":757},{},[758,760,766,768,774],{"type":58,"value":759},"A no-PIL environment can sample PNGs with the project's ",{"type":53,"tag":67,"props":761,"children":763},{"className":762},[],[764],{"type":58,"value":765},"pngjs",{"type":58,"value":767}," dependency (load → index ",{"type":53,"tag":67,"props":769,"children":771},{"className":770},[],[772],{"type":58,"value":773},"(W*y+x)\u003C\u003C2",{"type":58,"value":775},"). Report the sampled deltas — do not write \"matches\" without them.",{"type":53,"tag":61,"props":777,"children":778},{},[779,781,787,789,795,797,802,804,809,811,817,819,825,826,832,834,839,841,846,848,854,856,861,863,868],{"type":58,"value":780},"The per-section pixel-diff from ",{"type":53,"tag":67,"props":782,"children":784},{"className":783},[],[785],{"type":58,"value":786},"liberate_compare",{"type":58,"value":788}," (or ",{"type":53,"tag":67,"props":790,"children":792},{"className":791},[],[793],{"type":58,"value":794},"diff-pngs",{"type":58,"value":796},") is a ",{"type":53,"tag":107,"props":798,"children":799},{},[800],{"type":58,"value":801},"forces-inspection signal",{"type":58,"value":803},": a section whose desktop delta is high MUST be inspected. It is NOT itself the gate value (raw delta is noisy under font substitution \u002F reflow). NOTE: ",{"type":53,"tag":67,"props":805,"children":807},{"className":806},[],[808],{"type":58,"value":786},{"type":58,"value":810}," needs the standard layout in BOTH dirs (",{"type":53,"tag":67,"props":812,"children":814},{"className":813},[],[815],{"type":58,"value":816},"manifest.json",{"type":58,"value":818}," + ",{"type":53,"tag":67,"props":820,"children":822},{"className":821},[],[823],{"type":58,"value":824},"desktop\u002F\u003Cslug>.png",{"type":58,"value":818},{"type":53,"tag":67,"props":827,"children":829},{"className":828},[],[830],{"type":58,"value":831},"mobile\u002F\u003Cslug>.png",{"type":58,"value":833},"). ",{"type":53,"tag":67,"props":835,"children":837},{"className":836},[],[838],{"type":58,"value":275},{"type":58,"value":840}," writes the replica PNGs in that shape but its ",{"type":53,"tag":67,"props":842,"children":844},{"className":843},[],[845],{"type":58,"value":458},{"type":58,"value":847}," come back in the tool result; if ",{"type":53,"tag":67,"props":849,"children":851},{"className":850},[],[852],{"type":58,"value":853},"compare",{"type":58,"value":855}," errors with \"manifest missing,\" the replica subdir lacks a ",{"type":53,"tag":67,"props":857,"children":859},{"className":858},[],[860],{"type":58,"value":816},{"type":58,"value":862}," — copy\u002Fsymlink the source ",{"type":53,"tag":67,"props":864,"children":866},{"className":865},[],[867],{"type":58,"value":816},{"type":58,"value":869}," into the replica dir, then re-run (don't silently fall back to vision-only).",{"type":53,"tag":61,"props":871,"children":872},{},[873,886,888,894],{"type":53,"tag":107,"props":874,"children":875},{},[876,878,884],{"type":58,"value":877},"Build the measured ",{"type":53,"tag":67,"props":879,"children":881},{"className":880},[],[882],{"type":58,"value":883},"SectionParity[]",{"type":58,"value":885}," per content page — this is the gate, not your prose.",{"type":58,"value":887}," The metrics are read for you; you assemble and score them (",{"type":53,"tag":67,"props":889,"children":891},{"className":890},[],[892],{"type":58,"value":893},"src\u002Flib\u002Freplicate\u002Fsection-parity.ts",{"type":58,"value":895},"):",{"type":53,"tag":897,"props":898,"children":899},"ol",{},[900,933,1039],{"type":53,"tag":122,"props":901,"children":902},{},[903,905,911,913,918,920,926,927,932],{"type":58,"value":904},"For each content page, pair the verify result's ",{"type":53,"tag":67,"props":906,"children":908},{"className":907},[],[909],{"type":58,"value":910},"pairs[].sections[i]",{"type":58,"value":912}," (live replica DOM: ",{"type":53,"tag":67,"props":914,"children":916},{"className":915},[],[917],{"type":58,"value":474},{"type":58,"value":919},") to the source spec section ",{"type":53,"tag":67,"props":921,"children":923},{"className":922},[],[924],{"type":58,"value":925},"specs[...][i]",{"type":58,"value":516},{"type":53,"tag":107,"props":928,"children":929},{},[930],{"type":58,"value":931},"by index",{"type":58,"value":306},{"type":53,"tag":122,"props":934,"children":935},{},[936,938,944,946,952,953,959,960,966,967,973,974,980,982],{"type":58,"value":937},"Build a ",{"type":53,"tag":67,"props":939,"children":941},{"className":940},[],[942],{"type":58,"value":943},"SourceSectionDescriptor",{"type":58,"value":945}," from each spec section: ",{"type":53,"tag":67,"props":947,"children":949},{"className":948},[],[950],{"type":58,"value":951},"columnCount = layout.columnCount",{"type":58,"value":284},{"type":53,"tag":67,"props":954,"children":956},{"className":955},[],[957],{"type":58,"value":958},"backgroundColor",{"type":58,"value":284},{"type":53,"tag":67,"props":961,"children":963},{"className":962},[],[964],{"type":58,"value":965},"hasMedia = images.length > 0",{"type":58,"value":284},{"type":53,"tag":67,"props":968,"children":970},{"className":969},[],[971],{"type":58,"value":972},"isCssLayout = columnCount >= 2 || cells >= 2",{"type":58,"value":284},{"type":53,"tag":67,"props":975,"children":977},{"className":976},[],[978],{"type":58,"value":979},"isHtmlFallback = provenanceFlags has \\",{"type":58,"value":981},"html-fallback#",{"type":53,"tag":983,"props":984,"children":985},"i",{},[986,988,994,996,1002,1004],{"type":58,"value":987},"`",{"type":53,"tag":67,"props":989,"children":991},{"className":990},[],[992],{"type":58,"value":993},". **Note the ",{"type":58,"value":995},"#",{"type":53,"tag":67,"props":997,"children":999},{"className":998},[],[1000],{"type":58,"value":1001},":** a ",{"type":58,"value":1003},"html-fallback-styled#",{"type":53,"tag":983,"props":1005,"children":1006},{},[1007,1013,1015,1021,1023,1029,1031,1037],{"type":53,"tag":67,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":58,"value":1012},"flag (the R4b styled-island floor) is NOT an unstyled fallback —",{"type":58,"value":1014},"'html-fallback-styled#0'",{"type":53,"tag":67,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":58,"value":1020},"does not start with",{"type":58,"value":1022},"'html-fallback#'",{"type":53,"tag":67,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":58,"value":1028},", so it correctly does NOT set ",{"type":58,"value":1030},"isHtmlFallback",{"type":53,"tag":67,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":58,"value":1036},"\u002F",{"type":58,"value":1038},"fallbackUnstyled`. Only the bare unstyled island trips the signal.",{"type":53,"tag":983,"props":1040,"children":1041},{},[1042],{"type":53,"tag":983,"props":1043,"children":1044},{},[1045],{"type":53,"tag":122,"props":1046,"children":1047},{},[1048,1054,1056,1062,1064,1070,1072,1078],{"type":53,"tag":67,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":58,"value":1053},"toSectionParityMetrics(descriptor, replicaSection ?? null)",{"type":58,"value":1055}," → ",{"type":53,"tag":67,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":58,"value":1061},"evaluateSectionParity(...)",{"type":58,"value":1063}," → the five signals. A missing replica section (",{"type":53,"tag":67,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":58,"value":1069},"null",{"type":58,"value":1071},") reads as ",{"type":53,"tag":67,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":58,"value":1077},"sectionPresent: false",{"type":58,"value":306},{"type":53,"tag":983,"props":1080,"children":1081},{},[1082],{"type":53,"tag":983,"props":1083,"children":1084},{},[1085,1175,1245,1253,1335,1341,1353,1392,1404,1410,1428,1538,1591,1610,1616,1655,1851,1871,1923,1935,1941,2002,2058,2091,2097,2102,2130,3244,3304,3310],{"type":53,"tag":61,"props":1086,"children":1087},{},[1088,1090,1096,1098,1104,1106,1112,1114,1120,1121,1127,1129,1135,1137,1143,1145,1151,1152,1158,1160,1166,1168,1173],{"type":58,"value":1089},"The signals: ",{"type":53,"tag":67,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":58,"value":1095},"sectionPresent",{"type":58,"value":1097}," (not dropped\u002Fmerged), ",{"type":53,"tag":67,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":58,"value":1103},"bgDeltaE",{"type":58,"value":1105}," (ΔE2000 of ",{"type":53,"tag":67,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":58,"value":1111},"spec.backgroundColor",{"type":58,"value":1113}," vs rendered ",{"type":53,"tag":67,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":58,"value":1119},"bg",{"type":58,"value":284},{"type":53,"tag":67,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":58,"value":1126},"> BG_DELTA_E_FLOOR",{"type":58,"value":1128}," = 10 diverges), ",{"type":53,"tag":67,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":58,"value":1134},"columnCountMatch",{"type":58,"value":1136}," (replica ",{"type":53,"tag":67,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":58,"value":1142},"columnCount >= source",{"type":58,"value":1144},"), ",{"type":53,"tag":67,"props":1146,"children":1148},{"className":1147},[],[1149],{"type":58,"value":1150},"mediaPresent",{"type":58,"value":284},{"type":53,"tag":67,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":58,"value":1157},"fallbackUnstyled",{"type":58,"value":1159}," (island on a CSS-layout section). ",{"type":53,"tag":67,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":58,"value":1165},"evidence",{"type":58,"value":1167}," carries the measured source\u002Freplica values backing the score — ",{"type":53,"tag":107,"props":1169,"children":1170},{},[1171],{"type":58,"value":1172},"no record ships without it",{"type":58,"value":1174}," (prove-it-works: no evidence ≠ matches).",{"type":53,"tag":61,"props":1176,"children":1177},{},[1178,1180,1186,1188,1193,1195,1200,1202,1208,1210,1216,1218,1223,1224,1230,1232,1237,1239,1244],{"type":58,"value":1179},"For each ",{"type":53,"tag":67,"props":1181,"children":1183},{"className":1182},[],[1184],{"type":58,"value":1185},"divergent",{"type":58,"value":1187}," section, state concretely what a ",{"type":53,"tag":107,"props":1189,"children":1190},{},[1191],{"type":58,"value":1192},"10",{"type":58,"value":1194}," (matches the source) looks like, then ",{"type":53,"tag":107,"props":1196,"children":1197},{},[1198],{"type":58,"value":1199},"gap-to-target",{"type":58,"value":1201},": climb the escalation ladder (Step 6) to close it and re-score, showing before→after. ",{"type":53,"tag":67,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":58,"value":1207},"deriveSectionParityStatus(signals, acceptance)",{"type":58,"value":1209}," decides ",{"type":53,"tag":67,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":58,"value":1215},"match",{"type":58,"value":1217}," \u002F ",{"type":53,"tag":67,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":58,"value":1185},{"type":58,"value":1217},{"type":53,"tag":67,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":58,"value":1229},"accepted",{"type":58,"value":1231}," — and the run-report verdict re-derives from these records, so you cannot talk a ",{"type":53,"tag":67,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":58,"value":1185},{"type":58,"value":1238}," section into a pass. Pixel sampling is now only a fallback when a section has no spec-captured ",{"type":53,"tag":67,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":58,"value":958},{"type":58,"value":306},{"type":53,"tag":61,"props":1246,"children":1247},{},[1248],{"type":53,"tag":107,"props":1249,"children":1250},{},[1251],{"type":58,"value":1252},"Vision review must catch what the upstream gates structurally cannot:",{"type":53,"tag":118,"props":1254,"children":1255},{},[1256,1281],{"type":53,"tag":122,"props":1257,"children":1258},{},[1259,1264,1266,1272,1274,1279],{"type":53,"tag":107,"props":1260,"children":1261},{},[1262],{"type":58,"value":1263},"Semantic misclassification.",{"type":58,"value":1265}," The reconstruction's coverage + provenance gates check that captured text is PRESENT and not invented — they do NOT check it's rendered with the right semantics. A paragraph mis-rendered as a giant ",{"type":53,"tag":67,"props":1267,"children":1269},{"className":1268},[],[1270],{"type":58,"value":1271},"\u003Ch2>",{"type":58,"value":1273}," (body-as-heading), or an eyebrow duplicated as a trailing line, passes every gate. Only vision catches it → classify as ",{"type":53,"tag":107,"props":1275,"children":1276},{},[1277],{"type":58,"value":1278},"A",{"type":58,"value":1280}," (spec\u002Fextractor wrong) and flag the extractor heading\u002Fbody classification.",{"type":53,"tag":122,"props":1282,"children":1283},{},[1284,1295,1297,1303,1305,1310,1312,1318,1319,1325,1327,1333],{"type":53,"tag":107,"props":1285,"children":1286},{},[1287,1293],{"type":53,"tag":67,"props":1288,"children":1290},{"className":1289},[],[1291],{"type":58,"value":1292},"core\u002Fhtml",{"type":58,"value":1294}," fallback islands.",{"type":58,"value":1296}," Sections the renderer fell back to (",{"type":53,"tag":67,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":58,"value":1302},"run-report.htmlFallbackSections > 0",{"type":58,"value":1304},") carry verbatim source HTML but NOT the source CSS. Text-heavy sections render fine; a CSS-styled section (cards\u002Fgrid\u002Fcolumns) that fell back renders UNSTYLED — looks broken. Vision-check every island: an unstyled-island regression is a ",{"type":53,"tag":107,"props":1306,"children":1307},{},[1308],{"type":58,"value":1309},"fidelity gap",{"type":58,"value":1311},", not a pass. (Root tuning lives in ",{"type":53,"tag":67,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":58,"value":1317},"section-coverage.ts",{"type":58,"value":516},{"type":53,"tag":67,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":58,"value":1324},"TEXT_FLOOR",{"type":58,"value":1326}," — see ",{"type":53,"tag":67,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":58,"value":1332},"replicate\u002FSKILL.md",{"type":58,"value":1334},".)",{"type":53,"tag":259,"props":1336,"children":1338},{"id":1337},"step-4-accessibility-checks-warn-not-block",[1339],{"type":58,"value":1340},"Step 4 — Accessibility checks (warn, not block)",{"type":53,"tag":61,"props":1342,"children":1343},{},[1344,1346,1351],{"type":58,"value":1345},"For each representative page, flag the following in the run-report. Do ",{"type":53,"tag":107,"props":1347,"children":1348},{},[1349],{"type":58,"value":1350},"not",{"type":58,"value":1352}," hard-fail or auto-fix — faithfulness to the source wins.",{"type":53,"tag":118,"props":1354,"children":1355},{},[1356,1374],{"type":53,"tag":122,"props":1357,"children":1358},{},[1359,1364,1366,1372],{"type":53,"tag":107,"props":1360,"children":1361},{},[1362],{"type":58,"value":1363},"Contrast:",{"type":58,"value":1365}," text\u002Fbackground pairs below WCAG AA (4.5:1). Check the palette entries from ",{"type":53,"tag":67,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":58,"value":1371},"design-foundation.json",{"type":58,"value":1373}," against the source rendering. Log each failing pair as a warning.",{"type":53,"tag":122,"props":1375,"children":1376},{},[1377,1382,1384,1390],{"type":53,"tag":107,"props":1378,"children":1379},{},[1380],{"type":58,"value":1381},"Alt text:",{"type":58,"value":1383}," images with missing or empty ",{"type":53,"tag":67,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":58,"value":1389},"alt",{"type":58,"value":1391}," attributes. Carry the source's alt verbatim; flag any that are absent for human fill — never generate alt copy.",{"type":53,"tag":61,"props":1393,"children":1394},{},[1395,1397,1403],{"type":58,"value":1396},"Add all flags to the run-report under ",{"type":53,"tag":67,"props":1398,"children":1400},{"className":1399},[],[1401],{"type":58,"value":1402},"a11yWarnings[]",{"type":58,"value":306},{"type":53,"tag":259,"props":1405,"children":1407},{"id":1406},"step-5-classify-discrepancies",[1408],{"type":58,"value":1409},"Step 5 — Classify discrepancies",{"type":53,"tag":61,"props":1411,"children":1412},{},[1413,1414,1419,1421,1426],{"type":58,"value":1179},{"type":53,"tag":67,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":58,"value":1185},{"type":58,"value":1420}," section from Step 3, classify — class drives which ",{"type":53,"tag":107,"props":1422,"children":1423},{},[1424],{"type":58,"value":1425},"escalation rung",{"type":58,"value":1427}," (Step 6) you climb, NOT whether you ship:",{"type":53,"tag":1429,"props":1430,"children":1431},"table",{},[1432,1456],{"type":53,"tag":1433,"props":1434,"children":1435},"thead",{},[1436],{"type":53,"tag":1437,"props":1438,"children":1439},"tr",{},[1440,1446,1451],{"type":53,"tag":1441,"props":1442,"children":1443},"th",{},[1444],{"type":58,"value":1445},"Class",{"type":53,"tag":1441,"props":1447,"children":1448},{},[1449],{"type":58,"value":1450},"Meaning",{"type":53,"tag":1441,"props":1452,"children":1453},{},[1454],{"type":58,"value":1455},"Action",{"type":53,"tag":1457,"props":1458,"children":1459},"tbody",{},[1460,1481,1502],{"type":53,"tag":1437,"props":1461,"children":1462},{},[1463,1471,1476],{"type":53,"tag":1464,"props":1465,"children":1466},"td",{},[1467],{"type":53,"tag":107,"props":1468,"children":1469},{},[1470],{"type":58,"value":1278},{"type":53,"tag":1464,"props":1472,"children":1473},{},[1474],{"type":58,"value":1475},"Spec wrong — the section spec or captured content is incorrect",{"type":53,"tag":1464,"props":1477,"children":1478},{},[1479],{"type":58,"value":1480},"Re-extract that section spec, then rebuild (rung R3)",{"type":53,"tag":1437,"props":1482,"children":1483},{},[1484,1492,1497],{"type":53,"tag":1464,"props":1485,"children":1486},{},[1487],{"type":53,"tag":107,"props":1488,"children":1489},{},[1490],{"type":58,"value":1491},"B",{"type":53,"tag":1464,"props":1493,"children":1494},{},[1495],{"type":58,"value":1496},"Template dropped info — the pattern\u002Ftemplate didn't carry through content that was in the spec",{"type":53,"tag":1464,"props":1498,"children":1499},{},[1500],{"type":58,"value":1501},"Fix section-mapping or rebuild the affected block markup (rungs R1–R2)",{"type":53,"tag":1437,"props":1503,"children":1504},{},[1505,1513,1518],{"type":53,"tag":1464,"props":1506,"children":1507},{},[1508],{"type":53,"tag":107,"props":1509,"children":1510},{},[1511],{"type":58,"value":1512},"C",{"type":53,"tag":1464,"props":1514,"children":1515},{},[1516],{"type":58,"value":1517},"WP renders differently — a genuine core-block\u002FWP rendering constraint, not a theme authoring error",{"type":53,"tag":1464,"props":1519,"children":1520},{},[1521,1523,1528,1530,1536],{"type":58,"value":1522},"Only Class C may be ",{"type":53,"tag":67,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":58,"value":1229},{"type":58,"value":1529}," by the agent, and ONLY with sampled-pixel ",{"type":53,"tag":67,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":58,"value":1535},"proof",{"type":58,"value":1537}," attached",{"type":53,"tag":61,"props":1539,"children":1540},{},[1541,1546,1548,1553,1555,1561,1563,1569,1571,1576,1578,1582,1584,1589],{"type":53,"tag":107,"props":1542,"children":1543},{},[1544],{"type":58,"value":1545},"Class C is narrow and never a flatten.",{"type":58,"value":1547}," Flattening (3 cards → 1 column), wrong background color, dropped grid\u002Fcolumns, and dropped media are ",{"type":53,"tag":107,"props":1549,"children":1550},{},[1551],{"type":58,"value":1552},"fixable, never Class C",{"type":58,"value":1554}," — ",{"type":53,"tag":67,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":58,"value":1560},"deriveSectionParityStatus",{"type":58,"value":1562}," rejects a ",{"type":53,"tag":67,"props":1564,"children":1566},{"className":1565},[],[1567],{"type":58,"value":1568},"class-c",{"type":58,"value":1570}," acceptance for them outright. A true Class-C constraint does not trip the robust signals at all (it shows as ",{"type":53,"tag":67,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":58,"value":1215},{"type":58,"value":1577}," with a high pixel-delta you annotate). Accepting any ",{"type":53,"tag":167,"props":1579,"children":1580},{},[1581],{"type":58,"value":1185},{"type":58,"value":1583}," section is therefore the ",{"type":53,"tag":107,"props":1585,"children":1586},{},[1587],{"type":58,"value":1588},"operator's",{"type":58,"value":1590}," call (Step 7), not the agent's.",{"type":53,"tag":61,"props":1592,"children":1593},{},[1594,1596,1601,1603,1609],{"type":58,"value":1595},"Produce the ",{"type":53,"tag":67,"props":1597,"children":1599},{"className":1598},[],[1600],{"type":58,"value":883},{"type":58,"value":1602}," records (Step 3) plus, per section, ",{"type":53,"tag":67,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":58,"value":1608},"{ urlPath, band, class, description, rung }",{"type":58,"value":306},{"type":53,"tag":259,"props":1611,"children":1613},{"id":1612},"step-6-close-the-gap-escalation-ladder",[1614],{"type":58,"value":1615},"Step 6 — Close the gap (escalation ladder)",{"type":53,"tag":61,"props":1617,"children":1618},{},[1619,1621,1626,1628,1633,1635,1640,1642,1647,1649,1654],{"type":58,"value":1620},"Every ",{"type":53,"tag":67,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":58,"value":1185},{"type":58,"value":1627}," section must be driven toward ",{"type":53,"tag":67,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":58,"value":1215},{"type":58,"value":1634},". The ladder is climbed ",{"type":53,"tag":107,"props":1636,"children":1637},{},[1638],{"type":58,"value":1639},"per section",{"type":58,"value":1641}," — each section gets its own climb, so a page with several bespoke sections is not capped at one section's worth of fixes. ",{"type":53,"tag":107,"props":1643,"children":1644},{},[1645],{"type":58,"value":1646},"Each iteration climbs to a STRONGER rung — never re-run the same rung.",{"type":58,"value":1648}," This strictly-climbing rule is what makes the 5-rung ceiling safe: it cannot degrade into five attempts at the same tweak. Climb until the section re-scores ",{"type":53,"tag":67,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":58,"value":1215},{"type":58,"value":381},{"type":53,"tag":118,"props":1656,"children":1657},{},[1658,1674,1690,1700,1791],{"type":53,"tag":122,"props":1659,"children":1660},{},[1661,1666,1667,1672],{"type":53,"tag":107,"props":1662,"children":1663},{},[1664],{"type":58,"value":1665},"R1 — theme\u002FCSS fix",{"type":58,"value":637},{"type":53,"tag":67,"props":1668,"children":1670},{"className":1669},[],[1671],{"type":58,"value":72},{"type":58,"value":1673},"): band background color, spacing, inter-section gap.",{"type":53,"tag":122,"props":1675,"children":1676},{},[1677,1682,1683,1688],{"type":53,"tag":107,"props":1678,"children":1679},{},[1680],{"type":58,"value":1681},"R2 — rebuild block markup",{"type":58,"value":637},{"type":53,"tag":67,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":58,"value":80},{"type":58,"value":1689},"): restore the columns\u002Fgrid the structured render flattened, from the source spec.",{"type":53,"tag":122,"props":1691,"children":1692},{},[1693,1698],{"type":53,"tag":107,"props":1694,"children":1695},{},[1696],{"type":58,"value":1697},"R3 — re-extract the spec",{"type":58,"value":1699}," (Class A): if the section spec itself is wrong, re-extract it, then rebuild via R2.",{"type":53,"tag":122,"props":1701,"children":1702},{},[1703,1708,1709,1714,1716,1721,1723,1736,1738,1743,1745,1751,1753,1759,1761,1767,1769,1774,1776,1782,1784,1789],{"type":53,"tag":107,"props":1704,"children":1705},{},[1706],{"type":58,"value":1707},"R4a — AI canonical-block rebuild",{"type":58,"value":637},{"type":53,"tag":67,"props":1710,"children":1712},{"className":1711},[],[1713],{"type":58,"value":643},{"type":58,"value":1715},"): when R1–R3 can't reach ",{"type":53,"tag":67,"props":1717,"children":1719},{"className":1718},[],[1720],{"type":58,"value":1215},{"type":58,"value":1722},", rebuild the section into native core blocks from its ",{"type":53,"tag":107,"props":1724,"children":1725},{},[1726,1728,1734],{"type":58,"value":1727},"source HTML + ",{"type":53,"tag":67,"props":1729,"children":1731},{"className":1730},[],[1732],{"type":58,"value":1733},"styledHtml",{"type":58,"value":1735}," + section screenshots + spec + design tokens",{"type":58,"value":1737}," (richer inputs than R2's spec-only). Assemble that input bundle, dispatch the subagent, then run the ",{"type":53,"tag":107,"props":1739,"children":1740},{},[1741],{"type":58,"value":1742},"four acceptance gates",{"type":58,"value":1744},": ① block-markup oracle (",{"type":53,"tag":67,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":58,"value":1750},"liberate_validate_artifacts",{"type":58,"value":1752},"), ② canonicalization round-trip survives ",{"type":53,"tag":67,"props":1754,"children":1756},{"className":1755},[],[1757],{"type":58,"value":1758},"@wordpress\u002Fblocks",{"type":58,"value":1760},", ③ re-measured ",{"type":53,"tag":67,"props":1762,"children":1764},{"className":1763},[],[1765],{"type":58,"value":1766},"section-parity",{"type":58,"value":1768}," = ",{"type":53,"tag":67,"props":1770,"children":1772},{"className":1771},[],[1773],{"type":58,"value":1215},{"type":58,"value":1775},", ④ ",{"type":53,"tag":67,"props":1777,"children":1779},{"className":1778},[],[1780],{"type":58,"value":1781},"measureSectionCoverage",{"type":58,"value":1783}," = no loss. Accept the rebuild ",{"type":53,"tag":107,"props":1785,"children":1786},{},[1787],{"type":58,"value":1788},"only if all four pass",{"type":58,"value":1790}," — the agent cannot self-accept; acceptance is the measured re-score. If any gate fails, fall to R4b.",{"type":53,"tag":122,"props":1792,"children":1793},{},[1794,1799,1801,1806,1808,1813,1814,1819,1821,1827,1829,1835,1837,1842,1844,1849],{"type":53,"tag":107,"props":1795,"children":1796},{},[1797],{"type":58,"value":1798},"R4b — deterministic styled-island floor",{"type":58,"value":1800}," (no AI): the section's ",{"type":53,"tag":67,"props":1802,"children":1804},{"className":1803},[],[1805],{"type":58,"value":1733},{"type":58,"value":1807}," snapshot already ships through the reconstruction as a ",{"type":53,"tag":107,"props":1809,"children":1810},{},[1811],{"type":58,"value":1812},"styled",{"type":58,"value":516},{"type":53,"tag":67,"props":1815,"children":1817},{"className":1816},[],[1818],{"type":58,"value":1292},{"type":58,"value":1820}," island (provenance ",{"type":53,"tag":67,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":58,"value":1826},"html-fallback-styled#\u003Ci>",{"type":58,"value":1828},"), which renders pixel-faithful and clears the ",{"type":53,"tag":67,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":58,"value":1834},"unstyled-island",{"type":58,"value":1836}," signal. Faithful but not block-editable — the floor for genuinely bespoke sections R4a can't map to core blocks. R4b reaching ",{"type":53,"tag":67,"props":1838,"children":1840},{"className":1839},[],[1841],{"type":58,"value":1215},{"type":58,"value":1843}," is a ",{"type":53,"tag":107,"props":1845,"children":1846},{},[1847],{"type":58,"value":1848},"valid pass",{"type":58,"value":1850},"; R4a (editable) is always tried first.",{"type":53,"tag":61,"props":1852,"children":1853},{},[1854,1856,1861,1863,1869],{"type":58,"value":1855},"Each R4a dispatch is a ",{"type":53,"tag":107,"props":1857,"children":1858},{},[1859],{"type":58,"value":1860},"subagent",{"type":58,"value":1862},", counted toward the run's subagent ceiling in ",{"type":53,"tag":67,"props":1864,"children":1866},{"className":1865},[],[1867],{"type":58,"value":1868},"budget-guard",{"type":58,"value":1870}," — that is the per-run cost bound on AI spend.",{"type":53,"tag":61,"props":1872,"children":1873},{},[1874,1879,1880,1885,1887,1892,1894,1900,1902,1908,1910,1921],{"type":53,"tag":67,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":58,"value":72},{"type":58,"value":284},{"type":53,"tag":67,"props":1881,"children":1883},{"className":1882},[],[1884],{"type":58,"value":80},{"type":58,"value":1886},", and ",{"type":53,"tag":67,"props":1888,"children":1890},{"className":1889},[],[1891],{"type":58,"value":643},{"type":58,"value":1893}," are ",{"type":53,"tag":67,"props":1895,"children":1897},{"className":1896},[],[1898],{"type":58,"value":1899},"disable-model-invocation: true",{"type":58,"value":1901}," — you cannot ",{"type":53,"tag":67,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":58,"value":1907},"Skill",{"type":58,"value":1909},"-launch them from this inline-run loop. Apply each rung by ",{"type":53,"tag":107,"props":1911,"children":1912},{},[1913,1915],{"type":58,"value":1914},"dispatching a subagent whose prompt points it at the skill's ",{"type":53,"tag":67,"props":1916,"children":1918},{"className":1917},[],[1919],{"type":58,"value":1920},"SKILL.md",{"type":58,"value":1922}," (the subagent reads the file and applies the fix), matching the subagent-dispatch convention; do not stall on a refused Skill call.",{"type":53,"tag":61,"props":1924,"children":1925},{},[1926,1928,1933],{"type":58,"value":1927},"After applying a rung, reinstall the updated theme files via the orchestrator's install path and return to Step 1 to re-capture and re-score. \"Known gap\" \u002F \"where it falls short\" is an ",{"type":53,"tag":107,"props":1929,"children":1930},{},[1931],{"type":58,"value":1932},"escalation trigger, not a conclusion",{"type":58,"value":1934}," — never write it as the terminal state of a shipped run.",{"type":53,"tag":259,"props":1936,"children":1938},{"id":1937},"step-7-circuit-breaker-checkpoint-escalate-dont-surrender",[1939],{"type":58,"value":1940},"Step 7 — Circuit-breaker checkpoint (escalate, don't surrender)",{"type":53,"tag":61,"props":1942,"children":1943},{},[1944,1956,1958,1963,1965,1971,1973,1979,1981,1986,1988,1993,1995,2001],{"type":53,"tag":107,"props":1945,"children":1946},{},[1947,1949,1954],{"type":58,"value":1948},"The checkpoint is \"ladder exhausted per section\" (all 5 rungs — R1, R2, R3, R4a, R4b — tried without ",{"type":53,"tag":67,"props":1950,"children":1952},{"className":1951},[],[1953],{"type":58,"value":1215},{"type":58,"value":1955},") OR the per-run cost ceiling, whichever comes first — not a per-page iteration tally.",{"type":58,"value":1957}," The 5-rung ceiling is derived from the rung count, so it stays in sync if rungs change; the strictly-climbing rule (Step 6) prevents thrashing within it. Total AI spend is bounded by ",{"type":53,"tag":67,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":58,"value":1868},{"type":58,"value":1964},"'s subagent ceiling (",{"type":53,"tag":67,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":58,"value":1970},"checkBudget",{"type":58,"value":1972},"), which ",{"type":53,"tag":67,"props":1974,"children":1976},{"className":1975},[],[1977],{"type":58,"value":1978},"pause",{"type":58,"value":1980},"s the run when reached. When a section exhausts the ladder, or the budget guard signals ",{"type":53,"tag":67,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":58,"value":1978},{"type":58,"value":1987},", you do NOT log-and-ship. Stop and ask the ",{"type":53,"tag":107,"props":1989,"children":1990},{},[1991],{"type":58,"value":1992},"operator",{"type":58,"value":1994},", surfacing what you tried per rung and the current ",{"type":53,"tag":67,"props":1996,"children":1998},{"className":1997},[],[1999],{"type":58,"value":2000},"SectionParity",{"type":58,"value":381},{"type":53,"tag":118,"props":2003,"children":2004},{},[2005,2015,2040],{"type":53,"tag":122,"props":2006,"children":2007},{},[2008,2013],{"type":53,"tag":107,"props":2009,"children":2010},{},[2011],{"type":58,"value":2012},"Raise the budget",{"type":58,"value":2014}," — keep climbing \u002F accept more R4a subagent spend.",{"type":53,"tag":122,"props":2016,"children":2017},{},[2018,2023,2025,2031,2033,2038],{"type":53,"tag":107,"props":2019,"children":2020},{},[2021],{"type":58,"value":2022},"Accept with sign-off",{"type":58,"value":2024}," — the operator accepts the divergence; record it as ",{"type":53,"tag":67,"props":2026,"children":2028},{"className":2027},[],[2029],{"type":58,"value":2030},"acceptance: { by: 'human', proof: \u003Coperator rationale> }",{"type":58,"value":2032}," on that section. This is the ONLY way a ",{"type":53,"tag":67,"props":2034,"children":2036},{"className":2035},[],[2037],{"type":58,"value":1185},{"type":58,"value":2039}," section ships.",{"type":53,"tag":122,"props":2041,"children":2042},{},[2043,2048,2050,2056],{"type":53,"tag":107,"props":2044,"children":2045},{},[2046],{"type":58,"value":2047},"Abandon this page",{"type":58,"value":2049}," — recorded explicitly, surfaced as a hard ",{"type":53,"tag":67,"props":2051,"children":2053},{"className":2052},[],[2054],{"type":58,"value":2055},"fail",{"type":58,"value":2057}," in the run-report.",{"type":53,"tag":61,"props":2059,"children":2060},{},[2061,2063,2068,2070,2075,2077,2083,2085,2090],{"type":58,"value":2062},"Log per-rung attempts to ",{"type":53,"tag":67,"props":2064,"children":2066},{"className":2065},[],[2067],{"type":58,"value":651},{"type":58,"value":2069},". Do NOT silently accept or stop. A ",{"type":53,"tag":67,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":58,"value":1185},{"type":58,"value":2076}," section with no human ",{"type":53,"tag":67,"props":2078,"children":2080},{"className":2079},[],[2081],{"type":58,"value":2082},"acceptance",{"type":58,"value":2084}," keeps the run at ",{"type":53,"tag":67,"props":2086,"children":2088},{"className":2087},[],[2089],{"type":58,"value":2055},{"type":58,"value":306},{"type":53,"tag":97,"props":2092,"children":2094},{"id":2093},"output-contract",[2095],{"type":58,"value":2096},"Output contract",{"type":53,"tag":61,"props":2098,"children":2099},{},[2100],{"type":58,"value":2101},"Return to the orchestrator:",{"type":53,"tag":61,"props":2103,"children":2104},{},[2105,2107,2113,2114,2120,2122,2128],{"type":58,"value":2106},"Pass the ",{"type":53,"tag":67,"props":2108,"children":2110},{"className":2109},[],[2111],{"type":58,"value":2112},"pageParity[]",{"type":58,"value":637},{"type":53,"tag":67,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":58,"value":2119},"{ page, sections: SectionParity[] }",{"type":58,"value":2121}," per content page) into ",{"type":53,"tag":67,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":58,"value":2127},"buildRunReport",{"type":58,"value":2129}," — the verdict is computed from it. Return to the orchestrator:",{"type":53,"tag":308,"props":2131,"children":2135},{"className":2132,"code":2133,"language":2134,"meta":313,"style":313},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"passed\": true,\n  \"iterations\": 2,\n  \"perUrl\": [\n    {\n      \"urlPath\": \"\u002F\",\n      \"archetype\": \"homepage\",\n      \"responsiveness\": { \"passed\": true },\n      \"sections\": [\n        { \"band\": \"hero\", \"score\": 10, \"status\": \"match\",\n          \"signals\": { \"sectionPresent\": true, \"bgDeltaE\": 1.2, \"columnCountMatch\": true, \"mediaPresent\": true, \"fallbackUnstyled\": false },\n          \"evidence\": { \"srcSample\": \"#d0d2cd\", \"repSample\": \"#d0d2cd\" } },\n        { \"band\": \"service-cards\", \"score\": 10, \"status\": \"match\",\n          \"signals\": { \"sectionPresent\": true, \"bgDeltaE\": 2.0, \"columnCountMatch\": true, \"mediaPresent\": true, \"fallbackUnstyled\": false },\n          \"evidence\": { \"srcSample\": \"#ccc6c6\", \"repSample\": \"#cdc7c7\" },\n          \"note\": \"was FLATTENED — cards lost bg + grid; restored via R2 iter 1, re-scored 4→10\" }\n      ],\n      \"qualitative\": \"Per-section parity above. CTA color drifted, fixed via R1 iter 1.\",\n      \"a11yWarnings\": []\n    }\n  ],\n  \"a11yWarnings\": [],\n  \"notesPath\": \"\u003CoutputDir>\u002Ftheme\u002Fnotes.md\"\n}\n","json",[2136],{"type":53,"tag":67,"props":2137,"children":2138},{"__ignoreMap":313},[2139,2146,2174,2204,2229,2237,2275,2313,2365,2390,2493,2630,2726,2823,2956,3046,3085,3094,3132,3158,3167,3176,3201,3235],{"type":53,"tag":319,"props":2140,"children":2141},{"class":321,"line":32},[2142],{"type":53,"tag":319,"props":2143,"children":2144},{"style":336},[2145],{"type":58,"value":339},{"type":53,"tag":319,"props":2147,"children":2148},{"class":321,"line":342},[2149,2154,2160,2165,2169],{"type":53,"tag":319,"props":2150,"children":2151},{"style":336},[2152],{"type":58,"value":2153},"  \"",{"type":53,"tag":319,"props":2155,"children":2157},{"style":2156},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[2158],{"type":58,"value":2159},"passed",{"type":53,"tag":319,"props":2161,"children":2162},{"style":336},[2163],{"type":58,"value":2164},"\"",{"type":53,"tag":319,"props":2166,"children":2167},{"style":336},[2168],{"type":58,"value":381},{"type":53,"tag":319,"props":2170,"children":2171},{"style":336},[2172],{"type":58,"value":2173}," true,\n",{"type":53,"tag":319,"props":2175,"children":2176},{"class":321,"line":356},[2177,2181,2186,2190,2194,2200],{"type":53,"tag":319,"props":2178,"children":2179},{"style":336},[2180],{"type":58,"value":2153},{"type":53,"tag":319,"props":2182,"children":2183},{"style":2156},[2184],{"type":58,"value":2185},"iterations",{"type":53,"tag":319,"props":2187,"children":2188},{"style":336},[2189],{"type":58,"value":2164},{"type":53,"tag":319,"props":2191,"children":2192},{"style":336},[2193],{"type":58,"value":381},{"type":53,"tag":319,"props":2195,"children":2197},{"style":2196},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2198],{"type":58,"value":2199}," 2",{"type":53,"tag":319,"props":2201,"children":2202},{"style":336},[2203],{"type":58,"value":353},{"type":53,"tag":319,"props":2205,"children":2206},{"class":321,"line":369},[2207,2211,2216,2220,2224],{"type":53,"tag":319,"props":2208,"children":2209},{"style":336},[2210],{"type":58,"value":2153},{"type":53,"tag":319,"props":2212,"children":2213},{"style":2156},[2214],{"type":58,"value":2215},"perUrl",{"type":53,"tag":319,"props":2217,"children":2218},{"style":336},[2219],{"type":58,"value":2164},{"type":53,"tag":319,"props":2221,"children":2222},{"style":336},[2223],{"type":58,"value":381},{"type":53,"tag":319,"props":2225,"children":2226},{"style":336},[2227],{"type":58,"value":2228}," [\n",{"type":53,"tag":319,"props":2230,"children":2231},{"class":321,"line":407},[2232],{"type":53,"tag":319,"props":2233,"children":2234},{"style":336},[2235],{"type":58,"value":2236},"    {\n",{"type":53,"tag":319,"props":2238,"children":2239},{"class":321,"line":436},[2240,2245,2251,2255,2259,2263,2267,2271],{"type":53,"tag":319,"props":2241,"children":2242},{"style":336},[2243],{"type":58,"value":2244},"      \"",{"type":53,"tag":319,"props":2246,"children":2248},{"style":2247},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2249],{"type":58,"value":2250},"urlPath",{"type":53,"tag":319,"props":2252,"children":2253},{"style":336},[2254],{"type":58,"value":2164},{"type":53,"tag":319,"props":2256,"children":2257},{"style":336},[2258],{"type":58,"value":381},{"type":53,"tag":319,"props":2260,"children":2261},{"style":336},[2262],{"type":58,"value":422},{"type":53,"tag":319,"props":2264,"children":2265},{"style":425},[2266],{"type":58,"value":1036},{"type":53,"tag":319,"props":2268,"children":2269},{"style":336},[2270],{"type":58,"value":2164},{"type":53,"tag":319,"props":2272,"children":2273},{"style":336},[2274],{"type":58,"value":353},{"type":53,"tag":319,"props":2276,"children":2278},{"class":321,"line":2277},7,[2279,2283,2288,2292,2296,2300,2305,2309],{"type":53,"tag":319,"props":2280,"children":2281},{"style":336},[2282],{"type":58,"value":2244},{"type":53,"tag":319,"props":2284,"children":2285},{"style":2247},[2286],{"type":58,"value":2287},"archetype",{"type":53,"tag":319,"props":2289,"children":2290},{"style":336},[2291],{"type":58,"value":2164},{"type":53,"tag":319,"props":2293,"children":2294},{"style":336},[2295],{"type":58,"value":381},{"type":53,"tag":319,"props":2297,"children":2298},{"style":336},[2299],{"type":58,"value":422},{"type":53,"tag":319,"props":2301,"children":2302},{"style":425},[2303],{"type":58,"value":2304},"homepage",{"type":53,"tag":319,"props":2306,"children":2307},{"style":336},[2308],{"type":58,"value":2164},{"type":53,"tag":319,"props":2310,"children":2311},{"style":336},[2312],{"type":58,"value":353},{"type":53,"tag":319,"props":2314,"children":2316},{"class":321,"line":2315},8,[2317,2321,2326,2330,2334,2339,2343,2347,2351,2355,2360],{"type":53,"tag":319,"props":2318,"children":2319},{"style":336},[2320],{"type":58,"value":2244},{"type":53,"tag":319,"props":2322,"children":2323},{"style":2247},[2324],{"type":58,"value":2325},"responsiveness",{"type":53,"tag":319,"props":2327,"children":2328},{"style":336},[2329],{"type":58,"value":2164},{"type":53,"tag":319,"props":2331,"children":2332},{"style":336},[2333],{"type":58,"value":381},{"type":53,"tag":319,"props":2335,"children":2336},{"style":336},[2337],{"type":58,"value":2338}," {",{"type":53,"tag":319,"props":2340,"children":2341},{"style":336},[2342],{"type":58,"value":422},{"type":53,"tag":319,"props":2344,"children":2345},{"style":2196},[2346],{"type":58,"value":2159},{"type":53,"tag":319,"props":2348,"children":2349},{"style":336},[2350],{"type":58,"value":2164},{"type":53,"tag":319,"props":2352,"children":2353},{"style":336},[2354],{"type":58,"value":381},{"type":53,"tag":319,"props":2356,"children":2357},{"style":336},[2358],{"type":58,"value":2359}," true",{"type":53,"tag":319,"props":2361,"children":2362},{"style":336},[2363],{"type":58,"value":2364}," },\n",{"type":53,"tag":319,"props":2366,"children":2368},{"class":321,"line":2367},9,[2369,2373,2378,2382,2386],{"type":53,"tag":319,"props":2370,"children":2371},{"style":336},[2372],{"type":58,"value":2244},{"type":53,"tag":319,"props":2374,"children":2375},{"style":2247},[2376],{"type":58,"value":2377},"sections",{"type":53,"tag":319,"props":2379,"children":2380},{"style":336},[2381],{"type":58,"value":2164},{"type":53,"tag":319,"props":2383,"children":2384},{"style":336},[2385],{"type":58,"value":381},{"type":53,"tag":319,"props":2387,"children":2388},{"style":336},[2389],{"type":58,"value":2228},{"type":53,"tag":319,"props":2391,"children":2393},{"class":321,"line":2392},10,[2394,2399,2403,2408,2412,2416,2420,2425,2429,2434,2438,2443,2447,2451,2456,2460,2464,2469,2473,2477,2481,2485,2489],{"type":53,"tag":319,"props":2395,"children":2396},{"style":336},[2397],{"type":58,"value":2398},"        {",{"type":53,"tag":319,"props":2400,"children":2401},{"style":336},[2402],{"type":58,"value":422},{"type":53,"tag":319,"props":2404,"children":2405},{"style":2196},[2406],{"type":58,"value":2407},"band",{"type":53,"tag":319,"props":2409,"children":2410},{"style":336},[2411],{"type":58,"value":2164},{"type":53,"tag":319,"props":2413,"children":2414},{"style":336},[2415],{"type":58,"value":381},{"type":53,"tag":319,"props":2417,"children":2418},{"style":336},[2419],{"type":58,"value":422},{"type":53,"tag":319,"props":2421,"children":2422},{"style":425},[2423],{"type":58,"value":2424},"hero",{"type":53,"tag":319,"props":2426,"children":2427},{"style":336},[2428],{"type":58,"value":2164},{"type":53,"tag":319,"props":2430,"children":2431},{"style":336},[2432],{"type":58,"value":2433},",",{"type":53,"tag":319,"props":2435,"children":2436},{"style":336},[2437],{"type":58,"value":422},{"type":53,"tag":319,"props":2439,"children":2440},{"style":2196},[2441],{"type":58,"value":2442},"score",{"type":53,"tag":319,"props":2444,"children":2445},{"style":336},[2446],{"type":58,"value":2164},{"type":53,"tag":319,"props":2448,"children":2449},{"style":336},[2450],{"type":58,"value":381},{"type":53,"tag":319,"props":2452,"children":2453},{"style":2196},[2454],{"type":58,"value":2455}," 10",{"type":53,"tag":319,"props":2457,"children":2458},{"style":336},[2459],{"type":58,"value":2433},{"type":53,"tag":319,"props":2461,"children":2462},{"style":336},[2463],{"type":58,"value":422},{"type":53,"tag":319,"props":2465,"children":2466},{"style":2196},[2467],{"type":58,"value":2468},"status",{"type":53,"tag":319,"props":2470,"children":2471},{"style":336},[2472],{"type":58,"value":2164},{"type":53,"tag":319,"props":2474,"children":2475},{"style":336},[2476],{"type":58,"value":381},{"type":53,"tag":319,"props":2478,"children":2479},{"style":336},[2480],{"type":58,"value":422},{"type":53,"tag":319,"props":2482,"children":2483},{"style":425},[2484],{"type":58,"value":1215},{"type":53,"tag":319,"props":2486,"children":2487},{"style":336},[2488],{"type":58,"value":2164},{"type":53,"tag":319,"props":2490,"children":2491},{"style":336},[2492],{"type":58,"value":353},{"type":53,"tag":319,"props":2494,"children":2496},{"class":321,"line":2495},11,[2497,2502,2507,2511,2515,2519,2523,2527,2531,2535,2540,2544,2548,2552,2556,2561,2565,2569,2573,2577,2581,2585,2589,2593,2597,2601,2605,2609,2613,2617,2621,2626],{"type":53,"tag":319,"props":2498,"children":2499},{"style":336},[2500],{"type":58,"value":2501},"          \"",{"type":53,"tag":319,"props":2503,"children":2504},{"style":2196},[2505],{"type":58,"value":2506},"signals",{"type":53,"tag":319,"props":2508,"children":2509},{"style":336},[2510],{"type":58,"value":2164},{"type":53,"tag":319,"props":2512,"children":2513},{"style":336},[2514],{"type":58,"value":381},{"type":53,"tag":319,"props":2516,"children":2517},{"style":336},[2518],{"type":58,"value":2338},{"type":53,"tag":319,"props":2520,"children":2521},{"style":336},[2522],{"type":58,"value":422},{"type":53,"tag":319,"props":2524,"children":2525},{"style":373},[2526],{"type":58,"value":1095},{"type":53,"tag":319,"props":2528,"children":2529},{"style":336},[2530],{"type":58,"value":2164},{"type":53,"tag":319,"props":2532,"children":2533},{"style":336},[2534],{"type":58,"value":381},{"type":53,"tag":319,"props":2536,"children":2537},{"style":336},[2538],{"type":58,"value":2539}," true,",{"type":53,"tag":319,"props":2541,"children":2542},{"style":336},[2543],{"type":58,"value":422},{"type":53,"tag":319,"props":2545,"children":2546},{"style":373},[2547],{"type":58,"value":1103},{"type":53,"tag":319,"props":2549,"children":2550},{"style":336},[2551],{"type":58,"value":2164},{"type":53,"tag":319,"props":2553,"children":2554},{"style":336},[2555],{"type":58,"value":381},{"type":53,"tag":319,"props":2557,"children":2558},{"style":2196},[2559],{"type":58,"value":2560}," 1.2",{"type":53,"tag":319,"props":2562,"children":2563},{"style":336},[2564],{"type":58,"value":2433},{"type":53,"tag":319,"props":2566,"children":2567},{"style":336},[2568],{"type":58,"value":422},{"type":53,"tag":319,"props":2570,"children":2571},{"style":373},[2572],{"type":58,"value":1134},{"type":53,"tag":319,"props":2574,"children":2575},{"style":336},[2576],{"type":58,"value":2164},{"type":53,"tag":319,"props":2578,"children":2579},{"style":336},[2580],{"type":58,"value":381},{"type":53,"tag":319,"props":2582,"children":2583},{"style":336},[2584],{"type":58,"value":2539},{"type":53,"tag":319,"props":2586,"children":2587},{"style":336},[2588],{"type":58,"value":422},{"type":53,"tag":319,"props":2590,"children":2591},{"style":373},[2592],{"type":58,"value":1150},{"type":53,"tag":319,"props":2594,"children":2595},{"style":336},[2596],{"type":58,"value":2164},{"type":53,"tag":319,"props":2598,"children":2599},{"style":336},[2600],{"type":58,"value":381},{"type":53,"tag":319,"props":2602,"children":2603},{"style":336},[2604],{"type":58,"value":2539},{"type":53,"tag":319,"props":2606,"children":2607},{"style":336},[2608],{"type":58,"value":422},{"type":53,"tag":319,"props":2610,"children":2611},{"style":373},[2612],{"type":58,"value":1157},{"type":53,"tag":319,"props":2614,"children":2615},{"style":336},[2616],{"type":58,"value":2164},{"type":53,"tag":319,"props":2618,"children":2619},{"style":336},[2620],{"type":58,"value":381},{"type":53,"tag":319,"props":2622,"children":2623},{"style":336},[2624],{"type":58,"value":2625}," false",{"type":53,"tag":319,"props":2627,"children":2628},{"style":336},[2629],{"type":58,"value":2364},{"type":53,"tag":319,"props":2631,"children":2633},{"class":321,"line":2632},12,[2634,2638,2642,2646,2650,2654,2658,2663,2667,2671,2675,2680,2684,2688,2692,2697,2701,2705,2709,2713,2717,2722],{"type":53,"tag":319,"props":2635,"children":2636},{"style":336},[2637],{"type":58,"value":2501},{"type":53,"tag":319,"props":2639,"children":2640},{"style":2196},[2641],{"type":58,"value":1165},{"type":53,"tag":319,"props":2643,"children":2644},{"style":336},[2645],{"type":58,"value":2164},{"type":53,"tag":319,"props":2647,"children":2648},{"style":336},[2649],{"type":58,"value":381},{"type":53,"tag":319,"props":2651,"children":2652},{"style":336},[2653],{"type":58,"value":2338},{"type":53,"tag":319,"props":2655,"children":2656},{"style":336},[2657],{"type":58,"value":422},{"type":53,"tag":319,"props":2659,"children":2660},{"style":373},[2661],{"type":58,"value":2662},"srcSample",{"type":53,"tag":319,"props":2664,"children":2665},{"style":336},[2666],{"type":58,"value":2164},{"type":53,"tag":319,"props":2668,"children":2669},{"style":336},[2670],{"type":58,"value":381},{"type":53,"tag":319,"props":2672,"children":2673},{"style":336},[2674],{"type":58,"value":422},{"type":53,"tag":319,"props":2676,"children":2677},{"style":425},[2678],{"type":58,"value":2679},"#d0d2cd",{"type":53,"tag":319,"props":2681,"children":2682},{"style":336},[2683],{"type":58,"value":2164},{"type":53,"tag":319,"props":2685,"children":2686},{"style":336},[2687],{"type":58,"value":2433},{"type":53,"tag":319,"props":2689,"children":2690},{"style":336},[2691],{"type":58,"value":422},{"type":53,"tag":319,"props":2693,"children":2694},{"style":373},[2695],{"type":58,"value":2696},"repSample",{"type":53,"tag":319,"props":2698,"children":2699},{"style":336},[2700],{"type":58,"value":2164},{"type":53,"tag":319,"props":2702,"children":2703},{"style":336},[2704],{"type":58,"value":381},{"type":53,"tag":319,"props":2706,"children":2707},{"style":336},[2708],{"type":58,"value":422},{"type":53,"tag":319,"props":2710,"children":2711},{"style":425},[2712],{"type":58,"value":2679},{"type":53,"tag":319,"props":2714,"children":2715},{"style":336},[2716],{"type":58,"value":2164},{"type":53,"tag":319,"props":2718,"children":2719},{"style":336},[2720],{"type":58,"value":2721}," }",{"type":53,"tag":319,"props":2723,"children":2724},{"style":336},[2725],{"type":58,"value":2364},{"type":53,"tag":319,"props":2727,"children":2729},{"class":321,"line":2728},13,[2730,2734,2738,2742,2746,2750,2754,2759,2763,2767,2771,2775,2779,2783,2787,2791,2795,2799,2803,2807,2811,2815,2819],{"type":53,"tag":319,"props":2731,"children":2732},{"style":336},[2733],{"type":58,"value":2398},{"type":53,"tag":319,"props":2735,"children":2736},{"style":336},[2737],{"type":58,"value":422},{"type":53,"tag":319,"props":2739,"children":2740},{"style":2196},[2741],{"type":58,"value":2407},{"type":53,"tag":319,"props":2743,"children":2744},{"style":336},[2745],{"type":58,"value":2164},{"type":53,"tag":319,"props":2747,"children":2748},{"style":336},[2749],{"type":58,"value":381},{"type":53,"tag":319,"props":2751,"children":2752},{"style":336},[2753],{"type":58,"value":422},{"type":53,"tag":319,"props":2755,"children":2756},{"style":425},[2757],{"type":58,"value":2758},"service-cards",{"type":53,"tag":319,"props":2760,"children":2761},{"style":336},[2762],{"type":58,"value":2164},{"type":53,"tag":319,"props":2764,"children":2765},{"style":336},[2766],{"type":58,"value":2433},{"type":53,"tag":319,"props":2768,"children":2769},{"style":336},[2770],{"type":58,"value":422},{"type":53,"tag":319,"props":2772,"children":2773},{"style":2196},[2774],{"type":58,"value":2442},{"type":53,"tag":319,"props":2776,"children":2777},{"style":336},[2778],{"type":58,"value":2164},{"type":53,"tag":319,"props":2780,"children":2781},{"style":336},[2782],{"type":58,"value":381},{"type":53,"tag":319,"props":2784,"children":2785},{"style":2196},[2786],{"type":58,"value":2455},{"type":53,"tag":319,"props":2788,"children":2789},{"style":336},[2790],{"type":58,"value":2433},{"type":53,"tag":319,"props":2792,"children":2793},{"style":336},[2794],{"type":58,"value":422},{"type":53,"tag":319,"props":2796,"children":2797},{"style":2196},[2798],{"type":58,"value":2468},{"type":53,"tag":319,"props":2800,"children":2801},{"style":336},[2802],{"type":58,"value":2164},{"type":53,"tag":319,"props":2804,"children":2805},{"style":336},[2806],{"type":58,"value":381},{"type":53,"tag":319,"props":2808,"children":2809},{"style":336},[2810],{"type":58,"value":422},{"type":53,"tag":319,"props":2812,"children":2813},{"style":425},[2814],{"type":58,"value":1215},{"type":53,"tag":319,"props":2816,"children":2817},{"style":336},[2818],{"type":58,"value":2164},{"type":53,"tag":319,"props":2820,"children":2821},{"style":336},[2822],{"type":58,"value":353},{"type":53,"tag":319,"props":2824,"children":2826},{"class":321,"line":2825},14,[2827,2831,2835,2839,2843,2847,2851,2855,2859,2863,2867,2871,2875,2879,2883,2888,2892,2896,2900,2904,2908,2912,2916,2920,2924,2928,2932,2936,2940,2944,2948,2952],{"type":53,"tag":319,"props":2828,"children":2829},{"style":336},[2830],{"type":58,"value":2501},{"type":53,"tag":319,"props":2832,"children":2833},{"style":2196},[2834],{"type":58,"value":2506},{"type":53,"tag":319,"props":2836,"children":2837},{"style":336},[2838],{"type":58,"value":2164},{"type":53,"tag":319,"props":2840,"children":2841},{"style":336},[2842],{"type":58,"value":381},{"type":53,"tag":319,"props":2844,"children":2845},{"style":336},[2846],{"type":58,"value":2338},{"type":53,"tag":319,"props":2848,"children":2849},{"style":336},[2850],{"type":58,"value":422},{"type":53,"tag":319,"props":2852,"children":2853},{"style":373},[2854],{"type":58,"value":1095},{"type":53,"tag":319,"props":2856,"children":2857},{"style":336},[2858],{"type":58,"value":2164},{"type":53,"tag":319,"props":2860,"children":2861},{"style":336},[2862],{"type":58,"value":381},{"type":53,"tag":319,"props":2864,"children":2865},{"style":336},[2866],{"type":58,"value":2539},{"type":53,"tag":319,"props":2868,"children":2869},{"style":336},[2870],{"type":58,"value":422},{"type":53,"tag":319,"props":2872,"children":2873},{"style":373},[2874],{"type":58,"value":1103},{"type":53,"tag":319,"props":2876,"children":2877},{"style":336},[2878],{"type":58,"value":2164},{"type":53,"tag":319,"props":2880,"children":2881},{"style":336},[2882],{"type":58,"value":381},{"type":53,"tag":319,"props":2884,"children":2885},{"style":2196},[2886],{"type":58,"value":2887}," 2.0",{"type":53,"tag":319,"props":2889,"children":2890},{"style":336},[2891],{"type":58,"value":2433},{"type":53,"tag":319,"props":2893,"children":2894},{"style":336},[2895],{"type":58,"value":422},{"type":53,"tag":319,"props":2897,"children":2898},{"style":373},[2899],{"type":58,"value":1134},{"type":53,"tag":319,"props":2901,"children":2902},{"style":336},[2903],{"type":58,"value":2164},{"type":53,"tag":319,"props":2905,"children":2906},{"style":336},[2907],{"type":58,"value":381},{"type":53,"tag":319,"props":2909,"children":2910},{"style":336},[2911],{"type":58,"value":2539},{"type":53,"tag":319,"props":2913,"children":2914},{"style":336},[2915],{"type":58,"value":422},{"type":53,"tag":319,"props":2917,"children":2918},{"style":373},[2919],{"type":58,"value":1150},{"type":53,"tag":319,"props":2921,"children":2922},{"style":336},[2923],{"type":58,"value":2164},{"type":53,"tag":319,"props":2925,"children":2926},{"style":336},[2927],{"type":58,"value":381},{"type":53,"tag":319,"props":2929,"children":2930},{"style":336},[2931],{"type":58,"value":2539},{"type":53,"tag":319,"props":2933,"children":2934},{"style":336},[2935],{"type":58,"value":422},{"type":53,"tag":319,"props":2937,"children":2938},{"style":373},[2939],{"type":58,"value":1157},{"type":53,"tag":319,"props":2941,"children":2942},{"style":336},[2943],{"type":58,"value":2164},{"type":53,"tag":319,"props":2945,"children":2946},{"style":336},[2947],{"type":58,"value":381},{"type":53,"tag":319,"props":2949,"children":2950},{"style":336},[2951],{"type":58,"value":2625},{"type":53,"tag":319,"props":2953,"children":2954},{"style":336},[2955],{"type":58,"value":2364},{"type":53,"tag":319,"props":2957,"children":2959},{"class":321,"line":2958},15,[2960,2964,2968,2972,2976,2980,2984,2988,2992,2996,3000,3005,3009,3013,3017,3021,3025,3029,3033,3038,3042],{"type":53,"tag":319,"props":2961,"children":2962},{"style":336},[2963],{"type":58,"value":2501},{"type":53,"tag":319,"props":2965,"children":2966},{"style":2196},[2967],{"type":58,"value":1165},{"type":53,"tag":319,"props":2969,"children":2970},{"style":336},[2971],{"type":58,"value":2164},{"type":53,"tag":319,"props":2973,"children":2974},{"style":336},[2975],{"type":58,"value":381},{"type":53,"tag":319,"props":2977,"children":2978},{"style":336},[2979],{"type":58,"value":2338},{"type":53,"tag":319,"props":2981,"children":2982},{"style":336},[2983],{"type":58,"value":422},{"type":53,"tag":319,"props":2985,"children":2986},{"style":373},[2987],{"type":58,"value":2662},{"type":53,"tag":319,"props":2989,"children":2990},{"style":336},[2991],{"type":58,"value":2164},{"type":53,"tag":319,"props":2993,"children":2994},{"style":336},[2995],{"type":58,"value":381},{"type":53,"tag":319,"props":2997,"children":2998},{"style":336},[2999],{"type":58,"value":422},{"type":53,"tag":319,"props":3001,"children":3002},{"style":425},[3003],{"type":58,"value":3004},"#ccc6c6",{"type":53,"tag":319,"props":3006,"children":3007},{"style":336},[3008],{"type":58,"value":2164},{"type":53,"tag":319,"props":3010,"children":3011},{"style":336},[3012],{"type":58,"value":2433},{"type":53,"tag":319,"props":3014,"children":3015},{"style":336},[3016],{"type":58,"value":422},{"type":53,"tag":319,"props":3018,"children":3019},{"style":373},[3020],{"type":58,"value":2696},{"type":53,"tag":319,"props":3022,"children":3023},{"style":336},[3024],{"type":58,"value":2164},{"type":53,"tag":319,"props":3026,"children":3027},{"style":336},[3028],{"type":58,"value":381},{"type":53,"tag":319,"props":3030,"children":3031},{"style":336},[3032],{"type":58,"value":422},{"type":53,"tag":319,"props":3034,"children":3035},{"style":425},[3036],{"type":58,"value":3037},"#cdc7c7",{"type":53,"tag":319,"props":3039,"children":3040},{"style":336},[3041],{"type":58,"value":2164},{"type":53,"tag":319,"props":3043,"children":3044},{"style":336},[3045],{"type":58,"value":2364},{"type":53,"tag":319,"props":3047,"children":3049},{"class":321,"line":3048},16,[3050,3054,3059,3063,3067,3071,3076,3080],{"type":53,"tag":319,"props":3051,"children":3052},{"style":336},[3053],{"type":58,"value":2501},{"type":53,"tag":319,"props":3055,"children":3056},{"style":2196},[3057],{"type":58,"value":3058},"note",{"type":53,"tag":319,"props":3060,"children":3061},{"style":336},[3062],{"type":58,"value":2164},{"type":53,"tag":319,"props":3064,"children":3065},{"style":336},[3066],{"type":58,"value":381},{"type":53,"tag":319,"props":3068,"children":3069},{"style":336},[3070],{"type":58,"value":422},{"type":53,"tag":319,"props":3072,"children":3073},{"style":425},[3074],{"type":58,"value":3075},"was FLATTENED — cards lost bg + grid; restored via R2 iter 1, re-scored 4→10",{"type":53,"tag":319,"props":3077,"children":3078},{"style":336},[3079],{"type":58,"value":2164},{"type":53,"tag":319,"props":3081,"children":3082},{"style":336},[3083],{"type":58,"value":3084}," }\n",{"type":53,"tag":319,"props":3086,"children":3088},{"class":321,"line":3087},17,[3089],{"type":53,"tag":319,"props":3090,"children":3091},{"style":336},[3092],{"type":58,"value":3093},"      ],\n",{"type":53,"tag":319,"props":3095,"children":3097},{"class":321,"line":3096},18,[3098,3102,3107,3111,3115,3119,3124,3128],{"type":53,"tag":319,"props":3099,"children":3100},{"style":336},[3101],{"type":58,"value":2244},{"type":53,"tag":319,"props":3103,"children":3104},{"style":2247},[3105],{"type":58,"value":3106},"qualitative",{"type":53,"tag":319,"props":3108,"children":3109},{"style":336},[3110],{"type":58,"value":2164},{"type":53,"tag":319,"props":3112,"children":3113},{"style":336},[3114],{"type":58,"value":381},{"type":53,"tag":319,"props":3116,"children":3117},{"style":336},[3118],{"type":58,"value":422},{"type":53,"tag":319,"props":3120,"children":3121},{"style":425},[3122],{"type":58,"value":3123},"Per-section parity above. CTA color drifted, fixed via R1 iter 1.",{"type":53,"tag":319,"props":3125,"children":3126},{"style":336},[3127],{"type":58,"value":2164},{"type":53,"tag":319,"props":3129,"children":3130},{"style":336},[3131],{"type":58,"value":353},{"type":53,"tag":319,"props":3133,"children":3135},{"class":321,"line":3134},19,[3136,3140,3145,3149,3153],{"type":53,"tag":319,"props":3137,"children":3138},{"style":336},[3139],{"type":58,"value":2244},{"type":53,"tag":319,"props":3141,"children":3142},{"style":2247},[3143],{"type":58,"value":3144},"a11yWarnings",{"type":53,"tag":319,"props":3146,"children":3147},{"style":336},[3148],{"type":58,"value":2164},{"type":53,"tag":319,"props":3150,"children":3151},{"style":336},[3152],{"type":58,"value":381},{"type":53,"tag":319,"props":3154,"children":3155},{"style":336},[3156],{"type":58,"value":3157}," []\n",{"type":53,"tag":319,"props":3159,"children":3161},{"class":321,"line":3160},20,[3162],{"type":53,"tag":319,"props":3163,"children":3164},{"style":336},[3165],{"type":58,"value":3166},"    }\n",{"type":53,"tag":319,"props":3168,"children":3170},{"class":321,"line":3169},21,[3171],{"type":53,"tag":319,"props":3172,"children":3173},{"style":336},[3174],{"type":58,"value":3175},"  ],\n",{"type":53,"tag":319,"props":3177,"children":3179},{"class":321,"line":3178},22,[3180,3184,3188,3192,3196],{"type":53,"tag":319,"props":3181,"children":3182},{"style":336},[3183],{"type":58,"value":2153},{"type":53,"tag":319,"props":3185,"children":3186},{"style":2156},[3187],{"type":58,"value":3144},{"type":53,"tag":319,"props":3189,"children":3190},{"style":336},[3191],{"type":58,"value":2164},{"type":53,"tag":319,"props":3193,"children":3194},{"style":336},[3195],{"type":58,"value":381},{"type":53,"tag":319,"props":3197,"children":3198},{"style":336},[3199],{"type":58,"value":3200}," [],\n",{"type":53,"tag":319,"props":3202,"children":3204},{"class":321,"line":3203},23,[3205,3209,3214,3218,3222,3226,3231],{"type":53,"tag":319,"props":3206,"children":3207},{"style":336},[3208],{"type":58,"value":2153},{"type":53,"tag":319,"props":3210,"children":3211},{"style":2156},[3212],{"type":58,"value":3213},"notesPath",{"type":53,"tag":319,"props":3215,"children":3216},{"style":336},[3217],{"type":58,"value":2164},{"type":53,"tag":319,"props":3219,"children":3220},{"style":336},[3221],{"type":58,"value":381},{"type":53,"tag":319,"props":3223,"children":3224},{"style":336},[3225],{"type":58,"value":422},{"type":53,"tag":319,"props":3227,"children":3228},{"style":425},[3229],{"type":58,"value":3230},"\u003CoutputDir>\u002Ftheme\u002Fnotes.md",{"type":53,"tag":319,"props":3232,"children":3233},{"style":336},[3234],{"type":58,"value":433},{"type":53,"tag":319,"props":3236,"children":3238},{"class":321,"line":3237},24,[3239],{"type":53,"tag":319,"props":3240,"children":3241},{"style":336},[3242],{"type":58,"value":3243},"}\n",{"type":53,"tag":61,"props":3245,"children":3246},{},[3247,3252,3254,3259,3261,3266,3268,3274,3276,3281,3283,3288,3290,3295,3297,3302],{"type":53,"tag":67,"props":3248,"children":3250},{"className":3249},[],[3251],{"type":58,"value":2159},{"type":58,"value":3253}," is NOT a separate assertion — it is the run-report verdict computed by ",{"type":53,"tag":67,"props":3255,"children":3257},{"className":3256},[],[3258],{"type":58,"value":2127},{"type":58,"value":3260}," over ",{"type":53,"tag":67,"props":3262,"children":3264},{"className":3263},[],[3265],{"type":58,"value":2112},{"type":58,"value":3267},": it is ",{"type":53,"tag":67,"props":3269,"children":3271},{"className":3270},[],[3272],{"type":58,"value":3273},"true",{"type":58,"value":3275}," only when (1) the responsiveness gate passes for all archetypes, AND (2) every content-page section re-derives to ",{"type":53,"tag":67,"props":3277,"children":3279},{"className":3278},[],[3280],{"type":58,"value":1215},{"type":58,"value":3282}," or ",{"type":53,"tag":67,"props":3284,"children":3286},{"className":3285},[],[3287],{"type":58,"value":1229},{"type":58,"value":3289}," (a ",{"type":53,"tag":67,"props":3291,"children":3293},{"className":3292},[],[3294],{"type":58,"value":1185},{"type":58,"value":3296}," section, or a reconstructed page with NO sampled sections, forces ",{"type":53,"tag":67,"props":3298,"children":3300},{"className":3299},[],[3301],{"type":58,"value":2055},{"type":58,"value":3303},"). You cannot move a section to \"accepted\" yourself except a Class-C constraint with sampled-pixel proof — flattening\u002Fwrong-bg\u002Fdropped-grid\u002Fdropped-media never qualify and require the operator's sign-off (Step 7).",{"type":53,"tag":97,"props":3305,"children":3307},{"id":3306},"rules",[3308],{"type":58,"value":3309},"Rules",{"type":53,"tag":118,"props":3311,"children":3312},{},[3313,3332,3362,3378,3383,3388,3406],{"type":53,"tag":122,"props":3314,"children":3315},{},[3316,3318,3323,3325,3330],{"type":58,"value":3317},"The responsiveness gate is a hard pass\u002Ffail. Per-section visual parity is ",{"type":53,"tag":107,"props":3319,"children":3320},{},[3321],{"type":58,"value":3322},"also a hard gate",{"type":58,"value":3324},": any unaccepted ",{"type":53,"tag":67,"props":3326,"children":3328},{"className":3327},[],[3329],{"type":58,"value":1185},{"type":58,"value":3331}," section fails the run.",{"type":53,"tag":122,"props":3333,"children":3334},{},[3335,3353,3355,3360],{"type":53,"tag":107,"props":3336,"children":3337},{},[3338,3340,3345,3346,3351],{"type":58,"value":3339},"Record the measured ",{"type":53,"tag":67,"props":3341,"children":3343},{"className":3342},[],[3344],{"type":58,"value":883},{"type":58,"value":277},{"type":53,"tag":67,"props":3347,"children":3349},{"className":3348},[],[3350],{"type":58,"value":1165},{"type":58,"value":3352}," — never claim a page \"matches\" without sampled signals.",{"type":58,"value":3354}," Vision + eyeballing repeatedly mis-judged color\u002Fsize\u002Fgaps; a page with no sampled sections is ",{"type":53,"tag":67,"props":3356,"children":3358},{"className":3357},[],[3359],{"type":58,"value":158},{"type":58,"value":3361},", not a pass.",{"type":53,"tag":122,"props":3363,"children":3364},{},[3365,3370,3372,3377],{"type":53,"tag":107,"props":3366,"children":3367},{},[3368],{"type":58,"value":3369},"Never self-accept a structural divergence.",{"type":58,"value":3371}," Flattening, wrong bg, dropped grid\u002Fmedia → fix via the escalation ladder or escalate to the operator. Only a genuine Class-C WP constraint may be agent-accepted, and only with ",{"type":53,"tag":67,"props":3373,"children":3375},{"className":3374},[],[3376],{"type":58,"value":1535},{"type":58,"value":306},{"type":53,"tag":122,"props":3379,"children":3380},{},[3381],{"type":58,"value":3382},"Never auto-fix accessibility issues — flag and move on.",{"type":53,"tag":122,"props":3384,"children":3385},{},[3386],{"type":58,"value":3387},"Never accept a result that failed the responsiveness gate.",{"type":53,"tag":122,"props":3389,"children":3390},{},[3391,3393,3398,3399,3404],{"type":58,"value":3392},"Never generate net-new theme structure — drive ",{"type":53,"tag":67,"props":3394,"children":3396},{"className":3395},[],[3397],{"type":58,"value":72},{"type":58,"value":74},{"type":53,"tag":67,"props":3400,"children":3402},{"className":3401},[],[3403],{"type":58,"value":80},{"type":58,"value":3405}," for all modifications.",{"type":53,"tag":122,"props":3407,"children":3408},{},[3409,3411,3416],{"type":58,"value":3410},"3 iterations per page is a circuit-breaker ",{"type":53,"tag":107,"props":3412,"children":3413},{},[3414],{"type":58,"value":3415},"checkpoint with the operator",{"type":58,"value":3417},", not a license to stop and ship. Escalate; don't surrender.",{"type":53,"tag":3419,"props":3420,"children":3421},"style",{},[3422],{"type":58,"value":3423},"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":3425,"total":3611},[3426,3447,3464,3478,3495,3510,3524,3539,3556,3567,3582,3598],{"slug":3427,"name":3427,"fn":3428,"description":3429,"org":3430,"tags":3431,"stars":3444,"repoUrl":3445,"updatedAt":3446},"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},[3432,3435,3438,3441],{"name":3433,"slug":3434,"type":15},"Frontend","frontend",{"name":3436,"slug":3437,"type":15},"Productivity","productivity",{"name":3439,"slug":3440,"type":15},"UX Copy","ux-copy",{"name":3442,"slug":3443,"type":15},"UX Design","ux-design",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-06T05:40:01.516544",{"slug":3448,"name":3448,"fn":3449,"description":3450,"org":3451,"tags":3452,"stars":3444,"repoUrl":3445,"updatedAt":3463},"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},[3453,3456,3459,3462],{"name":3454,"slug":3455,"type":15},"Block Editor","block-editor",{"name":3457,"slug":3458,"type":15},"CSS","css",{"name":3460,"slug":3461,"type":15},"HTML","html",{"name":17,"slug":18,"type":15},"2026-05-27T07:01:55.629681",{"slug":3465,"name":3465,"fn":3466,"description":3467,"org":3468,"tags":3469,"stars":3444,"repoUrl":3445,"updatedAt":3477},"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},[3470,3473,3476],{"name":3471,"slug":3472,"type":15},"Pricing","pricing",{"name":3474,"slug":3475,"type":15},"Reference","reference",{"name":17,"slug":18,"type":15},"2026-07-02T07:42:33.654791",{"slug":3479,"name":3479,"fn":3480,"description":3481,"org":3482,"tags":3483,"stars":3444,"repoUrl":3445,"updatedAt":3494},"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},[3484,3487,3490,3493],{"name":3485,"slug":3486,"type":15},"CMS","cms",{"name":3488,"slug":3489,"type":15},"Migration","migration",{"name":3491,"slug":3492,"type":15},"Web Development","web-development",{"name":17,"slug":18,"type":15},"2026-07-09T06:47:33.454311",{"slug":3496,"name":3496,"fn":3497,"description":3498,"org":3499,"tags":3500,"stars":3444,"repoUrl":3445,"updatedAt":3509},"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},[3501,3504,3505,3508],{"name":3502,"slug":3503,"type":15},"Audit","audit",{"name":3433,"slug":3434,"type":15},{"name":3506,"slug":3507,"type":15},"Performance","performance",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:06.433267",{"slug":3511,"name":3511,"fn":3512,"description":3513,"org":3514,"tags":3515,"stars":3444,"repoUrl":3445,"updatedAt":3523},"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},[3516,3519,3522],{"name":3517,"slug":3518,"type":15},"Content Creation","content-creation",{"name":3520,"slug":3521,"type":15},"Plugin Development","plugin-development",{"name":17,"slug":18,"type":15},"2026-05-27T07:01:58.249105",{"slug":3525,"name":3525,"fn":3526,"description":3527,"org":3528,"tags":3529,"stars":3444,"repoUrl":3445,"updatedAt":3538},"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},[3530,3531,3534,3537],{"name":3502,"slug":3503,"type":15},{"name":3532,"slug":3533,"type":15},"Marketing","marketing",{"name":3535,"slug":3536,"type":15},"SEO","seo",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:05.196367",{"slug":3540,"name":3540,"fn":3541,"description":3542,"org":3543,"tags":3544,"stars":3444,"repoUrl":3445,"updatedAt":3555},"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},[3545,3548,3551,3554],{"name":3546,"slug":3547,"type":15},"Design","design",{"name":3549,"slug":3550,"type":15},"Product Management","product-management",{"name":3552,"slug":3553,"type":15},"Specs","specs",{"name":17,"slug":18,"type":15},"2026-05-06T05:40:02.739409",{"slug":3557,"name":3557,"fn":3558,"description":3559,"org":3560,"tags":3561,"stars":3444,"repoUrl":3445,"updatedAt":3566},"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},[3562,3565],{"name":3563,"slug":3564,"type":15},"CLI","cli",{"name":17,"slug":18,"type":15},"2026-04-06T18:02:57.150231",{"slug":3568,"name":3568,"fn":3569,"description":3570,"org":3571,"tags":3572,"stars":3444,"repoUrl":3445,"updatedAt":3581},"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},[3573,3576,3579,3580],{"name":3574,"slug":3575,"type":15},"Content Strategy","content-strategy",{"name":3577,"slug":3578,"type":15},"Data Cleaning","data-cleaning",{"name":3535,"slug":3536,"type":15},{"name":17,"slug":18,"type":15},"2026-05-06T05:40:03.966799",{"slug":3583,"name":3583,"fn":3584,"description":3585,"org":3586,"tags":3587,"stars":3444,"repoUrl":3445,"updatedAt":3597},"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},[3588,3591,3592,3595],{"name":3589,"slug":3590,"type":15},"Animation","animation",{"name":3546,"slug":3547,"type":15},{"name":3593,"slug":3594,"type":15},"Typography","typography",{"name":3596,"slug":3583,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":3599,"name":3599,"fn":3600,"description":3601,"org":3602,"tags":3603,"stars":3444,"repoUrl":3445,"updatedAt":3610},"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},[3604,3607,3608,3609],{"name":3605,"slug":3606,"type":15},"Debugging","debugging",{"name":3433,"slug":3434,"type":15},{"name":23,"slug":24,"type":15},{"name":3596,"slug":3583,"type":15},"2026-06-06T07:09:59.809812",81,{"items":3613,"total":3169},[3614,3629,3640,3653,3664,3679,3687],{"slug":3615,"name":3615,"fn":3616,"description":3617,"org":3618,"tags":3619,"stars":28,"repoUrl":29,"updatedAt":3628},"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},[3620,3623,3624,3627],{"name":3621,"slug":3622,"type":15},"Automation","automation",{"name":3577,"slug":3578,"type":15},{"name":3625,"slug":3626,"type":15},"Data Engineering","data-engineering",{"name":17,"slug":18,"type":15},"2026-05-09T05:32:13.987972",{"slug":3630,"name":3630,"fn":3631,"description":3632,"org":3633,"tags":3634,"stars":28,"repoUrl":29,"updatedAt":3639},"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},[3635,3636,3637,3638],{"name":3454,"slug":3455,"type":15},{"name":3517,"slug":3518,"type":15},{"name":3460,"slug":3461,"type":15},{"name":17,"slug":18,"type":15},"2026-06-08T08:17:34.212397",{"slug":3641,"name":3641,"fn":3642,"description":3643,"org":3644,"tags":3645,"stars":28,"repoUrl":29,"updatedAt":3652},"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},[3646,3647,3650,3651],{"name":3454,"slug":3455,"type":15},{"name":3648,"slug":3649,"type":15},"Full Site Editing","full-site-editing",{"name":3520,"slug":3521,"type":15},{"name":17,"slug":18,"type":15},"2026-06-08T08:17:49.413995",{"slug":3654,"name":3654,"fn":3655,"description":3656,"org":3657,"tags":3658,"stars":28,"repoUrl":29,"updatedAt":3663},"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},[3659,3660,3661,3662],{"name":3454,"slug":3455,"type":15},{"name":3648,"slug":3649,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},"2026-06-08T08:17:50.666611",{"slug":3665,"name":3665,"fn":3666,"description":3667,"org":3668,"tags":3669,"stars":28,"repoUrl":29,"updatedAt":3678},"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},[3670,3673,3674,3677],{"name":3671,"slug":3672,"type":15},"Data Modeling","data-modeling",{"name":3546,"slug":3547,"type":15},{"name":3675,"slug":3676,"type":15},"Design System","design-system",{"name":3433,"slug":3434,"type":15},"2026-06-08T08:17:44.457834",{"slug":4,"name":4,"fn":5,"description":6,"org":3680,"tags":3681,"stars":28,"repoUrl":29,"updatedAt":30},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3682,3683,3684,3685,3686],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":26,"slug":27,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"slug":3688,"name":3688,"fn":3689,"description":3690,"org":3691,"tags":3692,"stars":28,"repoUrl":29,"updatedAt":3699},"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},[3693,3694,3695,3698],{"name":3625,"slug":3626,"type":15},{"name":3605,"slug":3606,"type":15},{"name":3696,"slug":3697,"type":15},"Logs","logs",{"name":13,"slug":14,"type":15},"2026-05-10T05:48:11.267642"]