feat: integrate latest HMDesign design system updates
This commit is contained in:
1 parent
99faec189e
commit
1c4e0bb9a1
209 files changed
+8845
-552
No files matched your search
@@ -0,0 +1,78 @@
|
||||
# HMDesign 접근성 잔여 검증 — 2026-10-10
|
||||
|
||||
RESULT: PARTIAL. 재현된 ARIA·접근성 이름 결함을 최소 수정했고 해당 동작의 선택 검증은 통과했다. 확정 색의 대비 부족, 실제 스크린리더·실기기 검증과 자동 도구의 일부 미확정 진단은 남아 있다. 전체 WCAG 적합성 승인으로 해석하지 않는다.
|
||||
|
||||
기준 Local/지정 GitHub main SHA: `8817135f504b836a8d1566f3672ed50b8dd392b9`. 시작 Working Tree는 CLEAN. 범위 BOTH, Runtime React. 기존 화면 생성 실험·Claude·하위 에이전트 호출 0, 승인 장부 10/12·잔여 2 보존. 공식 Gitea NOT ACCESSED / NOT MODIFIED.
|
||||
|
||||
## 실제 결함과 최소 수정
|
||||
|
||||
| 대상 | 재현·원인 | 변경·확인 |
|
||||
|---|---|---|
|
||||
| Combobox | Enter로 연 Trigger는 `aria-haspopup=listbox`지만 controls 대상은 실제 `role=dialog`. 내부 cmdk 검색 입력은 별도 listbox를 제어한다. | Trigger 기본값만 dialog로 수정. 기존 ID/이름/disabled/검색/값/API·연결형 스타일 보존. 네 폭에서 실제 키보드 선택·Escape·focus 복귀·expanded/controls 역할 정합 확인. |
|
||||
| GNBUser / LNBProfile | 화면은 이름+역할을 표시하지만 기본 이름은 이름+사용자 메뉴만 포함. 이름과 설명 DOM 텍스트 경계도 붙어 한국어 Label-in-Name 검사에 실패. | 기본 이름에 description 포함, 설명이 있을 때 이름 뒤의 의미상 공백 추가. 명시적 aria-label/labelledby 우선권 보존. 두 버튼의 실제 이름·키보드 메뉴/Arrow/Escape/focus 복귀 및 axe Label-in-Name 통과. GNB 138.64×53, LNB 140.64×48로 경계 보완 전후 크기 일치. |
|
||||
|
||||
구현·[Combobox MD](../components/combobox.md)·[GNB MD](../patterns/gnb.md)·[LNB MD](../patterns/lnb.md)·관련 All Story의 설명을 맞췄다. [AI 화면 계약](../guidelines/ai-screen-contract.md)에 팝업 실제 role과 명시적 접근성 이름의 소비 책임만 추가했다. AGENTS.md의 기존 Label/ID/키보드/모바일 규칙은 충분해 수정하지 않았다. 디자인·Token·Typography·Spacing·Radius·공개 export/API·Story ID·D-01/D-02·퍼블리셔 버튼 배치/Sheet radius 변경 없음.
|
||||
|
||||
## 실행 검증과 한계
|
||||
|
||||
- 신규 실제 TSX 렌더 회귀 3개 PASS. 이름 경계 보완 후 영향받는 GNB/LNB 2개만 재검사 PASS; Combobox PASS는 재실행하지 않음. 기존 publisher C5 반복 popup/ID 테스트 1개 PASS, 나머지 8개 선택 skip.
|
||||
- Combobox 390/768/1280/1440: Tab/Shift+Tab, Enter/Space 열기, 검색·ArrowDown·Enter 선택, Escape·focus 복귀, 팝업 bounds, 페이지 가로 overflow, 중복 ID 확인 PASS. 브라우저 CDP AX tree로 dialog 이름을 별도 확인. Playwright 일부 popup snapshot에서 이름을 생략하는 것과 Chrome AX tree의 실제 이름을 구분한다.
|
||||
- 최종 static Storybook 빌드에서 위 네 폭과 사용자 메뉴 두 경로의 6개 선택 회귀가 모두 PASS, pageerror 0. Button의 Enter·Space가 각각 실제 native click을 발생시키는 것도 별도 확인했다. 390px Combobox와 Drawer PNG를 시각 확인했다.
|
||||
- Dialog/AlertDialog/Sheet/Drawer: 1280에서 실제 열기·초기 focus·Tab 8회 순환·Escape·trigger 복귀 PASS. Sheet/Drawer는 열린 상태로 네 폭 변경 시 내부 focus와 페이지 overflow 유지, 모바일 버튼 크기/배치 측정 PASS. Drawer 모바일 시각 실행 위/취소 아래와 기존 DOM 취소→실행 순서 보존. 실제 손가락 drag·스크롤 충돌은 NOT VERIFIED.
|
||||
- Button의 키보드 진입·disabled Tab 제외, Input readonly 실제 키 입력 보호, Accordion collapsible Enter/Space·Arrow/Home/End, DataTable 페이지 크기 Label/키보드 선택·정렬 aria-sort, GNB/LNB 실제 Tab 50회에서 숨긴 배경 focus 잔류 없음을 선택 확인했다. 검사한 경로에 한정한다.
|
||||
- 모바일 GNB/LNB 단일 fixture 390/768px에서 Enter 열기·Tab 8회 modal 내부 탐색·Escape·trigger focus 복귀·페이지 overflow 확인 PASS. 두 메뉴 trigger는 32×32px. 전체 대상 간격·실제 터치·44px 강화 기준 적합성을 인증하지 않는다.
|
||||
- Table 자동 `scrollable-region-focusable` 경고는 Chrome 154에서 실제 Tab 진입·ArrowRight 0→40px 스크롤이 가능했다. 수정하지 않았다. 다른 브라우저의 스크롤 키보드 접근성은 NOT VERIFIED.
|
||||
- Select는 실제 Space/Home/End/Tab/escape·focus 복귀가 정상이며 숨긴 배경 focus 진단은 원본 보존했다. 독립 listbox 이름과 실제 보조기술의 Trigger 관계 안내는 NOT VERIFIED. 경고를 삭제하거나 SR PASS로 바꾸지 않았다.
|
||||
- 실제 스크린리더 발화, 음성 조작, 실기기 터치·safe area·확대/텍스트 확대 전체, 모든 Theme/상태/브라우저 조합은 NOT VERIFIED. NVDA 실행 세션과 일반 설치 위치의 실행 파일은 확인되지 않았다. 접근성 트리와 자동 결과를 스크린리더 검증으로 대체하지 않았다.
|
||||
|
||||
자동 검사는 axe-core 4.14.0의 관련 WCAG 2/2.1/2.2 A/AA 태그를 사용했다. 판정 근거는 [WCAG 2.2 검사 항목](https://www.w3.org/WAI/WCAG22/quickref/), [Combobox 팝업 역할](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/), [Label in Name](https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html), [비텍스트 대비](https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html), [최소 터치 대상](https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html)을 구분해 적용했다. Disabled 대비 예외는 활성 placeholder/오류 문구/버튼에 적용하지 않는다. 24px 미만 대상은 연결 Label·간격 등 예외 판정이 필요하며 전체 모바일 AA PASS로 확대하지 않는다.
|
||||
|
||||
## 색상 대비 — 디자인 변경 보류
|
||||
|
||||
| 실제 적용 대상 | 대비·판정 |
|
||||
|---|---|
|
||||
| Combobox/DatePicker 빈 값 흰 Trigger | 이전 5.60:1 증거와 현재 mapping 동일 범위 REUSED PASS |
|
||||
| 일반 Input 값 / Field Label | 16.67:1 / Beige 배경 4.93:1, 확인 범위 PASS |
|
||||
| Input 활성 placeholder / Select 활성 placeholder | 약 2.85:1, FAIL. 확정 mapping/색 변경은 DEFERRED |
|
||||
| 기존 Input 오류 문구 | Red/Beige 4.38:1, 기존 소스·배경 동일 FAIL 증거 보존; 변경 DEFERRED |
|
||||
| Solid Modify Button | White/#cc5200 4.40:1, FAIL; 상태/확정색 변경 DEFERRED |
|
||||
| Destructive Outline hover/pressed | #d32f2f/#fbeeee 약 4.40:1, FAIL; 변경 DEFERRED |
|
||||
| Primary Brand 기본 gradient | 실제 스크린샷의 글자 없는 padding 세로 구간 합성 픽셀 기준 최소 5.68:1. 해당 gradient/샘플 범위 PASS, 다른 gradient/상태는 NOT VERIFIED |
|
||||
| Table selected·selected+hover | 실제 20% 반투명 면과 White 합성 배경의 본문 15.61:1, 해당 상태 PASS |
|
||||
| Focus | 실제 키보드 진입 확인. Input 최종 focus border는 내부 White 6.77:1·외부 Beige 5.96:1, Primary Solid 버튼 focus border는 외부 Beige 14.67:1. 해당 표시 PASS; 전체 아이콘/상태/ring/gradient의 대비는 NOT VERIFIED |
|
||||
|
||||
색 부족을 숨기기 위해 Token이나 확정 Component Color를 변경하지 않았다. Gradient는 투명 backgroundColor만으로 대비를 계산하지 않고 실제 렌더된 픽셀을 사용했다. 모든 픽셀·모든 Theme의 대비 인증은 아니다.
|
||||
|
||||
## 재사용과 중복 검증
|
||||
|
||||
- 이전 `8817135` 보고서의 Guard100/100과 로그, 이번 작업에서 미변경인 Guard/테스트/의존성 소스를 대조해 REUSED PASS. 새 전체 회귀를 실행한 것으로 세지 않는다.
|
||||
- 기존 Checkbox/Radio/Toggle/Tabs·보호 상태·Label/ID 증거는 해당 구현·CSS·테스트 본문이 동일한 범위만 재사용. 수정된 Combobox/GNB/LNB는 새 검증으로 대체.
|
||||
- 별도 실험 폴더 T01/T02/T06의 source fingerprint와 원래 Runtime source 연결·네 폭 PASS가 일치. T02 ID 한 줄, T06 숨김 알림 위치/내부 스크롤 수정 보존. 새 계약의 whole-screen Guard/결합 인증으로 확대하지 않음.
|
||||
- 전체 292 Story Runtime, 전체 Component/Guard/문서 링크, 외부 모델 화면 재생성, 의존성 재설치 반복 없음. 초기 테스트의 연결/locator/계약 오류와 실패 로그는 별도 보존하고 필요한 항목만 재개했다.
|
||||
- 최종 통합에서 root/UI/CENTER Typecheck, package 선언 build, root Vite 및 Storybook build PASS. 이름 경계 보완으로 소스가 변경된 뒤 영향받는 UI/산출물과 테스트만 다시 검증했다. 기존 500kB chunk·Storybook bundler 성능 경고는 남아 있다.
|
||||
- Storybook PARTIAL Guard의 FAIL은 0. 초기 세 Story 검사 후 이름 경계 수정의 영향 범위인 GNB/LNB만 PARTIAL 재검사했다. 최종 source/contract fingerprint는 현재 파일과 일치한다. 원본 status와 staticStatus는 `NOT VERIFIED`이며 native fixture·Reference slot·미해석 Story style의 미검증을 유지한다. styleEvidence는 STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT NOT VERIFIED / FINAL NOT VERIFIED다. 별도 브라우저 동작 결과를 Guard의 스타일 인증에 연결하지 않았으므로 결합 styleVerification은 생성하지 않았다. 컴포넌트 자체의 WCAG 검증을 소비 화면 Guard가 수행한 것으로 해석하지 않는다.
|
||||
- 변경·연결 문서 10개의 내부 링크 27개 PASS. 최종 index의 292 Story ID가 기존 inventory와 모두 일치하고 공개 export·CSS·Theme 소스가 작업 기준과 동일하다.
|
||||
|
||||
## 선택 회귀 실행 방법
|
||||
|
||||
```powershell
|
||||
node --test scripts/accessibility-regression.test.mjs
|
||||
# 기존 C5 조합에 영향이 있는 경우만:
|
||||
node --test --test-name-pattern C5 scripts/publisher-components.test.mjs
|
||||
```
|
||||
|
||||
실제 브라우저 회귀는 이미 실행 중인 로컬 Storybook(개발 또는 최종 static)을 사용한다. Playwright/Chrome을 설치된 QA 환경에서 제공한다. 이 스크립트는 패키지 설치나 모델 호출을 수행하지 않는다.
|
||||
|
||||
```powershell
|
||||
$env:HM_PLAYWRIGHT_DIR='<설치된 playwright 패키지 디렉터리>'
|
||||
$env:HM_CHROME_PATH='<설치된 Chrome 실행 파일>'
|
||||
$env:HM_A11Y_URL='http://127.0.0.1:6024'
|
||||
$env:HM_A11Y_OUTPUT='_local/accessibility-runtime'
|
||||
# 선택: 설치된 axe.min.js. 없으면 해당 자동 검사는 NOT VERIFIED.
|
||||
$env:HM_AXE_PATH='<설치된 axe-core/axe.min.js>'
|
||||
node scripts/verify-accessibility-runtime.mjs
|
||||
# 사용자 메뉴만 변경됐을 때:
|
||||
node scripts/verify-accessibility-runtime.mjs --profiles-only
|
||||
```
|
||||
|
||||
이 검사는 named checks만 보고한다. 실제 발화·손가락 터치·전체 앱의 접근성을 인증하지 않는다. 로컬 상세 JSON·로그·PNG·재사용/보존 manifest·Git 결과는 `_local/a11y-residual-20261010/`에 보관한다. 원본 과거 자료는 수정하지 않는다. 최종 Commit/Remote SHA와 KST 완료 시간은 작업 최종 보고에 기록한다.
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,144 @@
|
||||
# HMDesign AI 화면 생성 품질 개선 — 2026-10-10
|
||||
|
||||
RESULT: PARTIAL. 검증한 구현·회귀 검사는 통과했다. 교차 모델 생성, 수치 디자인 점수, 전체 접근성 적합성은 NOT VERIFIED다. 이전 실험과 생성 조건이 달라 NON-COMPARABLE이며 품질 점수 상승을 주장하지 않는다.
|
||||
|
||||
TARGET: `D:\디자인시스템\hmdesign` / Runtime: React / Scope: BOTH(공개 Pattern·Storybook Reference 개선 + 독립 실험 화면). 초기 Working Tree는 clean이었다.
|
||||
|
||||
BASE_SHA: `0b2bc376aa8b6af9d2492b5620d8ae776391508d`
|
||||
|
||||
IMPLEMENTATION_SHA: `cb451b34363c72b50c1bb44a1f10b63b8f5e0163`
|
||||
|
||||
FINAL_SHA: 이 문서·집계 스크립트를 포함한 최종 HEAD는 제출 응답에 기록한다. 문서는 자신의 commit hash를 자체 포함할 수 없으므로 위 구현 기준과 분리한다.
|
||||
|
||||
## 원인과 개선 범위
|
||||
|
||||
기존 생성 화면 10개의 공통 RENDER-002는 React bootstrap 확인만으로 브라우저 실행을 증명할 수 없다는 판정이었다. Production Graph 실패라고 일괄 해석하거나 규칙을 완화해서는 해결되지 않는다. 일부 기존 소비 CSS의 의도 판단도 REUSE-003으로 남아 있었다. 낮은 추론의 보존된 02·06·07 결과에서는 미정의 HM Token 참조 17곳(고유 이름 8개)을 실제 확인했다.
|
||||
|
||||
| 우선순위 | 결과 | 근거와 영향 |
|
||||
|---|---|---|
|
||||
| P0_GUARD | PASS(검사 계약 범위) | entry별 연결 CSS·공개 Theme 정의로 TOKEN-001 감지. 계산된 참조/불완전 graph는 NOT VERIFIED. scope/profile/Production Graph 분리 유지. 그룹 근거·검사 파일·정적 상태 추가. source+contract hash가 일치하는 4개 폭·핵심 동작 증거만 별도 판정에 연결 |
|
||||
| P1_PATTERN | PASS(근거 있는 개선) | FilterBar `layout` opt-in으로 목록 기본/확장형 표현. 기본 동작 호환. Form/Empty/Error/Chart는 없는 API를 신설하지 않고 공개 Component composition으로 안내 |
|
||||
| P2_AI_GUIDELINES | PASS | AGENTS 핵심 계약 → 기능 선택표 → 선택한 Pattern/Component 문서 순서. Native 콘텐츠 HTML 허용, Label 연결, Navigation 한 모드, 미요청 기능 금지, 결과 보고 구분 명시 |
|
||||
| P3_STORYBOOK | PASS(선택한 Reference) | FilterBar All ID 유지, 실제 조회 적용/초기화·Label/useId·Do/Don't·layout 예제. 신규 업무 Story 등록 없음. 모든 Story를 재작성하지 않음 |
|
||||
| P4_ACCESSIBILITY | PARTIAL | Clear 버튼 Enter 후 focus가 BODY로 손실되는 문제를 Chrome에서 재현·수정. 외부 ref/Label focus도 packed consumer에서 검증. Dialog/Sheet/Drawer/mobile focus 복귀, Form 오류 focus, Checkbox/Switch/readOnly 검증. 전체 WCAG·스크린리더는 NOT VERIFIED |
|
||||
| P5_THEME_TOKEN | PASS(정적·테마 회귀 범위) | 연결 공개 CSS 목록 1,170개 선언 이름 inventory. Runtime override key 목록과 동일하다고 보지 않음. 새 Token/색/글꼴/간격 값 추가 없음. Theme Loader/Designer/실제 keyboard 검증 통과 |
|
||||
|
||||
## 주요 수정 파일
|
||||
|
||||
| 파일 | 변경 이유·내용 | 영향 범위 |
|
||||
|---|---|---|
|
||||
| `scripts/ai-generation-guard.mjs`, `guard-theme-analysis.mjs` | 미정의 Token 및 정적 판정의 근거 부족 → 연결 graph 검사·그룹 근거·hash·staticStatus | 기존 원본 status/exit/issues 유지; additive JSON schemaVersion 2 |
|
||||
| `scripts/guard-evidence.mjs` | Runtime 근거를 원본 Guard와 구분하여 연결 | stale source/contract, 정적 FAIL/NV, 미확인 bootstrap을 PASS로 덮어쓰지 않음; PARTIAL scope 유지 |
|
||||
| `packages/ui/src/patterns/filter-bar/filter-bar.tsx`, `src/theme/filter-bar.css`, `src/theme/dashboard-layout.css`, `src/index.ts` | 목록 구조 재사용·Clear focus 손실 | `layout` optional prop/공개 Props type, 기존 ref 전달 보존; default CSS 동작 유지 |
|
||||
| `src/patterns/filter-bar.stories.tsx` | draft와 applied 조건·접근성·사용 기준 명확화 | 기존 All Story 유지, 선택적 목록 layout과 사용 예제 |
|
||||
| `AGENTS.md`, `docs/guidelines/ai-screen-contract.md`, 관련 Guard/Pattern 문서 | 중복·암묵적 선택 기준 감소 | 문서 우선순위·API/상태/Native/Navigation 선택과 검증 계약 |
|
||||
| `examples/ai-quality/**` | 신규 React 생성 결과로 실제 계약 검증 | 10개 독립 bootstrap, Storybook/운영 메뉴와 별개; 공통 composition 사용 |
|
||||
| `scripts/verify-quality-*.mjs`, `audit-quality-contracts.mjs`, `summarize-quality-evidence.mjs` | 재현 가능한 브라우저·회귀·집계 | localhost와 로컬 evidence; Playwright/Chrome 경로는 환경 변수 필요 |
|
||||
|
||||
## 생성 실험
|
||||
|
||||
| ID | 화면 | 난이도 | Navigation | 필수 내용 Pattern |
|
||||
|---|---|---|---|---|
|
||||
| 01 | 사용자 목록 | Easy | GNB | FilterBar/DataTable |
|
||||
| 02 | 현장 업무 카드 | Medium | GNB | FilterBar |
|
||||
| 03 | 승인 결재 | Hard | GNB | FilterBar/DataTable + Dialog |
|
||||
| 04 | 채용 관리 | Hard | GNB | FilterBar/DataTable + Sheet |
|
||||
| 05 | 업무 요청 | Medium | GNB | 별도 Form API 없음; Label/Input/Textarea/Checkbox |
|
||||
| 06 | 권한 설정 | Medium | LNB | Checkbox/Switch/readOnly Input |
|
||||
| 07 | 업무 Dashboard | Medium | Dashboard | DashboardLayout/Tabs/Progress |
|
||||
| 08 | 통계 Dashboard | Medium | Dashboard | DashboardLayout/DataTable 분류별 집계 |
|
||||
| 09 | 작업 변경 | Hard | GNB | Drawer |
|
||||
| 10 | 처리 상태 | Easy | LNB | Skeleton/Alert/빈 결과 composition |
|
||||
|
||||
SCREEN_COUNT: 10
|
||||
|
||||
MODEL: GPT-6(session identity), 같은 Codex 세션의 공유 composition. 이전 실험 소스를 정답 코드로 제공하지 않았다.
|
||||
|
||||
REASONING_LEVEL: UNAVAILABLE / RANDOM_SEED: UNAVAILABLE. 조건은 화면별 requirements.json에 보존. 독립 모델 실행·낮은 추론 재생성은 NOT VERIFIED.
|
||||
|
||||
TYPECHECK: PASS(strict, skipLibCheck:false) / BUILD: PASS / RUNTIME: PASS(10화면 × 4폭 = 40렌더, 핵심 동작 그룹 24/24).
|
||||
|
||||
AVERAGE_DESIGN_SCORE: NOT VERIFIED. 점수 rubric/독립 평가를 실행하지 않았다. 10개 화면 대표 캡처의 시각 확인은 수행했지만 점수로 환산하지 않았다.
|
||||
|
||||
COMPONENT_REUSE_RATE: 소스 JSX site 기준 100%(121 HM 공개 API site / 121 HM+native widget site, native widget 0). 공유 TSX를 한 번씩 계산, 콘텐츠/레이아웃 HTML 및 local composition wrapper 제외. 이 수치는 mounted DOM 비율이나 디자인 품질 점수가 아니다. 실제 HM slot 렌더는 10화면에서 확인했다.
|
||||
|
||||
PATTERN_REUSE_RATE: 요구된 내용 Pattern 10/10(100%)이 4개 폭 모두 실제 렌더. Navigation은 별도 모드 검사. Pattern이 없는 기능은 분모에서 제외하고 composition 이유를 기록했다.
|
||||
|
||||
GUARD_PASS: 원본 0 / 정적 계약 10 / Runtime 연결 판정 10
|
||||
|
||||
GUARD_FAIL: 원본 0 / 연결 0
|
||||
|
||||
GUARD_NOT_VERIFIED: 원본 10(RENDER-002) / 연결 0. 원본 issue를 삭제하지 않았다.
|
||||
|
||||
ACCESSIBILITY_ISSUES: 검사한 visible control 이름 누락·중복 ID·active tab 연결 오류 0; tested focus/keyboard 통과. 전체 접근성 문제 0을 의미하지 않는다.
|
||||
|
||||
UNREQUESTED_FEATURES: 정의한 허용 main 액션·단일 업무 메뉴 기준 0. 기본 공개 DataTable 페이지 기능/검색 clear/Overlay close는 Component 기본 기능이다. 의미적 전체 요구사항 평가는 NOT VERIFIED.
|
||||
|
||||
THEME_TOKEN: 새 화면의 연결 HM Token 위반 0, 실제 Theme/font/utilities 적용 확인. 임의 Chart·CSV·다운로드·외부 API·추가 운영 메뉴 없음.
|
||||
|
||||
## 회귀 검증
|
||||
|
||||
| 항목 | 최종 결과 |
|
||||
|---|---|
|
||||
| TYPECHECK | root/UI/CENTER/신규화면 PASS |
|
||||
| UI_BUILD | UI/CENTER package build PASS |
|
||||
| PRODUCTION_BUILD | root, Dashboard export+finalizer, Recruit, Publisher PASS |
|
||||
| STORYBOOK_BUILD | PASS, 기존 292 ID → 292 ID(add/delete 0) |
|
||||
| COMPONENT_TEST | 9/9 PASS, 기존 8개 test AST 본문 동일 |
|
||||
| GUARD_TEST | 63/63 PASS, 기존 51개 test AST 본문 동일 |
|
||||
| EVIDENCE_TEST / THEME_TEST | 5/5 / 3/3 PASS |
|
||||
| GUARD_FULL_SCREEN | 기존 root NOT VERIFIED(CSS 의도 13+RENDER-002); FAIL 0 |
|
||||
| GUARD_PARTIAL | root NOT VERIFIED(SCOPE-001: graph 밖 tailwind.css + RENDER-002); 신규01 static PASS/raw NV |
|
||||
| GUARD_STORYBOOK | FULL NOT VERIFIED(wrapper1/CSS19/native33/computed token2); FAIL 0. FilterBar PARTIAL PASS |
|
||||
| GUARD_GENERATED_SCREEN | raw 10 NV / static 10 PASS / 연결 10 PASS |
|
||||
| CSS_IMPORTS | 연결 73개 누락 0 |
|
||||
| EXPORTS | UI/CENTER 선언 export target 16개 누락 0 |
|
||||
| DOC_LINKS | 96문서·429 내부 링크 PASS |
|
||||
| THEME_JSON_LOADER | PASS(service primary #6837a8 → default #123328) |
|
||||
| THEME_DESIGNER | 96 checks PASS |
|
||||
| RUNTIME_THEME | 자동136/58 parts PASS, 실제 keyboard138 checks PASS(R3 보존) |
|
||||
| PACKAGE_CONSUMER | npm pack 설치, 독립 엄격 TS·Vite build·public CSS·Label/ref/Clear focus PASS |
|
||||
| GIT_CLONE_RUNTIME | --no-hardlinks clone, 자체 npm ci/typecheck/build; 01/08 각각4폭·검색/집계 PASS |
|
||||
| RESPONSIVE | 신규40렌더, 기존 app/publisher/dashboard/recruit16렌더 PASS. Dashboard Header48/frame≥960·내부 scroll 확인 |
|
||||
|
||||
최초 실행에서 검사 harness의 Storybook bin 경로, test server `/themes/` 경로, 숨겨진 Radix input·중복 status locator 문제가 확인됐다. harness를 수정하고 영향받은 항목만 재검사했다. 실패 로그는 삭제하지 않았다. 최신 Loader/FilterBar·Storybook 결과가 초기 로그를 대체하는 근거다. 전체 검사를 동일 조건으로 반복하지 않았다.
|
||||
|
||||
## 보존 확인
|
||||
|
||||
D-01/D-02 및 PUBLISHER_ADDITIONAL: 확정 기준 문서 unchanged, 관련 기존 Component 테스트·Publisher/운영 브라우저 검증 PASS. 전체 문서 조항의 독립 수동 재인증은 NOT VERIFIED.
|
||||
|
||||
COMPONENT_API: 제거/이름 변경 없음; optional FilterBar layout/Props export만 추가. 기존 consumer ref도 검증.
|
||||
|
||||
THEME_TOKEN: default JSON·primitive/default/generated values·Tabs·Carousel TS/CSS 및 추가 요청 기준 9개 보호 파일 SHA256 일치. 기존 approved Theme 값과 미확정 항목을 변경하지 않음.
|
||||
|
||||
STORYBOOK_ID: 292개 보존 / EXISTING_TESTS: Guard51·Component8 AST 본문 보존.
|
||||
|
||||
## 증거·재현
|
||||
|
||||
Git 추적 요약은 같은 폴더 `ai-quality-improvement-2026-10-10.json`에 있다. 원본 결과·실패 시도·PNG는 gitignored `_local/quality-20261010`에 보존된다. 이전 실험/퍼블리셔 폴더는 읽기만 했다. 기존 증거 삭제·ZIP 배포 없음.
|
||||
|
||||
대표 최신 파일: `final-evidence.json`, `guard-01..10.json`, `runtime-01..10.json`, `combined-01..10.json`, `contract-audit.json`, `reference-runtime.json` + 후속 `reference-THEME_JSON_LOADER.json`/`reference-FILTERBAR_REFERENCE_USAGE.json`, `regression-*.json`, `consumer-runtime.json`, `clone-runtime/`, `clone-typecheck.log`, `clone-build.log`.
|
||||
|
||||
기본 재현 명령은 [실험 README](../../examples/ai-quality/README.md)와 [이전 준비 문서](../guidelines/gitea-source-transfer-preparation-2026-10-10.md)에 있다. aggregate는 per-screen 파일을 읽으므로 마지막 subset summary로 전체 성공 수를 대체하지 않는다. source 또는 Guard/Component 계약이 바뀌면 연결 판정은 stale이 된다.
|
||||
|
||||
## GitHub·이전 준비
|
||||
|
||||
PREVIOUS_HEAD: BASE_SHA와 동일. 구현 commit: `9ae2ab3`(Guard), `332c614`(FilterBar), `6034ac4`(10화면/검증), `cb451b3`(통계 집계).
|
||||
|
||||
COMMIT_SHA / REMOTE_HEAD / SHA_MATCH / WORKING_TREE / PUSH_RESULT: 제출 응답에서 최종 보고 commit을 포함한 일반 push와 실제 remote SHA 확인 결과를 기록한다. force push/reset/clean/remote 변경을 하지 않는다.
|
||||
|
||||
SOURCE_READY: 검증한 GitHub 소스·필수 파일/의존성/명령/위험을 [월요일 이전 준비](../guidelines/gitea-source-transfer-preparation-2026-10-10.md)에 정리했다. 이번에는 이전 실행 없음.
|
||||
|
||||
공식 Gitea: NOT ACCESSED / NOT MODIFIED. GitHub 연결 유지.
|
||||
|
||||
## 잔여 문제·최종 판단
|
||||
|
||||
연결 graph 기반 Token 감지, Pattern 표현/포커스 수정, 선택 지침과 실제 예제, 증거 연결·회귀 도구까지 구현했다. 기존 화면의 관측한 회귀는 0이다. 원본 Guard를 PASS로 만드는 것보다 판정 근거와 범위를 명확히 했다.
|
||||
|
||||
모델별 재현성·낮은 추론 신규 생성은 NOT VERIFIED. 기존 낮은 추론 3개 산출물의 Token 재검사만 수행했으며 새 cross-model 실험으로 보고하지 않는다. 공유 composition이므로 10개 독립 생성의 성공률로 일반화할 수 없다.
|
||||
|
||||
다음 우선순위는 같은 prompt/seed/모델별 독립 생성 및 실제 점수 rubric, 그 뒤 기존 전체 Storybook의 native/CSS intent 예외 검토·스크린리더/색 대비 검증이다. 과거 보고의 contrast 미충족/일부 clear icon 문제는 approved Theme를 임의 변경하지 않고 잔여 항목으로 유지한다. Combobox/DatePicker/Carousel/실기기 drag 전체 상태 재검증은 NOT VERIFIED.
|
||||
|
||||
Guard 한계: import/AST/CSS 선언 확인은 실제 cascade·미디어 활성 상태·모든 inline 변수 scope·실제 렌더 횟수를 보증하지 않는다. JS로 생성되는 동적 CSS/Token 및 의미적 미요청 기능은 별도 Runtime·사람 검토가 필요하다. Runtime evidence는 제공된 assertion이며 독립 보안 attestation이 아니다.
|
||||
|
||||
Started At: 2026-10-10 17:31:43 KST / Estimated Duration: 120~180분. Completed At·Actual Duration·Variance는 원격 확인이 끝난 제출 응답에 정확한 시각으로 기록한다.
|
||||
@@ -0,0 +1,616 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"source": "https://github.com/shkim25027/HMDesignSystemTest.git",
|
||||
"branch": "main",
|
||||
"baseHead": "4fe549da01683c363b0715aedeb82a089717f685",
|
||||
"finalHead": "Resolve the enclosing committed revision; exact final SHA is in the local release-manifest.json and final delivery report",
|
||||
"trackedFileCount": 595,
|
||||
"paths": [
|
||||
".gitignore",
|
||||
".storybook/main.ts",
|
||||
".storybook/manager-navigation.js",
|
||||
".storybook/manager.css",
|
||||
".storybook/manager.js",
|
||||
".storybook/preview-head.html",
|
||||
".storybook/preview.tsx",
|
||||
".storybook/pseudo-states.ts",
|
||||
".storybook/qa/LAN-PREVIEW-REPORT.md",
|
||||
".storybook/qa/LAN-PREVIEW.md",
|
||||
".storybook/qa/STORY-INVENTORY.md",
|
||||
".storybook/qa/generate-inventory.mjs",
|
||||
".storybook/qa/story-inventory.json",
|
||||
"AGENTS.md",
|
||||
"CLAUDE.md",
|
||||
"PORTABLE-R4-VERIFICATION.md",
|
||||
"PORTABLE-R5-CANDIDATE-VERIFICATION.md",
|
||||
"PORTABLE-R5-VERIFICATION.md",
|
||||
"PORTABLE-R6-VERIFICATION.md",
|
||||
"README.md",
|
||||
"docs/center-graphic/README.md",
|
||||
"docs/components/accordion.md",
|
||||
"docs/components/alert-dialog.md",
|
||||
"docs/components/alert.md",
|
||||
"docs/components/aspect-ratio.md",
|
||||
"docs/components/avatar.md",
|
||||
"docs/components/badge.md",
|
||||
"docs/components/breadcrumb.md",
|
||||
"docs/components/button.md",
|
||||
"docs/components/calendar.md",
|
||||
"docs/components/card.md",
|
||||
"docs/components/carousel.md",
|
||||
"docs/components/checkbox.md",
|
||||
"docs/components/collapsible.md",
|
||||
"docs/components/combobox.md",
|
||||
"docs/components/command.md",
|
||||
"docs/components/context-menu.md",
|
||||
"docs/components/date-picker.md",
|
||||
"docs/components/dialog.md",
|
||||
"docs/components/drawer.md",
|
||||
"docs/components/dropdown-menu.md",
|
||||
"docs/components/field.md",
|
||||
"docs/components/hover-card.md",
|
||||
"docs/components/input.md",
|
||||
"docs/components/label.md",
|
||||
"docs/components/menubar.md",
|
||||
"docs/components/navigation-menu.md",
|
||||
"docs/components/pagination.md",
|
||||
"docs/components/popover.md",
|
||||
"docs/components/progress.md",
|
||||
"docs/components/radio-group.md",
|
||||
"docs/components/resizable.md",
|
||||
"docs/components/scroll-area.md",
|
||||
"docs/components/select.md",
|
||||
"docs/components/separator.md",
|
||||
"docs/components/sheet.md",
|
||||
"docs/components/skeleton.md",
|
||||
"docs/components/slider.md",
|
||||
"docs/components/sonner.md",
|
||||
"docs/components/switch.md",
|
||||
"docs/components/table.md",
|
||||
"docs/components/tabs.md",
|
||||
"docs/components/textarea.md",
|
||||
"docs/components/toggle-group.md",
|
||||
"docs/components/toggle.md",
|
||||
"docs/components/tooltip.md",
|
||||
"docs/guidelines/ai-generation-guard.md",
|
||||
"docs/guidelines/ai-generation-improvement-2026-10-10.md",
|
||||
"docs/guidelines/ai-generation-stabilization-2026-10-10.md",
|
||||
"docs/guidelines/ai-implementation-details.md",
|
||||
"docs/guidelines/ai-screen-contract.md",
|
||||
"docs/guidelines/component-pattern-reference.md",
|
||||
"docs/guidelines/consistency-audit-2026-10-06.md",
|
||||
"docs/guidelines/designer-theme-guide.md",
|
||||
"docs/guidelines/designer-theme-report.md",
|
||||
"docs/guidelines/gitea-source-transfer-preparation-2026-10-10.md",
|
||||
"docs/guidelines/gitea-source-transfer-preparation-2026-10-11.md",
|
||||
"docs/guidelines/guard-accuracy-2026-10-10.md",
|
||||
"docs/guidelines/hm-custom-implementation.md",
|
||||
"docs/guidelines/navigation-single-mode.md",
|
||||
"docs/guidelines/portable-test-distribution.md",
|
||||
"docs/guidelines/publisher-additional-review-2026-10-10.md",
|
||||
"docs/guidelines/publisher-distribution-guide.md",
|
||||
"docs/guidelines/publisher-integration-2026-10-09.md",
|
||||
"docs/guidelines/publisher-stabilization-2026-10-10.md",
|
||||
"docs/guidelines/publisher-validation-2026-10-10.md",
|
||||
"docs/guidelines/runtime-portability.md",
|
||||
"docs/guidelines/runtime-theme-contract.md",
|
||||
"docs/guidelines/runtime-theme-hardcode-audit.csv",
|
||||
"docs/guidelines/runtime-theme-report.md",
|
||||
"docs/guidelines/runtime-theme.md",
|
||||
"docs/guidelines/shadcn-기반-구현-원칙.md",
|
||||
"docs/guidelines/theme-delivery.md",
|
||||
"docs/guidelines/개발-적용-가이드.md",
|
||||
"docs/guidelines/운영-배포-가이드.md",
|
||||
"docs/guidelines/테마-토큰-가이드.md",
|
||||
"docs/guidelines/프로젝트-지침.md",
|
||||
"docs/patterns/dashboard-layout.md",
|
||||
"docs/patterns/dashboard-status-static.html",
|
||||
"docs/patterns/data-table.md",
|
||||
"docs/patterns/filter-bar.md",
|
||||
"docs/patterns/gnb.md",
|
||||
"docs/patterns/lnb.md",
|
||||
"docs/patterns/loading-screen.md",
|
||||
"docs/patterns/page-header.md",
|
||||
"docs/reports/accessibility-residual-2026-10-10.md",
|
||||
"docs/reports/ai-quality-improvement-2026-10-10.json",
|
||||
"docs/reports/ai-quality-improvement-2026-10-10.md",
|
||||
"docs/reports/gitea-source-inventory-2026-10-11.json",
|
||||
"docs/reports/guard-css-intent-dynamic-token-2026-10-10.md",
|
||||
"docs/reports/pre-gitea-finalization-2026-10-11.md",
|
||||
"docs/reports/publisher-a11y-guard-2026-10-10.md",
|
||||
"examples/ai-quality/01/index.html",
|
||||
"examples/ai-quality/01/main.tsx",
|
||||
"examples/ai-quality/01/requirements.json",
|
||||
"examples/ai-quality/02/index.html",
|
||||
"examples/ai-quality/02/main.tsx",
|
||||
"examples/ai-quality/02/requirements.json",
|
||||
"examples/ai-quality/03/index.html",
|
||||
"examples/ai-quality/03/main.tsx",
|
||||
"examples/ai-quality/03/requirements.json",
|
||||
"examples/ai-quality/04/index.html",
|
||||
"examples/ai-quality/04/main.tsx",
|
||||
"examples/ai-quality/04/requirements.json",
|
||||
"examples/ai-quality/05/index.html",
|
||||
"examples/ai-quality/05/main.tsx",
|
||||
"examples/ai-quality/05/requirements.json",
|
||||
"examples/ai-quality/06/index.html",
|
||||
"examples/ai-quality/06/main.tsx",
|
||||
"examples/ai-quality/06/requirements.json",
|
||||
"examples/ai-quality/07/index.html",
|
||||
"examples/ai-quality/07/main.tsx",
|
||||
"examples/ai-quality/07/requirements.json",
|
||||
"examples/ai-quality/08/index.html",
|
||||
"examples/ai-quality/08/main.tsx",
|
||||
"examples/ai-quality/08/requirements.json",
|
||||
"examples/ai-quality/09/index.html",
|
||||
"examples/ai-quality/09/main.tsx",
|
||||
"examples/ai-quality/09/requirements.json",
|
||||
"examples/ai-quality/10/index.html",
|
||||
"examples/ai-quality/10/main.tsx",
|
||||
"examples/ai-quality/10/requirements.json",
|
||||
"examples/ai-quality/README.md",
|
||||
"examples/ai-quality/shared/Dashboard.tsx",
|
||||
"examples/ai-quality/shared/GNBFrame.tsx",
|
||||
"examples/ai-quality/shared/Heading.tsx",
|
||||
"examples/ai-quality/shared/LNBFrame.tsx",
|
||||
"examples/ai-quality/shared/OverlayWorkflow.tsx",
|
||||
"examples/ai-quality/shared/Permissions.tsx",
|
||||
"examples/ai-quality/shared/RequestForm.tsx",
|
||||
"examples/ai-quality/shared/SearchList.tsx",
|
||||
"examples/ai-quality/shared/StateWorkflow.tsx",
|
||||
"examples/ai-quality/shared/hm-theme.css",
|
||||
"examples/ai-quality/shared/index.css",
|
||||
"examples/ai-quality/tsconfig.json",
|
||||
"examples/ai-quality/vite.config.ts",
|
||||
"examples/publisher-list/README.md",
|
||||
"examples/publisher-list/hm-theme.css",
|
||||
"examples/publisher-list/index.css",
|
||||
"examples/publisher-list/index.html",
|
||||
"examples/publisher-list/main.tsx",
|
||||
"examples/publisher-list/tsconfig.json",
|
||||
"examples/publisher-list/vite.config.ts",
|
||||
"index.html",
|
||||
"package-lock.json",
|
||||
"package.json",
|
||||
"packages/center-graphic/README.md",
|
||||
"packages/center-graphic/package.json",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교량/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교량/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교량/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교량/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교량/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교량/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교차로/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교차로/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교차로/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교차로/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/교차로/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/기타 시설물/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/기타 시설물/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/기타 시설물/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/기타 시설물/위치도/위치도.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/나들목/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/나들목/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/나들목/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/나들목/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/나들목/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/분기점/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/분기점/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/분기점/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/분기점/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/분기점, 나들목/분기점/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교량/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교량/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교량/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교량/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교량/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교량/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교차로/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교차로/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교차로/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교차로/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/교차로/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/나들목/시설물/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/나들목/시설물/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/나들목/시설물/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/나들목/시설물/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/나들목/시설물/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/나들목/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/나들목/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/분기점/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/분기점/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/분기점/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/분기점/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/분기점/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/터널/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/터널/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/터널/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/터널/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/터널/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/고속도로, 국도/터널/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교량/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교량/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교량/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교량/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교량/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교량/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교차로/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교차로/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교차로/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교차로/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/교차로/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/터널/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/터널/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/터널/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/터널/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/터널/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/구도,면도, 이도/터널/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교량/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교량/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교량/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교량/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교량/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교량/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교차로/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교차로/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교차로/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교차로/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/교차로/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/터널/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/터널/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/터널/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/터널/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/터널/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/시도,군도/터널/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교량/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교량/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교량/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교량/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교량/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교량/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교차로/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교차로/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교차로/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교차로/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/교차로/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/터널/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/터널/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/터널/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/터널/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/터널/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/지방도/터널/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교량/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교량/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교량/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교량/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교량/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교량/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교차로/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교차로/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교차로/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교차로/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/교차로/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/터널/실사화/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/터널/실사화/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/터널/실사화/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/터널/위치도/오른쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/터널/위치도/왼쪽.svg",
|
||||
"packages/center-graphic/src/assets/facility/batch/source/연계 시설물/특별시도/터널/위치도/중앙.svg",
|
||||
"packages/center-graphic/src/assets/facility/tunnel/actual-detail/center.svg",
|
||||
"packages/center-graphic/src/assets/facility/tunnel/actual-detail/left.svg",
|
||||
"packages/center-graphic/src/assets/facility/tunnel/actual-detail/right.svg",
|
||||
"packages/center-graphic/src/assets/facility/tunnel/position-map/center.svg",
|
||||
"packages/center-graphic/src/assets/facility/tunnel/position-map/left.svg",
|
||||
"packages/center-graphic/src/assets/facility/tunnel/position-map/right.svg",
|
||||
"packages/center-graphic/src/components/CenterInformationDisplay.css",
|
||||
"packages/center-graphic/src/components/CenterInformationDisplay.tsx",
|
||||
"packages/center-graphic/src/components/CenterRepresentation.css",
|
||||
"packages/center-graphic/src/components/CenterRepresentation.tsx",
|
||||
"packages/center-graphic/src/components/CenterSpatialInformation.css",
|
||||
"packages/center-graphic/src/components/CenterSpatialInformation.tsx",
|
||||
"packages/center-graphic/src/components/CenterTitle.css",
|
||||
"packages/center-graphic/src/components/CenterTitle.tsx",
|
||||
"packages/center-graphic/src/components/CompactFacilityConnection.css",
|
||||
"packages/center-graphic/src/components/CompactFacilityConnection.tsx",
|
||||
"packages/center-graphic/src/components/FacilityBatch.css",
|
||||
"packages/center-graphic/src/components/FacilityBatch.tsx",
|
||||
"packages/center-graphic/src/components/TunnelFacility.css",
|
||||
"packages/center-graphic/src/components/TunnelFacility.tsx",
|
||||
"packages/center-graphic/src/env.d.ts",
|
||||
"packages/center-graphic/src/index.ts",
|
||||
"packages/center-graphic/src/reference.ts",
|
||||
"packages/center-graphic/tsconfig.build.json",
|
||||
"packages/center-graphic/tsconfig.json",
|
||||
"packages/ui/README.md",
|
||||
"packages/ui/components.json",
|
||||
"packages/ui/package.json",
|
||||
"packages/ui/src/components/ui/accordion.tsx",
|
||||
"packages/ui/src/components/ui/alert-dialog.tsx",
|
||||
"packages/ui/src/components/ui/alert.tsx",
|
||||
"packages/ui/src/components/ui/aspect-ratio.tsx",
|
||||
"packages/ui/src/components/ui/avatar.tsx",
|
||||
"packages/ui/src/components/ui/badge.tsx",
|
||||
"packages/ui/src/components/ui/breadcrumb.tsx",
|
||||
"packages/ui/src/components/ui/button.tsx",
|
||||
"packages/ui/src/components/ui/calendar.tsx",
|
||||
"packages/ui/src/components/ui/card.tsx",
|
||||
"packages/ui/src/components/ui/carousel.tsx",
|
||||
"packages/ui/src/components/ui/checkbox.tsx",
|
||||
"packages/ui/src/components/ui/collapsible.tsx",
|
||||
"packages/ui/src/components/ui/combobox.tsx",
|
||||
"packages/ui/src/components/ui/command.tsx",
|
||||
"packages/ui/src/components/ui/context-menu.tsx",
|
||||
"packages/ui/src/components/ui/date-picker.tsx",
|
||||
"packages/ui/src/components/ui/dialog.tsx",
|
||||
"packages/ui/src/components/ui/drawer.tsx",
|
||||
"packages/ui/src/components/ui/dropdown-menu.tsx",
|
||||
"packages/ui/src/components/ui/hover-card.tsx",
|
||||
"packages/ui/src/components/ui/input.tsx",
|
||||
"packages/ui/src/components/ui/label.tsx",
|
||||
"packages/ui/src/components/ui/menubar.tsx",
|
||||
"packages/ui/src/components/ui/navigation-menu.tsx",
|
||||
"packages/ui/src/components/ui/pagination.tsx",
|
||||
"packages/ui/src/components/ui/popover.tsx",
|
||||
"packages/ui/src/components/ui/progress.tsx",
|
||||
"packages/ui/src/components/ui/radio-group.tsx",
|
||||
"packages/ui/src/components/ui/resizable.tsx",
|
||||
"packages/ui/src/components/ui/scroll-area.tsx",
|
||||
"packages/ui/src/components/ui/select.tsx",
|
||||
"packages/ui/src/components/ui/separator.tsx",
|
||||
"packages/ui/src/components/ui/sheet.tsx",
|
||||
"packages/ui/src/components/ui/skeleton.tsx",
|
||||
"packages/ui/src/components/ui/slider.tsx",
|
||||
"packages/ui/src/components/ui/sonner.tsx",
|
||||
"packages/ui/src/components/ui/switch.tsx",
|
||||
"packages/ui/src/components/ui/table.tsx",
|
||||
"packages/ui/src/components/ui/tabs.tsx",
|
||||
"packages/ui/src/components/ui/textarea.tsx",
|
||||
"packages/ui/src/components/ui/toggle-group.tsx",
|
||||
"packages/ui/src/components/ui/toggle.tsx",
|
||||
"packages/ui/src/components/ui/tooltip.tsx",
|
||||
"packages/ui/src/components/ui/use-connected-popup-ref.ts",
|
||||
"packages/ui/src/index.ts",
|
||||
"packages/ui/src/lib/utils.ts",
|
||||
"packages/ui/src/patterns/dashboard-layout/dashboard-layout.tsx",
|
||||
"packages/ui/src/patterns/dashboard-layout/index.ts",
|
||||
"packages/ui/src/patterns/dashboard-status/contract.ts",
|
||||
"packages/ui/src/patterns/dashboard-status/dashboard-status.css",
|
||||
"packages/ui/src/patterns/dashboard-status/index.ts",
|
||||
"packages/ui/src/patterns/data-table/data-table.tsx",
|
||||
"packages/ui/src/patterns/data-table/index.ts",
|
||||
"packages/ui/src/patterns/filter-bar/filter-bar.tsx",
|
||||
"packages/ui/src/patterns/filter-bar/index.ts",
|
||||
"packages/ui/src/patterns/gnb/gnb.tsx",
|
||||
"packages/ui/src/patterns/gnb/index.ts",
|
||||
"packages/ui/src/patterns/lnb/index.ts",
|
||||
"packages/ui/src/patterns/lnb/lnb-mobile.tsx",
|
||||
"packages/ui/src/patterns/lnb/lnb.tsx",
|
||||
"packages/ui/src/patterns/loading-screen/index.ts",
|
||||
"packages/ui/src/patterns/loading-screen/loading-screen.tsx",
|
||||
"packages/ui/src/patterns/page-header/index.ts",
|
||||
"packages/ui/src/patterns/page-header/page-header.tsx",
|
||||
"packages/ui/src/tailwind.css",
|
||||
"packages/ui/src/theme.css",
|
||||
"packages/ui/src/theme/accordion.css",
|
||||
"packages/ui/src/theme/alert-dialog.css",
|
||||
"packages/ui/src/theme/alert.css",
|
||||
"packages/ui/src/theme/avatar.css",
|
||||
"packages/ui/src/theme/badge.css",
|
||||
"packages/ui/src/theme/breadcrumb.css",
|
||||
"packages/ui/src/theme/button.css",
|
||||
"packages/ui/src/theme/calendar.css",
|
||||
"packages/ui/src/theme/card.css",
|
||||
"packages/ui/src/theme/carousel.css",
|
||||
"packages/ui/src/theme/checkbox.css",
|
||||
"packages/ui/src/theme/collapsible.css",
|
||||
"packages/ui/src/theme/combobox.css",
|
||||
"packages/ui/src/theme/command.css",
|
||||
"packages/ui/src/theme/context-menu.css",
|
||||
"packages/ui/src/theme/contract.ts",
|
||||
"packages/ui/src/theme/dashboard-layout.css",
|
||||
"packages/ui/src/theme/data-table.css",
|
||||
"packages/ui/src/theme/date-picker.css",
|
||||
"packages/ui/src/theme/default-values.generated.ts",
|
||||
"packages/ui/src/theme/default.css",
|
||||
"packages/ui/src/theme/dialog.css",
|
||||
"packages/ui/src/theme/drawer.css",
|
||||
"packages/ui/src/theme/dropdown-menu.css",
|
||||
"packages/ui/src/theme/filter-bar.css",
|
||||
"packages/ui/src/theme/gnb.css",
|
||||
"packages/ui/src/theme/hover-card.css",
|
||||
"packages/ui/src/theme/index.ts",
|
||||
"packages/ui/src/theme/input.css",
|
||||
"packages/ui/src/theme/label.css",
|
||||
"packages/ui/src/theme/lnb.css",
|
||||
"packages/ui/src/theme/loader.ts",
|
||||
"packages/ui/src/theme/loading-screen.css",
|
||||
"packages/ui/src/theme/menubar.css",
|
||||
"packages/ui/src/theme/navigation-menu.css",
|
||||
"packages/ui/src/theme/overlay.css",
|
||||
"packages/ui/src/theme/page-header.css",
|
||||
"packages/ui/src/theme/pagination.css",
|
||||
"packages/ui/src/theme/popover.css",
|
||||
"packages/ui/src/theme/primitives.css",
|
||||
"packages/ui/src/theme/progress.css",
|
||||
"packages/ui/src/theme/radio-group.css",
|
||||
"packages/ui/src/theme/requests.ts",
|
||||
"packages/ui/src/theme/resizable.css",
|
||||
"packages/ui/src/theme/runtime.ts",
|
||||
"packages/ui/src/theme/scroll-area.css",
|
||||
"packages/ui/src/theme/select.css",
|
||||
"packages/ui/src/theme/separator.css",
|
||||
"packages/ui/src/theme/sheet.css",
|
||||
"packages/ui/src/theme/skeleton.css",
|
||||
"packages/ui/src/theme/slider.css",
|
||||
"packages/ui/src/theme/sonner.css",
|
||||
"packages/ui/src/theme/switch.css",
|
||||
"packages/ui/src/theme/table.css",
|
||||
"packages/ui/src/theme/tabs.css",
|
||||
"packages/ui/src/theme/textarea.css",
|
||||
"packages/ui/src/theme/toggle-group.css",
|
||||
"packages/ui/src/theme/toggle.css",
|
||||
"packages/ui/src/theme/tooltip.css",
|
||||
"packages/ui/tsconfig.build.json",
|
||||
"packages/ui/tsconfig.json",
|
||||
"public/fonts/NotoSansKR-OFL.txt",
|
||||
"public/fonts/NotoSansKR-variable.ttf",
|
||||
"scripts/accessibility-regression.test.mjs",
|
||||
"scripts/ai-generation-guard.mjs",
|
||||
"scripts/ai-generation-guard.test.mjs",
|
||||
"scripts/audit-quality-contracts.mjs",
|
||||
"scripts/build-package.mjs",
|
||||
"scripts/check-doc-links.mjs",
|
||||
"scripts/create-ai-reference-package.mjs",
|
||||
"scripts/create-publisher-distribution.mjs",
|
||||
"scripts/finalize-dashboard-export.mjs",
|
||||
"scripts/guard-evidence.mjs",
|
||||
"scripts/guard-evidence.test.mjs",
|
||||
"scripts/guard-navigation-analysis.mjs",
|
||||
"scripts/guard-requirements.mjs",
|
||||
"scripts/guard-requirements.test.mjs",
|
||||
"scripts/guard-style-analysis.mjs",
|
||||
"scripts/guard-style-evidence.mjs",
|
||||
"scripts/guard-theme-analysis.mjs",
|
||||
"scripts/h2-preview.mjs",
|
||||
"scripts/portable-preview/preview-server.cjs",
|
||||
"scripts/portable-preview/start-preview.bat",
|
||||
"scripts/prepare-quality-experiments.mjs",
|
||||
"scripts/public-theme-tokens.mjs",
|
||||
"scripts/publisher-components.test.mjs",
|
||||
"scripts/serve-quality-reference.mjs",
|
||||
"scripts/start-storybook.mjs",
|
||||
"scripts/summarize-quality-evidence.mjs",
|
||||
"scripts/theme-artifacts.mjs",
|
||||
"scripts/theme-contract.mjs",
|
||||
"scripts/theme-defaults.mjs",
|
||||
"scripts/theme-templates/default.css",
|
||||
"scripts/theme-templates/primitives.css",
|
||||
"scripts/theme-verification.test.mjs",
|
||||
"scripts/verify-accessibility-runtime.mjs",
|
||||
"scripts/verify-quality-reference.mjs",
|
||||
"scripts/verify-quality-regression.mjs",
|
||||
"scripts/verify-quality-runtime.mjs",
|
||||
"src/App.tsx",
|
||||
"src/center/center-facility.stories.tsx",
|
||||
"src/center/center-information.stories.tsx",
|
||||
"src/center/center-overview.stories.tsx",
|
||||
"src/center/center-shared.tsx",
|
||||
"src/center/center-spatial.stories.tsx",
|
||||
"src/center/center-stories.css",
|
||||
"src/center/center-title.stories.tsx",
|
||||
"src/components/accordion.stories.tsx",
|
||||
"src/components/alert-dialog.stories.tsx",
|
||||
"src/components/alert.stories.tsx",
|
||||
"src/components/aspect-ratio.stories.tsx",
|
||||
"src/components/avatar.stories.tsx",
|
||||
"src/components/badge.stories.tsx",
|
||||
"src/components/breadcrumb.stories.tsx",
|
||||
"src/components/button.stories.tsx",
|
||||
"src/components/calendar.stories.tsx",
|
||||
"src/components/card.stories.tsx",
|
||||
"src/components/carousel.stories.tsx",
|
||||
"src/components/checkbox.stories.tsx",
|
||||
"src/components/collapsible.stories.tsx",
|
||||
"src/components/combobox.stories.tsx",
|
||||
"src/components/command.stories.tsx",
|
||||
"src/components/context-menu.stories.tsx",
|
||||
"src/components/date-picker.stories.tsx",
|
||||
"src/components/dialog.stories.tsx",
|
||||
"src/components/drawer.stories.tsx",
|
||||
"src/components/dropdown-menu.stories.tsx",
|
||||
"src/components/hover-card.stories.tsx",
|
||||
"src/components/input.stories.tsx",
|
||||
"src/components/label.stories.tsx",
|
||||
"src/components/menubar.stories.tsx",
|
||||
"src/components/navigation-menu.stories.tsx",
|
||||
"src/components/pagination.stories.tsx",
|
||||
"src/components/popover.stories.tsx",
|
||||
"src/components/progress.stories.tsx",
|
||||
"src/components/publisher-regression.stories.tsx",
|
||||
"src/components/radio-group.stories.tsx",
|
||||
"src/components/resizable.stories.tsx",
|
||||
"src/components/scroll-area.stories.tsx",
|
||||
"src/components/select.stories.tsx",
|
||||
"src/components/separator.stories.tsx",
|
||||
"src/components/sheet.stories.tsx",
|
||||
"src/components/skeleton.stories.tsx",
|
||||
"src/components/slider.stories.tsx",
|
||||
"src/components/sonner.stories.tsx",
|
||||
"src/components/story-board.tsx",
|
||||
"src/components/story-page.css",
|
||||
"src/components/story-page.tsx",
|
||||
"src/components/switch.stories.tsx",
|
||||
"src/components/table.stories.tsx",
|
||||
"src/components/tabs.stories.tsx",
|
||||
"src/components/textarea.stories.tsx",
|
||||
"src/components/toggle-group.stories.tsx",
|
||||
"src/components/toggle.stories.tsx",
|
||||
"src/components/tooltip.stories.tsx",
|
||||
"src/exports/dashboard/dashboard-export.css",
|
||||
"src/exports/dashboard/index.html",
|
||||
"src/exports/dashboard/main.tsx",
|
||||
"src/exports/recruit/index.html",
|
||||
"src/exports/recruit/main.tsx",
|
||||
"src/foundation/color.stories.tsx",
|
||||
"src/foundation/foundation.css",
|
||||
"src/foundation/layout.stories.tsx",
|
||||
"src/foundation/reference-data.ts",
|
||||
"src/foundation/reference.tsx",
|
||||
"src/foundation/typography.stories.tsx",
|
||||
"src/hm-theme.css",
|
||||
"src/index.css",
|
||||
"src/list-screen.css",
|
||||
"src/main.tsx",
|
||||
"src/patterns/dashboard-composition.css",
|
||||
"src/patterns/dashboard-composition.tsx",
|
||||
"src/patterns/dashboard-layout.stories.css",
|
||||
"src/patterns/dashboard-layout.stories.tsx",
|
||||
"src/patterns/dashboard-status-contract.css",
|
||||
"src/patterns/dashboard-work-status.ts",
|
||||
"src/patterns/data-table.stories.tsx",
|
||||
"src/patterns/filter-bar.stories.tsx",
|
||||
"src/patterns/gnb.stories.tsx",
|
||||
"src/patterns/lnb.stories.tsx",
|
||||
"src/patterns/loading-screen.stories.tsx",
|
||||
"src/patterns/page-header.stories.tsx",
|
||||
"src/patterns/sample-users.ts",
|
||||
"src/recruit/recruit-data.ts",
|
||||
"src/recruit/recruit-screen.tsx",
|
||||
"src/theme/designer-extras.tsx",
|
||||
"src/theme/designer-preview.tsx",
|
||||
"src/theme/designer-theme.css",
|
||||
"src/theme/designer-theme.stories.tsx",
|
||||
"src/theme/preview.ts",
|
||||
"src/theme/runtime-loader.stories.tsx",
|
||||
"src/theme/runtime-theme.stories.tsx",
|
||||
"src/theme/specimens.tsx",
|
||||
"src/theme/verification-baseline.json",
|
||||
"src/theme/verification-state.tsx",
|
||||
"src/vite-env.d.ts",
|
||||
"src/work-dashboard/WorkDashboard.tsx",
|
||||
"src/work-dashboard/data.ts",
|
||||
"src/work-dashboard/work-dashboard.css",
|
||||
"start-storybook.bat",
|
||||
"tailwind.css",
|
||||
"themes/default.json",
|
||||
"themes/drafts/preview-warm.json",
|
||||
"themes/service-example.json",
|
||||
"tsconfig.app.json",
|
||||
"tsconfig.json",
|
||||
"tsconfig.node.json",
|
||||
"vite.config.ts",
|
||||
"vite.dashboard-export.config.ts",
|
||||
"vite.recruit-export.config.ts"
|
||||
],
|
||||
"excluded": [
|
||||
".git",
|
||||
"node_modules",
|
||||
"_local",
|
||||
"dist",
|
||||
"storybook-static",
|
||||
"theme-dist",
|
||||
"ZIP",
|
||||
"independent experiment artifacts"
|
||||
],
|
||||
"giteaAccess": "NOT EXECUTED"
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
# Guard CSS Intent·동적 Token 검증 개선
|
||||
|
||||
RESULT: PARTIAL — 요청한 Guard·문서 구현과 필수 검증 PASS. T01 사용자 디자인 의도 및 미실행 Theme/동적 상태는 NOT VERIFIED.
|
||||
|
||||
TARGET: `D:\디자인시스템\hmdesign`
|
||||
|
||||
BASE_SHA: `512cd280554b385dbfa7606ea8a7e557ccf7b197`
|
||||
|
||||
최종 commit/push SHA·작업 시간은 이 보고서를 포함한 커밋을 만든 뒤 로컬 `_local/css-intent-20261010/FINAL_REPORT.md`에 기록한다. 자기 커밋 SHA를 동일 커밋 파일 안에 넣지 않는다. 실험 source·측정 JSON/PNG·기존 실패 증거는 GitHub에 추가 전송하지 않는다.
|
||||
|
||||
## 개선 결과와 판정 범위
|
||||
|
||||
| 항목 | 결과 |
|
||||
|---|---|
|
||||
| CSS_INTENT | STATIC/RUNTIME/DESIGN_INTENT/FINAL 분리. 명확한 Component HEX/RGB/HSL·spacing/radius override는 STYLE-001 FAIL. 일반 콘텐츠 CSS·Token override·중요도/승인 의도는 별도 inventory/NOT VERIFIED |
|
||||
| DYNAMIC_TOKEN | 최대 32개 유한 후보 전체 선언 검사. const/conditional/concatenation/template, shadowing, fallback, Props/style spread/className 미해석 위치를 구분. 실제 Runtime 미정의 Token은 computed fallback 일치에도 FAIL |
|
||||
| STATIC_ANALYSIS | 공개 import/CSS entry·Production graph·PARTIAL·Storybook 격리 보존. non-HM host 변수 미확인과 명확한 HM 미정의를 구분. 명백히 잘못된 var() TOKEN-003 FAIL |
|
||||
| RUNTIME_EVIDENCE | source/contract + site/file/rule/Component/DOM/property/state/browser/viewport 대응, 실제 값 비교. 원본 issues 보존, 중복 측정 PASS가 FAIL을 가리지 않음 |
|
||||
| DESIGN_INTENT | 자동 승인 기능 없음. 문서 recipe·해시·유효 행 검토도 NOT VERIFIED. 새 Theme 편집 방식이나 CSS override 허용 없음 |
|
||||
| MEDIUM_T01 | 기존 원본 화면만 사용. Theme/Status import와 연결 Token 정적 PASS. 4폭×4상태의 기존 종류 CSS 64건 + 3개 Badge override custom property 48건 = 112/112 PASS. 세 위치 STATIC PASS/RUNTIME PASS/DESIGN_INTENT NOT VERIFIED/FINAL NOT VERIFIED |
|
||||
|
||||
T01의 기존 `REUSE-003`는 `src/index.css:15`의 `[data-slot="badge"]` 규칙이다. 세 기존 Badge Token에 상태 변수·공식 background/border recipe를 연결한다. 연결 선언 존재와 브라우저 적용값은 검증할 수 있으나, 사용자가 요청한 화면 의미 및 예외 override 승인 여부는 이 근거만으로 확정할 수 없다. 기존 raw/static/combined NOT VERIFIED를 삭제하지 않았다. 새 결합의 raw/static도 NOT VERIFIED이며 전체 Runtime만 PASS다. 구체적인 CSS 검토 결과는 정적 PASS·위치별 Runtime PASS·디자인 의도 NOT VERIFIED로 구분한다.
|
||||
|
||||
`styleVerification.runtimeStatus`는 검토가 필요한 override/동적 위치에 대응하는 명명된 측정의 결과다. inventory의 모든 일반 레이아웃 선언, 모든 상태와 Theme 전환을 검증했다는 뜻이 아니다. `styleEvidence.checks`의 나머지 Runtime NOT VERIFIED를 전체 PASS로 바꾸지 않는다.
|
||||
|
||||
## 수정 파일과 영향
|
||||
|
||||
| 파일 | 원인 / 변경 내용 | 영향 |
|
||||
|---|---|---|
|
||||
| scripts/ai-generation-guard.mjs | 스타일 inventory·동적 위치·선언 출처/행·새 분석기 contract hash 연결 | 기존 소비 graph/Navigation/Storybook 범위 유지 |
|
||||
| scripts/guard-theme-analysis.mjs | 동적 문자열·Props와 var fallback 검사의 한계 | 유한 후보/미해석 위치/외부 변수/잘못된 참조를 구분 |
|
||||
| scripts/guard-style-analysis.mjs | 선언 존재와 디자인 의도가 기존 REUSE-003 하나에 묶임 | 명확한 위반·일반 CSS·Global/scoped·Token override 분리 |
|
||||
| scripts/guard-style-evidence.mjs | 측정 PASS가 특정 source site에 대응하지 않음 | 실제 DOM/Component/rule/state/browser와 위치별 네 판정 연결 |
|
||||
| scripts/guard-evidence.mjs | 상태 이름·문서 행·충돌/위반 처리 보강 필요 | 원본 보존, 임의 supplied PASS 대신 계산, FAIL 우선 |
|
||||
| scripts/ai-generation-guard.test.mjs | 회귀 coverage 확대 | 기존 63개 본문 보존 + 12개 신규 |
|
||||
| scripts/guard-evidence.test.mjs | Runtime false PASS 방지 | 기존 11개 본문 보존 + 9개 신규 |
|
||||
| AGENTS.md / docs/guidelines/ai-screen-contract.md | AI 화면의 Token/override 보고 계약 명확화 | 기존 Theme 편집 권한·Runtime 공개 계약 확대 없음 |
|
||||
| docs/guidelines/ai-generation-guard.md | 세 영역·동적 후보·위치별 JSON/실행 명령·한계 설명 | 과거 테스트 수와 기존 증거는 역사 기록으로 보존 |
|
||||
| docs/components/badge.md / docs/patterns/dashboard-layout.md | 기존 상태 recipe와 승인 의도의 구분 | Component·Pattern API/디자인 예제 자체는 미변경 |
|
||||
| 이 보고서 | 실제 검증 범위와 잔여 한계 기록 | 저장소 보고 근거 |
|
||||
|
||||
## 검증
|
||||
|
||||
| 검사 | 결과 / 근거 |
|
||||
|---|---|
|
||||
| GUARD_EXISTING | EXECUTED PASS — 기존 63개 본문 보존, 최종 suite에서 통과 |
|
||||
| GUARD_NEW | EXECUTED PASS — 12개 추가, 현재 Guard 75/75 |
|
||||
| CSS_INTENT_TEST | EXECUTED PASS — Component HEX/RGB/HSL/numeric spacing/radius/utility, Token override, Global/general CSS, literal 동적 분기, graph 밖/Storybook 범위 |
|
||||
| DYNAMIC_TOKEN_TEST | EXECUTED PASS — 유한 후보·미정의 분기·fallback·shadowed/destructured binding·외부 Props/style/class·Runtime 미정의 참조 |
|
||||
| RUNTIME_EVIDENCE_TEST | EXECUTED PASS — 기존 11 + 신규 9 = 20/20. stale/hash·scope·불가능한 문서 행·site/selector/Component/browser/state·중복 이름과 static 충돌 검사 |
|
||||
| REQUIREMENTS_LINK | EXECUTED PASS — 기존 연결 검사 5/5 |
|
||||
| 통합 테스트 | EXECUTED 100/100 PASS, `_local/css-intent-20261010/tests-release-final.log` |
|
||||
| MEDIUM_T01 | EXECUTED 112/112 CSS 측정 + 20개 필터 동작 + 4 viewport PASS. Dashboard 48px/960px 유지. FINAL NOT VERIFIED |
|
||||
| TYPECHECK | EXECUTED PASS — npm run typecheck, Theme defaults 71/73 일치 및 packages build hook 포함 |
|
||||
| BUILD | EXECUTED PASS — npm run build --ignore-scripts. 이미 성공한 Theme/package hook 중복 생략. 기존 500kB chunk 경고는 별도 보존 |
|
||||
| DOC_CONSISTENCY | EXECUTED — 변경된 로컬 링크/anchor·실행 명령·결과 필드·원칙을 변경 범위에서 점검 |
|
||||
| RELATED_STORY | 관련 Badge/Dashboard/Runtime Theme/Designer source 설명 확인. 이번 Guard의 Production 하드코드 FAIL은 Storybook에 강제하지 않음. 설명 충돌 없음, Story source/ID 수정 0. 전체 렌더 NOT VERIFIED |
|
||||
|
||||
초기 기존 suite 1건은 반복 Token 목록으로 JSON이 spawnSync 출력 버퍼를 초과한 도구 오류였다. 동적 위치가 있는 entry에만 선언 목록을 출력해 같은 검사 재실행 PASS, 최종 100개 전체 PASS다. 초기 T01 추가 32건은 기대 source `var()` 문자열과 computed 치환 값의 비교 형식 오류였다. 해당 실패 JSON/로그를 보존하고 실패 32건만 재측정했으며 당시 통과 80건은 재사용했다. 최종 source-selector/Component 연결 및 하드코드 분기 규칙 변경으로 contract fingerprint가 달라진 뒤에는 이전 해시를 이식하지 않고 최종 112건을 새 계약에서 다시 측정했다. 이는 동일 조건 중복 검사가 아니라 최종 계약 증거 생성이다.
|
||||
|
||||
## 중복 검증·보존
|
||||
|
||||
- EXECUTED: 변경 Guard/증거/요구사항 연결 100개, T01 새 계약 CSS112와 동작/네 폭, Typecheck/Build 1회, 문서 영향 범위·Git diff 점검.
|
||||
- REUSED PASS: 미변경 T01 source fingerprint와 기존 dist·공개 Theme/Component/Pattern/Story source 보존 근거. 중간 실패 보정 시 유효한 CSS80건 재사용. 이전 frozen f78cc206 공통80/80은 당시 결과로만 인용하며 현재 HEAD 전체 인증으로 확대하지 않음.
|
||||
- NOT VERIFIED: 사용자 CSS intent, 실행하지 않은 Theme/상태/외부 입력, 전체 Story별 Runtime, 실제 스크린리더·touch·backend·CSS 전 문법/cycle.
|
||||
- SKIPPED — 중복 검사: 전체 292 Story 렌더, 전체 Component 테스트, 기존 정상 화면 재생성, 별도 의존성 설치, 이미 성공한 prebuild package/Theme 재실행.
|
||||
|
||||
Git diff에서 `src/`, `packages/`, `themes/`, `.storybook/` 변경 0. Foundation·Typography·Spacing·Radius·Button/Tabs/Table·Green LNB 8%·목차 LNB 8%·D-01/D-02·퍼블리셔 확정 요구·공개 API/Theme Token/Designer 기능과 Theme 적용·전환 구현은 미변경이다. 실험 경로는 읽기 전용으로 사용했으며 T01 기존 guard/runtime/combined 3개 원본 SHA-256은 작업 전후 같다. 신규 로컬 실패도 revision1 및 별도 로그로 보존한다. `preservation.json`이 근거다.
|
||||
|
||||
## 오탐·미탐과 잔여 검토
|
||||
|
||||
FALSE_POSITIVE: 이번 정상 fixture 회귀 범위에서 발견되지 않음. 일반 HTML/layout·documented Token override·Storybook을 일괄 FAIL로 바꾸지 않았다. 임의 CSS 전체 무오탐 인증은 아니다.
|
||||
|
||||
FALSE_NEGATIVE: 이번 위반 fixture 범위에서 발견되지 않음. 기존 CSS entry/Navigation/Token/공개 API FAIL 보존. 유한/미확정 분기의 명확한 하드코드와 Runtime fallback 미정의 참조를 추가 탐지한다.
|
||||
|
||||
REMAINING_LIMITATIONS: named color·일반 utility class·%, calc와 외부 CSS/selector cascade·변수 cycle·opaque wrapper/객체 style·모든 Theme/상태/외부 입력은 전수 인증하지 않는다. Token 선언 PASS는 실제 적용을 뜻하지 않는다. Runtime 자료는 제출 증거이며 독립 실행 인증이 아니다. 사용자 CSS 승인 기능과 Theme 편집 기능은 만들지 않았다. Theme 기능 자체의 결함/개선 필요성은 이번 검사에서 확정하지 않았으며 추가로 발견되면 별도 이슈로 검토한다.
|
||||
|
||||
## 외부 호출과 Git 정책
|
||||
|
||||
APPROVED_SESSIONS: 12 / USED_SESSIONS: 10 / REMAINING_SESSIONS: 2 — 사용자 제공 기존 실험 장부 유지. 이번 유지보수의 외부 AI 생성 세션·신규 모델·Claude·하위 에이전트·신규 화면 실험 호출 0. 현재 대화 자체를 외부 실험 장부에 추가하지 않았다.
|
||||
|
||||
GitHub origin은 `https://github.com/shkim25027/HMDesignSystemTest.git` 그대로다. 시작 main/local/remote SHA는 모두 BASE_SHA와 같고 기존 미커밋 작업은 없었다. 관련 Guard/테스트/MD만 stage·diff 검토 후 일반 main commit/push하며 결과는 최종 로컬 보고서에 기록한다. force/reset/clean/이력 삭제/연결 변경/ZIP 배포 없음.
|
||||
|
||||
공식 Gitea: NOT ACCESSED / NOT MODIFIED. 월요일 이전·GitHub 연결 해제는 별도 작업으로 유지한다.
|
||||
@@ -0,0 +1,78 @@
|
||||
# HMDesign Gitea 이전 전 최종 정합성 확인
|
||||
|
||||
RESULT: **PARTIAL**. 최근 구현·문서·Story·Guard의 정합성을 확인하고 현재 기준과 충돌하는 문서 설명을 최소 수정했다. 최종 타입 검사와 앱 build, 실행기 모의검사, 소스 무결성 확인은 PASS다. 기존 T03 생성·CSS 디자인 의도·개발 의존성 위험·실제 SR/터치와 공식 사내 환경의 미검증은 그대로 남긴다. 디자인 변경 없이 소스 이전 준비를 마쳤으며 공식 Gitea 이전은 2026-10-12 별도 작업이다.
|
||||
|
||||
TARGET: `D:/디자인시스템/hmdesign`. 범위는 기존 React Component/Pattern/Storybook/AI 계약의 정합성 확인이며 신규 업무 화면 구현은 없다. 시작 Local HEAD와 GitHub main은 모두 `4fe549da01683c363b0715aedeb82a089717f685`, branch main, working tree CLEAN이었다. 최종 문서 commit SHA와 원격 일치는 종료 보고 및 로컬 `_local/finalization-20261011/release-manifest.json`에 기록한다. 이전 보고서의 SHA를 최신으로 가정하지 않았다.
|
||||
|
||||
## T03 실행기 원인과 보완
|
||||
|
||||
원본 근거는 독립 실험 `codex-only-20261010-203444/t03-resume-20261011-001217/FINAL_REPORT.md`, Medium item_3, High item_2 및 medium-stop-diagnosis.json이다. 원 생성 기준은 frozen `f78cc206a5a9af6b61c42cfb989ed26fbe9da948`이며 최신 HMDesign HEAD와 혼용하지 않는다.
|
||||
|
||||
| 대상 | 원인과 판정 | 이번 처리 |
|
||||
|---|---|---|
|
||||
| Medium T03 | Get-Content·Story 목록·브라우저 도구 검색 복합 명령. 실제 분리 결과 0/0/1, 마지막 stdout/stderr 빈 값. 기존 실행기의 좁은 예외 문법이 PROJECT_COMMAND_FAILURE로 중단 | 명령별 구조화 exit/stdout/stderr를 확인하는 V3 후보. 원문과 모든 step의 대응·출력/종료 일치 필수. 근거 없는 복합 exit1은 계속 STOP |
|
||||
| High T03 | 사본에 `.storybook`이 없는데 검색 root에 포함. 후속 명령으로 wrapper exit0이어도 실제 rg 읽기 오류 발생 | 실제 경로 목록 기반 preflight. 대표 Story 소스·필수 문서/패키지/bootstrap은 필수, Storybook 실행을 요청하지 않은 `.storybook` 설정은 선택. 실제 읽기 오류는 계속 STOP |
|
||||
|
||||
로컬 21/21 검사에서 실제 Medium 명령을 읽기 전용으로 재생해 0/0/1을 확인했다. High 원본 이벤트는 `ACTUAL_RG_READ_ERROR_EVEN_IF_WRAPPER_EXIT_ZERO`로 유지한다. 앞선 실패·stderr·exit2·누락/변조된 step·wrapper 불일치·파이프/치환/실행 옵션·중복 이벤트·실패 후 정지를 확인했다. 기존 22/22와 16/16 proof는 원래 controller SHA `70b35c127b14c2f97fd9df330783dd15b86f363f5238f743813995a3f27047f7` 및 proof 해시가 같은 범위에서 REUSED PASS다.
|
||||
|
||||
수정 후보와 읽기 결과 수집기·preflight·테스트/proof는 독립 실험 `finalization-20261011/runner/`에 별도로 저장했다. active controller/launcher·과거 proof·승인·STOP·장부는 덮어쓰지 않았다. 실제 모델 launcher에 V3를 연결해 실행한 결과는 NOT VERIFIED다. 향후에는 별도 승인과 새 proof/입력/참조 manifest로 실행하거나, 구조화 결과가 없는 CLI에서는 읽기·각 검색을 별도 호출한다. 기존 승인 12/12 사용·잔여 0, NEW_MODEL_CALLS 0, T03_GENERATION/QUALITY NOT VERIFIED를 보존한다.
|
||||
|
||||
## 문서와 구현 정합성
|
||||
|
||||
| 연결 | 실제 확인과 결과 |
|
||||
|---|---|
|
||||
| AGENTS → AI 계약 → Reference | 규칙 우선순위·공개 API·Pattern 우선·Label·Navigation·Runtime/스타일 판정 일치. AGENTS 자체 수정 없음. 독립 사본의 필수/선택 참조와 검색 결과 계약 보완 |
|
||||
| Component MD ↔ 구현 ↔ Story | 최근 Combobox dialog popup, GNBUser/LNBProfile 이름+description과 명시 label 우선권이 일치. Label/Badge 및 관련 공개 API 예제도 누락 없음. 정상 Props/Variant/Size/State/API 수정 없음 |
|
||||
| Pattern MD ↔ 구현 ↔ Story | FilterBar `layout` 3종·draft/applied·부모 초기화·보호 상태·focus, DataTable ID 줄바꿈 예제, PageHeader/Tabs, Form composition, GNB/LNB 모바일, Dashboard 48px/960px 계약 확인 |
|
||||
| Theme/Token | 실제 공개 CSS 선언 1,170개, source exports Component 222/Pattern 63, runtime exports UI 255/Theme 8/CENTER 25/Reference 10. JSON key와 CSS 선언 수를 혼용하지 않음 |
|
||||
| Guard ↔ 가이드 | FULL_SCREEN/PARTIAL scope와 STORYBOOK profile, result의 Production 제한, CSS Intent·유한 동적 후보·외부 host 변수·위치별 Runtime 증거·원본 보존 계약을 구현과 대조 |
|
||||
| README | 현재 실행 scripts/Node 조건/6024·workspace build·React bootstrap 확인. 최신 Guard/접근성/최종 준비 문서 연결 |
|
||||
| 문서 링크 | 최종 수정·신규 문서와 직접 참조 문서의 내부 경로/heading을 선택 검사. 당시 과거 보고서는 편집하지 않음 |
|
||||
|
||||
확인된 수정은 다음과 같다. 실제 정상 구현을 오래된 문서에 맞추지 않았다.
|
||||
|
||||
- Reference의 “현재 최신 포터블 ZIP” 안내를 현재 Git checkout 기준으로 정정하고 ZIP은 과거 스냅샷으로 구분.
|
||||
- Guard의 과거 46/63/11개를 현재 수처럼 안내한 문장을 당시 기록으로 명시. 현재 75/20/5로 구분.
|
||||
- Guard 앞부분의 계산된 Token 일괄 미검증·non-HM 변수 검사 제외 설명을 실제 유한 후보/외부 host 변수 검사와 일치시킴.
|
||||
- STORYBOOK은 profile이라는 CLI 계약, 독립 실험의 선택 `.storybook`과 명령별 결과 확인을 보강.
|
||||
- README의 최신 검증 근거 연결과 10월 12일 이전 준비·595개 전체 소스 목록 작성.
|
||||
|
||||
## 기존 구현 보존
|
||||
|
||||
이번 diff의 `packages/`, `src/`, `.storybook/`, `themes/`, `scripts/`, package/lock, AGENTS 변경은 0이다. 원본 추적 파일 592개 해시에서 기존 문서 4개만 수정했다. 실행기 수정은 독립 실험의 새 폴더에만 저장했다.
|
||||
|
||||
D-01/D-02 Tabs/대표 Fill·PageHeader 조합은 기존 퍼블리셔 기준과 동일하다. `padding: 24px 0`, Primary White alpha 0.8, Secondary/Legacy 보존. 퍼블리셔 Button/Table/Progress/Accordion/Sheet/Drawer/Navigation·Foundation·React C2~R3는 관련 구현/API·CSS의 변경 영향을 비교해 이전 PASS를 재사용한다. Sheet 최종 radius·색 의미 등 미확정 값은 확정하지 않았다.
|
||||
|
||||
Green LNB 2Depth와 오른쪽 LNB 예제는 기존 `lnb.css`의 Black 8%를 소비한다. Storybook 왼쪽 목차는 `manager.css`의 별도 rgba alpha .08이다. 선택 깊이의 Black 20%는 그룹 배경과 별개다. 이 mapping과 선택/Hover/Focus 소스는 미변경이다. 기존 292개 Story ID는 inventory와 최종 static index가 일치한다.
|
||||
|
||||
## 선택 회귀와 재사용
|
||||
|
||||
| 검사 | 판정과 유효 범위 |
|
||||
|---|---|
|
||||
| TYPECHECK | EXECUTED PASS, root/UI/CENTER. Theme default 확인·workspace build hook 포함 |
|
||||
| BUILD | EXECUTED PASS, 최종 root build. 이미 성공한 hook는 `--ignore-scripts`로 중복 생략. 500kB chunk 경고 유지 |
|
||||
| 실행기 | EXECUTED 21/21 PASS, 모델 호출 없음. 기존 22+16은 원래 V2 해시 범위에서 REUSED PASS |
|
||||
| CSS_IMPORTS/EXPORTS | EXECUTED PASS, 추적 CSS import 73개·export artifact 16개 누락 0. 관련 8개 MD 공개 import 심볼 누락 0 |
|
||||
| Guard100 | REUSED PASS, 8817135 이후 Guard/회귀 소스·package/lock 미변경 및 기존 final 로그 100/100 확인. 최신 선택 Story Guard source/contract 해시 일치 |
|
||||
| Component | REUSED PASS, 기존 C2~R3 및 FilterBar 검증의 소스/영향 대조. 최신 Combobox 1개·최종 GNB/LNB 2개 렌더 회귀를 각각 재사용 |
|
||||
| 관련 Story/반응형 | REUSED PASS, 최신 static 선택 6/6·pageerror 0, Combobox 390/768/1280/1440, 사용자 메뉴와 모바일 navigation 명명된 기존 검사. 미변경 대표/Theme 범위만 이전 결과 재사용 |
|
||||
| Storybook build | REUSED PASS, 최신 접근성 최종 build·source/환경 동일. index 292개 ID 일치. 전체 292 Runtime을 새로 수행한 것으로 집계하지 않음 |
|
||||
| Theme | REUSED PASS, JSON/Runtime/Designer·미변경 CSS의 기존 119/96·키보드 138/58 근거. 새 Theme/상태 전수 인증 없음 |
|
||||
| 공통80 | REUSED PASS **역사적 frozen f78cc206 한정**. 원 log/exit 및 baseline 기록 유지. 최신 HEAD 전체 검증으로 확대하지 않음 |
|
||||
| 기존 AI 화면 | 앱 source 및 당시 Guard/Runtime 연결이 같은 범위만 재사용. 옛 T01 contract는 최신 4fe와 달라 최신 결합 PASS로 승격하지 않음. T06 원본 FAIL과 수정 복제본 PASS 구분 |
|
||||
|
||||
기존 최종 선택 Story Guard는 원본 status/staticStatus **NOT VERIFIED**, FAIL 0이다. CSS styleEvidence는 STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT NOT VERIFIED / FINAL NOT VERIFIED, styleVerification은 생성하지 않았다. 브라우저 동작 PASS를 스타일 승인으로 연결하지 않는다. T01 당시 112개 CSS 측정 PASS도 해당 source/옛 contract의 역사적 결과이며 사용자 디자인 의도는 계속 NOT VERIFIED다.
|
||||
|
||||
SKIPPED_DUPLICATES: 전체 292 Story Runtime, 정상 Component/Theme/Guard suite 재실행, 외부 모델·화면 재생성, 동일 반응형 재촬영, npm 재설치/audit, 정상 package hook 중복. 현재 수정이 문서와 독립 실행기 후보라 새 시각 영향을 만들지 않았다.
|
||||
|
||||
## 보안과 소스 이전 한계
|
||||
|
||||
과거 감사는 개발 High 7·Critical 0, 운영 0이다. package/lock은 감사 기준 이후 같다. shadcn → registry/ts-morph/common/fast-glob → micromatch → braces 전파를 유지하며 안전한 patch 미확인이다. 새로운 audit/레지스트리 조회/업데이트는 실행하지 않았다. STORYBOOK의 비신뢰 glob/config 제한을 유지한다. 운영 0은 과거 감사 기준이며 현재 인터넷 advisory의 갱신 부재를 인증하지 않는다.
|
||||
|
||||
추적 파일명/고신뢰 secret 패턴에서 개인 환경·key·생성 dist·실험/임시파일 후보는 발견되지 않았다. 비밀정보 부재의 전수 인증은 아니다. 제품 manifest의 로컬 절대경로 의존성은 없다. `audit-quality-contracts.mjs`의 역사 비교 BASE와 외부 증거 절대경로 2개는 이관 후 그대로 실행 가능한 필수 검증 도구가 아니며 준비 문서에 제외/대체 조건을 명시했다.
|
||||
|
||||
남은 상태는 T03 생성/품질, CSS 사용자 의도·미실행 동적 분기, 확정색 접근성 대비 FAIL/DEFERRED, 실제 SR·실기기 touch/drag·확대·모든 Theme/브라우저, 공식 Gitea 전용 파일/분기·회사 실행 환경 NOT VERIFIED다. 현재 발견은 디자인/정상 API를 변경할 근거로 확대하지 않는다.
|
||||
|
||||
[이전 준비 문서](../guidelines/gitea-source-transfer-preparation-2026-10-11.md)는 공식 기존 이력을 보존한 추적 소스 비교·반영, 공식 전용 파일 보존, 설치/검증 명령, 이후 GitHub remote의 정확한 URL을 확인한 해제 순서를 제공한다. GitHub 일반 main push 결과는 작업 종료 보고에 기록한다. 공식 Gitea ACCESS/CLONE/COMMIT/PUSH/연결 전환, force/reset/clean/이력 삭제, GitHub 연결 해제, ZIP 배포 모두 NOT EXECUTED다.
|
||||
|
||||
로컬 상세 근거는 `_local/finalization-20261011/`의 baseline/evidence-inspection/integrity/preservation/reuse-ledger/doc-links/release-manifest/FINAL_REPORT와 로그에 보관한다. 이 문서는 최종 commit의 자기 SHA를 포함하지 않으며 로컬 최종 보고와 실제 HEAD 조회로 연결한다.
|
||||
@@ -0,0 +1,56 @@
|
||||
# 퍼블리셔·접근성·Guard 선택 개선 — 2026-10-10
|
||||
|
||||
RESULT: 요청한 수정과 선택 검증 PASS. 교차 모델 미완료 실험, 전체 접근성 인증은 NOT VERIFIED. 기준 HEAD는 `f78cc206a5a9af6b61c42cfb989ed26fbe9da948`. 기존 READ-ONLY 보고서·검증 JSON은 수정 전에 별도로 보존하고 변경 후 SHA256 일치를 확인했다.
|
||||
|
||||
## 실제 수정
|
||||
|
||||
| 파일 | 변경 |
|
||||
|---|---|
|
||||
| `.storybook/manager.css` | 기존 펼침 그룹 selector의 배경만 검정 20% → 8%. 선택 면의 20% inset, hover/focus·메뉴 JS·공통 Token 보존 |
|
||||
| `packages/ui/src/theme/lnb.css`, `docs/patterns/lnb.md` | 오른쪽 Green LNB의 기존 8% 유지. 오래된 20% 주석 수정, Manager/Component 적용 범위 설명 |
|
||||
| `packages/ui/src/theme/combobox.css`, `date-picker.css` | 흰 Trigger의 빈 값 안내를 기존 보조 텍스트 Semantic에 연결. 기본 #999/흰색 2.85:1 → #6e6759/흰색 5.60:1. 공통 Theme·Token 값, 선택값·아이콘·disabled opacity 보존 |
|
||||
| `docs/components/combobox.md`, `date-picker.md` | 현재 mapping 설명. 과거 실측 기록은 당시 기록으로 보존 |
|
||||
| `scripts/guard-requirements.mjs`, `guard-requirements.test.mjs` | 명시한 액션 이름 허용 목록을 검사하는 별도 도구와 5개 회귀 테스트. 미요청 정적 CSV/다운로드 액션 FAIL; 동적 이름/불완전 정책/오래된 fingerprint는 NOT VERIFIED |
|
||||
| `docs/guidelines/ai-generation-guard.md`, `navigation-single-mode.md` | 보조 검사 사용법·한계, T04 정상 혼합 거부 응답과 별도 평가 기준 |
|
||||
|
||||
원본 Guard status/issues 및 기존 회귀 테스트 본문은 변경하지 않았다. 정책 예외·새 공통 Token·Story ID·업무 화면 생성은 추가하지 않았다.
|
||||
|
||||
## 실제 실행한 검사
|
||||
|
||||
- 변경 전/후 실제 Storybook: 왼쪽 펼침 그룹 rgba(0,0,0,0.08), 오른쪽 Green LNB color(srgb 0 0 0 / 0.08), opacity 1. CSSOM에서 그룹 selector의 적용 규칙·priority 확인. 펼침 면의 20% 잔여 적용 없음. 선택 inset의 20%는 요청 범위 밖의 기존 효과다.
|
||||
- 선택·hover·focus computed style 변경 전/후 일치. 선택/펼침/접힘, 검색 결과 및 tag filter 열기 통과. 변경 전/후와 최종 빌드 화면 PNG 직접 확인.
|
||||
- 최종 Storybook Combobox/DatePicker 각각 390/768/1280/1440: 안내 문구 대비 5.60395679:1, 가로 overflow·중복 ID 없음, Enter로 popup 열기·Escape 닫기·trigger focus 복귀 통과. 선택값/disabled opacity/배경/아이콘은 변경 전후 일치.
|
||||
- 신규 요구사항 검사 5/5 PASS. Theme 연결에 영향받는 기존 Guard 테스트 8/8 PASS(55개는 선택 실행에서 skip). 기존 전체 80개를 다시 실행한 결과로 표현하지 않는다.
|
||||
- 최종 통합 상태 UI package build(선언 Typecheck 포함), root Vite build, Storybook build 각 1회 PASS. root의 기존 chunk size 경고는 잔여 경고다. Story ID 292 → 292, 추가/삭제 0.
|
||||
- Git diff whitespace 검사, 공통 Guard/검사 소스·package-lock hash 일치 및 보존 자료 hash 일치 확인.
|
||||
|
||||
## 재사용한 검사
|
||||
|
||||
기존 별도 교차 모델 실험의 `logs/baseline-regression.log`는 동일 기준 SHA에서 Guard63/Evidence5/Component9/Theme3 총 80/80 PASS다. 검증 ledger·검사 소스·의존성 hash를 확인해 변경과 관계없는 범위의 회귀 증거로 재사용했다. CSS mapping 변경 영역은 새 브라우저 검사와 선택 Guard 8개로 보완했다. 최종 소스 전체에 80개를 다시 실행했다고 보고하지 않는다.
|
||||
|
||||
READ-ONLY 단계의 root/UI/CENTER/publisher Typecheck, 기능 C2~C5/PT1~PT2/R1~R3, 나머지 퍼블리셔 대표 Story·운영 화면 검증은 변경된 메뉴·안내 문구와 관계없는 범위에서 재사용했다. TSX/API/tsconfig·의존성은 변경하지 않았다. UI 선언 검사는 최종 package build에서 수행했다. 전체 Typecheck·모든 앱/292개 Story Runtime은 반복하지 않았다.
|
||||
|
||||
## 교차 모델 작업표 복원
|
||||
|
||||
원본 `D:\디자인시스템\HMDesign-AI-CrossModel-Test`의 requirements·reports·evaluation·모델별 산출물을 읽어 다음 매핑을 복원했다. requirements frozen hash와 성공 화면 4개의 source/contract fingerprint는 각 원본 실험 사본에서 일치한다.
|
||||
|
||||
| 모델/요청 effort | 테스트 | Typecheck/Build/4폭 Runtime | 원본 Guard 연결 |
|
||||
|---|---|---|---|
|
||||
| claude-sonnet-5 medium | T01 | PASS | NOT VERIFIED(CSS intent) |
|
||||
| claude-sonnet-5 medium | T03 | PASS | PASS |
|
||||
| claude-sonnet-5 high | T01 | PASS | NOT VERIFIED(CSS intent) |
|
||||
| claude-sonnet-5 high | T02 | PASS | PASS |
|
||||
|
||||
high T01은 실제 평가 가능한 산출물이 있으나 원래 세션의 정상 완료로 세지 않는다. 이 4개를 다시 생성하지 않았다. 원본 실험 사본의 유효한 증거를 현재 수정된 HM 계약 전체의 인증으로 일반화하지 않는다. 기존 점수·원본 판정을 덮어쓰지 않았다.
|
||||
|
||||
나머지 20개 조합(운영 화면 16개 + 정책 T04 4개)은 NOT VERIFIED 작업표로 별도 보존했다. 모든 T05/T06, GPT 두 effort의 모든 항목, Claude medium T02/high T03 및 T04가 포함된다. T04는 생성 성공률·평균 디자인 점수에서 제외한다. 기존 24개 세션 한도는 소진됐으며 이번 추가 외부 모델 세션은 0개다. 새 승인 전 실행하지 않는다.
|
||||
|
||||
## 미검증·한계
|
||||
|
||||
전체 WCAG/스크린리더 발화/실기기 touch/전체 Theme·상태의 대비, 전체 292 Story Runtime은 NOT VERIFIED. 현재 대비 PASS는 기본 Theme의 활성 빈 값 Trigger에 한정한다. Input 등 공통 placeholder Token은 변경하지 않았으며 전체 placeholder 대비를 해결했다고 주장하지 않는다.
|
||||
|
||||
요구사항 도구는 명시적 정책과 static literal Button/button/link 이름만 검사한다. wrapper/namespace/동적 액션/API 호출의 의미와 자유 형식 요구사항은 별도 검토가 필요하다. 보조 PASS는 원본 Guard의 CSS intent·Runtime 미검증을 제거하지 않는다. 실험 환경·모델 품질·전체 디자인 점수 개선을 추정하지 않는다.
|
||||
|
||||
원본 READ-ONLY 보고서와 이번 PNG/JSON/log/교차 모델 작업표는 Codex 작업의 `publisher-readonly-audit/minimal-lnb-fix`에 보존한다. 공식 Gitea 접근·수정 없음. GitHub 일반 push의 최종 commit/remote SHA는 제출 응답과 별도 로컬 결과에 기록한다.
|
||||
|
||||
Started At: 2026-10-10 19:37:37 KST. Estimated Duration: 60–90분. 완료 시각·실제 시간·Variance는 최종 제출 응답에 기록한다.
|
||||
Reference in new issue
Block a user