59 Commits

Author SHA1 Message Date
reloop
1873c65a02 feat: 가격표 2,900원 리뉴얼 + 티어 전환기 + 기능 게이트
가격표: Free/Pro(2,900)/School(학생당 2,900) 3-tier, 비교표 재구성
프로필: 프로토타입용 Free/Pro/School 자유 전환 버튼
기능 게이트: Free 과목 3개, 복습 큐 10개, 마스터리 경로 차단

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 19:06:57 +09:00
reloop
b59cc8fd57 chore: PsProblem/백준 연동 데드코드 전면 제거
PsProblem, PsBookmark, PsSyncState 모델 3개 삭제.
User.bojHandle, StudyLog.psProblemId FK 삭제.
12곳 psProblemId: null 쿼리 필터 제거.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 18:41:31 +09:00
reloop
b27417a10e feat: 학교 관리 4대 기능 — 개인과제, 복습과제, 풀이상세, 선생님 노트
Backend:
- Assignment에 type(new/review), targetUserIds, teacherNote 필드 추가
- 학생 목록에서 targetUserIds 기반 개인 과제 필터링
- GET /assignments/:id/submissions/:userId/details 엔드포인트 (문제별 시간/필기/정오)

Frontend:
- 과제 생성: 유형 토글(새문제/복습) + 개별 학생 지정 + 선생님 해설 노트
- 과제 상세: 학생 클릭 → 풀이 상세 모달 (문제별 시간, 정오, 필기 이미지)
- 학생 뷰: 완료된 과제에 선생님 해설 노트 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 18:25:36 +09:00
reloop
5db1520e67 feat: 2022 개정 교육과정 수학 프리셋 — 과목 생성 시 단원 자동 배치
- backend: curriculum-presets.ts에 중1~고3 + 공통수학/대수/미적분/확통/기하 단원 데이터
- backend: subjects.create() 시 과목명이 프리셋에 해당하면 태그 자동 createMany
- frontend: 과목 생성 모달에 교육과정 프리셋 칩 13개 추가
  (중1수학~고3수학, 공통수학1/2, 대수, 미적분I/II, 확통, 기하)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 16:51:33 +09:00
reloop
59da6a3578 feat: 과목 삭제 기능 — 연관 데이터 트랜잭션 정리
- backend: subjects.service.remove()를 트랜잭션으로 변경
  (reviewSchedule → studyLog → skillSnapshot → subject 순서 삭제)
- frontend: 과목 카드에 삭제 버튼 + 확인 다이얼로그 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 16:19:35 +09:00
reloop
629f2465e0 feat: 태그 수정/삭제 API + 2D 그라데이션 색상표
- backend: tags PATCH 엔드포인트 추가 (태그 이름 수정 가능)
- frontend: 과목 색상 선택을 HSL 기반 2D 그라데이션 피커로 교체
- 프리셋 10색 빠른 선택 + 캔버스 드래그 + HEX 직접 입력

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 16:14:36 +09:00
reloop
f5214d20b2 feat: 과목 제한 해제 — 수학 외 자유 과목 추가 가능
- backend: ALLOWED_SUBJECT_NAMES, @IsIn() 삭제, 모든 서비스에서 name:'수학' 필터 제거
- frontend: purgeNonMath 제거 (대시보드 안정화), 과목 생성 가드 삭제
- defaultSubjectColor에 영어/국어/과학/사회/한국사 색상 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 16:08:48 +09:00
reloop
eeb94db8e7 feat: 알고리즘 개선 + 태그 활용 강화
알고리즘:
- SkillSnapshot 필드 분리: s0(기억강도 0~1) + easeFactor(EF 1.3~4.0)
- SM-2에 intensity 배율 반영 (strict×0.7, moderate×1.0, relaxed×1.4)
- 망각곡선 보정 통합: SM-2 간격 후 예상 P<30%면 안전 간격으로 축소
- SM-2에서도 s0(기억강도) 업데이트하여 두 모델이 항상 동기화

