💬말로 만드는 AI▶ 유튜브
🗂️ 뒷이야기 · 03

03 SJ FLOW v2 ② — AI 게이트웨이와 AI 비서 1~3기: 직원이 설정 없이 AI 를 쓰게

이 페이지 목차목적만든 순서1 · AI 이전의 한 주 — 사고 셋과 규칙의 저장소 입성 (7/13 ~ 7/18)2 · 7월 19일 — 게이트웨이를 하루에 (10:45 ~ 16:19)3 · 7월 20일 — 회의 모듈과 아이콘 교체 사고4 · ITP 승인 — 같은 사고를 네 번 고쳤다 (7/21 ~ 7/25)5 · 7/22 ~ 7/26 — AI 의 공급원을 늘리다6 · 7월 26일 — AI 비서 1기, 아홉 단계7 · 7월 27일 — 2기와 3기, 하지 않을 것을 적었다8 · 7/26 ~ 7/29 — 문서 검색과 야간 백업, 처음 써 보니 깨졌다9 · 7월 30일 — 전면 점검 (A 17건 + B 5건)10 · 7/28 이후 — 굳은 규칙 (CLAUDE.md)💡 설명함정과 배운 것출처

뒷이야기 · 3 / 17단계 · 2026-07-13 ~ 07-31 · 갈래 SJ FLOW
이전 단계: 02 SJ FLOW v2 ① — 기반 공사 · 다음 단계: 04 옵시디언 '제2 두뇌'

핵심 요약

항목내용
이 단계에서 한 일직원이 AI 키를 따로 넣지 않고 쓰도록, 무료 AI 모델 여러 곳을 자동으로 갈아타는 게이트웨이(Cloudflare Worker)를 7/19 하루에 세웠다. 그 위에서 AI 비서를 1기(9단계)·2기·3기로 키웠고, 회의록 모듈·ITP 승인 체계·사내 문서 검색·전면 점검 22건도 같은 기간에 했다. 사고는 로그아웃·WBS 덮어쓰기·ITP 승인본 실종 등이었다.
기간2026-07-13 ~ 07-31 (19일)
규모커밋 245개(병합 0). AI 비서 코드 468줄(7/18) → 2,717줄(7/31). 게이트웨이 Worker 154줄(7/19) → 747줄(7/31), 자동 시험 19개(7/26) → 47개(7/31). AI 비서 행동 7개(7/19) → 16개(7/31). 호출 순서에 오르는 AI 9곳
다룬 도구Cloudflare Workers · Gemini · Groq · Cerebras · NVIDIA · OpenRouter · Mistral · 9Router · SSE 스트리밍 · Vectorize(문서 검색) · R2 · Lucide 아이콘
결과전: AI 비서는 각자 브라우저에 키를 넣어야 쓰는 도구(7/4) → 후: 설정 없이 쓰는 게이트웨이 + 자동 전환 + 행동 16개 + 사내 문서 검색. 단 야간 백업과 능동 알림은 7/31 에 코드만 있고 가동 전이었다
공개 범위사내(로그인 뒤) — 🔒 항목은 넣지 않음

한 줄 요약 — 키를 서버에 두고 모델을 줄줄이 갈아타게 한 하루가 AI 비서의 바닥이 됐다. 그러나 "코드 완료"와 "실제 가동"은 달랐다.

3단계 · SJ FLOW v2 ② — AI 게이트웨이와 AI 비서 1~3기

목적

2단계가 끝나자 데이터가 한곳에 모였다. 이제 그 데이터를 말로 묻고 싶었다. AI 비서 자체는 7/4 15:34 에 이미 있었다(1단계에서 뺐던 기능의 부활). 그때는 직원이 무료 AI 키를 발급받아 자기 브라우저에 넣어야 쓸 수 있었다. 사무직 전원이 키를 발급받는 길은 현실적이지 않았다. 이 단계의 질문은 "직원이 아무 설정 없이 AI 비서를 쓰게 하려면"이었다. 답은 서버에 회사 키를 두는 중간 서버(게이트웨이)였다. 게이트웨이와 AI 비서는 crazy4eu(cwkim83)가 이끌어 만들었고, 커밋 메시지 끝에 Claude 공동 작성자 표시가 붙은 것이 많다.

