# 변경 기록

## 2026-10-09 — Studio 3 프롬프트 미리보기 갱신 오류 수정
- 프롬프트 미리보기에서 선택 그림체 변수를 선언하지 않아 갱신 도중 오류가 나던 문제를 수정했습니다. 이 때문에 새 Studio 3의 큰 프롬프트 칸이 비어 있고, 규격 배지도 8컷 기본값으로 남을 수 있었습니다.
- AI 기획 완료 후 미리보기를 다시 생성해 15컷 프롬프트와 1536×2560·3×5·512px 배지가 나타납니다. 복사 토스트도 Studio 버전에 따라 8컷/15컷을 표시합니다.
- `node --check site/cgame2.js` 통과. Preview `https://60154cb6.aichat34-hr-pe-kr.pages.dev` (`codex-studio3-prompt-preview`), production `https://592ee80b.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`)에서 자산 응답을 확인했습니다. AI 유료 생성 호출은 하지 않았습니다.


## 2026-10-09 — 복구 초안 비용 정책과 Studio 3 6+9컷/그림체
- 유효하지 않은 AI 기획 응답 원문을 계정에 복구 초안으로 저장했으면 생성 비용을 반영해 크레딧 차감을 유지합니다. 저장을 확인하지 못한 경우에만 기존 환불 경로를 사용합니다. 화면에는 실제 환불 여부를 표시하고, 저장된 원문을 직접 고쳐 쓰도록 안내합니다.
- Studio 3 이미지 시트를 표정 6컷(기본·미소·수줍음·눈물·놀람·화남)과 서로 다른 대표 장면 9컷으로 변경했습니다. 1536×2560, 3×5, 칸당 512×512 좌표를 유지하고 프롬프트·컷 자르기·게임 저장·대화 참조·앨범 해금 기준을 6+9로 맞췄습니다. 화남 태그와 미리보기도 추가했습니다.
- AI 기획에 선택형 시네마틱 포토툰, 한국 웹툰, 애니메이션, 픽셀, 고전 유화, 수채화 그림체를 넣었습니다. 선택값은 기획 결과·이미지 키워드 프롬프트·복구 초안에 반영되며, 선택하지 않으면 작품에 어울리는 스타일을 AI가 선택합니다.
- 검증: Worker 및 프론트엔드 JS `node --check`, Wrangler Worker dry-run 통과. Preview `https://8072ad18.aichat34-hr-pe-kr.pages.dev` (`codex-studio3-six-expression`) HTML/JS/CSS 200. Worker release `68b48d4b-ab42-4536-a9c9-57db31e14a5e`. 유료 AI 호출은 실행하지 않았습니다.


## 2026-10-08 — 실패한 AI 기획 응답 복구 저장
- OpenRouter 응답은 받았지만 기획 필수 형식 검증에 실패하면 원문을 계정별 `복구할 기획 응답` 초안으로 저장하고, 화면과 `내 기획 불러오기` 목록에서 다시 확인할 수 있습니다. 원문은 텍스트로만 표시하고 복사할 수 있습니다.
- 정상 임시저장을 덮어쓰지 않으며 본인 계정 소유권을 유지합니다. 공급자 응답이 없는 장애에는 저장할 원문이 없습니다. 기존 사용자 크레딧 환불은 유지되며, 공급자 원가는 이미 발생했을 수 있습니다. 별도 AI 재호출은 하지 않습니다.
- JS 구문 검사, Worker dry-run, 원격 D1 읽기 쿼리 통과. Preview `https://10ce5f84.aichat34-hr-pe-kr.pages.dev`, Pages production `https://hr.pe.kr/aichat34/`, Worker `ab580865-bac2-462b-8159-6ac27541091b`. 운영 자산 200, API 비로그인 JSON 401을 확인했습니다. 유료 AI 호출은 하지 않았습니다.

## 2026-10-08 — 재입장 시 추천답변 복원
- 대화 기록만 복원되고 마지막 추천답변은 현재 단계의 샘플로 바뀌던 문제를 수정했습니다. 화면에 표시한 추천 3개를 게임·캐릭터별 localStorage에 저장하고, 재입장할 때 저장값을 먼저 사용합니다.
- 새 AI 응답이나 새 대화가 추천답변을 만들면 해당 값으로 자동 갱신됩니다. 서버 요청·크레딧 로직은 변경하지 않았습니다.

## 2026-10-08 — UI 3 추천답변 중앙 정렬
- UI 3에서 추천답변 바가 화면 왼쪽 끝에 붙던 문제를 수정했습니다. 입력창과 같은 920px 기준으로 좌우 여백을 계산해 중앙 대화 영역에 맞추고, 좁은 화면에서는 기존 가로 스크롤을 유지합니다.
- CSS만 변경했으며 AI 요청·크레딧·추천 생성 로직은 건드리지 않았습니다. Preview `https://72ec3170.aichat34-hr-pe-kr.pages.dev`, Pages production `https://8a0e4ac8.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`)에서 HTML/CSS 200과 중앙 정렬 규칙을 확인했습니다.

