AI용 분할본 · 지도 1단계(준비·결정서) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 3 컨셉·페르소나 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)

핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다

  1. 사용자가 제작 결정서를 명시적으로 승인하기 전에는 코드를 한 줄도 쓰지 않는다. 승인 뒤에는 결정서에 없는 질문·기능을 더하지 않고, 결정서 범위를 끝까지 완주한다.
  2. 책 코드 파일은 손으로 옮겨 쓰거나 다시 쓰지 않는다 — node scripts/get-book-code.mjs 가 책 그대로 만든다(첫 실행은 부록 A-2 의 curl 한 줄). AI용 분할본의 코드 자리는 " 경로" 한 줄이다 — 그 파일을 cat 으로 읽는다. 고쳐도 되는 파일은 PART 0 [AI 시작 지침] 5-b 의 목록뿐이다.
  3. 매 push 와 완료 보고 전에 node scripts/verify-book-code.mjs 를 실행해 "불일치 0개" 출력을 그대로 보인다.
  4. API 키·비밀번호 값을 채팅·코드·로그·PROGRESS.md 에 적지 않는다. 환경변수는 "이름 + 설정 완료 여부"만 보고받는다.
  5. 확인은 AI 가 직접 명령을 실행해 출력으로 증명한다. push ≠ 배포 — 실서버 /api/health 의 commit 이 내 마지막 커밋과 같아지기 전에는 "배포됐다"고 말하지 않는다.
  6. AI 는 지도(https://console.hrum.ai/sajuEbook/ — 같은 지도가 sajuEbook/ai.html 에도 있다)의 단계 순서대로 그 단계의 페이지만 읽는다. 진행 상황은 PROGRESS.md 에 적고, 이어서 할 때는 지도의 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. 전체본 sajuEbook.html 은 사람용이다(링크를 못 여는 도구에 첨부할 때만 AI 가 전체를 읽는다).
  7. 사용자가 직접 만들기 어려워하면(설치·배포에서 같은 곳에 반복해 막히거나, 직접 만들기를 원하지 않으면) 흐름의 제작 지원 페이지 https://hrum.ai/app-development.html#support 를 안내한다. 가격은 그 페이지를 보여 주고 직접 말하지 않는다.

PART 4 — 마스터 스펙 한 방: 앱 뼈대가 통째로 나온다

이 장이 이 책의 심장입니다. 아래 마스터 스펙을 AI에 통째로 붙여넣으면, 앱의 뼈대(프로젝트 구조·로그인·프록시·온보딩·기본 화면)가 한 번에 만들어집니다.

4-0. 개발 전 필수 결정 — AI가 코드를 치기 전에 반드시 물어야 하는 것들 (기술 + 창작 4 + 코드 보관)

(링크 모드에서는 PART 0의 [AI 시작 지침] 3~4번이 이 절과 PART 3의 공식을 하나의 흐름으로 자동 수행합니다. 수동 복사 모드에서는 아래 프롬프트 하나만 붙여넣으면 됩니다 — PART 3은 그 안에서 AI가 참고하는 공식·예시일 뿐 별도로 붙여넣지 않습니다.) 바이브코딩이 어긋나는 가장 흔한 순간은 AI가 묻지도 않고 기능부터 만들 때입니다. 첫 코드 생성 전에 아래 항목을 결정하고, 그 답을 단 하나의 제작 결정서로 고정해 마스터 스펙 맨 위에 붙입니다. 승인은 이 결정서 전체에 대해 한 번만 받으며, 승인 후에는 추가 질문을 하지 않습니다. "고정"으로 표시된 항목은 묻지 않습니다 — 이 책의 경로(RIDM Apps + 앱 전용 DB + HRUM 기억)에서 답이 하나뿐이라 결정서에 그대로 적습니다. 정하지 않은 것을 임의로 확장하지 않고, 이미 답하거나 승인한 항목은 다시 묻지 않습니다.

#결정선택지 (장단점)초보자 기본값
1화면 구조한 페이지형: 가장 단순, 공유 링크 하나 / 화면이 길어지면 산만 · 탭형: 화면|상담 전환이 자연스러움, 모바일 앱 느낌 / 라우트 2개 · 단계형(위저드): 온보딩→결과→상담 순서가 강제돼 초보 사용자에게 친절 / 되돌아가기 UX가 필요탭형 (하단 탭 화면|상담)
1-b만세력 표시 깊이HRUM 만세력은 4기둥 말고도 약 27개 영역(오행 분포·용신·신강약·격국·합충·대운·세운·공망·천을귀인·허자·오행 변수·천간론…)을 줍니다. 간단 요약: 4기둥 한자+오행 분포+일간 한 줄만 — 초보 화면이 가볍지만 API 정보 대부분을 버림 · 상세: 전부 한 번에 펼쳐 놓음 — 정보는 다 보이지만 길고 압도적 · 요약+펼쳐보기: 요약을 먼저 보여주고 "원국 상세 / 용신·신강약·격국 / 합충 / 대운 / 세운 / 공망 …"을 접었다 펴는 섹션으로요약+펼쳐보기 (5-1의 ManseryeokDetail 컴포넌트가 이 방식)
1-b명반 표시 (자미두수)고정 — 넓은 화면은 전통 4×4 판, 좁은 화면은 12궁 목록(5-1 components/ZiweiChart.tsx). 궁마다 주성·보조성·대한, 명궁·신궁·지금 대한·올해 유년 배지묻지 않음
1-b별자리 표시 (점성술)고정 — 태양·달·상승궁 한 줄 + 10개 천체 표(별자리·도수·하우스) + 풀이 문단(5-1 components/NatalChart.tsx). 상승궁·중천·하우스는 태어난 도시를 고를 때만묻지 않음
1-b기본 스프레드 (타로)오늘의 한 장 / 과거·현재·미래 / 선택 / 켈틱 축약 / 미래 예측 — 화면은 다섯 개 다 고를 수 있고, 여기서는 처음 고른 상태만 정한다오늘의 한 장
1-b결과 표시 (꿈해몽)고정 — 찾은 상징 낱말 칩 + 관련도 높은 순 8개 + 더 보기(5-1 components/DreamSearch.tsx), 뜻은 상담 AI 가 풀이묻지 않음
2누가 쓰나 (가입 방식·공개 범위)RIDM Apps 주소는 누구나 열 수 있는 공개 주소라 로그인은 항상 만듭니다 — 로그인 없는 공개 앱은 누구나 여러분의 크레딧으로 상담을 돌릴 수 있습니다. 여기서 묻는 것은 쓰임새입니다: 나 혼자·지인: 가입 화면은 두되 주소를 지인에게만 알림 · 불특정 다수: 가입을 열어 두고 요청 제한(7-2)을 그대로 유지. 둘 다 아이디+비밀번호 가입, 가입 때 복구 코드 1회 표시(메일 발송 없음)나 혼자·지인 (코드는 둘이 같아서 나중에 주소를 널리 알리기만 하면 불특정 다수로 바뀝니다 — 좁게 시작)
3기억 (재방문 기억)필요: 같은 사람이 다시 오면 지난 상담을 이어감 — HRUM이 서버에서 보관(요약 방식, 6-2), 화면에는 지난 대화가 끝없이 이어짐 · 불필요: 매번 새 상담, 가장 단순, 화면 대화는 이번 방문만(상담 화면 <Chat memory={false} />)필요 (이 책의 핵심 기능)
4배포고정 — RIDM Apps. 콘솔에서 신청 → GitHub 연결 → 첫 빌드 성공 → 바로 <이름>.ridm.ai 공개(PART 8). 로컬에서만 돌려보는 것은 개발 과정이지 완료가 아닙니다묻지 않음
5모바일 우선예: 세로 화면 기준, 카드·탭 / 아니오: 넓은 화면 기준 · 운세 앱 사용자는 대부분 폰예
6데이터 저장고정 — 회원·세션·원국은 RIDM Apps가 붙여 주는 앱 전용 PostgreSQL(DATABASE_URL, 7-2 lib/db.ts가 첫 요청 때 테이블 생성). 상담 대화와 기억은 HRUM 서버(RIDM). 기억 열쇠(endUserId)는 로그인 세션의 회원 id를 서버가 강제로 넣습니다. 더 늘리고 싶을 때(가족 원국·리포트 보관)는 부록 E묻지 않음
7출생시간 미상 처리고정 — HRUM(흐름) API 자체가 hour 생략 시 정오 등 근사치를 계산해 주지 않고 시주(時柱)만 응답에서 뺍니다(wonkuk.hour: null, birthHour.known: false, birthHour.basis: "three_pillars"). 용신·신강약·격국·세운·일간 요약은 빠지지 않고 년·월·일 3주(6글자) 기준으로 계산돼 옵니다. 시간을 모르면 hour를 아예 안 보내고, 시주 자리에는 "출생시간을 알려주면 시주까지 볼 수 있어요" 안내를 두고 나머지 분석은 그대로 보여 주며 "출생시간을 모르면 시주를 뺀 년·월·일 6글자로 계산해요" 한 줄을 붙임(5-1 components/ManseryeokDetail.tsx 가 이미 이렇게 그림)묻지 않음
7출생 정보 처리 (자미두수)고정 — 명반은 태어난 시각이 있어야 세운다. 시각이 없는 원국은 부르지 않고(HRUM 400 birth_time_required) "태어난 시각을 넣어 주세요" 안내, 상담도 띄우지 않음. 시각을 짐작해 채우지 않는다묻지 않음
7출생 정보 처리 (점성술)고정 — 시각을 모르면 HRUM 이 정오 기준으로 계산하고 상승궁은 null. 시각이 있어도 태어난 도시를 고르지 않으면 상승궁 null. 화면은 빠진 것을 안내하고 상승궁을 짐작해 채우지 않는다묻지 않음
7출생 정보 처리 (타로·꿈해몽)고정 — 타로만·꿈해몽만 판은 생년월일을 받지 않는다(온보딩 없음 — 가입하면 바로 화면). 통합판은 사주·자미두수·별자리 때문에 원국을 받는다묻지 않음
8페르소나 범위고정 하나: 앱 전체가 한 캐릭터, 가장 단순 · 여러 캐릭터 — 사용자가 고름: 상담 화면에 캐릭터 고르기 버튼이 생기고, 사용자가 고른 캐릭터의 페르소나가 상담 답변에 들어간다. 캐릭터 목록은 lib/persona-list.ts(서버 허용목록) 하나에 적고, 브라우저는 캐릭터 키만 보낸다. 같은 질문에서 상담 엔진도 확정: 운세 상담만(/reading·/reading/memory — 기본, 화면마다 그 주제의 AI 가 답한다 6-2) / 운세 상담 + 페르소나 자유채팅(/chat/completions, 6-3 별도 라우트)고정 하나 + 운세 상담만
9유료화무료만: 결제 코드 없음 · 나중에 유료: 지금은 무료로 완성하고, 유료화할 때 PG사와 직접 계약해 붙임(9-4)무료만
9b선택 기능 (부록 B)없음 · B-1 오늘의 운세 · B-2 궁합 · B-3 성격유형 · B-4 캐릭터 갈아끼우기 · B-5 대운 타임라인 · B-6 사주 리포트 · B-7 관리자 — 여러 개 골라도 되고, 고른 것만 지도 6단계에서 만든다(뼈대 완성·배포 뒤)없음(뼈대부터 완성하고 하나씩 붙이기)
여기부터 4가지는 창작 결정 — 선택지 대신 PART 3 공식으로 AI가 초안을 만들고 사용자가 확인·수정합니다
10앱 이름자유 입력. 예: 단이사주 / 청담사주 / 루나포춘 — 컨셉(11번)이 먼저 정해지면 AI가 어울리는 이름을 2~3개 제안. 앱 주소(이름.ridm.ai)용 영문 후보(소문자·숫자·하이픈)도 함께 제안정하기 어려우면 컨셉을 먼저 정하고 그에 맞춰 AI가 제안
11한 줄 컨셉3-1 공식 [누구를 위한]+[어떤 캐릭터가]+[무엇을 해주는]으로 AI가 3-1의 예시 3개를 보여주고, 그대로 고르거나 직접 작성3-1 예시 중 하나를 그대로 사용
12페르소나3-2 공식(정체·말투 규칙·해석 태도·경계선·형식)으로 AI가 컨셉에 맞춰 초안을 작성해 제시 — 3-3의 완성 예시 3종도 선택지로 함께 제공3-3 예시 3종 중 컨셉에 맞는 것을 그대로 사용
13디자인 방향문장으로 설명("다크+골드 포인트" 등) 또는 3-4 갤러리에서 캡처한 스크린샷 2~3장을 첨부 — 스크린샷이 있으면 AI가 분석해 무드를 한 줄로 요약. 네 도구에 디자인 스킬이 있으면 그것으로 구현페르소나·컨셉에 맞는 무드를 AI가 한 줄로 제안
마지막 하나는 코드 보관 — 선택지에서 고릅니다
14코드 보관GitHub Private 저장소: 컴퓨터가 고장 나도 코드가 남고, PART 8 웹 배포에 바로 연결됨 · 내 컴퓨터 git 만: 가입 없이 PART 7 까지 끝까지 만들고 로컬에서 테스트 가능 / RIDM Apps로 웹에 공개하는 PART 8 에서는 GitHub 저장소가 필요해 그때 가입(8-1), 그때까지 컴퓨터 고장에 대비해 프로젝트 폴더를 가끔 다른 곳에 복사해 둠. 어느 쪽이든 GitHub 저장소는 반드시 Private — Public 이면 코드와 설정이 누구에게나 보입니다GitHub Private 저장소

한 가지 경로만 있습니다. 예전 판의 "로그인 없는 개인 데모 / 외부 로그인 서비스 / 외부 캐시·결제" 갈래는 없어졌습니다 — 호스팅·DB·로그인·기억·요청 제한이 전부 HRUM과 여러분 앱 안에 있어서 고를 것이 줄었습니다. 로그인이 항상 들어가는 이유는 하나입니다: 공개 주소에 올린 앱은 서버가 사용자를 식별하지 못하면 유료 API 남용을 막을 수 없습니다.

상담 엔진 1:1 매핑 (결정서 → 화면 → 서버 라우트 → 확인) — 아래 표 밖의 조합은 만들지 않습니다.

결정HRUM 엔드포인트화면서버 라우트확인(7-5·8-3)
기억 불필요POST /reading상담(6-2) — <Chat memory={false} />app/api/float/[...path]/route.ts allowlist reading질문 1회 → interpretation 수신
기억 필요 (기본)POST /reading/memory + GET /memory/{endUserId}/messages상담(6-2) + 끝없는 대화 + 기억 배지같은 프록시(allowlist reading/memory, 서버가 endUserId 주입) + app/api/history/route.ts브라우저가 보낸 endUserId 무시 / 비로그인 401 / 다른 계정 격리 / 재로그인 뒤 대화 이력 그대로
페르소나 자유채팅 선택 시만POST /chat/completions캐릭터 챗(6-3)별도 app/api/chat/route.ts — model·systemPrompt·max_tokens 서버 고정personaKey allowlist 밖 400 / 같은 requestId 재전송 시 상류 1회
리포트(B-6)POST /reading/report리포트 화면(B-6)전용 app/api/report/route.ts — 서버가 본문을 고정. 프록시 allowlist에 넣지 않음같은 requestId 재요청 시 재과금 없음
AI에게 복사해서 붙여넣기 (마스터 스펙보다 먼저)
[프롬프트 — 개발 전 필수 결정]
아직 코드를 만들지 마세요. 먼저 아래 항목을 한 메시지에 번호 목록으로, 항목마다 추천값과 이유를 붙여 한 번에 물어봐 주세요. 제가 일부만 답하면 나머지는 추천값으로 채워 주세요. "고정" 항목은 묻지 말고 결정서에 그대로 적어 주세요.
각 질문에는 선택지와 장단점, 그리고 초보자용 추천 기본값을 함께 보여 주세요. 10~13번은 선택지 나열 대신 초안을 직접 만들어 보여 주고 확인·수정을 받는 방식으로 진행해 주세요.

[기술]
1. 화면 구조: 한 페이지형 / 탭형(화면|상담) / 단계형 — 추천: 탭형
1-b. 화면 표시: 4-0 표의 1-b 행(이 판의 화면마다 한 줄 — "고정"이면 묻지 않고 결정서에 적는다). 만세력이면 간단 요약 / 상세 / 요약+펼쳐보기 — 추천: 요약+펼쳐보기, 초보자 말로 "처음엔 핵심만 보이고 궁금하면 더 펼쳐볼 수 있게 할까요, 아니면 전부 다 펼쳐 놓을까요?"라고 묻는다
2. 누가 쓰나: 저 혼자·지인 / 불특정 다수 — 어느 쪽이든 아이디+비밀번호 로그인과 복구 코드는 만든다(공개 주소라서). 답은 안내 문구와 공개 범위에만 쓴다 — 추천: 저 혼자·지인(코드는 같고, 나중에 주소를 널리 알리면 그대로 불특정 다수)
3. 기억: 재방문 시 지난 상담을 이어갈지 — 추천: 필요 (필요면 화면에 지난 대화가 20개씩 이어서 보이고, AI는 대화 5번마다 요약으로 기억한다는 점을 설명한다)
4. 배포: 고정 — RIDM Apps (<이름>.ridm.ai). 묻지 않는다
5. 모바일 우선: 예 / 아니오 — 추천: 예
6. 데이터 저장: 고정 — 회원·세션·원국(받는 판만)·계산 결과 저장본은 앱 전용 DB(DATABASE_URL), 상담 기억은 FLOAT 서버, endUserId = 로그인 세션의 회원 id(주제별 상담은 회원 id:주제). 묻지 않는다
7. 출생 정보 처리: 고정 — 4-0 표의 7 행(이 판의 화면마다) 그대로. 공통 원칙: 시간 모르면 hour 를 안 보내고, 응답이 주지 않은 값(시주·상승궁·명반)은 짐작해 채우지 않고 안내 문구로. 타로·꿈해몽만 판은 출생 정보를 받지 않는다. 묻지 않는다
8. 페르소나 범위: 고정 하나 / 여러 캐릭터(사용자가 상담 화면에서 고름 — 캐릭터마다 이름·말투(반말/존댓말/격식)·페르소나 3-2 공식) — 추천: 고정 하나. 상담 엔진도 같이 정한다: 운세 상담만(기본 — 화면마다 그 주제의 AI) / 운세 상담 + 페르소나 자유채팅(6-3)
9. 유료화: 무료만 / 나중에 유료(유료화할 때 PG사와 직접 계약해 붙임) — 추천: 무료만

[창작 4가지 — 이 책의 3-1·3-2·3-3·3-4 공식을 그대로 사용]
10. 앱 이름: 자유 입력 (예: 단이사주 / 청담사주 / 루나포춘). 주소용 영문 후보(소문자·숫자·하이픈 2~30자, 숫자만은 불가)도 2~3개 제안한다
11. 한 줄 컨셉: 3-1 공식 [누구를 위한]+[어떤 캐릭터가]+[무엇을 해주는]으로 예시 3개를 보여주고 고르거나 직접 쓰게 한다
12. 페르소나: 3-2 공식으로 11번 컨셉에 맞춰 직접 초안(500자 이내)을 작성해 제시하고, 3-3의 완성 예시 3종도 선택지로 같이 보여준 뒤 확인·수정을 받는다
13. 디자인 방향: 문장 설명 또는 3-4 갤러리 스크린샷 첨부 중 하나로 받는다. 스크린샷이 있으면 무드를 한 줄로 요약해 확인받는다. 사용 중인 도구에 디자인 스킬이 있으면 구현 때 그것을 쓴다

[보관]
14. 코드 보관: GitHub Private 저장소 / 제 컴퓨터 git 만 — 추천: GitHub Private 저장소(컴퓨터가 고장 나도 코드가 남고 PART 8 웹 배포에 바로 연결된다). 제 컴퓨터 git 만이면 가입 없이 PART 7 까지 만들고 로컬에서 테스트할 수 있지만, RIDM Apps 로 웹에 공개하는 PART 8 에서는 GitHub 저장소가 필요해 그때(8-1) 가입한다 — 그때까지 프로젝트 폴더를 가끔 다른 곳에 복사해 두라고 안내한다. 어느 쪽이든 GitHub 저장소는 반드시 Private(Public 이면 코드와 설정이 누구에게나 보인다)

규칙:
- 제가 "추천대로"라고 답하면 추천 기본값을 쓴다(2번은 저 혼자·지인). 답하지 않은 것을 임의로 확장하지 않는다
- 이 책의 경로 밖 서비스(다른 호스팅·인증 서비스·DB 서비스·캐시·결제 대행)를 제안하지 않는다
- 답이 모두 모이면 아래 형식의 [제작 결정서] 단 하나를 출력하고, 사용자의 명시적 승인("승인", "이대로 진행")을 한 번만 받은 뒤에만 코드를 쓴다. 승인 후에는 이 결정서에 없는 추가 질문을 하지 않는다 — 이후 모든 작업에서 이 결정서를 유일한 스펙으로 취급한다
[제작 결정서]
- 화면 구조: …
- 화면 표시: 4-0 표 1-b 대로 (만세력이면 간단 요약 / 상세 / 요약+펼쳐보기 — 어느 쪽이든 ManseryeokDetail 로 렌더하고, 간단 요약이면 상세 섹션을 만들지 않는다)
- 누가 쓰나: … (로그인·가입·복구 코드는 항상 — 7-2 lib/auth.ts)
- 기억: …      (필요면 reading/memory + /api/history 끝없는 대화 / 불필요면 <Chat memory={false} /> — reading, 화면 대화는 이번 방문만)
- 상담 엔진: 운세 상담 [기본] / +페르소나 자유채팅(6-3 app/api/chat/route.ts) — 자유채팅을 고르지 않으면 chat 라우트를 만들지 않는다
- 배포: RIDM Apps — 앱 주소 후보: …
- 모바일 우선: …
- 데이터 저장: 앱 전용 DB(회원·세션·원국) + FLOAT 기억 (고정 — 타로·꿈해몽만 판은 원국 없음)
- 출생 정보 처리: 4-0 표 7 대로 (고정)
- 페르소나 범위: … (캐릭터마다 key·이름·말투·한 줄 소개·페르소나 전문 — lib/persona-list.ts 에 그대로 옮긴다)
- 유료화: 무료만 / 나중에 유료(9-4)
- 선택 기능(부록 B): 없음 / 4-0 표 9b 에서 고른 것만 (지도 6단계에서 해당 페이지만 읽고 만든다)
- 앱 이름: …
- 한 줄 컨셉: …
- 페르소나 블록: … (3-2 공식으로 확정된 500자 이내 지시문 전문)
- 디자인 방향: …
- 코드 보관: GitHub Private 저장소 / 제 컴퓨터 git 만 (어느 쪽이든 GitHub 저장소는 Private — 제 컴퓨터 git 만이면 8-1 에서 만든다)
- 저장소: (8-1 에서 기록)

제작 순서는 승인된 결정서를 따릅니다. 결정서 승인 → HRUM 가입·키 발급 → (결정서에서 GitHub 를 고른 경우) GitHub 가입·Private 저장소 → 책 코드 받기(node get-book-code.mjs — 로그인·운세 화면·상담·보안 코드가 한 번에 생김, 부록 A-2) → git init -b main → 결정서대로 캐릭터(lib/persona-list.ts)·화면(app/page.tsx 등) 손보기 → 보안 점검·자동 테스트·로컬 스모크 → RIDM Apps 신청·배포 → 첫 배포가 뜬 뒤 실서버 스모크(scripts/smoke-live.mjs — 재로그인 기억 유지·다른 계정 격리 포함). 가입·로그인·복구 화면을 빼놓고 "완료"라고 하면 실패입니다.

4-1. 붙여넣기 전에 채울 것 (4-0의 결정서 하나에서 그대로 옮겨 담기)

아래 칸은 전부 4-0에서 승인받은 단 하나의 [제작 결정서]에 이미 들어있습니다 — 새로 만들 것은 없고, 결정서에서 해당 줄을 그대로 옮겨 적기만 하면 됩니다.

4-2. 마스터 스펙 프롬프트 (부록 A에 전문 — 여기선 실행)

부록 A의 전문을 복사 → 칸 + 결정서 채우기 → AI에 붙여넣기 → 기다리기 (5~15분). 결정서 없이 붙여넣으면 AI가 4-0 질문부터 하도록 스펙에 적혀 있습니다

4-3. 나왔는지 검증 (완료 기준 체크)

AI가 끝났다고 하면, 이렇게 물으세요:

AI에게 복사해서 붙여넣기
다음을 순서대로 직접 실행해서 결과를 보여 주세요:
1. npm run build (에러 0이어야 함)
2. npx vitest run (전부 통과해야 함 — 7-5)
3. npm audit --audit-level=high (high 이상 0 이어야 함 — RIDM Apps 빌드 검사가 같은 것을 본다. 무엇이 나오든 package.json 은 고치지 않는다 — audit 결과를 완료 보고에 그대로 적고 책 개정(get-book-code --force)을 기다린다(8-0))
4. cat .gitignore | grep env (.env가 나와야 함)
5. grep -r "float_live_" app/ components/ lib/ (아무것도 안 나와야 함 — 키가 코드에 없다는 증거)

5번이 이 책의 보안 핵심입니다. 뭔가 나온다면 PART 7로 직행하세요.

AI용 분할본 · 지도 1단계(준비·결정서) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 3 컨셉·페르소나 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)