A cache holding body A sends a conditional GET. The origin returns 304 metadata without content; the cached body A remains available.

Cache headers are a two-way contract with browsers

An origin defines storage and freshness policy; a cache decides whether its stored response can satisfy the next request. When it cannot reuse that response directly, validators can make checking cheaper. These are separate decisions. Finding Cache-Control and ETag in one successful response does not prove that the next request follows the intended path. ...

July 15, 2026 · 5 min · XB Field Notes
A permanent 308 relocation links an old URI to a new URI while retaining POST on both sides.

Redirects and error codes should preserve the story

Check the method, Location header, and cache behavior before choosing a redirect or an error status.

July 14, 2026 · 3 min · XB Field Notes
Inclusive byte offsets 0 through 15 select exactly 16 bytes from a complete representation of N bytes.

Range requests should prove which bytes were selected

A 206 response is useful only when its boundaries and total size describe the bytes that were returned.

July 6, 2026 · 3 min · XB Field Notes
GET and HEAD request no state change; PUT and DELETE are not safe even though their intended repeat effect is idempotent.

HTTP methods are a promise about side effects

Get the method boundary right once, and OPTIONS, HEAD, and idempotent writes stop being a surprise.

July 2, 2026 · 3 min · XB Field Notes
A cache sends a GET with If-None-Match and illustrative tag W/"release-a" to the origin. A matching response returns 304 so the cache can reuse its stored body; a changed representation returns 200 with a body.

Validators decide whether a cached copy is still the answer

Conditionals are the cache’s second clock; a 304 means the stored copy is still the answer.

June 30, 2026 · 3 min · XB Field Notes
Accept-Encoding selects identity or encoded representations. The two byte-distinct variants carry different schematic strong ETags, A and B. Vary: Accept-Encoding tells shared caches to match the negotiated request field.

Compression changes the selected HTTP representation

Test compressed and uncompressed requests separately so caches and validators describe the bytes actually served.

June 29, 2026 · 2 min · XB Field Notes
A matrix distinguishes no-cache, which permits storage but requires validation before reuse, from no-store, which asks caches not to store the response.

Cache headers are a contract with two clocks

Separate browser freshness from origin validation, then verify the response headers that implement both.

June 25, 2026 · 3 min · XB Field Notes
GET and HEAD use matched URL, request headers, and release. Both response cards show type, validator, coding, and length categories. Only GET has content and checksum evidence. HEAD length can be omitted; if provided it describes GET.

HEAD should describe the same representation as GET

HEAD is a metadata view of GET; status and representation headers should tell the same story.

June 22, 2026 · 2 min · XB Field Notes