<feed xmlns='http://www.w3.org/2005/Atom'>
<title>org-drill, branch main</title>
<subtitle>Spaced-repetition flashcards for Org Mode
</subtitle>
<id>https://git.cjennings.net/org-drill/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/org-drill/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/'/>
<updated>2026-05-31T16:18:49+00:00</updated>
<entry>
<title>feat: optionally show the card's outline path in the drill prompt</title>
<updated>2026-05-31T16:18:49+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T16:18:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=e201ba696ed27e407d934321a5f4c5874ea4fee5'/>
<id>urn:sha1:e201ba696ed27e407d934321a5f4c5874ea4fee5</id>
<content type='text'>
A new defcustom org-drill-show-outline-path-during-drill (default off) prepends the card's ancestor path to the mini-buffer prompt, for example [Spanish &gt; Greetings], so during a drill you can see where the current card sits in the deck. With it off the prompt is byte-for-byte unchanged.

I ported this from m.galimski's fork (commit c6d0c850) and gated it behind the defcustom rather than leaving it always on. The path comes from org-get-outline-path through a small org-drill--outline-path-string helper. Tests cover the helper (nested and top-level), the prompt with the switch on and off, and the default value.
</content>
</entry>
<entry>
<title>docs: fix README default-scheduler marker (simple8, not SM5)</title>
<updated>2026-05-31T16:11:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T16:11:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=37df84a462378636f6528970e95187c3a86f8f3e'/>
<id>urn:sha1:37df84a462378636f6528970e95187c3a86f8f3e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: add statistics dashboard CSV export and docs</title>
<updated>2026-05-31T15:46:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T15:46:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=27385697fbf60e3319a598bb509197f5579c9405'/>
<id>urn:sha1:27385697fbf60e3319a598bb509197f5579c9405</id>
<content type='text'>
org-drill-statistics-export-csv, bound to e in the dashboard and now implemented, writes three files into a chosen directory honoring the active scope and range: sessions.csv (one row per recorded session), cards.csv (one row per drill card in scope with its scheduling properties and computed status), and daily.csv (per-day reviews, passes, fails, pass percent, and duration). Fields are quoted per RFC 4180 by a small csv-quote helper, since csv-mode isn't a dependency. This is the dashboard's last piece, step 3 of the spec.

The row builders for the three views are pure and unit-tested with deterministic fixtures, and csv-quote covers the comma, quote, and newline cases. I documented the dashboard and the export in org-drill.org (a new section with the keymap, the CSV columns, and the settings table) and added a feature bullet to the README.

I also removed the now-redundant declare-function forward reference for export-csv. It named this file as the source, so once the real defun landed the byte-compiler counted the function twice and warned.
</content>
</entry>
<entry>
<title>feat: add the org-drill statistics dashboard renderer</title>
<updated>2026-05-31T13:35:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T13:35:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=26cc4472dea261a1ad13fbee8fb6a91b019f77bb'/>
<id>urn:sha1:26cc4472dea261a1ad13fbee8fb6a91b019f77bb</id>
<content type='text'>
Step 1 shipped the session-log data layer. This is the renderer on top of it.

org-drill-statistics opens a read-only dashboard with five sections: an overview (card counts plus a last-session recap), trends (reviews-per-day and pass-rate-per-day quadrant-block sparklines over the trend window, plus a 12-week table), a quality histogram, a needs-attention view (leech candidates, long-overdue, and forgotten-new cards), and a 7-day forecast counted from SCHEDULED dates. A buffer-wide filter (scope, range, algorithm) sits in the header and cycles with s/r/a. The other keys are q to bury, g to refresh, e for the CSV-export hook that lands next, and RET to follow the card link at point.

The aggregation math lives in pure helpers (day-bucketing, sparkline scaling, weekly aggregates, the histogram, the attention selectors, forecast bucketing). The render helpers are thin string formatters over them, so the logic is unit-tested independently of the UI. New defcustoms tune the views: org-drill-statistics-trend-days, -forecast-days, -attention-row-limit, and -leech-quality-threshold.

I added require 'calendar for the Monday week-start arithmetic in the weekly aggregates. CSV export and the manual and README entries are the step-3 follow-on.
</content>
</entry>
<entry>
<title>docs: fold Review 2 into the FSRS spec (Response 2)</title>
<updated>2026-05-31T12:55:46+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T12:55:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=532ce532465834ce06238648ba1490c48bed29ca'/>
<id>urn:sha1:532ce532465834ce06238648ba1490c48bed29ca</id>
<content type='text'>
Review 2 (Codex) flagged three blockers in my Response 1, and two were mine to own. I'd reversed DRILL_CARD_WEIGHT: I described SM as multiplying the interval when it actually divides the delta, so weight 2 means more frequent review, not less. And I'd locked a quality mapping that both claimed to honor org-drill-failure-quality and hard-coded a fixed table.

Craig's calls: FSRS matches the existing SM/Simple8 delta interpolation for weight, and honors org-drill-failure-quality for the Again boundary with a fixed Hard/Good/Easy sub-mapping. I fixed both throughout the spec and grounded each claim in the cited org-drill.el line so the description can't drift again.

