Module Build Status

Tracks where each module is in the pipeline. Updated at each milestone.

Pipeline stages: design-lock → service-skeleton → admin-pages → ship

Module Design Lock DB Migration Service Layer Admin Pages Ship
platform ✅ locked (21 tables) ✅ applied (local) 🔄 skeleton (see below)

platform — Service Layer Detail

Status: skeleton / in-progress — NOT done.

What exists:

  • packages/db — Drizzle schema (21 tables), migration applied locally, 15 set_updated_at triggers
  • apps/api/src/database/DatabaseModule — provides DB, ADMIN_DB, TENANT_DB as global NestJS providers
  • apps/api/src/platform/TenantContextMiddleware — extracts x-tenant-id header, validates UUID, stores on request. TODO: replace with JWT claim extraction at identity integration.
  • apps/api/src/platform/decorators/AdminRoute — marks a route as admin/cross-tenant (uses adminDb, skips tenant-ID requirement)
  • apps/api/src/platform/PlatformService — 41 methods:
    • 21 reads (thin-functional): real Drizzle queries, return rows. listTenants, getTenant, getTenantBySlug, getProfile, getContacts, getBillingAccount, getSubscription, listInvoices, getPayments, getTierCatalog, getTier, getEntitlements, resolveEntitlements, hasEntitlement, getAiCreditAccount, getContracts, getPromoCodes, validatePromoCode, getCurrentAgreement, getAcceptances, getSetupTasks, getUsage
    • 3 NotImplemented stubs: startDunning, advanceDunning, recoverDunning, consumeAiCredit (all require state machine / atomic logic — see spec §9/§10 and OPEN_ITEMS)
    • 17 naive-write stubs: createTenant, updateTenantStatus, changeTier, pauseSubscription, resumeSubscription, cancelSubscription, recordInvoice, recordPayment, grantEntitlementOverride, revokeEntitlement, incrementUsage, grantAiCredit, purchaseAiCredit, createContract, updateContractStatus, recordAcceptance, recordUsageSummary, recordOperatorAction
  • apps/api/src/platform/dto/platform.dto.ts — 17 input DTOs with class-validator decorators
  • packages/db/seeds/dev-seed.ts — DEV/LOCAL ONLY. 3 tiers, 5 tenants (mixed verticals, varied statuses), profiles/contacts/subscriptions/entitlements. npm run dev-seed -w @vrida/db

What is NOT done (deferred):

  • HTTP controllers (step 11)
  • Automated tests (post-identity)
  • State machine enforcement in updateTenantStatus (spec §8 legal transitions)
  • Dunning workflow execution (spec §10, AI-driven, vendor-dependent)
  • Entitlement precedence/stacking in resolveEntitlements (spec §9)
  • AI credit atomic consumption (consumeAiCredit — balance check + spend limit + ledger)
  • Per-request tenantDB transaction wrapping (deferred to identity integration)
  • Remote Supabase link (user action — requires browser auth)
Last modified: Jun 28, 2026, 9:08 AM PT
On this page
Esc