{
  "id": "edge-cache/stale-while-revalidate",
  "slug": "stale-while-revalidate",
  "title": "Session: stale-while-revalidate — 2026-09-10",
  "type": "source",
  "project": "edge-cache",
  "date": "2026-09-10",
  "started": "2026-09-10T10:15:00+00:00",
  "ended": "2026-09-10T12:39:00+00:00",
  "model": "claude-sonnet-4-6",
  "cwd": "/home/dev/code/edge-cache",
  "git_branch": "feat/swr",
  "permission_mode": "default",
  "user_messages": 1,
  "tool_calls": 3,
  "tools_used": [
    "Bash",
    "Edit",
    "Write"
  ],
  "is_subagent": false,
  "wikilinks_out": [
    "Go",
    "Singleflight",
    "StaleWhileRevalidate",
    "edge-cache"
  ],
  "body_text": "Project: edge-cache · Branch: feat/swr · Mode: default · Model: claude-sonnet-4-6\n\nSummary\n\nImplemented stale-while-revalidate in the Go caching proxy: stale entries are served immediately while a single background refresh per key runs under singleflight, so a hot key never stampedes the origin.\n\nConversation\n\nTurn 1 — User\n\nAdd stale-while-revalidate. Origin must not get a thundering herd.\n\nTurn 1 — Assistant\n\nServe stale within the SWR window, trigger one refresh per key through singleflight.Group, and cap refresh concurrency with a semaphore.\n\nfunc (c Cache) serve(w http.ResponseWriter, r http.Request, key string) {\n\tentry, ok := c.store.Get(key)\n\tif ok && entry.Fresh(time.Now()) {\n\t\tentry.WriteTo(w)\n\t\treturn\n\t}\n\tif ok && entry.WithinSWR(time.Now()) {\n\t\tentry.WriteTo(w) // serve stale now\n\t\tgo c.group.Do(key, func() (any, error) { return c.refresh(key, r) })\n\t\treturn\n\t}\n\tc.fetchAndStore(w, r, key)\n}\n\nTools used in this turn:\n\n- Edit: cache/handler.go\n- Write: cache/refresh.go\n- Bash: go test ./... -race — ok\n\nConnections\n\n- edge-cache\n- Go\n- Singleflight\n- StaleWhileRevalidate",
  "sha256": "89f1a4b563395fa3",
  "source_url": "sessions/edge-cache/2026-09-10-stale-while-revalidate.html"
}