태그 활용:
- 복습 세션에 태그 필터 칩 (특정 단원만 집중 복습)
- 복습 완료 요약에 태그별 통계 (어려움/보통/쉬움 카운트)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 17:38:42 +09:00
reloop
85caf9b71d feat: 복습 후 태그 추가 프롬프트 + 캘린더 완료 항목 정렬
1. TagPrompt 공통 모달: 복습/문제풀이 후 태그 선택/생성 가능
   - 복습 페이지: 난이도 선택 후 태그 없는 문제에 자동 프롬프트
   - 업로드 문제집: 자기평가 후 태그 프롬프트
   - 새 태그 생성 기능 (입력 + 즉시 적용)
2. 백엔드: PATCH /study-logs/:id에 tagId 업데이트 지원
3. 캘린더 day panel: 완료 항목 아래로 정렬 + 취소선 + 투명도

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 17:17:06 +09:00
reloop
58719e329e feat: 문제풀이 UI 통일 + PDF→문제집 + 통계탭 삭제
- 통계 탭 삭제 (프론트 페이지/차트/네비 항목, 백엔드 stats 모듈은 대시보드용으로 유지)
- PDF 문제 분리 → 문제집 생성으로 변경 (ProblemSet + Problem 레코드)
  - ProblemSet에 sourceType, uploadedByUserId 추가
  - POST /problem-sets/create-from-pdf 엔드포인트
  - GET /problem-sets/my-uploads, DELETE /problem-sets/:id
  - exams 페이지에 '내가 만든 문제집' 섹션
- 문제 풀이 UI 통일
  - DrawingCanvas 공통 컴포넌트 추출 (필기모드)
  - 복습 페이지에 필기모드(캔버스+펜색상) 추가
  - 다시풀기 페이지에 필기모드+메모 추가
  - 처음풀기 페이지 난이도 슬라이더→3버튼(H/M/E)+SM-2 연동

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 10:17:12 +09:00
reloop
da7dba0c0c fix: 크롭 이미지 URL을 API 서버 기준으로 해석 + 복습 시 사용자 등록 문제 이미지 표시
- import-pdf: resolveUploadUrl로 이미지 src를 API 서버 도메인으로 변환
- review: currentProblem이 null이어도 StudyLog.imageUrl이 있으면 이미지 표시
- getOne API: correctAnswer, imageUrl 필드 응답에 추가
- api.ts: StudyLogDetail에 imageUrl 필드 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 09:45:31 +09:00
reloop
2b9111a3f7 feat: PDF 이미지 크롭 방식 문제 분리 + 해설지 정답 자동 태깅 + 복습 정답 표시
14. PDF 문제 분리
- OCR 텍스트 파싱 → bbox 기반 이미지 크롭(pdftoppm)으로 전면 교체
- 해설지 PDF 동시 업로드 시 pdftotext로 정답 표 자동 파싱
- StudyLog에 correctAnswer, imageUrl 컬럼 추가 (migration)
- 프론트: 크롭 이미지 미리보기 + 정답 자동/수동 배정 UI

