Skip to main content

Horizontal services consumption — quick reference

Tier: Public
Status: v1.0 (contributor cheat sheet)
Audience: module authors, vertical builders, third-party integrators.

One-page summary of RFC-0001 §8 (Decision F). Consume platform services; never reimplement them.

Full RFC table and enforcement layers: RFC-0001 §8.2. Deep dives:


Obligation table (abbreviated)

ConcernPlatform ownsYou mustYou must not
Identity / sessionsUser, Session, /auth/*Use session/bearer auth via platform routesParallel session model
TenancyWorkspace, WorkspaceMember, requireActiveWorkspaceScope all ops to session activeWorkspaceIdParallel tenancy concept
ACL / rolesAclService, WorkspaceRoleCall platform ACL in services; declare roles via SDK conventionsCustom permission tables
BillingWorkspaceBilling, Stripe/RevenueCat integrationDeclare addonCodes / tierLimits via SDKImport Stripe/RevenueCat in module code
AIOrchestrator, tool registry, BYOK vaultregisterAiTools, register prompts/knowledge via SDKCall LLM providers directly from module code
ObservabilityPino logger, error handler, audit conventionsUse platform logger and event shapesAd-hoc logging stacks
i18n@umbraculum/i18n, @umbraculum/i18n-reactModule-prefixed message namespacesForked translation system
UI@umbraculum/ui, @umbraculum/navigationBuild on design tokens + route IDsParallel component library
SecretsPlatform key vault (AI BYOK today)Register secret kinds via SDKSecrets in module env/files
IntegrationsDevices, attachments, readings frameworkRegister device kinds via integrations SDKParallel device-ingestion path
HTTPFastify plugins, registerModule()Register routes through module registrationCustom CORS/auth around platform
DatabasePrisma + Postgres schemasUse platform client; module models in module schemaParallel ORM; client-side Postgres
Rendering@umbraculum/rendering, BullMQ jobsregisterDocumentTemplate, submit render jobsBundle PDF/XLSX engines in module
NotificationsOutbound-delivery service (RFC-0008)Register intents/templates via SDKSMTP/provider SDK in module

Pre-flight (60 seconds)

Before writing code, answer no to every question below. If any answer is yes, stop — you are proposing a platform change or misclassifying the work.

  1. Does my module define its own login or session store?
  2. Does my module use a workspace id from the request body without session membership checks?
  3. Does my module ship its own role/permission tables?
  4. Does my module call Stripe, Anthropic, or SMTP directly?
  5. Does apps/web or apps/native import Prisma or DATABASE_URL?
  6. Does my published npm package expose Prisma types?

In-repo module slice checklist

For code under services/api/src/modules/<code>/:

  1. Routes registered via registerModule() — not a standalone Fastify app.
  2. requireActiveWorkspace() at the route boundary.
  3. assertMembership (today) / AclService.requireRole (target) in services.
  4. Prisma queries include workspaceId.
  5. DTOs in packages/<code>-contracts/ with Zod parsers (RFC-0003).
  6. L2 cross-workspace isolation test for new routes (TESTING.md).

Third-party module checklist

For packages outside this monorepo:

  1. Pin @umbraculum/module-sdk and @umbraculum/<code>-contracts from npm (when published).
  2. Integrate via HTTP + documented routes (API-OPENAPI.md).
  3. No database credentials in the integrator deployment for Umbraculum data.
  4. Respect the same tenancy/ACL semantics the API enforces (you inherit them by calling the API).

Cross-references