ADR-0014 + tenant-engine boundary contract + IAM Profile v0.3
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 5s

Ratifies the tenant capability-role model (PLTF/IAM/VEN/CUS, non-exclusive,
independent of ADR-0013's grouping axis), a hybrid carrying mechanism
(tenant-engine authoritative, key-cape caches a tenant_roles claim at
issuance, flex-auth re-validates live for aal2-class decisions), and
tenant-engine as a new, separate service owning tenant existence, grouping,
capability roles, and plan/subscription assignment -- not a module inside
user-engine, whose own boundary contract already scopes it to consuming
tenant identifiers, not owning them.

canon/standards/tenant-engine-boundary-contract_v0.1.md defines that
ownership boundary before the repo exists, mirroring how
user-engine-boundary-contract_v0.1.md was sequenced.

canon/standards/iam-profile_v0.3.md (minor version per ADR-0011's own
governance -- optional claim addition, no breaking change) adds the
tenant_roles claim, folds in ADR-0013's tenant-identifier vocabulary, and
documents the live-revalidation requirement. docs/platform-identity-
security-architecture.md's Tenant Model section and SCOPE.md's canonical
spec pointer updated to match; other historical citations of v0.2 left as
version-pinned references, not bulk-updated.

Records Bernd's trial-tenant policy: trial-grouped tenants may hold any
capability role (showcase/test/explore), with safety enforced through
tenant-engine-owned resource guardrails (spend limits, entity/action
counts) rather than role gating -- guardrail design is reserved, explicitly
not specified by this change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-07-23 21:45:37 +02:00
parent a18f83c4af
commit 9026d7f904
5 changed files with 838 additions and 7 deletions

View file

@ -1,7 +1,7 @@
# Platform Identity and Security Architecture
Status: implemented architecture baseline for NetKingdom/Railiance/Coulomb
Date: 2026-05-24
Date: 2026-05-24 (Tenant Model updated 2026-07-23, ADR-0013/ADR-0014)
## Purpose
@ -296,15 +296,39 @@ Examples of platform-root actions:
Every protected resource should belong to a tenant or to the platform
control plane.
Suggested identifiers:
Tenant identifiers are `tenant:<grouping>:<name>`, where `<grouping>` is an
onboarding-risk / entity-shape classification ratified by ADR-0013
(`trial`, `friendly`, `single`, `small`, `medium`, `large`, `enterprise`,
`consumer`, `family`, `community`, `association`, `agentic`):
```text
tenant:platform # platform control plane resources
tenant:coulomb # first internal/reference tenant
tenant:sandbox:<name> # sandbox tenants
tenant:customer:<name> # future customer tenants
tenant:platform # platform control plane — reserved, ungrouped
tenant:coulomb # first internal/reference tenant — reserved, ungrouped
tenant:friendly:binky # first tenant onboarded under this taxonomy
tenant:<grouping>:<name> # general shape for tenants onboarded going forward
```
`tenant:platform` and `tenant:coulomb` predate the taxonomy and stay
reserved outside it — see `canon/standards/iam-profile_v0.3.md`'s Tenant
Claim section for the full rationale.
A tenant separately holds **capability roles**`PLTF`, `IAM`, `VEN`, `CUS`
(ADR-0014), non-exclusive — describing what it *does* on the platform,
independent of its grouping (what kind of entity it *is*). A `trial`-grouped
tenant may hold any capability role, since `trial` exists to showcase every
role; safety instead comes from tenant-level resource guardrails (spend
limits, entity/action counts — reserved, not yet designed).
`tenant-engine` (new service, `canon/standards/tenant-engine-boundary-contract_v0.1.md`)
is the canonical owner of both tenant grouping and capability-role facts,
plus plan/subscription assignment. `key-cape` caches a tenant's roles on
issued tokens (`tenant_roles` claim) for ordinary decisions; `flex-auth`
re-validates live against `tenant-engine` before authorizing privileged,
destructive, platform-root, or otherwise `aal2`-class actions — the same
threshold the assurance model below already uses. `user-engine` continues
to own users and memberships *scoped by* a tenant, not the tenant record
itself.
Tenant membership and platform membership are distinct. A subject may be
an administrator in `tenant:coulomb` without being a platform operator.