Now the build stands at Phase 1 — first-class providers

v0.3.0 is published with first-class Claude and Codex support. release →

Canvas — where agent explanations show up
6 boards

First-class Claude + Codex — one brain, explicit compute

07-12 · board 012

Claude Code and Codex are now first-party adapters over one Sandpaper truth. Both integrations install by default and both entry syntaxes consume the same workflow set and brain. The toolbar uses explicit provider selection with no silent fallback: launch choice, tab-local choice, and Make default remain distinct.

Context stays honestPage/provider-scoped resume IDs and project/page/provider transcripts stay independent. Switching transfers no hidden context; New session clears only the selected scope after server success.
The server stays authoritativeOne global lifecycle serializes turns and tags every accepted frame with provider identity. Selected-document bytes and hashes alone decide Saved/Replied/Undo; a best-effort external-path warning cannot verify or undo other paths.
LayerVerified current state
runtimeInternal registry, Claude and controlled Codex adapters, diagnostics, saved auth, provider-scoped sessions, and explicit unavailable states.
distributionDual or solo integration trees, provider-neutral workflows, Claude and Codex hooks/trust, lifecycle preservation, doctor, and an exact 58-file release gate.
toolbarAccessible selection/default/reset, isolated transcripts, provider-tagged status, supplied Claude cost or Codex tokens, sparse edit paths, and narrow-viewport behavior.
qualified340 unit and 101 Chromium tests passed; the exact 58-file candidate is 130,041 packed / 488,236 unpacked bytes. Disposable Claude and Codex edit/resume turns passed; tag and publish remain owner-confirmed.

Historical snapshot · Sandpaper as built — two writing loops, one source of truth

07-10 · board 011

The repo is a small local runtime wrapped in a much larger product-memory system. The runtime is real and shipped at v0.2.0; the brain is useful as history and intent, but several of its status surfaces are now behind the code. For current truth, read the source and tests first, then use the brain to recover why the choices were made.

Living brainstatic HTML · 13 agent commands · SessionStart + Stop hooks
+
Refine surfaceSand · Hands · Sling injected into any served HTML page
=
One artifactthe file on disk remains authoritative throughout
AI writing loop · Sandtoolbar → POST /turn → server snapshots → claude -p --resume → Claude's file tools edit disk → fs.watch → page-scoped SSE reload. Model stdout supplies status, streamed prose and edit cards; it never becomes the document.
Direct writing loop · Handsleaf data-cid contenteditable / sibling drag / delete → /write or /dom → lexical splice in edit.js → disk. No model call; one pre-edit snapshot powers direct undo.
StateWhat the code actually supports
shippedFile/folder serving; toolbar injection; resumed on-page Claude conversation; streamed text/thinking/cost/edit cards; click scope; AI undo; text/move/delete direct edits + direct undo; Sling; brain scaffold/install/upgrade/rebuild/doctor/open; detached-link resolver; canvas; CI and tag-triggered npm release.
partialwaiting exists only as a reserved UI state; durable anchoring is still a prompt contract; direct manipulation is pointer-first; doctor checks structure but not publish privacy or source-package correctness.
not builtScreenshot paste, one-click refine presets, branch-and-compare, threaded annotations, a long-lived model process, Next/React-project editing, keyboard/touch reorder-delete, and stats.
verified nownpm test, shipped-script syntax checks, verify-publish (33 files · 222 KB), doctor, a fresh scaffold/install smoke test, and live HTTP checks for injection, SSE idle, and traversal rejection all passed. No live billable Claude turn was run.
The brain is not current state today

Before this roadmap extension the plan derived to 39/45 tasks done (87%); it now also tracks the stabilization and provider releases. The cover still says Phase 1 is 50%, 3 open questions and 13 decisions; the ledgers contain 4 and 19. It still calls undo open and drag/delete “next,” although both ship. All 13 pages also carry data-pkg="sandpaper" while package.json is @nynb/sandpaper, so the resolver falsely treats a whole-repo serve as detached; doctor misses that mismatch. The live board this one demotes also says CI cannot publish, even though v0.2.0 did.