gateway failover · 크게 보기 ↗

만든 순서

1 · AI 이전의 한 주 — 사고 셋과 규칙의 저장소 입성 (7/13 ~ 7/18)

7/13~7/15 는 커밋이 5개뿐이었다(브리핑 자동 갱신 위주). 7/16 에 30개, 7/17 에 27개가 몰렸다. 이 주에 AI 보다 먼저 챙길 것이 있었다.

  • 7/16 — 품질 도구를 전 부서에 연다. 10:13~10:26 사이 커밋 네 개로 ITP·QA 조회, NCR·CAR·품질종합분석표, 측정기구 조회를 전 부서에 열었다. 발행·삭제는 품질관리부만이다. 같은 날 08:42 에 "로컬에 갇힌 과거 NCR·CAR"를 자동 복구하는 코드가 들어갔다. 2단계에서 본 이름 사고의 뒤처리다.
  • 7/17 — 갑자기 로그아웃. 11:37, 12:00, 13:10 세 번에 걸쳐 고쳤다. 진짜 원인은 마지막에 나왔다. 활동 시각이 탭마다 메모리에만 있어서, 쓰지 않는 백그라운드 탭이 혼자 "유휴 만료"라 판단해 로그아웃을 부르면 같은 사이트의 모든 탭이 같이 로그아웃됐다. 활동 시각을 공유 저장소에 5초 간격으로 남기고, 보이지 않는 탭은 로그아웃을 주도하지 못하게 했다. 유휴 기준도 10분에서 8시간으로 늘렸다.
  • 7/17 21:51 — WO 자동 등록이 기존 WBS 를 통째로 덮어썼다. 수주통보서에서 프로젝트를 자동 등록하는 코드가 "이미 등록했는지"를 브라우저 localStorage 로만 판단했다. 새 PC 에서 처음 열자 같은 프로젝트가 다시 등록되며 기존 WBS 를 시드 7행으로 덮었다. 등록 표시를 Firestore 문서로 옮겨 서버를 진실로 삼고, 기존 WBS 에 행이 있으면 절대 건드리지 않게 했다. 복구는 WBS 개정 이력 스냅샷에서 했다.
  • 7/18 05:35 — 보안 규칙이 저장소에 들어왔다. 규칙은 지금까지 Firebase 콘솔에서만 관리됐다. 코드와 규칙이 어긋나 저장이 조용히 실패한 사건("이력 0건 사건")이 있어서 firestore.rules 파일로 커밋하기 시작했다. 메시지가 규칙을 못 박는다. 새 컬렉션을 코드에 넣는 커밋은 이 파일도 함께 고쳐야 한다. 다만 자동 배포는 안 되고 콘솔에 붙여넣어 게시해야 한다.

2 · 7월 19일 — 게이트웨이를 하루에 (10:45 ~ 16:19)

7/19 하루 AI 비서·게이트웨이 파일을 고친 커밋이 8개 나왔다. 순서가 곧 설계 과정이다.

  1. 10:45(v29.38) 한 회사를 골라 쓰던 방식을 자동 전환으로 바꿨다. 한도 초과(429)·키 오류(401/403)·서버 오류·45초 초과면 다음 회사로 넘어간다. 한 회사 안에서도 모델이 사라졌으면 다음 모델을 시도한다. 무료 한도는 커밋 메시지 기준으로 Gemini 하루 1,500회, Groq 1,000회, OpenRouter 50회였다.
  2. 11:21(v29.39) 한 회사에 키를 여러 개 넣어 돌려 쓰게 했다. 한도가 키 수만큼 늘어난다. Cerebras 와 Mistral 을 더했다.
  3. 12:06(v29.41) 회사 게이트웨이(154줄 Worker)를 붙였다. 요청을 각 회사 API 로 대신 보내고, 서버에 보관한 키를 그 자리에서 넣는다. 허용 출처 목록, 미등록 회사는 501 로 돌려 다음 순위로 넘기기를 넣었다. NVIDIA 는 브라우저에서 직접 부를 수 없어(CORS 차단) 게이트웨이를 거칠 때만 쓴다.
  4. 12:32(v29.42) 게이트웨이 주소를 소스의 기본값으로 박았다. 전 직원이 설정 없이 쓰게 된 순간이다.
  5. 12:35(v29.42.1) 실서버를 전 회사 대상으로 점검하자 Cerebras 가 402(결제 필요)를, NVIDIA 가 401(키 불량)을 돌려줬다. 기존 코드는 429·401·403 만 "다음으로" 처리해서 402 한 번에 회사 하나가 통째로 막혔다. 402 도 넘기도록 고쳤다.
  6. 13:42 OpenRouter 무료 모델 목록을 실측으로 바꿨다. 16:19(v29.43) 누가 얼마나 쓰는지 보는 사용량 탭(임원 전용)을 더했다.

