answer-processinglisted
Install: claude install-skill OPTIMETA/PAIDEIA
# Answer Processing
## When to load
- User uploads an answer PDF and asks to grade it
- `/grade` is invoked
- User says "I finished the quiz, here's my work"
## Core pipeline
```
answers/<quiz-name>.pdf ← user uploads hand-written scan
↓ (pdf skill, OCR)
answers/converted/<quiz-name>.md
↓ (this skill)
grade report → stdout (compact) + errors/log.md (append)
```
## Step-by-step procedure
### Step 1: Locate the answer file
If `/grade` was called with an argument, use it as a hint. Otherwise find the most recently modified file in `answers/` (not `answers/converted/`).
### Step 2: Convert PDF to MD (if PDF)
**Use the `vision-ocr` skill** — delegates to a local VLM (Qwen3-VL 8B via ollama) for clean prose + LaTeX transcription (the script reads `INTERFACE_LANG` from `.course-meta` so the VLM keeps the handwriting in its original language), with pytesseract as automatic fallback.
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/vision_ocr.py" answers/<name>.pdf answers/converted/<name>.md
```
The script handles model warmup, page-by-page inference, and tier fallback. See `.claude/skills/vision-ocr/SKILL.md`. The output header tells the grader which tier produced the text:
- `<!-- SOURCE: ..., qwen3-vl:8b @ 300dpi, N pages -->` → high-confidence
- `<!-- TIER: tesseract fallback -->` → degraded; treat results conservatively
### Step 3: Graceful handling of OCR noise
Hand-written math OCR will be imperfect. Expect:
- Greek letters misread as Latin ($\alph