Tags: OPTIMETA/PAIDEIA
Tags
fix(drills): define one canonical <ts> format for all drill artifacts `<ts>` was never defined, so each drill run improvised: twins/ accumulated both 3.3_20260611_200351_sol.md (underscore) and 3.3_20260611-200703_sol.md (hyphen) for the same problem, mock/chain/quiz used YYYYMMDD_HHMMSS, weakmap used yet another. Each cycle stays self-consistent so /grade still resolved, but the course folder ends up with mixed-format filenames and the naming is one stray format away from a resolution miss. The exam-drill skill (loaded by /quiz, /twin, /chain, /mock, /blind) now pins `<ts>` to `date +%Y%m%d_%H%M%S` — generate it once, reuse the same string for the saved <id>_<ts>_sol.md and the printed answers/..._<ts>.pdf upload name. Verified: /twin now writes 3.4_20260611_214437.md with a matching upload name.
fix(chain): make the bare-<ts> filename rule emphatic at the save step The save step said `chain/<ts>.md` with the no-exam_-prefix rationale tucked into a parenthetical note below it. Driving /chain showed the model still sometimes wrote `chain/exam_<ts>.md` (conflating an exam-style chain with a /mock exam), leaving the saved solution stem (`exam_<ts>`) at odds with the `answers/chain_<ts>.pdf` upload name it prints and the `/grade` rule, and a chain/ folder with mixed stems. Move the "bare <ts>, never exam_" rule inline onto the save lines with a concrete example and the reason, so the stem stays consistent across the saved files, the printed upload name, and grade resolution. (/grade also globs chain/*_sol.md as a fallback, so resolution survived the slip — this removes the inconsistency at the source.)
fix(statusline): point "Pk ↑" at the weakmap priority, not an arbitra… …ry token The statusline focus pattern is meant to be the one thing to drill next, but top_miss() returned the first bare P\d+ token in the newest weakmap. That token comes from the "## Error histogram" table, which is latest-per-pattern in log order — not priority — so the arrow pointed at whatever pattern erred first (e.g. P2 wrong-end-form) instead of the ranked #1 weakness. A looser scan was also liable to read a problem-id ("mock-P5") or a §-anchor as a pattern. top_miss() now reads the Pk from the bold headlines of the priority-ranked "## Top 5 weaknesses" section only — a headline names a real pattern ("**P6 — …**"), while problem-ids and §-anchors live in the prose and are skipped. When the top entries are all §/topic-based (no Pk headline) it falls back to the most-frequent graded error pattern from errors/log.md, never to an arbitrary first token.
fix(grade,blind): make errors/log.md idempotent by source Re-grading the same answer (fix the OCR, re-run /grade) appended a second copy of that attempt's error entries instead of replacing the first, because Step 6 of the answer-processing schema said only "append". Driving /grade twice on one mock left two mock-P1..P5 blocks (10 entries, same source); the weakmap error histogram then double-counts and over-ranks those patterns. Step 6 (the single source of truth that /grade, /blind and /chain all follow) now deletes every existing list item whose source: matches the current source before appending the fresh block, so the log records the latest grading of each source rather than a transcript of every re-grade. A genuinely new attempt still lands under a new source: (a new upload gets a new filename), so only true re-grades of the same file collapse.
fix(cheatsheet): keep ℓ as ℓ, deterministic CJK font, temp build script Three --pdf rendering fixes found by driving /cheatsheet --pdf on a ko course: - LaTeX->text was downgrading \ell to an ASCII l, so the angular-momentum symbol all over the central-force formulas (ℓ²/(2μr²)) read like a lowercase L. CJK fonts (AppleGothic, Nanum, Noto) all carry U+2113 ℓ, so map \ell to the real glyph and only fall back to italic l when the registered font truly lacks it (glyph id 0 = .notdef). - The font candidate list led with AppleSDGothicNeo.ttc, which is CFF on recent macOS and always throws in reportlab (TTFont parses glyf outlines only) — a guaranteed-fail first probe. Reorder glyf-loadable Hangul fonts (AppleGothic, Nanum, Noto) first and document the CFF caveat so the fallback is understood, not mistaken for a missing font. - Build the reportlab script in a temp path (mktemp) outside the course folder. The post-run cleanup of cheatsheet/build_pdf.py was unreliable and left the scratch script in the user committed course folder; a temp script has nothing to clean up.
fix(blind): guard missing reference solution before requesting strategy A blind drill grades the user's strategy against the known solution, but the command only opened that solution at Step 5 — after asking the user for a 3-5 line strategy. When the solution was never ingested (e.g. hw4 has no solutions/ file), the user spent real effort articulating a strategy only to hit a dead end with nothing to grade against. Step 1 now confirms the matching converted/solutions/<n>_sol.md (or the textbook worked-example section) exists before presenting the problem, and stops with concrete next steps (ingest the solution, pick a problem that has one, or switch to /twin or /quiz) when it does not. Also align the Step 5 path with the real <n>_sol.md filename convention.
PreviousNext