Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file modified .DS_Store
Binary file not shown.
10 changes: 5 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ Technical handoff for coding agents and contributors working on this repository.
- No backend/runtime services required
- Source dataset and generated card data are JSON files in repo

## Current Snapshot (2026-03-21)
## Current Snapshot (2026-03-22)

- `topic_cards.json`: **174 total cards**
- `topic_cards.json`: **27 total cards**
- `deck_groups`: **6** (`week-1` through `week-6`)
- Weeks covered in the dataset: **1-6**
- Exam-topic cards (`exam_stats.total_hits > 0`): **136**
- Exam-topic cards (`exam_stats.total_hits > 0`): **18**
- Duplicate normalized topic labels: **0**
- Total key points across all cards: **935**
- Optional key-point detail blocks: **256**
- Total key points across all cards: **106**
- Optional key-point detail blocks: **96**

Curation state:

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ python3 -m http.server 8000

Then open [http://localhost:8000](http://localhost:8000).

## Course Materials

Official course files are still kept at their canonical paths under `materials/`, but there is now also a cleaner week-ordered view under [materials/by_week](materials/by_week) for easier browsing.

## Support This Project

This project was made by just one student, and the AI coding tools used to build and improve it cost real money.
Expand Down
22 changes: 12 additions & 10 deletions docs/curation/TOPIC_MERGING_GUIDELINES.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@ Use this guide when you need to:

## Current Baseline

At the time this guide was written:
As of 2026-03-22, the merged deck baseline was:

- `topic_cards.json` has **174** cards.
- `topic_cards.json` has **27** merged cards.
- `deck_groups` covers **6** weeks.
- exam-topic cards (`exam_stats.total_hits > 0`) total **136**.
- exam-topic cards (`exam_stats.total_hits > 0`) total **18**.
- exact duplicate normalized topic labels are **0**.
- exam-topic key points have optional detail coverage (examples/tables/explanations) and should stay selectable in UI.

Treat `AGENTS.md` as the authoritative current snapshot for repo-wide counts. These numbers can drift as manual curation continues.

Important: even with exact duplicates removed, semantic overlap can still exist.
Important: curation should be evidence-driven; do not force fixed per-topic item counts.

Expand Down Expand Up @@ -63,13 +65,13 @@ Start with highest-impact cards (highest exam hits), then low-hit cards.

Suggested review bundles:

1. `For Loops`, `Range()`
2. `Conditions`, `truthy_falsy`, `Boolean operators`, `comparison_operators`, `walrus_operator`
3. `Functions`, `Return / None`, `Default arguments`, `*args`, `*args / **kwargs`
4. `mutable_immutable`, `mutable args`, `mutable_default`, `Objects`, `Names`
5. `Dictionaries`, `Sets`, `dict / average`
6. `Indexing`, `Slicing`, `Strings`
7. `Lambda`, `Enumerate`, `Zip`
1. `Python Basics`, `Objects and Names`, `Sequences and Access`
2. `Operators and Truth`, `Conditions`, `Conversion and Truthiness`
3. `Functions and Imports`, `Defining and Calling Functions`, `Return Behavior`, `Scope`, `Arguments`, `Higher-Order Patterns`
4. `Dictionaries and Mappings`, `Lists and Sets`, `Comprehensions`, `Generators and Iterators`
5. `String Fundamentals`, `String Operations and Methods`, `String Formatting`
6. `OOP Fundamentals`, `Error Handling`
7. `Pandas Core Structures`, `Inspecting and Selecting Data`, `Working With Values`, `Combining Data`, `Datetime`

These are semantic-review bundles, not mandatory merges.

Expand Down
180 changes: 180 additions & 0 deletions docs/specs/RM-008-external-cheatsheet-gap-audit.md

Large diffs are not rendered by default.

39 changes: 39 additions & 0 deletions materials/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Materials Layout

This folder now has two layers:

- the original canonical source paths used by the data pipeline and live dataset
- a non-breaking organized index under `materials/by_week/`

## Canonical Source Paths

The canonical files stay where they were so existing references in `data/study_db.json`, `topic_cards.json`, scripts, and tests do not break.

Examples:

- `materials/lectures/`
- `materials/notebooks/`
- `materials/post_midterm/`
- `materials/exams/`

## Organized Week View

Use `materials/by_week/` when you want a cleaner human-facing overview of the official course files.

- `week-01` through `week-06` group lecture, notebook, exercise, solution, and helper files by week
- `shared-assessments/` groups official exams and cross-week assessment material that does not belong to a single week

These entries are symlinks that point back to the canonical originals.

Copilot AI Mar 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Relying on symlinks can break for users who download the repo as a ZIP (symlinks may be flattened) or on Windows environments where symlink support is restricted/disabled by default. Consider adding a short note on the expected way to consume materials/by_week/ (e.g., clone via git with symlink support enabled) and any platform-specific setup guidance so students don’t end up with plain text link files instead of usable materials.

Suggested change
**How to use this folder**
- For symlinks to work correctly, clone the repo with Git instead of downloading it as a ZIP:
- `git clone <repo-url>`
- If you download the repository as a ZIP, some platforms (including GitHub’s ZIP export) may flatten or drop symlinks. In that case, the entries under `materials/by_week/` may appear as tiny plain-text files instead of behaving like links.
- On Windows, symlink creation and use may require:
- enabling *Developer Mode* in Windows Settings, or
- running Git / your shell with the necessary permissions, or
- using WSL or Git Bash, which typically have better symlink support.
- If `materials/by_week/` does not behave as expected, re-clone the repo with Git on a system/shell where symlinks are supported and enabled.

Copilot uses AI. Check for mistakes.
## How to Use This Folder

- Clone the repo with Git when you want `materials/by_week/` to behave like a link index.
- Avoid relying on ZIP downloads for this view. ZIP exports may flatten or drop symlinks, which can leave tiny plain-text files instead of working links.
- On Windows, symlink support may require Developer Mode, an elevated shell, WSL, or a Git/shell setup with symlink support enabled.
- If an entry under `materials/by_week/` opens as a short path string instead of the expected file, re-clone the repo with Git in an environment with symlink support.

## Notes

- Week 4-6 lecture decks also exist under `materials/lectures/`, but the organized view points to the `materials/post_midterm/` copies because those are the paths used by the live dataset.
- `OOP.py` is grouped under `week-06` because the repo already classifies it as week 6 material.
- External comparison PDFs stay in `materials/example_cheat_sheets/` and are not part of the official week index.
1 change: 1 addition & 0 deletions materials/by_week/shared-assessments/pre-midterm/2023.pdf
1 change: 1 addition & 0 deletions materials/by_week/shared-assessments/pre-midterm/2024.pdf
1 change: 1 addition & 0 deletions materials/by_week/week-01/lectures/Lecture Week 1.md
1 change: 1 addition & 0 deletions materials/by_week/week-01/lectures/Lecture Week 1.pptx
1 change: 1 addition & 0 deletions materials/by_week/week-01/notebooks/Notebook Week 1.ipynb
1 change: 1 addition & 0 deletions materials/by_week/week-02/lectures/Lecture Week 2.md
1 change: 1 addition & 0 deletions materials/by_week/week-02/lectures/Lecture Week 2.pptx
1 change: 1 addition & 0 deletions materials/by_week/week-02/notebooks/Notebook Week 2.ipynb
1 change: 1 addition & 0 deletions materials/by_week/week-03/lectures/Lecture Week 3.md
1 change: 1 addition & 0 deletions materials/by_week/week-03/lectures/Lecture Week 3.pptx
1 change: 1 addition & 0 deletions materials/by_week/week-03/notebooks/Notebook Week 3.ipynb
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.1.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.2.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.3.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.4.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.5.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.6.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.7.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.8.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/exercises/Exercise_4.9.py
1 change: 1 addition & 0 deletions materials/by_week/week-04/lectures/Lecture Week 4.pptx
1 change: 1 addition & 0 deletions materials/by_week/week-04/notebooks/Notebook Week 4.ipynb
1 change: 1 addition & 0 deletions materials/by_week/week-04/solutions/Solutions week 4.txt
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.1.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.2.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.3.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.4.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.5.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.6.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.7.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.8.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/exercises/Exercise_5.9.py
1 change: 1 addition & 0 deletions materials/by_week/week-05/lectures/Lecture Week 5.pptx
1 change: 1 addition & 0 deletions materials/by_week/week-05/notebooks/Notebook Week 5.ipynb
1 change: 1 addition & 0 deletions materials/by_week/week-05/solutions/Solutions week 5.txt
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.1.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.2.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.3.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.4.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.5.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.6.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.7.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.8.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/exercises/Exercise_6.9.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/helpers/OOP.py
1 change: 1 addition & 0 deletions materials/by_week/week-06/lectures/Lecture Week 6.pptx
1 change: 1 addition & 0 deletions materials/by_week/week-06/notebooks/Notebook Week 6.ipynb
30 changes: 30 additions & 0 deletions tests/test_materials_by_week_symlinks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from pathlib import Path
import os
import unittest


class MaterialsByWeekSymlinkTests(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.root = Path(__file__).resolve().parents[1]
cls.by_week = cls.root / "materials" / "by_week"

def test_by_week_leaf_entries_are_symlinks_with_existing_targets(self) -> None:
entries = []
for path in self.by_week.rglob("*"):
if path.name.startswith("."):
continue
if path.is_dir() and not path.is_symlink():
continue
entries.append(path)

self.assertGreater(len(entries), 0, "Expected materials/by_week to contain linked material entries")

for entry in entries:
self.assertTrue(entry.is_symlink(), f"{entry}: expected by_week entry to be a symlink")
target = (entry.parent / os.readlink(entry)).resolve()
self.assertTrue(target.exists(), f"{entry}: symlink target does not exist: {target}")


if __name__ == "__main__":
unittest.main()
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tmp/pdfs/official/sample_final/page-01.png
Binary file added tmp/pdfs/official/sample_final/page-02.png
Binary file added tmp/pdfs/official/sample_final/page-03.png
Binary file added tmp/pdfs/official/sample_final/page-04.png
Binary file added tmp/pdfs/official/sample_final/page-05.png
Binary file added tmp/pdfs/official/sample_final/page-06.png
Binary file added tmp/pdfs/official/sample_final/page-07.png
Binary file added tmp/pdfs/official/sample_final/page-08.png
Binary file added tmp/pdfs/official/sample_final/page-09.png
Binary file added tmp/pdfs/official/sample_final/page-10.png
Binary file added tmp/pdfs/official/sample_final/page-11.png
Binary file added tmp/pdfs/official/sample_final/page-12.png
Binary file added tmp/pdfs/official/sample_final/page-29.png
Binary file added tmp/pdfs/official/sample_final/page-30.png
Binary file added tmp/pdfs/official/sample_final/page-31.png
Binary file added tmp/pdfs/official/trial_final/page-01.png
Binary file added tmp/pdfs/official/trial_final/page-02.png
Binary file added tmp/pdfs/official/trial_final/page-03.png
Binary file added tmp/pdfs/official/trial_final/page-04.png
Binary file added tmp/pdfs/official/trial_final/page-05.png
Binary file added tmp/pdfs/official/trial_final/page-06.png
Binary file added tmp/pdfs/official/trial_final/page-07.png
Binary file added tmp/pdfs/official/trial_final/page-08.png
Binary file added tmp/pdfs/official_decks/Lecture Week 1.pdf
Binary file not shown.
Binary file added tmp/pdfs/official_decks/Lecture Week 4.pdf
Binary file not shown.
Binary file added tmp/pdfs/official_decks/Lecture Week 5.pdf
Binary file not shown.
Binary file added tmp/pdfs/official_decks/Lecture Week 6.pdf
Binary file not shown.
Binary file added tmp/pdfs/official_pptx/Lecture Week 1.pdf
Binary file not shown.
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-01.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-05.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-08.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-15.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-17.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-23.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-24.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-25.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-31.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-33.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-40.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-41.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-44.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-45.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 1/page-46.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2.pdf
Binary file not shown.
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-01.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-03.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-09.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-16.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-19.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-22.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-31.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-33.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-34.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-36.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-39.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 2/page-43.png
Binary file added tmp/pdfs/official_pptx/Lecture Week 3.pdf
Binary file not shown.
Loading
Loading