# 레벨 스튜디오 핵심 기능과 현재 상태 · 2026-10-30

현재 구현 브랜치: **feat/complete-core-20261030**, 버전 0.8.0. main의 0.7.0과 기존 운영 사이트에는 이 브랜치의 새 기능이 아직 반영되지 않았다. 공개 배포/main 병합은 최종 사용자 확인 대기다. HighLevel 전체 동등 구현이 끝났다는 뜻이 아니다.

## 2026-11-04 구현 추가

- 폼 응답 분석은 게시 버전·작업공간 날짜로 필터링하고 문항 노출·응답·미입력과 UTM 유입을 집계한다. 응답 CSV와 예전 문항 이름을 제공한다.
- 사이트는 데스크톱 1열·2열·3열 너비, 모바일 자동 줄바꿈, FAQ와 구분선을 지원한다. 이전 게시 버전을 다시 공개할 수 있으며 편집 중인 초안을 보존한다.
- 예약 변경·상태, 영업 단계, 청구서 발행·전액 수납으로 내부 자동화를 시작한다. Webhook은 승인된 고정 수신 주소와 Cron을 운영자가 연결한 뒤 사용할 수 있다.
- 작업공간 소유자용 CRM API로 연락처·영업기회·예약·청구서를 조회하고 고객을 등록·수정한다. 인증, 조건부 저장, Webhook 서명·재시도는 [CRM API와 Webhook](CRM-API-WEBHOOKS.md)을 따른다.
- 이 아래의 10월 30일 검증 이력은 해당 날짜 기준이다. 이번 변경은 GitHub 개발 브랜치에서 검증한다. Workers 공개 배포와 실제 공급자 수신 검증은 운영 절차에 포함된다.

## 세부 권한·편집기·방문 분석 추가 검증

- **팀**에서 고객·기회·예약·청구서 접근, 표시할 고객 필드, 담당 고객을 회원별로 지정한다. 수정을 허용한 편집자는 공개된 고객 필드만 저장할 수 있다. 원본 데이터 API, 파일, 다른 모듈은 제한 회원의 경로에서 차단한다.
- **사이트 편집기**에서 2·3열 행과 열별 섹션, 인용문, HTTPS 동영상 파일, 높이 지정 여백을 저장한다. 좁은 화면은 행을 1열로 쌓는다. 행 복제는 하위 섹션도 복제하고, 행 제거는 해당 섹션을 페이지에 남긴다. 게시본은 별도 버전이다. 템플릿 이동 시 행·섹션 참조도 다시 연결한다.
- **방문·이탈 분석**은 사이트 설정을 켠 이후 발행된 공개 공유 링크에서만 수집한다. 페이지 조회·진입·종료, 페이지 이동, 단일 페이지 이탈, 폼 입력·접수·미제출 종료·진행 중을 한국 시간 기준으로 집계한다. 30분 동안 관측된 활동이 없으면 종료로 계산한다. 종료된 방문 중 페이지 한 번만 조회하고 폼 활동이 없었던 비율이 이탈률이다. 폼 제출은 서버 접수가 성공한 경우에만 기록한다.
- 방문은 탭의 임시 세션 식별자를 기준으로 집계한다. 광고 차단·개인정보 수집 거부·연결 실패로 관측되지 않은 방문과 이전 방문은 포함되지 않는다. 리포트는 최근 90일을 조회하고 이벤트는 91일 이후 정리한다. 원본 폼 답변, 전체 URL, IP는 방문 분석 테이블에 저장하지 않는다.
- 새 두 마이그레이션과 Worker는 개발 브랜치에서 검증한다. 운영 반영 이후 팀원 실제 계정으로 초대·로그인·세부 권한을 확인해야 한다.

## 어떤 앱인가

