하이레벨 판정
로컬 리시트(데이터 계약·UI 계약·결정론 재빌드·가시성 스캔·Hugo 최소 빌드·로컬 HTTP 200·듀얼뷰포트 실측·다이얼로그 실측)와 3-엔진 만장일치 APPROVE가 모두 그린이고, 첫 배포 커밋 8fedfd0에 대한 프로덕션 실측(라이브 URL 200·바이트 수·/meta/data.json sha256 6fa483da…5c099a·듀얼뷰포트 재측정·다이얼로그 재현·랩퍼 iframe stable·Wuhan#48 incomplete 보존)도 모두 그린이다.
로컬 리시트와 프로덕션 실측이 모두 그린으로 정렬돼 Shipped. 첫 배포 커밋은 8fedfd0407c1540b413b03c78d9507243f783d1f. 배포 ID나 정확한 배포 시각은 캡처하지 않았으므로 이 영수증에 상상해서 넣지 않는다.
수용 대조 — 요구와 실측
유저 요구 원문과 산출물의 실측치를 한 줄씩 대조한다. 각 행은 요구·실측·근거 파일이 함께 있어야 통과다.
| 요구 | 실측 | 근거 | 판정 |
|---|---|---|---|
| Wuhan Top 64 + Barcelona Top 64 = 128 스탠딩 | standings.length = 128 | static/meta/data.json | OK |
| 공개 106 / 미공개 22 | 공개 106, 미공개 22 | static/meta/data.json | OK |
| 카드 등장 총계 3,385 · 수량 총계 6,925 | 3,385 / 6,925 | static/meta/data.json | OK |
| 고유 collector number 365 | 365 | static/meta/data.json | OK |
| 미공개 데이터는 발명하지 않는다 | Wuhan 48위 (deckId 267853)만 소스 total 65인 미완결로 보존, 발명 카드 0 | 플레이어 猫岛巡礼神切天意 · 제목 感受雷霆吧! | OK |
| 390px 페이지 가로 오버플로 0 | clientWidth=scrollWidth=390, cardsOutside=0 | scratchpad/riftbound-meta-20260904/browser-qa-postfix-responsive.json | OK |
| 1440px 페이지 가로 오버플로 0 | clientWidth=scrollWidth=1440, cardsOutside=0 | 동일 파일 | OK |
| 다이얼로그 390에서 링크 44px 이상, 컨테이너 안 | links 9, minHeight 62, maxRight 365.19, allInside=true, all44=true | scratchpad/riftbound-meta-20260904/browser-qa-dialog-postfix-390.json | OK |
| Trinity 3-엔진 만장일치 APPROVE | Round 2 = anthropic·grok-4.5·gpt-5.6-sol 모두 APPROVE | 본 문서 §06 | OK |
| 프로덕션 검증 | 커밋 8fedfd0에서 /meta/·data.json·랩퍼 200, data.json 3,688,598 bytes, sha256 6fa483da…5c099a, 듀얼뷰포트 재실측 그린, 다이얼로그 재현 그린, 랩퍼 iframe stable=true | 본 문서 §07 | OK |
출처와 산출물
탐색기(/meta/)는 세 파일로 구성된다. 데이터는 결정론적으로 리빌드해도 동일한 해시가 나와야 하며, 미공개 항목은 발명 없이 소스 상태를 보존한다.
- 메인 탐색기
static/meta/index.html- 데이터
static/meta/data.json· 3,688,598 bytes · sha2566fa483da8adfda236436c14ea33c64cb7f6371b80e57c60e27172ab71f5c099a- 블로그 랩퍼
content/post/2026-09-06-riftbound-meta.md→ /post/2026-09-06-riftbound-meta/- 정직한 미공개 사례
- Wuhan 48위, deckId 267853, 플레이어
猫岛巡礼神切天意, 제목感受雷霆吧!, 소스 total 65 — 미완결 그대로 보존, 카드 발명 0 - 데이터 결정론
- 재빌드 결과가 위 해시와 바이트 완전 일치 (로컬 실측)
반응형 실측 — 390 / 1440
두 뷰포트에서 페이지 가로 오버플로 없음, 33/33 이미지가 loaded·eager·high, 히어로/워크스페이스 레이아웃이 뷰포트에 맞게 전환된다.
| 지표 | 390px | 1440px |
|---|---|---|
| viewport | 390 | 1440 |
| clientWidth / scrollWidth | 390 / 390 | 1440 / 1440 |
| cardsOutside | 0 | 0 |
| initial / loaded / eager+high | 33 / 33 / 33 | 33 / 33 / 33 |
| hero width | 171.59 | 295 |
| hero direction | column | row |
| workspace left / width | 0 / 390 | 320 / 1120 |
원본 리시트: scratchpad/riftbound-meta-20260904/browser-qa-postfix-responsive.json
스크린샷 · /meta/ @ 390 × 3000 (모바일 전체)
스크린샷 · /meta/ @ 1440 × 2400 (데스크톱 전체)
다이얼로그 RED → GREEN
gpt-5.6-sol의 Round 1 REJECT를 근거로 다이얼로그 오버플로와 히트 타깃을 실측 계약으로 고정하고, 최소 CSS 수정으로 GREEN을 만들었다.
| 지표 | 수정 전 (RED) | 수정 후 (GREEN, 390) |
|---|---|---|
| body scrollWidth | 1189 | 372 |
| facts scrollWidth | 1157 | 340 |
| 링크 min height | 17px | 62px |
| document client/scroll | — | 390 / 390 |
| dialog client/scroll | — | 372 / 372 |
| links count | — | 9 |
| maxRight | — | 365.19 |
| allInside / all44 | false | true / true |
| RED 계약 위반 | 정확히 4건 | OK UI contract holds — static/meta/index.html |
근본 원인과 최소 수정
파일: static/meta/index.html
.body그리드 컨테인먼트 — 라인 450–459 근방: body에min-width:0, 데스크톱 트랙에minmax(0,1fr).- 중첩
dl.kv— 라인 490–503 근방: 좌우 트랙 모두minmax(0,1fr)으로 축소 가능하게. - URL 앵커 — 라인 1179–1183, 1243–1245 근방:
overflow-wrap:anywhere+word-break:break-word, 링크 최소 히트 44px. - RED 컨트랙트:
scripts/test-riftbound-meta-ui.py라인 975–1084.
원본 리시트: scratchpad/riftbound-meta-20260904/browser-qa-dialog-postfix-390.json
스크린샷 · 다이얼로그 열림 @ 390 × 844
로컬 게이트와 3-엔진 리뷰
로컬 게이트는 데이터 계약·UI 계약·인라인 JS syntax·재빌드 결정론·가시성 스캔·Hugo 최소 빌드·로컬 HTTP·git diff --check가 모두 그린. Trinity는 Round 1에서 REJECT 하나가 있었으나 근거 기반 CSS 수정 후 Round 2에서 만장일치 APPROVE.
로컬 게이트 (모두 그린)
- Data contractOK
- UI contractOK —
static/meta/index.html - Inline JS
node --checkexit 0 - Rebuild determinism재빌드 산출물이 커밋된
data.json과 바이트 완전 일치 - Visibility scan
check-visibility: OK — 155 file(s) scanned - Hugo build (minified)exit 0
- Local HTTPraw / data / wrapper / home 모두 200
- Whitespace
git diff --checkexit 0
Trinity 리뷰 원장
| 라운드 | anthropic | grok-4.5 | gpt-5.6-sol | MUST-FIX |
|---|---|---|---|---|
| Round 1 | APPROVE | APPROVE | REJECT (dialog overflow / hit targets) | 다이얼로그 실측 계약 + 최소 CSS 수정 |
| Round 2 | APPROVE | APPROVE | APPROVE | 없음 |
프로덕션 검증 — 첫 배포 커밋 8fedfd0 실측 영수증
라이브 URL·바이트·해시·듀얼뷰포트·다이얼로그·랩퍼 iframe·progressive materialization·미공개 항목 보존까지 프로덕션에서 재측정한 결과다. 배포 ID나 정확한 배포 시각은 캡처하지 않았으므로 이 영수증에 상상해서 넣지 않는다.
라이브 라우트
| URL | HTTP | bytes | 비고 |
|---|---|---|---|
/meta/ | 200 | 43,160 | 탐색기 SPA 셸 |
/meta/data.json | 200 | 3,688,598 | sha256 6fa483da8adfda236436c14ea33c64cb7f6371b80e57c60e27172ab71f5c099a — 커밋 바이트와 정확히 일치 |
/post/2026-09-06-riftbound-meta/ | 200 | 11,033 | 탐색기 랩퍼(embed) |
/riftbound-meta-delivery/ | 200 | 3,042,698 | 첫 배포 시점 리시트 페이지 크기(본 업데이트 이전 기준) |
/post/2026-09-06-riftbound-meta-delivery/ | 200 | 11,241 | 리시트 랩퍼(embed) |
홈페이지 / | 200 | 45,663 | 리스트에 두 포스트 노출 |
프로덕션 브라우저 재측정 — 두 뷰포트
| 항목 | 390 (mobile) | 1440 (desktop) |
|---|---|---|
| clientWidth / scrollWidth | 390 / 390 | 1440 / 1440 |
| cardsOutside (viewport 외부) | 0 | 0 |
| hero | direction=column · width 171.59375 | direction=row |
| workspace | — | left 320 · width 1120 |
| 초기 이미지 로드 | 33/33 (eager/high) | 33/33 |
다이얼로그 프로덕션 재현 (390)
body 372/372, facts 340/340, links=9, 최소 링크 높이 62px, 모두 컨테이너 안. Escape 키가 다이얼로그를 닫고 열기 전 트리거로 포커스가 복원된다.
랩퍼 iframe stability
랩퍼(/post/2026-09-06-riftbound-meta/)의 iframe src=https://dosi.dev/meta/. 로드 직후 height=14206, 약 3.2s 대기 후 다시 14206 — stable=true.
Progressive materialization
동일 identity 보존: Barcelona rank 4 = HXN Gonkrа, Kennen, Heart of the Tempest, 66 cards. 같은 details 노드가 닫혀 있을 때 이미지 0개, 열면 34개가 생성되고 그 34개 전부 loading=lazy.
Barcelona 미공개 항목 (fabricate=0 재확인)
UI 행 22개 — 사유는 Submit Deck 21, Under Review 1. 미공개 행은 details/summary/이미지/버튼/링크가 모두 0. 런타임 교차확인: standings 64, 미공개 22, data.decks에서 일치하는 레코드 0, deckUrl 필드 0. 어떤 덱리스트도 발명하지 않았다.
Wuhan rank 48 incomplete 정확 상태
- 플레이어
猫岛巡礼神切天意- deckId
267853- 제목
感受雷霆吧!- Champion
- Jayce, Defender of Tomorrow
- source total / card total
- 65 / 65 ·
incomplete=true - 렌더링
- occurrence 버튼 28개, 이미지 28개, 수량 합 65
- 경고 문구(원문)
이 덱은 upstream에서 incomplete로 표시되었습니다 (기대 카드 수 미달). 원본 그대로 표시합니다.- 소스 링크
- https://riftdecks.com/riftbound-metagame/deck-gan-shou-lei-ting-ba-267853
Cloudflare 배포 ID와 정확한 배포 시각은 이 영수증 캡처에 포함되지 않았다. 향후 별도 캡처가 있어야 첨부한다 — 상상해서 채우지 않는다.
QA 단계 — 이 문서를 그대로 재현하려면
/meta/를 데스크톱과 모바일 각각 열어 가로 스크롤바가 없음을 확인한다.- 임의의 카드/링크를 눌러 상세 다이얼로그를 열고, 다이얼로그 내부가 뷰포트를 넘지 않으며 내부 링크가 손가락으로 눌리는 크기임을 확인한다.
/meta/data.json의 sha256이6fa483da8adfda236436c14ea33c64cb7f6371b80e57c60e27172ab71f5c099a임을 확인한다.- 랩퍼 /post/2026-09-06-riftbound-meta/가 임베드로 렌더링되고 상단 카드/태그 chrome이 없는 embed 레이아웃임을 확인한다.
- Wuhan 48위 항목이 미완결로 표시되고 카드 리스트에 발명이 없는지 확인한다.
문서 유형 data-report · ui-ux-ref openai · 로컬 리시트 + 프로덕션 실측 · 첫 배포 커밋 8fedfd0407c1540b413b03c78d9507243f783d1f · data.json sha256 6fa483da8adfda236436c14ea33c64cb7f6371b80e57c60e27172ab71f5c099a