## 2026-10-08 — 수학 학습 토글을 수학 교사 게임으로 한정
- 이전에는 제목·시놉시스·페르소나에 수학 용어가 한 번이라도 있으면 토글이 표시될 수 있었습니다. 이제 공식 수학 선생 정서연과, 수학 선생/교사/튜터/강사/교수/멘토 역할이 명시된 커스텀 게임에서만 표시합니다.
- 정서연 대화에도 수학 학습 ON/OFF와 유료 그래프·도형 옵션을 연결했습니다. 설정은 정서연과 게임별로 따로 저장하고 기본값은 OFF입니다. Worker도 캐릭터/게임 역할을 재확인해 다른 캐릭터의 요청에 학습/그래프 지침이나 추가 차감을 적용하지 않습니다.
- `app.js`, Worker 구문 검사 통과. Preview `https://a7108c5e.aichat34-hr-pe-kr.pages.dev`, Pages production `https://c7106923.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`), Worker `8c7a3369-1e1c-4313-a59d-c21781b8d6bc`. 운영 HTML/버전 app.js 200, 비로그인 plan API JSON 401을 확인했습니다. 유료 AI 호출은 하지 않았습니다.

## 2026-10-08 — UI 3 기본값과 대화 표정 이미지 확대
- 첨부 화면은 UI 3(밝은 전체 화면)이지만 표정 카드 CSS가 너비 190px로 제한되어 작게 보였습니다. 데스크톱 최대 420px, 모바일 화면 너비의 82%(최대 360px)로 반응형 확대하고 원본 비율을 유지하도록 했습니다.
- UI 3은 신규/기본 설정에서만 기본이던 상태라 이미 UI 1/2를 저장한 방문자에게는 적용되지 않았습니다. 새 버전에서 한 차례 UI 3 기본값으로 마이그레이션하며, 사용자는 상세 메뉴에서 UI 1/2를 다시 고를 수 있습니다.
- `app.js` 구문 검사 통과. Preview `https://d2f02f78.aichat34-hr-pe-kr.pages.dev`; Pages production `https://e3b728e4.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`). Production HTML, `index.css?v=34.19`, `app.js?v=34.33` HTTP 200과 신규 CSS/UI 마이그레이션 값을 확인했습니다. 앱 코드는 모두 UI 3 기본 업데이트에 포함됩니다.

## 2026-10-08 — AI 기획의 플레이어 이름 임의 생성 방지
- AI 1초 기획에 선택형 `플레이어 호칭` 입력을 추가했습니다. 비워두면 AI가 플레이어의 이름·성·별칭을 만들지 않고 이름 호칭을 생략합니다. 사이트 닉네임이나 Google 계정 이름은 불러오지 않습니다. 입력한 호칭은 그대로, 드물게 사용하며 자동으로 씨/님을 붙이지 않습니다.
- 기획 요청과 저장 초안에 해당 값을 포함하고, Worker가 입력을 정리한 뒤 생성된 페르소나에 같은 호칭 규칙을 덧붙입니다. 이전에 저장된 기획은 불러온 뒤 새 규칙이 자동으로 소급 적용되지는 않습니다.
- `site/cgame2.js`, `worker/aichat34-api.js` 구문 검사 통과. Preview `https://70f6003e.aichat34-hr-pe-kr.pages.dev`, Pages production `https://728b7b70.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`), Worker `9d8ddee1-6f79-48a4-90e2-079ec9dfd3d0`. 운영 HTML/버전 지정 JS는 200, 기획 임시저장 API는 비로그인 요청에 JSON 401을 반환해 인증이 적용된 것을 확인했습니다. 비용이 드는 AI 기획 호출은 하지 않았습니다.

## 2026-10-08 — Studio 3 시트 크기 유연화
- 15컷 시트 업로드가 1536×2560보다 작은 이미지(예: 약 972×1616)도 3:5 비율이면 처리하도록 해, 생성·다운로드 과정에서 축소된 이미지가 거부되던 문제를 해결했습니다. 최소 입력 크기는 768×1280px로 두어 각 칸의 원본 해상도를 확보합니다.
- 각 셀을 512×512로 정규화하고 가장자리 1.2%를 안쪽으로 잘라 이미지 생성 결과에 포함된 흰 칸막이가 잘린 이미지에 남는 현상을 줄였습니다. Studio 2의 기존 8컷 분할 동작은 바꾸지 않았습니다.
- 첨부된 실패 이미지의 실제 크기(972×1619px, 비율 0.6004)가 기존 최소 크기 조건에만 걸렸고, 새 3:5/768×1280px 기준을 통과하는 것을 확인했습니다. JS 구문 검사와 Preview `https://370fb068.aichat34-hr-pe-kr.pages.dev` 및 운영 `https://hr.pe.kr/aichat34/`의 HTML/버전 스크립트 HTTP 200을 확인했습니다. Pages production `https://28599466.aichat34-hr-pe-kr.pages.dev`; 사이트 스크립트 `cgame2.js?v=2.34-49`. 실제 업로드 후 저장까지는 실행하지 않았습니다.

