# Issue #49 — u2 spot-check: Step 14 visual_check event surfacing schema **Run context** - HEAD = `614c53358ecaa92e9f6fc979b2399da028e15d41` (main, post-실행-4) - Representative slide = `samples/mdx/03. DX 시행을 위한 필수 요건 및 혁신 방안.mdx` (memory lock: project_mdx03_frame_lock; rank 1/2 sample) - Run id = `issue49_u2_spotcheck` - Run dir = `D:\ad-hoc\kei\design_agent\data\runs\issue49_u2_spotcheck\phase_z2\` - Invocation (verbatim, no flag drift): `python -m src.phase_z2_pipeline "samples/mdx/03. DX 시행을 위한 필수 요건 및 혁신 방안.mdx" issue49_u2_spotcheck` **Run outcome (CLI banner verbatim)** - preset = `horizontal-2` (2 units, count-based v0) - unit 1 = `['03-1']` → frame 13 `three_parallel_requirements`, label=`use_as_is`, score=0.927 - unit 2 = `['03-2']` → frame 29 `process_product_two_way`, label=`use_as_is`, score=0.920 - zones height = `[228, 343] px` / ratios `[0.39, 0.586]` - final.html written; visual check = PASS; status = PASS **Schema axis 1 — top-level `image_events`** - path = `data\runs\issue49_u2_spotcheck\phase_z2\debug.json#/image_events` - present? → **YES** - type = `list`, len = 0 - mirrors `visual_runtime_check.image_events` → True - Reason for empty: MDX 03 contains no image content_objects in either zone; the surface is the schema lift, not the event payload. Per 614c533 commit body: write_debug_json now lifts `image_events` to top-level via `(visual_runtime_check or {}).get("image_events", [])`, mirroring the pre-existing `zone_geometries_px` surfacing precedent. **Schema axis 2 — top-level `table_events`** - path = `data\runs\issue49_u2_spotcheck\phase_z2\debug.json#/table_events` - present? → **YES** - type = `list`, len = 0 - mirrors `visual_runtime_check.table_events` → True - Reason for empty: MDX 03 contains no `` elements in either zone; the surface is the schema lift, not the event payload. Same lifting pattern as `image_events`. **Schema axis 3 — spec taxonomy row (`image_aspect_mismatch`)** - path = `docs\architecture\PHASE-Z-FIT-CLASSIFIER-ROUTER-SPEC.md`, §3.1 (line 96) - present? → **YES** (1 row) - row text contains both required tokens: - `Post-render` → YES - `fail_reasons` → YES - semantic guardrail: row explicitly marks the signal as post-render Step 14 `visual_runtime_check` output, **NOT** a router-routed fit_classifier output, and points readers to the separate `image_events` stream — prevents future wiring into §3.2 priority list or §4 router action map. **top-level debug.json key inventory (post-실행-4)** `['v4_source', 'v4_label_to_phase_z_status', 'mvp1_allowed_statuses', 'mode', 'mode_note', 'layout_preset', 'layout_css', 'slide_status', 'fit_classification', 'router_decision', 'retry_trace', 'composition_planner_debug', 'zones', 'visual_runtime_check', 'zone_geometries_px', 'image_events', 'table_events']` **Verdict** - All 3 schema axes (image_events surface, table_events surface, spec taxonomy row) present and shaped exactly as 실행-4 commit (614c533) declared. - u2 = PASS (read-only spot-check; no source/test/doc code change).