feat(course): build out all 27 modules, capstone, scaffold, and conventions

Scaffold the course repo and author the full curriculum in dependency-chain
order, following the settled build decisions in handoff.md.

- Scaffold: course README, vendor-neutral AGENTS.md (dogfoods Module 5),
  _TEMPLATE.md (the fixed 9-section module shape), root .gitignore, ship config.
- Modules 1-2: reference exemplars (locked for tone/depth/lab style).
- Modules 3-27: full lessons + runnable labs, each following the template,
  respecting the chain, vendor/model-agnostic, with "feel the pain" labs.
- Module 8 hosting comparison web-researched and date-stamped (as of 2026-06-22),
  not written from memory; expansion-zone modules carry Verify-before-publish.
- Capstone: the full loop end to end on the running tasks-app example.

Lab code syntax-checked (Python/shell/YAML); every module has the 7 core
template sections.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TfzV5QvtPDz8LJS3Pu5VLT
This commit is contained in:
2026-06-22 12:18:30 -04:00
parent 4bd586bbd0
commit fbec36cb67
117 changed files with 15131 additions and 1 deletions
@@ -0,0 +1,22 @@
# Agent prompt — issue #42, branch `feature/42-count`
Run this in the `tasks-app-42-count` worktree. This agent's work is genuinely parallel with #43
(docs) — different files — and deliberately collides with #44 (clear) at `cli.py`'s dispatch chain.
---
You are working in this worktree only. Do not touch any other folder.
**Task:** Add a `count` command to `cli.py` that prints the number of *pending* (not-done) tasks.
- Add a new `elif command == "count":` branch to the dispatch in `main()` in `cli.py`.
- Use the existing `TaskList.pending()` method from `tasks.py` — do not change `tasks.py`.
- Print just the integer, e.g. `3`.
**Acceptance criteria:**
- `python cli.py count` prints the number of pending tasks and exits 0.
- No other files change. (`README.md`, `CHANGELOG.md`, and `tasks.py` are owned by other agents —
stay out of them.)
When done, stop. The human commits, pushes, and opens the PR.
@@ -0,0 +1,26 @@
# Agent prompt — issue #43, branch `feature/43-docs`
Run this in the `tasks-app-43-docs` worktree. This agent owns documentation only — different files
from every other agent in the fleet, so it merges cleanly no matter what the others do. This is what
a *genuinely* parallel split looks like: disjoint files, no shared interface.
---
You are working in this worktree only. Do not touch any other folder, and do not edit `cli.py` or
`tasks.py` — code is owned by other agents.
**Task:** Document the `tasks-app` and start a changelog.
- In `README.md`, add a "Commands" section documenting the existing commands: `add <title>`, `list`,
and `done <index>`. Show an example invocation for each.
- Create `CHANGELOG.md` with a "Keep a Changelog"style `## [Unreleased]` section and an `### Added`
list. (Other agents are adding commands in parallel; leave a placeholder line noting that new
commands are landing — the human will reconcile the exact list at merge.)
**Acceptance criteria:**
- `README.md` documents the three existing commands accurately.
- `CHANGELOG.md` exists and is valid markdown.
- No code files change.
When done, stop. The human commits, pushes, and opens the PR.
@@ -0,0 +1,24 @@
# Agent prompt — issue #44, branch `feature/44-clear`
Run this in the `tasks-app-44-clear` worktree. **This agent deliberately collides with #42.** Both
add a new `elif` to the same dispatch chain in `cli.py` — same file, same region. That's the
agent-vs-agent merge conflict the lab wants you to predict in Part A and resolve in Part C. It is not
a mistake in the lab; it is the lesson. Two agents on the same file is a *joint*, not a seam.
---
You are working in this worktree only. Do not touch any other folder.
**Task:** Add a `clear` command to `cli.py` that removes all tasks.
- Add a new `elif command == "clear":` branch to the dispatch in `main()` in `cli.py`.
- It should empty the task list and save, then print `cleared`.
- Reuse the existing `load()` / `save()` helpers. Do not change `tasks.py`.
**Acceptance criteria:**
- `python cli.py clear` removes all tasks and prints `cleared`.
- `python cli.py list` afterward shows `(no tasks yet)`.
When done, stop. The human commits, pushes, and opens the PR — and should expect a conflict against
`feature/42-count` at merge.