2026-09-26 20:31:15 +02:00
|
|
|
---
|
|
|
|
|
id: USER-WP-0036
|
|
|
|
|
type: workplan
|
|
|
|
|
title: "Show allowed and active access on the account page"
|
|
|
|
|
domain: communication
|
|
|
|
|
repo: user-engine
|
2026-09-26 20:46:38 +02:00
|
|
|
status: finished
|
2026-09-26 20:31:15 +02:00
|
|
|
flavor: extension
|
|
|
|
|
owner: grok
|
|
|
|
|
topic_slug: user-engine
|
|
|
|
|
created: "2026-09-26"
|
|
|
|
|
updated: "2026-09-26"
|
|
|
|
|
related: [USER-WP-0026, USER-WP-0028]
|
2026-09-26 20:32:03 +02:00
|
|
|
state_hub_workstream_id: "2d182130-88d0-5b17-b2bf-3e28f5df4f37"
|
2026-09-26 20:31:15 +02:00
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# USER-WP-0036 - Account situational awareness
|
|
|
|
|
|
|
|
|
|
The signed-in account page mixes three different facts. The verified token
|
|
|
|
|
names the tenant this sign-in is using. A portal membership row is access the
|
|
|
|
|
portal has recorded. A tenant account written on first sign-in is neither.
|
|
|
|
|
|
|
|
|
|
On 2026-09-26 a directory sign-in for `tenant:trial:demo-company` had a portal
|
|
|
|
|
tenant account, no membership rows, and company admission from the directory
|
|
|
|
|
group on the token. The account page showed that token tenant under "Tenant
|
|
|
|
|
access" and then "No tenant memberships yet." Workload access listed nothing,
|
|
|
|
|
because the page only reads memberships whose scope is an application,
|
|
|
|
|
service, workload, or asset. The company application does not consult that
|
|
|
|
|
list.
|
|
|
|
|
|
|
|
|
|
A person may hold access to more than one tenant and more than one workload.
|
|
|
|
|
An ordinary session uses one tenant at a time. Vendor roles, administrators,
|
|
|
|
|
and a person hired by more than one vendor may have more than one tenant
|
|
|
|
|
active, and each active tenant stays visible. Allowed access and active
|
|
|
|
|
access are both shown. Login state is shown separately from either list.
|
|
|
|
|
|
|
|
|
|
Allow, deny, and unavailable workload decisions stay with USER-WP-0026-T03
|
|
|
|
|
and USER-WP-0028-T02. This plan does not infer those decisions.
|
|
|
|
|
|
|
|
|
|
## Separate login state, active access, and allowed access
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: USER-WP-0036-T01
|
2026-09-26 20:46:38 +02:00
|
|
|
status: done
|
2026-09-26 20:31:15 +02:00
|
|
|
priority: high
|
2026-09-26 20:32:03 +02:00
|
|
|
state_hub_task_id: "ffc8f42f-5ca3-56a2-8850-d2da9beba72c"
|
2026-09-26 20:31:15 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
On `/onboarding`, and in the signed-in home identity block, present three
|
|
|
|
|
labelled situations in ordinary language.
|
|
|
|
|
|
|
|
|
|
Login state names the verified portal identity, or says the portal session is
|
|
|
|
|
absent. Say that this is the portal session and that an application can keep
|
|
|
|
|
its own session. Do not infer identity from the URL.
|
|
|
|
|
|
|
|
|
|
Active now is this verified token: its tenant, roles, and directory groups.
|
|
|
|
|
An ordinary session has one active tenant. A tenant administrator,
|
|
|
|
|
platform operator, platform root, vendor role, or multi-hire membership may
|
|
|
|
|
have more than one tenant active, and each one is marked. Until the account
|
|
|
|
|
carries one of those exception roles, show a single active tenant. Do not
|
|
|
|
|
invent a new role catalogue to detect the exception.
|
|
|
|
|
|
|
|
|
|
Allowed access is portal membership rows for this user. A tenant membership
|
|
|
|
|
shows the tenant and kind. A workload membership is only a row whose scope is
|
|
|
|
|
application, service, workload, or asset. An empty list says that nothing is
|
|
|
|
|
recorded. A tenant account created on first sign-in is not a membership. The
|
|
|
|
|
token tenant is not repeated as a membership. Remove the "Viewing <tenant>"
|
|
|
|
|
line that currently does that.
|
|
|
|
|
|
|
|
|
|
A workload with no catalogue decision is "not checked." That is neither
|
|
|
|
|
access nor a denial. Do not copy a successful application login, a directory
|
|
|
|
|
group, a platform role, or a tenant account into a membership to fill the
|
|
|
|
|
list.
|
|
|
|
|
|
|
|
|
|
The observed case renders as: signed in, one active tenant taken from the
|
|
|
|
|
token, no allowed tenants, no allowed workloads, workload decisions not
|
|
|
|
|
checked. Keep the layout readable on a phone.
|
|
|
|
|
|
2026-09-26 20:46:38 +02:00
|
|
|
2026-09-26: the home page and `/onboarding` now render Login state, Active now,
|
|
|
|
|
and Allowed tenants / Allowed workloads as separate sections. A tenant account
|
|
|
|
|
is not listed as a membership. Recorded workload rows stay labelled as records,
|
|
|
|
|
followed by "Workload decisions are not checked."
|
|
|
|
|
|
2026-09-26 20:31:15 +02:00
|
|
|
## Change the active tenant only through sign-in
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: USER-WP-0036-T02
|
2026-09-26 20:46:38 +02:00
|
|
|
status: done
|
2026-09-26 20:31:15 +02:00
|
|
|
priority: high
|
2026-09-26 20:32:03 +02:00
|
|
|
state_hub_task_id: "136a27ff-fd3e-5f0a-8a3a-bb080f1965d5"
|
2026-09-26 20:31:15 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
An ordinary user changes the active tenant through the existing
|
|
|
|
|
reauthentication handoff, `/login?tenant_hint=`. The identity provider
|
|
|
|
|
replaces the token tenant. After return, the page shows that tenant as the
|
|
|
|
|
only active one and leaves other allowed memberships inactive.
|
|
|
|
|
|
|
|
|
|
An exception role may show more than one active tenant. Those tenants still
|
|
|
|
|
come from verified sign-in context. Do not add a control that marks a second
|
|
|
|
|
tenant active inside the portal session alone. Recognize only roles and
|
|
|
|
|
membership kinds the account already stores: `tenant-admin`,
|
|
|
|
|
`platform-operator`, `platform-root`, and a vendor or multi-hire kind when
|
|
|
|
|
one is already recorded.
|
|
|
|
|
|
|
|
|
|
Switching tenant does not claim to end application sessions. The existing
|
|
|
|
|
sign-out copy remains the place that explains a remaining shared sign-in.
|
|
|
|
|
|
2026-09-26 20:46:38 +02:00
|
|
|
2026-09-26: an inactive tenant membership links to `/login?tenant_hint=`. The
|
|
|
|
|
page has no control that marks a second tenant active inside the portal
|
|
|
|
|
session. Extra active tenants are taken from the verified `active_tenants`
|
|
|
|
|
claim, and only for `tenant-admin`, `platform-operator`, `platform-root`, or a
|
|
|
|
|
recorded `vendor` or `multi-hire` membership. An ordinary sign-in shows the
|
|
|
|
|
token tenant alone.
|
|
|
|
|
|
2026-09-26 20:31:15 +02:00
|
|
|
## Record the journey and prove the three situations
|
|
|
|
|
|
|
|
|
|
```task
|
|
|
|
|
id: USER-WP-0036-T03
|
2026-09-26 20:46:38 +02:00
|
|
|
status: done
|
2026-09-26 20:31:15 +02:00
|
|
|
priority: medium
|
2026-09-26 20:32:03 +02:00
|
|
|
state_hub_task_id: "4c9b0600-5034-58ce-9b02-90a040f6f65f"
|
2026-09-26 20:31:15 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Update `docs/account-journeys.md` U01 and U09 so login state, active access,
|
|
|
|
|
and allowed access are the contract. U10 keeps explicit reauthentication as
|
|
|
|
|
the tenant switch.
|
|
|
|
|
|
|
|
|
|
Add portal tests for signed-out, a token tenant with no membership, an
|
|
|
|
|
allowed tenant that is not active, a recorded workload membership, and an
|
|
|
|
|
exception role whose verified context has two active tenants. Assert that a
|
|
|
|
|
tenant account alone does not appear as allowed access, and that an absent
|
|
|
|
|
catalogue decision renders as not checked.
|
|
|
|
|
|
|
|
|
|
Do not close USER-WP-0026-T03 or USER-WP-0028-T02 from this plan. They remain
|
|
|
|
|
the owners of allow, deny, and unavailable workload decisions.
|
2026-09-26 20:46:38 +02:00
|
|
|
|
|
|
|
|
2026-09-26: U01, U09 and U10 in `docs/account-journeys.md` match the page.
|
|
|
|
|
`tests/test_account_awareness.py` covers the signed-out home, a token tenant
|
|
|
|
|
with a tenant account and no membership, an inactive allowed tenant, a
|
|
|
|
|
recorded workload, an ordinary sign-in that ignores a second tenant claim, and
|
|
|
|
|
exception roles whose verified token lists two active tenants. 247 unit tests
|
|
|
|
|
passed. The live portal still serves the previous image.
|