/learn-review
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".
$ npx -y skills add evolution-foundation/evo-nexus --skill learn-review --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/learn-review
Context preview
The summary Claude sees to decide when to auto-load this skill.
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".
SKILL.md
learn-review.SKILL.mdname: learn-review
description: 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".
Learn Review
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`.
SM-2 Formula (implement exactly as specified)
Given current `reps`, `interval`, `ease`, `lapses`:
**Again (grade 0):**
- `reps = 0`
- `interval = 1`
- `ease = max(1.3, ease - 0.2)` (round to 2 decimal places)
- `lapses = lapses + 1`
**Hard (grade 3):**
- `interval = round(interval * 1.2)` (minimum 1)
- `ease = max(1.3, ease - 0.15)` (round to 2 decimal places)
- `reps = reps + 1`
**Good (grade 4):**
- If `reps == 0`: `interval = 1`
- Else if `reps == 1`: `interval = 6`
- Else: `interval = round(interval * ease)` (minimum 1)
- `ease` is unchanged
- `reps = reps + 1`
**Easy (grade 5):**
- Same interval as Good, then additionally: `interval = round(interval * 1.3)` (minimum 1)
- `ease = ease + 0.15` (round to 2 decimal places)
- `reps = reps + 1`
**For 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.
Workflow
Step 1 — Scan for due facts
1. Read all `.md` files in `workspace/learning/facts/` 2. Parse the frontmatter of each file 3. Get today's date (YYYY-MM-DD) 4. Select facts where `next_review <= today` 5. Sort by `next_review` ascending (oldest due first) 6. Take up to 5 facts (N=5 default)
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.
Step 2 — Review loop (one fact at a time)
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).
Step 3 — Apply SM-2 and update file
For the grade received:
1. Compute `prev_interval = current interval` 2. Compute `prev_ease = current ease` 3. Apply SM-2 formula above to get `new_interval`, `new_ease`, `new_reps`, `new_lapses` 4. Compute `new_next_review = today + new_interval days` 5. Rewrite the fact file with updated frontmatter, preserving the body content exactly
**Frontmatter rewrite rules:**
- Update only: `next_review`, `interval`, `ease`, `reps`, `lapses`
- Preserve all other fields unchanged: `id`, `source`, `deck`, `created`
- Preserve the body (everything after the closing `---`) exactly as-is
Step 4 — Append to review log
Append one JSON line to `workspace/learning/.state/review-log.jsonl` (create file if it doesn't exist, create directory if needed):
{"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"
Step 5 — Next fact
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}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━Verification helper (Grade Good progression)
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(6*2.5))|
Constraints
- Max N=5 facts per session. If more are due, the user can run again.
- ONLY update files in `workspace/learning/facts/` and `workspace/learning/.state/review-log.jsonl`.
- Do NOT modify `deck` metadata files or any file outside these two locations.
- Do NOT skip the log write — even if the user types a grade quickly, always append to the log.
- If a fact file cannot be read (corrupted frontmatter), skip it and report: "⚠ Fato {filename} ignorado — frontmatter inválido."
Read more
name: learn-review description: 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".
Learn Review
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`.
SM-2 Formula (implement exactly as specified)
Given current `reps`, `interval`, `ease`, `lapses`:
**Again (grade 0):**
- `reps = 0`
- `interval = 1`
- `ease = max(1.3, ease - 0.2)` (round to 2 decimal places)
- `lapses = lapses + 1`
**Hard (grade 3):**
- `interval = round(interval * 1.2)` (minimum 1)
- `ease = max(1.3, ease - 0.15)` (round to 2 decimal places)
- `reps = reps + 1`
**Good (grade 4):**
- If `reps == 0`: `interval = 1`
- Else if `reps == 1`: `interval = 6`
- Else: `interval = round(interval * ease)` (minimum 1)
- `ease` is unchanged
- `reps = reps + 1`
**Easy (grade 5):**
- Same interval as Good, then additionally: `interval = round(interval * 1.3)` (minimum 1)
- `ease = ease + 0.15` (round to 2 decimal places)
- `reps = reps + 1`
**For 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.
Workflow
Step 1 — Scan for due facts
1. Read all `.md` files in `workspace/learning/facts/` 2. Parse the frontmatter of each file 3. Get today's date (YYYY-MM-DD) 4. Select facts where `next_review <= today` 5. Sort by `next_review` ascending (oldest due first) 6. Take up to 5 facts (N=5 default)
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.
Step 2 — Review loop (one fact at a time)
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).
Step 3 — Apply SM-2 and update file
For the grade received:
1. Compute `prev_interval = current interval` 2. Compute `prev_ease = current ease` 3. Apply SM-2 formula above to get `new_interval`, `new_ease`, `new_reps`, `new_lapses` 4. Compute `new_next_review = today + new_interval days` 5. Rewrite the fact file with updated frontmatter, preserving the body content exactly
**Frontmatter rewrite rules:**
- Update only: `next_review`, `interval`, `ease`, `reps`, `lapses`
- Preserve all other fields unchanged: `id`, `source`, `deck`, `created`
- Preserve the body (everything after the closing `---`) exactly as-is
Step 4 — Append to review log
Append one JSON line to `workspace/learning/.state/review-log.jsonl` (create file if it doesn't exist, create directory if needed):
{"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"
Step 5 — Next fact
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}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━Verification helper (Grade Good progression)
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(6*2.5))|
Constraints
- Max N=5 facts per session. If more are due, the user can run again.
- ONLY update files in `workspace/learning/facts/` and `workspace/learning/.state/review-log.jsonl`.
- Do NOT modify `deck` metadata files or any file outside these two locations.
- Do NOT skip the log write — even if the user types a grade quickly, always append to the log.
- If a fact file cannot be read (corrupted frontmatter), skip it and report: "⚠ Fato {filename} ignorado — frontmatter inválido."
Other skills on evo-nexus.
- /ai-image-creator
Generate PNG images using AI (multiple models via OpenRouter including Gemini, FLUX.2, Riverflow, SeedDream, GPT-5 Image, proxied through Cloudflare AI Gateway BYOK). Also analyze/describe existing images using multimodal AI vision. Use when user asks to "generate an image",
Open skill - /create-agent
Create a new custom agent for the workspace. Guides the user through defining agent name, domain, personality, skills, model, and memory folder. Use when the user says 'create an agent', 'new agent', 'add an agent', 'I need a custom agent', or wants to create a specialized agent
Open skill - /create-command
Create a new slash command for Claude Code. Guides the user through defining the command name, what it does, and generates the markdown file in .claude/commands/. Use when the user says 'create a command', 'new command', 'add a slash command', 'I want a shortcut for', or wants
Open skill - /create-goal
Create a Mission, Project, or Goal (Mission → Project → Goal → Task hierarchy) in EvoNexus. Guides the user through picking a mission, choosing or creating a project, defining a measurable goal with metric_type and target_value. Writes to the SQLite goals tables via POST
Open skill - /create-heartbeat
Create a new heartbeat (proactive agent scheduled with a decision prompt) for EvoNexus. Guides the user through picking an agent, setting interval, wake triggers, and the decision prompt that governs when the agent acts. Writes to config/heartbeats.yaml with pydantic validation.
Open skill - /create-integration
Create a new custom integration (API/service wrapper) for the workspace. Guides the user through defining the integration's slug, display name, description, category, and required env keys. Writes .claude/skills/custom-int-{slug}/SKILL.md via POST /api/integrations/custom. Use
Open skill

