Session 1. Configure the assistant and the repository instructions — Mon 14 Sep
Configure the assistant and the repository instructions
Monday, September 14, 2026 · 2h · Thread: harness engineering
Outcome
You leave with a coding assistant that reads this repository's policy before it
edits, a scoped instruction set you wrote (AGENTS.md as the canonical file,
CLAUDE.md and .cursor/rules/*.mdc pointing at it), the acceptance checks
that decide when a change is done, and one record of the inspect → plan → edit
→ test → review loop with a change you refused. Day one also carries the
orientation: the request → context → model → tool → verification mental model,
and the capstone you build over three weeks.
Contract and threat boundary
| Input | A repository, an assistant that reads project files (Claude Code, Cursor, or another), and one small feature: an optional tags filter on search_documents, worked in a scratch copy. |
| Output | Scoped project instructions with their acceptance checks written in, and a task-loop record: the plan you approved, the diff you inspected, one rejected change with its reason, and the remaining risks. |
| Budget | One feature. One file, src/bootcamp_agent/tools.py. No new dependency. uv run bootcamp check ch01 and uv run ruff check . decide "done" — tests/ is not in your copy, so the check is your suite. |
| Failures this session must handle | An ambiguous instruction. The assistant asks, or it guesses and you catch the guess. Either way the missing sentence lands in AGENTS.md. An unauthorized file change. You ask for an edit outside the allowed files. The assistant refuses, or it produces a diff and you reject it. |
The threat is not a hostile model. It is a helpful one with no boundary: it invents an architecture, touches five files, adds a dependency, and writes a test that asserts the mock. The boundary is yours to write.
Session flow
- Warm-up and diagnostic (10m). Preflight cell green on every screen. One
FakeLLM.completecall with nothing around it, then the same question throughuv run bootcamp-agent --trace "..."to preview the capstone. - Contract and threat boundary (15m). The mental model: request → context → model → tool → verification. Where the model is probabilistic, and what you control instead. The contract table above, read aloud.
- Concept and live implementation (30m). Weak prompt versus project-aware
prompt on this repository, in one assistant. Then the policy files: what goes
in, the canonical-file pattern, the builder-kit as the worked example. Then the
full loop on the
tagsfilter: plan, restrict, smallest diff, tests, reject one thing, risk summary. - Guided lab (35m). In your own assistant, with the notebook as the logbook: the same feature, the same loop, your own rejection.
- Failure injection (15m). Give the assistant one ambiguous instruction and record what it did. Ask for a change outside the allowed files and record the refusal, or the diff you rejected.
- Evaluation and artifact receipt (10m). Fill the loop record, run
check("ch01-e1", loop), thenreview("ch01"). Rejected changes read aloud. The best rejection wins. - Exit ticket (5m). One thing that works, one thing that is unclear, your
next action. Homework: fix the instruction that let the assistant assume
wrong, and read
docs/guides/harness-engineering.md.
Evidence
This session is assistant-driven. The notebook's first cell carries
# manual-run:, so CI does not execute it and the CLI reports it as manual:
uv run bootcamp check ch01 # prints the manual reason; run the notebook in Jupyter
uv run bootcamp submit ch01 --github <you> # hands in the notebook as it stands, no re-run, no marks
The scorecard is the review("ch01") cell in Jupyter. It reads your loop
record, not the assistant's summary of it.
Previous: Data structures for agents · Next: Call a model through the adapter