Chapter 2 · First contact · 10 min read
Open a sample project, ask Claude to make one real change, watch what happens — on your stack.
Two parallel streams below — pick the one that matches your day-job, skip the other. You don't need both.
Clone the repo once, then jump to your stream:
git clone https://github.com/ondrej-svec/claude-code-lab.git
cd claude-code-lab
Open samples/dotnet-core/ in Claude. Goal: add a GET /health endpoint to the minimal API. One concrete change, end-to-end through the loop.
In the Claude window:
Read
Program.csso you know the shape, then add aGET /healthendpoint that returns{ "ok": true, "uptime_seconds": n }.

What just happened. Claude didn't edit yet. It read Program.cs, drafted a plan, and named the exact file plus the verification step. No code moved. You get to approve the shape before a single character lands.
Say yes. Claude writes the change and shows it as a diff before applying.

Three lines of real code (using, startedAt, MapGet) plus two blanks. Nothing else touched. This is what "small diff" means in practice — if your first attempt sprawls, narrow the prompt and try again.
In the desktop app the same diff opens in a side panel alongside the session, not inline:

Accept. Then run the sample:
Start the app and hit
/healthto confirm it's wired up.

You now have a running feature you can commit.
If something goes wrong
[paste] — fix it." Claude sees its own change in context and usually fixes in one step.Open samples/python-react/ in Claude. Goal: same — add a GET /health endpoint to the FastAPI backend. One concrete change, end-to-end through the loop.
In the Claude window:
Read
backend/main.pyso you know the shape, then add aGET /healthendpoint that returns{ "ok": true, "uptime_seconds": n }.

What just happened. Claude didn't touch a file yet. It opened backend/main.py, sketched the plan, and named the verification step it wants to run after. The plan is free — you can reject it, reword it, or approve it. The edit only starts after y.
Say yes. Claude writes the change and shows it as a diff.

One import, one module-level timer, one route. That's it. Existing middleware and routes are untouched — good agent work doesn't spread.
Accept. Then run the backend:
Start uvicorn and hit
/healthto confirm it's wired up.

You now have a running feature you can commit.
Bonus (if you want a frontend beat): ask Claude to wire a small "Backend: OK" indicator in the React app that fetches /health on mount. One component, one fetch. Same loop, one layer up.
If something goes wrong
[paste] — fix it."Both streams walked the same shape: describe → plan → diff → run. That shape is the spine of every agentic session. The rest of this lab earns its keep by getting progressively better at each of those four steps.
A few signals worth naming now, so you spot them later:
y is cheaper than reviewing a bad diff. Later chapters make plans much more powerful — written to disk, acted on by other commands, reviewed before any code moves. The Compound Engineering loop in chapter 6 is where that fully lands.y on the diff. Chapter 7 is the depth source on making that verification more automatic (tests, scans, CI review).Four beats. One small feature. Do the same thing on a real repo of yours tomorrow — same shape, same rhythm.
Every chapter from here ends with a Practice: continue your sample block — your sample grows with you, or you take the same moves straight to a repo of your own.
This loop — describe, plan, diff, review, iterate — is the shape Anthropic recommends for everything. Their Claude Code best practices ↗ is worth a read once you've felt it.