## 2026-10-08 — AI 기획 장르 표시 및 원가/차감 최적화
- AI 기획 체크박스를 `기획에 반영할 선호 장르`로, 저장되는 카테고리 값을 `게임 목록 대표 장르`로 구분했습니다. 기획 완료와 저장 초안 불러오기 후 AI가 고른 대표 장르도 표시합니다. 비어 있는 선호 장르는 계속 AI가 자동 선택합니다.
- AI 기획 사용자 차감을 56C→46C로 낮췄습니다. 클라이언트 잔액 확인, 안내 버튼, A34 Worker 차감을 일치시켰습니다.
- AI 기획 최대 출력은 4,000→3,200 토큰으로 20% 축소했습니다. persona 목표 분량은 900~1,500자로 설정하고, 갈래별 구체적인 사건·원인·장애물·이정표는 유지하도록 압축했습니다. 20%는 출력 토큰 상한의 최대 절감 가능 폭이며, 실제 평균 원가 절감률과 같지는 않습니다. 모델과 provider 단가 상한은 변경하지 않았습니다.
- 검증: `site/cgame2.js`, `worker/aichat34-api.js` 구문 검사와 Preview UI 확인. 원격 D1의 10/6~10/7 기획 3건은 총 $0.017785, 평균 $0.005928/건(입력 평균 1,214·출력 2,226토큰). Preview `https://81ca4275.aichat34-hr-pe-kr.pages.dev` (`codex-ai-plan-genre-cost-46c`), 운영 Pages `https://0069085c.aichat34-hr-pe-kr.pages.dev` / `https://hr.pe.kr/aichat34/`, Worker `3a0d4a75-17b2-42b2-8af8-690e9a2812c4`. 운영 HTML/JS와 목록 JSON API 200을 확인했습니다. 실제 AI 호출은 하지 않았습니다.

## 2026-10-07 — 커스텀 게임 스튜디오 3: 15컷 세로 시트
- Studio 2 옆에 별도 Studio 3 버튼을 추가했습니다. 기존 Studio 2의 8컷 흐름은 유지됩니다.
- Studio 3은 1536×2560px, 3열×5행, 컷당 512×512px를 지정합니다. 번호 순서 첫 5칸은 기본·미소·수줍음·눈물·놀람 표정이며, 나머지 10칸은 서로 다른 대표 장면입니다. 첫 5컷이 3열 그리드의 둘째 행까지 이어지는 점을 프롬프트에 명시하고 각 칸별 픽셀 좌표를 제공합니다.
- 세로 시트를 올리면 브라우저가 표정 5장과 장면 10장으로 나눕니다. 새 이미지 생성이나 AI 호출은 없습니다. 장면은 1, 4, 7, 10, 13, 16, 19, 22, 25, 28화에 순서대로 해금되며, 10화짜리 이야기로 착각하지 않도록 안내합니다.
- A34 Worker는 Studio 3의 10개 장면 캡션/참고 이미지를 처리하고, 게임 저장 JSON은 1,750,000바이트에서 제한합니다. 초과 시 저장을 거절해 D1 크기 제한 오류를 방지합니다.
- 검증: 프런트엔드/Worker JS 구문 검사 통과. Preview `https://4f523cd1.aichat34-hr-pe-kr.pages.dev` (`codex-studio3-15cut`)에서 Studio 3 모달, 프롬프트의 15개 좌표/5+10 분류, 15컷 업로드 라벨과 장면 설명을 확인했습니다. Preview alias `https://codex-studio3-15cut.aichat34-hr-pe-kr.pages.dev`; production Pages `https://4e7bff23.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`); Worker `3687163f-d038-43aa-bc75-9d375d230e07`. 실제 이미지 분할 업로드와 유료 AI 호출은 실행하지 않았습니다.

## 2026-10-07 — UI2·UI3 답변별 표정 일러스트
- UI1에서만 큰 캐릭터 그림을 답변마다 보여주던 차이를 고쳤습니다. UI2는 답변 옆에, UI3는 답변 위에 해당 응답의 표정 이미지와 이름표를 보여줍니다. 이미지 클릭 시 기존 확대 보기를 엽니다.
- 새 AI 호출이나 별도 이미지 생성은 없고, 응답 기록에 저장된 표정 키에 대응하는 기존 이미지 파일을 사용합니다.
- `app.js`, `cgame2.js` 구문 검사 통과. 내장 지아 게임의 낡은 표정 이미지 4개도 카드 UI가 섞인 작은 썸네일에서 380×460 세로 일러스트로 교체했습니다. Preview `https://821b019a.aichat34-hr-pe-kr.pages.dev`; production Pages deployment `https://0b010742.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`). 운영 도메인에서 HTML, 버전 지정 JS/CSS, 지아 표정 PNG 4개가 모두 HTTP 200으로 응답하는 것을 확인했습니다. 실제 유료 AI 응답은 호출하지 않았습니다.

