Skip to content

CLAUDE.md —

What this is

Stack

Commands

# build:        <dotnet build / npm run build>
# test:         <dotnet test / npm test>
# format check: <dotnet format --verify-no-changes / npm run format:check>
# run locally:  <command + required env/config>

Architecture

<3-6 lines: project layout (.Api / .Bll / *.Dal / Tests or feature folders), where queries/mutations live, identity model (IActorIdentityGuard), anything non-obvious.>

ExpertGroup standards (binding)

  • Branching: feature branches off development (default), squash-merge PRs into development; promotions development → staging → production via plain-merge PRs; Conventional Commits; PRs small and focused.
  • C#: tabs/CRLF, max line length 180 (pack parameters — never one-per-line unless over the limit), primary constructors wherever possible, camelCase private fields (no underscore), nullable enabled, warnings as errors, async all the way (no .Result/.Wait()), constructor/[Service] injection. Style enforced by .editorconfig — do not fight it.
  • Angular: standalone components, inject(), signals, no type suffixes for new files, firstValueFrom (never toPromise).
  • GraphQL: DataLoaders for nested resolvers; authorization check first line of every resolver; fields nullable by default; never break the schema — deprecate first.
  • EF Core: AsNoTracking for reads (AsNoTrackingWithIdentityResolution when includes share parents); never edit applied migrations; migrations applied by pipeline, not at startup; query-shape tests (query count + ToQueryString) for critical paths.
  • Tests required for new behavior; regression test with every bug fix. Naming: Method_Scenario_ExpectedBehavior.
  • Security: no secrets in code/config/YAML; validate all input; no internals in error responses.
  • Resilience: every outbound call (HTTP/DB/queue) has an explicit timeout; use the standard resilience handler (retry+backoff+circuit breaker); poison messages dead-letter, never block.
  • Observability: OpenTelemetry tracing wired via Core hosting; trace id in every log line; one wide structured event per request.
  • Architecture: significant decisions get an ADR in docs/adr/ (Nygard format); no shared databases between services; entities use private setters + invariant-enforcing constructors + encapsulated collections.
  • AI-assisted code gets normal review — the PR author owns and must understand every line.

Full standards:

Repo-specific rules

Gotchas