고객 확보 → 상담·예약 → 영업 → 청구 → 교육·커뮤니티 → 후속 업무를 하나의 작업공간에서 관리하는 보라색 CRM/업무 앱이다. 원본 HighLevel 계정 없이 공개 문서·클라이언트·제공 화면을 분석하고 자체 엔진과 저장·권한 경계를 만들었다. 원본의 로그인 뒤 모든 화면·서버 동작은 관찰하지 못했다. 분석 목록 126개/37영역을 완료 기능 수로 세지 않는다.

## 지금 실제로 처리하는 영역

| 영역 | 실제 구현·저장 범위 | 현재 한계 |
|---|---|---|
| 고객·업무·영업 | 고객 생성/수정/검색/태그/메모/보관/복원/병합, CSV 매핑·가져오기·내보내기, 할 일, 여러 파이프라인·단계·기회 | 원본의 모든 대량 작업·권한·API와 동일하지 않음 |
| 데이터 관계 | 타입별 사용자 필드·객체·레코드·동적 목록, 고객↔객체/객체↔객체 1:1·1:N·N:N, 역방향 필터·CSV, 병합 시 관계 재매핑과 충돌 이력 | 대규모 그래프의 별도 성능 시험, 모든 원본 객체 계약은 미완료 |
| 예약 | 자원·캘린더·시간대·주간 시간표·예외·완충·순환·동시 정원·하루 상한, 생성/변경/취소·ICS | Google/Outlook 일정 충돌 동기화·쓰기 미구현 |
| 고객 예약 포털 | 공개 가용 시간→실제 CRM/예약 저장, 개인 변경/취소 주소, 마지막 정원 CAS·재전송 멱등, 링크 만료/해제 | 온라인 결제·외부 알림·원본 독립 고객 계정과 다름 |
| 사이트·폼 편집기 | 다중 페이지, 반응형 섹션, FAQ·구분선, 스타일·메타·복제·실행 취소, 이전 발행본 복원, 조건부 폼→CRM 접수와 버전별 분석·UTM·CSV | 원본 전체 위젯·다중 중첩 레이아웃 및 실제 모바일 기기 전 조합은 미검증 |
| 자동화 | 내부 이벤트·조건·대기·태그·할 일·기회, 발행 원본, 실행 기록·재시도·멱등·취소, Worker 5분 Cron 코드 | Worker 미배포라 현재 새 Cron의 운영 실행은 시작되지 않음. 외부 발송/AI/Webhook 동작 추가 개발 필요 |
| 청구·수납 | 항목·세금·할인·발행본, 수기 부분/전액 수납·취소·무효, 공개 청구서, 일/주/월 반복 초안·종료일/횟수·중지/복원 | 실제 카드/은행 이동·환불·유료 구독·자동 발송 미구현. 반복 초안은 돈을 청구하지 않음 |
| 강의·학생 포털 | 과정/차시/등록/진도, 단일·복수·참거짓·단답·숫자 퀴즈, 배점/분류·응시 원본·서버 채점·수료증, 학생별 개인 접근 주소 | 학생의 독립 회원가입/유료 구매 접근은 미구현. 개인 주소 소지자가 접근 가능 |
| 커뮤니티 | 그룹/채널/회원 상태, 글/댓글/좋아요, 승인 대기·숨김·고정·자기 글 편집, 행사/정원/참석·운영자 취소/CSV | 외부 알림·유료 접근·원본 모든 커뮤니티 기능은 미구현 |
| 리포트 | 고객/기회/예약/청구/교육·퀴즈/수료 기록 필터·집계·조건 저장, 전체 CSV, 독립 HTML 인쇄본 | 브라우저에서 PDF로 저장. PDF 첨부 예약 발송·광고/소셜 성과 수집은 미구현 |
| 마케팅·대화·평판 | 캠페인 초안·동의/대상 필터·개인화·고정 준비 명단·CSV, 내부 대화함·메모·템플릿·담당/읽음/보관, 수기 리뷰·답변 초안 | 이메일/SMS/전화/소셜 게시·리뷰 플랫폼 수집/응답·실제 전달 성과 미구현 |
| 설정 재사용 | 파이프라인·폼·사이트·강의·자동화·답변 템플릿 선택 내보내기, JSON/파일 미리보기·검증·초안 추가, 참조 재매핑·멱등·저장 이력 | 파일 원본/실제 업무 자료/권한 제외. 중앙 배포·업데이트·롤백·SaaS 재판매는 미구현 |
| 팀·작업공간 | 이메일 확인된 계정 초대, 소유자/편집자/조회 전용, 작업공간 전환, 권한 해제/재허용·탈퇴·감사 이력, 업무·파일 RLS | 고객 외 모듈의 상세 필드·수정 규칙 및 Agency/SaaS 재판매·권한 복사는 미구현. 초대 이메일 자동 발송 안 함 |
| 파일·저장·인증 | 실제 파일 원본/Range·용량, SQLite 개발 서버, Supabase Auth/DB/private Storage 어댑터, 서버 CAS·중복 요청 방지·계정별 초안 | 실제 새 계정 메일/Storage 전체 E2E 및 기존 Sites 데이터·파일 이관 미수행 |
| Google·AI | Google Gmail/Calendar readonly OAuth·암호화 토큰·읽기 코드, AI 안내/계획 화면 | Google 실제 연결 미완료. AI 호출·에이전트 엔진은 미구현. 키만 연결해도 완료되는 상태가 아님 |