이날 호출 순서는 Gemini → Groq → Cerebras → NVIDIA → OpenRouter → Mistral, 유료 Claude 는 맨 끝이었다. 이날 첫 AI 커밋(10:45)에서 마지막(16:19)까지 5시간 34분이었다.

키 원칙. 회사 공용 키는 Worker 의 비밀 변수에만 두고 브라우저에는 내려보내지 않는다. 설치 안내서는 못을 박았다. 무료 키는 뚫려도 한도만 닳지만 유료 키는 돈이 나가므로, 로그인 검증을 붙이기 전에는 유료 키를 넣지 않는다. 7/30 판 Worker 는 무료 모델 경로를 허용 출처 목록(부를 수 있는 사이트 주소 목록)으로 지키고, 9Router·문서 검색·크론(정해진 시각에 도는 작업) 같은 사내 경로는 로그인 토큰(Firebase)을 확인했다. 무료 경로가 허용 출처 목록에만 기대던 것은 9/18 에 모든 모델 경로에 로그인 확인을 걸어 막았다.

3 · 7월 20일 — 회의 모듈과 아이콘 교체 사고

7/20 05:01 에 회의실 예약·회의록 모듈(meeting.html 728줄)이 올라왔다. 회의실 5개의 주간 예약표, 브라우저 음성 인식(한국어)으로 실시간 받아쓰기, 녹음, 그리고 받아쓴 글을 게이트웨이의 AI 로 안건별 초안(주체·기한·비고)으로 만드는 회의록이다. 사람이 고쳐 저장한다. 회의록 초안은 하루 전에 만든 게이트웨이를 그대로 썼다.

같은 날 10:19 에 v30 디자인(이모지를 Lucide 아이콘으로)이 시작됐다. 같은 커밋 메시지에 규칙도 적혀 있다. 회의 컬렉션 규칙을 콘솔에 게시하기 전까지 예약 저장이 안 된다. 10:36 에 모든 모듈의 이모지를 한꺼번에 바꾸는 커밋이 들어갔는데, 이모지를 따옴표 안의 JS 문자열에도 넣어 코드가 깨졌다. WBS 와 제작공정표가 그려지지 않았다. 34분 뒤인 11:10 에 직전 정상판으로 복원했다(19파일 962줄 추가 · 1,244줄 삭제). 안전한 부분만 다시 적용했고 모듈 안 이모지는 수작업으로 미뤘다.

4 · ITP 승인 — 같은 사고를 네 번 고쳤다 (7/21 ~ 7/25)

ITP(검사·시험 계획서)는 작성 → 결재 → 승인을 거친다. 7/21 에 승인 흐름이 한꺼번에 완성됐다. 08:15 결재선에 작성자 본인을 못 넣게 막았고(결재가 본인에게 갇힌 사고), 08:54 승인된 ITP 의 검사 항목을 제작공정관리(Traveller)에 자동 연동했다. 그리고 승인된 ITP 가 "ITP 조회"에서 반복해서 사라졌다. 원인이 서로 달라 수리가 네 번이었다.

