Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
162 commits
Select commit Hold shift + click to select a range
e60200c
Adjusted 10_Welcome.ipynb page for the Python-Apprentice repository. …
dotnetdork Aug 13, 2025
074baab
changed Open_The_Screen
dotnetdork Aug 20, 2025
5cfb3dd
added back Run Programs
dotnetdork Aug 20, 2025
6c4a68d
made changes to 30_Run_Prgrams
dotnetdork Aug 20, 2025
cc0ac24
Adjusted 30_Run_Programs.ipynb -- this is still a work in progress.
dotnetdork Aug 21, 2025
b7b7429
fixed 'Run All' example--looks better now
dotnetdork Aug 21, 2025
d4918ed
Modified the '10_Welcome.ipynb' file to make it more consistent with …
dotnetdork Aug 23, 2025
d424a44
Slight changes to IDE options on the 10_Welcome.ipynb notebook + chan…
dotnetdork Aug 23, 2025
b2aabdf
added back the \.vscode\settings.json\ file that I accidentally remov…
dotnetdork Aug 23, 2025
1e9f28c
added back a tooltip to cursor -- check copilot review
dotnetdork Aug 23, 2025
84793d4
Merge branch 'typos'
dotnetdork Sep 13, 2025
a95c227
Made slight improvements to sections that enhance code readability + …
dotnetdork Sep 13, 2025
eac2cf7
removed image of 'Create codespace on master' and replaced it with a …
dotnetdork Sep 13, 2025
1ee39a0
Made some stylistic changes to make this notebook more readable and c…
dotnetdork Sep 13, 2025
bde61a2
removed unnecessary bolding
dotnetdork Sep 13, 2025
4bb762d
adjusted how I previously set up notes and tips -- this is clearer an…
dotnetdork Sep 13, 2025
a3e513e
added a hover cursor for span items (e.g., they act as tooltips)
dotnetdork Sep 13, 2025
a6148af
Added missing '#' to make comment more consistent
dotnetdork Sep 18, 2025
4a283f0
fixed bolding for 'Let's Get Set Up!'
dotnetdork Sep 18, 2025
f72c409
Added headings to break up content, changed icons to improve appearan…
dotnetdork Sep 18, 2025
551e795
Added cursor hover icon to the Python tooltip
dotnetdork Sep 24, 2025
b6dd53b
Removed unnecessary bolding
dotnetdork Sep 24, 2025
2ada36a
Removed unnecessary bolding
dotnetdork Sep 24, 2025
727fb0d
Added cursor hover icon to the Notebook files & Python files tooltip
dotnetdork Sep 24, 2025
82953bd
Typos: changed '02_Meet_Tina.py' to 'Meet_Tina.py'
dotnetdork Sep 24, 2025
5057161
Typos: changed '02_Meet_Tina.py' to 'Meet_Tina.py'
dotnetdork Sep 24, 2025
afe8c1a
Typos: changed '02c_Squares_and_Circles.py' to 'Squares_and_Circles.py'
dotnetdork Sep 24, 2025
82ba853
Updated the multi-line comment in 'Squares_and_Circles.py' to be easi…
dotnetdork Sep 24, 2025
a4c6a19
Updated the multi-line comment in 'Squares_and_Circles.py' to be easi…
dotnetdork Sep 24, 2025
455d67d
Updated readme to be clearer; changed '02b_Squares_and_Circles.py' to…
dotnetdork Sep 24, 2025
a72f997
Updated readme to be clearer
dotnetdork Sep 24, 2025
33bda16
Updated comments to become clearer
dotnetdork Sep 24, 2025
7241b8f
Updated comments to become clearer
dotnetdork Sep 24, 2025
bcd8adf
slight change to bottom tooltip
dotnetdork Sep 26, 2025
0d311ee
Restructured the Loops page to be more informative, comprehensively c…
dotnetdork Sep 27, 2025
68c6895
Restructured Loops lesson for clarity; Reorganized content into clear…
dotnetdork Sep 27, 2025
b9d48f5
Restructured .py files (Turtle Tricks + Meet Tina + Squares and Circl…
dotnetdork Sep 27, 2025
2a0dd59
Slight change to the multi-line comment for brevity
dotnetdork Sep 28, 2025
63eec31
Updated & Removed Python Cheatsheet and instead added a section about…
dotnetdork Oct 2, 2025
30d8a7e
created loop examples that are runnable
dotnetdork Oct 3, 2025
b6259d9
improved loop examples that are runnable
dotnetdork Oct 4, 2025
436327a
Updated lesson intro and summary for clarity; Replaced the old introd…
dotnetdork Oct 6, 2025
9b411c2
Separated '10_Variables_and_Functions.ipynb and 20_Variables_and_Func…
dotnetdork Oct 9, 2025
7ac313c
Separated '10_Variables_and_Functions.ipynb and 20_Variables_and_Func…
dotnetdork Oct 9, 2025
32474ef
Updated 30_Efficient_Turtle.py to have clearer directions
dotnetdork Oct 13, 2025
dc5b174
Updated 30_Efficient_Turtle.py to have clearer directions
dotnetdork Oct 13, 2025
7bcfc3d
removed unnecessary space
dotnetdork Oct 13, 2025
b207ab4
accidentally pushed with a cell block open -- reverting it
dotnetdork Oct 13, 2025
d616e36
Merge branch 'major'
dotnetdork Oct 16, 2025
cc88445
switched out py image with animated gif
dotnetdork Oct 16, 2025
dca3da6
Merge branch 'major'
dotnetdork Oct 16, 2025
8816d84
minor update: slowed down gif on welcome + slightly altered open the …
dotnetdork Oct 17, 2025
b45e15e
slight modification to Run Programs
dotnetdork Oct 17, 2025
7f5c741
Reworked 10_More_Turtle_Programs.ipynb to be clearer and consistent w…
dotnetdork Oct 17, 2025
c3f8e15
updated section titles to match my changes to 10_More_Turtle_Programs…
dotnetdork Oct 17, 2025
808bbe7
attempting to fix code bugs and make them runnable in cells for turtl…
dotnetdork Oct 19, 2025
af86805
removing ipyturtle from code, cant figure out how to get extension to…
dotnetdork Oct 19, 2025
468fe31
removed unnecessary space
dotnetdork Oct 19, 2025
1835e1b
Added a test notebook for trying out how to present ipyturtle3
dotnetdork Oct 21, 2025
347e12f
Updated a few cells to work with ipyturtle3
dotnetdork Oct 21, 2025
7f8c427
Removed TESTNOTEBOOK.ipynb
dotnetdork Oct 21, 2025
5bfd947
re-add .gitignore
dotnetdork Oct 21, 2025
e3bbb0f
Added document hider to official turtle docs
dotnetdork Oct 21, 2025
837314b
Improved the Loops.ipynb to have ipyturtle3
dotnetdork Oct 24, 2025
475e850
Improved the Loops.ipynb to have ipyturtle3
dotnetdork Oct 24, 2025
775033a
Removed complicated functions from the loops notebook
dotnetdork Nov 2, 2025
b652e5f
Fixed some code cells
dotnetdork Nov 3, 2025
a2d6fd8
Added a script that handles ipyturtle3 import statements
dotnetdork Nov 7, 2025
fcc65de
Added a class called 'turtle' that overrides the 'Turtle' class and a…
dotnetdork Nov 7, 2025
903c1bf
Cleaned up auto_turtle.py Turtle class override code to be easier to …
dotnetdork Nov 7, 2025
135d9ff
Updated a few cells to work with ipyturtle3
dotnetdork Nov 7, 2025
f746817
Minor fixes: used ype: ignore[name-defined] to hide intellisense err…
dotnetdork Nov 13, 2025
6f12361
converted 20_Functions.ipynb to use ipyturtle3 examples via auto_turt…
dotnetdork Nov 14, 2025
caf4619
Switched code cells within 10_More_Turtle_Programs.ipynb to markdown …
dotnetdork Nov 14, 2025
e07bcd9
fixed a change that was made that did not need to be
dotnetdork Nov 14, 2025
c75d5a8
Switched code cells within 10_More_Turtle_Programs.ipynb to markdown …
dotnetdork Nov 14, 2025
ba8818f
Fixed code representations within 10_More_Turtle_Programs.ipynb
dotnetdork Nov 14, 2025
6d4c20e
Fixed comment instructions to match newer updates
dotnetdork Nov 14, 2025
b62bb70
Made syl updates to fix lesson tracking
dotnetdork Nov 17, 2025
1067175
Revert "Made syl updates to fix lesson tracking"
dotnetdork Nov 17, 2025
2822d0d
Fixed lesson browser issue by updating syllabus.yaml manually
dotnetdork Nov 17, 2025
99188ac
Made slight improvements to sections that enhance notebook readability
dotnetdork Nov 21, 2025
65e5dbd
Made the warning at the bottom clearer
dotnetdork Nov 21, 2025
36d51f1
Made updates to enhance readability
dotnetdork Nov 21, 2025
fedbb8c
Fixed Turtle Example
dotnetdork Nov 21, 2025
ab91d7c
Fixed Turtle Example
dotnetdork Nov 21, 2025
9b7b1c3
Updated 10_Lists.ipynb to make it more presentable, added runnable ip…
dotnetdork Nov 22, 2025
0db0303
Updated .py assignment descriptions to match the others
dotnetdork Nov 22, 2025
2ae71eb
Fix 10_Lists.ipynb'
dotnetdork Nov 24, 2025
9eb115e
Made the 'Seeking Additional Information' heading collapsable
dotnetdork Nov 24, 2025
752e0ca
Made a temporary folder to store my project ideas and progress
dotnetdork Nov 24, 2025
4f80b70
Made a temporary folder to store my project ideas and progress UPDATED
dotnetdork Nov 24, 2025
ba435f6
Made 10_More_Turtle_Programs.ipynb clearer
dotnetdork Nov 28, 2025
7752784
Working on 10_Numbers_and_Strings.ipynb' -- Trying to make it clearer
dotnetdork Nov 29, 2025
6600ecc
Cleaned up '30_Run_Programs.ipynb' to make the images scale better
dotnetdork Nov 30, 2025
f82b0bb
Cleaned up '30_Run_Programs.ipynb' to make the images scale better
dotnetdork Dec 1, 2025
812d3da
Cleaned up '10_Numbers_and_Strings.ipynb' + fixed an issue in '20_Wha…
dotnetdork Dec 1, 2025
89d29f3
Turned check in your code reminder into an 'alert-info' div
dotnetdork Dec 1, 2025
4a20505
Added the start of Terminal_Game.ipynb project
dotnetdork Dec 1, 2025
f31808d
Fixed 30_Run_Programs.ipynb warning + added a table to 10_Numbers_and…
dotnetdork Dec 1, 2025
566de82
Updated '20_Control_Flow.ipynb' for added clarity — this is a work in…
dotnetdork Dec 5, 2025
a04e7ac
Updated a note
dotnetdork Dec 5, 2025
7959103
Separated several markdown cells to enhance student comprehension, co…
dotnetdork Dec 5, 2025
8568070
Made slight changes to this notebook for readability enhancements
dotnetdork Dec 8, 2025
2f9e935
Made some minor fixes
dotnetdork Dec 8, 2025
a47b7ae
Minor fixes
dotnetdork Dec 8, 2025
4094b57
Minor fixes
dotnetdork Dec 8, 2025
385b69e
Made some minor fixes
dotnetdork Dec 8, 2025
678b781
Made some minor fixes to wording
dotnetdork Dec 8, 2025
d70df8a
Added tooltip icons + separated the numbers section into its own note…
dotnetdork Dec 8, 2025
2caa4b4
Trying to fix syllabus.yaml to read with lesson browser
dotnetdork Dec 8, 2025
c0d09d8
Final fix to syllabus.yaml
dotnetdork Dec 8, 2025
9381249
Added tooltips, important markers, and bookmark svg symbols to enhanc…
dotnetdork Dec 8, 2025
c3ade0a
Bolded link
dotnetdork Dec 8, 2025
a427383
Made some fixes to wording to make explanations clearer + altered cod…
dotnetdork Dec 15, 2025
502cf85
Made some fixes to wording to make explanations clearer + altered cod…
dotnetdork Dec 15, 2025
0bd8e26
Made some fixes to wording to make explanations clearer + altered cod…
dotnetdork Dec 15, 2025
c8fc480
Slight updates for clarity
dotnetdork Dec 15, 2025
8bc410c
Slight updates for clarity
dotnetdork Dec 15, 2025
56c9e1b
Created 'String_Operations' notebook to break up some of the content …
dotnetdork Dec 15, 2025
e2cbcfb
Slight updates to notebook names and content
dotnetdork Dec 15, 2025
1332005
Slight fixes to content
dotnetdork Dec 15, 2025
00044b0
Make specific changes to enhance the understanding of numbers, improv…
dotnetdork Dec 19, 2025
5301eea
Finalized changes to Working_With_Numbers to improve clarity; added b…
dotnetdork Dec 19, 2025
d676423
Updated Iteration to be comprehensive, clear, and visually appealing;…
dotnetdork Dec 19, 2025
bc2b319
Created an ASCII Art Project
dotnetdork Dec 19, 2025
e9eeae8
Made slight modifications for clarity
dotnetdork Dec 22, 2025
7310a64
Added more gifs
dotnetdork Dec 22, 2025
dae6824
Updated boilerplate code
dotnetdork Dec 22, 2025
4f1462f
Improved Loops with Range (edited the gif to loop only two times, add…
dotnetdork Dec 27, 2025
bd8a8b0
Created a concise python script that inherits from `auto_turtle.py` b…
dotnetdork Dec 27, 2025
700951b
Changed 30_Lists to 30_Looping_Through_Lists (to make it easier to di…
dotnetdork Dec 27, 2025
912a12a
Fixed typo, Looping Through Lists should now appear correctly in the …
dotnetdork Dec 27, 2025
b46006c
Made minor improvements to Iteration and Looping_Through_Lists; added…
dotnetdork Dec 28, 2025
b045dac
Made general improvements for clarity, like adding visualization cell…
dotnetdork Dec 29, 2025
aff7f01
Added a section that talks about index errors
dotnetdork Dec 29, 2025
624aee7
Added ipyturtle3 to the requirements
dotnetdork Dec 29, 2025
9c4dcbe
Made improvements for clarity
dotnetdork Jan 4, 2026
e391654
Minor updates to appearance and clarity
dotnetdork Jan 5, 2026
77d6920
Created Quiz examples to showcase at next meeting. Each quiz covers a…
dotnetdork Jan 9, 2026
fe46647
Added quizzes to the lesson browser
dotnetdork Jan 9, 2026
720feac
Made quality of life improvements
dotnetdork Jan 12, 2026
0e6f8be
Fixed 130_Iterable_Turtle.ipynb to correctly be a .py
dotnetdork Jan 17, 2026
dd0c4b6
Fixed the errors in Iterable Turtle
dotnetdork Jan 17, 2026
7034201
Updated 140_More_Loops.ipynb and made mostly style changes only to sp…
dotnetdork Jan 17, 2026
9f500cb
Made design improvements to 160_Extras.ipynb
dotnetdork Jan 17, 2026
1a36751
Made subtle changes to these notebooks to ensure the designs are cons…
dotnetdork Jan 17, 2026
628fc1a
Improved to be easier to understand
dotnetdork Jan 19, 2026
fbd42a1
Separated `Functions` into two notebooks: `10_Functions.ipynb` & `20_…
dotnetdork Jan 24, 2026
c4a36a2
Made several quality of life improvements
dotnetdork Jan 26, 2026
31cb91b
Made several quality of life improvements (accidentally didnt push th…
dotnetdork Jan 26, 2026
abfc4ef
Quality of life improvements that did not push for some reason
dotnetdork Jan 26, 2026
54f6c2e
QoL
dotnetdork Jan 26, 2026
2c6744c
Pushing changes that were previously not committed
dotnetdork Jan 26, 2026
c648e13
Add new lessons on Turtle graphics and Lists, including exercises for…
ericbusboom Apr 17, 2026
69e9572
Minor Edits
ericbusboom Apr 17, 2026
d8b4375
Refactor code structure for improved readability and maintainability
ericbusboom Apr 17, 2026
b364854
Refactor ASCII Art and Spin The Wheel lesson content for clarity and …
ericbusboom Apr 17, 2026
b356c9f
Merge remote-tracking branch 'origin/master' into dnd-2026
ericbusboom Apr 17, 2026
2894fe1
Add quizzes for Modules One, Two, and Three
ericbusboom Apr 17, 2026
bb8ff16
Refactor quiz file paths and add syllabus.yaml for course structure
ericbusboom Apr 17, 2026
2df164b
Refactor code structure for improved readability and maintainability
ericbusboom Apr 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

*.class
Level1-Module3/_01_gui_app_bindings/_c_PigLatinTranslator/__pycache__/PigLatinConverter.cpython-38.pyc
*.xml
Expand All @@ -11,8 +10,6 @@ Level1-Module3/_01_gui_app_bindings/_c_PigLatinTranslator/__pycache__/PigLatinCo
.idea
.idea/workspace.xml



# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
Expand Down Expand Up @@ -56,4 +53,4 @@ coverage.xml
saved/

.jtl/*completion*
.vscode
.vscode
147 changes: 147 additions & 0 deletions .lib/auto_turtle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
#!/usr/bin/env python
"""
auto_turtle.py

This script automatically sets up the ipyturtle3 environment
for use in a Jupyter Notebook.

When used with %run, it will:
1. Import all necessary modules (turtle, Canvas, TurtleScreen, Turtle, display).
2. Create and display a default Canvas named 'myCanvas'.
3. Define a custom Turtle class that remaps the coordinate system so that
the student's (0, 0) is at (start_x, start_y) on the canvas.
4. Display the Canvas in the notebook.
5. Wait a moment to ensure the canvas is rendered.
6. Create a TurtleScreen for the canvas named 'myTS'.
"""

import time # Might not be necessary, but used for sleep

# --- Configuration ---
canvas_width = 750 # Width of the turtle canvas
canvas_height = 250 # Height of the turtle canvas
start_x = -300 # Starting X position of the canvas
start_y = -50 # Starting Y position of the canvas
time_sleep = 0.1 # Time to wait for canvas rendering
# ---------------------

try:
# 1. Import the main library and necessary classes
import ipyturtle3 as turtle
import sys, types
from ipyturtle3 import Canvas, TurtleScreen, Turtle
from IPython.display import display

turtle = types.ModuleType("turtle") # Make a fake 'turtle' module
# 2. Define a NEW Turtle class that overrides the original for custom behavior
class turtle(Turtle):
"""
Custom Turtle class that remaps the coordinate system.
The student's (0, 0) is now our (START_X, START_Y).

This class overrides all position-related methods to
translate between the student's "relative" coordinates
and the canvas's "absolute" coordinates.
"""
def __init__(self, screen=None, *args, **kwargs):
"""
Initializes the turtle and moves it instantly
to the new (0, 0) origin point.
"""
# Store the new origin offset
self._origin_x = start_x
self._origin_y = start_y

# Call the original __init__ to create the turtle
super().__init__(screen, *args, **kwargs)

# --- Set the default starting position (instantly) ---
original_speed = self.speed() # Save original speed
self.speed(0) # Set to instant
self.penup()
super().goto(self._origin_x, self._origin_y) # Move to *absolute* start
self.pendown()
self.speed(original_speed) # Restore original speed

# --- Private Helper Methods ---

def _to_absolute(self, x, y):
"""Converts student's relative (x, y) to absolute canvas coordinates."""
return (x + self._origin_x, y + self._origin_y)

def _to_relative(self, x, y):
"""Converts absolute canvas (x, y) to student's relative coordinates."""
return (x - self._origin_x, y - self._origin_y)

# --- Overridden Position & Movement Methods ---

def goto(self, x, y):
"""Moves the turtle to a (student) coordinate."""
abs_x, abs_y = self._to_absolute(x, y)
super().goto(abs_x, abs_y)

def setposition(self, x, y=None):
"""Alias for goto."""
# This handles the case where setposition is called with one arg (a tuple)
# or two args (x, y). Standard turtle behavior.
if y is None:
try:
x, y = x
except TypeError:
# Handle error or just pass to goto to raise it
pass
self.goto(x, y)

def setx(self, x):
"""Sets the turtle's (student) x coordinate."""
abs_x = x + self._origin_x
super().setx(abs_x)

def sety(self, y):
"""Sets the turtle's (student) y coordinate."""
abs_y = y + self._origin_y
super().sety(abs_y)

def position(self):
"""Returns the turtle's (student) position."""
abs_x, abs_y = super().position()
return self._to_relative(abs_x, abs_y)

def pos(self):
"""Alias for position."""
return self.position()

def xcor(self):
"""Returns the turtle's (student) x coordinate."""
abs_x = super().xcor()
return abs_x - self._origin_x

def ycor(self):
"""Returns the turtle's (student) y coordinate."""
abs_y = super().ycor()
return abs_y - self._origin_y

turtle.Turtle = Turtle # This puts the class in the fame module
sys.modules["turtle"] = turtle # This allows "import turtle" to work.

# 3. Create a Canvas for the turtle to draw on
myCanvas = Canvas(width=canvas_width, height=canvas_height)

# 4. Display the Canvas in the Jupyter notebook
display(myCanvas)

# 5. Wait a moment to ensure the canvas is fully rendered
time.sleep(time_sleep)

# 6. Create a TurtleScreen
myTS = TurtleScreen(myCanvas)
myTS.clear() # Clear the screen to start fresh

# Handle import errors gracefully
except ImportError:
print("❌ Error: 'ipyturtle3' or 'IPython' not found.")
print("Please make sure you are in a Jupyter environment and have")
print("ipyturtle3 installed (e.g., `pip install ipyturtle3`).")
# Handle any other exceptions
except Exception as e:
print(f"An error occurred during auto_turtle setup: {e}")
29 changes: 29 additions & 0 deletions .lib/auto_turtle_concise.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env python
"""
auto_turtle_concise.py
Inherits setup from auto_turtle.py and initializes 'tina'.

This just inherits the setup from auto_turtle.py but creates 'tina' the turtle for you.
It's a more concise way to get started with Tina the Turtle without having to write the setup code again.
My intent was to use this for the later examples in this course since they already will know how to use Tina at that point.
"""

try:
# Attempting to open and execute auto_turtle.py to inherit its setup
# Use utf-8 to prevent a UnicodeDecodeError on some systems
with open(".lib/auto_turtle.py", encoding="utf-8") as f:
exec(f.read())

# Setup Tina (using the variables inherited from auto_turtle.py)
# These will only run if the 'exec' above was successful
tina = turtle(myTS) # type: ignore[name-defined]
tina.shape('turtle')
tina.speed(5)

except FileNotFoundError:
print("Error: Could not find and inherit from '.lib/auto_turtle.py'.")
print("Please ensure auto_turtle.py exists in the .lib directory.")

except Exception as e:
# Any other exceptions that may occur
print(f"Error: {e}")
6 changes: 3 additions & 3 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
"**/.svn": true,
"**/.hg": true,
"**/Thumbs.db": true,
"**/*.crswap": true,
"**/__pycache__": true,
"**/.cache": true,
"**/.coverage": true,
"**/.coverage.*": true,
"**/.hypothesis": true,
"**/.mypy_cache": true,
"**/.nox": true,
"**/.pytest_cache": true,
"**/.ruff_cache": true,
"**/.tox": true
"**/.tox": true,
"**/*.crswap": true,
"**/.cache": true
}

}
2 changes: 1 addition & 1 deletion .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
league{
"version": "2.0.0",
"tasks": []
}
99 changes: 99 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# Curriculum Review Guide

This repository is the League's Python Apprentice curriculum, aligned with the Python Institute's [PCEP](https://pythoninstitute.org/pcep) (entry-level) exam. Students are typically middle school and early high school age. Lessons live in `lessons/` as Jupyter notebooks organized into numbered category directories.

When asked to review a lesson or set of lessons, use the criteria below.

## Voice

Aim for a fun adult tone — a good teacher who respects the reader, not a kids-TV host or a cheerleader. Silly topic choices (badgers, mushrooms, snakes) are fine; breathless enthusiasm is not.

**Do:**
- Write like you'd explain something to a smart 12-year-old.
- Use "you" — the student is the reader.
- Allow at most one exclamation point per lesson, and only when the emphasis is genuinely earned.

**Don't:**
- Use "super", "awesome", "amazing", "fantastic", "incredible" as intensifiers.
- Write "We're so excited", "Don't worry!", "Let's go!", "You've got this!", "Ready to have some fun?".
- Use ALL-CAPS warnings or stacked exclamation points.
- Use emojis as substitutes for words (e.g. "turn left 🡐", "move forward ⬆️"). Decorative emojis in small doses are fine.
- Adopt kid-speak or corporate-training-speak.

**Example:**
- Okay: *"The turtle draws a line behind it as it moves."*
- Not okay: *"The turtle draws a SUPER cool line as it zooms around! 🚀"*

## Content flow

Within each lesson and across lessons in a category, check:

- **Logical progression** — each step follows from the last.
- **No prerequisites from later lessons** — every concept used in code or exercises has been introduced already, or is flagged with a brief "we'll cover this later".
- **No abrupt jumps** — difficulty increases smoothly.
- **Callbacks where warranted** — reference earlier lessons when it reinforces the current one, but don't force it.
- **Consistent terminology** — once we call it a "function", don't switch to "method" or "routine" without reason. Flag terminology drift across lessons.
- **No holes** — if a lesson uses a skill the student hasn't seen, that's a hole worth flagging.

**Motivation vs. mechanics:** Kids often do fine being handed a mechanic and getting the reason after they've tried it, as long as the mechanic itself is sensible. Don't flag missing motivation unless the lesson genuinely doesn't make sense without it.

**One concept per lesson:** The general preference is focused lessons, but existing structure takes priority. Note serious violations in the review, but **do not rewrite lessons to split concepts without explicit approval**.

## Technical quality

- Code examples must run as written.
- Examples should be realistic — not `foo()` / `bar()` placeholders — but not so elaborate they distract from the concept being taught.
- Follow PEP 8: 4-space indents, `snake_case` for variables and functions, `PascalCase` for classes, blank lines between top-level definitions, no trailing whitespace, line lengths ~79–100 chars, imports at the top.
- Accurate technical claims. Simplifications are fine ("a variable is a box for data"); outright-wrong statements are not.
- When we teach a topic, teach it thoroughly: a worked example, an exercise, and at least one edge case or common mistake called out.

### Exercise stubs are intentional

Many lessons have exercise code where key lines or whole function bodies are missing, commented out, or replaced with `...` / `# Your code here`. The student is supposed to type those in. Do **not** flag these as bugs, syntax errors, or missing implementations. Common shapes:

- `def foo():` with just a `# Your code here` comment as the body
- A bare `x = ` with no value (student will fill in the expression)
- `... # Your code here` placeholders in the middle of otherwise-complete code
- `.py` files that contain only a docstring — the rest is for the student

Only flag these if something adjacent is actually wrong (e.g. the surrounding hint text is misleading, or the stub references a concept the student hasn't learned).

## Scope

Curriculum targets PCEP. Intentionally **out of scope**:

- List / dict / set comprehensions
- Generators and `yield`
- Decorators
- Context managers beyond `with open(...)`
- Metaclasses, descriptors, `__slots__`
- `async` / `await`
- Type hints beyond incidental use

Do not suggest adding these. Teach what we teach thoroughly rather than expanding the surface area.

## Review workflow

When asked to review one or more lessons:

1. Read the lesson(s) in full, plus enough surrounding lessons in the same category (and the lesson immediately before and after) to judge flow and prerequisites.
2. Produce a markdown review with one `## <relative file path>` heading per file, and findings as bulleted items underneath.
3. The user will delete findings they don't want applied and hand the edited review back.
4. Apply the remaining findings.

### Finding format

Each bullet must be **standalone and deletable** — removing it shouldn't break any other finding. Include: category tag, location, the problem, and a concrete suggestion.

Group findings under each file heading in this order: **Voice**, **Flow**, **Technical**, **Scope**. Order within a category follows the location in the file.

```
## lessons/10_Turtles/10_Welcome/10_Welcome.ipynb

- **Voice** (cell 0, opening line): "Hello future coders, programmers, and engineers!" — drop the greeting, open with "Welcome to your first Python lesson."
- **Voice** (cell 0, intro paragraph): "We're super excited to help you..." — rewrite as "This course will help you take your first steps into programming."
- **Flow** (cell 2, exercise): exercise uses `random.randint()` but `random` hasn't been introduced — either introduce it earlier or swap the exercise for one using only what's been taught.
- **Technical** (cell 4, code block): mixes `Turtle()` and `turtle.Turtle()` — standardize on one convention and use it throughout the lesson.
```

Keep findings specific enough that applying one doesn't require re-reading the whole lesson. If a single change touches multiple places in a lesson (e.g. "rename `x` to `count` everywhere"), that's one finding — say so in the bullet.
Loading