15. 복습 시 정답 표시
- 복습 카드에 "정답 보기" 버튼 추가 (클릭 시 정답 번호 표시)
- ProblemSet answerNumber + StudyLog correctAnswer 양쪽 소스 지원
- 캘린더 일별 보기에도 answerNumber 포함

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 09:35:08 +09:00
reloop
8ede8efbec feat: 프로필 알고리즘 설명 + 시험목표 삭제 + PDF 파싱 버그 수정 + README 재작성
- 프로필 학습설정에 현재 페르소나/강도 기반 복습 알고리즘 설명 카드 추가
- 시험 목표/집중 단원/BOJ 핸들 섹션 제거
- PDF 문제 분리: codex Vision OCR → pdftotext 텍스트 파싱으로 교체 (운영서버 호환)
- README.md 전면 재작성 (최신 기능 반영)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 09:14:50 +09:00
reloop
45cb02f3fc feat: 밀린 복습 자동 이월 + 페르소나 재계산 + PDF OCR 문제 분리
- 복습 큐 조회 시 하루 이상 밀린 pending 항목을 오늘 09:00 KST로 자동 reschedule
- 페르소나/학습강도 변경 시 모든 pending 복습 스케줄을 새 설정 기반으로 재계산
- PDF 모의고사 업로드 → Codex Vision OCR로 문제별 분리 → 태그 배정 → 선택적 복습 큐 등록

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 08:50:32 +09:00
reloop
8aa87ed257 feat: SM-2 + 페르소나 하이브리드 복습 알고리즘
- SM-2 Easiness Factor + 페르소나별 망각속도 보정 (senior 1.3x ~ crammer 0.6x)
- 최초 학습(iter=0): hard=1d, medium=3d, easy=7d 차등 간격
- 2회차~: 반복할수록 간격 증가 (6 × EF^(iter-1) × pf)
- hard → EF 하락 + 간격 리셋(1일), easy → EF 상승 + 간격 확대
- EF 는 SkillSnapshot.s0 에 저장 (태그별 개인 학습 용이도)
- 프론트 3버튼에 SM-2 기반 동적 간격 미리보기 표시
- 기존 PersonaForgetService.schedule/updateS0 유지 (selfDifficulty 없는 경우 fallback)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 15:31:47 +09:00
reloop
25092bf680 feat: 문제집 삭제 + PS/국어 데이터 완전 제거
- DELETE /study-logs/by-prefix: 문제집 삭제 시 관련 StudyLog+ReviewSchedule cascade 삭제
- POST /study-logs/purge-non-math: PS studyLog + 비수학 subject 일괄 삭제
- dashboard/reviews/study-logs 쿼리에 psProblemId:null + subject:'수학' 필터 추가
- 카탈로그: ebook 카드 삭제 버튼 + 경고 confirm + 숨기기/복원
- 대시보드 마운트 시 1회 자동 purge (localStorage flag)
2026-04-16 14:23:02 +09:00
reloop
21a048b017 feat: QR/코드 ebook 등록 + 직접 문제 등록 + PDF 업로드 + 시연용 문제집
- 코드 입력 → 프리미엄 ebook(55문항) 등록, localStorage 영속화
- 직접 문제 등록 → POST /study-logs → 복습 캘린더 자동 배치
- PDF 업로드 → backend uploads/problems/, 카탈로그에 PDF 카드 표시
- 시연용 인쇄 문제집 HTML (A4 10페이지, 표지+정답표)
- 데모 등록코드: RELOOP-2026-MATH, DEMO-B2B-001

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 13:47:57 +09:00
reloop
256d42dbd8 feat: 3단계 자기 평가 복습 스케줄 (어려움1d/보통7d/쉬움30d) + 샘플 ebook → StudyLog 연동
- backend study-logs: selfDifficulty 필드 추가, 고정 간격 스케줄링 (1/7/30일)
- backend reviews submit: selfDifficulty 전달 → 다음 복습 고정 간격
- frontend sample-ebook: 정답 확인 후 3단계 평가 → POST /study-logs → 복습 캘린더 등록
- frontend review: 정답/부분/오답 4버튼 → 어려웠어/괜찮았어/쉬웠어 3버튼으로 교체
- sample data: 180문항 전부 difficulty 책정 (문항별 easy/medium/hard)
2026-04-16 12:24:41 +09:00
reloop
21c31a07dc feat: 복습 문제 삭제 기능 (잘못 누른 경우 대응)
- backend: DELETE /reviews/:id 엔드포인트 + 소유권 확인 후 hard delete
- 캘린더 패널: 각 복습 항목 옆 빨간 "삭제" 버튼, confirm 후 낙관적 제거 + 셀 카운트 갱신
- 복습 풀이 큐: ActionGrid 하단 "이 문제 삭제" ghost 버튼, 삭제 후 다음 문제로 전환
- pending/done/skipped 상태 무관하게 삭제 허용
2026-04-16 11:59:14 +09:00
reloop
07be0c581a chore: PS 데이터 잔재 전면 제거 + 국어 통계 차단 확인
- backend study-logs: psProblemId input/include/응답매핑/검증 제거
- frontend study-logs/[id]: PS 전용 렌더링(PsTypeBadge, TierBadge, BOJ 링크,
  normalizePsTags, getTierColor 등) 전부 제거, problem null 시 fallback 유지
- frontend study/history: PS 뱃지 렌더링/헬퍼 제거
- frontend onboarding: GoalType 'ps' 항목, BOJ 핸들 연결 UI, 관련 state 제거
- frontend api.ts: GoalType 'ps', psProblem 타입, getBojTierLabel 제거

