CLAUDE.md · git:20260731.e602259 · 2026-07-31 · sha256 b37ce9580afab485

CLAUDE.md git:20260731.e602259A

Immutable. This exact content is served forever at /api/v1/blob/b37ce9580afab485.

# Working in this repo

## This repository is PUBLIC

Everything you write here is world-readable and, once pushed, effectively
permanent. That includes commit messages, branch names, PR titles and
descriptions, PR and issue comments, code comments, test fixtures, and any file
you add.

**Never write into any of those:**

- **Names of customers, prospects, or their employers.** Not in a commit
  message, not as motivation for a change, not in a code comment. "A $COMPANY
  employee reported X" identifies both a company and, in a small enough
  population, a person — and it discloses that they are a user.
- Names, emails, handles, or job titles of individuals outside the project.
- Internal URLs, ticket IDs, or intranet links — ours or a customer's.
- Support-ticket contents, private feedback, sales conversations, or anything
  from a private Slack channel.
- Revenue, customer counts, pipeline, or other unpublished business figures.
- Anything about unannounced partnerships or launch dates.

**Write the motivation generically instead.** The reason a change is worth
making almost never depends on who asked:

| Don't | Do |
|---|---|
| "An employee at <named company> hit our block page" | "We've had a report of derive.to being blocked by a corporate web gateway" |
| "<Named company>'s security team flagged this" | "Reported via a customer security review" |
| "Blocking the <named company> deal" | "Blocks enterprise onboarding" |

If the specific identity genuinely matters to a reviewer, it belongs somewhere
private — a Derive doc, an internal issue — and the public artifact links to
nothing or says "see internal notes".

**Before pushing or opening a PR**, re-read the commit message and PR body for
the above. It is much cheaper to catch it there than after.

**If something does get published:** amending a commit message and force-pushing
an unmerged branch, plus editing the PR body, removes it from every normal view
— but the old commit object stays reachable by SHA on GitHub, and the PR
timeline records that a force-push happened. Fix it immediately anyway, and flag
it to a human, who can ask GitHub Support to garbage-collect the orphan if the
disclosure is serious.

## Git

The main checkout at `~/derive/derive` is shared across concurrent sessions.

- `git fetch origin main` **before branching**. Local `main` is routinely many
  commits stale, and branching off it inherits already-fixed lint failures that
  then look like yours when the pre-push hook rejects the push.
- Verify the branch in the *same command* as the commit or push
  (`test "$(git rev-parse --abbrev-ref HEAD)" = ... || exit 1`).
- **Never read a push's success from a pipeline's exit code.** `git push | tail`
  reports `tail`'s status, so a rejected push looks like success. Confirm with
  `git ls-remote --heads origin <branch>` and compare SHAs.

Hooks (`.githooks`, enabled by `pnpm install`): pre-commit runs `pnpm run ci`,
pre-push runs the full `pnpm verify` (ci → typecheck → **test:coverage**). The
coverage ratchet only runs in `verify`, so `pnpm test` passing is not the same
as the push gate passing — run `pnpm verify` before claiming a change is green.
Both hooks take minutes; run pushes in the background rather than timing out and
restarting the chain from scratch.