Trustworthy boundariesLoopback bind, lexical + symlink traversal guards, explicit .git denial, constrained Claude tool types, XSS-safe model Markdown, server-owned undo mapping, synchronous direct edits, and a package-content/secret envelope in CI.
Watch before extendingThe local server serves every non-.git file under its root — including dotfiles — and mutation routes have no Origin/auth check. The single-turn guard has a request-body race. A 409 turn rejection is dropped by the toolbar and can leave “Sending…” stuck. Current tests are pure/unit-level: no HTTP, watcher, multi-window, browser/a11y, setup, hook, or live-model coverage.

Small verified UI defects: .sp-del styles both deleted diff rows and the Hands delete button; brain search adds .hidden to timeline rows but CSS hides only .entry.hidden; and Pick can be enabled while Hands remains active. These are local fixes. The architectural choices to preserve are the disk invariant, the plumbing/intelligence split, and data-cid as the cross-layer address.

1
Read firstREADME.md for the shipped product; then bin/cli.js → src/server.js → src/claude.js; then public/toolbar.js + src/edit.js; finally src/setup.js and the agent commands.
2
Treat as historicalsandpaper.html and engg-spec.html are valuable P0 design records, not accurate build sheets. The wiki mirrors much of that snapshot.
3
Highest-leverage follow-upRun a real brain sync: refresh digest/counts/map/wiki, resolve undo/Hands drift, mark screenshot honestly, refresh all source meta, and add tests around the HTTP/concurrency boundary before widening the feature set.
Earlier · 4
07-03 · 010Versioning becomes a Sandpaper feature, not a side process

Auto-deploy is confirmed (t-0034 done — a plain push lit up both Vercel projects, no manual vercel deploy). With shipping now hands-off, the two things still fully manual were cutting a version and trusting what gets published. Both are pipeline now.

1
/sandpaper:releasereads brain/log.html since the last tag, proposes a semver bump (confirmed, never silent), drafts CHANGELOG.md — from what happened, not from scratch
2
npm version + push --follow-tagsone command bumps package.json, commits, tags vX.Y.Z — no hand-typed version numbers
3
release.yml fires on the tagtests again, then verify-publish — the tarball-safety checks (no site/, no secrets, a size envelope) that used to be my manual vigilance, now a standing gate
4
npm publish --provenance + a GitHub Releasecut automatically from the changelog section — the agent never publishes directly; only this workflow does, after it re-checks

One thing only the owner can finish: CI can't publish yet. The account's 2FA-for-writes rejects a normal token from a headless run — the same wall the first two manual publishes hit as EOTP. The fix is an npm Automation token (Access Tokens → Generate New Token → Automation), added as the NPM_TOKEN repo secret. Recorded as l-npm-automation-token — it's the CI-shaped version of a gotcha we'd already half-learned.

dogfood · board 010 · release pipeline D-018 →
07-02 · 009Shipped — sandpaper.sh is live, and so is this page

The loop is closed. The landing serves at sandpaper.sh; the live brain at brain.sandpaper.sh is deployed straight from brain/ with no build step, exactly as D-014 promised. Zero registrar work — the domain was bought through Vercel, nameservers already Vercel's.

07-02 · 008sandpaper.sh — making the pitch land in 15 seconds

The landing was built to fix an explanation problem — demos to friends kept failing because the pitch led with mechanism. Copy chosen by a judged pitch lab (5 writers × 5 angles × 3 blind judges): the “artifact” angle won — “Your repo can explain itself.”

The signature: a self-stamping hero demo re-enacting w-0193; sections graded like sandpaper, P80 → P2000. A 4-critic panel drove 30+ fixes, including a caught hand-tinted stat on a page that brags “never hand-tinted”.

07-02 · 007Always publishable — resolve links at runtime, not build time

The owner's invariant — brain/ deploys as-is, no build step — survived an adversarial panel. Measured: 158 out-of-brain links, 73% anchored spec refs GitHub's blob view can't render. Write-time absolute links and the publish/export step both judged dead.

