BaseHalf
All posts

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

BaseHalf window titled http-requests: sidebar lists 00-goal through sources; canvas shows 01-request-line, 02-headers, 03-status, sources, and selected 04-practice with the 401 to Authorization answer and upstream connection lines.

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.1

method + 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.md

That 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.

Same http-requests canvas, closer look: 04-practice is selected with a blue border; connection lines from request-line, headers, status, and sources feed it; the card answers 401 with Authorization.

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.

IdeaSafeIdempotentNotes we kept nearby
GETYesYesMatches the request-line card's example shape
POSTNoNoNot for "just fetch the books again"
PUT / DELETENoYesIdempotent is not the same as safe
401 vs 403n/an/a401: 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 POST is 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.