diff --git a/.coldstart/notebook/.gitignore b/.coldstart/notebook/.gitignore
new file mode 100644
index 0000000..cc88948
--- /dev/null
+++ b/.coldstart/notebook/.gitignore
@@ -0,0 +1,8 @@
+notes/
+.metrics/
+index.html
+.worklist.md
+.worklist.json
+.worklist-*.md
+.worklist-*.json
+.capture-instructions.md
diff --git a/.coldstart/notebook/.raw/adding-a-post-to-the-coldstart-blog.jsonl b/.coldstart/notebook/.raw/adding-a-post-to-the-coldstart-blog.jsonl
new file mode 100644
index 0000000..6bd9e94
--- /dev/null
+++ b/.coldstart/notebook/.raw/adding-a-post-to-the-coldstart-blog.jsonl
@@ -0,0 +1,16 @@
+{"title":"adding a post to the coldstart blog","aliases":["new blog post","publish essay","blog page not styled","post missing from sitemap","broken next link","GitHub Pages deploy"],"summary":"Nothing about a new blog post is discovered automatically — a post is picked up by FOUR hand-maintained places plus a body-class opt-in, and missing any one of them fails silently rather than erroring. The page itself must declare class=\"docs-page essay-page\" on
or it renders unstyled, because the whole blog theme is scoped to body.essay-page. There is no build step, no generator and no index: the files are served verbatim by the Pages workflow on push to main.","steps":[{"path":"site/blog/where-the-tokens-go.html","role":"the post itself — static HTML, links ../docs.css, sets body class docs-page essay-page, carries its own BlogPosting JSON-LD, meta, byline and an .essay-end next-post link that must be re-pointed when the neighbouring post changes"},{"path":"site/docs.css","role":"supplies the entire blog theme via body.essay-page; a post without that body class gets no styling"},{"path":"site/blog.html","role":"the hand-written post index — each post needs an .essay-card entry AND an entry in the page's Blog JSON-LD blogPost array"},{"path":"site/sitemap.xml","role":"hand-maintained URL list; a post absent here is not submitted for indexing"},{"path":"site/index.html","role":"the landing page features two posts as hardcoded .article-card links that go stale on rename"}],"invariants":["every blog page sets body class \"docs-page essay-page\"","a post exists in blog.html twice: as an .essay-card and inside the Blog JSON-LD blogPost array","sitemap.xml lists every live post URL and no dead ones","reading time and word count in the byline/JSON-LD are stated by hand and drift unless recomputed","renaming or deleting a post requires fixing the .essay-end next-links of its neighbours"],"verified":["site/blog.html","site/docs.css","site/sitemap.xml","site/index.html","site/blog/where-the-tokens-go.html"],"id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"put","v":1,"ts":"2026-07-25T14:32:31.808Z","head":"8d670f701bf8","anchors":[{"path":"site/blog.html","hash":"sha256:4db2dc62774a","head":"8d670f701bf8"},{"path":"site/docs.css","hash":"sha256:5be79304fd3a","head":"8d670f701bf8"},{"path":"site/sitemap.xml","hash":"sha256:21d29b2b911b","head":"8d670f701bf8"},{"path":"site/index.html","hash":"sha256:405d3b4d0b9b","head":"8d670f701bf8"},{"path":"site/blog/where-the-tokens-go.html","hash":"sha256:1c4044fd4aef","head":"8d670f701bf8"}]}
+{"title":"adding a post to the coldstart blog","summary":"Nothing about a new blog post is discovered automatically — a post is picked up by FIVE hand-maintained places plus a body-class opt-in, and missing any one of them fails silently rather than erroring. The fifth, added 2026-07-25, is the GA4 tag: index.html and docs.html carried G-D1Q44HNQ8H but blog.html and all five posts did not, so the entire blog was invisible in analytics until #106 — a new post that copies an existing post inherits it, but one written from scratch will not. The page itself must declare class=\"docs-page essay-page\" on or it renders unstyled, because the whole blog theme is scoped to body.essay-page. There is no build step, no generator and no index: the files are served verbatim by the Pages workflow on push to main.","aliases":["new blog post","publish essay","blog page not styled","post missing from sitemap","broken next link","GitHub Pages deploy","no analytics data","missing gtag","page not tracked"],"steps":[{"path":"site/blog/where-the-tokens-go.html","role":"the post itself — static HTML, links ../docs.css, sets body class docs-page essay-page, carries its own BlogPosting JSON-LD, meta, byline, the GA4 snippet last in , and an .essay-end next-post link that must be re-pointed when the neighbouring post changes"},{"path":"site/docs.css","role":"supplies the entire blog theme via body.essay-page; a post without that body class gets no styling"},{"path":"site/blog.html","role":"the hand-written post index — each post needs an .essay-card entry AND an entry in the page's Blog JSON-LD blogPost array"},{"path":"site/sitemap.xml","role":"hand-maintained URL list; a post absent here is not submitted for indexing"},{"path":"site/index.html","role":"the landing page features two posts as hardcoded .article-card links that go stale on rename; also the reference copy of the GA4 snippet"}],"invariants":["every blog page sets body class \"docs-page essay-page\"","every blog page carries the GA4 snippet (G-D1Q44HNQ8H) last in — it is per-page, there is no shared head partial","a post exists in blog.html twice: as an .essay-card and inside the Blog JSON-LD blogPost array","sitemap.xml lists every live post URL and no dead ones","reading time and word count in the byline/JSON-LD are stated by hand and drift unless recomputed","renaming or deleting a post requires fixing the .essay-end next-links of its neighbours"],"verified":["site/blog.html","site/index.html","site/docs.css","site/sitemap.xml","site/blog/where-the-tokens-go.html","site/blog/from-four-tools-to-two.html","site/blog/an-index-cannot-answer-twice.html","site/blog/the-tool-the-agent-doesnt-call.html","site/blog/notes-should-be-written-by-whoever-read-the-code.html"],"id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"put","v":1,"ts":"2026-07-25T16:50:59.694Z","head":"6787f4a26606","anchors":[{"path":"site/blog.html","hash":"sha256:6d6a5aa58a3b","head":"6787f4a26606"},{"path":"site/index.html","hash":"sha256:405d3b4d0b9b","head":"6787f4a26606"},{"path":"site/docs.css","hash":"sha256:2a4ec5748a88","head":"6787f4a26606"},{"path":"site/sitemap.xml","hash":"sha256:21d29b2b911b","head":"6787f4a26606"},{"path":"site/blog/where-the-tokens-go.html","hash":"sha256:f4b2c7c6e7b3","head":"6787f4a26606"},{"path":"site/blog/from-four-tools-to-two.html","hash":"sha256:70f5588f9c25","head":"6787f4a26606"},{"path":"site/blog/an-index-cannot-answer-twice.html","hash":"sha256:23f0eda6f120","head":"6787f4a26606"},{"path":"site/blog/the-tool-the-agent-doesnt-call.html","hash":"sha256:2787425c58a5","head":"6787f4a26606"},{"path":"site/blog/notes-should-be-written-by-whoever-read-the-code.html","hash":"sha256:3ec4faceee48","head":"6787f4a26606"}]}
+{"title":"adding a post to the coldstart blog","aliases":["new blog post","publish essay","blog page not styled","post missing from sitemap","broken next link","GitHub Pages deploy","no analytics data","missing gtag","page not tracked","post not linked from README"],"summary":"Nothing about a new blog post is discovered automatically — a post is picked up by SIX hand-maintained places plus a body-class opt-in, and missing any one of them fails silently rather than erroring. The sixth, added 2026-07-25, is README.md: its nav row and Writing section are the project's only inbound links from github.com to site/ deep pages, and a post absent there has no link path from any domain Google already trusts. The fifth is the GA4 tag, which index.html and docs.html carried but blog.html and all five posts did not until #106. The page itself must declare class=\"docs-page essay-page\" on or it renders unstyled, because the whole blog theme is scoped to body.essay-page. There is no build step, no generator and no index: the files are served verbatim by the Pages workflow on push to main.","steps":[{"path":"site/blog/where-the-tokens-go.html","role":"the post itself — static HTML, links ../docs.css, sets body class docs-page essay-page, carries its own BlogPosting JSON-LD, meta, byline, the GA4 snippet last in , and an .essay-end next-post link that must be re-pointed when the neighbouring post changes"},{"path":"site/docs.css","role":"supplies the entire blog theme via body.essay-page; a post without that body class gets no styling"},{"path":"site/blog.html","role":"the hand-written post index — each post needs an .essay-card entry AND an entry in the page's Blog JSON-LD blogPost array"},{"path":"site/sitemap.xml","role":"hand-maintained URL list; a post absent here is not submitted for indexing"},{"path":"site/index.html","role":"the landing page features two posts as hardcoded .article-card links that go stale on rename; also the reference copy of the GA4 snippet"},{"path":"README.md","role":"nav row + Writing section — the only inbound links from github.com to the deep post URLs; a post absent here is reachable only from the site's own pages"}],"invariants":["every blog page sets body class \"docs-page essay-page\"","a post exists in blog.html twice: as an .essay-card and inside the Blog JSON-LD blogPost array","sitemap.xml lists every live post URL and no dead ones","reading time and word count in the byline/JSON-LD are stated by hand and drift unless recomputed","renaming or deleting a post requires fixing the .essay-end next-links of its neighbours","every blog page carries the GA4 snippet (G-D1Q44HNQ8H) last in — it is per-page, there is no shared head partial","renaming a post breaks its README link silently — the README is not generated from blog.html"],"verified":["README.md","site/sitemap.xml","site/blog.html","site/index.html","site/blog/notes-should-be-written-by-whoever-read-the-code.html"],"id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"put","v":1,"ts":"2026-07-25T17:35:54.884Z","head":"16aeddd0bc14","anchors":[{"path":"README.md","hash":"sha256:95857f462707","head":"16aeddd0bc14"},{"path":"site/sitemap.xml","hash":"sha256:21d29b2b911b","head":"16aeddd0bc14"},{"path":"site/blog.html","hash":"sha256:6d6a5aa58a3b","head":"16aeddd0bc14"},{"path":"site/index.html","hash":"sha256:405d3b4d0b9b","head":"16aeddd0bc14"},{"path":"site/blog/notes-should-be-written-by-whoever-read-the-code.html","hash":"sha256:3ec4faceee48","head":"16aeddd0bc14"}]}
+{"title":"adding a post to the coldstart blog","aliases":["sitemap lastmod","changefreq priority ignored","sitemap outdated","clean the sitemap"],"summary":"Nothing about a new blog post is discovered automatically — a post is picked up by SIX hand-maintained places plus a body-class opt-in, and missing any one of them fails silently rather than erroring. As of 2026-07-25 site/sitemap.xml carries only and : changefreq and priority were removed in PR #110 because Google ignores both outright and Bing largely does, so on a hand-maintained file they were three values per URL that could only drift. lastmod is the one field that still has an effect and it must match the page's real last-commit date — an audit that session found index.html claiming 2026-07-22 against a 07-25 commit, and a lastmod caught lying is discounted by the crawler across every URL in the file, not just the offending one.","steps":[{"path":"site/blog/where-the-tokens-go.html","role":"the post itself — static HTML, links ../docs.css, sets body class docs-page essay-page, own BlogPosting JSON-LD, GA4 snippet last in , .essay-end next-post link to re-point when neighbours change"},{"path":"site/docs.css","role":"supplies the entire blog theme via body.essay-page; a post without that body class gets no styling"},{"path":"site/blog.html","role":"hand-written post index — each post needs an .essay-card entry AND an entry in the page's Blog JSON-LD blogPost array"},{"path":"site/sitemap.xml","role":"hand-maintained URL list, loc + lastmod only; a post absent here is not submitted for indexing, and a wrong lastmod devalues the field for the whole file"},{"path":"site/index.html","role":"landing page features two posts as hardcoded .article-card links that go stale on rename; also the reference copy of the GA4 snippet"},{"path":"README.md","role":"nav row + Writing section — the only inbound links from github.com to the deep post URLs; a post absent here is reachable only from the site's own pages"}],"invariants":["every blog page sets body class \"docs-page essay-page\"","a post exists in blog.html twice: as an .essay-card and inside the Blog JSON-LD blogPost array","sitemap.xml lists every live post URL and no dead ones","each sitemap lastmod matches that file's last commit date — an inaccurate lastmod is worse than an absent one","sitemap.xml carries no changefreq or priority; both are ignored by search engines and were deliberately removed","reading time and word count in the byline/JSON-LD are stated by hand and drift unless recomputed","renaming or deleting a post requires fixing the .essay-end next-links of its neighbours","every blog page carries the GA4 snippet (G-D1Q44HNQ8H) last in — it is per-page, there is no shared head partial","renaming a post breaks its README link silently — the README is not generated from blog.html"],"verified":["site/sitemap.xml","site/index.html","site/blog.html","site/blog/where-the-tokens-go.html","site/blog/an-index-cannot-answer-twice.html","site/blog/the-tool-the-agent-doesnt-call.html","site/blog/from-four-tools-to-two.html","site/blog/notes-should-be-written-by-whoever-read-the-code.html"],"id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"put","v":1,"ts":"2026-07-25T17:54:17.304Z","head":"d61ceee5004a","anchors":[{"path":"site/sitemap.xml","hash":"sha256:97aa97a809fe","head":"d61ceee5004a"},{"path":"site/index.html","hash":"sha256:405d3b4d0b9b","head":"d61ceee5004a"},{"path":"site/blog.html","hash":"sha256:6d6a5aa58a3b","head":"d61ceee5004a"},{"path":"site/blog/where-the-tokens-go.html","hash":"sha256:f4b2c7c6e7b3","head":"d61ceee5004a"},{"path":"site/blog/an-index-cannot-answer-twice.html","hash":"sha256:23f0eda6f120","head":"d61ceee5004a"},{"path":"site/blog/the-tool-the-agent-doesnt-call.html","hash":"sha256:2787425c58a5","head":"d61ceee5004a"},{"path":"site/blog/from-four-tools-to-two.html","hash":"sha256:70f5588f9c25","head":"d61ceee5004a"},{"path":"site/blog/notes-should-be-written-by-whoever-read-the-code.html","hash":"sha256:3ec4faceee48","head":"d61ceee5004a"}]}
+{"target":{"kind":"alias","key":"blog page not styled"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:00.814Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"post missing from sitemap"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:00.950Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"broken next link"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:01.078Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"no analytics data"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:01.204Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"missing gtag"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:01.334Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"page not tracked"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:01.461Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"post not linked from README"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:01.587Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"sitemap outdated"},"reason":"symptom-shaped incident wording","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:01.714Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"clean the sitemap"},"reason":"task-phrase, not a stable identity term","id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-02T17:17:01.843Z","head":"bc2fe2ab8c2d"}
+{"identityAliases":["new blog post","publish essay"],"id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"put","v":1,"ts":"2026-08-02T17:17:01.970Z","head":"bc2fe2ab8c2d"}
+{"aliasesVerified":true,"id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"put","v":1,"ts":"2026-08-02T18:19:44.207Z","head":"8d5cc74d3cb9"}
+{"target":{"kind":"note"},"id":"adding-a-post-to-the-coldstart-blog","type":"flow","op":"retract","v":1,"ts":"2026-08-07T19:43:48.974Z","head":"74f44c020718"}
diff --git a/.coldstart/notebook/.raw/blog-posts-chain-via-a-hand-maintained-circular-next-field.jsonl b/.coldstart/notebook/.raw/blog-posts-chain-via-a-hand-maintained-circular-next-field.jsonl
new file mode 100644
index 0000000..6f2d37e
--- /dev/null
+++ b/.coldstart/notebook/.raw/blog-posts-chain-via-a-hand-maintained-circular-next-field.jsonl
@@ -0,0 +1 @@
+{"title":"blog posts chain via a hand-maintained circular next field","identityAliases":["blog next field","post navigation chain","next post link"],"summary":"Every blog post's `next` frontmatter field is a manually-authored pointer to another post's slug, and across the whole collection these links form exactly one closed loop (not derived from publishDate order, not validated at build time) that renders as the 'Next' link at the bottom of each post page.","steps":[{"path":"site-astro/src/content/config.ts","role":"declares `next` as an optional plain string on the blog collection schema; nothing here checks that the value is a real, existing slug"},{"path":"site-astro/src/content/blog/why-most-token-savings-tools-lie.md","role":"one link in the loop; its `next` was repointed this session to splice a newly added post in after it, instead of straight to its old target"},{"path":"site-astro/src/content/blog/how-your-own-benchmark-lies-to-you-first.md","role":"new post spliced into the loop; its own `next` was set to the old target of the post before it, so the loop closes again with one more link"}],"invariants":["the `next` chain across ALL posts must form exactly one closed loop with no missing or duplicate slug — inserting or removing a post means re-pointing the neighboring post(s) by hand, not just adding/deleting the one file","`next` values are raw slugs, unvalidated against real content-collection entries at build time — a stale slug after a rename or delete fails silently (a dead 'Next' link) rather than failing the build"],"verified":["site-astro/src/content/config.ts","site-astro/src/content/blog/why-most-token-savings-tools-lie.md","site-astro/src/content/blog/how-your-own-benchmark-lies-to-you-first.md"],"id":"blog-posts-chain-via-a-hand-maintained-circular-next-field","type":"flow","op":"put","v":1,"ts":"2026-08-08T11:38:38.740Z","head":"d68a17c3afc5","anchors":[{"path":"site-astro/src/content/config.ts","hash":"sha256:4508d7ae272e","head":"d68a17c3afc5"},{"path":"site-astro/src/content/blog/why-most-token-savings-tools-lie.md","hash":"sha256:308716b65de7","head":"d68a17c3afc5"},{"path":"site-astro/src/content/blog/how-your-own-benchmark-lies-to-you-first.md","hash":"sha256:8a4f613d59c4","head":"d68a17c3afc5"}]}
diff --git a/.coldstart/notebook/.raw/claude-commands-capture-notes-md-3f9e019a.jsonl b/.coldstart/notebook/.raw/claude-commands-capture-notes-md-3f9e019a.jsonl
new file mode 100644
index 0000000..ccb3d15
--- /dev/null
+++ b/.coldstart/notebook/.raw/claude-commands-capture-notes-md-3f9e019a.jsonl
@@ -0,0 +1 @@
+{"summary":"The /capture-notes command: its `!`-prefixed bash line passes ${CLAUDE_SESSION_ID} to kb-elicit.mjs --manual --session, which is the proof (used this session while building an unrelated plugin) that Claude Code substitutes a command's own session id into its bash execution body even though this isn't documented for slash commands generally — see the '${CLAUDE_SESSION_ID}' flow note.","identityAliases":["capture notes command","manual capture invocation"],"incidentAliases":[],"id":"claude-commands-capture-notes-md-3f9e019a","type":"file","op":"put","anchors":[{"path":".claude/commands/capture-notes.md","hash":"sha256:c2dbcaf67055","head":"af19d7cf59b6"}],"verified":[".claude/commands/capture-notes.md"],"character":"single","v":1,"ts":"2026-08-11T04:28:44.595Z","head":"af19d7cf59b6"}
diff --git a/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-4bc9d206.jsonl b/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-4bc9d206.jsonl
new file mode 100644
index 0000000..a16eab6
--- /dev/null
+++ b/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-4bc9d206.jsonl
@@ -0,0 +1 @@
+{"summary":"New Phase-0/1 spike for a standalone token-consumption-tracker plugin: stream-parses the current session's transcript JSONL (assistant records' message.usage) to sum real token counts, with a turn-level (not call-level) coldstart-attribution pass keyed on tool names starting with mcp__coldstart__. Derives its own transcript path deterministically — cwd-encoded (each \"/\" and \".\" replaced with \"-\", confirmed against a real ~/.claude/projects dir name) plus an exact session id passed in by the caller, never a \"most recently modified file\" guess. Validated this session: output matched a manual jq sum over this session's own live transcript exactly.","identityAliases":["token usage parser","transcript token counter","cwd path encoding"],"incidentAliases":[],"anchors":[{"path":".claude/worktrees/token-consumption-tracker/token-consumption-tracker/scripts/usage.mjs","symbols":["encodeCwd","transcriptPathFor","main"],"hash":"sha256:84a8f33b46ed","head":"af19d7cf59b6"}],"id":"claude-worktrees-token-consumption-tracker-token-consumption-4bc9d206","type":"file","op":"put","verified":[".claude/worktrees/token-consumption-tracker/token-consumption-tracker/scripts/usage.mjs"],"character":"single","v":1,"ts":"2026-08-11T04:28:44.561Z","head":"af19d7cf59b6"}
diff --git a/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-63c61af9.jsonl b/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-63c61af9.jsonl
new file mode 100644
index 0000000..33b8d7d
--- /dev/null
+++ b/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-63c61af9.jsonl
@@ -0,0 +1 @@
+{"summary":"Documents the token-consumption-tracker plugin prototype's open caveats, verified this session by grepping real ~/.claude/projects/*.jsonl transcripts directly: /clear leaves no queryable trace inside the transcript JSONL (no SessionStart/clear record is ever written to the file, even though a SessionStart hook fires with source=\"clear\") even though it also confirmed /clear does not start a new transcript file — so v1 sums the whole session file rather than tracking a clear boundary, deferring a hook-based precision fix.","identityAliases":["plugin design caveats","clear boundary limitation","token tracker readme"],"incidentAliases":[],"id":"claude-worktrees-token-consumption-tracker-token-consumption-63c61af9","type":"file","op":"put","anchors":[{"path":".claude/worktrees/token-consumption-tracker/token-consumption-tracker/README.md","hash":"sha256:dc6277333e9e","head":"af19d7cf59b6"}],"verified":[".claude/worktrees/token-consumption-tracker/token-consumption-tracker/README.md"],"character":"single","v":1,"ts":"2026-08-11T04:28:44.584Z","head":"af19d7cf59b6"}
diff --git a/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-72bc87ba.jsonl b/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-72bc87ba.jsonl
new file mode 100644
index 0000000..a9024d2
--- /dev/null
+++ b/.coldstart/notebook/.raw/claude-worktrees-token-consumption-tracker-token-consumption-72bc87ba.jsonl
@@ -0,0 +1 @@
+{"summary":"The /token-consumption slash command for the token-consumption-tracker plugin prototype. Its `!`-prefixed bash execution invokes scripts/usage.mjs with ${CLAUDE_SESSION_ID} and $(pwd) — see the '${CLAUDE_SESSION_ID}' flow note for why that substitution works despite not being documented for slash commands.","identityAliases":["token consumption command","slash command plugin"],"incidentAliases":[],"id":"claude-worktrees-token-consumption-tracker-token-consumption-72bc87ba","type":"file","op":"put","anchors":[{"path":".claude/worktrees/token-consumption-tracker/token-consumption-tracker/commands/token-consumption.md","hash":"sha256:3c855346ac97","head":"af19d7cf59b6"}],"verified":[".claude/worktrees/token-consumption-tracker/token-consumption-tracker/commands/token-consumption.md"],"character":"single","v":1,"ts":"2026-08-11T04:28:44.573Z","head":"af19d7cf59b6"}
diff --git a/.coldstart/notebook/.raw/dockerfile-6651ddff.jsonl b/.coldstart/notebook/.raw/dockerfile-6651ddff.jsonl
new file mode 100644
index 0000000..a611222
--- /dev/null
+++ b/.coldstart/notebook/.raw/dockerfile-6651ddff.jsonl
@@ -0,0 +1,8 @@
+{"summary":"Exists ONLY so MCP directory build sandboxes (Glama) can boot the server and run the introspection exchange — it is not a supported way to run coldstart, which is repo-local and needs a repository a container does not have. Two deliberate choices that look like mistakes: `npm ci --ignore-scripts` is there because the sole postinstall in the tree is @vscode/ripgrep downloading a prebuilt binary from GitHub, which network-restricted sandboxes may block — coldstart resolves a searcher at runtime and degrades to git grep/grep/Node scan, and this session confirmed a clean install leaves @vscode/ripgrep with no bin/ directory while the server still builds and answers; and `.dockerignore` excludes node_modules so the later `COPY . .` cannot clobber the modules from the npm ci layer. `npm prune --omit=dev` after the build was verified safe (53 packages dropped, all six tools still returned).","aliases":["glama build failed","no glama release","docker build sandbox","ripgrep postinstall download","ignore-scripts","npm prune omit dev broke the server","COPY clobbers node_modules"],"id":"dockerfile-6651ddff","type":"file","op":"put","anchors":[{"path":"Dockerfile","hash":"sha256:6a07ad14a17d","head":"f6e791255b01"}],"verified":["Dockerfile"],"character":"single","v":1,"ts":"2026-07-24T15:01:41.120Z","head":"f6e791255b01"}
+{"summary":"unchanged","id":"dockerfile-6651ddff","type":"file","op":"put","anchors":[{"path":"Dockerfile","hash":"sha256:6a07ad14a17d","head":"8b913ea639cd"}],"verified":["Dockerfile"],"character":"single","v":1,"ts":"2026-08-01T16:48:53.243Z","head":"8b913ea639cd"}
+{"summary":"Exists ONLY so MCP directory build sandboxes (Glama) can boot the server and run the introspection exchange — it is not a supported way to run coldstart, which is repo-local and needs a repository a container does not have. Two deliberate choices that look like mistakes: `npm ci --ignore-scripts` is there because the sole postinstall in the tree is @vscode/ripgrep downloading a prebuilt binary from GitHub, which network-restricted sandboxes may block — coldstart resolves a searcher at runtime and degrades to git grep/grep/Node scan, and this session confirmed a clean install leaves @vscode/ripgrep with no bin/ directory while the server still builds and answers; and `.dockerignore` excludes node_modules so the later `COPY . .` cannot clobber the modules from the npm ci layer. `npm prune --omit=dev` after the build was verified safe (53 packages dropped, all six tools still returned).","id":"dockerfile-6651ddff","type":"file","op":"put","anchors":[{"path":"Dockerfile","hash":"sha256:6a07ad14a17d","head":"8b913ea639cd"}],"verified":["Dockerfile"],"character":"single","v":1,"ts":"2026-08-01T16:49:11.893Z","head":"8b913ea639cd"}
+{"target":{"kind":"alias","key":"glama build failed"},"reason":"symptom-shaped incident wording","id":"dockerfile-6651ddff","type":"file","op":"retract","v":1,"ts":"2026-08-02T17:17:07.858Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"no glama release"},"reason":"symptom-shaped incident wording","id":"dockerfile-6651ddff","type":"file","op":"retract","v":1,"ts":"2026-08-02T17:17:07.987Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"npm prune omit dev broke the server"},"reason":"describes a hypothesis verified FALSE this session, not current identity","id":"dockerfile-6651ddff","type":"file","op":"retract","v":1,"ts":"2026-08-02T17:17:08.109Z","head":"bc2fe2ab8c2d"}
+{"target":{"kind":"alias","key":"COPY clobbers node_modules"},"reason":"describes a risk guarded against, not current behavior; symptom-shaped","id":"dockerfile-6651ddff","type":"file","op":"retract","v":1,"ts":"2026-08-02T17:17:08.236Z","head":"bc2fe2ab8c2d"}
+{"aliasesVerified":true,"id":"dockerfile-6651ddff","type":"file","op":"put","anchors":[{"path":"Dockerfile"}],"verified":[],"v":1,"ts":"2026-08-02T18:19:44.221Z","head":"8d5cc74d3cb9"}
diff --git a/.coldstart/notebook/.raw/docs-pages-share-a-hand-duplicated-sidebar-scrollspy-script.jsonl b/.coldstart/notebook/.raw/docs-pages-share-a-hand-duplicated-sidebar-scrollspy-script.jsonl
new file mode 100644
index 0000000..0d1dead
--- /dev/null
+++ b/.coldstart/notebook/.raw/docs-pages-share-a-hand-duplicated-sidebar-scrollspy-script.jsonl
@@ -0,0 +1 @@
+{"title":"docs pages share a hand-duplicated sidebar scrollspy script, not an import","identityAliases":["docs sidebar scrollspy script","sidebar active section highlight","duplicated docs script","docs sidebar highlight mechanism"],"incidentAliases":["last sidebar item never highlighted","sidebar highlight stuck wrong item","docs sidebar highlight bug"],"summary":"The sidebar active-section highlight script on the 4 docs pages (docs.astro, docs/navigation.astro, docs/notebook.astro, docs/under-the-hood.astro) is copy-pasted verbatim into each page's own closing
+
diff --git a/site-astro/src/pages/demo/index.astro b/site-astro/src/pages/demo/index.astro
new file mode 100644
index 0000000..fa70c81
--- /dev/null
+++ b/site-astro/src/pages/demo/index.astro
@@ -0,0 +1,282 @@
+---
+import Head from '../../layouts/Head.astro';
+import SvgDefs from '../../components/SvgDefs.astro';
+import Nav from '../../components/Nav.astro';
+import Footer from '../../components/Footer.astro';
+import '../../styles/landing.css';
+
+const title = 'Demo — one real session, this repo | coldstart';
+const description =
+ 'A single continuous session against coldstart\'s own codebase: an agent with no note yet runs find and gs to answer a question, writes what it learned, then a later prompt gets the same answer for zero tool calls.';
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Demo — one real session, captured from this repo
+
The first time, it looks things up. The second time, it already knows.
+
One continuous session against coldstart's own codebase. Every command, every note, every answer below is real — same repo, same day. Scroll to watch it happen.
+
+
+
+
+
+
+
+
01 · first time
+
No note yet. The agent goes and looks.
+
A real question, asked cold. Nothing's been written down about it yet, so the agent reaches for find, then gs, then answers from what it just read.
+
+
+
+
you"why does gs show files edited together — is that from the import graph?"
+
+
→UserPromptSubmitfires · kb search runs against the notebook
+
·no matchnothing written about this yet — nothing injected
+
Thinking…no note for this — check the code directly
+
+
+
coldstart-mcp
+
+$
+
+[coldstart] cache hit (19ms, 421 files)
+
+▸ src/server/tools.ts[4/5]
+Role:defines symbol, handleGetStructure
+co-change arrives as an optionalthird parameter, loaded by each caller
+
+▸ src/cli.ts[5/5]
+Wired:imports handleGetStructure (from tools.ts)
+in function runGs [L166-191]:loadCoChange(root) → passed as 3rd arg
+
+
+
+
+
→cli.tsis where it's wired — confirm with a targeted gs
"Not the import graph — gs takes co-change as an optional third argument, lazily loaded from cochange.json and passed in by whichever reader is running (cli.ts's runGs here). No index rebuild involved."
+
+
→Stop hookfires · worklist: 2 files read this turn, both note-worthy
+
+
+
+
Flow notecaptured
+
how the edited-together signal reaches gs without going through the index
+
+
+
The "Edited together" pairs gs shows are not part of the code index and never travel through the cache pipeline — they live in a separate keeper-written sidecar (cochange.json) that each reader loads itself and hands to the symbol-page builder as a third argument.
+
+
Anchors
+
+ src/index-manager.ts
+ src/cli.ts
+ +1 more
+
+
+
+
+
+
+
+ This turn
+
2 tool calls to answer — find, then gs — and one note written down, unasked, so the next agent doesn't repeat the trip.
+
+
+
+
+
+
+
+
+
02 · second time
+
Same question. Zero tool calls.
+
A different session, maybe a different contributor. The note from last time is still there, still checked against the code — so this time the answer doesn't need find or gs at all.
+
+
+
+
you"does gs's 'edited together' come from the import graph?"
+
+
→UserPromptSubmitfires before the agent ever sees this message
+
→kb searchranks notebook notes against the prompt — no embeddings, term + title match
+
✓match found[fresh] · injected as context, unasked
+
+
+
+
Flow noteinjected
+
how the edited-together signal reaches gs without going through the index
+
+
+
The "Edited together" pairs gs shows are not part of the code index and never travel through the cache pipeline — they live in a separate keeper-written sidecar (cochange.json) that each reader loads itself and hands to the symbol-page builder as a third argument.
+
+
Anchors
+
+ src/index-manager.ts
+ src/cli.ts
+ +1 more
+
+
+
+
+
+
Thinking…the gist already names the file and the mechanism — no search needed
+
+
answered — cites src/index-manager.ts + cochange.json, zero tool calls
+
+
"Not the import graph — cochange.json is a separate sidecar the keeper derives from git log --name-status -M, loaded straight into gs's symbol-page builder. No index rebuild involved."
+
+
+
+ The flywheel
+
2 tool calls the first time, 0 the second. The note carried the answer — checked against the code at the moment it was recalled, not trusted blindly.
Measured, not promised
diff --git a/site-astro/src/pages/live/index.astro b/site-astro/src/pages/live/index.astro
new file mode 100644
index 0000000..677c59a
--- /dev/null
+++ b/site-astro/src/pages/live/index.astro
@@ -0,0 +1,104 @@
+---
+import Head from '../../layouts/Head.astro';
+import SvgDefs from '../../components/SvgDefs.astro';
+import Nav from '../../components/Nav.astro';
+import Footer from '../../components/Footer.astro';
+import '../../styles/landing.css';
+
+const title = 'See it live — coldstart on its own repo';
+const description =
+ 'Three ways to see coldstart working on its own codebase: a real session start to finish, the whole repo as a walkable graph, and the actual notes it has written about itself.';
+
+const cards = [
+ {
+ href: '/demo/',
+ kicker: 'Walkthrough',
+ title: 'One real session',
+ body: 'A question asked cold, answered with find and gs — then asked again later and answered for free from a note.',
+ meta: '2 tool calls → 0',
+ },
+ {
+ href: '/graph/',
+ kicker: 'Graph',
+ title: 'The whole repo, walkable',
+ body: "Every indexed file in this repo as a sphere you can drag, search, and open — coldstart's own dependency graph.",
+ meta: 'every file, every import',
+ },
+ {
+ href: '/notebook/',
+ kicker: 'Notebook',
+ title: "This repo's real notes",
+ body: 'The actual notebook coldstart has written about its own code while working — not a mockup, the live thing.',
+ meta: 'real notes, real code',
+ },
+];
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Real output · this repo
+
Three ways to see it, none of them staged.
+
coldstart running on its own codebase — pick how you want to look at it.