| Content absolutely-positioned to match rects; dead right gutter off-1440 | Layout law: rebuild in flow/grid; rects are targets, not coordinates; run --widths sweep |
responsive-check passes only after adding overflow-x:hidden/clip | root overflow is concealing content; inspect responsive-visible-ratio, fix fixed tracks/breakpoints, and rerun 320–1728 widths |
| Text/UI-contaminated raster crop reused as a background | rule 23: regenerate or replace a clean background plate; rebuild text/cards/charts as DOM layers; crop reuse is missing |
| Adopted crop is text-free only because it excludes the overlapped half of the room/scene | rule 27: set sourceFrameHasForegroundOverlap: true; the crop is forbidden unless a separate clean layered source exists. Regenerate/replace the full composition; G9 blocks completion. |
| Structural copy shipped as a generated lettering image | rule 5: only non-structural decorative callouts/signatures can be lettering-decal; headings/CTA/nav/body/legal stay HTML/CSS |
| Fixed header or vertical logo stuffed into hero flow to match the FV | Phase 1 ownership ledger: classify as viewport-fixed/global UI, manifest positioning: "fixed" or sticky, then preserve responsive behavior |
| Photo-led region reclassified to svg/UI or dropped, then scored "adapted" | rules 24–25: declare it mediaClass: photo, attempt generation to a file first; a removed/reclassified photographic subject is missing, not adapted; gate G8 catches it |
| Generator available but never invoked ("couldn't verify output" → skipped) | rule 25: run the raster generator to a file, then verify; only a recorded failed attempt earns stock/placeholder |
| Prompt file was written after image generation | run prompt_receipt.py issue before the generator and adopt after output; retrospective summaries and stale receipts block pre-CSS |
| Agent draws a photo/illustration with SVG/CSS/Canvas/Pillow and saves PNG | invalid fake asset — delete/reject it; use image generator / licensed stock / owned clean asset / placeholder+ask |
| Many elements fail diff at once | cascade — fix ONLY first_fix, re-render |
box_diff.py crashes because bbox was written as [x,y,w,h] | Start from the hybrid manifest template and run contract_doctor.py --phase pre-css; bbox is always an object {x,y,w,h}. Direct box_diff now emits a blocked JSON report instead of a traceback. |
| Sticky/fixed header outside a section gets a fake section-relative y delta | Declare placementScope: viewport-fixed|viewport-edge, positioning: sticky|fixed, viewport anchor, and mobile behavior; box_diff compares it in viewport-global coordinates. |
| FV heading block suddenly grows after its container narrows | Record typeSpec.expectedVisualLineCount; record expectedRunCount separately when script runs exist. visual-check raises typography-line-count when wrapping changes. |
| FV heading has the right two lines but reads as a dense black lump | Line count is insufficient: measure posterGeometry from the source, compare line bboxes, block-height ratio, line-advance ratio, and signed interline gap on the first render; do not author below-FV DOM until these pass. |
| Parent heading bbox passes but the characters still look small/timid | Run typography_geometry.py on matched source/build ROIs; repair ink bounds/density and per-line widths instead of enlarging the parent or widening tolerance. |
| Source glitch/distress was reduced to generic CSS noise or copied from the comp | Set rasterTexture.required:true, route raster-texture-reconstruction, keep structural text live, rebuild a content-free effect, and bind desktop/mobile crop pairs plus metrics in raster-texture-report/v1. |
0円 or another numeral/unit lockup visually collides | Manifest the numeral and unit as separate scriptRuns, record their source edge gap in runPairGaps, and let typography-run-gap govern margin/spacing. |
| Japanese trainer/title label breaks into several stacked fragments | Use native writing-mode, white-space:nowrap, and measured verticalFlow; manifest each independently styled vertical column rather than only the parent group. |
| Lead text is slightly slanted but CTA bevels use another angle | Bind both through one geometryRelationships shared-angle row; compare line-start-axis to the parsed clip-path edge at canonical width. |
| Box diff passes but page looks nothing like comp | manifest back-filled from own render (rule 9) — re-measure from comp |
| Page reads as stacked slides | Declare pageComposition section strategies + every adjacent seam, make bottom-edge ownership explicit, capture seam evidence, then run page_flow_check.py; equal frame-height slabs trigger W4/G10 |
| FV and next section are separated by a smooth wave but still feel like two slides | source requested continuity → route seamless-section-waves, set seam continuity.required:true, compose outgoing environment + opaque target surface + connective motif + incoming preview, then prove desktop/mobile crops and destination-color samples |
| Specific motif became generic shapes | rule 11; inventory content-level rows; verdict missing |
| Detailed line art/UI/card composites became emoji, dingbats, or one repeated white-card shell | rule 45: freeze renderingCraft traits and atomic parts before CSS; bind the real device rows; generic-symbol-standin is a hard visual-check failure unless the source itself evidences a text glyph |
| Static card art was split into laptop, phone, screens, torus, plinth, and shadows with no independent behavior | rules 38/45: use one card_artwork_plate; keep the outer shell/label in CSS and record observed atomicParts plus keepTogetherReason |
| Hero scene that owns the whole visual field was reduced to a right-side image card and cropped | rule 38: sourceTopology=section_field, generate one full_field_scene_plate with measured copy space, asset-owned bleed and four-edge policy; do not proceed to CSS with the framed asset |
| Paper object, exploded layers, or audience collage sits inside a generator-white rectangle | rule 38: sourceTopology=floating_scene, regenerate one transparent_scene including coupled objects and soft shadow; opaque output returns to image generation |
| Complex people/emotion/object icons look amateurish after hand-authored SVG tracing | rule 46: reclassify composite editorial icons as illustration; generate one style-bound chroma sprite for the family, remove the key, extract transparent consumer PNGs, and keep CSS surface ownership outside the raster |
| A generated sprite was divided into equal widths and an icon is clipped or contains part of its neighbor | rule 46: reject arithmetic slicing unless verified against pixels; run split_sprite.py with the expected count, inspect its measured clusters, and require zero alpha on every output cut edge |
Review says present, render shows it broken | rule 14: crop-pair evidence for every verdict |
| Self 8/10, user 5/10 | rule 18 calibration; re-judge from pairs; independent review if possible |
| Every section scored exactly 7 (the pass bar) | uniform-threshold scoring — gate warning W1; re-judge from pairs with impression metrics in hand |
| box 4/23 + pixel needs_work narrated as "hybrid residual", reported 完了 | rule 20: run completion_gate.py; headline = its status (prototype), list the top-5 visible gaps |
| Comp copy 実行 shipped as 実装; no check fired | rule 21 copy proof: transcribe from ≥2× zoom crop, re-verify glyph-by-glyph against the build crop |
Mixed heading like AI駆動型へ feels wrong though bbox is close | rule 22: split into span-level runs, measure optical height ratios vs anchor kanji, tune size/baseline/tracking |
| Heading passes bbox but looks stretched/condensed and collides below | rule 28: remove structural-text transforms; repeat class-matched font bake-off, then tune size/weight/tracking/leading and flow clearance |
| Organic blue/green field became flat bands or a polygon | record decorativeCraft and reproduce the curve/gradient topology with SVG/CSS gradient or a clean generated decorative raster |
| Staggered photo cards look like identical rows with pasted photos | preserve per-card offsets and cardPhotoIntegration; match card/photo ground tone and dissolve only the comp-visible edges |
| Generated object image already contains a rounded panel, then CSS wraps it in another card | declare assetSurfaceContract; generate one semantic asset per consumer with no baked panel/padding/radius when CSS owns the surface; prove isolated asset + crop-in-use |
| Opaque artwork looks clean alone but creates double padding or a paper-color seam in the card | declare surfaceIntegration; inspect real PNG alpha/outer bands/content bounds/edge RGB. Regenerate as alpha_floating, bleed or mask the plate, tone-match the edge, or preserve a frame only when the source visibly has one |
Manifest calls a source-floating scene contained_artwork after generation because alpha was difficult | source topology is frozen from the comp, not chosen from output convenience; asset preflight blocks the mismatch and returns to generation |
| Oversized background 「聴」 paints over the heading | manifest the glyph with data-el, zLayer, and mustStayBehind; unregistered large absolute text fails visual-check |
| Japanese heading strands 「て」/「へ」/unit on its own line | declare responsiveLineContracts; compare actual rendered line strings and forbidden orphan fragments at each width |
| Rounded framed photo section has a page-wide veil | assign the veil/photo to the frame clipOwner; apply radius/overflow/mask at that owner, not the section root |
| CTA person is cramped into the right half | reclassify the source topology: generate a full-frame plate with copy space, or separate environment + subject cutout when the comp requires independent placement |
| FV measured, residuals logged, below-FV built anyway | rule 19: FV converges first — 3–5 FV-scoped box iterations before any below-FV CSS |
| Requested reveal/flow motion became hover lifts or smooth scroll only | rule 36: record one or two source-backed motifs, test real runtime events, reduced motion and JS-off visibility; broken/placeholder CTA destinations fail motion QA |
| visual-check passes but crop pairs / asset proof / bbox ledger are thin | rule 26: run artifact_check.py; needs_work leads the report, blocked stops completion |
section-scores.json was keyed by section and artifact_check crashed | Copy templates/section-scores.min.json; sections and dispositions are arrays. The completion doctor and downstream gates now return blocked evidence instead of a traceback. |
FV pixel diff says good after masking most of the frame | rule 32: check comparison_coverage; reduce masks or honestly report pixel evidence unavailable |
| Regenerated full-frame hybrid photo yields a meaningless high pixel diff | rerun current pixel_diff.py --manifest; generated/replaced FV photo regions are auto-excluded. A fully regenerated plate reports not_applicable_generated_media and remains bound to asset, impression, crop-pair, box, and artifact gates. |
| Full-frame generated photo makes every foreground device disappear from pixel QA | Mark only opaque source-comparable foreground shells pixelDiffForeground: true; text remains masked. The contract doctor blocks a full-frame generated FV with foreground devices but no carve-out. |
Distinctive dots, icons, arrows, or micro-props all become adapted while the page completes | Bind every Phase 1 row through detailInventory → disposition.inventoryId; the source-specific adaptation ratio and independent crop review prevent blanket simplification. |
| Comp device waived "because the handoff prioritizes X" | self-waiver: waived needs the user's verbatim words |