algernon-review
You run the interactive flashcard review session with FSRS-4.5 spaced repetition.
You handle flashcards (binary reveal), dissertative cards (AI-graded), and
argumentative cards (AI-graded). At the end, you check promotion eligibility and
save the session.
Constants
CODEBLOCK0
FSRS-4.5 Parameters
- - DECAY = -0.5, FACTOR = 0.2346
- Stability (S) = days to reach 90% retention
- Grades: 1 = Again, 3 = Good
Step 1 — Fetch Due Cards
CODEBLOCK1
(Include AND m.slug = 'SLUG' only if a specific slug was provided.)
If no cards due: "No cards due for review. Great job staying on top of it." and stop.
Display: "Starting review: N cards due."
Step 2 — Review Loop
Flashcards (type = 'flashcard')
- 1. Show front. AskUserQuestion options: ["Show answer"]
- Show back. AskUserQuestion options: ["Again", "Good"]
- Run FSRS update (see Step 3).
Dissertative and Argumentative Cards
- 1. Show front. AskUserQuestion options: ["Ready to answer"]
- AskUserQuestion: "Type your answer:" (free text)
- Evaluate the response against the reference answer (card back):
- Dissertative: check accuracy of key points, completeness
- Argumentative: check that both sides are represented, trade-offs identified
- Output: brief feedback + suggested grade (1 or 3) + optional MISCONCEPTION note
- 4. Show evaluator feedback + reference answer. AskUserQuestion options: ["Again", "Good"]
(Use the user's button choice, not the AI suggestion.)
- 5. Run FSRS update using the user's chosen grade.
- If a MISCONCEPTION was detected, create a correction card:
CODEBLOCK2
Step 3 — FSRS Scheduling
For each graded card, compute new values and update card_state.
Read current state:
CODEBLOCK3
Compute elapsed days (if last_review is not NULL):
CODEBLOCK4
State transitions:
| State | Grade | New stability | New difficulty | New state | Interval |
|---|
| new | Good | 0.4 | 0.3 | review | 1 day |
| new |
Again | 0.1 | 0.4 | learning | 1 day |
| learning | Good | stability * 1.5 | MAX(0.1, difficulty - 0.05) | review | MAX(1, ROUND(S)) |
| learning | Again | stability (unchanged) | MIN(1.0, difficulty + 0.1) | learning | 1 day |
| relearning | Good | stability * 1.5 | MAX(0.1, difficulty - 0.05) | review | MAX(1, ROUND(S)) |
| relearning | Again | stability (unchanged) | MIN(1.0, difficulty + 0.1) | relearning | 1 day |
| review | Good | S
EXP(0.9(1-R)) | MAX(0.1, difficulty - 0.05) | review | MAX(1, ROUND(S)) |
| review | Again | MAX(0.1, stability * 0.2) | MIN(1.0, difficulty + 0.1) | relearning | 1 day, lapses+1 |
For review+Good, compute retrievability first:
CODEBLOCK5
Update:
CODEBLOCK6
Step 4 — Promotion Check (after all cards)
For each card reviewed with grade = Good where reps >= 5:
CODEBLOCK7
If reps >= 5 and tags contain [N1], check deck retention over last 7 days:
CODEBLOCK8
If retention >= 0.9:
- - Generate a deeper N2 version of the card (N2: differentiator + when to use + main trade-off).
- Insert as new card with tag
[N2], due today. - Apply same logic for
[N2] cards: promote to N3 (full technical depth, production
nuances, edge cases).
Step 5 — Session Summary
CODEBLOCK9
Append to today's conversation log:
CODEBLOCK10
algernon-review
你使用FSRS-4.5间隔重复算法运行交互式闪卡复习会话。
你处理闪卡(二进制揭示)、论述卡(AI评分)和
论证卡(AI评分)。最后,你检查升级资格并
保存会话。
常量
bash
ALGERNONHOME=${ALGERNONHOME:-$HOME/.openalgernon}
DB=${ALGERNON_HOME}/data/study.db
FSRS-4.5 参数
- - DECAY = -0.5, FACTOR = 0.2346
- 稳定性(S)= 达到90%保留率所需天数
- 评分:1 = 再来一次,3 = 良好
步骤 1 — 获取到期卡片
bash
sqlite3 $DB \
SELECT c.id, c.type, c.front, c.back, c.tags, c.sourcetitle, c.deckid,
cs.stability, cs.reps, cs.state
FROM cards c
JOIN cardstate cs ON cs.cardid = c.id
JOIN decks d ON d.id = c.deck_id
JOIN materials m ON m.id = d.material_id
WHERE cs.due_date <= date(now)
[AND m.slug = SLUG]
ORDER BY cs.due_date ASC
LIMIT 50;
(仅当提供了特定slug时,包含AND m.slug = SLUG)
如果没有到期卡片:没有到期需要复习的卡片。做得很好,保持领先。并停止。
显示:开始复习:N张卡片到期。
步骤 2 — 复习循环
闪卡(type = flashcard)
- 1. 显示正面。AskUserQuestion选项:[显示答案]
- 显示背面。AskUserQuestion选项:[再来一次, 良好]
- 运行FSRS更新(见步骤3)。
论述卡和论证卡
- 1. 显示正面。AskUserQuestion选项:[准备回答]
- AskUserQuestion:输入你的答案:(自由文本)
- 对照参考答案(卡片背面)评估回答:
- 论述卡:检查关键点的准确性、完整性
- 论证卡:检查是否呈现了双方观点,是否识别了权衡
- 输出:简短反馈 + 建议评分(1或3)+ 可选的误解备注
- 4. 显示评估反馈 + 参考答案。AskUserQuestion选项:[再来一次, 良好]
(使用用户选择的按钮,而非AI建议。)
- 5. 使用用户选择的评分运行FSRS更新。
- 如果检测到误解,创建纠正卡片:
bash
sqlite3 $DB \
INSERT INTO cards (deck_id, type, front, back, tags)
VALUES (DECK_ID, flashcard,
纠正:误解问题,
正确解释,
[\[correction]\,\[N1]\]);
INSERT INTO card
state (cardid, due_date)
VALUES (last
insertrowid(), date(now));
步骤 3 — FSRS 调度
对于每张已评分的卡片,计算新值并更新card_state。
读取当前状态:
bash
sqlite3 $DB \
SELECT stability, difficulty, reps, lapses, state, last_review
FROM card
state WHERE cardid = CARD_ID;
计算经过天数(如果last_review不为NULL):
bash
sqlite3 $DB \
SELECT ROUND(julianday(now) - julianday(LAST_REVIEW), 2) AS elapsed;
状态转换:
| 状态 | 评分 | 新稳定性 | 新难度 | 新状态 | 间隔 |
|---|
| 新 | 良好 | 0.4 | 0.3 | 复习 | 1天 |
| 新 |
再来 | 0.1 | 0.4 | 学习中 | 1天 |
| 学习中 | 良好 | 稳定性 * 1.5 | MAX(0.1, 难度 - 0.05) | 复习 | MAX(1, ROUND(S)) |
| 学习中 | 再来 | 稳定性(不变) | MIN(1.0, 难度 + 0.1) | 学习中 | 1天 |
| 重新学习 | 良好 | 稳定性 * 1.5 | MAX(0.1, 难度 - 0.05) | 复习 | MAX(1, ROUND(S)) |
| 重新学习 | 再来 | 稳定性(不变) | MIN(1.0, 难度 + 0.1) | 重新学习 | 1天 |
| 复习 | 良好 | S
EXP(0.9(1-R)) | MAX(0.1, 难度 - 0.05) | 复习 | MAX(1, ROUND(S)) |
| 复习 | 再来 | MAX(0.1, 稳定性 * 0.2) | MIN(1.0, 难度 + 0.1) | 重新学习 | 1天,失误+1 |
对于复习+良好,先计算可检索性:
bash
sqlite3 $DB \
SELECT EXP(LN(0.9) * ELAPSED / STABILITY) AS R;
更新:
bash
sqlite3 $DB \
UPDATE card_state SET
stability = NEW_S,
difficulty = NEW_D,
due_date = date(now, + || INTERVAL || days),
last_review = datetime(now),
reps = reps + 1,
lapses = NEW_LAPSES,
state = NEW_STATE
WHERE card
id = CARDID;
INSERT INTO reviews (card
id, grade, scheduleddays, elapsed_days)
VALUES (CARD_ID, GRADE, INTERVAL, ELAPSED);
步骤 4 — 升级检查(所有卡片之后)
对于每张评分良好且reps >= 5的卡片:
bash
sqlite3 $DB \
SELECT c.id, c.tags, c.deck_id, cs.reps
FROM cards c JOIN cardstate cs ON cs.cardid = c.id
WHERE c.id = CARD_ID AND cs.reps >= 5;
如果reps >= 5且标签包含[N1],检查过去7天的牌组保留率:
bash
sqlite3 $DB \
SELECT CAST(SUM(CASE WHEN grade=3 THEN 1 ELSE 0 END) AS REAL) / COUNT(id) AS retention
FROM reviews r JOIN cards c ON c.id = r.card_id
WHERE c.deckid = DECKID AND r.reviewed_at >= datetime(now, -7 days);
如果保留率 >= 0.9:
- - 生成卡片的更深层次N2版本(N2:区分因素 + 使用时机 + 主要权衡)。
- 作为新卡片插入,标签为[N2],今天到期。
- 对[N2]卡片应用相同逻辑:升级到N3(完整技术深度、生产细节、边缘情况)。
步骤 5 — 会话摘要
会话完成。
复习卡片数:N
再来一次:X | 良好:Y
本次会话保留率:Z%
下次复习:[来自card_state的最早到期日期]
追加到今天的对话日志:
bash
echo [HH:MM] review session | Cards: N | Retention: Z% | Promotions: P \
>> ${ALGERNON_HOME}/memory/conversations/YYYY-MM-DD.md