국어 통계는 backend stats.service 의 name='수학' 필터로 이미 차단 확인.
Prisma schema 의 PsProblem/PsBookmark 모델은 유지 (마이그레이션 없음).
2026-04-16 11:52:04 +09:00
reloop
03ce2c64fd feat(prototype): 중1~고3 샘플 ebook 6권 + PS 제거 + 복습캘린더 + 태그 삭제
### 샘플 ebook (대회 시연용 B2B 데모)
- /exams 카탈로그: API 호출/필터 제거, EBOOK_LIST 기반 6카드 정적 렌더
- /exams/sample-ebook/[id] 동적 라우트: 중1~고3 수학 6권 × 30문항 + 해설
- 교육과정별 단원 커버 (중1: 정수·일차방정식 ~ 고3: 극한·벡터)

### PS (Solved.ac) 도메인 제거
- backend: PsModule/PsService/PsController/SolvedAcClient 전체 삭제, app.module 정리
- frontend: /ps 라우트, PsTabs, SideNav/BottomNav PS 항목, api.ts PS 타입 전부 제거
- onboarding: ps.sync() 호출 제거

### 복습큐 → 복습캘린더
- backend: GET /reviews/calendar?year&month, GET /reviews/day?date API 추가
- frontend: 대시보드 "오늘 복습 큐" 카드 → ReviewCalendar 위젯 교체
  - 월간 7열 그리드, 날짜 클릭 시 해당일 복습 목록 인라인 패널
  - 밀린 날 warning / 완료 날 success / 오늘 하이라이트
  - 0건이면 "쉬어가자" 안내

### 태그 삭제 기능
- subjects/page.tsx: 태그 행 × 아이콘 → ConfirmDialog (danger) → DELETE /tags/:id
- 낙관적 업데이트 + 실패 시 롤백

backend tsc + frontend tsc 클린.
2026-04-16 10:44:55 +09:00
reloop
57cd305166 fix(backend): tsconfig exclude 'prisma' 가 src/prisma 까지 차단 — 항목 제거
기존 exclude 패턴 'prisma' 는 backend/prisma/ 스키마 폴더를 제외하려는 의도였지만,
TypeScript exclude glob 이 경로 어디서든 'prisma' 디렉터리를 매칭해서 src/prisma/ 도
함께 제외됨. 그 결과 nest build 가 PrismaModule 을 dist/prisma.module.js 로 평탄화
emit 하면서 app.module 의 './prisma/prisma.module' require 가 런타임에 깨졌음.

이전 배포는 tsbuildinfo 캐시가 살아있던 덕에 우연히 정상 트리로 emit 되어 가려져
있었고, 오늘 클린 빌드 시 노출. 'prisma' 폴더의 .ts 파일들은 어차피 include
'src/**/*' 에 안 잡히므로 exclude 자체가 불필요. 항목 제거로 해결.
2026-04-16 10:03:15 +09:00
reloop
674fdfcf3d feat(prototype): 수학 단일 과목 잠금 + 샘플 ebook 데모 + B2B QR 비전 문서
- 백엔드 read-side 필터: subjects/stats/problem-sets findMany 에 name='수학' / subjectName='수학' 고정
- 백엔드 write-side 가드: subjects.controller @IsIn(['수학']) for create/update
- 프론트 subjects: 클라이언트 검증으로 수학 외 입력 차단
- 프론트 exams: 카탈로그 맨 앞에 [샘플] 수능 수학 미리보기 ebook 데모 카드 항상 노출 (4분기 모두)
- 신규 페이지 /exams/sample-ebook: 종이책 펼침 two-page spread, 5문항 (이차함수/등차/극한/확률/정적분), 키보드 ←→ nav, 정답 확인+해설, B2B 비전 안내 박스
- docs/b2b-qr-physical-book.md: 종이책 QR → 앱 ebook + 망각곡선 복습 큐 자동 연동, 출판사 라이선스 모델 미래 스펙

데이터는 DB 보존 (soft filter), '수학' 한 단어 sed 로 풀 수 있음.
백엔드 tsc build / 프론트 tsc + lint 클린.
2026-04-16 09:56:57 +09:00
reloop
c8d0de3322 fix(phase10F): 학습 기록 PS 호환 — list/getOne psProblem include + detail/history UI
- backend study-logs.service.list/getOne 에 psProblem 포함 (bojId,title,
  titleKo,level,tags) + getOne 응답에 bojUrl 자동 생성
