kintex/docs/OWNER_FEEDBACK.md

316 lines
36 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 소유자 피드백·지시 로그 (KINTEX AI 전시·행사시스템)
> 이번 세션에서 소유자가 지시한 모든 항목을 전수 기록한다. 상태: ✅완료(배포) · 🚚배포중 · ⏳작업중 · 📋대기.
> 이 파일을 기준으로 누락 없이 처리한다. 새 지시는 여기에 추가한다.
> 최종 갱신: 2026-07-14 (AI 우선 세션 — 플로어플랜 자연어 AI·ReRoomAI·G-02 티켓·V51 링크오류·시연 PPT. 하단 "처리 로그 (2026-07-14 세션)" 참조)
---
## 1. 디자인 시스템 (Nifty / WISE) — 최우선 반복 지시
| # | 지시 | 상태 | 비고 |
|---|------|------|------|
| 1.1 | **Nifty 카드 타입** 적용 (https://preview.themeon.net/nifty/ui-elements/cards/) — 라운딩·그림자·헤더/바디/푸터 구조·보더 톤 | ✅완료 | 276293e `.kx-card` Nifty 구조 정렬, 2026-07-13 배포 |
| 1.2 | **그리드는 Nifty Advanced table headers**로 통일 (tables/static-tables) | ✅완료 | 276293e `.kx-table` 6화면 수렴, 배포됨 |
| 1.3 | **Tabulator 기능** 추가 (tables/tabulator — 정렬·필터·페이지·CSV) | ✅완료 | task #32 — KxDataTable 자체구현(정렬/필터/페이지/CSV BOM), 참가업체·리드스코어·등록자 3화면 적용. 배포됨(2026-07-13 05:17) |
| 1.4 | **상세페이지 = Nifty blog** 스타일 (blog-apps/blog) | ✅완료 | a5a78f1 Nifty detail views, 배포됨 |
| 1.5 | **버튼 = Nifty buttons**, **Dropdowns**, **컴포넌트**, **List Group**, **Typography/Modals/Offcanvas** = ui-elements 전체 채택 | ⏳부분 | Offcanvas 완료, 나머지 정렬 진행 |
| 1.6 | **Nifty 스타일 학습 md 생성** | ✅완료 | `docs/DESIGN_SYSTEM_NIFTY.md`·`docs/analysis/nifty-design-refs.md` |
| 1.7 | **아이콘은 선(line/stroke) SVG**로 직접 (이모지 금지) | ✅원칙 | 전 신규화면 준수 |
| 1.8 | **UI는 WISE(UIWS) 문자 그대로** — 셸·메뉴·캘린더 자체 재해석 금지 | ✅원칙 | 메모리 [[ui-follow-wise-strictly]] |
| 1.9 | **폰트를 페이지마다 안 맞춤** — 전 화면 타이포 일관화 | ✅완료 | 276293e font 179+weight 415 토큰화(`--fs-micro`·공용 제목클래스), 배포됨 |
| 1.10 | **모든 경계선 엷은 회색** | ⏳부분 | 구조 보더는 neutral-200(#e4e7ec) 사용 중. 의미색·hover는 유지, 지정화면 정렬 |
| 1.11 | **좌우 2단 폭 50:50**, 전 화면 **공백 없는 반응형**(풀블리드) | ✅완료 | task #39 스윕 — 루트 fill/scroll 결함 13화면 + 브레이크포인트 부재 2화면 수정. 배포됨(2026-07-13 05:32). 감사기록 `src/frontend/_workspace/responsive_sweep_audit.md` |
| 1.12 | **top 설정 아이콘** 추가 + **설정 레이아웃 커스터마이저**(offcanvas 테마/레이아웃/색상) | ✅완료 | a5a78f1 settings customizer(customizerStore), 배포됨 |
## 2. 캘린더
| # | 지시 | 상태 |
|---|------|------|
| 2.1 | 캘린더를 **Nifty app-views/calendar**처럼 (옅은 회색 격자·연한 today·가벼운 이벤트 칩) | ✅완료 | 배포됨(2026-07-13 라이브) |
| 2.2 | **공휴일 붉은색 + 일자 옆 공휴일명** (2050년까지 데이터) | ✅완료 | c77cba7 홈 캘린더 공휴일 마커 포함, 배포됨 |
| 2.3 | **달력 경계선 모두 회색** | ✅완료 | 배포됨 |
| 2.4 | 일정 **월/주/일** 뷰 (WISE CalendarView) | ✅완료 |
| 2.5 | 전시 일정 50:50 비율·달력 날짜 위로(하단 공백 제거) | ✅완료 |
## 3. 공개사이트 / 메인 / visitor
| # | 지시 | 상태 |
|---|------|------|
| 3.1 | **첫 화면 = 제품 소개** (미인증 루트는 히어로 랜딩, 로그인 폼만 노출 금지) | ✅완료 | 메모리 [[product-identity-first]] |
| 3.2 | 제품명 **'KINTEX AI 전시·행사시스템'** | ✅완료 |
| 3.3 | **visitor 메인 = 세련된 홈페이지** (AI 관람 도우미 중심) | ✅완료 | AiAssistant·기능타일·연월 브리핑·쇼케이스, 배포됨 |
| 3.4 | 메인에 **AI 기능 전면 노출** (AI가 뭘 하는지 한눈에) | ✅완료 | AI 기능 쇼케이스 6타일, 배포됨 |
| 3.5 | AI가 답하는 정보는 **크롤링해서 DB 저장** (실시간 외부호출 X) | ✅완료 | V43 visitor_guide·transport, 공개 AI API 근거응답 |
| 3.6 | **AI는 전시·행사정보 학습** (근거 기반) | ✅완료 | grounding + 인용, 환각 차단 |
| 3.7 | **AI가 연간·월간 전시·행사 기획정보 제시** | ✅완료 | AiPlanningBriefing(연/월 토글), 배포됨 |
| 3.8 | 비지터가 **가장 알고 싶은 정보를 AI로 쉽게** | ✅설계 | 관람 도우미 예시칩·구조화 카드 |
| 3.9 | 코엑스 분석 → **visitor/business/agency 3-트랙** 분리 | ✅완료 | 관문 + 3 서브홈 + TrackSwitcher |
| 3.10 | **"코엑스처럼" 전면 리뉴얼** (히어로 배경·애니메이션·비주얼) | ✅완료 | design.md v2.4 §3C-V 구현, 배포됨 |
| 3.11 | 메인 카드가 **밋밋한 파란 placeholder** (포스터 이미지 없음) | ✅완료 | V46 실제 포스터 이미지로 교체(배포됨) |
| 3.12 | **메인 카드 이미지 크기 안 맞음**(세로 포스터가 16:11 가로 프레임에 늘어남/잘림) | ✅완료 | 3:4 프레임 + `object-fit:cover`, 배포됨 |
| 3.13 | **메인 히어로 이미지 5장 회전(슬라이드)** | ✅완료 | 7316cd9 실사진 5장 회전 히어로, 배포됨 |
## 4. 역할 · 네비게이션
| # | 지시 | 상태 |
|---|------|------|
| 4.1 | **로그인 사용자 구분으로 메인페이지 + 메뉴 그룹 결정** (디폴트 visitor, 로그인 후 business/admin/agency) | ✅완료 | plan_role_routing(roleTrack.ts) + 역할별 메뉴 게이트, 배포됨 |
| 4.2 | **각 트랙 메인페이지 Stitch 디자인 의뢰** | ✅부분 | Stitch 2회 실패 → design.md 스펙 직접 구현(문서화 폴백) |
| 4.3 | **모바일 앱도 동일 로직** | ✅완료 | 기구현 확인 + 결함 수정(roleCode 타입 누락 → 워크스페이스 없는 ADMIN이 티켓으로 오랜딩). 소스 반영 — APK 반영은 다음 EAS 빌드에 포함(2026-07-13) |
| 4.4 | **상세→메인 복귀·브레드크럼·404** 내비게이션 | ✅완료 | Breadcrumb(셸 콘텐츠 상단, 메뉴 IA 정합) + NotFound catch-all(역할별 홈 복귀). 배포됨(2026-07-13 05:17) |
## 5. 데이터 / 시드
| # | 지시 | 상태 |
|---|------|------|
| 5.1 | **모든 테이블에 데이터** (50~100건) | ✅완료 | V42 대량시드(40테이블 2,535행) |
| 5.2 | **정산·결제 데이터 없음** — 행사스코프 정렬 | ✅완료 | V47 `e-2026-live` 정산 폐루프, 배포됨 |
| 5.3 | 테스트 데이터 **더 현실적으로** | ✅완료 | V39·V42 실감형 |
| 5.4 | 행사정보 **크롤링해서 데이터 넣기** | ✅완료 | 크롤 시드 |
| 5.5 | **연간·월간 전시 기획정보**도 적재 | ✅완료 | V43 event 생성열·v_event_calendar 뷰 |
| 5.6 | 포스터 이미지 **다 다운받아 빌드 내장** | ✅완료 | V46 `/media/posters/`, 배포됨 |
## 6. 정산·도메인 화면
| # | 지시 | 상태 |
|---|------|------|
| 6.1 | **정산·결제 패딩 없음** | ✅완료 | `.kx-settle` 패딩, 배포됨 |
| 6.2 | **참가업체 관리가 홈으로 감** — 전용 화면 신설 | ✅완료 | a5a78f1 ExhibitorsPage(screens/exhibitors), 배포됨 |
| 6.3 | 부서 관리 = **WISE 조직도** | ✅완료 |
| 6.4 | 결재관리 **반려·재상신·결재선** (WISE) | ✅완료 |
| 6.5 | 통합검색에 **행사·전시 포함** | ✅완료 |
| 6.6 | 시스템관리 **메시지 관리**({} 플레이스홀더+샘플) | ✅완료 | 백엔드 ✅(276293e V48) + 프론트 MessageAdminPage(/admin/messages — 필터·검색·upsert·렌더 미리보기, i18n×4). 배포됨(2026-07-13 05:17) |
| 6.7 | 물류허브·서류/마일스톤·CMS·일정 = WISE | ✅완료 |
| 6.8 | **그룹권한(역할↔메뉴) 메뉴** 존재 확인 | ✅확인 | RoleAdminPage + RoleMenuAdminPage |
## 7. 버튼 · 색상 · 대비
| # | 지시 | 상태 |
|---|------|------|
| 7.1 | **파란 배경 버튼 = 흰 글자** | ✅완료 | `--color-on-accent`(다크에서도 흰색). 라이브 반영(캐시 새로고침 필요) |
| 7.2 | 다크모드 색상배경 위 **흰 글자 어두워지는 버그** 전수 수정 | ✅완료 | 77곳 on-accent + 통계밴드 2곳, 배포됨 |
| 7.3 | 회색 버튼은 옅은 ghost — 흰 글자 아님(솔리드 진회색만 흰글자) | ✅확인 |
## 8. 파비콘 · 브랜드
| # | 지시 | 상태 |
|---|------|------|
| 8.1 | **KINTEX favicon** 추가 (홈페이지 크롤) | ✅완료 | 리포 favicon.ico가 톰캣 아이콘이던 것 규명→KINTEX .ico 재생성(v3) |
| 8.2 | **브랜드 밑에 영어 병기** | ✅완료 | "AI Exhibition & Event System" |
## 9. 모바일
| # | 지시 | 상태 |
|---|------|------|
| 9.1 | **내정보 (WISE 참조) + 생체인식 + 사진등록** | ✅완료 | app/profile, expo-local-authentication, expo-image-picker. 아바타 API(백엔드) 완료 |
| 9.2 | **전시·공연 앱 벤치마킹** (다운로드·좋아요 상위순) | ✅완료 | docs/analysis/mobile-benchmark-exhibition-performance.md + 백로그 12항목 |
| 9.3 | **앱 위변조 방지 + 시큐어 코딩 + 보안 체크리스트 통과** | ✅완료 | 루트/탈옥·무결성·Hermes+R8·화면캡처·cleartext·권한최소. 체크리스트/감사 문서 |
| 9.4 | **다국어** — 웹 4개국어 완비, 모바일도 4개국어 | ✅완료 | 웹 ✅ + 모바일 ✅(mobile/lib/i18n ko/en/zh/ja + LanguageSelector, react-i18next) |
## 10. AI
| # | 지시 | 상태 |
|---|------|------|
| 10.1 | **AI 기능 쉽게 사용 + 토큰 최소화** | ✅완료 | PLANNING v3.4 §8A(결정론 라우팅·소형모델 우선·RAG축소·캐싱·집계는 SQL·측정지표) |
| 10.2 | AI 기능이 **하나도 구현 안 된 것 같다 → 구현** | ✅완료 | 공개 AI 관람 도우미 라이브(grounded=true, Claude) |
| 10.3 | 나노바나나 유료? | ✅답변 | Google Gemini 유료 |
## 11. 데이터 아키텍처 (표준)
| # | 지시 | 상태 |
|---|------|------|
| 11.1 | **FK 최소화, 공통코드로 관리** | ✅표준 | docs/architecture/data.md §10 (소프트참조·공통코드) |
| 11.2 | **필요한 인덱스 생성** | ✅완료 | V44 성능 인덱스 8건, 배포됨 |
| 11.3 | **view/mview/function 고려** | ✅표준 | data.md §11 |
| 11.4 | **자동화 배치·프로시저 고려** | ✅표준 | data.md §13 배치 카탈로그 |
| 11.5 | **ten_id/tenant_id PK 맨 앞 복합키** | ✅원칙 | 메모리 [[tenant-id-pk-standard]] |
## 12. 인증 / SSO / HR
| # | 지시 | 상태 |
|---|------|------|
| 12.1 | **직원 인사(조직) 정보는 API 방식** | ✅설계 | docs/architecture/sso-hr-integration.md (HrDirectoryClient 어댑터+스냅샷) |
| 12.2 | **Open SSO 도입** | ✅설계 | Keycloak OIDC(PKCE)+SAML, 기존 JWT+2FA 공존(브로커) |
## 13. 평면도 / 기타
| # | 지시 | 상태 |
|---|------|------|
| 13.1 | 도면 안 열림 / AI 시각화 어디감 | ✅원인 | 403(행사 미가입) → 데모계정 멤버십 해소. DWG는 SVG캔버스+JPG 렌더(DWG 바이너리는 좌표소스) |
| 13.2 | ReRoomAI 기능 (나노바나나 image-to-image) | ⏳ | visualizer 트랙 |
---
## 미해결·대기 요약 (다음 우선 처리 — 2026-07-14 갱신)
**소유자 조치 대기:**
1. ~~**Gemini API 유료 키 교체**(시연 블로커)~~**해소(2026-07-14, 소유자 "Gemini API 지출 처리")**: 유료 전환 확인 — S7 조감·ReRoom 실렌더 라이브 E2E 성공(아래 세션 3 로그).
2. **PTR(역방향 DNS) 신청**`101.79.17.164`의 PTR이 없음(NXDOMAIN). Gmail 스팸 분류의 주 원인 후보. **IP 제공 호스팅/회선사에 "101.79.17.164 → mail.zioinfo.co.kr" 역방향 DNS 등록 신청** 필요(가비아 DNS 아님 — IP 소유 ISP만 설정 가능). 이것만 해소되면 메일 인증 체계는 완성.
**EDM 운영 실발송 개방 완료(2026-07-14 소유자 지시):** 서버 `EDM_TEST_MODE=false` 전환 + EDM 화면에 운영 실발송 버튼 신설 — 기존 버튼은 '테스트 발송'(secondary, live=false 안전 기본)으로 유지, '운영 실발송'(primary)은 **이중 확인**(대상 인원 경고 confirm → 'LIVE' 타이핑) 후에만 live=true 호출. i18n 4개국어. ~~참고: 현 데모 수신자 5명은 `@kintex.test` 시드 주소라 실발송해도 반송됨~~**해소(V56, 소유자 지시 "수신자 데이터 실제 이메일로 정비")**: 시드 주소 114행 전량을 소유자 Gmail plus-addressing(`ythong86+<등록ID>@gmail.com`)으로 치환 — 주소별 구분 가능·전부 소유자 수신함으로 실전달·타인 주소 미도입. 운영 실발송 E2E 검증 가능 상태.
~~완료 처리(2026-07-13 배포 확인): Tabulator/KxDataTable(1.3), 브레드크럼·404(4.4), 모바일 역할랜딩(4.3), 메시지 관리 화면(6.6), 반응형 스윕(1.11), Nifty 카드·그리드·폰트(1.1·1.2·1.9), 참가업체 관리(6.2), 상세 Nifty blog(1.4), 설정 커스터마이저(1.12), 히어로 5장 회전(3.13), 카드 3:4(3.12), 모바일 다국어(9.4)~~
~~완료 처리(2026-07-14 배포 확인): ReRoomAI image-to-image(13.2), Nifty 잔여 컴포넌트 버튼/드롭다운/List Group(1.5), 경계선 회색 정렬(1.10), 좌측메뉴 검색+아코디언, 그리드 짤림, 세션 재수화~~
---
## 처리 로그 (2026-07-13 세션)
**배포 검증 (04:33 KST):** push(e67db2e 병합) → Gitea webhook 자동배포 → 프론트 번들(/var/www/kintex)·백엔드 jar 모두 04:33 갱신, HTTPS 200. ★원격 main이 배포 파이프라인에 의해 force-rewrite(58aa844)되어 로컬과 분기 → `-s ours` 병합으로 로컬 정본 유지+원격 이력 보존 후 push. ★외부에서 :8021/:9001 직접 접근은 방화벽 차단 — health 게이트는 SSH(키 `~/.ssh/guardia_server`) 경유 localhost 확인이 정본.
**배포 완료 (라이브):** ecf60aa(Tabulator KxDataTable 3화면 + 브레드크럼/404 + 메시지 관리 화면 /admin/messages + i18n×4) · 7a117a0(모바일 roleCode 랜딩 결함) · 3966077(반응형 스윕 15화면) · d19b742(KxDataTable 4번째=공통코드) — API·웹·번들 게이트 통과. 이번 세션으로 **미해결 요약 1~5번 전부 해소**. 잔여: Nifty 컴포넌트 잔여 정렬(1.5)·경계선 지정화면(1.10)·ReRoomAI(13.2).
**모바일 APK 빌드·QR 배포 (2026-07-13, G3 승인 하):** EAS preview APK v0.2.0(versionCode 2, roleCode 랜딩 수정 포함, 빌드 c0d9332f) → 서버 `/opt/kintex/downloads/kintex.apk`(64MB) → `https://kintex.zioinfo.co.kr/downloads/kintex.apk` 200 (외부 검증) · `/app-qr` 랜딩 200. **영속화**: 웹루트 원자교체 시 APK가 지워지는 문제를 deploy_kintex.sh 스테이징 재주입(1162dd0)으로 해결 — 실배포로 E2E 검증 완료. ★교훈: 배포 게이트는 git HEAD(pull 시점 갱신)가 아니라 **산출물 mtime(index.html·jar)** 로 확인해야 함 — HEAD 갱신≠빌드 완료. APK 교체 절차: 새 아티팩트를 `/opt/kintex/downloads/kintex.apk`에 놓으면 다음 배포부터 자동 유지(즉시 반영은 웹루트 수동 복사 1회).
---
## 처리 로그 (내가 처리·배포한 것 — 2026-07-12 세션)
**배포 완료 (라이브):** 커밋 214b6df → 6e95ac6 → 87f310f/55e27b3 → 3077cb0
- V42 대량시드(40테이블 2,535행) · V43 관람객 가이드/연월 캘린더 뷰 · V44 성능 인덱스 8건 · V45 아바타 컬럼 · V46 포스터 로컬화(73건) · V47 e-2026-live 정산 폐루프
- 공개 AI 관람 도우미 API(grounded·Claude) · 연월 캘린더 API · 3-트랙 관문/서브홈 · 역할별 랜딩+메뉴 게이트
- 미니/큰 캘린더 공휴일 표시·회색 테두리·Nifty 톤 · 코엑스풍 공개사이트 비주얼(히어로·모션·통계밴드) · 실제 포스터 이미지
- 파란버튼 흰글자(`--color-on-accent`) · 다크모드 흰글자 77곳 · favicon(톰캣→KINTEX v3) · 2FA 방패 아이콘 · 브랜드 영문병기 · 정산 패딩
**구현 완료 (미배포 — 다음 배포 대기):**
- **Nifty 디자인 시스템 정렬**(카드 `.kx-card` Nifty 구조·`--fs-micro`/`--fw-*` 토큰·공용 제목클래스·테이블 `.kx-table` 6화면 수렴, font 179+weight 415 토큰화)
- **카드 이미지 3:4 프레임 + object-fit cover**(왜곡/잘림 제거)
- **메시지 관리 백엔드**(V48 sys_message + 렌더 API + 36샘플)
- **통계밴드 흰글자 2곳** · **푸터 "2026 © KINTEX..."** 4개국어
**병렬 진행 중:** 모바일 다국어+역할랜딩 · 잔여 데이터 보강(V49) · 산출물 문서
**설계·표준 문서 산출:** PLANNING v3.4(AI 토큰최소화 §8A) · design.md v2.4(공개 비주얼·모션) · docs/architecture/data.md(FK최소화·공통코드·view/mview·배치) · sso-hr-integration.md(Open SSO+HR) · DESIGN_SYSTEM_NIFTY.md · mobile-security-*.md · mobile-benchmark-*.md
## 산출물(문서) 상태
| 산출물 | 타이밍 | 상태 |
|--------|--------|------|
| 개발계획서 | 개발 전/중 | 📋 생성 착수(PLANNING v3.4 기반) |
| 설계서(아키텍처·ERD·화면·API) | 개발 중 | 📋 생성 착수(design.md v2.4·architecture·backend 계약 기반) |
| 사용자 지침서 | **완성+QA 후**(최종 메뉴 반영) | ⏳ UI 정렬 안정화 후 — 지금 생성 시 재작업(정책: 최종 1회) |
| 운영자 지침서 | **완성+QA 후** | ⏳ 동일 |
> 정책([[deliverables-update-policy]]): deliverables는 최초 1회 + 최종 1회. 개발계획서·설계서는 지금 생성 가능(내용 안정), 지침서는 현재 UI 정렬 파동이 끝난 뒤 최종 메뉴 기준으로 1회 생성.
---
## 처리 로그 (2026-07-14 세션 — AI 기능 우선 + 시연 준비)
**소유자 지시:** ① "AI 있는 기능부터, 특히 플로어플랜스튜디오" ② "ReRoomAI image-to-image도 같이" ③ "AI 시연 해야돼" ④ "시연 절차를 PPT로(입력 예시 포함, 샘플 데이터 등록)" ⑤ 플로어플랜 링크오류 제보 ⑥ graphify.EXE 경로 '/' 누락 제보 ⑦ "배포는 CI/CD로"
**구현·배포 (커밋 ba34aba·0f91dcf·8943c80·1e349aa·5b76557):**
- **플로어플랜 AI(M2)**: 자연어 조건 해석 `POST .../auto-generate/interpret`(AiTextRouter Claude, JSON 강제·주입 방어·서버 클램핑·degraded 폴백) + `auto-generate?ai=true` 배치안별 지표 근거 AI 요약(WISE AI 라벨). AutoLayoutDialog 자연어 입력바.
- **ReRoomAI 사진 시안(M5 확장)**: 참조사진 업로드(매직바이트·10MB·경로방어)→R1 렌더잡(기존 큐/콜백/WS 재사용)→보존잠금+교체지정 4단 프롬프트(스타일 6종 JSON 단일출처)→Before/After 슬라이더+워터마크. 부스설계 스튜디오 "사진 시안 (AI)" 섹션.
- **G-02 티켓 도메인**(GAP P1 해소): V50 스키마+시드, 공개 API 3종(잔여 서버권위·조건부 재고차감 oversell 차단·Mock PG·조회 PII 마스킹+해시 대조), PublicTicketPage 실배선, i18n 15키×4.
- **링크오류 근본원인**: admin 계정 event_member 0건 → 스코프 메뉴가 /home 폴백. V51로 admin을 e-2026-live·smf ORGANIZER 멱등 등록.
- **graphify 훅**: `.claude/settings.json` 훅 경로 백슬래시가 sh에서 소모 → 슬래시 표기로 수정(파이프 테스트 통과).
- **시연 산출물**: `docs/demo/AI_DEMO_SCRIPT.pptx`(10슬라이드 — 4개 데모 흐름·단계별 입력 예시·체크리스트·트러블슈팅). 샘플 데이터 등록: 데모행사 admin 멤버십(V51)·티켓 시드(V50, 조회예시 KTX-2026-500001/010-1234-5678)·ReRoom 샘플사진 `/downloads/demo/sample_booth.jpg`(+alt, Wikimedia CC 출처표기).
**⚠ 시연 블로커(소유자 조치 필요):** Gemini API 키가 무료 티어 → 이미지 모델(`gemini-3.1-flash-image`·2.5 모두) 쿼터 0(429) — **S7 조감·ReRoom 실렌더 불가**. Google AI 유료 결제 활성화 또는 유료 키 교체 필요. 텍스트 AI(Claude)는 정상.
**★CI/CD 교훈(확정):** 00:26·00:52 배포가 연속으로 스테일 jar(신규 클래스·V50/V51 누락)를 내보낸 진짜 원인 = **포트 9999를 점유한 deploy_server.py 프로세스가 7/11 19:44에 뜬 구버전**(메모리에 옛 kintex 블록). 디스크 파일은 최신이었으나 재시작이 누락돼 옛 로직이 계속 실행, 새 인스턴스는 "Address already in use"로 기동 실패. → `systemctl restart zioinfo-deploy`(01:15, PID 1123130)로 해소. **재발방지 수칙: deploy_server.py 갱신 시 서버 반영+재시작은 원자 1세트**(기존 교훈의 재발) + 배포 게이트에 **jar 내용물 검증**(`unzip -l app.jar | grep 최신마이그레이션`) 추가. `/opt/kintex/deploy_kintex.sh`는 미사용 구사본(파이프라인은 repo `deploy/deploy_kintex.sh` 실행).
---
## 처리 로그 (2026-07-14 세션 2 — 라이브 장애 연쇄 해소 + UI 지시 + 기능 배치 완성)
**소유자 제보·지시:** ① "도면 안나옴"(플로어플랜 → /home) ② 서류·마일스톤/물류 허브 응답대기 ③ 옥션 업체 포털 "대시보드를 불러오지 못했습니다" ④ "위 오류 모두 수정해" ⑤ "그리드도 짤린다" ⑥ 부스 판매 등 9개 화면 "행사를 선택해 주세요"(선택기 비어 선택 불가) ⑦ "좌측메뉴 아코디언 + 메뉴검색 추가, 선택 시 이미 펼쳐진 메뉴는 접기" ⑧ "플로어플랜 스튜디오는 언제?" ⑨ "이어서 작업"(끊긴 배치 마무리)
**근본원인 1 — 연쇄 장애(①~③ 공통):** 01:17 배포된 새 jar가 `TicketMapper.xml`**미이스케이프 `<=`** 로 SqlSessionFactory 파싱 실패 → 8회 crash-loop → 파이프라인이 구 jar(7/13 빌드)로 롤백 → **새 프론트 + 구 백엔드 불일치** + V50/V51 미적용(admin 멤버십 소실 재발). 수정 `1d46da8`(이스케이프, 전 매퍼 10개 XML 정형성 검사 통과) → 새 jar 라이브(01:52), V50/V51 적용·admin ORGANIZER 멤버십(e-2026-live·smf) 확인. ★교훈: 매퍼 XML raw `<=`는 빌드/테스트 통과 후 **부팅 시점**에만 터짐 — 배포 게이트에 매퍼 XML well-formed 검사 추가.
**근본원인 2 — "행사를 선택해 주세요" 전 화면(⑥):** 토큰은 sessionStorage 지속인데 user/workspaces는 메모리 zustand뿐 → **새로고침 시 workspaces=[] 박제**(세션 재수화 부재). `3860e7e`로 RequireAuth에 /api/auth/me + /api/auth/workspaces 자동 복원(401 시 로그아웃) 추가.
**개별 버그:** `/api/admin/messages` 500 = SysMessageMapper `(#{p} IS NULL OR …)` PG 파라미터 타입 추론 실패 → `::text` 캐스트(`ecc00f8`). 그리드 짤림(⑤) = flex/grid 자식 `min-width:auto` 블로우아웃 + `.kx-dash__table-wrap overflow:hidden` 직접 클립 → 공용 래퍼(`.kx-table-scroll`·`.kx-dt`) `min-width:0` 수렴 + 4화면 보정(`3c80585`).
**UI(⑦):** 메뉴 검색 신규 이식(UIWS NavSearch 패턴 — 전 대분류 횡단·매칭 하이라이트·Escape 클리어·역할 게이트 유지, i18n 4개국어) `a3fdb62`. 아코디언 단일확장은 기존 구조가 이미 충족(라우트 기준 활성 그룹 자동 펼침) — 회귀 없이 유지.
**기능 배치 완성(⑨ — 끊긴 세션 미커밋분, 커밋 ef74006~c664743 8건):** 회의 녹음→STT(whisper env 설정형, 미설정=degraded)→AI 회의록+액션아이템(V52 transcript) · EDM 실발송(수신동의 필터·**테스트모드 기본 ON**·캠페인 상한·분당 레이트·불투명 수신거부 토큰·발송이력 V53) · 마이페이지 프로필/비번변경/알림설정(V55) · CMS AI 번역 · 보고서 PDF(openhtmltopdf+NanumGothic 임베드) · AI 검색(grounded) · 렌더 이력 갤러리(V54 인덱스). 검증: gradle test 통과·tsc 0·V52~V55 라이브 dry-run(BEGIN/ROLLBACK) 후 배포 — jar 내용물 게이트(V52~55 4건)·flyway 52~55 성공·신규 엔드포인트(알림설정/캠페인/스폰서십/회의/검색) 전부 200·error_log 신규 유입 0(프로브 오타 2건 제외).
**답변(⑧):** 플로어플랜 스튜디오는 재로그인(또는 새 번들에서 새로고침) 후 좌측 메뉴 행사 스코프로 진입 — H1 배치안 v1 API 200 확인.
**EDM 테스트 발송(소유자 지시 "EDM 테스트 발송 해봐"):** 1차 시도 2건 전부 `MailAuthenticationException` — 원인은 `mail.smtp.auth` 기본 true + SMTP 계정 공란(빈 자격증명 AUTH 시도, 로컬 Postfix 127.0.0.1:25는 무인증 릴레이). 서버 env에 `SMTP_AUTH=false`·`SMTP_STARTTLS=false`·`EDM_TEST_RECIPIENTS=(소유자 2주소)` 추가 후 재발송 → **Gmail 250 OK·사내 maildir 배달 확인**, 실대상 5명 안전 스킵·`[TEST]` 접두어·mail_log 마스킹 기록. ★교훈: 응답 `sentCount`는 비동기 큐 적재 건수라 SMTP 실패를 못 봄 — **발송 결과 정본은 mail_log**. meta 문구를 "발송 요청 N건 큐 적재(결과는 발송 이력 참조)"로 정직화(코드 반영).
**마감 배치(소유자: "이어서 모든 작업 완성하고 git push"):** Nifty 잔여 컴포넌트(버튼/드롭다운/List Group, 1.5)·경계선 회색 정렬(1.10) 완료, EDM meta 정직화, 본 로그 갱신 — 커밋·배포·게이트 검증 후 마감.
**EDM 운영 실발송 실검증(소유자: "운영 실발송 해봐", 07:18):** cp-live-003(관람객 만족도 설문)을 live=true로 실발송 — 수신동의 5명(V56 plus-주소) 전원에게 발송, **Gmail 250 OK 5통 전달 확인**, 미동의 2명 제외, 캠페인 done 전이(중복 발송 봉인), mail_log 5건 sent(마스킹). 실패 0.
**SPF/DKIM 정비 감사(소유자: "SPF/DKIM 정비해줘"):** 실측 결과 **인증 체계 대부분 이미 건강** — ①SPF `v=spf1 ip4:101.79.17.164 -all`(정확·하드페일) ②DKIM opendkim 가동·`s=mail` 셀렉터 서명, DNS `mail._domainkey` 키 일치(`opendkim-testkey: key OK`), 오늘 EDM 5통 전부 서명 확인 ③DMARC `p=quarantine` 게시·정렬(d=From 도메인 일치) ④발신 TLS opportunistic(may) — 관측성 위해 `smtp_tls_loglevel=1` 적용. **유일 결함 = PTR 부재(NXDOMAIN)** → 소유자 조치 대기 2번 등재(ISP 신청 사안, 서버/가비아에서 불가). 참고: `default._domainkey` 부재는 무해(모든 서명이 s=mail).
**수신거부 링크 E2E(소유자: "수신거부 링크도 테스트해봐"):** vr-live-101 실토큰으로 HTTPS 풀스택 클릭 시뮬레이션 — ①정상 클릭: 완료 안내 HTML + DB 즉시 반영(발송 대상 5→4) ②재클릭: 멱등 완료 안내 ③무효 토큰/토큰 미지정: 안전 실패 안내(정보 미노출). 전 시나리오 통과. 테스트 후 vr-live-101 동의 상태 복구(대상 5명 원복). **EDM 전 구간(동의 필터→테스트→운영 실발송→이력→수신거부) 실검증 완료.** 다음 개선 후보: zioinfo.co.kr SPF/DKIM 정비(스팸함 회피).
---
## 처리 로그 (2026-07-14 세션 3 — Gemini 유료 전환 후 렌더 파이프라인 완결)
**소유자 지시:** ① "이어서 작업 — Gemini API 지출 처리했어" ② "오른쪽 스크롤이 없는 그리드 다수" (후속 처리)
**Gemini 라이브 검증:** 유료 전환 즉시 `gemini-3.1-flash-image-preview` 직접 호출 성공(385KB). 이어 실제 파이프라인 E2E(OTP 로그인→S7 조감 발행→ReRoom 참조사진 업로드→R1 발행)에서 **이미지는 생성되는데 상태가 영원히 QUEUED**인 결함 발견 — 429 시절 가려져 있던 완결 루프 갭 2중:
1. **워커→백엔드 콜백 부재**: 워커는 Redis pub/sub 발행만 하고 백엔드가 기다리는 `POST /api/internal/render/callback`을 호출하지 않음 → DB/조회 상태 미갱신. **수정(b5d29e6)**: worker.py `_callback_backend()`(X-Worker-Token, imageUrl/schemaHash/modelVersion/errorMessage, 실패 비치명).
2. **RENDER_WORKER_TOKEN 불일치**: nanobanana.env와 kintex.env의 토큰이 서로 다름 → 콜백 401. **수정(서버)**: kintex.env 값으로 동기화+워커 재시작.
3. **산출 이미지 서빙 부재**: /renders 정적 서빙이 백엔드·nginx 어디에도 없음. **수정**: WebMvcConfig `/renders/**`→`RENDER_OUTPUT_DIR` + SecurityConfig permit + nginx `/uploads/`·`/renders/` 프록시(기존 /uploads도 SPA 폴백으로 깨져 있던 것 함께 해소).
4. **워커 로그 유실**: stdout 블록버퍼링으로 worker.log에 이벤트/콜백 로그가 안 남음 → 유닛에 `PYTHONUNBUFFERED=1`.
**최종 E2E(라이브)**: S7 조감·R1 ReRoom 모두 발행→워커 라이브 렌더(live=true·degraded=false)→콜백 200→**status DONE + imageUrl**→HTTPS 200(image/png) 완전 자율 완결. 렌더 품질 포토리얼(S7 파란 KINTEX DEMO 부스 조감 / R1 참조사진 기반 목재톤 시안). 스테일 QUEUED 잡 3건 콜백 백필로 DONE 처리. nginx sites-enabled의 `.bak` 사본 로드(중복 vhost 경고) 정리.
**시연 블로커 전부 해소** — AI_DEMO_SCRIPT.pptx 4개 데모 흐름 모두 실동작 가능 상태.
---
## 처리 로그 (2026-07-14 세션 4 — 백로그 잔여 일괄 소진)
**소유자 지시:** "이어서 작업" (세션 3에서 진행 중이던 백로그 스윕 마무리)
**designer 백로그 전량 해소 (design.md v2.5, 커밋 d548044):** B-01 SCR-06 **조립부스 모드** 신설(간판·가구·조명 옵션 패널 + 전용 Stitch 프롬프트, SCR-05 분기) · B-04 화면 집계 정정(P0 코어 15 · 총 89화면, SCR-T0~T3 편입) · B-05 정산 메뉴 IA 정합(SCR-21) · B-06 이메일 인증 로그인 프롬프트 · B-07 공유 버튼 + 위반 핀 1:1 정렬 · B-08 판매면적 산술 정정(4,590㎡) · B-10 Phase 2/3 라벨. **BACKLOG.md designer open 항목 0.**
**reviewer 백로그 전량 해소 (커밋 3f479a9):** R13-01 SCR-13 매출 추세에 **AI 수요예측 점선 실렌더**(클라이언트 최소제곱 선형회귀, 향후 2개월, 점 3개 미만 graceful 생략) · R15-02 카테고리 기본값 "기본값" 배지 표기 · R17-01 스타일가이드 §8 시스템 아이콘 라이브러리(icons.tsx 자동 열거) · R17-02 `CHART.warning`→`violationWarn` 개명(잔여 사용처 0) · 위생: MeetingPage·MultilingualCmsPage stale 헤더 주석 정정. **BACKLOG.md 검증 백로그 open 항목 0.**
**플로어플랜 뷰어 조작 (소유자 지시, 커밋 1c4edb0):** 캔버스 **마우스휠 확대/축소(0.3~4x, non-passive)** + **왼쪽 드래그 이동**(pointer capture, 3px 임계, 드래그 직후 click 캡처 차단으로 부스 선택 오발 방지). ★끊긴 세션의 미배선 1건 발견·해소 — `onZoomChange`가 부모(BoothLayoutEditorPage)에 전달되지 않아 휠 줌이 죽어 있던 것을 배선.
**GAP_AUDIT 재판정 (커밋 41503f7):** G-01~G-09 전량 해소를 코드/엔드포인트/V50~V56 기준 재확인 — **코드 미개발 잔여 0건**. 로드맵 잔여는 서류 HWP 렌더·AppQr iOS(EAS G3) 2건뿐.
**검증:** tsc 0 · vite build 통과 · push 후 배포 게이트(번들 마커 + public API) 통과.
---
## 처리 로그 (2026-07-14 세션 5 — LIVE 데모 배치 완성 + 부스 자동 배치 "평면도 안" 정렬)
**소유자 지시:** ① "LIVE 데모 배치(진행중) → 완성 할 것!" ② "부스 자동 배치" ③ "평면도 안에 배치 해 줘야 하는 것 아닌가? 평면도 안에 자동 배치 해 줘야 한다."
**근본원인 — 부스가 평면도 밖에 보이던 이유(2중):**
1. **도면 정렬 부재**: 홀 도면 JPG는 여백·범례·미니맵을 포함한 전체 도면인데, 캔버스가 이미지를 홀 사각형(0,0~W,H m)에 통째로 스트레치(`preserveAspectRatio=none`) → 부스 그리드가 노란 전시 바닥면 밖(여백·범례 위)까지 덮임.
2. **하드코딩 홀 치수**: BoothLayoutEditorPage가 `hallDims=[126,90]` 고정 — 백엔드는 실측 홀 치수로 배치를 생성하므로 축척 불일치.
**수정 (커밋 0cc7f26):**
- `hallFloorplan.ts`: 홀 1~10 도면 JPG의 전시 바닥면(1전시장 연노랑·2전시장 라임그린) bbox를 **색상 블롭 자동 측정(최대 연결 성분, Pillow)**으로 산출한 캘리브레이션 `FLOOR_REGIONS` 추가.
- `FloorplanCanvas`: 캘리브레이션 영역이 홀 사각형에 오도록 도면을 역산 배치 → **부스 좌표가 도면의 채색 바닥면 "안"에 정확히 놓임**. 언더레이 가시성 0.3→0.55.
- `BoothLayoutEditorPage`: `layout.hall.dimsM` 실측 치수 사용(126×90 하드코딩 제거), 프론트 `LayoutDto`에 누락됐던 `hall`(HallInfoDto) 타입 추가.
- `FloorplanServiceImpl.packBooths`: 무시되던 **주출입구·무대·라운지 수를 예약 영역으로 반영** — 중앙 교차 주통로(40m 이상 변), 출입구 전면 클리어존(9×6m), 무대(12×9m+버퍼, 후면), 라운지(9×9m+버퍼, 중앙). 배치안이 실제 전시 평면도처럼 구획됨.
**세션4 미커밋 WIP 완성 (커밋 c686365):** admin 실집계 통계 API(`/api/admin/stats`, SCR-16)·옥션 실시간 순위 WebSocket 푸시(`/topic/auctions/{id}/ranking`, afterCommit·봉인입찰 마스킹 유지·폴링 폴백)·CMS 예약 게시(30초 DB 폴러+V58 부분 인덱스). 컴파일은 됐으나 `CmsServiceTest`가 신규 `AuditLogService` 생성자 미반영으로 테스트 컴파일 실패 → 수정.
**검증:** gradle test 통과 · tsc 0 · vite build 통과 · 매퍼 XML well-formed 0건 · push→자동배포 → 번들 스왑 확인(D_hzGGkv→Cmx0ZsFU, 캘리브레이션 값 번들 포함 확인) · health UP · **HTTP 스모크 13/13 통과**. ★V58 라이브 dry-run은 이 세션에 SSH 자격증명(KINTEX_SSH_PASSWORD env) 부재로 생략 — V19 기존 컬럼 대상 `CREATE INDEX IF NOT EXISTS` 멱등이라 저위험, 배포 스크립트 health 게이트+롤백이 커버.
**잔여:** 도면 교체 시 캘리브레이션 재측정 필요(스크립트 패턴은 색상 블롭 최대 연결 성분). 배치안 내 무대/라운지 시각 표기(예약 공간만 비움, 오브젝트 미표시)는 후속 후보.
### 세션 5 추가 지시 처리 (같은 날 연속 — 실 운영 전환)
**소유자 지시(순차):** ① "전시장 선택하여 실 운영" ② "평면도 목록 보여라 / 홀 기준인가" ③ "대분류>중분류>소분류" ④ "데이터는 트리구조" ⑤ "이미지 생성은 버튼 클릭할 때만" ⑥ "이미지 클릭 시 확대 팝업" ⑦ "나노바나나 이미지 저장 기능(조회 재열람·입찰 참고용)" ⑧ "자동 배치를 사용자가 쉽게 기획하여 재구성"
**처리(커밋 6c0d364, 배포 검증 완료):**
- **V59**: 홀 치수 전 홀(10) 도면 방향 정렬(예: H1 63×171→171×63, H7 126×90→90×126) + 가정 비상구·트렌치 재유도. 근거: 도면 JPG 10장 전수 실측 — 전 홀이 DB와 90° 뒤집혀 있었음.
- **V60 hall_zone(트리)**: 대분류(전시장)>중분류(홀)>소분류(구역) — 도면 실측 구획(1A/1B·6A/6B/6C·7A/7B·8A/8B·9B/9A·10B/10A, 9·10홀은 A가 아래). `GET /api/halls/tree`.
- **자동배치 3단계 위저드**(AutoLayoutDialog 재구성): ①어디에(트리 캐스케이드) ②조건(자연어+AI 해석) ③3안 비교. 구역 선택 시 `zoneId` 경계 안에서만 패킹.
- **이미지 버튼 전용 생성**: autoGenerate의 S7 자동 발행 제거(Gemini 쿼터 보호), `POST …/auto-generate/preview` 신설 — 카드별 "조감 이미지 생성" 버튼 클릭 시에만 발행.
- **확대 팝업+저장**: 생성 이미지 클릭 → 라이트박스(워터마크 고지 유지) + "이미지 저장"(다운로드). 렌더는 render_job 영속 → 갤러리(boothRef=HALL-{hallId}) 재열람·옥션 MaterialPackage.aiImageUrl 참고 재사용.
- **P0 결함 발견·해소**: 프론트가 apply-option을 호출하지 않아 "이 안으로 편집 시작"이 배치를 저장하지 않았음 → 실저장 배선.
- **캘리브레이션 교정**: H8·H10 도면은 중앙 통로가 색 영역을 갈라 최대 블롭 측정이 하부 절반만 잡았음 → 유의미 블롭 합집합으로 재측정.
- **문서**: PLANNING v3.5(M2-1 이지 플로우, planner)·design.md v2.6(SCR-03/04 위저드·라이트박스, designer).
**검증:** gradle test·tsc·vite build·매퍼 XML 전부 통과 → push→자동배포(번들 CYBPm4tX)→health UP→스모크 13/13. V59/V60은 배포 health 게이트로 검증(SSH 자격증명 이 세션 부재로 사전 dry-run 생략 — 멱등 설계).
**미사용 CAD(DWG) 질의 답변 기록:** JPG는 시각 언더레이용, DWG(1전시장 층별 평면 3장+전기·설비 트렌치 / 2전시장 평면·전력간선·철골기둥 주심도)는 실측 데이터원. DWG는 사유 바이너리라 즉시 파싱 불가 — ODA 변환→DXF→ezdxf 레이어 추출 파이프라인으로 트렌치 실좌표(현 6m 가정 그리드)·기둥(현 미반영)·비상구 실좌표(현 변 중앙 가정) 대체가 후속 과제(PLANNING R4 정합).