시각원인고침
7/21 12:36빌더의 자동 저장이 문서를 통째로 덮어쓰며 승인 표시를 지웠다(열기만 해도 발생)저장 전에 기존 승인 표시를 읽어 보존
7/23 08:43빈 상태의 자동 저장이 클라우드의 ITP 를 지워 한 프로젝트 문서의 전 아이템이 사라졌다새 내용이 비었는데 클라우드에는 있으면 쓰기를 건너뜀
7/24 15:16화면을 연 직후 자동 저장이 클라우드 불러오기보다 먼저 돌아 낡은 로컬 값이 클라우드를 덮고, 승인본과 달라진 문서가 초안으로 강등됐다첫 불러오기가 끝나기 전에는 저장 전면 금지
7/25 23:43조회 화면이 "편집 중인" 문서의 승인 표시를 봐서, 누가 열어 편집만 해도 조회에서 사라졌다승인하는 순간 내용을 승인본(스냅샷) 컬렉션에 따로 저장하고 조회는 그것을 본다. 편집 중이면 "개정 작업 중" 배지만 붙인다
itp approval snapshot · 크게 보기 ↗

중간(7/21 12:54)에는 정책이 하나 들어갔다. 승인된 ITP 를 편집하면 결재중으로 되돌리고 재승인 때 Rev 번호를 올린다는 규칙이다. 이 정책이 위 세 번째·네 번째 증상을 만든 통로가 됐다. 첫 수리(7/21 12:36)에서 마지막 수리(7/25 23:43)까지 4일 11시간이 걸렸다. 마지막 수리가 근본이었다. 같은 문서 하나를 "편집 중" 상태와 "승인된" 상태가 함께 쓰던 구조를 둘로 나눴다.

7/24 의 세 번째 원인은 새 패턴이 아니었다. 7/20 15:05 에 WBS 가 같은 이유(로드가 끝나기 전의 자동 저장)로 빈 배열에 덮어써진 사고를 고쳤다. 커밋 메시지가 "WBS 와 동일 패턴"이라고 스스로 적는다. 2단계의 NCR 사라짐도 같은 가족이다. 낡은 사본이 서버 데이터를 덮는 사고였다.

5 · 7/22 ~ 7/26 — AI 의 공급원을 늘리다

  • 7/22 04:33 (v29.45) 내 PC 에서 도는 로컬 LLM(LM Studio·Ollama)을 0순위로 추가했다. 주소를 입력한 기기에서만 켜지고, 꺼져 있거나 실패하면 다음 순위로 넘어간다.
  • 7/23 08:37 제목은 ITP 드롭다운인 커밋에 게이트웨이 Worker 변경 83줄(로그인 토큰 확인이 처음 들어간 변경)과 AI 비서 변경 30줄이 같이 올라갔다. 제목만 보면 알 수 없는 변경이다.
  • 7/24 06:31 9Router(여러 AI 구독을 하나로 묶는 프록시) 연동을 강화했다. 입력한 모델 이름을 실제 ID 로 맞추고, 함수 호출을 지원하지 않는 모델이면 그 항목을 빼고 한 번 다시 시도하며, 실패하면 오류 본문을 채팅에 그대로 보여 준다. 13:08(v29.46.0) 답이 글자 단위로 흐르는 SSE 스트리밍을 넣었다.
  • 7/26 07:35 · 07:44 로컬 LLM·9Router 설정을 전 직원 공용으로 공유하고, Worker 를 v2(261줄)로 올려 터널(내 PC 를 바깥에서 부를 수 있게 열어 둔 통로) 주소가 바뀌어도 플랫폼에서 공유 설정만 고치면 되게 했다.

로드맵 문서는 9Router 의 한계를 미리 적어 뒀다. 구독 계정 터널을 공유하는 방식이라 세션 한도를 함께 쓰고, 터널을 연 PC 에 기대며, 약관 위험이 있다. 사용량이 늘면 정식 API 키가 장기 경로다. 7/31 소스의 호출 순서는 로컬 LLM → 9Router → Gemini → Groq → Cerebras → NVIDIA → OpenRouter → Mistral → Claude, 모두 9곳이다.

6 · 7월 26일 — AI 비서 1기, 아홉 단계

