The path, at your pace
Groundwork Twelve.
Twelve stages from zero to AI-native development habits: terminal, tmux, Git, an editor, real programming, data, the web, and directing agents. Run it steady in twelve weeks, committed in six, or immersed in under a month — same sequence, same gates, your hours.
Groundwork Twelve combines pieces that are usually separate: from-zero tool fluency, a session-by-session plan, hours-deep practice that builds muscle memory, honest progress measurement, and directing AI agents as a first-class skill. It sequences the pages already in this guide — each session tells you what to do, how long it takes, and where to read.
It's written in layers, like everything here. If you already know a stage's material, take its gate check first: pass it and move on, and let the plan slow you down only where your fingers (not your understanding) need the reps.
#Pick your pace
The plan is 60 core sessions and 12 builds, organized into 12 stages. A stage ends at a gate check — you advance when you pass it, not when the calendar says so. Pace decides how many sessions you run per day and how deep each day goes. More hours don't just finish sooner; they compound into more total practice, and the hours are the product.
| Steady ~1h/day | One session per weekday, the build on Saturday, Sunday off. A stage per week, done in 12 weeks / 84 days, ~120 hours. The proven shape for fitting this around a job — habits and foundations, sustainably. |
| Committed 2–4h/day | A session and a half per day plus extended drills and build time. A stage every 3–4 days, done in ~6 weeks, ~180 hours. Rest when you need it, not by calendar. |
| Immersed 8–12h/day | The gamer schedule: two core sessions a day inside long drill, build, and play blocks. A stage every day and a half or two, done in 3–4 weeks, ~250–350 hours — a different outcome, not just a faster one. The day template below is the whole design. |
Most people who plan twelve-hour days sustain three. That's fine — the gates don't care. Because progression is check-passed rather than calendar-boxed, the plan never lies about where you are: run immersed for a week, drop to steady for a month, and nothing breaks. Declare your pace in your log, change it when life changes.
#The shape of a day
Every core session has the same four slots, about an hour together:
| ⟳ Drill 20m | Repeat an earlier skill until it's automatic. Skills come back on a fading schedule — about two days after you learn them, then a week, then three weeks. Each session names what to re-drill so you never have to plan it. |
| New 25m | Today's new material — a section of a Groundwork page, hands on the keyboard while you read. |
| Do 10m | A small concrete task using the new thing, unassisted. |
| Log 5m | One honest line in log.md, committed. The commit is the day. |
At Steady pace, one session is the day, the build is Saturday, and Sunday is rest or catch-up. At Committed and Immersed pace, sessions nest inside a bigger day. The immersed day is designed the way gamers actually play — an hour of new mechanics, many hours of play:
| Core session 60–90m | The next session in the sequence, exactly as written. |
| Drill & game block 1–2h | Extended reps: the stage's "go deeper" drills, game campaigns (Bandit, git-game, Vim Adventures), speed-runs of old katas. |
| Build block 3–4h | The stage build, grown daily instead of saved for Saturday. This is where immersion pays most — builds get scope Steady pace can't afford. |
| Second core session 60–90m | The next session. Two per day is the honest ceiling for genuinely new material — beyond that you're skimming, not learning. |
| Play & explore block 1–2h | Side quests: read a real codebase, rebuild an old artifact from memory ("new game+"), wander the tools. Curiosity time is load-bearing. |
| Close 15m | Log, commit, and a one-line plan for tomorrow. |
Life happens at every pace, so every calendar day has three modes. The streak survives as long as you do the minimum:
| Full day | Your pace, as planned. |
| Minimum day | 15 minutes — one drill, one log line, one commit. That's a real day at any pace. |
| Catch-up day | Yesterday's material plus today's. Never stack more than one missed day; if you're two behind, skip the older one and keep moving. |
People finish paced programs together far more often than alone. One friend on the same sequence — even at a different pace — or one person who reads your log weekly changes the odds more than any tool on this site.
#Let the agent run the schedule
Three presets can't capture "90 minutes on weekdays, ten hours on Saturday" — but your agent can, trivially. The log-repo scaffold ships a machine-readable syllabus.md (all 60 sessions, drills, builds, and gates) and a prompts/scheduler.md. Each day, tell the agent your hours; it reads your log and the syllabus and serves a plan sized to exactly the time you have — including which old drills are due for their spaced repeat. You declare intent; it does the bookkeeping. That's the whole Groundwork thesis in miniature.
$ cd ~/groundwork-log && claude
> Use prompts/scheduler.md. I have 6 hours today.
#Play your way through it
If games are what keep you coming back, real ones exist for most of these skills — legitimate substitutes for drill slots and first-class citizens of the immersed drill & game block (never substitutes for the build):
| bashcrawl | A dungeon crawler that is a folder tree: explore with cd, examine with ls, read scrolls with cat, fight monsters with scripts. The gentlest possible start — Stage 1. |
| OverTheWire: Bandit | The classic. SSH into level 0, find the password to level 1, repeat for 30+ levels of escalating shell cleverness. Stages 2–6 and beyond; a full campaign for immersed players. |
| The Command Line Murder Mystery | Solve a murder with grep, pipes, and wits — a whodunit made of files. The Stage 2 build has a game mode built on it. |
| cmdchallenge | One-line shell puzzles in the browser, instant feedback. Great minimum-day material. |
| Learn Git Branching | The most-loved Git visualizer: watch the commit graph move as you type commands. Stage 4's secret weapon. |
| git-game & Oh My Git! | A treasure hunt played inside a real repo, and an open-source game that visualizes Git's internals live. Stages 4–6. |
Vim Adventures & vimtutor | Zelda-meets-text-editing in the browser, and the 30-minute interactive tutorial already installed. Stage 5. |
| SQLBolt | Interactive SQL puzzles in the browser — not dressed as a game, but it plays like one. Stage 8. |
Nobody has made a good game for tmux, or for directing agents. If those existed we'd list them; they may yet come from here — the agent itself makes a surprisingly good game master (ask it: "invent a five-level terminal treasure hunt for me in a scratch folder and grade my solutions").
#How progress is measured
Four layers, no gimmicks. No points, no badges, no timers — artifacts, observable skills, and gates.
| 1. The daily log | Your log is a Git repository — creating it is Session 1. One line per day, committed daily. The streak is git log, so measuring your progress is itself Git practice. Push it to GitHub for public accountability if that motivates you. |
| 2. Gate checks | Every stage ends with a short "can you do this without the cheat sheet?" list. Observable, not timed. Pass it to advance — at any pace. Fail it and repeat the drills; that's information, not failure. |
| 3. The agent as examiner | At every gate from Stage 4 on, the agent quizzes you (prompt below). It reads your log, sees what you've been avoiding, and gives you real feedback — the thing self-paced learning usually lacks. |
| 4. Stage builds | Twelve builds, one per stage, all in your repo — ending with a capstone. They're the assessment, not extra practice. By the end your repo is a portfolio of proof, not a certificate. |
The log template
Session 1 creates ~/groundwork-log. Start log.md with this — pace declared up top, one line per day:
# Groundwork Twelve — my log
Pace: immersed (~9h/day) — declared 2026-07-07, revisit anytime
Day 1 (2026-07-07): Sessions 1+2, bashcrawl cleared, build started. 9h. Hands tired, hooked.
Day 2 (2026-07-08): Session 3+4, Bandit 0-5. The rm scare happened. 8h.
Day 3 (2026-07-09): Minimum day — one drill, this line. 15m. Life happened; streak lives.
At every gate, add a short review under a heading: what got easier, what still feels slow, one thing to repeat. Honest beats impressive — the log is for you. (Restarting on a new machine later? new-twelve-log scaffolds the repo with all the templates in place.)
The examiner prompt
At each gate check from Stage 4 on, start your agent in the log repo and paste this — it ships in the scaffold as prompts/examiner.md:
Read log.md and this stage's files. You are my examiner, not my helper.
Give me five small tasks that test this stage's skills, one at a time,
and wait for me to do each in my terminal and report back.
Don't show me how. After the five, tell me: what am I avoiding,
what should I repeat next stage, and one thing I did well.
#Agent rules by phase
The agent is present from Session 1 — but what it's allowed to do grows as your fundamentals harden. This ladder is the heart of the plan: an agent that does the work for you in Stage 2 quietly robs you of the practice that makes Stage 10 possible. Each session below has an Agent: line applying these rules; state your phase when you start a session.
| Stages 1–3 Explainer | Allowed: explain commands and concepts, quiz you, point out mistakes after you try, generate practice drills, and (any pace) serve your daily schedule. Not allowed: write commands for you to copy blindly, edit files for you, solve a drill before you've attempted it. |
| Stages 4–6 Reviewer | Allowed: everything above, plus review your commits and diffs, critique your scripts, give you a recovery plan when you're stuck. Not allowed: make the commits, fix the script itself, or run recovery commands you don't understand yet. |
| Stages 7–9 Bounded pair | Allowed: everything above, plus implement small pieces after you've written the spec or failing test, and suggest edge cases you missed. Not allowed: choose what to build, or merge anything you haven't read line by line. |
| Stages 10–12 Delegate | Allowed: own bounded tasks end to end — plan, edit, run checks, report back with a diff and verification notes. Not allowed: skip the plan, skip verification, or commit. You own the merge — that never changes. |
Because judgment is the skill. An agent can produce working output on Session 1, but the ability to direct, review, and verify that output only grows out of hands-on fluency. You climb the ladder as fast as your gates pass — the restriction is scaffolding, not punishment.
#The arc
| Stages 1–3 | Machine fluency: keyboard, terminal, files, the modern shell tools, tmux. Agent explains and quizzes only. |
| Stages 4–6 | Craft: Git for real, your editor, pipes and scripts, publishing to GitHub. Agent becomes your reviewer. |
| Stages 7–9 | Programming, data, and the web: code by hand, then SQL and document stores, then HTTP — the three things every real app is made of. Agent becomes a bounded pair. |
| Stages 10–12 | Direction at scale: narrow agent tasks, then specs, plans, verification, and judgment across whole repos. Capstone. |
#Stage 1 — Keyboard, terminal, and your log
Steady: week 1Committed: ≈ days 1–4Immersed: ≈ days 1–2
Reading: Getting started. Everything happens in the terminal from the first minute. Agent phase: explainer.
| Session 1 | Create your learning repo. New: open Ghostty; learn pwd, ls, cd, mkdir, touch by using each five times.Do: the ritual — you'll understand it fully in Stage 4; for now, trust it: mkdir ~/groundwork-log && cd ~/groundwork-log && git init, create log.md from the template (pace line included), git add -A && git commit -m "day 1".Log: which command felt strangest? Agent: ask it to explain each command in one sentence. Don't let it run them. |
| Session 2 | Move without the mouse. ⟳ Drill: Session 1's five commands, from memory. New: line editing — Tab completion, CtrlA/E, AltB/F, CtrlL. Do: the walk-the-tree drill from Getting started, five rounds. Log: where did your hand drift to the mouse? Agent: ask for a ten-question quiz on today's keys. |
| Session 3 | Files and folders. ⟳ Drill: walk-the-tree (Session 2), two rounds. New: mv, cp, rm -i in a scratch folder under /tmp.Do: delete the wrong file on purpose, feel the stomach drop, recreate it — that feeling is why Stage 4 exists. Game option: spend the Do slot in bashcrawl instead — it drills exactly today's commands. Log: commit it. Agent: after your attempt, ask it to point out anything dangerous in how you used rm. |
| Session 4 | Shell comfort. ⟳ Drill: files drill (Session 3), fresh scratch folder. New: history with CtrlR; --help and man; the survival kit (CtrlC, q, CtrlD).Do: re-run yesterday's drill typing nothing you've typed before — history only. Log: one thing man taught you.Agent: ask "quiz me: which key gets me out of five stuck situations?" |
| Session 5 | tmux, first contact. ⟳ Drill: history recall (Session 4). New: tmux new -s twelve; split panes, move with Alth/j/k/l, detach with Ctrla then d, reattach.Do: the Stage 1 gate check below. Log: check results, honestly. Agent: ask it to explain what a session actually is, like you're smart but new. |
Your workspace, repeatable. From a fresh terminal, build the setup you'll use every day: a tmux session with a pane for work, a pane for notes, your log open. Then write workspace.md — the exact steps to open it from cold — and commit it. Blank canvas: no copying from this page, only from your own history and notes.
Clear bashcrawl end to end. Start Bandit levels 0–5. New game+: rebuild the workspace from memory, no notes. Side quest: keep a second scratch "command journal" — every command you meet, one line on what it did.
Gate check 1 — without the cheat sheet: navigate anywhere and back; create, move, and delete a file; recall a command with CtrlR; start, split, detach, and reattach tmux; a commit in your log for every day so far.
#Stage 2 — The daily drivers
Steady: week 2Committed: ≈ days 4–7Immersed: ≈ days 3–4
Reading: Shell & CLI. Clone a real project to explore: git clone https://github.com/jasondockery/groundwork ~/code/groundwork-explore. Agent phase: explainer.
| Session 6 | Listing and reading. ⟳ Drill: tmux basics (Session 5) — open, split, detach, return. New: ll, lt, ltt (eza), bat.Do: map the cloned repo's structure three levels deep without a file manager; read two files with bat.Log: what did ll's git column show you?Agent: ask what the permission letters in ll mean. |
| Session 7 | Search inside everything. ⟳ Drill: files (Session 3) — one fast round. New: rg — smart case, -t filters, then rgf for fuzzy live search.Do: find every mention of "tmux" in the cloned repo; count them with rg -c.Log: your favorite find. Agent: ask it to set you three search challenges in the repo, then grade you. |
| Session 8 | Find files, jump folders. ⟳ Drill: rg (Session 7), three quick searches. New: fd by name; z (zoxide) to teleport between folders you've visited.Do: visit three projects, then bounce between them with z fragments only.Log: commit. Agent: ask when fd beats rg --files and vice versa. |
| Session 9 | Fuzzy everything. ⟳ Drill: z-jumping (Session 8). New: CtrlT file picker, AltC folder jump — fzf everywhere. Do: the full loop five times: find a file, search inside it, read it — keyboard only. Log: time-to-file, gut feel vs. Session 6. Agent: quiz — "describe a file, I'll find it in under four keystrokes of picker input." |
| Session 10 | History that works for you. ⟳ Drill: the find-search-read loop (Session 9). New: Atuin's CtrlR across sessions; the space-prefix privacy trick. Do: build cheatsheet.md in your repo — your personal top ten, pulled from real history. Then the gate check.Log: check results. Agent: ask it to read your cheatsheet and name one command you should be using but aren't. |
Scavenger hunt — pick your flavor. Either: ask your agent to write ten questions about the cloned repo, answer all ten with terminal tools, and commit hunt.md with each question, command, and answer (agent asks and grades — never answers). Or, game mode: play The Command Line Murder Mystery and commit your case notes — who did it, and the exact command trail that proved it.
Do both build flavors. Bandit levels 6–12. Speed-run the hunt again with new agent-written questions — beat your own trail. Side quest: pick any repo you admire and map its structure in ten minutes flat, notes committed.
Gate check 2: find any file by name and any string by content in a repo you've never seen; jump between three projects with z; resurrect yesterday's commands without retyping them.
#Stage 3 — tmux and the machine
Steady: week 3Committed: ≈ days 8–11Immersed: ≈ days 4–6
Reading: tmux, plus macOS desktop and Keyboard. On Linux/WSL, swap Session 14 for your window manager's equivalents — the tools are choices; the keyboard-first habit is the point. Agent phase: explainer.
| Session 11 | The full tmux model. ⟳ Drill: personal cheatsheet (Session 10) — run all ten from memory. New: sessions vs. windows vs. panes; create, rename, reorder windows; zoom; resize. Do: build a three-window session: code, log, scratch. Log: commit. Agent: ask it to draw the session/window/pane hierarchy as ASCII. |
| Session 12 | Persistence changes everything. ⟳ Drill: fuzzy pickers (Session 9). New: detach mid-task, quit the terminal app entirely, reopen, reattach — nothing died. The sesh switcher: Ctrla then T. Do: start a long command, detach while it runs, come back to the result. Log: what would this have saved you already? Agent: ask how people use this for servers and long jobs. |
| Session 13 | Scrollback and copy mode. ⟳ Drill: window juggling (Session 11). New: enter copy mode, search upward through output, select and copy without the mouse. Do: run ll -R somewhere big, then find and copy one specific line from the flood.Log: commit. Agent: quiz — five "find it in the scrollback" tasks. |
| Session 14 | The desktop layer. ⟳ Drill: detach/reattach under pressure (Session 12) — mid-edit this time. New: app switching, window snapping with Raycast, tab cycling — the keyboard path outside the terminal. Do: a full hour of work without the dock or mission control. Log: which mouse habit survived? Agent: ask for a "no-mouse hour" checklist tailored to what you named in the log. |
| Session 15 | Consolidation. ⟳ Drill: ten minutes of pure shortcut reps — the fifteen keys you now own. New: nothing. Consolidation is the material. Do: write keymap.md: your fifteen keys, from memory first, verified after. Then the gate check.Log: check results. Agent: have it quiz you from your own keymap, shuffled. |
Workspace as code. Turn Stage 1's workspace.md into something executable: a small script or sesh entry that opens your whole learning workspace — session, panes, log — in one command. Document it, commit it, and use it every day from now on.
Read your actual tmux.conf top to bottom and annotate what each block does. Make sesh entries for three real projects. Run a whole no-mouse day, not an hour. New game+: keymap.md from memory a second time — the delta between attempts is your real retention score.
Gate check 3: cold start to full workspace in one command; move between editor, terminal, and browser without touching the mouse; survive a detach in the middle of real work.
#Stage 4 — Git for real
Steady: week 4Committed: ≈ days 11–14Immersed: ≈ days 6–7
Reading: Git. The Session 1 ritual becomes understanding. Agent phase: reviewer — from now on, end each session asking it to critique your commits.
| Session 16 | The core loop. ⟳ Drill: workspace opener (Stage 3 build) + copy mode (Session 13). New: git status, git diff, git add -p, small commits with honest messages.Do: re-read your Session 1 ritual and explain every word of it in your log — you've earned the understanding. Log: that explanation. Agent: ask it to review your last five commit messages against "will this make sense in a month?" |
| Session 17 | Branches. ⟳ Drill: add -p staging (Session 16) — stage half a change. New: create, switch, merge. Game option: spend New in Learn Git Branching — watching the graph move as you type is the fastest way branches click. Do: build a tiny change on a branch and land it. Log: commit. Agent: ask it to explain what actually moved when you merged. |
| Session 18 | Reading history. ⟳ Drill: branch-and-merge (Session 17), one quick round. New: git log, git show, and lg (lazygit) to see it all at once.Do: answer three questions about the cloned Groundwork repo's history: newest commit, what changed in it, who touched a given file last. Log: commit. Agent: quiz — five history questions, you answer with commands. |
| Session 19 | Undo without fear. ⟳ Drill: reading history (Session 18). New: git restore, git revert, when reset is safe.Do: break your repo three ways on purpose — bad edit, bad staging, bad commit — and recover each. Log: the three recoveries, from memory. Agent: after each recovery, ask "was there a safer way?" |
| Session 20 | First examiner session. ⟳ Drill: the undo trio (Session 19) — once more, faster. New: nothing. Assessment day. Do: run the examiner prompt; do all five tasks. Then the gate check. Game option: finish with git-game — a treasure hunt inside a real repo. Log: what the examiner said you're avoiding. Agent: examiner mode. |
A history worth reading. Build a small text project — your cheatsheet grown into a real guide, a recipe collection, anything — in eight or more atomic commits with clear messages, including one documented mistake and its recovery. The artifact is the git log itself.
Finish Learn Git Branching's main sequence and all of git-game; try Oh My Git! to see the internals move. Have the agent stage a broken-repo scenario (detached HEAD, lost commit) and dig out with reflog. Side quest: read the Git section of someone else's dotfiles.
Gate check 4: stage half a file with add -p; explain what HEAD is in one sentence; undo an unstaged change, a staged change, and a bad commit; branch and merge without consulting anything.
#Stage 5 — The editor
Steady: week 5Committed: ≈ days 15–18Immersed: ≈ days 8–9
Reading: Neovim. If you've chosen VS Code or another editor, do the same drills with its keyboard equivalents — fluent editing is the requirement; the editor is your choice. Agent phase: reviewer.
| Session 21 | Survival and motion. ⟳ Drill: git core loop (Session 16, a stage old) on your log repo. New: run vimtutor — the interactive tutorial already on your machine — through the movement chapters.Do: twenty minutes of pure motion in a copy of your log: h j k l, words, lines, :w, :q.Log: commit (in the editor, then quit — that's the test). Agent: ask why modal editing exists, best two-sentence version. |
| Session 22 | Edit verbs. ⟳ Drill: yesterday's motions, five minutes. Game option: Vim Adventures for the drill slot all stage. New: delete, change, yank: ciw, dd, yy, u.Do: edit one log entry ten different ways. Log: which verb clicked? Agent: quiz — "here's a before/after, what's the fewest keystrokes?" |
| Session 23 | Search, replace, splits. ⟳ Drill: verbs (Session 22). New: / search, substitute, window splits, jumping between open files.Do: rename something across your whole cheatsheet with search-and-replace. Log: commit. Agent: ask when editor search beats rg and vice versa. |
| Session 24 | The LazyVim layer. ⟳ Drill: search/replace (Session 23). New: Space menu, fuzzy file open, the file tree — or your editor's command-palette equivalents. Do: open five files five ways; pick your favorite two. Log: commit. Agent: ask what else lives under Space worth knowing this early. |
| Session 25 | One workspace. ⟳ Drill: motions + verbs together — one clean editing kata. New: editor splits and tmux panes as one navigable grid with Alth/j/k/l. Do: gate check, then examiner. Log: results. Agent: examiner mode. |
Keyboard-only refactor. Reorganize your whole learning repo — split log.md stages into files, tidy your notes into folders — entirely in the editor, no mouse, committed atomically. The constraint is the exercise.
Finish all of vimtutor and push into Vim Adventures. Refactor a second repo keyboard-only. Taste one power feature — a macro recorded with q, or multi-file substitute — and write down when you'd reach for it. New game+: redo Session 22's ten edits in half the keystrokes.
Gate check 5: make five common edits without arrow keys or mouse; open any file by fuzzy name; move between editor and terminal panes without thinking about it.
#Stage 6 — Pipes, scripts, and publishing
Steady: week 6Committed: ≈ days 18–21Immersed: ≈ days 9–11
Reading: Command line & Unix, and the remote sections of Git. Agent phase: reviewer.
| Session 26 | Pipes. ⟳ Drill: editing kata (Session 25). New: |, >, wc, sort, uniq, head.Do: answer three real questions about your log with one-liners: how many minimum days? which stage had the most minutes? most-used word? Log: your best pipeline, verbatim. Agent: ask it to break your pipeline down stage by stage. |
| Session 27 | First script. ⟳ Drill: pipes (Session 26) — one new question, one new pipeline. New: shebang, chmod +x, running it; then shellcheck and fix everything it flags.Do: turn yesterday's best pipeline into stats.sh.Log: commit. Agent: ask it to review the script — but you type every fix. |
| Session 28 | Variables and loops. ⟳ Drill: undo trio (Session 19, a stage+ old) — keep recovery sharp. New: variables, for loops, if in shell.Do: harden your Stage 3 workspace opener: safe to run twice, complains helpfully when something's missing. Log: commit. Agent: ask what happens when your script runs in a folder with spaces in the name — then prove it. |
| Session 29 | Publish. ⟳ Drill: scripting (Sessions 27–28) — add one small feature to stats.sh.New: gh auth, gh repo create, push your log repo, write a real README.Do: your streak is public now, if you want it to be. Log: the URL. Agent: ask what belongs in a README of a learning log — then write it yourself. |
| Session 30 | Pull requests. ⟳ Drill: branches (Session 17, two stages old). New: branch → push → gh pr create → read your own diff with delta → merge.Do: ship one improvement to your repo by PR. Gate check + examiner. Log: results. Agent: examiner, then PR reviewer — require it to name file, line, risk. |
A CLI tool of your own. One script that does one thing you actually want — a log stats summary, a project opener, a daily note generator. README, usage examples, shellcheck-clean, landed by PR. This is the first build a stranger could use.
Bandit levels 13–20 — they're pipe-and-trickery country now. Build a second CLI tool, or give the first one flags and a --help. Run shellcheck on a script you find in the wild and explain each warning. Side quest: read a well-made CLI's --help and steal its manners.
Gate check 6: compose a pipeline from scratch to answer a question; write, run, and lint a script; push a branch and open a PR without looking anything up.
#Stage 7 — Programming, by hand
Steady: week 7Committed: ≈ days 22–25Immersed: ≈ days 11–13
Python via uv — the interpreter is already managed for you (Development). Agent phase: bounded pair — it may implement after you've written a spec or failing test. Not before.
| Session 31 | The REPL. ⟳ Drill: PR flow (Session 30). New: uv run python; variables, strings, numbers, types.Do: compute things about your log in the REPL — days so far, average minutes. Log: commit a stage7/ folder with your experiments.Agent: ask why "60" + 10 explodes — after you've tried it. |
| Session 32 | Control flow — the wall. ⟳ Drill: REPL warmup (Session 31). New: if/else and for loops. Fair warning: this is where most beginner journeys stall. Go slow; confusion here is universal, not a verdict.Do: loop over a list of day-minutes and print full/minimum for each. Log: honest confusion, if any — it passes. Agent: ask for five tiny loop exercises; do them all before checking. |
| Session 33 | The wall, again — on purpose. ⟳ Drill: yesterday's loops, from a blank file. New: lists and dictionaries properly; reading error messages as information, not judgment — read the last line first. Do: five more loop katas; break one deliberately and read the traceback bottom-up. Log: commit. Agent: paste an error and ask "what is this telling me?" — before asking for the fix. |
| Session 34 | Functions. ⟳ Drill: loops (Sessions 32–33) — one kata, no reference. New: defining functions, arguments, returns. Do: extract this stage's REPL work into logstats.py with three named functions.Log: commit. Agent: ask it to name your functions better — accept or reject each suggestion with a reason. |
| Session 35 | Red, then green. ⟳ Drill: functions (Session 34). New: pytest: one failing test, watch it fail, make it pass by hand.Do: two more test-first rounds on logstats.py. Gate check + examiner.Log: results. Agent: examiner; then ask it to suggest one edge case your tests miss — write that test yourself. |
A program with tests. A real log analyzer: streak length, day-mode counts, total hours, written by hand with tests first where you can. When it works, ask the agent for a code review — then improve it yourself based on what you agree with. Disagreeing with one suggestion, out loud in the log, is part of the assignment.
Work through a batch of Exercism Python exercises — real katas with community review. Rebuild logstats.py from a blank file without looking. Teach-back: explain loops in your log as if to a friend — writing it is the test.
Gate check 7: write a loop, a dict lookup, and a function from a blank file; make a failing test pass; read a traceback bottom-up and say what it means before fixing it.
#Stage 8 — Data: tables and documents
Steady: week 8Committed: ≈ days 25–28Immersed: ≈ days 13–14
Reading: Data & storage — foundational forever: every real app is data plus rules about who can change it, and agents write data code you must be able to judge. Agent phase: bounded pair.
| Session 36 | Files in, files out. ⟳ Drill: test-first round (Session 35). New: reading and writing files from Python. Do: make logstats.py read the real log.md instead of hardcoded data.Log: commit. Agent: ask how it would handle a malformed line — then implement your favorite of its ideas yourself. |
| Session 37 | Documents: JSON. ⟳ Drill: pipes (Session 26, stages old) — one pipeline from memory. New: JSON in Python and with jq; the document model — self-contained records, varying shape.Do: export your log to log.json; query it three ways with jq.Log: commit. Agent: ask where JSON's flexibility helps and where it bites. |
| Session 38 | SQL: tables and questions. ⟳ Drill: jq queries (Session 37). New: sqlite3 — CREATE, INSERT, SELECT, WHERE, ORDER BY, GROUP BY, on the database in your pocket. Game-adjacent: SQLBolt lessons 1–6 make an excellent New slot.Do: build log.db, insert this stage by hand, answer three questions with queries.Log: best query, verbatim. Agent: ask it to write one query you then verify with a different query. |
| Session 39 | The WHERE habit. ⟳ Drill: SELECTs (Session 38). New: UPDATE and DELETE — always preceded by their SELECT twin; JOINs, briefly, to connect two tables. Do: the "look before you write" drill from the data page; then break the rule once on a throwaway copy and study the wreckage. Log: what the bare UPDATE did. Agent: from today forward, require every agent-written write query to arrive with its verification SELECT. |
| Session 40 | Choosing shapes. ⟳ Drill: one SQL question + one jq question, same data. New: when tables win, when documents win; how DynamoDB-style stores invert the thinking — access patterns first. Do: write six sentences in your log: one question each shape made easy, one it made awkward, and which you'd pick for your capstone. Gate check + examiner. Log: those sentences. Agent: examiner; then debate it — argue for the opposite store and see if it changes your mind. |
Your log, as a database. Migrate the full log into log.db with a script (parse log.md, insert rows), then write report.py: streaks, stage totals, mode breakdown — from SQL queries, tested. Back up the database file first; it's a habit now. The artifact is a working pipeline: text → parser → database → report.
Finish SQLBolt. Model a domain you love — your game library, your records — with two related tables and real JOINs. Repeat the modeling in JSON documents and write the trade-off paragraph. Side quest: open any app's SQLite file you legally can and explore its schema with .tables and .schema.
Gate check 8: create a table and query it with WHERE/GROUP BY from memory; run the SELECT-before-UPDATE ritual unprompted; explain tables-vs-documents in two sentences using your own data as the example.
#Stage 9 — The web: HTTP and a real app
Steady: week 9Committed: ≈ days 29–32Immersed: ≈ days 15–16
How programs talk: requests, responses, JSON over the wire. Agent phase: bounded pair.
| Session 41 | What the web actually is. ⟳ Drill: SQL questions (Session 38), from memory. New: localhost, ports, request/response; curl a real API and read the JSON with jq.Do: hit three public endpoints; save one response and query it. Log: commit. Agent: ask it to narrate one request's journey, DNS to response. |
| Session 42 | Fetching from code. ⟳ Drill: WHERE habit (Session 39). New: HTTP from Python; status codes; what to do when it's not 200. Do: fetch something small and real; store the interesting part into log.db.Log: commit. Agent: spec one fetch-and-store function with a test, let it implement, verify against a live call. |
| Session 43 | Serving. ⟳ Drill: traceback reading (Session 33) — break the fetch, read the error. New: the smallest possible local web server returning your data as JSON. Do: serve one endpoint: your streak, live from the database. curl it from another pane — that's the whole client-server loop, on your machine.Log: the curl output. Agent: ask what would break with two users at once — file, sqlite, or server? |
| Session 44 | A page. ⟳ Drill: endpoint round-trip (Session 43). New: the minimum HTML to show your data in a browser. Do: a stats page served locally from log.db. Ugly is fine; yours is the point.Log: commit + screenshot. Agent: give it your screenshot and one sentence — "make it calmer" — then review its diff line by line. |
| Session 45 | Reading strangers' code. ⟳ Drill: functions kata (Session 34, stages old). New: pick one file in a real open-source project; trace it with rg and the editor.Do: write five sentences on what it does; verify with the agent after. Gate check + examiner. Log: results. Agent: examiner; only after your five sentences, ask it to grade your reading. |
A small app with real storage. Fuse the last three stages: a local app — web page or rich terminal UI — backed by log.db, with at least one thing fetched from the outside world. You lead; the agent implements only pieces you've specified with tests. This is the biggest thing you've built, and every layer of it is yours to explain.
Add a second data source and a second endpoint. Harden the error paths: kill the network mid-fetch, feed it garbage JSON, watch it fail gracefully. Side quest: read one small real web app top to bottom and diagram its request path in your log.
Gate check 9: explain request/response and a status code in plain words; fetch, store, and serve the same piece of data; find your way around a codebase you've never seen well enough to describe one file's job.
#Stage 10 — Directing agents on narrow work
Steady: week 10Committed: ≈ days 32–35Immersed: ≈ days 16–18
Reading: Editors & AI — the loop, concrete targets, and knowing your budget. This stage the skill under practice is direction. Agent phase: bounded pair, deliberately exercised.
| Session 46 | The loop, deliberately. ⟳ Drill: serve-and-curl (Session 43). New: describe → plan → edit → review diff → verify, as a conscious cycle. Do: three tiny tasks through the full loop; reject one plan on purpose and re-describe. Log: what changed between your first and second description? Agent: the subject of study. |
| Session 47 | Failing-test-first. ⟳ Drill: red-green by hand (Session 35). New: you write the red test, the agent makes it green, you verify. Do: two rounds on your app. Log: commit. Agent: exactly and only the green. |
| Session 48 | Visual targets. ⟳ Drill: loop cycle (Session 46), one task. New: give the agent a screenshot or sketch and say "build this"; compare against prose-only for the same change. Do: one UI change both ways; keep the better result. Log: which spec won and why. Agent: the experiment. |
| Session 49 | Budget day. ⟳ Drill: test-first (Session 47). New: /context, /usage, clean sessions vs. polluted ones; btop while an agent works.Do: deliberately overfill a session's context, watch quality sag, restart clean with a summary — feel the difference. Log: what you noticed. Agent: ask it to summarize the polluted session for its own replacement. |
| Session 50 | Critical review. ⟳ Drill: visual target (Session 48), one small round. New: reviewing as a discipline: for every agent diff today, name one concrete risk out loud before accepting. Do: gate check + examiner. Log: results. Agent: examiner. |
An agent-assisted feature, verified. Add a real feature to your app: you write the spec and the tests, the agent implements, you review and verify everything. Commit verification.md recording what you checked and how — that document is the artifact, and the habit it trains is the one that makes the last two stages possible.
Run the same feature through two different prompts and diff the results — prompt quality made visible. Try two agents in parallel panes on separate tiny tasks; feel the supervision cost — that is the fan-out and "when not to" tradeoff from directing many agents, felt firsthand. Side quest: reread your Stage 1 log entries and count how many things the agent explained that you now just know.
Gate check 10: run the full loop without skipping review; produce a red test an agent can work from; notice a polluted context before it costs you an hour.
#Stage 11 — Repo scale: specs, delegation, verification
Steady: week 11Committed: ≈ days 36–39Immersed: ≈ days 18–20
Reading: AI agents & rules, Starting a project, and the security chop on the agentic engineering page. Agent phase: delegate — bounded tasks end to end. You own the merge.
| Session 51 | AGENTS.md. ⟳ Drill: risk-naming review (Session 50). New: write AGENTS.md for your app: how to run it, test it, what never to touch.Do: fresh agent session; see if it follows the rules cold. Log: what it got wrong; fix the file, not the agent. Agent: the test subject. |
| Session 52 | Plan-first delegation. ⟳ Drill: budget check (Session 49) before starting. New: a meaty task, delegated whole: demand the plan, edit the plan, then let it run. Do: verify each plan step landed as described. Log: where the plan and reality diverged. Agent: delegate, plan-first. |
| Session 53 | Security pass. ⟳ Drill: SELECT-before-write (Session 39, stages old) — still automatic? New: secrets, injection, what could leak: audit your own app. Do: ask the agent to attack its own earlier work; verify each finding yourself before believing it. Log: real findings, fixed. Agent: adversary, then you verify. |
| Session 54 | Unfamiliar territory. ⟳ Drill: reading strangers' code (Session 45). New: clone a small open-source project; scope one tiny improvement — doc fix, test, small bug. Do: write the spec and checklist for it. Just the spec today. Log: commit the spec. Agent: ask it to poke holes in your scope — too big? unclear? |
| Session 55 | Recovery and capture. ⟳ Drill: undo trio (Session 19 — old friend, one last time). New: /rewind, git revert, when to abandon a session; start your knowledge base and move durable lessons out of the log.Do: gate check + examiner. Log: results. Agent: examiner. |
The unfamiliar-repo task. Execute Session 54's spec end to end in the foreign codebase — delegated to the agent against your checklist, every item verified by you, written up in verification.md. Working in code you didn't write, safely, is the truest test this program has.
Do it twice: a second unfamiliar repo, second spec, second verified delegation. Write an AGENTS.md for the foreign repo as if you maintained it. Run a second adversarial security round on your own app with a fresh session and compare findings.
Gate check 11: a fresh agent session follows your AGENTS.md without coaching; you catch a plan-reality divergence before merge; the SELECT-before-write and risk-naming habits fire without prompting.
#Stage 12 — Capstone
Steady: week 12Committed: ≈ days 39–42Immersed: ≈ days 20–21
One small, real thing you want to exist — built the way you now work: planned, directed, verified, explained. Agent phase: delegate, with you as the engineer of record.
| Session 56 | Spec it. ⟳ Drill: your choice — whatever the Stage 11 examiner said you're avoiding. New: goals, invariants, storage shape (Stage 8 decision, now for real), and what "done" proves. Do: write the capstone spec; deliberately small — the craft is the point, not the size. Log: the spec, committed. Agent: ask it to find the vaguest sentence in your spec; sharpen it. |
| Sessions 57–59 | Build sessions. ⟳ Drill: five minutes, your weakest skill, each morning. Do (per session): one planned slice: direct, verify, log honestly what the agent did versus what you did. Three slices, three commits minimum. Agent: delegate within the spec; every diff read; every claim verified. |
| Session 60 | Harden. Do: tests green, security look, README a stranger could follow, database backed up. Final gate check + examiner. Log: results. Agent: examiner, then final adversary pass. |
Finish and explain. Ship the capstone, then write the explanation that matters: what it does, how you verified it, what the agent did and what you did, and what you'd do differently. That write-up — not the code — is the proof this program worked.
Stretch goals from your spec's cut list. New game+: rebuild your Stage 6 CLI tool from scratch in half the time it took the first time — the clearest possible measure of what changed. Write "what I'd tell Day-1 me" and pin it at the top of the log.
The last day: the retrospective. Read your whole log start to finish — the person who wrote Day 1 and the person reading it are different people. Then choose what's next.
#After the twelfth gate
You have habits, a portfolio repo, and an agent you know how to direct. Point it at something you love: a week-long game, web, app, or media track — immersed pace makes those a natural next month — or straight at the longer path toward working like an engineer. The daily log doesn't have to stop; only the schedule does.