feat: #29 진행 기록 저장 및 speed_factor 재계산 구현 - #30
Conversation
python speed_calibrator.py 현재 구현base_expected_minutes = (task.estimated_min_minutes + task.estimated_max_minutes) / 2 팀 결정은 "속도 계산 기준은 DailyPlanItem.planned_minutes"인데, 실제로는 StudyTask.estimated_min/max_minutes의 평균을 씁니다. planned_minutes는 배치 시점 값이 스냅샷으로 고정돼 있어서(#28에서 estimated_max_minutes 그대로 저장) 나중에 StudyTask 예상시간이 바뀌어도 과거 기록이 안 흔들리는 장점이 있습니다. → log.daily_plan_item.planned_minutes 기준으로 교체 필요.
🟠 코드 자체 버그/설계 결함
python 극단값 하나가 중간 계산 전체를 왜곡시킬 수 있음. 매 blend 단계마다 클램프하도록 수정 추천. 실제 계산 예시로 검산했을 때 결과가 2.0 vs 1.7로 갈렸음(클램프 위치에 따라). |
|
피드백 반영했습니다:
전체 42개 테스트 통과 확인했습니다. 확인 부탁드려요! |
|
일부완료 정책은 actual_minutes + completion_percent를 입력받고, 일부완료 시 완료한 분량의 기준 예상시간은 DailyPlanItem.planned_minutes × completion_percent / 100 으로 계산하고, 실제 공부시간을 해당 값으로 나눈 비율을 따라서 현재처럼 partial을 유효 로그에 포함하는 방향으로 유지하면 됩니다. |
|
MIN_SPEED_FACTOR = 0.5 clamp 값 0.7~1.5 로 수정하고 머지하면 될 듯 합니다! |
|
확인 감사합니다. clamp 범위를 0.7~1.5로 조정했습니다. 추가로, 같은 날짜에 ProgressLog가 여러 개일 때 EMA 계산 순서가 관련 테스트 3개(하한선 clamp, 동일 날짜 정렬 순서 검증) 추가했고, |
|
추가 리뷰 및 일부 완료 정책까지 최종 반영했습니다.
기존의 StudyTask.estimated_min_minutes와 DailyPlanItem.planned_minutes를 배치 당시 예상시간 스냅샷으로 따라서 StudyTask 예상시간이 이후 다시 계산되더라도,
다음 상태는 speed_factor 계산에 포함합니다.
다음 상태는 제외합니다.
NOT_DONE은 실제 학습이 수행되지 않아 학습 속도를 판단할 수 없기
일부 완료 시 사용자에게 다음 값을 입력받는 것으로 확정했습니다.
완료한 분량의 기준 예상시간은 다음과 같이 계산합니다. completed_expected_minutes 관측 속도 비율은 다음과 같이 계산합니다. observed_ratio 따라서 PARTIAL도 현재 구현처럼 유효 로그에 포함합니다.
recorded_at은 수정 시점에 따라 순서가 달라질 수 있으므로, 같은 날짜에 여러 로그가 존재할 때도 EMA 결과가 결정적으로 유지되도록 DailyPlan.date
speed_factor clamp 범위를 0.7~1.5로 조정했고, 관련 테스트를 추가했으며 planner 테스트 44개 전체 통과 확인했습니다. |
관련 이슈
Closes #29
작업 내용
DailyPlanItem에 대한 학습 진행 결과를 저장하고, DailyPlanItem/DailyPlan 상태 및 speed_factor를 갱신
구조
핵심 정책
이번 PR 범위 밖
테스트