Week 3 Checkpoint: Ship a Tested Package
- Recall the week's core moves from memory: hints, logging, packaging, testing, PRs
- Rebuild the packaging ritual (venv β pyproject β editable install β console script) without notes
- Ship loganalyzer v0.1.0: packaged, typed, logged, tested, documented, on GitHub
- Diagnose your weakest topic from quiz history and close the gap today
| Spaced-rep drill: full Week 3 flashcard deck | 15 min |
| Guided: closed-book packaging rebuild | 20 min |
| Guided: recall gauntlet (5 topics) | 20 min |
| Practice: close your weakest gap | 15 min |
| Project: ship v0.1.0 (checklist + stranger test + tag) | 40 min |
| Quiz + journal release note | 10 min |
Builds on: Day 15 β Clean code & type hints Β· Day 17 β Packaging & environments Β· Day 18 β pytest fundamentals Β· Day 20 β GitHub collaboration
There is a moment in every craftsperson's apprenticeship when a tool they made stops being "practice" and gets handed to a stranger to actually use. That moment changes everything about how you finish the work: the handle gets sanded because someone else's hand will hold it, the box gets a label because you won't be there to explain it. Today is that moment for your log analyzer β and for your brain.
The brain part first: this week you met six dense topics, and right now they sit in fresh, fragile memory. Today's recall drills force you to *reproduce* them β write the pyproject from memory, type the shell ritual blind β because the act of struggling to retrieve is what converts fragile memory into durable skill. Rereading feels better and works worse; you know this from Day 1. Then the shipping part: everything the week taught β types (Day 15), the flight recorder (16), the recipe box (17), the alarms (18β19), the shared house (20) β converges into one artifact a stranger could pip install and trust. Version 0.1.0. Your first shipped tool.
Two career muscles get built today. First, spaced retrieval: engineers who can rebuild a pyproject.toml or a fixture from memory move at a different speed than engineers who re-Google the skeleton every time β interviews measure exactly this. Second, the shipping standard: "packaged, typed, tested, documented, on GitHub" is the definition of done you will apply to every artifact through Day 180, including the capstone. Recruiters and customers never see effort; they see whether the repo installs cleanly and the tests pass. Today you set that bar and clear it once, completely.
Guided practice
Closed-book rebuild: the packaging skeleton
20 min- Close every editor tab and note. In an empty folder
recall-lab, write from memory: apyproject.tomlfor a package namedshipcheckwith one console scriptshipcheck, and the matchingsrc/shipcheck/cli.pywith a minimal main(). - Terminal: prove it from memory too: create a venv, activate,
pip install -e ., runshipcheck. No peeking until it either works or you are truly stuck (then peek at ONE line, close the note, continue). - Diff your pyproject against Day 17's real one. List every field you forgot or misspelled β that list is your personal weak-spot map.
- Score yourself: worked first try (mastered) / needed one peek (solid) / needed the notes open (revisit Day 17's flashcards tonight).
Recall gauntlet: one rep per topic
20 minFive two-to-four-minute reps, all from memory, each checked immediately against the real thing:
- Day 15: annotate this signature fully: a function taking lines (list of strings) and a limit, returning the top counts mapping or None on empty input. Check with mypy.
- Day 16: write the four-line logging setup (basicConfig with level + timestamped format + named logger) and state the five levels in order.
- Day 18: write a parametrized test with three rows for a function
is_error_status(code)β then implement it to make them pass. - Day 19: write a fixture that creates a two-line log file in tmp_path and a test using it.
- Day 20: on paper, write the exact command sequence from "I have a new feature idea" to "merged PR" (branch β commit β push -u β PR β review β merge β pull). Check against your Day 20 practice.
Log each rep in your journal as mastered / solid / revisit.
On your own
Close your weakest gap
15 minPull up your quiz results from Days 15β20 and the mastered/solid/revisit log from the gauntlet. Pick the single weakest topic β not the one you like least, the one with the most misses.
Goal: 15 focused minutes on that day's flashcards and its guided exercise, redone from scratch (not reread). Finish by writing one new flashcard in your own words that targets the exact confusion you had.
Hints: if two topics tie, pick the one Day 21's shipping checklist depends on more (packaging and testing outrank everything today).
Ship loganalyzer v0.1.0
Assemble the week into a release. Work through the shipping checklist in tech order: structure, correctness, legibility, operability, distribution. Close the two GitHub issues you filed on Day 20 (do the work, reference the issue in the commit message, land via PR). Run the brutal stranger test β clone from GitHub into a fresh venv in a fresh directory, pip install -e ., run loganalyzer report sample.log, run pytest β and fix whatever it exposes at the source. Tag v0.1.0 and push the tag. Then write the release note: a 5-line "what this tool does and what I learned building it" section at the top of your journal β the seed of the portfolio narrative you'll polish on Day 180.
Common mistakes & misconceptions
- Rereading the week's lessons instead of doing the recall drills. Recognition masquerades as knowledge; only retrieval reveals (and repairs) what is actually missing.
- Running the stranger test from your local folder instead of a fresh GitHub clone. Your working directory hides sins β uncommitted files, stray configs β that the clone exposes.
- Treating β₯80% coverage as the goal instead of a floor. Ten meaningful behavior tests beat thirty asserting that constants equal themselves; coverage measures execution, not verification.
- Shipping with a stale README. Docs describing last Tuesday's interface are worse than none β the stranger test includes following your own README literally, step by step.
- Skipping the tag. Without v0.1.0 pinned, "the version I shipped" becomes archaeology in a month. Tags are free; do it every release from now on.
- Letting the checkpoint slip to "mostly done." A 90% shipped tool is 0% shipped β the discipline of finishing completely is the actual lesson of the day.
Q1. Why does today force you to WRITE the pyproject.toml from memory instead of rereading Day 17?
Q2. The honest stranger test for your package isβ¦
Q3. Your suite reports 85% coverage. What can you conclude?
Go deeper β curated resources
- GitHub Releases β Turn the v0.1.0 tag into a Release on GitHub with your release note as the description β it makes the repo read as maintained software rather than homework.
- Recall gauntlet logged with mastered/solid/revisit per topic
- v0.1.0 tagged on GitHub and the brutal stranger test passed from a fresh clone
- Both Day 20 issues closed via PRs
- Quiz β₯ 2/3 and weakest-topic session done
β Back: This checkpoint is Days 15β20 compressed into one artifact: Day 15's types, Day 16's cockpit, Day 17's recipe box, Days 18β19's alarms, Day 20's shared house.
Forward β: Phase 2 starts tomorrow with Big O β and uses this repo as its gym: Day 22's complexity notes and Day 28's pattern log live here. The shipping checklist you ran today reappears, grown up, as the capstone's Definition of Done on Days 176β178.