유대선
프로젝트로
·업데이트·2

스파링에 신규 학습 표현 모드 — 낮은 box부터 입으로 꺼내기

복습일이 아직 오지 않은 낮은-box 표현을 우선 주입하고, 부족한 자리는 아직 본 적 없는 카드로 채우는 스파링 모드를 추가했다. 기존 오늘 복습 선택은 바꾸지 않았다.

문제

기존 스파링은 due 카드를 먼저 고른 뒤, 미래 예정 카드를 숙련도와 상관없이 한꺼번에 섞었다. 방금 배우는 box 1 표현과 이미 더 익숙한 표현을 구분하지 않아, “요즘 배우는 표현만 대화로 연습”하는 선택지가 없었다.

구현

공유 core의 partitionLearning이 다음 두 묶음을 만든다.

스파링의 신규 학습 표현 주제는 learning을 우선 넣고 여섯 자리가 차지 않으면 fresh로 채운다. SrsCard에는 생성 시각이 없으므로 “최근”을 임의의 시간 순서로 가장하지 않고, 백로그가 정의한 낮은 box와 미도래 날짜를 기준으로 삼았다. 오늘 복습의 기존 due→known 선택 경로는 변경하지 않았다.

검증 범위

Node 24로 실제 TypeScript helper를 import해 낮은 box 우선순위, 오늘 due 제외, box 2 제외, fresh 보충, 동률 원본 순서, 입력 불변성을 assertion으로 확인했다. 출력은 다음과 같았다.

partitionLearning checks passed: low-box order, due boundaries, fresh, stable ties, immutability

cd mobile && npx tsc --noEmit도 출력 없이 exit 0이었다. iPhone 17 Pro(iOS 26.5)의 local mock UI에서는 learning을 고르면 저-box/미도래 take out, get up이 보이고, overdue put on과 box-2 give up은 보이지 않았다. 다시 기본 due 모드로 진입하면 overdue put on이 계속 보였다. 두 Maestro flow는 exit 0이었다.

구현 커밋: 90d9206.