## 이번에 없던 기능을 보완한 부분

- 하루 전체/자원별 예약 상한, 고급 퀴즈·교육 리포트·인쇄 보고서, 반복 청구 초안 종료/횟수 정책.
- Cloudflare Workers + Supabase 독립 인증·저장·파일·Cron 경로와 공개 예약/학생/폼/사이트/청구서/수료증 포털.
- 임의 객체 간 관계 엔진과 회원별 운영 가능한 커뮤니티·행사.
- 6종 설정 스냅샷 내보내기/검증/초안 적용과 영속 적용 이력. 기존 자료 유지·새 ID 참조 매핑·동일 파일 중복 방지.
- 실제 계정의 팀 초대·역할·공유 작업공간. 역할은 편집 가능한 업무 JSON 밖의 서버 테이블에서 관리한다.

## 검증의 실제 범위

- GitHub 원격 코드 `72b80532067344cd60f72e99a5dde23c6d421000`을 별도 폴더에 새 clone하여 `npm ci`부터 구문·전체 시험·43개 SQL 쿼리 목록·standalone/프레임워크 빌드를 모두 재현했다. 작업본의 줄바꿈을 기존 `.gitattributes` LF 기준으로 맞춘 뒤 정적 자산 99개의 경로·크기·SHA-256도 모두 일치했다.
- 전체 자동 시험 261개 통과, 실패/생략 0. 구문 검사와 standalone Worker dry-run 빌드 통과. 영수증: receipts/completion-0.8.json.
- 실제 SQL 엔진(PGlite)에서 제품 마이그레이션·RLS·RPC·트랜잭션·CAS·동시 마지막 정원·토큰·역할·저장/재조회 검사. Supabase Auth/Storage 공급자 HTTP는 시험 대역이다.
- 브라우저: 공개 예약 접수→변경→취소, 객체 관계 생성/연결/역방향/새로고침, 커뮤니티 글→승인→댓글/좋아요→행사 신청/취소/새로고침, 팀 초대→조회 전용→편집→공유 저장→소유자 재조회→접근 해제, 설정 템플릿 다운로드→JSON 미리보기→저장→새로고침→중복 방지→복제 초안 확인. 격리된 합성 계정과 자료만 사용했다.
- 브라우저 검사에서 팀 역할 선택값이 busy 렌더 때 초기화되는 오류를 발견해 수정하고 회귀 시험을 추가했다. 화면 증거는 receipts/ui-0.8/에 있다.
- 실제 클라우드에 level_studio_core / level_studio_communities / level_studio_team SQL 적용. 팀 테이블 4개 RLS 및 authenticated/anon 직접 SELECT 불가, 팀 RPC anon 실행 불가·고정 search_path를 재조회했다.
- 제품 보안 advisory: 팀 테이블의 의도적인 RLS/no-policy INFO 4건. 직접 권한을 전부 철회하고 인증·소유자 검증 RPC만 사용한다. 해당 범위 WARN/ERROR는 없었다. 공유 Auth의 유출 비밀번호 보호 경고와 다른 제품 설정은 변경하지 않았다.
- 이 결과는 실제 공급자 전달/결제/메일·실제 새 도메인 E2E 성공이나 원본 전체 동등성의 증거가 아니다.