## 2026-10-07 — 수학 그래프·도형 옵션 및 대화 UI 3
- 수학 학습 중 선택적으로 그래프/도형을 요청하도록 추가했습니다. 추가 비용은 +5C이며 단일 기존 호출에서 생성합니다. 실제 AI 출력에 안전한 제한 JSON 그래프 블록이 없으면 답변은 유지하고 추가 5C만 돌려줍니다.
- 수학 옵션이 켜져도 일반 커스텀게임 출력 800토큰, 장문 2,000토큰과 모델별 가격 상한은 그대로입니다. SVG는 브라우저가 검증한 좌표만 그립니다.
- 밝은 전체 화면 UI3를 기본으로 하고, 뒤로가기와 접이식 상세 메뉴를 추가했습니다. UI1/2를 유지하고 모바일에서도 UI를 전환할 수 있습니다.
- 구문 검사 통과. Preview `https://4ea3cdda.aichat34-hr-pe-kr.pages.dev`, Pages 운영 `https://hr.pe.kr/aichat34/`, Worker `1b6bdec7-c407-4d37-9e82-5bd42db808e1`. HTML/JS/CSS 응답 200 확인. 실제 유료 모델 호출은 하지 않았습니다.

## 2026-10-06 — 선택형 수학 학습 모드
- 수학 모드에서 LaTeX 구분자가 그대로 표시되지 않도록 했습니다. 저장된 예전 답변의 `$t_0$`도 다시 표시할 때 `t₀`로 읽기 쉽게 바꿉니다.
- 수학 관련 커스텀 게임에만 채팅창 토글을 추가했습니다. OFF가 기본이며 상태는 브라우저 로컬에 게임별로 보존합니다.
- ON이면 캐릭터/로맨스 전개를 유지하며 비유에 그치지 않는 수식·계산 단계·짧은 개념 설명과 한 단계 연습을 생성하도록 A34 Worker 지침을 추가했습니다.
- 추천 선택지는 직접 풀기, 힌트 요청, 이야기 상황에 적용하기로 서로 다른 학습 경로를 제공하도록 했습니다. 사용자가 순수한 로맨스를 요청하면 해당 턴의 학습은 쉬도록 했습니다.
- 모델 선택, 크레딧 요금표, 출력 토큰 상한은 바꾸지 않았습니다. 추가 입력 지침만 있어 ON 요청에서 토큰 원가가 조금 늘 수 있습니다.
- 구문 검사: `app.js`, `cgame2.js`, A34 Worker 통과. 실제 모델 호출은 비용 발생을 피하기 위해 실행하지 않았습니다.
- Preview `https://9c56eb1f.aichat34-hr-pe-kr.pages.dev` (`codex-math-study`); Pages production `https://hr.pe.kr/aichat34/`; Worker `1d5d11c7-6655-4f9d-90b5-075832292f48`. 운영 페이지 자산과 카탈로그 JSON을 확인했습니다.

## 2026-10-06 — 수학 답변의 LaTeX 원문 노출 수정
- 과거 저장된 수식 표기도 `t₀`, `x²`처럼 읽히도록 채팅 표시 변환을 추가하고, HTML escape를 적용했습니다.
- 수학 모드 지침이 LaTeX 코드 대신 일반 수식 문자를 내보내도록 보강했습니다.
- Worker release `1d5d11c7-6655-4f9d-90b5-075832292f48`.

## 2026-10-06 — 채팅 요청 크기·중복 전송 근본 개선 및 비용 조사
- 커스텀 게임 전체 객체 대신 채팅에 필요한 텍스트/관계 수치/장면 캡션만 전송해 이미지 Base64가 128KB 요청 제한을 넘기지 않게 했습니다. 최근 대화는 기존 서버 예산(입력·게임 설정을 뺀 18,000자 이내)에 맞추고, 현재 입력은 별도 메시지로만 한 번 전달합니다. 답변 길이/토큰 한도는 바꾸지 않았습니다.
- 응답이 타이핑되는 동안 전송 잠금을 유지해 추천답변을 연속 클릭해 중복 요청하거나 응답 전에 다음 턴을 보내는 것을 막습니다.
- OpenRouter 계정 총 사용액 `$3.684961643`, 구매 `$5`, 잔액 약 `$1.315038357`; 확인된 현재 키 사용액 `$0.0585775`입니다. A34 비용표에는 10월 6일 AI 기획 1건 `$0.0072846`만 기록되어 있습니다. 이번 `요청이 너무 큽니다` 오류는 Worker가 크레딧 차감 및 모델 호출 전에 413으로 거부하는 경로입니다.
- 과거 일자/모델/엔드포인트별 활동은 현재 키의 Activity API가 403이라 확인할 수 없고, 계정 총액만으로 이미지 생성이나 해킹 여부를 단정할 수 없습니다. A34 Worker에서 직접 OpenRouter 이미지 생성 API를 부르는 경로는 발견되지 않았습니다.
- Preview `https://7f3372fe.aichat34-hr-pe-kr.pages.dev`; Worker `4139be26-4012-49a4-8476-822124bd122c`; Pages production `https://d3a99804.aichat34-hr-pe-kr.pages.dev`.

