Imported from ZeKaiNie/universal-examprep-skill (
full/SKILL.md). Install upstream withnpx skills add ZeKaiNie/universal-examprep-skill --skill full. Copyright stays with the author (MIT).
Universal Exam Cram Coach — Root Router
This language-neutral router dispatches last-minute exam prep to the chapter-wiki, bank-only, persistent control layer and its wording packs; it is not a duplicate manual.
Language dispatch
Read the canonical, language-neutral study_state.json.language code and load the matching compatibility entry plus its per-skill wording pack BEFORE emitting any student-visible output:
zh(display choice中文) →locales/zh/SKILL.mdplus the selected sub-skill's zh wording pack underlocales/zh/skills/en(display choiceEnglish) →locales/en/SKILL.mdplus the selected sub-skill's en wording pack underlocales/en/skills/bilingual(display choice双语) → compose the zh and en wording block by block, with zh first and a> EN:mirror for each block (composition rules indocs/language-policy.md)
中文, English, and 双语 remain accepted user-facing input aliases. On first contact one combined ask sets mode, budget, and language, then show the independent material-processing choice 轻量按需(推荐) / 完整建库; exam_start.py confirm persists them with the exact workspace/materials receipt. Missing, urgent, accepted-default, and legacy processing choices mean lightweight; only explicit full opens complete ingestion. A later reconfirm with no processing flag preserves an existing canonical choice. Later update_progress.py set --language applies next turn. Default English unless the student opened in Chinese; bilingual is explicit-only.
Control layer (behavior)
Behavior lives in skills/exam-cram/SKILL.md and these subskills:
| Sub-skill | Role |
|---|---|
exam-ingest |
Build/validate workspace |
exam-tutor |
Lazy chapter teaching |
exam-study-guide |
Typed guide and visual artifact gate |
exam-quiz |
Bank-only selection/grading |
exam-review |
Replay mistakes/confusions |
exam-cheatsheet |
Final handout |
exam-audit |
Read-only workspace health check |
exam-help |
Quick reference |
confusion-tracker |
Concept-confusion tracking |
Generic-agent fallback: AGENTS.md.
Install & run essentials
- Under
scripts/, useexam_start.py status, thenexam_start.py confirm --course <name> --materials <dir> --workspace <ws> --mode <mode> --time-budget <tier> --language <lang> --processing-mode <lightweight|full>. It writes the confirmation/state/runtime receipt. Defaultlightweight_session.pyinventories names and processes only current-phase PDF pages or definitely single-frame PNG/JPEG/BMP sources through host-native vision: at most eight primary pages and one active batch. A single page uses no contact sheet; multi-page overview sheets partition primary pages in groups of at most four at roughly 768 px per tile. New schema-3 visual receipts require the generic component token strategy and enumerate stable teaching-item IDs plus generictext|figure|mixedprompt/answer components. A cross-page item repeats on each page that supplies one of its prompt components, with exact page↔component coverage. Detail calls may combine only same-target prompt components, solution calls only same-target answer components, and every component crop receives a separate semantic review that detects exactly its declared target/context IDs with no unrelated content or student attempt. Only prompt components may be context-only; every answer component contains its target. Page answer provenance prevents student attempts or unknown pages from masquerading as official solutions, and every registered official-solution page must contribute an answer component. Additiveregister-answer-dependencybinds exact answer-locator pages; planned batches may auditably replace/narrow or remove a binding withset-answer-dependency/remove-answer-dependency. All canonical visible evidence is PNG under.lightweight/assets/, with exact model-input receipts and hash/magic/dimension checks. Schema-2 visual receipts and the legacy figure-only token strategy remain read-only history; any legacy-strategy active attempt is restricted to status or auditable abandon and cannot silently become schema 3. An unfinished planned/visual-ready batch may close only with receipt-backedabandon --reason;replace-taught --reasonpreserves a taught predecessor/event as superseded history, revalidates its dependency revisions, and plans an exact-slice successor with the same dependency pages. After an unabridged walkthrough,mark-taught --taught-item-ids <exact IDs>bindsnotebook/chNN.md#anchor, distinguishes inspected pages from taught items, and recoverably publishesphase_evidence.lightweight_batches; only current unsuperseded attempts enter the completion denominator. Routine status is generation-stable and read-only; validation checks metadata plus physical identity only. Exact hashes are reserved for state transitions, completion, or explicitstatus --verify-live. Lightweightverifiedadditionally requires two revision-bound checkpoints, including one pass, from the immutable stat-only baseline of a quiz bank that pre-existed initialization. It runs no full ingestion, Study Guide, or PDF. Explicitfullopensingest_course.py; the orchestrator and lower-level workspace builder/compiler all enforce the same exact-pair/runtime/choices/full gate. Exit 10 routes to typedingest_review.py.update_progress.pyownsstudy_state.json;study_progress.mdis generated. Official selectors areselect_questions.py/select_hard_questions.py. - Workspace file contract (wiki / quiz bank / state / asset metadata):
docs/file-format.md. - Language policy (single-language purity, EN canonical vocabulary, persisted canonical values):
docs/language-policy.md. - Host loading:
docs/agent-portability.md. - PDF capabilities differ by host; use the audited, no-silent-download routing table in
docs/pdf-capability-adapters.md. - Missing/legacy
artifact_modeischat; explicit standingvisualor a one-shot chapter artifact invokesexam-study-guide, while cheat-sheet PDF usesexam-cheatsheet. An ambiguous PDF request asks which once. Never infer subscription. Persist withupdate_progress.py set --artifact-mode chat|visual. processing_modeandartifact_modeare independent. Lightweight never generates a Study Guide; a savedvisualpreference remains dormant and effective output stayschatuntil explicitfull. Full does not imply a PDF. MinerU, Docling, and LangGraph are explicit-named-request, remote/cloud-host-only capabilities and are never probed, downloaded, installed, imported, executed, or accepted as callable local runners.preferences.interaction_stylestores onlybatch|step_by_step. A stored step-by-step choice is effective only infullwithno_questions=false; otherwise it is retained but dormant and effective cadence isbatch. In effective step mode, select the first pendingteaching_examples.jsonitem from one locked snapshot and persist it through the marker-boundrecord-taught-examplepath. Existing unbound teaching IDs are valid batch history; a bound ID carries exact notebook-block and manifest-item hashes that remain live-validated after cadence changes. Guide publication preserves valid bound blocks and rejects stale or unbound markers. Every teaching-baseline ID must still have a current teaching-manifest snapshot; a quiz-only copy is insufficient.- In an ingestion-v2 structured workspace,
answer_explanation_modeis independent from processing/artifact mode. Its stored-schema fallback isordinary, but full-v2 Guide entry must first perform a native-child capability handshake. When the host can prove a fresh independent child context per item and can restrict its input and tools to that exact item, default toisolatedunless the user opted out; persist the mode, notify once about extra host quota/time, and require no second API key or external-upload consent. Otherwise stayordinaryand explain the limitation. Both routes runstudy_guide_author.py prepare, fill fixed annotations, require one detailed beginner-first explanation per item, persist notebooks, compile, create/attach/verify claims, and import the canonical full Guide. Inordinary, the annotation contains the explanation withai_supplementprovenance and claims no isolation. Inisolated, each fresh/stateless tool-disabled invocation sees only the fixed question, official answer when present, target language, and target-scoped assets; it returnsanswer_explanationplus non-renderedcoverageand is imported with a separate host-owned receipt. A separately billed external Provider is an explicit-user-request fallback only and retains no-upload planning plus exact-plan pricing/privacy/upload consent. A model family, subscription, API key,full, orvisualalone never proves native isolation. Target-scoped meanstarget_item_only, or prompt-onlytarget_with_required_contextwith exact sortedrequired_context_ids; answer assets remain target-only. Packet, annotations, notebook bindings, manifest, rendering and QA all bind the chosen mode. A language/mode/fact/asset change makes the chain stale; onlyisolatedreruns the per-item receipt chain. New v2 Guides omit generic self-check panels. A hand-written complete v2 Guide draft is a no-Python-only, unverified fallback. Ingestion-v1 remains read-only and cannot claim current v2 gates.