7/26 09:12 에 로드맵 문서를 올리고 1단계를 시작했다. 원칙은 한 세션에 한 단계씩, 각 단계는 따로 배포할 수 있게, 검증 기준을 통과해야 다음 단계로였다. 검증은 새로고침 → 로그인 → 실제 질문까지였다.

단계기능커밋 시각
1조회 범위 확대(NCR·CAR·측정기구·회의실·회의록·검사 실적)09:12
2화면 이동 "NCR 열어줘"10:50
3대화 기록 유지(새로고침해도 이어짐)10:55
4NCR·CAR 발행 연동(모듈을 열고 폼을 채워 둠)11:03
5브리핑 "오늘 뭐 해야 해?"22:06
6조건 필터(기간·프로젝트·상태·텍스트)22:08
7문서 출력("엑셀로 뽑아줘")22:12
8사내 문서 검색(RAG)22:16
9능동 알림(매일 9시 마감·지연 결재)22:20

코드는 하루에 아홉 단계까지 올라갔다. 다만 커밋 시각이 두 덩어리(09:12~11:03, 22:06~22:20)로 몰려 있어, 단계마다 검증하고 올렸다는 원칙과 어떻게 맞았는지는 시각만으로는 알 수 없다. 22:32 에는 실제 Worker 코드를 그대로 불러와 돌리는 자동 시험 19개가 들어갔다. 8단계(문서 검색)의 실사용 검증 통과는 7/29 08:29 에 기록됐고(로드맵 표의 완료일은 7/28), 9단계 알림은 7/31 문서에서 "서비스 계정 키 등록 대기"였다.

7 · 7월 27일 — 2기와 3기, 하지 않을 것을 적었다

2기 "대화하듯이": 10단계 마크다운·도구 사용 표시·답변 복사(05:27), 11단계 화면 문맥 인식 "이 프로젝트", "이번 주"(05:30). 12단계(에이전트 모드, 루프 확대)는 사용량 기록에서 5회 루프 한계가 얼마나 자주 걸리는지 본 뒤 정하기로 하고 보류했으며, 13단계(개인화 기억)는 12단계 없이는 의미 없다며 취소했다.

3기는 전 메뉴를 감사한 뒤 시작했다. 감사 결과는 완비 9개, 빈 곳 7개였다. 가치 있는 것만 더했다. 14단계 조회 사각지대(메시지·자산·ITP 문서 상태·점검 임시저장, 05:45), 15단계 목표·회의실 예약을 말로 등록(05:49), 16단계 "보고서 끝났어"로 업무 완료 확인 카드(05:51). 의도적으로 제외한 것은 넷이다. WBS 항목 자동 조작(사고 위험), 권한 변경(보안), 현장 스캔·점검(모바일 작업), ITP·QA 문서 생성(자체 AI 있음). 2기 첫 커밋에서 3기 마지막 커밋까지 24분이었다.

안 만들 것을 이유와 함께 적어 두면 같은 제안이 다시 나와도 근거를 바로 보여 줄 수 있다. 같은 날 18:25 에는 운영 잔손질(Claude 경로 답변 길이 4배 확대, 루프 한계 계측 추가)이 들어갔다. 그 계측이 12단계 보류의 판단 재료다. 7/31 소스의 등록된 행동은 16개다.

8 · 7/26 ~ 7/29 — 문서 검색과 야간 백업, 처음 써 보니 깨졌다

문서 검색(RAG). 7/26 22:16 에 Worker 가 문서를 쪼개 숫자로 바꾸고(Workers AI bge-m3, 1024차원) Vectorize(벡터 저장소)에 넣어, 질문과 가까운 대목 5개를 찾아 출처와 함께 답하게 했다. 등록은 지정한 관리자만 한다.