- lib/api.ts: StudyLog/StudyLogDetail 타입에 psProblem optional 추가
- /study-logs/[id]: PS 변형 카드 — 티어 뱃지/태그/BOJ 외부 링크/안내 문구
- /study/history: 행에 'PS + 티어' 컴팩트 뱃지 (mobile 카드 동일)

검증: backend build/test OK, frontend build/lint OK.
2026-04-14 21:05:52 +09:00
reloop
6af0a2a5fa fix(phase10E): PS 온보딩/저장/결과 가시화 사후 픽스
F1. 온보딩 PS 트랙은 STEP 2(등급) 자체 스킵 — none 처리와 동일하게
    effectiveStepCount/visibleStep/goNext/goPrev 분기 확장
F2. 온보딩 저장이 PATCH /me/onboarding 으로 이동 (기존 /auth/me 404)
    - OnboardingDto 에 닉네임·옵션 필드 명시, 등급 3종 IsOptional
    - me.service.updateOnboarding 가 undefined 필드 가드
    - PS 사용자는 currentGrade/targetGrade/targetExamYear 페이로드에서 제거
F3a. POST /api/ps/sync 응답에 importedProblems 요약 포함
    - /ps/sync 결과 영역에 카드 리스트(티어/제목/태그/BOJ 링크) 노출
F3b. /ps/solved 신규 페이지 + GET /api/ps/solved?page= 신규 endpoint
    - StudyLog where psProblemId 페이지네이션 조회
    - PsTabs 에 "풀이" 탭 추가 (검색/북마크/풀이/동기화)
F-extra. ps/sync 페이지의 saveHandle 도 /me/profile 로 교체
- lib/api.ts: PsSyncResult.importedProblems, getBojTierLabel, ps.listSolved

검증: backend build OK, vitest src/ps 7 통과, frontend build OK, lint OK.
2026-04-14 20:36:39 +09:00
reloop
9df9625afe fix(ps): SolvedAcClient DI via useFactory — Nest 가 untyped options 인자 resolve 못해서 부팅 실패 2026-04-14 19:45:30 +09:00
reloop
6ceeee4f3f feat(phase10B): Solved.ac PS 모듈 신규 + bojHandle 등록
- prisma: PsProblem / PsBookmark / PsSyncState 모델, StudyLog.psProblemId
- migration: phase10_ps_tables
- ps/solved-ac.client: axios 클라이언트(rate-limit 3req/s, 지수 백오프 3회)
  searchProblems / getProblem / getUser / getUserProblemStats / getUserTop100
- ps/ps.module + service + controller: search/bookmark/sync 6 endpoint
  - JWT guard, throttler, sync 멱등성 (PsSyncState lastSolvedCount)
  - sync 시 시스템 Subject "PS" 자동 생성, StudyLog bulk insert (중복 skip)
- me/auth: bojHandle / focusUnits PATCH 지원, MeUser 응답 확장
- vitest: solved-ac.client 7 테스트 통과 (4 메서드 + 429 재시도)

Phase 10B DoD 통과.
2026-04-14 18:47:09 +09:00
reloop
d892d8298b feat(phase10A): KICE 비수학 제거 + 수학 단원 분리
- schema: MathUnit enum (common/prob_stat/calculus/geometry)
- User: focusUnits(Json), bojHandle(VarChar32)
- ProblemSet: mathUnit optional + unique(year,examType,subjectName,mathUnit)
- migration: phase10_math_units_and_ps
- scripts: wipe-non-math (dry/apply), kice-import refactor (math only,
  30문항을 공통22 + 확통/미적/기하 8씩으로 분할 → 2년×4 = 8 ProblemSet)
- parsing strategy/ocr-fix/seed/me/study-logs: 비수학 참조 전면 제거
- data/kice, backend/uploads/problems: 비수학 폴더 삭제
- Plans.md: Phase 10 계획 확정