I also reframed the status to "Needs research" with the three real prerequisites stated honestly (pin the py-fsrs source, cross-check the equations, generate the reference vectors), fixed DRILL_LAST_REVIEWED ownership back to the shared reschedule flow, and noted that fsrs has to join the algorithm defcustom and the safe-local whitelist. The review file is committed alongside the spec as the audit trail.

The spec is still not implementation-ready, and now says so plainly.
</content>
</entry>
<entry>
<title>feat: add org-drill-treat-headline-as-card-p for empty-bodied cards</title>
<updated>2026-05-31T11:53:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T11:53:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=bafa281b9c0b3ccc78b4a8420a817662d50ca86f'/>
<id>urn:sha1:bafa281b9c0b3ccc78b4a8420a817662d50ca86f</id>
<content type='text'>
A drill entry with an empty body is skipped unless its card type opts into empty bodies via the DRILL-EMPTY-P slot of org-drill-card-type-alist. That left no global way to drill headline-only items, or hierarchical-notes decks where the heading is the question and the answer lives in child entries (upstream #30, #41).

I added org-drill-treat-headline-as-card-p, default nil so existing decks are unchanged. When it's on, the empty-skip gate in org-drill--entry-empty-and-not-empty-friendly-p short-circuits, so every empty-bodied entry is drilled with its heading as the question regardless of card type. I added the safe-local-variable booleanp declaration alongside the other booleans and documented the switch in org-drill.org.

Tests pin the predicate and the classify-status outcome both on and off, and confirm the per-card-type DRILL-EMPTY-P path stays independent of the new switch.
</content>
</entry>
<entry>
<title>docs: archive 2026-05-30 follow-up to upstream maintainer</title>
<updated>2026-05-31T11:05:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T11:05:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=79f454cbfcfcf61bae34a9fdf85841617e2b1c00'/>
<id>urn:sha1:79f454cbfcfcf61bae34a9fdf85841617e2b1c00</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: detect #+FILETAGS decks so org-drill-mode auto-enables</title>
<updated>2026-05-31T03:12:23+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-31T03:12:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=4fae47ee8c268a4f530f60996741a7871d096b13'/>
<id>urn:sha1:4fae47ee8c268a4f530f60996741a7871d096b13</id>
<content type='text'>
org-drill-buffer-has-cards-p only scanned for a per-heading :drill:/:leitner: tag, so a deck tagged through #+FILETAGS: had no match and org-drill-mode never auto-enabled. Those files opened without cloze highlighting.

I extended the predicate to also scan #+FILETAGS: lines, handling both the space-separated and colon-delimited syntaxes, with [: \t] boundaries so a value like drilldown can't false-match drill. The inherited-top-level-tag case already worked, since the ancestor heading line carries the literal tag and the per-heading scan catches it.

Tests cover filetag-only decks (space, colon, leitner), the inherited-top-level lock, the substring boundary, and auto-enable on a filetag-only buffer.
</content>
</entry>
<entry>
<title>docs: archive 2026-04-29 outreach to upstream maintainer</title>
<updated>2026-05-28T07:29:37+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-28T07:29:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=c7da717d0bbe7fd3dc976c9519d135b0ea75b00e'/>
<id>urn:sha1:c7da717d0bbe7fd3dc976c9519d135b0ea75b00e</id>
<content type='text'>
I copied the outreach email I sent on 2026-04-29 into assets/ so the maintainership-adoption thread has a tracked record in the repo. The .eml file follows the YYYY-MM-DD-&lt;topic&gt;-&lt;descriptor&gt; naming so future correspondence lands alongside it.

The email offered three options (push rights, formal handover, consolidated MR batch) and hasn't received a reply as of today, 29 days out.
</content>
</entry>
<entry>
<title>docs: relocate v0 design specs to docs/design/</title>
<updated>2026-05-28T07:09:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-28T07:09:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/org-drill/commit/?id=636c18341c1f9131bfabdd547cd60797d844a601'/>
<id>urn:sha1:636c18341c1f9131bfabdd547cd60797d844a601</id>
<content type='text'>
I moved both v0 design specs out of working/ and into docs/design/. That's the conventional permanent home for project documentation, where engineers will look during implementation. working/ is meant for transient in-progress artifacts that file away once the work ships, and these specs are long-lived design docs that don't fit that contract.

Files moved:
- working/stats-dashboard/stats-dashboard.org → docs/design/stats-dashboard.org
- working/fsrs-spec/fsrs-spec.org → docs/design/fsrs-spec.org

The git rename detection picked both up, so file history follows the move.

I also dropped the stale /docs entry from .gitignore. The Makefile doesn't write to docs/ and nothing else references it as a build output, so the ignore was inherited cruft that would have silently dropped any tracked file under docs/.

I updated path references in seven spots: three docstring/comment refs in org-drill.el, one in tests/test-org-drill-session-record.el (the Commentary block), and three inside the specs themselves. Two refs in fsrs-spec.org now point at the correct location for its defcustom docstring and option description. One in stats-dashboard.org's References section points at the sister spec.

Full make test-unit green. eask compile clean.
</content>
</entry>
</feed>
