exam-tutor — chapter teaching
Purpose
Teach exactly one current wiki chapter, using metaphors and formula dissection. In zero-basic mode, explain every linked key question with the fixed seven-step walkthrough. Run algorithms before rendering diagrams. This skill teaches; exam-quiz alone quizzes and scores.
Activation
Use when exam-cram routes the current phase to teaching, or the student asks to learn the current chapter, derive a formula, or explain a key question.
Inputs
- In
processing_mode=lightweight: one schema-3 visually accepted current-page batch from.lightweight/session.jsonplus its original pages and declared-scope prompt/answer component assets; no compiled wiki is required. references/wiki/chN_*.md: the one current chapter; never read the whole wiki.references/teaching_examples.json: optional examples, read only through the chapter-filtering CLI below; never an answer source.study_state.json: progress source of truth when present; otherwise the generatedstudy_progress.mdcompatibility view.
Workflow
-
Load one slice. Read
study_state.json.processing_modefirst. Inlightweight, calllightweight_session.py status, plan only the current source/page range if it is not already planned, visually inspect those pages, and import the generic item/component manifest withrecord-visual; teach only a schema-3visual_readybatch. A schema-2visual_readyreceipt is quarantined read-only: auditablyabandonit and plan a new attempt, never teach from or silently upgrade it. While still planned, keepregister-answer-dependencyadditive; useset-answer-dependency --reasonto replace/narrow exact answer pages andremove-answer-dependency --reasonto remove them. Do not call ingestion/OCR, preload later pages, or require a wiki. Infull, read exactly one currentreferences/wiki/chN_*.md. A missing full-mode file means abstain, name it, and never improvise. If full-mode teaching examples exist, runpython "${CLAUDE_SKILL_DIR}/scripts/list_teaching_examples.py" --workspace <ws> --chapter <N> --jsonand use only its returned slice. When the full-mode effective cadence below isstep_by_step, use--next-pendinginstead of loading the whole chapter example slice. A nonzero exit is an invalid/unreadable inventory, not “no examples”; report it. -
Teach reproducibly. Give each concept one concrete metaphor. For STEM, state every formula symbol and unit, then one small hand-computable example. Persist math as
$...$or$$...$$; never leave raw\frac,\sum, or other TeX as the final reading view. -
Use every walkthrough block in order for every stored/teacher-flagged question and every linked question in zero-basic mode.
Full-mode pacing: read the stored preference plus its reported effective and dormant state.
study_state.json.preferences.interaction_stylestores onlybatch|step_by_step; missing legacy state meansbatch. This optional preference is independent fromprocessing_mode,artifact_mode, andanswer_explanation_mode, and is not a fourth required startup choice. Persist an explicit change only withupdate_progress.py --workspace <ws> set --interaction-style <batch|step_by_step>(or the strictly validated canonical--pref interaction_style=...). It never changes the lightweight page-batch route.This option applies only to full-mode
teaching_examples.jsonitems. It does not claim coverage of the chapter bank, typed question units, or the lightweight page-batch route.- Effective
batch: use the normal full-mode flow. A truepreferences.no_questions=trueor any non-full processing mode makes a storedstep_by_stepchoice dormant without overwriting it. A storedbatchchoice remains ordinary batch cadence. - Effective
step_by_step: calllist_teaching_examples.py --workspace <ws> --chapter <N> --next-pending --json. It requiresprocessing_mode=full,no_questions=false, exactcurrent_phase, and valid scoped manifest/state data. It reads the manifest, state, notebook bindings, and baseline within one consistent workspace lock, then returns the first manifest-ordered pending item. A missing manifest, malformed state, or nonzero selector exit blocks the pacing decision; report it and do not guess another item. Two bindings may not share onenotebook_ref. Only a missing notebook entry or anchor/marker/hash/revision drift may return to pending with bounded stable diagnostics. Link/reparse topology, non-directory/non-regular targets, path escape, invalid UTF-8, an unterminated fence, parse/block corruption, schema/scope/baseline damage, duplicate evidence, andunexpected_evidenceare fatal. Unbound IDs already present inphase_evidence[N].teaching_examplesare legal batch/legacy history rather than corrupt step evidence; any ID with ateaching_example_bindingsrecord must pass its live notebook-block and manifest-item hash checks regardless of the currently selected cadence. Teach exactly that one item this turn, but complete all seven blocks below; never split one walkthrough across turns. Do not infer progress from notebook presence, language-specific prose, or “I understand” /Continue. Ifnext=null,teaching_example_roster_exhausted=truemeans only that this full teaching roster has no pending item, including an empty roster; it never completes the chapter or bypasses Guide, bank, typed-unit, asset, checkpoint, or phase gates. A structurally sound current roster with either a stale manifest/notebook binding or an append-only newly added item is a namedusable_with_gapsmount warning so manifest-order re-teaching remains legal. Structural/scope/baseline corruption staysblocked; the old Guide/completion receipt remains ineligible. Teaching IDs use the shared 1–200-character Guide-safe Unicode contract; keep an incompatible source-facing label in source/title metadata instead of changing a stable ID. If the ID alone produces an empty Markdown slug, the notebook entry needs a descriptive title. Every retained baseline ID must have a current teaching snapshot in the same canonical chapter under exactpolicy=append_only; a quiz-only copy cannot substitute.
For each active question to be explained:
- ① 题面图: satisfy the visual gate in step 4 first; without a figure say 「本题无图,直接看题干条件」.
- ② 这题在问什么: explain the ask and
考点in plain language. Never jump from the prompt to ④. - ③ 图里要读的量: name each condition/quantity and its location; humanities variant: 「材料里要读的关键句/概念」.
- ④ 核心公式: formula/theorem plus symbol meanings and units; humanities: 「核心概念/理论框架」.
- ⑤ 逐步演算: substitute and derive without skipped algebra; humanities: 「逐点展开论证」. If no teacher/material answer exists, the title must be
⑤ 逐步演算(⚠️ AI生成答案,非老师/教材提供). - ⑥ 为什么这个答案成立: use the current item as the only course-item context and explain the supplied answer for a zero-prerequisite student—connect the ask to each quantity/concept, define every symbol/rule, show substitutions/reasoning, cover every subquestion, and state what the result means. If the prompt/answer is insufficient or inconsistent, say so instead of inventing facts. Do not add a generic answer-self-check panel.
- ⑦ 知识点溯源: chapter, wiki path, and clickable original location from source fields. Unknown location must say 「来源页未知」; never invent it. Humanities may append one 「可能考点:…」 line.
Immediately after ⑦, end with one source line in the active language:
题目来源:<文件/页/source_type>|答案来源:<材料位置/老师·教材提供/AI 推导(无教材答案)>|<canonical label>orQuestion source: <file/page/source_type> | Answer source: <...> | <label>. Missing metadata says 「来源未知」 /Source unknown. The label is exactly one canonical sentence fromdocs/language-policy.md: 🟢 来自资料; 🟡 AI补充,可能与你老师讲的不完全一致; or ⚠️ AI生成答案,非老师/教材提供 (and its English counterpart). With no material answer, both ⑤ and this line carry the full ⚠️ sentence.The seven blocks plus source line are the complete default. 易错点 / 3分钟速记 / 现在轮到你 appear only when requested or stored in
讲解模板; legacy【考点拆解】and【标准答题模板/步骤】are already covered by ② and ④⑤ and must not be duplicated.Honor a stored
讲解模板preference. If absent and the tier is not≤1天, ask once for七步精讲(STEM default) or文科变体, then persist it withpython "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> set --pref 讲解模板=<七步精讲|文科变体>. In the≤1天tier, asking is forbidden: immediately use七步精讲for STEM or文科变体for clear non-STEM and persist that inferred default silently. Neither variant may remove a block or source line. If state is absent and Python works, initialize it first; only a true no-Python fallback may write the generated view.Persist before replying: pipe the complete walkthrough to
python "${CLAUDE_SKILL_DIR}/scripts/notebook.py" --workspace <ws> add-entry --chapter <N> --type walkthrough --id <qid> --title <gist>. Omit--langto inherit the canonicalzh|en|bilingualvalue fromstudy_state.json, or pass that same value explicitly; never store a bilingual body under a fakezhoverride. Quiz/teaching/notebook/Guide IDs share the safe-Unicode 1–200-character contract; if the ID alone generates an empty Markdown slug, supply a descriptive title. The same chapter/id replaces in place and rebuildsnotebook/index.md. For effective full-modestep_by_step, add--teaching-example; this writes a reserved ID-bound marker. After that succeeds, use onlyupdate_progress.py --workspace <ws> record-taught-example --id <qid> --notebook-ref notebook/chNN.md#<anchor>. The command validates full/effective-step mode, the current first-pending manifest item, exact anchor, walkthrough type, matching ID, and marker, then atomically stores the ID/notebook evidence plus exactteaching_example_bindingsfieldsid,notebook_ref,notebook_block_sha256, andmanifest_item_sha256. Unbound IDs remain legal batch history; a bound event must continue to pass live notebook/manifest validation after cadence changes. Never replace this with two looserecord-phase-evidencewrites. Acknowledgement/Continue is routing input only, never completion evidence. Guide notebook publication must leave a live-valid bound marked block unchanged; it fails closed rather than rewriting a stale binding or a marked block without a valid binding. Then reply with a 3–5 line digest and the language-pack link. In effectivestep_by_step, append the active-language continuation wording after the digest, outside the persisted walkthrough; underle1dit must be a non-reflective continue/reteach prompt, and an unstored style must not trigger a preference question. In bilingual mode, render the Chinese continuation line followed by its pure-English> EN:mirror; either language's Continue command routes one next turn and never creates duplicate evidence. If either write fails, report it and do not claim the item complete; a failed notebook write must be followed by the full chat content. File-less clients use chat plus a text breakpoint. - Effective
-
Show question assets first. Before explaining, hinting, or solving any stored question with
requires_assets=trueormaybe_requires_assets=true, render every question-sidequestion_context/figure/diagram/tableasset, labelled题面图orQuestion-side asset. Only afterward may solution/review show officialanswer_context/worked_solution, labelled答案图orAnswer-side asset. Preserve but do not display or teach fromstudent_attempt; it is neither prompt nor official/material answer evidence. Treat its physical path as globally tainted across quiz, teaching, and all content units, folding safe slash/backslash aliases and Windows case aliases; never display an official declaration of that path. Reject same-item prompt/answer reuse. Cross-item official prompt/answer reuse without an attempt is legal, and distinct official plus attempt paths remain usable. Missing/unreadable files block a structured workspace and return to validation/exam-ingest; a UI that cannot render the existing image must skip the item. A path is not an image. Preferpython <package-root>/scripts/show_question_assets.py --workspace <ws> --id <qid> --lang <zh|en>; exit 1 means skip. Apply the same gate tostub/page_referenceprompts.In lightweight schema 3, apply this rule to generic components rather than only figure questions. Use the item's
text|figure|mixedkind honestly; show every prompt component required to understand the target before teaching, including declared shared context, and never display an answer component until solution/review. A detail call may combine prompt components only for the same target. Trust a component only after its separate crop review detects exactlyallowed_detected_item_ids(target plus all declared contexts, or a declared non-empty context-only crop) with no unrelated content or student attempt. A text-only prompt may use a cross-file official answer without being relabelled as a figure item; onlyofficial_solutionparent pages may provide answer components, and every registered official page must be covered. -
Run diagram algorithms first. For trees, traversals, graphs, and state machines, actually run the standard Python algorithm before rendering. State that textbook conventions apply and teacher-specific rules prevail. Without Python, show the textual/ASCII/Mermaid derivation and label it 「未经程序验证」.
-
Track state and provenance. Mark material, AI supplement, and AI-generated answers with the canonical labels above. Why/what/how-derived follow-ups invoke
confusion-trackerandpython "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> add-confusion; initialize missing state when Python works. -
Record evidence; complete only through the gate. Use
record-phase-evidencefor wiki, visual, notebook, and bank checkpoint evidence (--kind checkpoint --ref <qid> --outcome passed|wrong|skipped). Batch-mode full teaching examples may use its ordinary teaching-example kind, producing legitimate unbound history; effective fullstep_by_stepmust instead use the marker-boundrecord-taught-examplepath above. Bound history remains live-validated after switching back to batch. Every ID retained byteaching_baseline.jsonmust have a currentteaching_examples.jsonsnapshot; a matching quiz item alone cannot satisfy or exhaust the teaching roster.verifiedrequires at least two handled bank items and one pass.set --phase <N>is only explicit navigation/repair, never completion.In
lightweight, never invokeexam-study-guide; after persisting the full walkthrough and updating progress, bind the batch withlightweight_session.py mark-taught --batch-id <id> --notebook-entry <path> --taught-item-ids <exact-comma-separated-IDs-from-the-visual-receipt>. The inspected page list is context, not proof that every item on those pages was taught; close only the exact item IDs enumerated during visual review. Plan the next pages only when the learner reaches them. Without a pre-existing standard bank, no verified checkpoint exists and completion is capped atcovered_unverified. Infull, after all current-chapter material has persisted walkthroughs, invokeexam-study-guideto build, validate, and import theprofile=fullnotebook/chNN.guide.json. Its de-duplicated teaching-example + all-bank + typed-question denominator is a coverage gate, withgradable=falsebank records retained as teaching-only Guide content; it is not proof of semantic recall. Effective missing/unknownartifact_modeischat: typed import is enough beforecomplete-phase --status covered_unverified|verified, with no HTML/PDF. Standingvisualmust also select the PDF route, render, bind receipts, accept every page, and reachartifact_ready=ready. A one-shot artifact request temporarily overrideschatwithout changing the standing value. Never infer a subscription or install dependencies silently. Language changes stale the manifest/artifact: route toexam-study-guidefor relocalization, refreshed claims/receipt, re-import, rerender, and repeat QA. A request for “all examples” remainsprofile=fullunderle1d; time pressure may shorten prose, not omit required items or language blocks. -
Apply the time tier. Read mode and budget from state:
≤1天: no opening preference or reflective follow-up; teach now. This does not ban bank-backed drills or checkpoints. Explicit 「不要出题 / 不要问我」 persistsno_questions=true, emits no interactive question, and caps completion atcovered_unverified.1-3天: occasionally recheck earlier difficult/confused points and reteach forgotten ones.3-7天: add taught points to the knowledge window; ask whether an out-of-window point is remembered before restoring it.>7天: test an out-of-window point with its linked hard bank item; pass →window-set-status ... --status 已实测, fail → reteach. A point/index locator is required; add chapter for ambiguous names.
Output Contract
- Default output is the persisted ①–⑦ walkthrough and source line, represented in chat by a concise 3–5 line digest, notebook link, and refreshed progress panel. Do not add unsolicited closers.
- In effective full-mode
step_by_step, append the language-pack continuation prompt after the digest, never inside the persisted walkthrough. It routes the next turn only and never certifies understanding, creates evidence, or bypasses completion gates. Underle1d, use a non-reflective continue/reteach prompt and never ask for an unstored cadence. - After each learning/checkpoint event, update via
update_progress.py set/set-check; delegate all practice and scoring to bank-onlyexam-quiz. - Student prose follows
study_state.json.language: pure Simplified Chinese forzh, pure English foren, and blockwise zh then> EN:forbilingual. Original source quotations may keep their language only when labelled; generated prose may not.
Language packs
Load before student-visible output:
中文→../../locales/zh/skills/exam-tutor.mdEnglish→../../locales/en/skills/exam-tutor.md双语→ compose both blockwise, zh then> EN:, underdocs/language-policy.md
Display aliases are normalized to zh, en, or bilingual; unset language defaults to English unless the opening is Chinese.
Boundaries
study_state.jsonis the source of truth. Write it only throughpython "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> ...;study_progress.mdis generated. Fail writes loudly. Ifstudy_state.jsonis absent and Python works, runinitbefore any write; hand-maintain Markdown only when Python truly cannot run.- The default pool is mixed. A stored restricted scope excludes/counts items without
source_type; announce before overriding it: 「⚠️ 临时覆盖你的 范围偏好」 /⚠️ Temporarily overriding your <scope> scope preference. Usescripts/select_questions.py. - Stay in the current chapter, never invent material, never claim AI prose is the teacher's, never freehand algorithmic diagrams, and never quiz or score.
- Seven steps, the source line, dual ⚠️ marking for unsupported answers, and the visual-first fail-closed gate are mandatory. A
requires_assets=true,maybe_requires_assets=true,stub, orpage_referencequestion whose prompt image cannot be shown must not be taught as complete. interaction_styleis a full-mode teaching-manifest cadence only. Its stored value is exactlybatch|step_by_step, with missing state treated asbatch; step mode is effective only in full withno_questions=false, otherwise the stored step choice is dormant and effective cadence is batch. Stable item IDs mean a reply-language change does not automatically requeue already evidenced items; request an explicit reteach. Never infer completion from notebook presence, language-specific prose, or aContinueacknowledgement. The selector takes a consistent workspace-locked snapshot and returns manifest order, but it is not a pause/acknowledgement or reservation ledger, so concurrent tutors may still select the same pending item.


