Judge the DIFF against these gates, in order. Flag correctness and requirement gaps only — lint owns style. Global standards load via CLAUDE.md; this file is ONLY orangecat's scars.
- Ownership is
actor_id— neveruser_id— across schema, queries, and types. Mixed ownership columns fork the identity model. - BTC is
NUMERIC(18,8)— the canonical storage AND display unit. Never integer satoshis in storage (price_btc, notprice_sats); satoshis are only a user-selectable display option. No "satoshi-first" language anywhere. - Money paths need tests — Lightning top-ups, Cat Credit charges, BTC-pass plan grants: any change requires the money-path suite green. Untested charge code does not merge.
- Supabase is SELF-HOSTED only — the managed cloud project and the
mcp_supabase_*MCP tooling are RETIRED. Migrations: files insupabase/migrations/(never edit applied ones) applied viaSUPABASE_DB_PASSWORD=$POSTGRES_PASSWORD npx supabase db push. - Entity taxonomy from
src/config/entity-registry.ts— no entity types, labels, or routes defined anywhere else.
- "pseudonymous" NEVER appears on the homepage (use "any identity", "no verification required"); deeper pages (/about, docs) may use it.
- CHF is the default fiat display currency.
- Bitcoin-orange is the only brand accent.
verify/CI green before review (incl. migration-replay + gitleaks jobs).- Diff updates CLAUDE.md/docs if it changes documented structure/behavior.
- Second fix of the same bug class ships the rule/test that ends the class.