834ed3946d
test(IMP-04): add F14 render artifact check and fix min-height note
...
3rd commit in F14 series (calibration point clean pass). Closes the two
Codex round 26 (#15435 ) blockers:
1. min_height_px self-contradiction
2. F14 actual rendered visual artifact absent
Per Codex round 28 (#15447 ) agreement (M1 + --render-to extension) and
Claude round 27 (#15438 ) fix path :
Changes :
1. templates/phase_z2/catalog/frame_contracts.yaml — min_height_px 320 → 350.
Comment now self-consistent : 70 (badge raster) + 210 (bullet body) +
36 (photo strip) + 30 (padding) = 346 sum + 4 safety buffer = 350.
F14 is now F29-class (345) per raster-promoted content density.
2. scripts/smoke_frame_render.py — add `--render-to DIR` dev mode (R3
acceptance gate). Behavior :
- StrictUndefined smoke render (unchanged)
- reuse production `copy_assets(template_id, run_dir)` so the runtime
asset delivery path is exercised (no logic duplication)
- wrap partial with minimal viewer HTML (Phase Z token vars + slide-
sized wrap, browser-openable)
- fail-fast if rendered HTML references a missing local asset (per
Codex round 28 §4 recommendation)
- save artifact to {DIR}/index.html with {DIR}/assets/{template_id}/*
- production render path (phase_z2_pipeline.render_slide) unchanged
- small regex fix : asset extraction now captures both `src="..."`
and `url("...")` references
F14 verification (3rd commit) :
- python -m py_compile scripts/smoke_frame_render.py : PASS
- python scripts/smoke_frame_render.py --self-check : PASS 4/4 (7446 chars
for persona unchanged from a1c06b7 )
- python scripts/smoke_frame_render.py three_persona_benefits --render-to
data/runs/imp04_f14_visual : PASS, 10 asset refs all resolved, 14
raster files copied via production copy_assets() to
data/runs/imp04_f14_visual/assets/three_persona_benefits/
- R3 artifact ready for browser visual inspection at
data/runs/imp04_f14_visual/index.html (Phase Z slide-sized wrapper +
promoted persona partial + 10 referenced assets all on disk)
F14 clean pass status :
- min_height_px self-consistency : fixed (M1 = 350)
- Actual rendered artifact : produced and assets resolved
- Visual fidelity inspection : ready for browser/eye review
- Earlier MDX02 chain attempt (commit a1c06b7 body) : superseded;
MDX02 is not the F14 validation baseline (Claude round 26 / Codex
round 26 agreement). MDX03 is the matched baseline; F14 visual
inspection now uses the harness artifact path instead.
scope-lock guardrails honored : 32-frame target, no V4 logic change,
no Phase R' regression, no mapper or composition planner change, no
production render path change. The new harness mode is dev verification
only, isolated from runtime selection.
Refs Gitea #4 (IMP-04 Track A — F14 3rd commit, clean pass gate)
2026-05-13 11:07:37 +09:00
556b4486ae
feat(catalog): activate three_persona_benefits frame (IMP-04 #4 / 1 of 7)
...
Reason : V4 use_as_is=1 (frame_number=14, frame_id=1171281191).
Pattern : cards-3col-persona — 발주자/시공자/설계자 3 주체 각 benefit.
- Append `three_persona_benefits` contract to frame_contracts.yaml after
the existing F13/F29/F16 entries (Codex Catch 1/4: YAML order = trace
selection surface)
- Reuse existing builder primitives: items_with_role + quadrant_item
parser. No new entry in PAYLOAD_BUILDERS / ITEM_PARSERS.
Output dict shape: payload.personas = [{label, body, color_class}, ...]
- Add families/three_persona_benefits.html partial:
- Pure CSS (no Figma raster img tags) per memory rule
`feedback_blocks_must_be_css.md`
- PROMOTED colors per persona (#285b4a client / #445a2f constructor /
#743002 designer) from Figma TEXT layers
- NOT PROMOTED: col_bg_texture / overlay / 하단 사진 / 원형 뱃지 inner-outer
image — all replaced by CSS approximation (pill badge + colored
border + check-style text-line bullets)
- Token-fixed typography (zone-title / sub-title / caption / body)
- data-frame-id="1171281191" data-template-id attributes
- Add bundled smoke fixture for three_persona_benefits to
scripts/smoke_frame_render.py
- visual_hints.min_height_px = 280 (initial estimate between F13=230 and
F29=345 for 3-card text-heavy layout). Refine during batch full
pipeline if needed.
- accepted_content_types = [text_block] only (rich types not routed yet
per IMP-03 scope-lock).
Verification :
- isolated Jinja StrictUndefined smoke (scripts/smoke_frame_render.py
--self-check) : PASS=4/4 (existing 3 + new persona, 3889 chars)
- regression run on MDX 03 (env OFF + rich OFF) : PASS — MDX 03 V4
rank-1 still F13/F29 so the new entry does not affect existing flow
scope-lock 15 conditions all honored (no V4 / mapper / Phase R' / Step
6+ changes; per-frame 6-step gate complete; YAML order preserved).
Refs Gitea #4 (IMP-04 A-2 Catalog 확장)
2026-05-13 06:56:35 +09:00
2717a0a3a6
feat(infra): per-frame Jinja smoke harness with StrictUndefined (IMP-04 #4 )
...
- Add scripts/smoke_frame_render.py for IMP-04 scope-lock §11+§13:
isolated StrictUndefined Jinja partial render gate, separated from
production render_slide() permissive behavior
- CLI: --self-check runs every bundled fixture; positional template_id
takes payload via --payload <json> / stdin / fixture
- Bundled mock payloads for the 3 existing active frames match real
builder output shape; all 3 partials PASS self-check
- New frame activation gate (per-frame 6-step Step 5): partial must
pass smoke render with a complete mock that mirrors the builder's
output dict (optional fields supplied as empty/falsy so {% if %}
guards still work under StrictUndefined)
- Exit codes: 0=all pass, 1=at least one fail, 2=invalid input
Latent finding (out of IMP-04 scope, surfaced for the record):
bim_issues_quadrant_four partial references slot_payload.quadrant_N_headline,
but _build_quadrant_flat_slots() only produces quadrant_N_label and
quadrant_N_body. The headline div therefore never renders in production.
Either dead reference or a builder extension that was never landed —
reconcile in a follow-up axis, not in IMP-04 catalog expansion.
production render path (phase_z2_pipeline.render_slide) unchanged.
Refs Gitea #4 (IMP-04 A-2 Catalog 확장 — infra commit)
2026-05-13 06:48:19 +09:00