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
f4b80d380a
feat(school): organization + class + assignment schema and API — 9.1
2026-04-12 15:33:16 +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
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
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
871ca89da0
feat(phase6): BM tiers + Landing + Pricing + 평가원 기출 ProblemSet — tracks 2/4
...
트랙 2 — BM / Landing / Pricing
- schema.prisma: SubscriptionTier enum(free/pro/school) + User.subscriptionTier
+ User.subscriptionUntil. Migration 20260411161837_bm_and_problemsets.
- auth.service.ts / me.service.ts safeUser/toView 에 구독 필드 포함.
- frontend/lib/api.ts MeUser 에 subscriptionTier/subscriptionUntil 추가.
- app/page.tsx 전면 재작성: 토큰 있으면 /dashboard, 없으면 비로그인 Landing
(히어로 + 왜 ReLoop 3카드 + 페르소나 4장 + 4단계 루프 + 가격 티저 +
FAQ 4개 + footer).
- app/pricing/page.tsx 신규: Free/Pro/School 3 티어 카드(Pro 강조 PopBadge),
월/년 cycle 토글, 기능 비교 테이블(데스크탑 전용), FAQ 5개, 바닥 CTA.
Pro ₩7,900/월, 연간 ₩79,000(2개월 무료), School ₩20,000/월·30시트.
- app/profile/page.tsx: 구독 섹션 + 티어 배지 + pricing 으로 가는 업그레이드
버튼.
트랙 4 — 평가원 기출 ProblemSet 데모
- schema.prisma: ProblemSet + Problem 신규 모델. StudyLog.problemId
(optional, SetNull). 각 ProblemSet 은 (year, examType, subjectName)
복합 unique.
- prisma/seed.ts: 2024학년도 수능 수학 샘플 10 문항 (1/5/8/11/13/15/20/22/
28/30번) 대략치 난이도+정답률로 upsert. 실제 KICE 수치로 교체 가능하도록
주석 명시.
- backend/src/problem-sets/: ProblemSetsModule + Service + Controller.
GET /api/problem-sets (list, subject/year 필터) + GET /api/problem-sets/:id
(문제 배열 포함). JwtAuthGuard 적용.
- study-logs.service/controller: problemId optional 필드 수용.
- frontend/lib/api.ts: ProblemSetSummary/ProblemSetDetail/Problem 타입.
- frontend/app/study/page.tsx 재설계: 상단 탭 [직접 입력 | 문제집에서 가져오기].
문제집 탭은 set 드롭다운 + 문제 리스트 클릭 → title/difficulty/baseCorrectRate
자동 채움 + subjectName 매핑으로 사용자 과목 자동 선택 + topic 을 tag
이름과 매칭. 결과/메모/시간만 수동 입력.
2026-04-12 01:26:35 +09:00
reloop
e8121e5bd0
fix(prisma): relax tag cascade to SetNull — QA-5.fix.C2 + M2
...
- SkillSnapshot.tagId: Int → Int?, Tag relation → onDelete: SetNull
- StudyLog.tag: explicit onDelete: SetNull (was implicit Restrict)
- DashboardService.summary() filters { tagId: { not: null } } so orphaned
snapshots don't leak into the top-skills UI
- Schema header notes that prisma migrate dev --name relax_tag_cascade
must run on Dev VM before deploy
Prevents silent data loss when users delete a tag (previous cascade
erased all skill history for that tag permanently).
2026-04-12 00:08:40 +09:00
reloop
99d5892eb4
chore: reloop-v2 initial import for harness breezing QA
2026-04-11 23:44:22 +09:00