Skip to content

Tags: OPTIMETA/PAIDEIA

Tags

v0.9.12

Toggle v0.9.12's commit message
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.

v0.9.11

Toggle v0.9.11's commit message
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.)

v0.9.10

Toggle v0.9.10's commit message
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.

v0.9.9

Toggle v0.9.9's commit message
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.

v0.9.8

Toggle v0.9.8's commit message
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.

v0.9.7

Toggle v0.9.7's commit message
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.

v0.9.6

Toggle v0.9.6's commit message
PAIDEIA v0.9.6

v0.9.5

Toggle v0.9.5's commit message
PAIDEIA v0.9.5

v0.9.4

Toggle v0.9.4's commit message
PAIDEIA v0.9.4

v0.9.3

Toggle v0.9.3's commit message
PAIDEIA v0.9.3