Suspending a tenant does not suspend it
Table of Contents
This page is a capture in the inbox bucket of the product backlog — a pre-sprint idea, not yet pulled into a sprint as a story.
1. What
A tenant can carry the status suspended, and nothing anywhere reads that
status on the sign-in path. A suspended tenant's accounts keep signing in.
2. Why
Found on 2026-09-23 while documenting User Journey: Retire or reset a tenant.
Evidence:
- The status values are seeded in
projects/ores.sql/create/iam/iam_tenant_statuses_create.sql:bootstrapping,active,suspendedandterminated. The type is modelled atprojects/ores.iam/modeling/ores.iam.tenant_status.org. - Searching
projects/ores.iam/andprojects/ores.sql/create/iam/forsuspendedreturns only three files: the status type, the model, and the table that seeds the rows. No handler, no query and no guard reads the value. - Nothing in
projects/ores.iam/core/include/ores.iam.core/messaging/auth_handler.hpporaccount_operations_handler.hppmentionssuspended,tenant_statusor'terminated'. - There is no suspend operation to set it either: the permission
iam::tenants:suspendis seeded and unused, and no lifecycle function implements suspension.
So suspension is a label with no effect today. Two things are missing, and both are needed before the status means anything:
- A way to set it. The candidate is
iam.v1.tenants.suspend, which should refuse the system tenant exactly as the other lifecycle functions do — see Delete can terminate the system tenant. - A check that enforces it where it matters. The sign-in path must refuse an account whose tenant is not active, and say why, so the person is not left guessing whether their password was wrong.
A related consequence worth fixing in the same wave: locking an account does not end its open sessions, and neither would suspending a tenant. Ending them is a separate change.
3. References
projects/ores.sql/create/iam/iam_tenant_statuses_create.sql— the seeded statuses.projects/ores.iam/modeling/ores.iam.tenant_status.org— the model.projects/ores.iam/core/include/ores.iam.core/messaging/auth_handler.hpp— where the check belongs.