ADR-005: Single-Operator Multi-Environment Tenancy
Status: Accepted
Date: 2026-05-18
Sprint: SPRINT_20260518_054_Single_tenant_product_position.md
This record defines the trust boundary of a Stella Ops deployment: one deployment runs inside one operator’s trust boundary, and the “tenants” inside it represent environments and sub-organizations under common control — not mutually adversarial SaaS customers. Read it before reasoning about tenant isolation guarantees, planning per-customer hosting, or filing a product-gap verdict that assumes hostile multi-tenancy. For the token-selection mechanics inside this posture, see ADR-002.
Context
ADR-002 defines how a caller selects one tenant for a token. This ADR is orthogonal: it defines who those tenants are allowed to represent in a deployment.
EvidenceLocker F11 and its follow-up sweep proved route-level tenant isolation through slug resolution, envelope-bound identity, and tenant-scoped service authorization. Requests for one tenant must not read another tenant’s evidence, findings, or audit data, and the same envelope-bound stellaops:tenant claim is the architectural source of tenant context across services.
Tier 7 operator-trust planning on 2026-05-18 identified three missing product surfaces that determine whether mutually adversarial tenants can safely share one deployment: per-tenant disk or object-store quotas, tenant-partitioned rate limits, and automated hard tenant-delete. Without those surfaces, one tenant can consume shared storage, saturate shared routing capacity, and cannot be cleanly offboarded by a supported product workflow.
The license posture already prohibits multi-tenant SaaS commercial hosting without a commercial arrangement. This ADR makes the architecture posture match that legal posture so product docs, operator expectations, and future QA verdicts are consistent.
Decision
Stella Ops is a single-operator deployment product. One deployment is operated inside one trust boundary.
“Tenants” inside that deployment represent environments, business units, sub-organizations, or other logical scopes that share the same operator trust assumptions: the same security team, on-call authority, incident-response owner, deployment policy, and data-residency posture.
Cross-tenant adversarial workloads are out of scope for the current architecture. Tenant isolation guarantees protect against accidental cross-tenant leakage and mistakes by trusted users, not against an unrelated tenant that is intentionally trying to deny service, exhaust storage, probe covert channels, or exfiltrate from another tenant.
Consequences
Supported deployment patterns:
- Dev, stage, and prod separation under one operator.
- Business-unit or sub-organization scopes under common control.
- Per-customer tenants only when the operator is contractually and operationally the trust anchor for every tenant, and the customers accept that operator visibility and control model.
Unsupported deployment patterns:
- Public SaaS hosting for unrelated paying customers on one shared Stella Ops deployment.
- A deployment where tenants do not trust each other or the same operator.
- A deployment where one tenant is realistically treated as a hostile actor against another tenant.
Operator obligations:
- Treat tenant creation as a high-trust admin operation.
- Do not expose tenant self-service signup.
- Monitor shared resources at the deployment level, including PostgreSQL volume space, RustFS or object-store capacity, and router QPS.
- Plan manual, cross-database cleanup for tenant offboarding that requires GDPR Article 17 erasure. The product supports soft-suspend today but does not provide an automated hard-delete workflow.
QA implications:
- The FIXTURE-T7-001 two-tenant recipe remains valid for proving isolation inside one operator trust boundary.
- The Tier 7 fixture is not a model for proving hostile multi-tenant SaaS safety.
- Product-gap verdicts for disk quota, tenant-partitioned rate limit, hard tenant-delete, or tenant cleanup must cite this ADR when the requested posture is adversarial tenancy.
Documentation implications:
- High-level docs must describe the tenancy model wherever tenant scoping is introduced.
- “Multi-environment” means multiple logical environments under one operator, not multi-tenant SaaS.
- ADR-002 remains valid for token-selection mechanics inside this posture.
Compliance and legal implications:
- This ADR does not loosen any license term.
- Any future move toward multi-tenant SaaS must be reviewed with legal counsel and reflected in
SAAS_MSP_GUIDANCE.mdandLICENSE-COMPATIBILITY.mdbefore the posture changes.
Future Direction
This ADR may be revisited only after all of the following ship and are verified by a fresh Tier 7 run:
- Per-tenant disk and object-store quota enforcement at write boundaries, plus a
quota_remaining_bytesobservability query. - Router rate-limit partitioning on the resolved
stellaops:tenantclaim, with per-tenant budgets. - A hard tenant-delete workflow with cross-database cleanup, dry-run mode, idempotency, and audit.
- Per-tenant audit isolation verified across claim, header, query, and direct-id attack vectors.
- A per-tenant tester cleanup endpoint so adversarial test runs can remove fixture data without cross-contamination.
- A product decision for tenant-scoped GDPR Article 17 erasure that remains compatible with EvidenceLocker immutability.
When all prerequisites are complete, open a new sprint to re-open or supersede this ADR. The architecture posture and license posture must remain aligned.
References
- ADR-002: Multi-Tenant Selection With Same API Key
- SaaS and MSP Licensing Guidance
- License Compatibility Analysis
- Tier 7 Operator-Trust Tenant Fairness Test Plan
- Operator-Trust Testing Plan Cross-Tier Rollup
- EvidenceLocker tenant slug resolver sprint
- EvidenceLocker tenant slug sweep sprint
- Platform endpoint tenant classification
- Multi-Tenant Same-Key Rollout and Compatibility Policy
- Multi-Tenant SaaS Prerequisites Roadmap
