# Peter Zhou Correction Practice

> Generate and print correction practice, then grade returned answer sheets. Use for CorrectionPaper PDFs, PDF/PNG printing, original redo, generated similar practice, PracticeQuestionRecord lifecycle, returned scan/photo/PDF grading, and mastery counters.

- Skill: `szsip239/peter-zhou-correction-practice` (Agent Skill)
- Install (CLI): `npx skillmds@latest add szsip239/peter-zhou-correction-practice`
- Raw SKILL.md: https://api.skillmd.com/api/skills/szsip239/peter-zhou-correction-practice/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: szsip239 (https://skillmd.com/u/szsip239)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/szsip239/peter-zhou-correction-practice

---


# Correction Practice

Use this subskill when the user wants a correction paper, similar practice, or returned-paper grading.

Core contract:

- Use `scripts/workflow.py start --kind correction_paper` for the normal printable-paper generation path. The workflow selects mistakes, requests printability review when needed, then asks the Agent for one bounded `correction_practice_candidate.v1`; scripts validate and persist it before rendering. `--candidate <json>` remains a compatibility/testing input.
- Use `scripts/workflow.py start --kind agent_chat_review` for “今日 10 分钟复习”. It asks one original redo plus 2-3 transfer questions one at a time. Show only `next_action.question`; read `agent_context_ref` privately, return `agent_chat_item_grading.v1`, and resume once with both the natural-language student answer and grading file. The script returns concise feedback and updates the same mastery counters without PDF/HTML generation. The historical answer-then-grading two-resume path remains compatible for existing runs.
- If correction selection is empty, accept the workflow's deterministic `completed`/`no_op` result. Do not ask the Agent to generate practice from an empty list.
- Prefer currently non-mastered wrong questions. Questions whose latest original redo is wrong are marked `needs_repeat_correction`, selected before ordinary low-score questions, and must receive the original redo plus at least one linked transfer question in the next paper.
- Check `scripts/learning_profile.py show --data-dir <dir> --json` before generating personalized practice. Use grade/stage, difficulty preference, and weak subjects when present; if missing, ask/persist the first-use profile only when it materially affects the request.
- Use `scripts/correction_practice.py generate` to create correction-paper metadata, generated practice records, and printable student PDFs without answers or grading keys.
- Before any PDF is rendered, let the normal workflow complete its `printability_review` Agent task. Check every selected original question against its raw crop, clean stem/context/options, answer basis, and student-facing assets. Return `correction_printability_review.v1`; scripts persist the decision and a content fingerprint through `visual_asset_repair.py apply-print-review`.
- Never bypass the printability gate with the compatibility `generate` command. It rejects unreviewed or stale questions. Rejected questions are excluded from selection; changing the stem, context, formula data, asset metadata, or asset bytes invalidates an earlier approval.
- Use `scripts/print_paper.py` as the only printer interface. `discover` lists configured queues and Bonjour/IPP printers; `setup` creates an explicit driverless IPP queue only when needed; `print --dry-run` validates the asset and returns the A4/one-sided/monochrome plan; `print` submits it through CUPS and returns the job id.
- Print only complete `.pdf` or full-page `.png` assets whose file headers validate. Existing CorrectionPaper PDFs match this contract. Do not print HTML, source scans, raw wrong-question crops, or individual `student_facing_assets[]` as if they were complete papers.
- Default to A4, one-sided, monochrome, one copy. Use color or additional copies only when the user explicitly requests them.
- A direct instruction such as “打印这份试卷” authorizes the physical print side effect. Otherwise show the dry-run plan and ask once before submission. Generating a paper never implies printing it.
- Prefer an existing discovered CUPS queue. Do not hard-code a printer hostname, URI, or machine-specific queue name in the skill. Run `setup` only when discovery finds the network printer but no usable queue.
- Use `scripts/correction_practice.py render-html` when the user wants an electronic correction paper. The HTML page should save browser drafts and download an `AnswerSubmissionBundle` with `submission_source=correction_paper_html`; it must not embed answer keys, solution notes, or raw wrong-question crops.
- Render the PDF like a normal practice paper, not like a form table: use a clear paper header, numbered questions, K12-style difficulty sections, and answer areas under each question.
- Do not put raw wrong-question crop screenshots in student PDFs; they can leak original answers or teacher corrections.
- Original redo items must come from clean reconstructed question text. For visual questions, the full stem is `original_question`; printable visual data comes from `student_facing_assets[]`.
- Student-facing redo items use the correction paper's own numbering. Do not print the source paper's original question number/section label in the item title or at the start of the stem.
- Question numbers should be followed directly by the question content. Do not print source paper names, page numbers, wrong-question ids, linked-practice ids, or knowledge-tag metadata on student papers.
- When `context_text` is present, print it as part of the question content before `original_question`; do not label it as metadata.
- Multiple-choice options should render inline with extra spacing when the option group fits on one line. If the stem is long, put the whole option group on the next line while keeping A/B/C/D inline; put A/B/C/D on separate lines only when the option group itself is too long.
- Do not print helper text such as `参考信息：...` inside the stem; visual data belongs in `student_facing_assets[]` and the student should read the figure/table directly.
- The renderer may embed `student_facing_assets[].asset_ref` images from `student-assets/`, but must never embed `crop_image_ref` from `mistake-crops/`.
- Student-facing visual assets must come from safe true-image crops first, then reviewed `diagram_spec`/SVG redraws for geometry-style figures. Do not use generated-image replication as printable assets.
- A file existing under `student-assets/` is not proof that it is correct. Native-vision printability review must verify labels, values, geometry relationships, crop completeness, contamination, and consistency with the student-visible stem before the asset can be printed.
- If a visual question has no safe `asset_ref`, render the textual reconstruction in `student_facing_assets[].content`.
- When rendering PDFs, beautify common math notation from stored natural text or LaTeX-style snippets: `^`/`^{}` as superscript, `_`/`_{}` as subscript, `\sqrt{}` as radical text, `\frac{}{}` as compact fractions, and common operators such as `<=`, `>=`, `\times`.
- Keep answer areas sized by question type: choice and short-answer items get compact blank space, while calculation, proof, explanation, and visual-data items get more blank working space.
- Store durable correction-paper generated non-original questions as single-subject `PracticeQuestionRecord` entries.
- Use `scripts/correction_practice.py build-returned-prompt` before reading returned scans/photos/PDFs with model-native vision.
- Use `record-original-attempt` and `record-practice-attempt` so scripts update attempts and mastery counters.
- For electronic HTML submissions or normalized returned scans, stage answers with `scripts/submission_intake.py import`, build the agent grading prompt with `build-grading-prompt`, then persist only through `apply-grading`. The prompt builder sends submitted answers once and deduplicates minimal canonical grading targets; do not append full mistake-bank or submission records.
- All answer sources use `answer_submission_bundle.v1`: explanation HTML, knowledge HTML, correction-paper HTML, returned scans, and Agent chat. Failed inbox submissions are preserved with `submission_intake.py mark-failed`; they are never silently discarded.
- Original redo and linked transfer answers each award exactly `1.0` mastery point when correct. Never calculate or paraphrase points from memory: report `grading_summary.items[].mastery_changes[]`. A wrong latest original redo preserves historical score but derives `currently_mastered=false` and `needs_repeat_correction=true` until a later original redo is correct.

