| name | peter-zhou-correction-practice |
| description | 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. |
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, accepts natural-language answers, returns concise grading feedback, and updates the same mastery counters without PDF/HTML generation.
- 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.
- 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.