Wiki Log

[2026-05-05] project | aplus-tracker Task 4-3 최종 재검증: 4/5 PASS — 팀 작업 마무리

  • 보고서: wiki/projects/aplus-remediation-task4-result.md
  • 결과: body_md 5샘플 0%, 이미지 59개, DB 112행 (재INSERT됨, 잔존 손상 0%)
  • MC FAIL (단 데이터 한계 — 샘플 PDF에 ①-⑤ 0회), 정답/해설 미적용 확인
  • 범위 확정 (team-lead): 14,467개 대규모 배치 미진행. MC 재테스트·정답 통합은 백로그 이관

[2026-05-04] project | aplus-tracker 수정 후 재검증: 1/5 PASS, 신규 회귀 발생

Type: 수정 후 재검증 (qa-engineer)

결과: 5개 성공 기준 중 1개 PASS — Phase 2A 종료 차단

  • body_md: 평균 damage 20.07%, 손상 16.1% (목표 <5% 미달)
  • DB 저장: 112개 (목표 123개, -11개 회귀)
  • 이미지 추출: 0개 (신규 회귀)
  • P0-E 신규: image_extractor.py:105 pix.n_components AttributeError (PyMuPDF API 오용)
  • P0-D 미해결: 정답/해설 100% 빈 값 (112/112)
  • P1-E 미해결: type=SA 100%, MC=0, difficulty=MID 100%

보고서: aplus-remediation-validation-result


[2026-05-04] project | 샘플 검증 완료: 긴급 이슈 #1 재현, #2 해결, 신규 이슈 3개 발견

Type: 샘플 파이프라인 검증 (3인 팀)

검증 결과 요약 📊

팀 구성:

  • parser-engineer: ZIP 분석 → PDF 파싱 → body_md 검증
  • db-engineer: unit_id 매핑 → DB 저장 → 제약조건 검증
  • qa-analyst: 전체 모니터링 → 추가 이슈 발견 → 최종 보고서

파이프라인 상태:

  • ✅ 파싱: 123개 문제, 41개 이미지 추출 (12.1초)
  • ✅ DB 저장: 새로운 unit_id로 저장 성공
  • ✅ unit_id 매핑: S0111M → E1-1-1 정상 작동 (이미 구현됨)

이슈 재검증:

  • 🚨 긴급 이슈 #1 (body_md 손상): 재현됨 ← 한 글자씩 줄바꿈 패턴 확인
    예: "서술형문제" → "서\n술\n형\n문\n제"
    
  • ✅ 긴급 이슈 #2 (unit_id 제약): 해결됨 ← batch_process_worksheets.py에 convert 함수 존재

신규 이슈 발견 (3개):

  • 🆕 이슈 #3: 이미지 추출 색상 형식 오류 (83% 실패, JPEG 색상 모드)
  • 🆕 이슈 #4: PDF 파일명 인코딩 (한글이 깨짐)
  • 🆕 이슈 #5: 성능 병목 (PDF 파싱 91% 시간 소비)

즉시 필요한 작업

우선순위이슈소요 시간담당
🔴 P0body_md 손상 원인 분석 및 수정2-3일BE
🟠 P1unit_id convert 함수 호출 추가2hBE
🟠 P1이미지 색상 모드 변환1-2일BE

상세 보고서

👉 wiki/projects/aplus-sample-validation-report.md

  • 파이프라인 상세 분석
  • 모든 이슈의 원인, 증상, 영향도
  • 우선순위별 해결책
  • 성능, 보안, 규정 준수 분석

[2026-05-04] project | Phase 3 검수 대시보드 완성 + 데이터 품질 이슈 발견

Type: Phase 3 구현 완료 + 데이터 검증 (긴급)

Phase 3 구현 현황 ✅

백엔드 API (FastAPI)

  • ✅ GET /api/images/{unit_id}/{filename} 구현 완료
    • 저장소: app/routers/images.py (171줄)
    • 이미지 파일 서빙, 보안 검증 완료
  • ✅ PATCH /api/questions/{id} 구현 완료
    • 저장소: app/routers/questions.py (+78줄)
    • human_reviewed=true로 업데이트, status=‘draft’→‘active’ 전환
    • JWT 인증 적용, 409 Conflict 처리

