Learn HTTP requests with BaseHalf and AI
We opened the real http-requests folder in BaseHalf, laid request-line, headers, and status notes out as cards, wrote upstream into the practice note, and answered which header follows a 401.
Reading one HTTP exchange is easier when method, headers, and status live on separate cards you can point an agent at. We made an ordinary Desktop folder, dropped six short Markdown notes into it, and opened that folder in BaseHalf. The window title became http-requests. The sidebar listed every file. Each note became a card. Claude Code and Codex sat in the Agent Area on the right, reading what we selected and what the practice note listed as upstream.
The folder on disk was Desktop/basehalf-learn-sessions/http-requests/. These were the files on the canvas:
http-requests/
00-goal.md
01-request-line.md
02-headers.md
03-status.md
04-practice.md
sources.md
What each card held
00-goal.md mapped the boundary: map a browser request to method, URL, headers, status, and body.
01-request-line.md pinned a readable start-line:
GET /api/books?limit=10 HTTP/1.1method + path + version. 02-headers.md named the metadata we keep mixing up with the body: Host, Accept, Authorization, Content-Type. 03-status.md kept a short list we actually used later: 200 OK, 301 redirect, 404 not found, 500 server error.
sources.md linked MDN HTTP messages, RFC 9110 §9.2.1 Safe Methods, and MDN 401. Those pages were the source of truth for the folder, not the model.
Upstream on the practice note
We connected the practice note to the three concept cards and to sources.md. On the canvas, lines from 01-request-line, 02-headers, 03-status, and sources run into 04-practice, which stayed selected (blue border) while we asked. After that, 04-practice.md began with:
upstream:
- 01-request-line.md
- 02-headers.md
- 03-status.md
- sources.mdThat list sticks in the file (or in .bh/mirror/.../upstream.yaml when a sidecar is needed). Selection does not: it lives in .bh/cache/selection.yaml only while BaseHalf is open. Connect for background that should keep feeding the practice note. Select when you want the Agent Area to treat one card as "this" for a single ask.

The 401 practice
The practice card asked: given a 401 response, what header should the next request carry?
Our answer on the card: Authorization (after obtaining credentials). 401 means missing or invalid auth; 403 would mean auth will not help.
| Idea | Safe | Idempotent | Notes we kept nearby |
|---|---|---|---|
GET | Yes | Yes | Matches the request-line card's example shape |
POST | No | No | Not for "just fetch the books again" |
PUT / DELETE | No | Yes | Idempotent is not the same as safe |
401 vs 403 | n/a | n/a | 401: try credentials; 403: credentials will not fix it |
We selected the practice card, checked the status bar, and asked in the Agent Area: check this answer against the upstream headers and status notes plus the MDN 401 link; do not invent a header that is not in 02-headers.md or the linked docs.
Where the model still slips
Treat the reply as a draft. On this path it still tends to:
- Swap 401 and 403
- Invent status codes or header names that are not on MDN or in RFC 9110
- Mix safe with idempotent, or claim
POSTis idempotent against §9.2.1
When the agent disagrees with the links in sources.md, keep the docs and fix the note on the canvas.
Same product, a real exchange path
BaseHalf did not invent a protocol tutor for us. We opened a Desktop folder, arranged ordinary Markdown, wrote upstream into the practice file, and let Claude Code or Codex quiz from those files. Card places stay under .bh/; the connections that matter stay in the files. This post is rewritten from that session on the http-requests canvas, not from a fictional syllabus tree.