Hyungi Ahn
13404cd366
feat(study): 같은 유형 과밀 방지 — 출제 단계 spacing (PR-12-B)
학습 의미: 한 quiz 세션 안에서 같은 유형 문제가 과도하게 몰리지 않게 분산.
같은 유형을 없애는 게 아니라 펼치는 것 — dedup/제거 프레임 금지.
- 마이그레이션 210: study_quiz_sessions.quiz_mode VARCHAR(30) DEFAULT 'random'
- ORM: StudyQuizSession.quiz_mode 필드
- service.related_types: apply_type_spacing helper 추가
- SPACING_THRESHOLD=0.88 (회차 무관 — PR-12-A 회차 필터 재사용 X)
- PER_TYPE_CAP=2 (local neighbor cap, transitive cluster 보장 X)
- SPACING_BUFFER_RATIO=2.0
- 3단계 fallback: ready spacing → pending 보충 → hold cap 위반 fallback
- debug 로그 type_spacing_applied subject=... ready=N selected=M ...
- _select_questions_for_topic: subject bucket 단위 spacing (과목 균등 보호)
- QuizMode Enum (random) — 향후 frequent_focus/wrong_variants 예약
- start_quiz_session 에 quiz_mode 받기 + apply_spacing 전달
- 프론트 startNewQuiz body 에 quiz_mode='random' 명시
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 08:45:15 +09:00
..
2026-04-17 08:11:06 +09:00
2026-04-02 15:24:50 +09:00
2026-04-03 09:27:18 +09:00
2026-04-03 10:10:03 +09:00
2026-04-03 10:37:44 +09:00
2026-04-03 13:11:43 +09:00
2026-04-03 13:32:20 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 12:49:45 +09:00
2026-04-06 13:38:07 +09:00
2026-04-06 14:16:00 +09:00
2026-04-07 13:26:37 +09:00
2026-04-07 08:29:12 +09:00
2026-04-07 14:36:22 +09:00
2026-04-09 07:56:50 +09:00
2026-04-10 09:49:56 +09:00
2026-04-10 08:52:26 +09:00
2026-04-13 14:32:55 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:03:35 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-14 08:36:16 +09:00
2026-04-14 14:55:45 +09:00
2026-04-14 15:31:16 +09:00
2026-04-14 15:31:16 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 15:10:01 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:58:58 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 09:14:56 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 12:59:39 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:38:03 +09:00
2026-04-27 12:38:03 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-29 08:45:15 +09:00