MindshineMindshineCortex for Allvue v1.0.891

Multi-tenancy

The question from the review: Allvue sees the value internally, but how does a cortex-built product become useful for Allvue's customers? Multi-tenancy, build once and run many, deployment across client environments. The architects will ask about tenant context propagation, tenant-specific credentials, database isolation, data partitioning, upgrade strategy, customer customisations, and whether one customer's agent can ever touch another customer's data.

The short answer

Two of the three usual models are supported by the platform as it stands; the third is the application's own design, with the platform supplying the pieces around it.

Model How it maps to cortex Standing
Dedicated deployment per customer One project per customer. A project is already the unit of tenancy and of delivery: its own configuration database, engine fork, target database, object-storage prefix, containers, and its own customer archive. Upgrades are a new export per project. Available
Shared application, shared infrastructure, tenant isolation One project. A tenant column in the governed data and one row filter bound to the caller's tenant attribute; the attribute comes from the membership or from Allvue's entitlement API; the filter applies to every screen and every agent that reads the governed data, and fails closed. Available
Hybrid: shared services, tenant-specific data and security The application's own design (a connection per tenant, a database per tenant). The platform supplies per-project environment, secrets and the tenant attribute in the verified subject; it does not manage a per-tenant connection map inside one application. Partial

The concerns, one by one

Concern Dedicated per customer Shared with tenant policies Standing
Tenant context propagation The deployment is the tenant. The caller's verified subject (e-mail, organisation, role, membership attributes, entitlement-API attributes) is assembled server-side on every call, compiled into a signed grant with a five-minute expiry, and carried into every endpoint. An endpoint that forwards a call to an Allvue system can pass on the tenant attributes it can trust. Nothing is taken from the browser. Available
Tenant-specific credentials Per project, in the project's environment, rotatable. One set per project; a per-tenant credential inside one application is the application's concern. Partial in the shared model
Database isolation A target database per project. One database; isolation by row filter and column mask compiled into every query. A policy that names an attribute the caller lacks compiles to false, so an outage of the attribute source narrows access. Available
Data partitioning By project. By the tenant column; the pipeline's processing rules and the governed target enforce the column's presence and values. Available
Upgrade strategy Export per project; the runbook's rollback is the previous image tag plus per-consumer flags in the project's data. Projects that share a design can be prototyped from one base project (forks inherit from a prototype) so a fix to the base reaches every fork. One deployment, one upgrade; per-consumer flags in the data switch a change off for one tenant without redeploying. Available
Customer customisations A branch of the customer's project: every branch has its own engine fork, so a customisation is developed and tested on the branch and merged or kept. Configuration rows per tenant (rules, reference lists) on the shared project; code-level customisation per tenant argues for the dedicated model. Available
Can one customer's agent touch another customer's data? No: an agent's tools are endpoints of its own project's fork, resolved by a server-side handle; another project is unreachable by construction. An agent reads governed data only through endpoints that carry the caller's grant, so the row filter bounds it exactly as it bounds a screen; the safeguards additionally refuse an answer no tool result backs. Available

Build once, run many

The same export serves both models. A dedicated deployment is the customer archive of that customer's project. A shared deployment is one archive whose data carries the tenant column and whose delivery distributes the governance companion if Allvue wants to edit policies off the platform. In both, the images are ordinary and the CI is generated, so "run many" is a matter of how many times Allvue deploys the same images with different environment files.

What is not in place, and what we propose

Gap Today Proposal
A per-tenant connection map inside one application Not built The platform injects one environment per project. Part of the Allvue profile: a tenant-resolution convention for the scaffold (a tenant-keyed secret set in the environment, resolved from the verified subject's tenant attribute) so the hybrid model is generated the same way every time rather than designed per application.
Tenant-level upgrade waves in the shared model Partial Per-consumer flags in the data exist as the business rollback layer. Nothing platform-side; the flags are the mechanism and the runbook documents them.
Fleet-wide upgrade of dedicated deployments Partial One export per project; a prototype chain propagates engine changes, not app-service trees. A base app-service tree shared through the prototype with per-fork overrides, if Allvue chooses the dedicated model at scale.