The survivor: links stay relative on disk; each page head names the source base (blob/HEAD/ + expected package name); brain.js probes ../package.json (no cache, name-checked) and rewrites out-links at click time when detached; dim + tooltip when no base. Built as D-014.

dogfood · board 007 · always-publishable D-014 →
Where it stands
Needs you
all open questions (3) →
Latest
  1. 07-13Released v0.3.0 with first-class Claude and Codex support.release →
  2. 07-13Prepared v0.3.0 release notes and stamped the final candidate.notes →
  3. 07-13Hardened legacy dual-provider installation before release.installer →
  4. 07-12Qualified the v0.3.0 release candidate; awaiting final tag and push confirmation.candidate →
  5. 07-12Completed and reviewed the first-class Claude and Codex toolbar and documentation.toolbar →
  6. 07-11Completed and reviewed the dual-provider distribution wave.distribution →
  7. 07-11Completed and reviewed the provider-neutral runtime foundation.runtime →
  8. 07-11Recovered GitHub Release and hardened the isolated release job.workflow →
  9. 07-11Released v0.2.1: merged stabilization, tagged, pushed.changelog →
  10. 07-10Completed full stabilization review; owner manual-test boundary remains.review →
  11. 07-10Verified release candidate gates and disposable Claude smoke; owner review remains.candidate →
  12. 07-10Accepted derived brain truth after independent integrity review.doctor →
  13. 07-10Reconciled doctor, derived brain truth, and current documentation.verification →
  14. 07-10Accepted hardened browser contract after independent Chromium review.toolbar →
  15. 07-10Accepted authenticated lifecycle hardening after independent review.server →
  16. 07-10Preserved repo-root links while closing secret-path exposure.D-020 →
  17. 07-10Scoped stabilization and first-class providers inside Phase 1.plan →
  18. 07-03The pipeline worksv0.2.0 published for real with a verified SLSA provenance attestation; a GitHub Release cut automatically. Found + fixed a changelog-extraction awk bug along the way, live.v0.2.0 →
  19. 07-02Plan audit — Phase 1 was underreporting shipped work (three stale todos + uncredited D-015): 55% → 71%, overall 33/40 · 83%. Landing stats trued up.the plan →
  20. 07-02Re-did the brain skin properly after the 2/10 verdict — white sheet on a gridded drafting table, condensed display voice, outlined badges, square nodes; 2-critic panel: 7.5–8/10, punch list applied. Uncommitted, awaiting verdict.brain.css →
  21. 07-02Blueprint approved → the identity (D-015): SANDPAPER titling, the owner's logomark on every surface, and the brain itself reskinned via a pure theme.css token surgery. The shipped default skin is now blueprint.D-015 →
  22. 07-02Reskinned the landing as a cyanotype engineering drawing (owner called the warm-serif look an AI cliché — right): title block, drafting grid, red inspection stamp, Archivo/JetBrains. Uncommitted — awaiting the verdict.site.css →
  23. 07-02Built sandpaper.sh (site/) — judged pitch lab (“Your repo can explain itself”), a self-stamping hero demo re-enacting w-0193, P80→P2000 grit structure, 4-critic panel with 30+ fixes. Board 008.the page →
  24. 07-02Sandpaper is PUBLICgithub.com/codevalley/sandpaper live; friend flow verified via npx github:…. Post-push: column fix + escaped all target-repo inputs (stored-XSS guard).the README →
  25. 07-02Built the resolver (D-014) + fold-fit + both READMEs. Pre-publish review panel confirmed 5 real defects — all fixed, incl. a credential-leak blocker and a toolbar-commit corruption path. Browser-verified in all 3 modes.D-014 →
  26. 07-02Panel-tested always-publishable — runtime resolver wins (0 fatal); write-time absolute + publish-step judged dead. 158 out-links measured (73% anchored spec refs). t-0019 reshaped; board 007.q-deploy →
  27. 07-01Answered the owner: the brain's out-links are the link-never-copy spine, not a flaw — the real fix is portable-publish (t-0019), not fewer links. Boarded as 006.t-0019 →
  28. 07-01Release prep — MIT LICENSE, richer package.json, .gitignore; npm pack verified clean (30 files, 60 kB). Name blocked — sandpaper is taken on npm.package.json →
  29. 07-01Swapped the SANDPAPER banner to a cleaner 3-row half-block font (owner's pick) — flush, 38 wide, in the install output + /init welcome.setup.js →
  30. 07-01Fixed the ASCII banner alignment — rebuilt SANDPAPER as a clean full-block banner (every row flush, 46 wide), in the install output + the /init welcome.setup.js →
  31. 07-01Made install-skill's output marketing-friendly — ASCII banner, SKILL/BRAIN sections with aligned rows, and a prominent ▸ NEXT call-out.setup.js →
  32. 07-01Added sandpaper rebuild — one-command full reset: backs up the old brain, reinstalls, lays down a fresh multi-page skeleton. Run /init to fill it.the README →
  33. 07-01sandpaper upgrade now adds missing lens pages + books to an existing brain — brings a single-pager up to the multi-page structure.the README →
  34. 07-01Fixed the single-pager — install-skill scaffolds a multi-page skeleton (cover + lenses + books, shell nav wired) so /init fills it, not invents it.the gotcha →
  35. 07-01Premium onboarding — plain-language canvas empty state, an ASCII-bannered /init intro, honest ~15–30 min estimate, and it auto-opens the brain at the end.the command →
  36. 06-30Fixed fresh-install /sandpaper:initinstall-skill scaffolds assets locally (no hunting a sibling repo) + the gate/wizard use the AskUserQuestion dialog.the gotcha →
  37. 06-30Shipped sandpaper upgrade — refresh an existing brain (assets · hooks · commands · canvas), keeping your skin. Existing repos can get board-first now.the README →
  38. 06-30Made board-first the default — substantial replies go on the canvas (the board is the reply); dropped the Stop-hook nag. Boarded the decision as 005.the canvas →
  39. 06-30Canvas is a true scrollable whiteboard (content scrolls inside the white box); boarding the turn summary is now an enforced STAMP step. Dogfood board 004.the canvas →
  40. 06-30Canvas is a whiteboard now — current board full + live, older ones fold into a collapsed Earlier stack (capped at 5). Boarded the stamping explainer as 003.the canvas →
  41. 06-30Rebalanced the cover — the canvas is the hero on the first fold (own scroll) — and wired the SessionStart handoff so Claude Code uses it. Dogfood board 002.the hook →
  42. 06-30Built the canvas — the cover hosts a feed of rich boards (elevated explanations); + skill discipline, /canvas, dogfood board 001.why →
  43. 06-30/sandpaper:init now gates on an explicit go-ahead (size read + estimate) before the heavy harvest.the command →
  44. 06-30Toolbar nits — head reads ● Claude Code · idle, the ⌖/✎ icons are crisp centred SVGs now.toolbar →
  45. 06-30Toolbar round 2 — head reads ● Claude · idle (readable, unbranded), monochrome icons, under-hero rule removed.toolbar →
  46. 06-30Polish — toolbar leads with its identity, contrast-guarded skin, / opens the brain, ports auto-bump, refreshed cover cards.gotcha →
  47. 06-30Onboarding + theming — install-skill auto-wires hooks, init intro/close, on-page tour, toolbar adopts the theme.gotcha →
  48. 06-30Built the npx sandpaper CLI (install-skill/init/doctor/open) — tested e2e, doctor healthy.how →
  49. 06-30Made /sandpaper:init smarter — wide artifact discovery + an interactive wizard.the plan →
  50. 06-30Validated /init on a cold repo — found real bugs, built an accurate brain.verdict →
  51. 06-30Added /help + /open commands — the skill surface is 11 now.the skill →
  52. 06-30Built + installed 9 /sandpaper commands; hooks on — we run on our own skill.the skill →
  53. 06-30Built the auto-updating brain (hooks) + the Sandpaper skill — no more prodding.how →
  54. 06-30Brain now shows our own Phase 0 / Phase 1 split (derived bars). Into Phase 1.the plan →
full log →