## 2026-10-06 — 회차별 장면 해금과 AI 기획 대기 안내
- 카드 표정 미리보기는 바로 보여주고 대표 장면은 제1·4·8·14화 진행도에 맞춰 순서대로 해금합니다. 잠긴 슬롯은 다음 해금 회차만 표시하며, 진행도가 오르면 카드 미리보기를 갱신합니다.
- AI 기획 중에는 실제 대기 시간을 초 단위로 보여주고, 30초가 지나면 응답 지연 안내로 바뀝니다. 완료되면 입력란이 채워지는 점을 안내하며 임의 진행률은 표시하지 않습니다.
- 미리보기 API에 `stage`를 전달하고, 잠긴 장면의 이미지/라벨은 API 응답에서도 제외합니다. 진행도는 기존처럼 해당 브라우저 저장값을 사용합니다.
- OpenRouter 비용 참고: 2026-10-06 UTC 현재 일일 사용량 `$0.0238942`; 날짜별 Activity API는 현재 키 권한으로 403이라 10월 5일 합계는 확인하지 못했습니다.
- 검증: JS 구문 검사 및 Worker dry-run 통과. Worker `4139be26-4012-49a4-8476-822124bd122c`; Preview `https://5206403e.aichat34-hr-pe-kr.pages.dev` (`codex-unlock-wait-guidance`). 운영 API의 1·4·8·14단계에서 해금 수 1·2·3·4, 잠긴 슬롯의 이미지/이름 미노출 확인.

## 2026-10-06 — 카드 일러스트 미리보기 복원
- 카드가 화면 가까이 오면 별도 API로 표정/장면 최대 3장을 불러오고, 썸네일 클릭 시 라이트박스로 크게 봅니다. 첫 목록 응답은 395,309 bytes로 기존보다 94.2% 감소한 상태를 유지합니다.
- 첫 미리보기 API 응답은 158,095 bytes였고, 화면 근처의 카드만 요청합니다. 같은 카드 재렌더링/스크롤에서는 메모리 캐시를 재사용하며 OpenRouter를 호출하지 않습니다.
- Preview branch `https://codex-card-previews.aichat34-hr-pe-kr.pages.dev`; Worker `a3fef813-e5c9-41c3-a34e-8dd70483055b`; 운영 Pages `https://hr.pe.kr/aichat34/`.

## 2026-10-06 — 첫 화면 게임 목록 로딩 개선
- 클라우드 카탈로그를 기다리는 동안 지아 카드 하나만 먼저 보이던 화면을 카드 스켈레톤으로 바꿨습니다. 가벼운 목록 응답이 도착하면 전체 목록을 한 번에 표시합니다.
- 목록 응답과 카드 DOM에서 표정/스토리 이미지 중복을 제거하고, 게임별 대표 이미지 한 장만 씁니다. 게임 편집/시작을 누르면 상세 원본 데이터를 가져옵니다.
- 검증: 카드 목록은 7개, 395,309 bytes(2,424ms)로 기존 전체 목록 6,860,179 bytes보다 94.2% 작았습니다. 상세는 200 JSON, 이미지 포함 953,714 bytes입니다.
- Preview `https://3cf2079e.aichat34-hr-pe-kr.pages.dev`; Worker `e128f260-f739-4568-9527-e5e91fa51c07`; 운영 기능 배포 `https://16c9d74a.aichat34-hr-pe-kr.pages.dev`. 공개 ZIP 및 인수인계 문서 갱신은 별도 Pages 배포로 반영합니다.

## 2026-10-06 — OpenRouter 원가 상한과 비공개 사용량 기록
- A34 AI 요청은 원문 입력 4,000자, 게임 프롬프트·시놉시스 합계 14,000자, 전체 요청 JSON 128KB로 제한합니다. 이전 대화는 최대 40개 중 최근 내용을 우선 남기고, 입력+게임 설정+이전 대화의 합계가 18,000자를 넘지 않게 서버에서 차감 전에 자릅니다.
- OpenRouter 요청에 가격순 라우팅과 티어별 최대 제공자 단가(입력/출력 100만 토큰당 speed $0.25/$1.50, standard $0.30/$2.50, RP $0.22/$0.50, ultra $0.75/$3.75)를 적용했습니다. 기존 고정 크레딧 요금과 출력 토큰 상한은 유지합니다. 상한 안에 제공자가 없으면 자동으로 더 비싼 제공자를 쓰지 않고 기존 실패·환불 처리를 따릅니다.
- 제공자가 반환한 실제 모델명, 토큰 수, USD 원가, 티어, 요청 종류, 내부 사용자 ID와 환불 크레딧만 A34 D1에 최대 90일 기록합니다. 프롬프트/채팅 내용은 이 비용 표에 넣지 않습니다. 기록은 D1 권한을 가진 운영자가 SQL로 확인합니다.
- 마이그레이션 `0013_ai_usage_costs.sql` 적용. Cloudflare 공식 문서의 `provider.sort`, `provider.max_price`, 응답 `usage.cost` 및 토큰 필드를 사용합니다.
- 검사: `node --check worker/aichat34-api.js`, Wrangler Worker dry-run 성공. 4,001자 무인증 요청이 413으로 거부됨을 확인했고, 운영 게임 목록은 JSON 200입니다. AI 유료 호출은 하지 않았으며 사용량 표는 0건입니다.
- Worker release `bdb95b5d-2680-4384-a601-995916d03361`; Pages preview `https://dba639e1.aichat34-hr-pe-kr.pages.dev`; Pages production은 사용자 주소 `https://hr.pe.kr/aichat34/`에 반영했습니다.

