IMP-04 F17 schema correction — paired_rows_4x2 + pill alternation + source-faithful theme

source = 8 atomic issues (4 paired rows × 2 cells per texts.md), 이전 strict-4
가 source 의 절반 누락. round 55~73 review-loop 의 calibration frame.

- contract : source_shape=top_bullets / layout_variant=paired_rows_4x2_alternating_pills
  / strict 8 (no pad/truncate) / role_order row_{1..4}_{left,right} / visual_hints
  pill_positions + row_gap_after / builder paired_rows_4x2_slots
- builder : new _build_paired_rows_4x2_slots — 2-axis (row × side) deterministic
  index mapping, strict 8 raises before render, quadrant_item parser 재사용
- partial : 4-row × 2-cell flex, pill alternation (row 1/3 top, row 2/4 bottom
  via column-reverse), row 2-3 visual gap, source-faithful color (rgb(204,82,0)
  →rgb(136,55,0) title + #60A451 row border + rgba(250,237,203,0.15) bg + #0c271e
  body + 2px dashed #60A451 cell 분할선), pill = CSS approximation (asset crop
  variant single-pass 비용 高 → fallback per Codex round 62/68 scope cap, pill
  shape + alternation + green/cream/brown theme 보존), no row headers (source
  부재, inference 금지)
- fixture : flat 8 top-bullet (texts.md 8 issues 그대로)
- smoke + R3 : PASS (11/11 self-check, 5535 chars partial, 8 units rendered,
  pill alternation 정합, row 2-3 gap, no invented row headers)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 15:13:46 +09:00
parent 5c27c492ba
commit 73a98b8ad1
4 changed files with 246 additions and 122 deletions

View File

@@ -635,68 +635,95 @@ sw_reality_three_emphasis:
bim_current_problems_paired:
# Reason : V4 RS=1 (4 MDX sample 안 restructure 1). 32-frame all-in scope —
# **catalog-completeness activation** (NOT V4 endorsement — V4 신호 유효 단 restructure
# tier 이며 직접 use_as_is/light_edit 추천 없음).
# Pattern : cards/paired-rows-2x2 — 4 problem cards in 2x2 grid (BIM 수행 4 문제).
# Track A frame 8. Builder 재사용 = `quadrant_flat_slots` (F16 pattern, pad_to=4).
# Reason : V4 RS=1 (4 MDX sample 안 restructure 1). source 가 8 atomic issues 임을 confirm.
# **schema-correction** — round 55~73 의 review-loop 의 calibration frame.
# 자체 round 71 §4 F17 done-definition lock per Codex round 70/72 + Claude round 63 §5.
# Pattern : cards/paired-rows-4x2 — 4 paired rows × 2 issue cells (top/bottom pill alternation).
# Track A frame 8. 신규 builder = `paired_rows_4x2_slots` (quadrant_flat_slots → 2-axis).
template_id: bim_current_problems_paired
frame_id: 1171281194
family: cards
source_shape: top_bullets
source_shape: top_bullets # mapper split_source allow-list 정합 (Codex round 60)
layout_variant: paired_rows_4x2_alternating_pills # runtime projection model
cardinality:
strict: 4 # 4 issues (2x2 grid)
strict: 8 # 8 atomic issues (4 rows × 2 cells per source texts.md)
overflow_policy: abort_or_review
# row × side deterministic mapping per Codex round 70 §1.
role_order:
- issue_1
- issue_2
- issue_3
- issue_4
- row_1_left
- row_1_right
- row_2_left
- row_2_right
- row_3_left
- row_3_right
- row_4_left
- row_4_right
# min_height_px : F16 (quadrant 4) 와 동등 class.
# 2 row × 2 col × (label 24 + body 60) + title 30 + gaps + padding = ~280 + buffer 70 = **350**.
# min_height_px : provisional 380 (8 cells + title + gaps), smoke 후 1 회 조정 가능.
# pill_positions : source index.html line 161~225 의 row-별 pill 상/하 alternation (top/bottom/top/bottom).
# row_gap_after : source line 199-200 의 `<div class="row-gap">` (행 2-3 사이 시각 단락) per Codex round 58 §3.
visual_hints:
min_height_px: 350
min_height_px: 380
pill_positions: [top, bottom, top, bottom]
row_gap_after: [2]
accepted_content_types:
- text_block
sub_zones:
- id: issue_1
- id: row_1_left
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(1)"
- id: issue_2
partial_target_path: ".f17b__row:nth-child(1) > .f17b__cell--left"
- id: row_1_right
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(2)"
- id: issue_3
partial_target_path: ".f17b__row:nth-child(1) > .f17b__cell--right"
- id: row_2_left
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(3)"
- id: issue_4
partial_target_path: ".f17b__row:nth-child(2) > .f17b__cell--left"
- id: row_2_right
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__grid > .f17b__cell:nth-child(4)"
partial_target_path: ".f17b__row:nth-child(2) > .f17b__cell--right"
- id: row_3_left
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__row:nth-child(3) > .f17b__cell--left"
- id: row_3_right
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__row:nth-child(3) > .f17b__cell--right"
- id: row_4_left
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__row:nth-child(4) > .f17b__cell--left"
- id: row_4_right
role: main_text
accepts: [text_block]
cardinality: { strict: 1 }
partial_target_path: ".f17b__row:nth-child(4) > .f17b__cell--right"
payload:
title:
source: section.title
# Builder 재사용 = `quadrant_flat_slots` (F16 pattern, pad_to=4).
# F16 = TL/TR/BL/BR quadrant. F17 = paired-rows-2x2 (top-left/top-right/bottom-left/bottom-right).
# 차이 = key prefix only ("quadrant_N" vs "issue_N"). partial layout 동일 2x2 grid.
builder: quadrant_flat_slots
# 신규 builder quadrant_flat_slots 와 차이 : 1-axis (TL/TR/BL/BR) → 2-axis (row × side).
# strict 8 + no pad/truncate (silent loss 차단, Codex round 60 §3).
# parser = quadrant_item 재사용 (label + body heading-less, Codex round 60).
builder: paired_rows_4x2_slots
builder_options:
item_parser: quadrant_item # 재사용
pad_to: 4
truncate_at: 4
label_key_pattern: "issue_{n}_label"
body_key_pattern: "issue_{n}_body"
empty_label: ""
empty_body: []
item_parser: quadrant_item
label_key_pattern: "row_{r}_{side}_label"
body_key_pattern: "row_{r}_{side}_body"
rows: 4
sides: [left, right]