프론트엔드 (Next.js)

  • ✅ /admin/questions/review 검수 대시보드 구현 완료
    • 저장소: web/src/app/admin/questions/review/page.tsx
    • Draft 문제 목록 표시 (12개/페이지)
    • 필터 기능 (unit_id, difficulty, type)
    • 통계 패널 (분포도)
    • 이미지 미리보기
    • 승인 버튼 → PATCH 호출

통합 테스트

  • ✅ API 엔드포인트 모두 정상 작동
  • ✅ 코드 컴파일, 타입 안전성 검증 완료
  • ✅ 보안 검증 (인증, 입력 검증) 완료

검수 대시보드 접근 성공 ✅


🚨 데이터 품질 이슈 발견 (긴급)

문제: body_md (문제 텍스트) 완전 손상

발견 사항

원래 저장되어야 할 형태: "서술형문제2수학1–1"
실제 저장된 형태:
  서
  술
  형
  문
  제
  2
  수
  학
  1
  –
  1

영향 범위

  • 14,467개 문제 모두 body_md 손상
  • text_length: 11-29 (정상이어야 50+ 정도)
  • 글자가 하나씩 \n (줄바꿈)으로 분리됨

손상되지 않은 항목

  • ✅ 메타데이터: code, difficulty, type (정상)
  • ✅ 이미지: 87개 파일 정상 추출
  • ❌ body_md: 모든 14,467개 손상
  • ❌ 텍스트 기반 검수 불가능

원인 추정

  • Phase 2B PDF 파싱 시 개행 문자 처리 오류
  • pdfplumber에서 텍스트 추출 후 한 글자씩 분리됨
  • 또는 데이터베이스 저장 시 인코딩 오류

현재 상태 및 다음 단계

현재 검수 대시보드 활용성

✅ 이미지 있는 문제 (87개): 이미지로 정상 검수 가능
❌ 이미지 없는 문제 (14,380개): 텍스트 없어서 검수 불가능
❌ 텍스트 기반 학습지: 생성 불가능
⚠️  자동 승인도 의미 없음 (손상된 데이터)

필요한 조치

  1. 즉시: Phase 2B 재파싱 실행

    • 원본 ZIP 파일 56개 정상 확인 ✅
    • parser.py 개행 문자 처리 수정 필요
    • 14,467개 재파싱 (소요 시간: 1-2시간)
  2. 검증: 재파싱 후 body_md 정상 확인

    SELECT LENGTH(body_md) FROM question WHERE source='cafe' LIMIT 5;
    -- 결과: 50+ 예상
  3. 재검수: body_md 정상화 후 검수 재진행


기술 스택 & 파일 위치

백엔드

  • app/aplus-tracker/api/app/routers/images.py (NEW)
  • app/aplus-tracker/api/app/routers/questions.py (MODIFIED)
  • app/aplus-tracker/api/app/schemas/question.py (MODIFIED)

프론트엔드

  • app/aplus-tracker/web/src/app/admin/questions/review/page.tsx (NEW)
  • app/aplus-tracker/web/src/app/admin/components/ (NEW)

파싱 스크립트

  • app/aplus-tracker/api/app/scripts/cafe_collector/processor_cli.py
  • app/aplus-tracker/api/app/scripts/cafe_collector/parser.py

체크리스트

  • ✅ Phase 3 API 구현
  • ✅ Phase 3 프론트엔드 구현
  • ✅ Agent Team으로 병렬 개발 완료
  • ✅ 검수 대시보드 접근 성공
  • 데이터 품질 검증 실패 (body_md 손상)
  • ⏳ Phase 2B 재파싱 필요
  • ⏳ body_md 재검증 필요
  • ⏳ 검수 재진행 필요

[2026-05-04] project | aplus-tracker 수정 후 재검증 완료

검증 결과: 5개 성공 기준 중 1개 PASS (재작업 필요)

  • body_md: 평균 20.07