## 2026-10-06 — AI 모델명·요금·장문 차감 일치
- 화면의 티어명을 Worker의 실제 OpenRouter 모델에 맞췄습니다: Gemini 3.1 Flash Lite, Gemini 2.5 Flash, Llama 3.3 70B Instruct, Gemini 3.7 Flash. 곧 종료 예정인 Gemini 2.5 Flash Lite는 저가 티어에서 제외했습니다.
- 일반 채팅은 스피드/스탠다드/RP/울트라 순서로 36/46/39/66C, 장문은 56/76/59/106C로 조정했습니다. 최고 충전 보너스(₩7,000에 8,500C)를 적용해도 가장 낮은 채팅 요금은 약 ₩29.65입니다. AI 기획은 56C입니다.
- 장문 묘사 요금이 클라이언트에만 있고 Worker에서는 기본 요금만 차감되던 불일치를 수정했습니다. 장문 요청에는 서버가 해당 요금을 실제 차감하고 최대 출력 토큰을 2,000으로 설정합니다.
- 충전 상품의 할인율 오표시를 바로잡아 4,500C 상품은 12.5%, 8,500C 상품은 21.4% 추가 적립으로 표시합니다.
- 모델 가격표는 2026-10-06 OpenRouter 공개 가격 기준. 예상 원가는 입력 10,000토큰/출력 400토큰(일반), 10,000/2,000(장문), 기획 입력 10,000/출력 4,000토큰 가정으로 산출했으며 실제 라우팅·토큰량과 환율에 따라 달라집니다. 실제 AI API 호출은 하지 않았습니다.
- `node --check`로 JS 3개 파일 구문 검사를 통과했습니다. 프리뷰 `https://44b6e8b9.aichat34-hr-pe-kr.pages.dev`에서 페이지·앱·Studio JS·JSON 목록 API를 확인했고, 운영 `https://hr.pe.kr/aichat34/`에서도 200 및 JSON 응답을 검증했습니다. 비용 발생을 피하기 위해 실제 AI 호출은 하지 않았습니다.
- A34 Worker release `a6bebb9e-576a-4e24-84b8-8710b3f7d5b9`; Pages production `https://hr.pe.kr/aichat34/`.

## 2026-10-06 — 대표 일러스트 4컷과 장기 연재 분리
- 8컷 시트 하단의 네 이미지를 이야기 분량이나 결말이 아닌 대표 장면 참고 이미지로 명확히 바꿨습니다. 앨범과 해금 안내도 이미지 컬렉션으로 표시합니다.
- 기존 게임에 저장된 `1화`~`4화` 식 장면 제목은 플레이 화면에서 회차 표기를 제거합니다. 4화 시점에 모든 그림이 열리던 레거시 해금 처리도 회차 1·4·8·14 기준으로 바로잡았습니다.
- AI 기획 지침이 대표 장면 캡션 네 개를 네 화의 순서표나 결말로 해석하지 않도록 강화했습니다. 구체적인 복수 서사 갈래와 여러 이정표를 만들고, 사용자가 원하지 않는 한 장기 이야기를 끝내지 않습니다.
- 장기 진행의 맥락 보존을 위해 커스텀 게임 AI 요청이 최근 대화 20개 메시지를 사용합니다. 이미지 네 장은 그대로 유지되며 추가 생성 비용은 없습니다.
- 구문 검사와 프리뷰 UI 확인 완료. 운영 앱과 최신 JS 자산은 HTTP 200, 커스텀게임 API는 JSON 200 및 게임 7개를 반환하는 것을 확인했습니다.
- Worker `ab9482b5-124f-49b7-965a-2d08582f66df`; Preview `https://7902692e.aichat34-hr-pe-kr.pages.dev`; Pages production `https://9555760d.aichat34-hr-pe-kr.pages.dev`.

## 2026-10-06 — 코드명 예진·유이 게임 삭제
- 요청한 `코드명 예진 : 감정 싱크로율 99%`와 `코드명 유이 : 감정 싱크로율 99%` 두 게임을 A34 공개 게임 목록에서 삭제했습니다.
- 과거 브라우저의 로컬 복사본이 다시 올라오지 않도록 해당 ID를 클라이언트 저장 목록에서 제거하고, A34 Worker의 목록·저장에서도 차단했습니다.
- 원격 DB에서 두 ID 삭제를 확인했고, 운영 `/aichat34/api/cgame2/list`가 JSON 200을 반환하며 해당 ID 없이 게임 7개를 제공하는 것을 검증했습니다.
- Preview: `https://a63d4bc8.aichat34-hr-pe-kr.pages.dev`; Pages production: `https://c6da31a8.aichat34-hr-pe-kr.pages.dev`; Worker release `5aa79823-a9b9-4ad0-a19e-71c6ef90c3ad`.