처음 쓰자 세 번 깨졌다. 브라우저가 로그인 토큰을 Worker 로 보내는 첫 기능이 이 문서 검색이었다.

  1. 7/28 06:24 — 사전 요청(preflight)의 허용 헤더에 Authorization 이 빠져 브라우저가 요청을 막았다(v3.2.1).
  2. 06:36 — 로그인 토큰 검증이 인증서 형식(x509)을 열쇠로 못 읽어 'Invalid SPKI input' 이 났다. 구글의 JWK 방식으로 바꿨다(v3.2.2). 메시지가 짚는다. 9Router 경로·크론 수동 실행·백업 실행까지 토큰 검증 전체가 이 수정으로 살아났다.
  3. 7/29 08:22 — 벡터 삭제가 호출당 100개 제한인데 500개를 한 번에 지우려다 실패했다. 100개씩 나눠 지웠다(v3.2.3).

여기서 보이는 것이 있다. 7/26 의 자동 시험 19개는 가짜 로그인 토큰을 만들어 검증 경로를 통과시켰다. 그런데 실제 구글 형식으로는 깨졌다. 7/28 에 시험 장치도 실제와 같은 JWK 방식으로 바꿨다. 시험이 실제와 같은 길을 가지 않으면 통과해도 소용없다. 시험은 19개에서 7/27 26개, 7/28 27개, 7/31 47개로 늘었다.

야간 백업. 7/27 18:29(워커 v3.2)에 Firestore 의 모든 컬렉션을 매일 R2(클라우드 파일 저장소)에 담고 30일 지난 것을 지우는 코드를 넣었다. 컬렉션을 자동으로 찾고, 300건씩 읽고, 큰 첨부 조각은 뺀다. 데이터에는 백업이 없다는 점이 동기였다(코드는 git 태그가 있다). 그러나 이 백업은 코드만 올라갔다. 7/28 과 7/31 의 wrangler.toml(Worker 설정 파일)에서 R2 연결은 주석 처리된 채였고(약관 동의 뒤 풀라고 안내), 서비스 계정 키가 없으면 "안전하게 건너뛴다"는 규칙이었다. 기억 노트는 이 R2 백업이 9/24 까지 한 번도 돈 적이 없다고 적는다. 7/31 이력 문서는 야간 백업을 "이미 갖춰진 것"에 넣었다. 코드 완료를 가동으로 읽은 것이다.

9 · 7월 30일 — 전면 점검 (A 17건 + B 5건)

계기는 세 가지였다. 콘솔 에러 다수, 로그인 느림, ITP·QA 조회 느림. 방법은 네 영역(부팅 성능·뷰어 성능·콘솔 에러·버그 사냥)을 병렬로 조사하고 모든 발견에 파일과 줄 번호를 붙이는 것이었다. PLATFORM-CHECKUP.md 가 결과다.

  • A 묶음 17건(즉시 수정, 7/30 08:57 · 09:06): 죽은 9Router 터널을 부르던 시간이 질문당 최악 165초라 5분 동안 건너뛰게 했다(A1). 조회 결과가 40건에서 잘리던 퇴보는 7/27 의 사각지대 해소(v29.59)가 낸 것이었다(A8). PDF 출력의 제목·열 이름을 이스케이프(특수 문자를 그냥 글자로 바꿔 넣기)하지 않아 조회 데이터를 거쳐 화면 스크립트가 끼어들 수 있었다(A9). 정상 스트리밍까지 끊던 45초 절대 타이머(A12). 입력 칸의 Enter 가 한글 조합 중에도 전송되던 것(A16). 은퇴한 Gemini 모델 정리(A7).
  • B 묶음 5건(09:32): 큰 캐시를 localStorage 에 저장하지 않고 쓰기를 합쳐, 저장 요청 6번이 실제 쓰기 1번이 되고 265KB 가 1KB 가 됐다(B1). 대화 기록 키를 로그인 사용자(uid) 기준으로 바꿔 공용 PC 에서 이전 대화가 새는 것을 막았다(B5).
  • C 묶음 3건은 구조 공사라 승인 대기. 그중 하나는 "로그인이 느린 1위 원인"(전 프로젝트 WBS 를 통째로 구독)이었다. D 3건은 무해 판정이다.
  • 점검 도중 사용자가 지적한 문제(B6)도 문서에 올랐다. 제작공정관리의 검사 사인이 본인 브라우저에만 저장돼 사람마다 공정률이 다르게 보일 수 있다. 해결 방식은 선택지로 남겼고 문서 시점에서는 미결이었다.

