{"id":50462784,"url":"https://github.com/rasha-hantash/today-dsa","last_synced_at":"2026-06-01T05:30:57.351Z","repository":{"id":246965152,"uuid":"823857360","full_name":"rasha-hantash/today-dsa","owner":"rasha-hantash","description":"Tells you what to do today — not what to study this month. Local-first interview prep engine for Obsidian.","archived":false,"fork":false,"pushed_at":"2026-05-12T00:03:54.000Z","size":1861,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-12T01:36:08.217Z","etag":null,"topics":["interview-prep","leetcode","neetcode","obsidian","python","spaced-repetition"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rasha-hantash.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-07-03T21:45:32.000Z","updated_at":"2026-05-12T01:20:02.000Z","dependencies_parsed_at":"2024-07-06T02:05:35.309Z","dependency_job_id":null,"html_url":"https://github.com/rasha-hantash/today-dsa","commit_stats":null,"previous_names":["rasha-hantash/leetcode-python","rasha-hantash/today-dsa"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/rasha-hantash/today-dsa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rasha-hantash%2Ftoday-dsa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rasha-hantash%2Ftoday-dsa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rasha-hantash%2Ftoday-dsa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rasha-hantash%2Ftoday-dsa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rasha-hantash","download_url":"https://codeload.github.com/rasha-hantash/today-dsa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rasha-hantash%2Ftoday-dsa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33762215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["interview-prep","leetcode","neetcode","obsidian","python","spaced-repetition"],"created_at":"2026-06-01T05:30:56.776Z","updated_at":"2026-06-01T05:30:57.341Z","avatar_url":"https://github.com/rasha-hantash.png","language":"Python","funding_links":["https://www.buymeacoffee.com/rasha_hantash"],"categories":[],"sub_categories":[],"readme":"# Interview Prep\n\n\u003ca href=\"https://www.buymeacoffee.com/rasha_hantash\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" style=\"height: 60px !important;width: 217px !important;\" \u003e\u003c/a\u003e\n\n\u003e **Tells you what to do _today_ — not what to study this month.**\n\nA local-first interview prep engine for Obsidian. Each morning it regenerates\none file, `today.md`, with the day's recall queue, new problems, system\ndesign reading, and mock status — pulled from a single master curriculum and\nyour own append-only ledger of completions.\n\n**Curriculum artifact:** [NeetCode 150 gap analysis](coverage-analysis.md) — every extra problem outside NC150, grouped by pattern, with per-problem justification.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePreview \u003ccode\u003etoday.md\u003c/code\u003e in Obsidian\u003c/b\u003e\u003c/summary\u003e\n\n![today.md rendered for a weekday in Obsidian](assets/preview-weekday.png)\n\n\u003c/details\u003e\n\n---\n\n## Table of contents\n\n- [What this is](#what-this-is)\n- [Is this for you?](#is-this-for-you)\n- [Why not just…?](#why-not-just)\n- [Quickstart](#quickstart)\n- [What `today.md` shows](#what-todaymd-shows)\n- [How the engine works](#how-the-engine-works)\n- [Daily flow](#daily-flow)\n- [Target pace](#target-pace)\n- [Curriculum](#curriculum)\n- [Phases](#phases)\n- [Spaced repetition](#spaced-repetition)\n- [Mocks and interviews](#mocks-and-interviews)\n- [Files](#files)\n- [Design rationale](#design-rationale)\n- [Glossary](#glossary)\n- [License](#license)\n\n---\n\n## What this is\n\nMost interview prep plans tell you what to study.\n\nThis repo tells you what to do **today**.\n\nEach morning, the engine regenerates `today.md` from one master file: `curriculum.md`.\n\n`today.md` answers:\n\n- What should I recall before I forget it?\n- What new problems should I solve next?\n- What system design chapter should I read?\n- Which mocks are unlocked?\n- What behavioral work should I drill?\n- What did I find hardest this week?\n\nThe goal is to remove the daily planning tax.\n\nOpen `today.md`, do the work, check boxes, recompute tomorrow.\n\n---\n\n## Is this for you?\n\n**This is for you if:**\n\n- You're prepping for SWE interviews and want one file that tells you what to work on each day\n- You're comfortable in Obsidian (or any Markdown editor that supports the Tasks plugin)\n- You can run one CLI command per day\n- You want spaced repetition that survives missed days without thrashing your plan\n\n**This isn't for you if:**\n\n- You want a hosted web app or mobile UI\n- You want video walkthroughs, AI hints, or in-editor solutions — this engine plans the day, it doesn't solve problems for you\n- You want a calendar-locked plan that ignores actual completion\n- You don't want to use Obsidian or another local Markdown vault\n\n---\n\n## Why not just…?\n\n**Why not Anki?**\nAnki handles fact-level recall well — code templates, complexity tables, Python gotchas. It cannot sequence \"do these new problems today, but only after recall, and only if your scheduled mock prereqs are met.\" This engine plans the day; Anki memorizes facts. Both ship together — Anki joins the loop in Phase 8.\n\n**Why not the NeetCode roadmap site?**\nStatic order, no spaced repetition, no daily snapshot. You'd still need a separate scheduler to decide what to revisit and when.\n\n**Why not LeetCode's built-in scheduler?**\nIt recommends what to _practice_, not what to _do today_. No mock prereqs, no system design integration, no single daily plan file you can open and start working from.\n\n**Why not a spreadsheet?**\nThat was the v0. SM-2 scheduling, ledger replay across phases, and prereq-gated mocks are the parts a spreadsheet can't do. The engine is also snapshot-based: ticking a box today doesn't reshuffle today's plan, which a spreadsheet can't enforce.\n\n---\n\n## Quickstart\n\n### 1. Open the repo as an Obsidian vault\n\nInstall the Obsidian **Tasks** plugin and enable:\n\n```txt\nSet done date on task completion\n```\n\n### 2. Install dependencies and seed your workspace\n\n```sh\n# Python 3.11+ required\ncurl -LsSf https://astral.sh/uv/install.sh | sh\nuv sync\nuv run pytest\nuv run prep init       # copies curriculum.template.md → curriculum.md (your file)\nuv run prep recompute\n```\n\nOpen `today.md` — that is your daily plan.\n\n`curriculum.md`, `problems/`, `prep-data/`, and `today.md` are gitignored —\nthey hold your progress and never leave your machine. The committed source\nof truth is `curriculum.template.md`. Re-running `prep init` is a safe\nno-op once `curriculum.md` exists; pass `--force` to reseed from the\ntemplate (and lose your local ticks).\n\n`prep` is the engine's CLI, exposed by `uv sync` via `pyproject.toml` — no\nseparate install step.\n\n### 3. Everyday CLI\n\n```sh\nuv run prep recompute                         # regenerate today.md\nuv run prep preview                           # preview today's plan\nuv run prep preview --for weekday             # or: --for sat / --for sun\nuv run prep preview --date 2026-05-17         # any specific date\n\nuv run prep mock schedule mock-1 2026-05-17   # schedule a mock\nuv run prep mock complete mock-1              # complete a mock (defaults to today)\nuv run prep mock list                         # show every mock and its state\n\nuv run prep init --force                      # reseed curriculum.md from the template\nuv run pytest                                 # run the engine's test suite\n```\n\n### 4. Optional: daily auto-recompute on macOS\n\nThe repo ships a LaunchAgent template at `launchd/com.today-dsa.recompute.plist`. Before loading it, open the file and replace the three `__REPLACE_ME__` markers with:\n\n- `__REPLACE_ME_REPO_PATH__` → absolute path to your clone of this repo\n- `__REPLACE_ME_UV_BINARY_PATH__` → output of `which uv`\n- `__REPLACE_ME_LOG_PATH__` → e.g. `/Users/you/Library/Logs/today-dsa.log`\n\nThen install it:\n\n```sh\ncp launchd/com.today-dsa.recompute.plist ~/Library/LaunchAgents/\nlaunchctl load ~/Library/LaunchAgents/com.today-dsa.recompute.plist\n```\n\nIt runs daily at 8:30 AM. The Mac must be awake at 8:30 — if it sleeps through, run `uv run prep recompute`.\n\n---\n\n## What `today.md` shows\n\nA weekday `today.md` includes:\n\n- Progress bars\n- Recall queue\n- New DSA problems\n- System design reading\n- Mock / interview status\n- Today's hardest problem\n- Maintenance queue at the bottom (only after every E/M is touched 4×)\n\nSaturday adds:\n\n- This week's hardest re-solve block\n\nSunday removes required work.\n\nYou can preview weekday, Saturday, or Sunday layouts without touching state. See the CLI section above.\n\n---\n\n## How the engine works\n\nThe engine is snapshot-based.\n\nEach recompute:\n\n1. Reads completed ticks from `today.md`\n2. Syncs completions into the append-only ledger\n3. Updates mastery state in `curriculum.md`\n4. Recomputes due recall items\n5. Selects the next new problems\n6. Checks which mocks are unlocked\n7. Regenerates `today.md`\n\nRun:\n\n```sh\nuv run prep recompute\n```\n\nThe generated `today.md` is frozen for the day.\n\nChecking boxes does not reshuffle the queue until the next recompute.\n\n---\n\n## Daily flow\n\nThe core rule:\n\n```txt\nRecall before New.\n```\n\nRecall is knowledge you already paid for. If you skip it, it decays.\n\nNew problems are just deferred scope. They can move to tomorrow.\n\nDefault priority:\n\n1. Recall\n2. System design\n3. New DSA\n4. Mocks / real screens\n5. Behavioral\n\nException:\n\n```txt\nIf a scheduled mock or interview needs an uncovered pattern, prioritize that pattern for the day.\n```\n\n---\n\n## Target pace\n\nThe default plan assumes full-time prep:\n\n```txt\n9 hours/day\nMonday–Saturday\nSundays off\n```\n\nAt that pace:\n\n- **Day 45:** Easies + Mediums complete; I should feel confident enough to start applying\n- **Day 60:** Hards complete; full DSA acquisition cycle done\n- **Day 61+:** Recall, mocks, real screens, system design, and behavioral drilling\n\nThe engine is not calendar-locked.\n\nIf you move slower or faster, phase advancement still comes from completed work, not from the date.\n\n---\n\n## Curriculum\n\nThe DSA curriculum is:\n\n```txt\nNeetCode 150 + 44 targeted extras = 194 problems\n```\n\nThe 44 extras fill patterns that NeetCode 150 under-covers or skips, plus a\nhandful of real company-interview questions. The per-pattern justification\nfor every extra lives in [`coverage-analysis.md`](coverage-analysis.md).\n\n\u003cdetails\u003e\n\u003csummary\u003ePatterns added by the gap-fillers\u003c/summary\u003e\n\n- Segment tree\n- Sweep line\n- Bitmask DP\n- Prefix sum + hashmap\n- Cyclic sort\n- Difference array\n- Binary indexed tree\n- Bit trie\n- Reservoir sampling\n- Additional interval / parsing / tree-hash variants\n\n\u003c/details\u003e\n\nFull scope:\n\n- **194 DSA problems**\n  - 150 canonical NeetCode 150\n  - 44 targeted gap-fillers\n- **System design**\n  - DDIA Ch. 5–9\n  - Alex Xu Vol. 1\n  - Alex Xu Vol. 2 Ch. 1–7\n- **Mocks**\n  - Algo mocks\n  - System design mocks\n  - Real screens once scheduled\n- **Behavioral**\n  - STAR-format story drilling\n\n---\n\n## Phases\n\nProgress is phase-based, but advancement is ledger-driven.\n\nYou do not manually move phases forward. The engine advances when the required work is done.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePhases 1–6 — Easy / Medium acquisition (Day 1–45)\u003c/b\u003e\u003c/summary\u003e\n\nGoal:\n\n```txt\nFinish all Easy + Medium problems.\n```\n\nTarget:\n\n```txt\nDay 1–45\n164 Easy / Medium problems\n```\n\nRules:\n\n- Easies before Mediums within each pattern\n- Problems blocked by pattern\n- No Hards yet\n- Recall every day\n- System design every day\n- New DSA Monday–Saturday\n- Saturday re-solves the hardest problems from the week\n\nSchedule, Monday–Friday:\n\n| Time        | Block         |\n| ----------- | ------------- |\n| 9:00–13:00  | Recall        |\n| 14:00–15:30 | System Design |\n| 15:30–19:30 | New DSA       |\n\nOn mock days:\n\n| Time        | Block         |\n| ----------- | ------------- |\n| 9:00–13:00  | Recall        |\n| 14:00–16:00 | Mock          |\n| 16:00–17:30 | System Design |\n| 17:30–19:30 | New DSA       |\n\nSaturday:\n\n| Time        | Block                        |\n| ----------- | ---------------------------- |\n| 9:00–13:00  | Recall + this week's hardest |\n| 14:00–15:30 | System Design                |\n| 15:30–19:30 | New DSA                      |\n\nSunday:\n\n```txt\nOff. Light reading is fine, but no required work is scheduled.\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePhase 7 — Hards (Day 45–60)\u003c/b\u003e\u003c/summary\u003e\n\nGoal:\n\n```txt\nFinish all Hard problems.\n```\n\nTarget:\n\n```txt\nDay 45–60\n30 Hard problems\n```\n\nRules:\n\n- Same daily structure as Phases 1–6\n- Pace drops to 2 new Hards/day\n- Hard recall gets a 90-minute budget\n- Algo mocks ramp up\n- Start applying to safety-net companies\n\nSchedule, Monday–Friday:\n\n| Time        | Block         |\n| ----------- | ------------- |\n| 9:00–13:00  | Recall        |\n| 14:00–15:30 | System Design |\n| 15:30–19:30 | New Hards     |\n\nOn mock days:\n\n| Time        | Block         |\n| ----------- | ------------- |\n| 9:00–13:00  | Recall        |\n| 14:00–16:00 | Mock          |\n| 16:00–17:30 | System Design |\n| 17:30–19:30 | New Hards     |\n\nSaturday:\n\n| Time        | Block                        |\n| ----------- | ---------------------------- |\n| 9:00–13:00  | Recall + this week's hardest |\n| 14:00–15:30 | System Design                |\n| 15:30–19:30 | New Hards                    |\n\nSunday:\n\n```txt\nOff.\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePhase 8 — Post-acquisition\u003c/b\u003e\u003c/summary\u003e\n\nGoal:\n\n```txt\nConvert knowledge into interview performance.\n```\n\nThere are no new DSA problems in Phase 8.\n\nThe daily loop becomes:\n\n- Recall\n- System design\n- Mock interviews\n- Real screens\n- Behavioral drilling\n- Anki for fact-level recall\n\nThis is where prep shifts from acquisition to performance.\n\nSchedule, Monday–Friday:\n\n| Time        | Block              |\n| ----------- | ------------------ |\n| 9:00–13:00  | Recall             |\n| 14:00–16:00 | System Design      |\n| 16:00–19:00 | Mock / real screen |\n\nSaturday:\n\n| Time        | Block                        |\n| ----------- | ---------------------------- |\n| 9:00–12:00  | Recall + this week's hardest |\n| 12:00–13:00 | System Design                |\n| 14:00–17:00 | Behavioral intensive         |\n\nSunday:\n\n```txt\nOff.\n```\n\nAnki starts in Phase 8:\n\n```txt\n~15 min/day during downtime\n```\n\nIt handles fact-level recall:\n\n- Code templates\n- Pattern cues\n- Python gotchas\n- Complexity tables\n\nProblem-level recall stays in `today.md`.\n\n\u003c/details\u003e\n\n---\n\n## Spaced repetition\n\nThe engine uses a simplified SM-2-style ladder.\n\nEach successful solve advances the problem to the next interval:\n\n| Touches | Next due |\n| ------- | -------- |\n| 1       | +1 day   |\n| 2       | +3 days  |\n| 3       | +7 days  |\n| 4+      | +21 days |\n\nFour touches counts as mastered. Anything past the fourth solve stays on\nthe 21-day refresh cadence — there's no 60-day \"well-learned\" bucket\nbecause, for a 45–60 day interview prep, 21 days is the right outer\nhorizon. Retention past 21 days is the job of the Maintenance section\n(see below), not a longer interval.\n\nExample in `curriculum.md`:\n\n```md\n- Two Sum (E) · 4/4 (next due 2026-06-25)\n  - [x] ✅ 2026-05-11\n  - [x] ✅ 2026-05-14\n  - [x] ✅ 2026-05-21\n  - [x] ✅ 2026-06-04\n- 3Sum (M) · 0/4\n```\n\nUntouched problems have no sub-bullets. The first tick from `today.md`\nunlocks the mastery slots.\n\n### Maintenance — interleaved across patterns\n\nSpacing and interleaving are different ideas. The interval table above\nhandles **spacing** (when something resurfaces). The Maintenance section\nin `today.md` handles **interleaving** (how mastered problems mix).\n\nMaintenance activates the moment every E/M problem in the curriculum has\nreached the 4-touch cap. Before that, you'll never see it. Once it\nactivates:\n\n- It surfaces ~10 mastered E/M problems per day, drawn round-robin across\n  patterns (Arrays → Trees → Graphs → Arrays → …), not blocked by\n  pattern like the curriculum's natural order.\n- Within each pattern, least-recently-touched leads.\n- Items appear regardless of whether they're \"overdue\" — the 21-day\n  refresh cadence makes overdue-driven Recall mostly silent once mastery\n  is reached. Maintenance fills the gap.\n- It's deterministic — same ledger and date produce the same daily set.\n\nWhy this matters: research on retrieval practice consistently finds\nthat _interleaved_ practice beats blocked practice for transfer and\ndiscrimination, but only after the underlying schemas are formed. During\nPhases 1–6, Recall stays urgency-ordered (correct for acquisition).\nPost-acquisition, Maintenance takes over (correct for retention).\n\nFor a 60-day prep starting Day 1, Maintenance activates around **Day 66**\nunder perfect adherence (every overdue Recall done on time, no skipped\nworking days). Realistic adherence — a few skipped reviews, mock-day\nschedule pressure — pushes it closer to **Day 75**. Either way, well\nbefore any long-run post-interview maintenance phase but past the\nacquisition phase. By default, only E/M problems flow through\nMaintenance; Hards stay in urgency-ordered Recall.\n\n---\n\n## Mocks and interviews\n\nMocks are gated by prereqs.\n\nEach mock has a `prereq:` clause in `curriculum.md`.\n\nExamples:\n\n```txt\n15 E+M\naxu1-1, axu1-2, axu1-3, axu1-5\n```\n\nThe engine checks prereqs against the ledger and shows whether each mock is:\n\n```txt\npending → bookable → scheduled → completed\n```\n\n### Scheduling a mock or interview\n\nSchedule via the CLI (the date format is validated at entry — typos fail fast):\n\n```sh\nuv run prep mock schedule mock-1 2026-05-17\n```\n\nMark complete (defaults to today's date):\n\n```sh\nuv run prep mock complete mock-1\n```\n\nYou can also tick the checkbox in `today.md` after the mock — the Obsidian Tasks plugin auto-stamps `✅ DATE` and the next recompute folds it into the curriculum.\n\nList every mock and its current state:\n\n```sh\nuv run prep mock list\n```\n\n### Mock platforms\n\nAlgo mocks:\n\n- **Pramp** — free peer mocks; useful early\n- **Interviewing.io** — paid, higher-signal algo mocks; useful later\n\nSystem design mocks:\n\n- **Hello Interview** — paid system design mocks gated by relevant chapters\n\n---\n\n## Files\n\nTwo roles live in this repo: **shared template** (committed, identical for\neveryone) and **your personal state** (gitignored, lives only on your\nmachine). The split keeps your ticks and solutions from leaking into PRs.\n\n| File                                    | Role     | What it does                                                                           |\n| --------------------------------------- | -------- | -------------------------------------------------------------------------------------- |\n| `curriculum.template.md`                | template | Pristine master list of problems + SD chapters + mocks + behavioral; never has state.  |\n| `curriculum.md`                         | personal | Your working copy — `[x]` ticks, ✅ stamps, 📅 schedules. Seeded by `prep init`.       |\n| `today.md`                              | personal | Generated daily plan. Regenerated on every `prep recompute`.                           |\n| `prep-data/completions.jsonl`           | personal | Append-only DSA completion ledger.                                                     |\n| `prep-data/hardest.jsonl`               | personal | Append-only hardest-problem ledger.                                                    |\n| `problems/\u003cpattern\u003e/\u003cdiff\u003e-\u003cn\u003e.py`      | personal | Your solution files. The directory is gitignored except for `problems/company/`.       |\n| `problems/company/*.md`                 | template | Company-question prompts referenced by the curriculum.                                 |\n| `recall_engine.py`                      | template | SM-2-lite recall engine.                                                               |\n| `tests/test_recall_engine.py`           | template | Narrative tests and engine spec.                                                       |\n| `launchd/com.today-dsa.recompute.plist` | template | macOS daily recompute LaunchAgent (edit the three `__REPLACE_ME__` markers first).     |\n| `patterns/\u003cslug\u003e.md`                    | template | Pattern templates — algorithm sketch, common Mistakes, per-problem variants.           |\n| `patterns/\u003cslug\u003e.notes.md`              | personal | Your annotations alongside each pattern. Lazy-created when you have something to note. |\n| `docs/python-reference.md`              | shared   | Python data-type reference (dict/defaultdict/Counter/list/set methods + cheat sheets). |\n| `random-problems.md`                    | template | Extra unscheduled practice problems.                                                   |\n| `anki/`                                 | template | Fact-level recall decks.                                                               |\n| `docs/plans/`                           | template | Refactor and implementation plans.                                                     |\n| `scripts/`                              | template | Sandbox + verification scripts for the engine (Maintenance trigger, Hards scope).      |\n\n---\n\n## Design rationale\n\n### Why ledger-driven?\n\nCalendar plans break when life happens.\n\nThis engine advances based on completed work, not dates.\n\nIf you miss a day, the next recompute adapts.\n\n### Why Recall before New?\n\nRecall protects prior work from decay.\n\nNew problems can wait.\n\nThe rule is:\n\n```txt\nProtect memory first. Add scope second.\n```\n\n### Why blocked acquisition and spaced recall?\n\nFirst exposure works best when the pattern is blocked.\n\nRetention works best when recall is spaced.\n\nSo the engine separates the two:\n\n```txt\nAcquire blocked.\nRetain spaced.\n```\n\n### Why Anki only in Phase 8?\n\nDuring Phases 1–7, first exposure already saturates working memory.\n\nIn Phase 8, acquisition is done, so Anki joins the loop for fact-level recall.\n\n---\n\n## Glossary\n\n**Touch**  \nOne successful solve or re-solve event.\n\n**Recall**  \nPreviously solved problems that are due again.\n\n**New**  \nNever-touched problems selected from the current phase.\n\n**Phase**  \nA curriculum stage. Phases 1–6 are Easy/Medium acquisition, Phase 7 is Hards, Phase 8 is post-acquisition.\n\n**SM-2**  \nThe spaced repetition algorithm family this engine borrows from. The full SM-2 grades each review on a 0–5 scale and computes an \"ease factor\"; this engine uses a fixed interval ladder (1 / 3 / 7 / 21 days) keyed only on touch count — simpler, deterministic, and well-suited to a 45–60 day prep horizon.\n\n**Blocked practice**  \nDoing many problems of the same pattern in a row. Best for first acquisition.\n\n**Interleaved practice**  \nRotating across patterns within a session. Best for retention, transfer, and discrimination — but only after schemas are formed.\n\n**Snapshot mode**  \nThe daily queue is frozen at recompute time. Ticks affect tomorrow's plan, not today's ordering.\n\n**Mock prereq**  \nA condition that must be satisfied before a mock becomes bookable.\n\n**Hardest flag**  \nA daily checkbox for the hardest problem of the day. Saturday uses these to build the weekly re-solve block.\n\n---\n\n## License\n\nMIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frasha-hantash%2Ftoday-dsa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frasha-hantash%2Ftoday-dsa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frasha-hantash%2Ftoday-dsa/lists"}