핵심 요약
게이트 통과 · S+A
84/89
94.4% — FAIL 조건 통과
그중 SUCCESS
65/89
73.0% · method 9 적용
잔여 FAIL
5
겹침 2 · 정렬선 붕괴 3
평가 제외
11/100
성적 분모에서 빠짐
무엇을 했나
남는 공간을 재분배한다. 실제 도형 외곽선과 글자 영역으로 크기·간격·위치를 맞추고, 부족할 때만 글자를 줄인다.
무엇이 남았나
ACCEPTABLE 19건 중 정렬선 사유는 6건이고, 그 하나만 걸린 것은 4건이다. 가장 큰 잔여 사유는 유휴 여백 13건이다 — §12.
어떻게 읽나
자동 판정 통과율을 디자인 만족도나 상용 성공률로 읽지 않는다. 기계로 잴 수 있는 조건만 통과한 것이다.
최신 저장 채점 2026-09-01 11:38:59 KST · 평가 가능 89건 · 실제 글자 영역 실측 2026-08-31 19:01:03~19:01:20 KST.
원시값은 eval-out/runs/methods/adaptive-relayout/evaluation.json과 eval-out/runs/rescore-20260901e/panes.json을 직접 합산했다.
결과 — 무엇이 달라졌나
시각자료 먼저결과
넘침·겹침·좁은 칼럼을 줄이면서 정렬선도 회복했다.
method 9가 원안의 같은 변을 그룹으로 묶어 마지막에 다시 세운 결과다.
남은 대가는 폰트 축소 4건과 유휴 여백 증가 13건이며, 정렬선 0.60 미만 3건은 새 FAIL 바닥이 잡아낸다.
게이트 통과율은 (SUCCESS+ACCEPTABLE) 94.4%다. 넘침·겹침을 남기지 않고 내용을 담아냈다는 뜻이다. SUCCESS 는 73.0%다. method 9 전 같은 89건의 37.1%에서 35.9%p 올랐다 — §3에서 정렬선 개선을 분리해 본다. 두 숫자의 의미를 바꿔 쓰지 않는다.
기본 결함과 가독성 관련 전후 지표
| # | 지표 | Before | After | 해석 |
|---|---|---|---|---|
| 1 | 넘침 텍스트 노드 | 85개 | 0개 | 49개 케이스에 있던 넘침이 전부 사라졌다 |
| 2 | 신규 겹침 | 138쌍 | 2쌍 | 약 98.6% 감소했지만 2개 케이스에 잔존 |
| 3 | 좁은 칼럼 | 44개 | 9개 | 79.5% 감소, 7개 케이스에 남음 |
| 4 | 폰트 축소 없는 케이스 | 89/89건 | 85/89건 | 4건에서 축소 사용; 그중 2건은 0.90 이상이다 |
| 5 | 페이지 밖 텍스트 잘림 | 0개 | 0개 | 이번 코퍼스에서 새 텍스트 잘림 없음 |
| 6 | 정렬선 보존율 평균 | 0.930 | 0.943 | method 9로 회복. 0.80 미만 9건 · 중위 1.000 |
유휴 여백 > 원안
13
ACCEPTABLE 19건의 가장 큰 사유
정렬선 < 0.80
6
그중 4건은 이 사유 하나뿐
폰트 < 0.90
2
사유는 서로 겹칠 수 있음
사유별 건수는 중복 집계라 합이 19를 넘는다. 최신 Sol baseline은 같은 89건에서 SUCCESS 58 · ACCEPTABLE 23 · FAIL 6 · UNKNOWN 2다. UNKNOWN 2건은 baseline 결과가 없어 비교 분모에서 빠진다.
실제 사례
여기는 눈으로 보는 몫이다
기계로 잴 수 있는 제약(넘침·겹침·폰트·여백)은 §3에서 같은 평가자로 세 방식을 함께 채점했다. 이 절은 그 표가 답하지 못하는 것 — 줄바꿈, 정렬, 균형처럼 사람이 봐야 아는 품질을 실제 렌더 이미지로 확인하는 자리다. 자동 등급이 SUCCESS 인 사례에도 어색한 줄바꿈이 남아 있다.
배경을 넓혀 글자 크기를 지켰다 6447600
SUCCESS글을 줄이기 전에 남는 가로 공간을 쓴다.
한 장씩 크게 보기
아래 그림이 한 줄에 한 장씩 커집니다. 다시 눌러 나란히 볼 수 있습니다.
글자를 15% 줄여 담았다 6134657
ACCEPTABLE구조는 지켰지만 SUCCESS 기준 0.90 에 못 미친다 — 가독성을 양보한 결과.
한 장씩 크게 보기
아래 그림이 한 줄에 한 장씩 커집니다. 다시 눌러 나란히 볼 수 있습니다.
비교 — 최신 strict 채점과 역사 기록
같은 평가자최신 비교 — 통과율을 지키면서 정렬선도 회복했다
이 표가 답하는 것
통과율과 strict 등급
주지표는 게이트 통과율 (S+A)/89 — 넘침·겹침·과도 축소·정렬선 붕괴를 통과했는가다.
SUCCESS는 거기에 정렬선·폰트·여백까지 지킨 더 좁은 등급이라 따로 읽는다.
최신 저장 산출물에서 함께 확인되는 baseline은 Sol 한 열이다
Adaptive와 Sol baseline을 같은 채점기 · 같은 실측 글자 영역 · 같은 Original 좌표계로 다시 쟀다. Adaptive 분모는 89건이고, Sol은 결과가 없는 2건이 있어 비교 가능한 분모가 87건이다. 아래의 5-way 표는 8월 30일 역사 기록으로 분리한다.
| 최신 저장 판 | 게이트 통과 | SUCCESS | S / A / F / 미판정 | 분모 |
|---|---|---|---|---|
| Adaptive Relayout · method 9 | 84 / 89 · 94.4% | 65 / 89 · 73.0% | 65 / 19 / 5 / 0 | 89 |
| Sol baseline | 81 / 87 · 93.1% | 58 / 87 · 66.7% | 58 / 23 / 6 / 2 | 87 |
채점 시각 2026-09-01 11:38:59 KST. UNKNOWN 2건은 5546858·5698327의 baseline 결과 없음이며, Adaptive 성적에는 포함된다.
8월 30일 5-way 실험 조건 · 역사 기록
대상
5 방법 × 100건
공통 평가 89건
모델
opus-5 / sol-5.6
추론 강도 high
규칙
짧은 / 긴
해시 고정 · 도중 변경 없음
시도
1회 생성
되돌아가 고치는 반복 없음
“짧은 규칙”과 “긴 규칙”
짧은 규칙
relayout_rules.md
82줄 · 5.4KB — Before 와 After 가 각각 무엇인지만 정의한다.
- 0 · 용어 (컴포넌트 · 컨테이너 · bounding box)
- 1 · 입력과 생성 절차
- 2 · 불변 조건 — 개수·타입·내용·정렬·위상·배율 유지
- 3 · Before — 컨테이너 고정 · 넘침 · 폰트 축소 · 여백 낭비
- 4 · After — 크기·위치만 조정 · 여백 재분배 · 겹침 제거
- 5 · 시각화 관례 (파란 점선 = 컨테이너, 노란 점선 = bounding box)
긴 규칙
before-after-rules.md
1,275줄 · 97.6KB — 정의에 더해 어떻게 푸는지·어떻게 채점하는지까지 담는다.
- 0~1 · 30초 요약 · 문제 정의
- 2 · 불변 조건 — 폰트 동일 · 내접 · 안전 여백 · 정렬선 보존율 1
- 3 · 좌표계 주의
- 4 · 재배치 알고리즘 8절 — 가로 확장 · 넘침 · 겹침 · 유닛 내부 · 그리드 · 데코레이션
- 6~7 · 판정 기준 · 케이스 problems 유형 · 사람 눈 루브릭
- 8 · Expected 제작 스펙 (사람·LLM 공용)
| 대조 항목 | 짧은 규칙 | 긴 규칙 |
|---|---|---|
| 분량 | 82줄 · 5,397B | 1,275줄 · 97,636B (약 18배) |
| 재배치 방법을 알려주나 | 아니오 — 결과 상태만 정의 | 예 — 축별 해법과 순서까지 |
| 판정 기준이 들어 있나 | 아니오 | 예 — 0.90 / 0.70 경계와 지표 정의 |
길이만의 효과로 읽지 않는다. 두 문서는 분량뿐 아니라 내용·구체성이 다르고, 긴 쪽에는 이번 테스트 100건 중 44건의 ID가 과거 사례 설명과 함께 들어 있다.
제약 만족도와 생성 시간 — 2026-08-30 역사 기록
| # | 방법 | 통과 (S+A)/89 주지표 |
그중 SUCCESS 정렬선까지 지킨 것 |
S / A / F / 미판정 | After 생성 평균 | 시간 표본 After 생성분 |
결과 없음 |
|---|---|---|---|---|---|---|---|
| 1 | Adaptive Relayout | 96.6% | 37.1% | 33 / 53 / 3 / 0 | 0.16초 | 100/100 | 0 |
| 2 | Opus high · 짧은 규칙 | 82.0% | 55.1% | 49 / 24 / 16 / 0 | 97.27초 | 100/100 | 0 |
| 3 | sol-high · 짧은 규칙 | 79.8% | 43.8% | 39 / 32 / 16 / 2 | 64.91초 | 96/100 | 4 |
| 4 | Opus high · 긴 규칙 | 76.4% | 57.3% | 51 / 17 / 20 / 1 | 171.10초 | 96/100 | 4 |
| 5 | sol-high · 긴 규칙 | 76.4% | 59.6% | 53 / 15 / 15 / 6 | 97.48초 | 86/100 | 14 |
아래 5-way 표와 그림은 method 9·정렬선 붕괴 바닥(0.60) 적용 전 역사 기록이다. 최신 성적과 직접 비교하지 않는다. 한 줄에 분모가 둘이다 — 시간 표본은 평균 시간을 잰 건수(실제로 After 가 나온 것),
통과·SUCCESS는 평가 가능 89건 고정 분모다. Adaptive 가 100/100 인 것은 평가 제외 11건에도 After 를 만들었기 때문이다.
· sol 두 설정의 미판정에는 Sol 이 baseline 을 못 만든 5546858·5698327 이 들어 있다.
SUCCESS 73.0% — method 9가 정렬선을 다시 세웠다
정렬선 보존율 0.80 하한은 그대로 두고 알고리즘을 고쳤다. ACCEPTABLE은 53건에서 19건으로 줄었고, 정렬선 사유는 6건만 남았다. 임계값을 낮춰 등급을 올린 것이 아니다.
정렬선 < 0.80
6
ACCEPTABLE 19건 중 · 4건은 사유가 이것 하나
유휴 여백 > 원안
13
현재 가장 큰 잔여 사유
폰트 < 0.90
2
줄여서 담은 것
한 건이 두 사유에 걸릴 수 있어 합이 19를 넘는다. 정렬선 평균은 method 9 전 0.799에서 0.943으로, 중위는 0.832에서 1.000으로 올랐다.
임계값을 낮추지 않고 알고리즘을 고쳤다
method 9는 정렬 그룹을 원래 좌표로 되돌리지 않고, R·B는 최대값, L·T는 최소값으로 같은 선에 맞춘다. 어떤 상자도 좁아지지 않는 방향이라 앞 단계의 확장을 보존한다.
betterOf가 신규 겹침 → 넘침 → 폰트 → 정렬선 순으로 완성본을 비교해, 상위 지표가 나빠지는 맞춤은 그룹째 되돌린다. 실측상 나빠진 케이스는 0건이다.
긴 규칙은 통과율에서 두 모델 모두 손해였다
통과율이 Opus 82.0% → 76.4%, sol 79.8% → 76.4%로 떨어졌다. 동시에 시간은 Opus 97.27 → 171.10초, sol 64.91 → 97.48초로 늘었고, 결과를 아예 못 낸 건수도 sol 에서 4 → 14건으로 늘었다. 더 길고 구체적인 문서를 준 쪽이 더 오래 걸리고 더 낮았다. 다만 SUCCESS 만 보면 긴 규칙이 오히려 높다 — 한두 건 차이로 모델·규칙의 일반적 우열을 확정하지 않는다.
2026-08-30 시간 측정 경계 — method 9 적용 전 역사값
포함
알고리즘 — Before 투입부터 실측 보정 완료 After 반환까지. 반복 글자 측정 포함.
LLM — 호출 시작부터 답변 수신·공통 적용기로 After 를 만든 시점까지. 호출 프로그램의 시작·통신 시간 포함.
제외
입력 준비 · 외곽선 사전 추출 · Before 이미지 생성 · 최종 독립 채점 · 발표용 썸네일.
대기열에서 실행 전 기다린 시간도 제외한다. 따라서 “화면에 After 가 보일 때까지의 총시간”과는 다르다.
| # | 방법 | 전체 요청 평균 | After 중앙값 | After 95백분위 | 글자 실측 |
|---|---|---|---|---|---|
| 1 | Adaptive Relayout · method 9 전 | 0.16초 | 0.09초 | 0.60초 | 2.69회 / 생성 |
| 2 | Opus high · 짧은 규칙 | 97.27초 | 67.19초 | 296.89초 | 최종 채점 시 공통 실측 |
| 3 | sol-high · 짧은 규칙 | 64.28초 | 58.35초 | 153.11초 | 최종 채점 시 공통 실측 |
| 4 | Opus high · 긴 규칙 | 166.64초 | 155.74초 | 389.68초 | 최종 채점 시 공통 실측 |
| 5 | sol-high · 긴 규칙 | 88.47초 | 92.71초 | 191.26초 | 최종 채점 시 공통 실측 |
이 시간 표는 최신 성능값이 아니다
method 9의 실측 경로는 예측판 확인과 글상자 정렬 검증을 더해 케이스당 렌더 예산을 최대 6장으로 둔다. 최신 89건의 평균·중앙값·p95는 저장 산출물에 기록되지 않아, 위 0.16초를 오늘 판의 실행시간으로 재사용하지 않는다.
LLM 두 규칙은 원안 글자 크기를 요구하고 알고리즘은 정책 하한까지 줄일 수 있다 — 현재 방식 전체의 비교이지 모델의 추론 능력만 분리한 비교가 아니다.
알고리즘의 실측 반복 보정 대 LLM 의 1회 생성을 비교한 것이다. 각 LLM 케이스는 한 번만 실행했고, 네트워크·부하·동시 실행의 영향을 받으므로 평균 시간을 모델 고유 상수나 운영 SLA 로 쓰지 않는다.
Adaptive Relayout 의 실행 경로에는 LLM 호출이 없다. LLM 은 이번 비교의 baseline 생성과, 그와 별개인 개발·평가용 Expected 예시 작성에만 쓴다.
과정과 디테일
10분접근 — 구조를 지키고, 남는 공간을 필요한 곳에 준다
문제 정의는 한 문장으로만 짚습니다. 글은 바뀌었는데 공간 배분이 그대로이기 때문에, 한쪽은 넘치고 다른 쪽은 비어 있습니다. 우리가 바꾸는 것은 내용이 아니라 그 배분입니다.
이번 접근에서 먼저 정한 세 가지
- 변경할 수 있는 것과 없는 것을 나눈다. 텍스트와 배경 도형의 폭·높이·위치·간격을 조정합니다. 내용, 노드 집합, 부모·자식 구조와 그리는 순서는 유지하며 사진·차트 자체를 늘려 문제를 숨기지 않습니다.
- 문제를 축과 관계로 나눈다. 가로 넘침, 세로 넘침, 한 카드 내부 충돌, 카드 사이 충돌은 각각 다른 방법으로 풉니다.
- 후보를 만든 뒤 실제 렌더로 검증한다. 좋아 보이는 숫자만 보고 채택하지 않고, 실제 글자 영역으로 넘침·겹침이 남는지 확인합니다.
예전 tidyLayout에서 배운 점: 모든 요소를 힘으로 동시에 밀고 당기는 방식은 확장·정렬·균형의 목표가 충돌했고, 튜닝을 판정할 기준도 부족했습니다. 현재는 먼저 제약과 지표를 정의하고, 목적별 후보를 제한된 범위에서 적용합니다. 이 설명은 과거 실험 기록이다.
함께 움직일 단위를 먼저 정한다
유닛은 배경 도형과 그 안의 글처럼 함께 움직이는 최소 단위입니다. 같은 줄은 밴드, 같은 열에서 공간을 다투는 단위는 체인, 그 전체를 담는 큰 도형은 프레임으로 다룹니다.
이 관계를 먼저 고정하면, “무엇과 무엇이 한 묶음인가”가 이동 도중 바뀌지 않습니다. 그다음 여백을 나누고 겹치지 않게 배치하되, 가능한 한 원래 자리에서 덜 움직이는 해를 구합니다. 모든 레이아웃을 전역 탐색하는 방식은 아닙니다.
파이프라인 — 크기·충돌·축소를 끝낸 뒤 정렬선을 다시 세운다
현재 UI 의 기본 선택은 Adaptive Relayout(adaptive-relayout)이다.
후보 아홉 개를 가로 넘침 → 세로·가로 재분배 → 유닛 내부 → 유닛 간 → 세로 여백 → 가로 여백 → 폰트 축소 → 정렬선 복구 순으로 잇는다.
| 순서 | 함수 | 하는 일 |
|---|---|---|
| 1 | resolveHorizontalOverflow | 가로 넘침을 줄인다 |
| 2 | balanceSlackToFixedPointredistributeVerticalSlack ↔ openHorizontalSlack | 세로 여백 재분배 ↔ 가로 폭 확장을 번갈아 |
| 3 | separateOverlapsWithinUnit | 한 유닛 안의 텍스트 겹침 정리 |
| 4 | separateOverlapsBetweenUnits | 유닛 사이 밴드 분리 |
| 5 | spreadIntoVerticalSlack | 세로 빈 공간으로 펼치기 |
| 6 | escapeIntoHorizontalSlack | 가로 빈 공간으로 빼기 |
| 7 | shrinkFontToReadableFloor | 그래도 안 되면 폰트 축소 |
| 8 | keepGuides · method 9 | 원안에서 같은 변에 있던 정렬 그룹을 마지막에 한 선으로 복구 |
함수 이름이 번호에서 서술형으로 바뀌었다. 아래 도해의 M1~M9 은 개발 식별자이며 실행 순서가 아니다 — 실행 순서는 위 표의 「순서」 칸이다.
method 9 · 선은 옮겨도 되고, 흩어지면 안 된다
원안에서 L·R·T·B 변이 같은 노드를 정렬 그룹으로 묶고, 현재 문서에서 깨진 큰 그룹부터 복구한다. 목표선은 R·B 최대 · L·T 최소라 어떤 상자도 좁아지지 않는다.
예측 경로는 줄바꿈 실측이 낡지 않도록 배경 도형만 늘리고 글상자는 자리만 비킨다. 실측 경로는 엔진으로 다시 굽고 판단할 수 있어 글상자까지 맞춘다. 예측판 확인 → 일괄 정렬 → 필요 시 큰 그룹부터 개별 정렬 순으로 시도하며 렌더 예산은 케이스당 최대 6장이다.
예측은 남아 있다
“LLM 호출이 없다”는 맞지만 “예측 계산이 전혀 없다”는 현재 코드와 다르다. 폭 확장(M2)·폭 축소 분기(M3)·폰트 축소(M6)에서 문자폭 계수와 줄바꿈 규칙으로 줄 수를 추정한다.
LLM 추론이 아니라 코드에 고정된 근사 계산이다. 확인일 2026-09-01.
최종 판정은 실측
후보의 크기·위치를 바꾼 뒤 실제 글자 영역으로 다시 확인한다. 정확한 설명은 “기하 규칙과 일부 줄바꿈 예측으로 후보 생성 → 실측 재검증·보정”이다.
반복 종료가 무결함을 보장하지 않는다 — 미해결도 그대로 판정한다.
무엇을 렌더링으로 재검증하는가
| 대상 | 자료를 얻는 방식 | 재배치 중 하는 일 |
|---|---|---|
| 컨테이너·배경 도형 외곽선 | 리소스 SVG·이미지를 사전 래스터화하고 윤곽을 추출해 저장 | 저장된 외곽선을 현재 위치·크기·회전 등에 맞게 변환해 재사용. 반복 루프에서 원본을 다시 렌더해 추출하지 않음 |
| 텍스트 tight bounding box | 실제 폰트와 엔진의 DOM 기반 글자 측정기로 계산 | 후보 적용·내부 충돌 보정·이동·폰트 축소 후 다시 실측. 반복 검증 포트가 반환하는 값은 이 글자 영역 |
| 넘침·겹침·정렬·여백 및 최종 등급 | sheetJson + 위 기하 자료로 코드가 계산 | 별도 종류의 렌더링 측정이 아니라, 같은 좌표와 실측값을 재사용한 검사 |
CLI 의 “렌더 횟수”는 문서 단위 글자 측정 호출 수다 — 페이지 썸네일을 만든 횟수가 아니다. 반복 보정에는 실측 tight 에 글머리 기호를 더한 visual 영역을 쓴다.
측정 — 사각형 프레임이 아니라 실제로 보이는 영역을 잰다
도형의 바깥 사각형 안에 들어왔다고 실제 도형 안에 들어온 것은 아닙니다. 원·캡슐·말풍선의 모서리와 구멍까지 고려합니다. 텍스트도 저장된 박스 대신 엔진이 잰 글자 영역(tight)에 글머리 기호 몫을 더한 visual 영역으로 판정합니다.
기준은 항상 대치 이전 Original입니다. Before는 재배치 입력, After는 알고리즘 결과, Expected는 비교 목표입니다. Expected와 After의 이미지 유사도를 점수로 쓰지 않습니다. 원안과 대치 문서의 좌표·배율을 맞춰 같은 자로 비교합니다.
일곱 가지 관찰 항목과 판정에서의 역할
| # | 항목 | 무엇을 측정하나 | 판정에서의 역할 |
|---|---|---|---|
| 1 | 넘침 | 글자 영역이 자기 컨테이너/페이지를 벗어난 노드 수·면적 | FAIL 게이트 · 원안보다 악화했는가 (면적은 110%까지 봐준다) |
| 2 | 최소 폰트 배율 | 원안 대비 가장 많이 줄어든 텍스트의 비율; 평균이 아님 | FAIL 게이트 0.70 · SUCCESS 조건 0.90 |
| 3 | 정렬선 보존율 | 원안에서 나란했던 노드 쌍이 같은 선 관계를 유지한 비율 | SUCCESS 조건 · 0.80 이상인가 (미달이면 FAIL 이 아니라 ACCEPTABLE) |
| 4 | 유휴 여백 | 콘텐츠가 덮지 않은 페이지 비율; 전면 배경은 제외 | SUCCESS 조건 · 원안 이하인가 |
| 5 | 신규 겹침 | 원안에 없었거나 원안보다 커진 겹침 쌍 | FAIL 게이트 · 의도된 원안 겹침과 구분 |
| 6 | 좁은 칼럼 | 2줄 이상인데 줄당 글자 수가 3자 미만인 텍스트 | 참고 지표 · 가독성 검토 대상 |
| 7 | 페이지 잘림 | 페이지 밖으로 나가 실제 화면에서 잘리는 요소 | 참고 지표 · 절대량; 최종 등급에는 아직 미반영 |
측정의 의미: 겹침 총량과 “새로 늘어난 겹침”은 다릅니다. 디자인에 원래 있던 겹침은 보존하되 대치·재배치가 악화시킨 부분을 검출합니다. 저장 결과는 문서 해시와 연결된 실측 파일로 검증하므로, 다른 문서의 오래된 측정값을 성공 근거로 쓰지 않습니다.
판정 — FAIL 게이트 넷을 먼저 거르고, 통과 결과를 SUCCESS 조건 셋으로 나눈다
이 도해의 정본은 코드다 —
relayout-core/verdict.ts 의
judgeMetrics 와 상수 EXCESSIVE_FONT_SCALE=0.7 · SUCCESS_FONT_SCALE=0.9 ·
EXCESSIVE_GUIDE_KEPT=0.6 · SUCCESS_GUIDE_KEPT=0.8 · OVERFLOW_AREA_TOL=0.1 · VERDICT_EPS=5e-4 를 그대로 옮겼다.
이 페이지의 최신 수치는 워크스페이스 HEAD 3095b6596 · 채점 2026-09-01 11:38:59 KST 기준이다.
라벨은 다섯 개다 — UNSOLVABLE 과 UNKNOWN 은 다르다
위 도해가 가르는 것은 SUCCESS·ACCEPTABLE·FAIL 셋이다. 나머지 둘은 잰 값으로 가른 결과가 아니다.
UNSOLVABLE 은 알아본 결과 규칙 안에서 답이 없는 것이고,
UNKNOWN 은 아직 못 잰 것(지표가 없거나 견줄 원안이 없다)이다.
「더 볼 것이 없다」와 「아직 안 봤다」를 한 칸에 섞지 않으려고 나눠 둔다.
평가 제외와 실패를 섞지 않는다
수집
100
전체 케이스
평가 가능
89
성적의 분모
평가 제외
11
분모에서 빠짐
UNKNOWN
0
측정 누락 없음
측정 파일 누락·손상이나 기준 부재는 제외로 숨기지 않고 UNKNOWN 으로 남겨 분모에 포함한다 — 현재 0건이다. 전체 수집 기준으로는 게이트 통과 84/100, 평가 제외 11/100, 잔여 FAIL 5/100으로 함께 읽어야 한다.
UNSOLVABLE 11건은 왜 빠졌나 — 세 갈래로 나눈다
제외는 알고리즘이 실패한 것이 아니다. 11건 모두 성적 분모 89에서 빠지지만, 빠진 이유는 서로 다르고 고쳐야 할 곳도 다르다 — 앞단(대치)에서 막을 것, 범위를 넓혀 풀 것, 측정 도구를 고칠 것.
| 갈래 | 건수 | 기계 라벨 | 대표 케이스 | 어디를 고쳐야 하나 |
|---|---|---|---|---|
| 대치 오류 | 7 | REPLACEMENT_ERROR | 5694141 | 앞단 — 컴포넌트 선택·슬롯 매핑·용량 검사 |
| 분절형 컨테이너 | 3 | SEGMENTED_CONTAINER | 6858981 | 컨테이너가 한 조각이 아니다 — 합성·중첩 도형 지원 |
| 폰트 없음 | 1 | FONT_UNAVAILABLE | 6885277 | 서체 배포 — 폰트 키가 측정 환경에 없다 |
대치 오류 5694141
REPLACEMENT_ERROR본문이 95.7px 숫자 표식 슬롯에 대치돼 13줄이 됐다. 페이지에 본문용 슬롯이 따로 있는데 긴 설명이 번호 자리에 들어갔다 — 위치·크기로는 못 푼다.
분절형 컨테이너 6858981
SEGMENTED_CONTAINER리소스 polygon 이 3조각이라 외곽선 추출이 unsupported-topology 로 떨어진다. 컨테이너가 한 조각이 아니라 막힌 것이고 — 배치가 불가능해서가 아니다.
라벨을 사유대로 다시 갈랐다 — OUT_OF_CURRENT_SCOPE 는 비었다
「현재 범위가 좁아서」로 묶여 있던 것들이 실은 다 다른 사유였다.
6672017·6370048 은 컨테이너가 분절형이라 막힌 것이고(외곽선으로 빠져 있던 6858981 도 같은 뿌리다),
6553655 는 범위를 넓혀도 문장을 놓을 자리가 없어 대치 오류다.
5546858·5698327 은 알고리즘이 이미 담아내고 있어 평가 대상으로 올렸다 — 분모가 88 에서 89 가 된 이유다.
합계는 7 + 3 + 1 = 11 이다.
제외 11건 전체 — 5108314 · 5694141 · 6138289 · 6370048 · 6553655 · 6577997 · 6672017 · 6780937 · 6805703 · 6858981 · 6885277
남은 FAIL 5건 — 겹침 둘과 정렬선 붕괴 셋
method 9가 5699884의 정렬 그룹을 다시 세우며 신규 겹침 2쌍을 없애 SUCCESS로 바꿨다.
최신 FAIL은 서로 다른 두 갈래다. 겹침 2건은 기존 겹침을 밀어 키운 증가분이 게이트에 걸렸고,
정렬선 붕괴 3건은 새 바닥 0.60이 이전 ACCEPTABLE을 FAIL로 드러낸 것이다.
케이스별 다음 점검 지점
| 순서 | 문제 유형 | 케이스 ID | 걸린 값 | 다음 점검 |
|---|---|---|---|---|
| 1 | 기존 겹침 증가 | 6690122 |
1쌍 · 3,633px² | 확장 뒤 관련 쌍의 증가분을 최종 채택 조건으로 되돌려 검사 |
| 2 | 기존 겹침 증가 | 6248263 |
1쌍 · 399px² | 부모–자식 도형의 실제 침범과 측정 경계를 분리해 판정 |
| 3 | 정렬선 붕괴 | 5628689 |
0.415 < 0.600 | 상위 넘침·겹침을 다시 만들지 않는 복구 후보가 없음 |
| 4 | 정렬선 붕괴 | 5546858 |
0.424 < 0.600 | 새로 평가 대상에 들어온 사례의 정렬 그룹·축 제약 점검 |
| 5 | 정렬선 붕괴 | 6869327 |
0.522 < 0.600 | stretchableDirection이 막은 축에서 대체 정렬 후보 탐색 |
현재 방법의 한계 — 정확히 재는 비용과 풀 수 있는 범위
렌더링 재검증이 반복된다
method 9는 정렬선 복구안을 예측 → 전체 묶음 → 정렬선별 순서로 다시 검증한다. 케이스당 측정 포트 호출 상한은 6회다.
개선 방향 같은 문서의 중복 측정과 안 바뀐 텍스트의 재측정을 줄인다. 검증을 빼서 속도를 얻지는 않는다.
장식이 따라오지 못한다
번호·선·아이콘이 본체와 같은 의미 단위로 묶이지 않아 본체만 이동하고 장식이 남는다.
개선 방향 텍스트·컨테이너·장식의 소속을 먼저 정하고 상대 위치를 유지해 함께 옮긴다.
잘못된 대치는 복구 불가
누락된 문구·잘못된 슬롯 매핑은 위치·크기를 바꿔 풀 문제가 아니다. 같은 제약이면 LLM 도 못 푼다.
개선 방향 대치 전 용량·구조 검사, 대치 후 누락 검사, 부적합한 컴포넌트 재선택.
좌표 정렬은 복구했지만 의미 구조는 모른다
method 9가 같은 L/R/T/B 정렬선을 공유하는 요소를 함께 움직인다. 다만 “이 셋이 한 행”이라는 행·열·셀의 의미 소속은 아직 제약에 없다.
개선 방향 좌표 그룹을 넘어 의미 그리드와 장식 소속을 인식하고, 간격까지 함께 보존한다.
아직 알고리즘이 커버하지 못하는 디테일
정해진 순서의 후보와 제한된 반복으로 푼다. 그래서 사람이 직접 잡은 것보다 품질이 떨어지는 경우가 있다 — FAIL 은 현재 알고리즘이 못 풀었다는 뜻이지 해가 없다는 뜻이 아니다.
개선 방향 후보를 넓히되, 반복이 끝나도 충돌이 남으면 원안 복귀나 사용자 선택으로 넘긴다.
2는 사용자가 확인한 현재 동작 한계이며 이번 100건에서 발생률을 따로 집계하지 않았다. 4는 method 9가 좌표 정렬선 수준에서 크게 개선했지만 의미 그리드까지 해결한 것은 아니다. 아래는 항목별 실제 사례다.
1 · 렌더링 재검증 — 사례 대신 호출 수로
method 9 측정 상한
6회
케이스당 렌더 프로브
최신 평균·p95
미측정
이전 판과 직접 비교 불가
단계별 비중
미측정
캐시 적중률도 아직
이 항목만은 그림으로 보이지 않는다 — 결과가 아니라 비용의 문제다. 이전 판의 평균 2.69회·p95 0.60초는 method 9 전 실행 기록이다. 최신 평균과 지연시간은 다시 재야 한다. 자세한 내역과 hand-off 계획은 §11에 있다.
2 · 장식이 따라오지 못한다 — 두 가지 형태
한 장씩 크게 보기
아래 그림이 한 줄에 한 장씩 커집니다.
한 장씩 크게 보기
아래 그림이 한 줄에 한 장씩 커집니다.
3 · 잘못된 대치는 복구 불가
한 장씩 크게 보기
아래 그림이 한 줄에 한 장씩 커집니다. 다시 눌러 나란히 볼 수 있습니다.
4 · 좌표 정렬선 복구 — method 9가 바꾼 결과
| 사례 | 정렬선 보존율 | 자동 판정 | 무엇이 어긋났나 |
|---|---|---|---|
6492634 | 0.939 | SUCCESS | method 9 전 0.515에서 회복 · 넘침 0 · 신규 겹침 0 유지 |
5636021 | 1.000 | SUCCESS | 원안 정렬선을 모두 보존 |
6567992 | 0.846 | SUCCESS | method 9 전 0.769에서 SUCCESS 하한 위로 회복 |
method 9는 같은 L/R/T/B 정렬선을 공유하는 요소를 함께 옮긴 뒤 실제 렌더로 다시 확인한다. 그 결과 같은 89건에서 평균 정렬선 보존율이 0.799 → 0.943, SUCCESS가 33 → 65로 올랐다. 다만 하한을 넘겨도 온전한 것은 아니다 — SUCCESS 65건 중 22건은 여전히 정렬선 1 미만이다.
한 장씩 크게 보기
아래 그림이 한 줄에 한 장씩 커집니다. 다시 눌러 나란히 볼 수 있습니다.
5 · 아직 알고리즘이 커버하지 못하는 디테일
잔여 FAIL은 다섯 건이다. 6690122·6248263은 각각 3,633px²·399px²의 신규 겹침이 남고,
5546858·5628689·6869327은 넘침과 신규 겹침은 0이지만 정렬선 보존율이 0.60 FAIL 바닥 아래다.
즉 남은 문제는 충돌 2건 + 정렬선 붕괴 3건으로 갈렸다 — 원인 분석은 §8에 있다.
FAIL 로 드러나는 것만 문제가 아니다. 사람이 직접 잡았다면 더 나았을 자리가 통과한 결과 안에도 있다 — ACCEPTABLE 19건과 좁은 칼럼 9개, 장식이 따라오지 못한 배치가 그렇다. 자동 판정을 통과했다는 것과 디자이너가 만든 품질에 닿았다는 것은 다른 말이다.
자동 판정의 한계 — 판정 통과가 곧 완성은 아니다
하한을 넘겨도 완전하진 않다
22/65
SUCCESS 65건 중 정렬선 보존율이 1 미만인 것. 0.80 하한만 넘겼을 뿐이다.
좁은 칼럼도 9개 남는다.
지표가 곧 품질은 아니다
참고선
동일 pane의 Sol 기준선도 엄격 채점에서 FAIL 6건이 나온다. 비교 결과를 그대로 목표선으로 쓸 수 없다.
비교 가능 87건 중 게이트 통과 81건(93.1%) · 기준선 미생성 UNKNOWN 2건.
일반화
개발용
문제 케이스를 모은 집합이다. 무작위 사용자 표본도, 독립 검증 집합도 아니다.
실행 시간도 개발 환경 값이라 실서비스 지연시간이 아니다.
등급에 안 잡히는 것이 남아 있다
정렬선은 이제 SUCCESS 게이트에 들어갔지만 잘림·좁은 칼럼은 여전히 최종 등급에 직접 반영되지 않는다. 텍스트 잘림은 0이어도 도형 하나의 페이지 밖 잘림은 Before·After·Expected 모두에 남아 있다 — 운영 적용 전에 별도 안전 기준이 필요하다.
운영 전환 — 붙이기 전에 맞출 것
엔진 hand-off렌더링 비용과 엔진 hand-off — 속도 문제를 먼저 공유한다
이 방식은 렌더링을 쓴다
후보를 만든 뒤 실제 글자 영역을 엔진으로 다시 재서 판정한다. 정확도의 근거가 그 실측이지만, 같은 이유로 엔진 호출이 실행 경로 안에 들어온다.
1 · 지금 무엇이 비용인가
| 측정된 것 | 값 | 범위 |
|---|---|---|
| method 9 전 글자 측정 포트 | 총 269회 · 평균 2.69회 | 2026-08-30 저장 100건 · 역사 기록 |
| method 9 전 After 생성 | 평균 0.16초 | 중앙값 0.09초 · 95백분위 0.60초 · 역사 기록 |
| method 9 렌더 프로브 | 최대 6회 | 예측 확인 → 전체 묶음 → 정렬선별 검증 |
| method 9 최신 평균·p50·p95 | 미측정 | 최신 성능 채점 산출물에는 시간 자료 없음 |
269회·2.69회·0.16초는 method 9 이전 판의 저장 기록이며 외곽선 사전 추출·입력 준비·최종 채점은 포함되지 않는다. 최신 경로는 정렬선 검증이 추가되어 호출 상한이 6회로 늘었다. 평균 지연시간과 캐시 적중률을 다시 재기 전에는 속도 개선이나 저하 폭을 단정하지 않는다.
2 · runtime 에 어떻게 넣는가
현재 iui 는 엔진 패키지와 에디터 페이지 뷰를 가져와 별도 렌더 호스트에서 실행한다. CLI 는 헤드리스 브라우저, 뷰어는 iframe 에서 같은 글자 측정기를 쓴다. 제품에는 기존 엔진을 측정 포트로 연결하는 방향이 가능하지만 iui 결과와 동일하다는 검증이 필요하다.
sheetJson과 돌아오는 tight box다.3 · 사전에 indexing 할 것
| 자료 | 지금 방식 | 사전 계산 가능한가 |
|---|---|---|
| 컨테이너·배경 도형 외곽선 | 리소스 SVG·이미지를 미리 래스터화해 윤곽을 저장. 실행 중에는 위치·크기·회전에 맞춰 변환만 한다 | 이미 사전 처리 |
| 텍스트 tight bounding box | 실제 폰트와 엔진의 DOM 기반 측정기로 계산. 폭·폰트·내용이 바뀔 때마다 다시 잰다 | 불가 — 실행 중 실측 |
| 넘침·겹침·정렬·여백 지표 | sheetJson + 위 두 자료로 코드가 계산 | 별도 렌더 없음 |
줄일 수 있는 쪽은 반복이다. 같은 문서·같은 입력의 결과를 단계 사이에 재사용하고, 폭·폰트·내용·회전이 바뀐 텍스트만 다시 잰다. 검증을 빼서 속도를 얻지는 않는다.
4 · 엔진 부하와 hand-off 범위
| # | 단계 | LLM | 엔진 | 필요한 것 |
|---|---|---|---|---|
| 1 | 순수 후보 생성·지표 수식 | 없음 | 실행 중 직접 호출 없음 | sheetJson 구조 + 이미 제공된 tight / outline 데이터 |
| 2 | 실제 글자 영역 측정 | 없음 | 필요 | TextBoundingBoxCalculator · 엔진 폰트/DOM 관리자 · 브라우저 |
| 3 | 결과 시각화·뷰어 | 없음 | 필요 | miricanvas-editor-2의 PageRootView + 엔진 패키지 |
| 4 | 도형 외곽선 사전 추출 | 없음 | 별도 추출 경로 | 디자인 리소스 API/CDN + SVG/이미지 윤곽 추출기 + 캐시 |
| 5 | 비교용 After·Expected 작성 | 사용 | 최종 공통 측정에 필요 | 모델 + 규칙 문서 + 출력 적용기 + 실제 렌더 검증 |
엔진 없이 가능한 범위 — 저장된 실측값으로 채점하거나 예측 기반 후보를 만들 수 있다. 다만 폭·폰트가 바뀐 After 가 실제로 어떻게 렌더되는지는 기존 값만으로 보장할 수 없다.
붙이기 전에 합의할 것 — 문서에 답이 없는 항목
호출 방식
- 시점 — 편집 중 / 저장 직후 / 명시적 실행
- 형태 — 동기 대기 vs 큐
- 대기 표시 — 최신 p95 재측정 후 어떻게 보여줄지
- 실패·타임아웃 — 되돌림 기준
엔진 계약
- 부하 예산 — 최대 6회·최신 평균 재측정 × 동시 요청 몇 건
- 결과 일치 — web-2 엔진과 iui 결과 회귀 세트
- 캐시 — 외곽선 커버리지·무효화, 서체 파일 배포
- 계약 고정 — sheetJson·좌표계·엔진 버전·줄바꿈 처리
다음 개선 — 남은 FAIL과 간격·패딩으로 좁힌다
잔여 FAIL 5건을 두 갈래로 푼다
신규 겹침 2건(6690122·6248263)과 정렬선 0.60 미만 3건을 각각 별도 후보·복구 정책으로 다룬다.
완료 기준 같은 89건에서 SUCCESS·게이트 통과 회귀 없이 FAIL 감소
정렬선을 지키는 재배치 · 완료
method 9 keepGuides가 같은 정렬선의 요소를 함께 움직이고 실제 렌더로 재검증한다. 같은 89건에서 정렬선 평균 0.799 → 0.943, SUCCESS 33 → 65로 올랐다.
검증 결과 넘침 0 · 신규 겹침 2 · FAIL 5 · 이전 method 9 입력 대비 지표 악화 0건
요소 사이 간격을 제약으로 넣는다
지금은 「겹쳤나 / 안 겹쳤나」와 페이지 전체 유휴 여백 비율만 본다. 요소와 요소 사이가 얼마나 떠야 하는지(margin), 컨테이너 안쪽에 글자 둘레로 얼마가 남아야 하는지(padding)는 제약에 없다 — relayout-core 에 그런 상수가 없다.
할 일 원안의 간격을 재서 목표 간격으로 삼고, 겹침 0 이어도 너무 붙거나 너무 벌어진 결과를 후보 검사에서 되돌린다. 채점에도 간격 지표를 더한다.
의미 그리드와 장식 소속
좌표 정렬선 그룹을 넘어 텍스트·배경·장식의 소속과 행·열·셀 구조를 인식해 함께 옮긴다.
완료 기준 제품 엔진과 결과 일치까지 검증
ACCEPTABLE·SUCCESS 의 시각 품질
ACCEPTABLE 19건의 중복 사유는 유휴 여백 13건 · 정렬선 6건 · 폰트 축소 2건이다. 좁은 칼럼 9개와 함께 사람 판정에 대조한다.
완료 기준 임계값을 낮추는 대신 실제 렌더의 전후 선호 확인
평가 제외 사유 연관 feature 개발
Sol 기준 평가 제외는 해결 불가 9건 · 분절형 컨테이너 1건 · 폰트 없음 1건이다. 슬롯·합성 도형·서체 경로에서 각각 복귀시킨다.
완료 기준 제외 11건을 평가로 복귀
반복 렌더링 비용
method 9의 최대 6회 렌더 프로브를 단계별로 계측하고, 같은 입력과 바뀌지 않은 텍스트의 결과를 재사용한다.
완료 기준 회귀 없이 측정 호출 수와 p50/p95 감소
이번 자료의 제안
정렬선을 지키는 단계는 method 9로 넘어섰고, 이제 간격과 의미 구조를 지킬 차례다. 게이트 통과율 94.4%와 SUCCESS 73.0%는 정렬선 복구가 실제 등급 상승으로 이어졌음을 보여준다. 다음 축은 요소 사이 간격·패딩과 행·열·장식의 의미 소속이다. 아직 모든 입력에 자동 적용해도 된다는 출시 판정은 아니다.
출처
경로는 모두 miricanvas-iui 기준 · 수치는 커밋 3095b6596의 최신 저장 재채점본(2026-09-01 11:38:59 KST). 재배치 전후 pane 비교는 scripts/relayout-rescore-panes.ts.
- 최신 측정값
eval-out/runs/methods/adaptive-relayout/evaluation.json·eval-out/runs/rescore-20260901e/panes.json- 정렬선 알고리즘
relayout-methods/keepGuides.ts·adaptiveRelayout.ts·relayout-core/betterOf.ts·relayout-core/verdict.ts- 규칙·구조 문서
src/post-replace-relayout/README.md·docs/relayout_logics.md·docs/architecture.md·docs/evaluation-rules.md- 이전 판 역사 기록
evidence.json·outcome-metrics.json·five-way-comparison.json·timing-detail.json·runtime-review-2026-08-31.md