Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Review spaced-repetition facts that are due today. Applies SM-2 algorithm to update interval, ease, and next_review in each fact's frontmatter. Updates review-log.jsonl. Use when the user says "revisar", "review facts", "study", or "/learn-review".
.claude/skills/evolution-foundation-learn-review/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 198% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 133% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 32% | 0% |
Reviews facts in workspace/learning/facts/ whose next_review date is today or in the past. Applies SM-2 grading and rewrites frontmatter in-place. Records every grade in workspace/learning/.state/review-log.jsonl.
Given current reps, interval, ease, lapses:
Again (grade 0):
reps = 0interval = 1ease = max(1.3, ease - 0.2) (round to 2 decimal places)lapses = lapses + 1Hard (grade 3):
interval = round(interval * 1.2) (minimum 1)ease = max(1.3, ease - 0.15) (round to 2 decimal places)reps = reps + 1Good (grade 4):
reps == 0: interval = 1reps == 1: interval = 6interval = round(interval * ease) (minimum 1)ease is unchangedreps = reps + 1Easy (grade 5):
interval = round(interval * 1.3) (minimum 1)ease = ease + 0.15 (round to 2 decimal places)reps = reps + 1For all grades: next_review = review_date + interval days
Ease floor: 1.3. Never let ease drop below 1.3 regardless of how many Again grades.
.md files in workspace/learning/facts/next_review <= todaynext_review ascending (oldest due first)If no facts are due: > "Nenhum fato vencido hoje. 🎉 Próxima revisão: {earliest next_review across all facts}." > Stop here.
If workspace/learning/facts/ does not exist or is empty: > "Nenhum fato encontrado. Use /learn-capture para adicionar fatos primeiro." > Stop here.
For each due fact (up to 5):
2a. Show the question:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📚 Deck: {deck} | Fato {current}/{total_due_shown}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❓ {Retrieval Q content}
[Pense na resposta antes de prosseguir. Pressione Enter quando pronto.]Wait for the user to confirm they've thought about it (any input is fine).
2b. Show the answer:
✅ Resposta:
{Fact content}
💡 Por quê importa:
{Why it matters content}2c. Ask for grade:
Como foi?
0 - Again (errei / não lembrei)
3 - Hard (lembrei com dificuldade)
4 - Good (lembrei bem)
5 - Easy (muito fácil)Wait for the user to enter 0, 3, 4, or 5. Accept also the words "again", "hard", "good", "easy" (case-insensitive).
For the grade received:
prev_interval = current interval prev_ease = current ease new_interval, new_ease, new_reps, new_lapsesnew_next_review = today + new_interval daysFrontmatter rewrite rules:
next_review, interval, ease, reps, lapsesid, source, deck, created---) exactly as-isAppend one JSON line to workspace/learning/.state/review-log.jsonl (create file if it doesn't exist, create directory if needed):
json{"ts": "{ISO8601_timestamp}", "fact_id": "{id}", "grade": "{again|hard|good|easy}", "prev_interval": {N}, "new_interval": {M}, "prev_ease": {X}, "new_ease": {Y}}
Grade string mapping: 0→"again", 3→"hard", 4→"good", 5→"easy"
Continue with the next due fact. After all N facts (or all due facts if < N):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Sessão de revisão concluída!
Revisados: {N} fatos
Resultado: {X} Good/Easy | {Y} Hard | {Z} Again
Próxima revisão: {earliest next_review across all facts}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━When testing, the interval sequence for repeated Good grades starting from reps=0, interval=1, ease=2.5:
| Review | Grade | reps before | interval before | → reps after | → interval after | |--------|-------|-------------|-----------------|--------------|-----------------| | 1st | Good | 0 | 1 | 1 | 1 | | 2nd | Good | 1 | 1 | 2 | 6 | | 3rd | Good | 2 | 6 | 3 | 15 (round(62.5))|
workspace/learning/facts/ and workspace/learning/.state/review-log.jsonl.deck metadata files or any file outside these two locations.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,573 | 6,983 | +25% | 1 | 1 | 0% | 773 | 1,874 | +142% | 0 | 0 | — |
case-02 | fail→fail | 4,981 | 5,702 | +14% | 1 | 1 | 0% | 686 | 1,904 | +178% | 0 | 0 | — |
case-03 | fail→fail | 4,964 | 7,933 | +60% | 1 | 1 | 0% | 714 | 1,910 | +168% | 0 | 0 | — |
case-04 | fail→fail | 5,239 | 4,851 | -7% | 1 | 1 | 0% | 256 | 1,805 | +605% | 0 | 0 | — |
case-05 | fail→fail | 9,347 | 2,841 | -70% | 1 | 1 | 0% | 1,552 | 1,880 | +21% | 0 | 0 | — |
case-06 | fail→fail | 4,155 | 9,989 | +140% | 1 | 1 | 0% | 659 | 3,114 | +373% | 0 | 0 | — |
case-07 | pass→pass | 8,827 | 3,983 | -55% | 1 | 1 | 0% | 1,621 | 2,284 | +41% | 0 | 0 | — |
case-08 | pass→pass | 15,122 | 3,542 | -77% | 1 | 1 | 0% | 2,916 | 2,290 | -21% | 0 | 0 | — |
case-09 | pass→pass | 8,758 | 3,223 | -63% | 1 | 1 | 0% | 1,849 | 2,047 | +11% | 0 | 0 | — |
case-10 | pass→pass | 9,677 | 2,723 | -72% | 1 | 1 | 0% | 1,768 | 2,034 | +15% | 0 | 0 | — |
case-11 | pass→pass | 7,008 | 3,774 | -46% | 1 | 1 | 0% | 1,533 | 2,196 | +43% | 0 | 0 | — |
case-12 | fail→pass | 9,846 | 4,314 | -56% | 1 | 1 | 0% | 1,948 | 2,412 | +24% | 0 | 0 | — |
case-13 | fail→pass | 3,813 | 1,222 | -68% | 1 | 1 | 0% | 586 | 1,746 | +198% | 0 | 0 | — |
case-14 | pass→pass | 5,393 | 2,296 | -57% | 1 | 1 | 0% | 870 | 1,945 | +124% | 0 | 0 | — |
case-15 | pass→pass | 6,552 | 2,693 | -59% | 1 | 1 | 0% | 1,223 | 2,094 | +71% | 0 | 0 | — |
case-16 | fail→pass | 6,338 | 1,306 | -79% | 1 | 1 | 0% | 1,191 | 1,795 | +51% | 0 | 0 | — |
case-17 | fail→pass | 4,233 | 2,087 | -51% | 1 | 1 | 0% | 863 | 2,011 | +133% | 0 | 0 | — |
case-18 | fail→fail | 8,392 | 2,840 | -66% | 1 | 1 | 0% | 1,309 | 2,070 | +58% | 0 | 0 | — |
case-19 | fail→fail | 16,220 | 3,940 | -76% | 1 | 1 | 0% | 2,720 | 2,352 | -14% | 0 | 0 | — |
case-20 | pass→pass | 14,769 | 1,367 | -91% | 1 | 1 | 0% | 2,475 | 1,770 | -28% | 0 | 0 | — |
case-21 | fail→pass | 10,797 | 4,336 | -60% | 1 | 1 | 0% | 1,880 | 2,479 | +32% | 0 | 0 | — |
case-22 | pass→pass | 6,450 | 2,222 | -66% | 1 | 1 | 0% | 1,200 | 1,991 | +66% | 0 | 0 | — |
case-23 | pass→pass | 4,925 | 2,292 | -53% | 1 | 1 | 0% | 911 | 2,040 | +124% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 19 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +22 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.