7/31 은 다음 단계의 씨앗 날이었다. AI 파일 첨부(11:53), 구축 이력 문서(13:21), 전사 로드맵 페이지(13:56), 그리고 옵시디언 '제2 두뇌' 반영과 지식 그래픽(15:14~)이다. 이 날 커밋은 22개였다. 4단계로 이어진다.

10 · 7/28 이후 — 굳은 규칙 (CLAUDE.md)

7/28 06:58 에 개발 규칙집 CLAUDE.md 가 올라갔다. 어느 컴퓨터에서 작업하든, 어느 AI 세션이 이어받든 같은 규칙으로 일하게 하려는 문서다. 규칙 대부분이 앞의 사고에서 나왔다.

  • Git: main 에 직접 push 하되 force push 는 금지. 복구는 백업 태그에서 파일을 꺼내 새 커밋으로(2단계 사고 ①).
  • 버전: AI 비서를 고치면 index.html 의 캐시버스터(파일 주소 뒤에 붙여 브라우저가 새 파일을 받게 하는 번호)를 같은 커밋에서 올린다. 모듈은 BUILD 번호를 올린다(배포했는데 안 바뀌는 사고).
  • localStorage 를 중복 방지 게이트로 쓰지 않는다(7/17 WO 사고).
  • 클래식 스크립트 최상위에서 Firebase 객체를 참조하지 않는다(v29.44 에서 부팅 전체가 죽은 장애).
  • WBS 항목을 AI·자동화가 직접 만지지 않는다.
  • firestore.rules 는 저장소와 콘솔을 동시에 바꾼다(어긋나면 조용한 쓰기 실패).
  • AI 는 직접 저장하지 않는다. 폼을 채워 주고 사람이 확인한다. 예외는 채팅 안 확인 카드(사람이 버튼을 누르는 방식)뿐이다.
  • 끝났다는 말은 푸시와 실제 질문 확인까지다. Worker 를 고치면 자동 시험 27개(그날 기준)를 통과해야 한다.

AI 직접 저장 금지 원칙은 규칙집보다 먼저 있었다. 7/4 첫 위젯 커밋이 이미 "직접 저장하지 않는다"고 적었고, 7/26 4단계도 "저장은 사람이 확인 버튼", 7/27 16단계도 확인 카드였다. 이력 문서가 이유를 적는다. 오탐이 데이터를 망치면 신뢰가 무너진다.

💡 설명

  • 게이트웨이(중간 서버): 브라우저와 AI 회사 사이에 서서 요청을 대신 보내고 회사 키를 넣어 주는 서버. 여기서는 Cloudflare Worker(서버를 따로 사지 않고 코드만 올려 돌리는 클라우드플레어의 작은 서버 프로그램).
  • 자동 전환(failover): 한 곳이 한도 초과·오류면 다음 곳으로 자동으로 넘기는 것.
  • 429 · 401 · 402 · 403 · 501: 한도 초과 · 키 오류 · 결제 필요 · 거부 · 준비 안 됨. 어느 번호가 와도 다음 순위로 넘어가게 했다.
  • CORS · preflight(사전 요청): 다른 주소로 요청을 보낼 때 브라우저가 먼저 허락을 묻는 규칙. 허용 헤더에 빠지면 요청이 막힌다.
  • SSE 스트리밍: 서버가 답을 글자 단위로 흘려 보내 화면에 바로 나오게 하는 방식.
  • 9Router: 여러 AI 구독을 하나의 주소로 묶는 프록시. 여기서는 구독 계정을 터널로 공유했다.
  • RAG(문서 검색 답변): 질문과 가까운 문서 대목을 먼저 찾아 그 근거로 답하게 하는 방식. 출처를 함께 보여 준다.
  • Vectorize · 임베딩: 글을 숫자 묶음으로 바꿔 두고 비슷한 것끼리 찾는 저장소.
  • R2: 클라우드플레어의 파일 저장소. 여기서는 백업 파일을 담으려 했다.
  • JWK: 로그인 토큰을 검증하는 공개 열쇠를 알려 주는 표준 형식.
  • 로드 전 저장 경쟁: 서버에서 데이터를 받기 전에 빈 화면이 먼저 저장해 실제 데이터를 덮는 사고.
  • 스냅샷(승인본): 승인하는 순간 내용을 따로 복사해 둔 사본. 이후 편집돼도 승인본은 그대로.

