PRODUCTION LIVE — 머지 PASS · P3 결정 요청

2026-05-06 00:15 · keeper-out admin lead detail 12섹션 · main 4ab6eb4 · 영업원 출격 가능 상태
PRODUCTION LIVE

머지 fix PASS — 12섹션 영업원에게 라이브

https://www.keeper-direct.ceo/keeper-out/admin → 200
https://www.keeper-direct.ceo/keeper-out/admin/leads/<id> → 200

01.최종 검증 결과

main HEAD = merge commit
4ab6eb4 (parents: d279bb0 + 9af91f7)
staging의 7 commit 모두 main에 흡수
dbba9d1 ~ 9af91f7 모두 git log main에 노출
production /keeper-out/admin
HTTP 200
production lead detail 페이지
HTTP 200, SSR HTML에 "고객·보안" 셔브 확인
/diagnose 영향 없음 (격리)
HTTP 200 (cashon 헤더 그대로)
untracked 13개 + modified 2개 그대로 보존
stash 처리 0 (코덱스가 dirty 상태에서도 checkout 통과)

02.현재 main commit 그래프

$ git log origin/main --oneline | head -10
4ab6eb4 Merge staging: keeper-out admin lead detail P1.5+P2 (4 sections)  ← ★ NEW
9af91f7 feat(keeper-out/admin): lead detail 메모 추가 폼 (visits POST 재사용)
2c434d1 feat(keeper-out/admin): lead detail P2 — 방문/점주/매장마스터 3섹션
26f3214 feat(keeper-out/admin): GET endpoint에 visit_logs/place/owner embed + other_leads
7d45dae refactor(keeper-out/admin): root layout에서 마케팅 헤더 격리
e8f22ed feat(keeper-out/admin): lead detail view P1 (8섹션)
dc4d9a0 feat(keeper-out/admin): lead GET endpoint with PostgREST embed
dbba9d1 feat(keeper-out): /diagnose pain_points·pain_note 백엔드 처리
d279bb0 Merge staging: /diagnose 외 키퍼 오렌지 환원 (자동님 5/5 정정)
a1da85d revert(design): /diagnose 외 전영역 키퍼 오렌지 톤 환원

03.지금 라이브된 12섹션

#섹션상태
1Hero (요약 + status pipeline)LIVE
2고객 (ceo·phone·naver_place_id)LIVE
3현재 보안 (5 stat 카드)LIVE
4★ Pain Points + 영업분기 매핑LIVE
5사진 갤러리LIVE
6영업자 1·2·3 카드 (read-only)LIVE
7지급/인센티브 + 합계LIVE
8이벤트 타임라인LIVE
9방문 로그 (visit_logs)LIVE
10점주 다른 매장LIVE
11매장 마스터 (폐업률·우선순위)LIVE
13방문 메모 추가 폼LIVE

04.🚨 보안 — 최우선 fix 필요

⛔ /keeper-out/admin/* 가드 ZERO 상태

Production에 라이브됐지만 라우트 가드 / RBAC / IP 화이트리스트 등 접근 통제가 하나도 없습니다. URL만 알면 누구나 접근 가능. 노출되는 데이터:

memory keeper-out 데이터 격리 정책 룰 "영업/원가/인센 비공개 사수"와 직접 충돌. 링크 추적/내부 공유 시 즉시 데이터 유출 가능.

★ INSIGHT — 가드 옵션 비교
PM 추천: 옵션 A를 즉시 박고 → 별도 세션에서 옵션 B 마이그레이션. 5/5 출격 첫날 영업이 막히면 안 됨.

05.P3 후보 — 우선순위별

🔴 RBAC / 라우트 가드 ~30분 (옵션 A)
위 § 04 그대로. middleware basic auth 즉시 박기. 영업 출격 데이터 보호 시급.
🔴 operator name 매핑 (agent_id → 이름) ~20분
현재 visit_logs.promoter_id가 raw UUID로만 표시. agent JOIN 없으면 영업원이 누구 방문했는지 모름. P2의 visit_logs 섹션이 사실상 절반만 동작. GET endpoint에 promoter agent embed 추가.
🟡 operator/agent 배정 폼 ~40분
섹션 6(영업자 1·2·3)이 현재 read-only. agent 드롭다운 + PATCH 호출로 배정 변경 가능하게. 영업원이 매장 방문 후 즉시 본인 ID 박을 수 있음.
🟡 visit 메모 photo upload + GPS ~60분
P2 메모 폼은 텍스트만. 현장 사진 + navigator.geolocation GPS 자동 박기 추가. 이미 visits POST는 photo_urls/gps 받음 — UI만 만들면 됨.
🟢 사진 lightbox · 모바일 폰 fit 점검 ~30분 each
UX 개선. 영업원 폰에서 사진 탭 시 lightbox / 12섹션 모바일에서 스크롤 길이 점검 등.
🟢 P3.5 — outbound-dashboard 본체 (다른 레포) 별도 세션
handoff doc의 큰 그림 — direct-market /admin/* + outbound-recorder BFF + Flutter app. keeper-direct 영역 안에서 P3까지 마무리한 후 다음 단계 결정.

06.다음 결정 요청

한 줄 회신

제 강력 추천: RBAC + agent name 묶어서 1 라운드. 둘 다 production 데이터 정합성 직결.

또는 자동님 직접 우선순위 (예: "RBAC + 배정 폼"). RBAC 옵션 A/B/C 중에서도 선택 명시.


컨텍스트 브릿지 업데이트 후보 (자동님이 "정리" 트리거 시)

참조 흐름 (오늘 전체)

  1. pain APIP1 Plan
  2. P1 BriefP1 PASS
  3. P1.5+P2+머지 Brief머지 fix Brief
  4. 이 문서 — production live PASS + P3 결정