Contributing
Branch Naming
<type>/<scope>-<short-description>Examples:
feat/identity-invite-reservationfix/messaging-typing-indicator-leakchore/turbo-cache-optim
Commit Messages
Conventional Commits format, English only, header ≤ 70 chars:
feat(identity): add invite reservation RPC
fix(economy): prevent double-regen within 24h window
chore(docs): add wiki module reference pageBefore Submitting a PR
bash
pnpm test # all unit + integration tests
pnpm lint # ESLint (including cross-context import rule)
pnpm type-check # TypeScript strict modeArchitectural Rules (Non-Negotiable)
- No cross-context service imports. The ESLint rule
no-cross-context-importenforces this. Integrate viaEventBus(@OnEvent). - Append-only financial tables. Never
UPDATEemoji_payments,reputation_events,contribution_events,post_boosts. Reversals = new row. - No new Postgres FKs across bounded contexts. UUID references only.
- New external dependencies require a draft ADR in
docs/adr/. - New public functions require unit tests in the same PR.
PR Title Format
[scope] descriptionExample: [identity] add invite code expiration sweep cron
Documentation Updates
Every PR that changes behaviour must update the relevant page in apps/docs/. For architectural decisions, create or update an ADR in docs/adr/.