## 2026-10-06 — 첫 화면을 커스텀게임으로 변경
- 탐색 탭 맨 왼쪽으로 옮기고 표시명을 `커스텀게임`으로 단순화했습니다. `2.0` 및 괄호 설명을 탭에서 제거했습니다.
- 사이트 첫 진입과 상단 로고 클릭 시 커스텀게임 목록을 엽니다. AI RPG는 바로 옆 탭에서 계속 사용할 수 있습니다.
- 첫 로드에서 게임 목록 렌더링과 클라우드 동기화가 시작되는 것을 프리뷰 브라우저에서 확인했습니다.
- Preview: `https://b3e4b913.aichat34-hr-pe-kr.pages.dev`; Pages production: `https://1da4b67b.aichat34-hr-pe-kr.pages.dev`; 서비스 주소 `https://hr.pe.kr/aichat34/` HTTP 200 및 앱 버전 `34.17` 확인.

## 2026-10-06 — 광장과 커스텀 게임 대표 이미지 다양화
- 로그인 사용자가 공개 글과 답글을 올리고, 좋아요/신고를 남길 수 있는 광장을 추가했습니다. 글은 280자, 15초 간격, 하루 40개로 제한합니다. 작성자 본인만 삭제할 수 있습니다.
- 공개 카드의 고정 표지만 쓰지 않고 실제 등록된 1화 장면 또는 미소·수줍음·눈물 등 표정 이미지 중 하나를 게임 ID에 따라 안정적으로 선택합니다. 새로고침해도 선택이 바뀌지 않습니다.
- 대화 중 새로 해금되는 명장면 이미지는 세로 프레임을 늘리고 이미지 전체 비율을 보존해 더 많이 보이게 했습니다. 클릭/키보드로 전체보기와 앨범을 열 수 있습니다.
- 광장에 닉네임 설정을 추가했습니다. Google 계정명은 새 글에 노출하지 않고, 설정한 닉네임만 공개합니다. 설정 전 기존 글은 임의 익명 표기로 표시되고, 닉네임을 저장하면 과거 글에도 적용됩니다.
- 광장 데이터는 A34 전용 D1 `community_posts`에 보관하며 이메일은 공개하지 않습니다. 세 운영자만 신고 목록을 확인하고 신고 글을 숨길 수 있습니다.
- A34 전용 Worker/Pages만 배포합니다.
- 찾아낸 유효한 OpenRouter 키를 A34 Worker Secret에 다시 설정했습니다. 키 값은 로컬 Codex 기록에서 불러와 터미널/출력에 표시하지 않았고, 유료 모델 호출은 하지 않았습니다.
- 익명 기본 닉네임 생성이 계정 ID 조각을 사용하지 않도록 수정했습니다. 서버에서 무작위 식별 불가능한 닉네임을 발급합니다.
- Preview: `https://42f26a02.aichat34-hr-pe-kr.pages.dev`; Pages production: `https://5459c2f3.aichat34-hr-pe-kr.pages.dev`; Worker: `4690d418-6b77-4827-a84f-2cfc6c40e326`.

## 2026-10-06 — Studio 기획 장르 확장
- 현대극을 포함해 일상, 코미디, 성장, 액션, 모험, 추리, 공포, 범죄, 역사, 생존, 재난, 포스트아포칼립스, 스포츠, 음악·예술, 정치·전쟁 장르를 추가했습니다.
- AI 기획 선택, 결과 검증, 초안 저장·불러오기, 게임 장르 선택과 목록 필터에 같은 장르 목록을 적용합니다.
- 기존 A34 공개 게임과 A31/A33에는 영향을 주지 않도록 A34 전용 프론트엔드와 API Worker만 변경합니다.
- Preview: `https://d5372ad3.aichat34-hr-pe-kr.pages.dev`; Pages production: `https://afba5ddc.aichat34-hr-pe-kr.pages.dev`.
- Worker `ca3fa9b6-9e19-478b-b502-6fdc57b09352`에 배포 후 기획 성공 응답의 `planDraftSaved` 변수명 불일치도 발견해 수정했습니다. 최종 Worker release: `dc0cb082-b1d7-451d-a45d-9610b32045e7`.

## 2026-10-06 — 플레이어 입력의 행동 주체 보존
- 평문에서 주어가 생략된 행동은 플레이어의 행동으로 해석하도록 하고, `*...*` 지문과 따옴표 대사는 요청마다 별도 안내하도록 했습니다.
- 캐릭터가 플레이어의 행동을 대신 실행하거나, 행동 주체를 뒤집지 않도록 서사 지침을 보강했습니다.
- Worker release: `e1bc4721-01d8-4a11-bef3-08ec0d2dfafd`.

