Figma × Widgetbook 정렬 — 레퍼런스#
SKILL.md 의 참조 자료입니다. 레지스트리 컬럼 스키마와 검증 항목 전체를 담습니다.
레지스트리 컬럼#
화면 하나 = 한 행. 파일은 리포에 두고(CSV 또는 그에 준하는 텍스트 포맷), 디자인 파일에는 목차 페이지로 미러링합니다.
| 컬럼 | 주체 | 내용 |
|---|---|---|
key |
사람 (1회) |
app/store/home
,
console/book/book-list
.
절대 변경하지 않는다
— 이 값이 행의 정체성이다
|
surface | 자동 | app / console |
roles |
사람 | 이 화면을 보는 역할. 세미콜론 구분 (admin;publisher_manager) |
domain |
사람 | 도메인 키 (store, book, settlement) |
order | 사람 | 도메인 내 정렬 번호 |
label_ko | 사람 | 한글 라벨. 섹션 이름·usecase_name 과 같은 문자열 |
figma_page | 사람 | 디자인 파일의 페이지 (020 book · 도서) |
figma_section | 사람 | 섹션 이름 |
figma_node |
사람 | node ID — 결합의 실체. 이름이 바뀌어도 이건 안 변한다 |
dart_class | 자동 | Page 위젯 클래스명 |
usecase_name | 자동 | @UseCase(name:) 값 |
platforms |
자동 | Device Addon 값 집합 (Mobile;Tablet;Web) |
states | 자동 | knob 값 집합 (Default;Loading;Empty;Error) |
status |
사람 |
todo
→
designing
→
review
→
done
, 또는
dead
|
note | 사람 | 이슈·근거·판정 사유 |
자동/사람 구분이 이 표의 생존 조건#
dart_class · usecase_name · platforms · states 를 사람이 적기 시작하면 표가 죽습니다.
클래스 이름 하나만 바뀌어도 표가 거짓말을 시작하고, 거짓말하는 표는 아무도 안 봅니다.
시드 단계에서는 자동 컬럼이 비어 있는 게 정상입니다. 코드 스캔이 채웁니다.
key 는 왜 불변인가#
figma_node 는 섹션을 지웠다 다시 만들면 바뀝니다. dart_class 는 리네임되면 바뀝니다.
figma_page 는 도메인 재편으로 옮겨집니다. 모든 컬럼이 변할 수 있으므로, 행을 추적할
불변 축이 하나 필요합니다. 그게 key 입니다. 도메인이 바뀌어도 key 는 두고 domain
만
고칩니다.
검증 항목#
L0 — 결합 (PR 차단)#
결합이 끊긴 것만 여기 둡니다. 이 계층이 붉으면 표를 신뢰할 수 없다는 뜻입니다.
| 검사 | 실패 시 의미 |
|---|---|
모든 figma_node 가 실제 존재하는가 | 섹션이 삭제·재생성됐다 |
모든 dart_class 가 실제 존재하는가 | 클래스가 삭제·리네임됐다 |
figma_section == usecase_name |
누군가 한쪽 이름만 바꿨다 |
usecase_name 중복 없음 |
서로 다른 두 화면이 같은 이름을 쓴다 — 이름 기반 대조가 무너진다 |
designLink 누락 | 링크 미입력. 도입 단계에서는 경고로 시작해 0 이 되면 차단으로 승격 |
| 표에 빈 값 + allowlist 미등재 | 신규 feature 가 등록되지 않았다 |
디자인에 있으나 미등록인 섹션 (_ 페이지 제외) | 미등록 디자인 |
코드에 있으나 미등록인 UseCase ([Lab] 제외) | 미등록 구현 |
| 코드에 화면이 있으나 UseCase 가 없음 | 위젯북 누락 — 살아 있는 화면이 전시장에 없다 |
L1 — 축 집합 (경고)#
1:1 이 원리적으로 불가능한 축이므로 집합 포함 관계만 봅니다.
| 검사 | 리포트 |
|---|---|
states ⊇ 디자인 프레임에서 파싱한 상태 집합 | — |
platforms ⊇ 디자인 프레임에서 파싱한 플랫폼 집합 | — |
| 코드에 있고 디자인에 없는 상태 | "디자인 미지정" — 코드가 4상태를 강제하므로 이 리포트가 디자인 부채를 그대로 드러낸다 |
| 디자인에 있고 코드에 없는 상태 | "구현 누락" |
차단으로 올리지 마세요. 도입 초기에 이 검사는 거의 모든 화면에서 걸립니다. 차단하면 팀이 검사를 끕니다. 경고로 두면 같은 정보가 부채 리포트로 남습니다.
L2 — 위생 (주 1회 배치)#
| 검사 | 의미 |
|---|---|
path 표기 오류([A/B] 형태) 잔존 여부 | 트리가 깨진 use_case 가 남아 있다 |
| 페이지 번호 정렬 일치 | 두 트리의 순서가 어긋났다 |
| 디자인시스템 라이브러리 버전 ↔ 패키지 버전 | 화면 이름이 다 맞는데 결과가 다른 원인. 화면 단위 대조로는 절대 못 찾는다 |
| 승격 대기 로컬 컴포넌트 개수 추이 | 증가 추세 = 디자인시스템이 제품 속도를 못 따라간다 |
status: dead 화면에 작업이 들어갔는지 | 아무도 못 보는 화면을 그리고 있다 |
프레임 이름 파싱#
L1 이 성립하려면 프레임 이름이 기계로 읽혀야 합니다.
{플랫폼} · {상태}
- 구분자는
·(공백 + 가운뎃점 + 공백) - 플랫폼 어휘:
Mobile·Tablet·Web - 상태 어휘:
Default·Loading·Empty·Error - 어휘 밖의 값은 경고로 리포트하고 집합에서 제외 — 조용히 버리면 오탐이 된다
Section: 도서 목록
Frame: Web · Default → platforms{Web}, states{Default}
Frame: Web · Empty → platforms{Web}, states{Empty}
Frame: Mobile · Default → platforms{Mobile}, states{Default}
파싱 결과: platforms = {Web, Mobile}, states = {Default, Empty}.
코드 쪽 states = {Default, Loading, Empty, Error} 이므로 Loading·Error
가
"디자인 미지정" 으로 리포트됩니다.
스캐너가 읽어야 할 것#
좌측(자동) 컬럼 생성기는 @UseCase 어노테이션에서 다음을 뽑습니다.
| 대상 | 출처 |
|---|---|
usecase_name | name: 인자 |
dart_class | type: 인자 |
surface |
path: 의 첫 대괄호 세그먼트 ([App] → app) |
feature | path: 의 두 번째 세그먼트 |
states | use_case 본문의 dropdown knob options |
platforms | Device Addon 설정 (조립 앱 공통) 또는 use_case 의 명시적 제약 |
designLink | designLink: 인자 |
states 는 본문 파싱이라 취약합니다. dropdown knob 의 options 를 상수로 선언해 두면
파싱이 안정됩니다.
const _stateOptions = ['로딩', '데이터', '빈', '에러'];
도입 시 흔한 실패#
| 실패 | 왜 생기나 | 대응 |
|---|---|---|
| 표가 3개월 만에 죽음 | 자동으로 알 수 있는 걸 사람이 채우게 했다 | 자동 컬럼을 늘리고, 사람 칸은 화면당 1회로 |
| L1 이 붉어서 검사를 끔 | 축 검사를 차단으로 걸었다 | L1 은 경고 |
| 이름을 바꾸자 결합이 전부 끊김 | 이름으로 결합했다 | node ID 결합 (§0) |
| 제외 구역이 없어 미등록 경고가 수백 개 | 와이어프레임·디버그 화면까지 대조 대상 | _ 페이지 / [Lab] 먼저 확보 |
| 대표 화면 없이 도메인 순차로 그림 | 갭을 늦게 발견 | 1차 수직 슬라이스 (SKILL.md §9) |