Service matrix
Boundary rules
- Global owns shared records used by more than one feature.
- Module APIs own module-specific records and store foreign IDs for shared records.
- Documents is a pipeline service, not a simple CRUD service.
- The shell and feature bundles call services through their configured base URLs.
Common patterns
- Fastify 5 service boundary.
- Drizzle and Postgres for relational module data.
- Zod validation at request boundaries.
- Most list envelopes use
{ items, totalCount, start, length }. - Global, Estimate, Activities, Documents, Rates, and Assistant require EdDSA bearer authentication on protected routes. They accept user or authorised service tokens.
Authentication prerequisites
The Global API runtime needs its EdDSA signing keys and refresh-session table; consuming services need the Global JWKS URL.OpenAPI status
The following tenant-facing services serve a machine-readable OpenAPI 3.1 document generated from their route-descriptor registries:
Each service keeps a committed contract snapshot and source-level drift and snapshot tests.
The internal Admin API also serves a documentation-only OpenAPI contract at
GET /api/admin/openapi.json; it is intentionally excluded from the tenant/copilot tool
substrate. Services not listed here do not yet serve an OpenAPI document.