## 2026-10-05 — Studio 복수 장르 및 이미지 프롬프트 맥락 반영
- AI 기획 장르를 선택사항 복수 체크로 변경했습니다. 비워두면 AI가 주 장르를 자유롭게 정하고, 복수 선택은 요청한 요소를 섞어 반영합니다.
- 저장·불러오기와 운영자 조회에 선택 장르를 보존합니다.
- ChatGPT 8컷 복사 프롬프트에 시놉시스, 페르소나/관계, 4개 챕터, 장르 선택을 넣어 생성 이미지의 이야기 맥락을 맞춥니다.
- 채팅 AI는 계정 이름을 추측해 부르지 않고, 기본적으로 이름 호칭을 생략하도록 했습니다.
- Preview: `https://f08fb670.aichat34-hr-pe-kr.pages.dev`; Worker: `2e41f7eb-9b06-4afa-b6cb-a982039808cc`.

## 2026-10-05 — 생성된 Studio 기획 서버 선저장 보강
- AI 기획 결과를 API 응답 전에 작성자 계정 초안으로 저장해, 응답 직후 탭/네트워크가 끊겨도 불러올 수 있게 했습니다.
- 저장 실패는 유효한 AI 결과 전달이나 크레딧 처리와 분리했고, 기존 계정 소유권 및 관리자 조회 이력 규칙을 유지합니다.
- Preview: `https://98dfddec.aichat34-hr-pe-kr.pages.dev`; Pages main: `https://4e189037.aichat34-hr-pe-kr.pages.dev`; Worker: `ef91c989-8f57-49f4-8898-34b986270771`.

## 2026-10-05 — Studio 2 기획 초안 저장 및 운영자 조회
- 검토용 Pages preview: `https://9c6ac67b.aichat34-hr-pe-kr.pages.dev` (deployment `9c6ac67b-e362-44ad-ab85-16319f3ae3ef`); 전용 Worker release: `d47de743-f2cd-4599-8f97-89f192a1114f`.
- 작성 중인 Studio 2 텍스트 기획을 로그인 계정에 자동 저장하고, 다른 기기에서 불러오거나 직접 삭제할 수 있게 했습니다. AI로 생성한 결과도 생성 직후 저장합니다.
- 세 관리자 Google 계정만 작성자, 키워드, 장르, 페르소나 등 저장된 기획을 볼 수 있으며 관리자 조회 필터는 접근 이력에 남습니다. 작성자 계정 외에는 초안 수정·삭제가 거부됩니다.
- 저장 안내를 Studio에 표시합니다. 저장 범위는 텍스트와 설정이며 업로드 이미지는 포함하지 않습니다.
- A34 D1 migration `0010_cgame2_plan_drafts.sql` 추가.

## 2026-10-05 — 반복 응답 차단 및 기록별 환불
- 루안 7단계의 고정 문구가 AI 제공자 응답 실패 시 정상 답변처럼 노출되던 원인을 확인했습니다. 해당 고정 응답 분기를 제거했습니다.
- OPENROUTER_API_KEY가 없으면 요청을 차감 전에 거절합니다. 키가 있는데 응답이 비었거나, 직전과 동일한 긴 답변이 반복돼도 서버에서 사용 크레딧을 돌려주고 실패로 처리합니다.
- 대화 저장에 동의한 회원은 기존처럼 최근 90일 대화·AI 응답을 운영자 기록에서 확인할 수 있습니다. 자동 환불/반복 실패 기록에는 결과와 반환 여부도 남깁니다.
- 동의된 대화 기록에서 사용 크레딧을 1회 반환하는 운영자 기능을 추가했습니다. 반환은 고유 기록 ID로 중복 실행을 막고 credit ledger와 운영자 조회 이력에 남습니다.
- A34 D1 migration `0009_admin_credit_refunds.sql` 적용. 기존 대화/동의값은 변경하지 않았습니다.
- A34 이외 Worker/Pages는 배포하지 않았습니다.
## 2026-10-07 — 그래프·도형 추가 옵션 및 대화 UI 3
- 수학 학습 ON인 커스텀 게임에서만 그래프·도형 표시를 선택할 수 있습니다. 사용한 턴은 +5C이며, 그래프 명세가 누락/오류이면 추가분만 환불합니다.
- 생성은 기존 AI 응답의 제한된 출력 예산 안에서 한 번만 수행합니다. 커스텀게임 일반 답변 800토큰, 장문 2,000토큰 상한은 변경하지 않았습니다. 도형과 그래프는 서버 검증 후 브라우저가 제한된 SVG 기본 요소로 렌더링합니다.
- 밝은 전체화면 대화 UI 3을 기본값으로 추가했습니다. 뒤로가기와 상세 메뉴를 지원하고 UI 1 스토리형·UI 2 메신저형은 UI 선택에서 유지됩니다.
- 코드 구문 검사 통과. 외부 모델 과금 호출은 하지 않았습니다.
