Starting scaffold for the FiftyFive AI engineering course. One repo per track, grown phase by phase by hand.
gh repo create FiftyfiveTech/ai-course-<track> --template FiftyfiveTech/ai-course-template --public --clone
cd ai-course-<track>
make setupThen, in order: replace <TRACK> in CLAUDE.md and pyproject.toml, protect main, add the
other person as a collaborator with push access.
| Path | Holds |
|---|---|
src/ |
The system. Small modules, one job each. |
prompts/ |
Versioned prompt files (extract_v1.md, extract_v2.md, …). Never inline a prompt in code. |
schemas/ |
Pydantic models. Structured output is validated, not parsed by hand. |
evals/dev/ |
Builder tunes here. 15 cases. |
evals/heldout/ |
Evaluator only. Sealed Wednesday, tagged heldout-v1. The Builder never reads it. |
tests/gates/ |
One script per phase gate. It prints the number; the number decides. |
STANDUP.md |
Daily log. Two minutes, append-only. |
Two files are absent because they are Week 0 tasks, not scaffolding:
tests/gates/test_no_leakage.py— assertsevals/dev ∩ evals/heldout = ∅by content hash (task 0.7). Until it exists, the blind-labelling rule is unenforced.src/telemetry.py— the shared cost/latency logger every model call goes through (task 0.8).
Write them. Do not import them from somewhere else.
CLAUDE.md carries the full contract. The short version:
- Models and datasets are named by Hugging Face repo id. The provider is only where it runs.
- Zero spend. A paid call is a STOP-and-ask, never a judgement call.
- A phase is done when its gate prints the number, not when the code looks right.
- Every PR is reviewed by the other person.
mainis protected; self-merges are the one thing the Friday retro always checks. - Tasks come from the Odoo board via the
odoo-boardMCP server, not from this README.