mainis protected. Never commit to or merge intomainlocally.- All work happens on a branch (worktrees under
.claude/worktrees/), and lands via a pull request — always, even for one-line fixes. Push the branch, open the PR withgh pr create, and hand the URL back. - pnpm only.
web/is a pnpm workspace (pnpm-lock.yaml,pnpm-workspace.yaml) and there is nopackage-lock.json. Usepnpm install,pnpm add,pnpm run <script>, andpnpm dlxfor one-off binaries. Nevernpm,npxoryarn:npm installwrites apackage-lock.jsonand a flatnode_modulesbeside the pnpm store, and npm's allow-scripts gate leaves esbuild's postinstall unrun, so the vite build instyles.build.test.tsfails for reasons that look nothing like the cause. - Run the affected test surface before pushing:
cd web && pnpm vitest runandpnpm run lintfor web changes,go test ./...for Go,make testfor anything cross-cutting. web'sstyles.build.test.tsis a real vite build and is the guard for the Tailwind prose scanner — comments in scanned web sources can compile stray CSS rules; see the notes at the top ofweb/src/styles.cssbefore writing prose there.