Phase 10A DoD 통과 — prisma validate/format OK, nest build OK,
kice-import dry-run 2년 각 46문항 확인, wipe dry-run 8 set/260 problems 확인.
2026-04-14 18:27:00 +09:00
reloop
f9c8b9ab2c feat(school): student progress + class reports — 9.4 2026-04-12 16:07:32 +09:00
reloop
bed5b802d4 feat(school): teacher dashboard + classes + invite + student view — 9.2 2026-04-12 15:47:01 +09:00
reloop
f4b80d380a feat(school): organization + class + assignment schema and API — 9.1 2026-04-12 15:33:16 +09:00
reloop
d14fde3bb4 feat(ux): slow animations + audio player + styled slider + pricing nav — 7I.4b 2026-04-12 14:21:35 +09:00
reloop
e3cdfd9881 feat(exam): image-only display + OMR bubbles + passage images — 7I.4a 2026-04-12 14:14:26 +09:00
reloop
4c61b87052 feat(data): chosenAnswer + solve route + profile tabs — 7I.2 2026-04-12 13:35:39 +09:00
reloop
e76e14eb1d feat(parse): per-problem image crop for all subjects — 7I.1 2026-04-12 13:24:30 +09:00
reloop
4dbb587e5e fix(main): use namespace import for express to avoid default interop 2026-04-12 08:29:33 +09:00
reloop
fd9e03bd9c fix(deps): add express as direct dep — main.ts uses express.json/urlencoded 2026-04-12 08:28:31 +09:00
reloop
c36978c363 feat(security): helmet + rate limit + env hardening — 8.3 2026-04-12 08:26:17 +09:00
reloop
acc35e9284 feat(parse): math + image-based problem pipeline — 7H.1 2026-04-12 08:06:54 +09:00
reloop
a5dab35618 feat(profile): avatar upload + onboarding wizard + mobile dropdown — 7G.6 2026-04-12 07:48:55 +09:00
reloop
9068fcbd48 feat(detail): study log detail + review wiring + seeded S0 — 7G.3 2026-04-12 07:21:53 +09:00
reloop
7c5cdf4c64 feat(exam): 4-button nav + overflow menu + resizable + tag auto — 7G.2 2026-04-12 07:14:32 +09:00
reloop
dcf1eb6021 feat(ocr): vision-based fallback for needsReview problems — 7F.5 2026-04-12 06:29:47 +09:00
reloop
c9935cf303 refactor(parse): extract reusable parser + fix segmentation — 7F.4 2026-04-12 06:15:07 +09:00
reloop
31d62fbe33 feat(study): mock exam flow from KICE problem sets — 7F.2 2026-04-12 05:45:50 +09:00
reloop
35dcf822d2 feat(kice): pdftotext-based import pipeline — 7A.2-7A.8
- scanKiceData: 2025/2026 국어/영어/한국사/생활과 윤리 PDF 스캔
- extractText: pdftotext -raw (problems) / -layout (answers), pdf-parse 폐기
- parseAnswerTable: 홀/짝 분리 + ①..⑤ → 1..5 정규화
- parseProblemPaper: [N~M] passage 범위 + 번호 monotonic 체크
- importKiceSet: ProblemSet/Passage/Problem 멱등 upsert
- seed.ts: DEMO_PROBLEMSET(2024 수학) 제거, User/Subject/Tag 만 유지
- CLI: cli:kice-import --year --subject --only --dry-run --sample

270 problems / 26 passages / 9 problem sets 로컬 검증 완료
2026-04-12 03:45:48 +09:00
reloop
e2e3e4bd6f feat(prisma): kice text fields + Passage model — 7A.1
- ProblemSet.audioUrls Json? (영어 듣기 mp3 배열)
- Problem 에 bodyText/choices/answerNumber/passageId/needsReview 추가
- Problem @@index([passageId]) 로 역방향 조회 보장
- 신규 Passage 모델 (공통 지문 [N~M] 분리용)
- examRound 추가 거부 — 기존 examType 이 이미 'sat'|'mock-june'|'mock-sept'|'academy' 커버
- .gitignore 에 data/kice/ (저작권 자료)

migration: 20260411183246_kice_text_fields
shadow DB INDEX 권한 이슈는 mariadb 에서 GRANT 로 해결
2026-04-12 03:32:59 +09:00
reloop
ddce6c9a85 chore(todo): mark mastery-path + problem-sets for phase7 tier gating — P6-F5 (review minor) 2026-04-12 01:47:19 +09:00
reloop
98875866b0 chore(todo): mark demo credential exposure for phase7 removal — P6-F4 (review minor)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 01:46:07 +09:00
reloop
779e2cfb3c fix(study-logs): validate problemId existence — P6-F1 (review major) 2026-04-12 01:41:54 +09:00