## 운영 전 사용자 결정/연결이 필요한 부분

1. 검토한 브랜치의 main 병합 및 **level.rigoonstudio.com** Workers 공개 배포 승인. 사용자 DOMAIN-POLICY.md가 별도 확인을 요구한다. 현재 Worker·도메인 미배포, 새 Cron 미가동이다.
2. Supabase 로그인 redirect에 새 callback 추가, 실제 소유자 계정 로그인/확인 메일/파일 시험. 공유 프로젝트의 다른 앱 Site URL·메일 설정을 덮어쓰지 않는다.
3. Google 전용 프로젝트는 한도 해결 후 새로 만드는 기존 선택을 유지. Gmail/Calendar OAuth 동의와 callback/scopes 설정이 필요하다. 읽기 이외 기능은 별도 코드가 남는다.
4. AI는 기존 키 재사용/전용 키 신규 생성 중 결정이 먼저다. 선택 후 실제 공급자·예산을 정해 서버 호출/에이전트 코드를 구현해야 한다. 비밀 키는 채팅/GitHub에 붙이지 않는다.
5. 실제 발송/전화·소셜·리뷰·결제 공급자 선택과 계정 설정이 필요하다. 별도 어댑터와 운영 검증이 남아 있다. 자체 발신 Webhook은 수신 주소, 소유자, 서명 비밀 등록 후 실제 수신처 검증이 필요하다.
6. 새 주소의 로그인·자료·권한 검증 후 기존 사이트 자료/원본 파일을 옮긴다. 기존 호스팅은 사용자가 직접 종료한다.

## 계정 연결만으로 해결되지 않는 추가 개발

외부 AI·발송·거래 어댑터, 원본 전체 편집기·설문 분기와 방문 이탈 분석, 모듈·담당·필드별 권한, SaaS 재판매·설정 중앙 배포·업데이트·롤백, 공유 작업공간 API 및 마켓플레이스, 광고·소셜 분석은 추가 개발 범위다. HighLevel 로그인 이후의 동작을 비교하려면 별도 계정이 필요하다.

## 회사 PC에서 이어서 진행

1. 저장소 clone 후 feat/complete-core-20261030 checkout. Node 24.22.1에서 npm ci.
2. npm run check → npm test → npm run db:check-catalog → npm run build:standalone → npm run build. dry-run이므로 공개 배포하지 않는다.
3. 실행/설정은 STANDALONE-0.8.md, 팀 계약은 TEAM-0.8.md, 설정 복제 계약은 SNAPSHOTS-0.8.md. 기존 npm start는 loopback SQLite 개발 계정이며 새 Auth와 동일하지 않다.
4. 비밀·로컬 데이터·파일·Git bundle·Node 런타임은 E:\RIGOON_STUDIO\레벨 스튜디오의 체크포인트에서 복원한다. 최신 manifest는 E 복원 목차에서 찾는다. Supabase 운영 자료/Storage 본문은 소스 체크포인트에 자동 포함되지 않는다.

기존 CORE-FEATURES-2026-10-30.md는 main 0.7.0 감사 기준으로 보존한다. 누적 구현 설명은 IMPLEMENTATION-0.8.md를 따른다.