함정과 배운 것

  • "코드 완료"와 "실제 가동"을 따로 적는다. 야간 백업은 연결이 주석 상태, 알림은 키 대기 상태였는데 문서는 갖춰진 것으로 읽혔다.
  • 시험이 실제와 같은 길을 가야 통과가 의미 있다(가짜 토큰 형식).
  • 처음 쓰는 경로는 처음 쓸 때 터진다. 새 기능을 올리면 그 길을 실제 사용자 흐름으로 한 번 돌려 본다(CORS 헤더, 토큰 형식, 삭제 100개 제한).
  • 낡은 사본이 서버를 덮는 "로드 전 저장" 사고는 이름을 붙여 모든 화면에서 한꺼번에 찾는다. 이 단계에서만 WBS(7/20)·ITP(7/24)에서 나왔다.
  • 같은 증상이 반복되면 원인이 여럿이다. 증상 수리 대신 사본을 나누는 구조 수리(승인본 스냅샷)로 끝났다.
  • 한 커밋에 다른 일을 섞지 않는다. 제목이 ITP 드롭다운인 커밋에 게이트웨이 변경이 들어 있어 이력이 거짓말한다.
  • 무료 모델은 사라지고 한도는 변한다. 모델 목록은 실측으로 갱신하고, 오류 번호는 "이 회사 전체가 막힘"인지 "이 키만 문제"인지를 가른다(402 사건).
  • 유료 키는 로그인 검증 전에 서버에 넣지 않는다. 무료 키는 뚫려도 한도만 닳지만 유료 키는 돈이 나간다.
  • 새 기능이 낸 퇴보를 점검으로 잡는다(조회가 40건에서 잘리던 A8). 점검 문서에 파일과 줄 번호를 붙이면 고치는 쪽이 빠르다.
  • 규칙(보안 규칙)은 코드와 같은 저장소에 두고 같이 바꾼다. 콘솔에만 두면 조용한 저장 실패가 난다.

출처

  • 커밋: 608151d · d0453fd · ea503e8 · 366c523 · 47db3de · 3ba1965 · 21879f2 · e785a26 · 893a748 · 31a84e6 · abbb070 · e136e2d · 5f2a92b · cff69c1 · d4a5bd2 · 4b9c7c8 · e2d5e97 · 8566fa4 · 29679c8 · 5597838 · 88e3f51 · 81a1711 · 7b5fa65 · 1236247 · b0b0460 · 95427fa · 1119afe · 32b7c80 · 7b92fb9 · 23ccd68 · ed528ba · 6e55d9d · 06fa1c9 · 43b27de · 51edecb · 51a90ea · decd3f2 · 39197b7 · 6d48e7f · e44bba7 · efbaac5 · 9e0a579 · cd986f3 · 4ad5ed1 · 45dab42 · 4bd70af · 3dc3fa4 · 66e0a42 · 40e920c · b62172b · 77e51e2 · abf3c60 · f1c19bb · b3019e7 · 826369d · 5931da8 · e288945 · 5280c9d · a5fcac7 · 8064ede · e069876(9/18, 모든 모델 경로에 로그인 확인)
  • 문서: sejong-platform-v2 PROJECT-HISTORY.md WEEK 3~5 · PLATFORM-CHECKUP.md · CLAUDE.md · gateway/README.md · modules/ai-assistant/ROADMAP.md(8064ede 시점)
  • 기억 노트: sejong-platform-limits(야간 백업이 9/24 까지 돈 적 없음) · merge-push-trap · firestore-rules-publish

← 02 SJ FLOW v2 ① — 기반 공사 · 04 옵시디언 '제2 두뇌' →