Skip to content

DOM-PFM-SEC-003User Account

Markdown

DOM-PFM-SEC-003

User Account

Markdown
  • DocumentDraft
  • ImplementationObserved

Planning

Specified by
CON-PFM-SEC-003

Design

Owned by
SVC-PFM-SEC-security

KindDomain objectProduct areaPlatformModuleSecurity, Customers and WorkspacesRevision1ExaminercodexExamined on2026-10-23

Read atservices-platform ad3f6a65react-console baf6dae3

Relationships

ToCardinalityOwnershipCrosses a serviceOn archive or delete
DOM-PFM-SEC-001many console memberships and custom definitions to one customerConsole memberships and custom definitions store their owning customer reference.no
DOM-PFM-SEC-002many portal memberships, assignments and staff access grants to one workspacePortal memberships, scoped assignments and grants refer to a workspace. Workspace purge removes the portal memberships and their dependent identities and assignments.no

Invariants

InvariantProtectsEnforced atProvenance
INV-DOM-PFM-SEC-003-01
A membership has one console or portal boundary; an e-mail address is unique within its customer console or workspace portal.
service, databaseobserved
services-platform:modules/security/db/users.table.ts:users (users_console_email_address_uidx, users_portal_email_address_uidx)
INV-DOM-PFM-SEC-003-02
Fresh authorization refuses invited, suspended and revoked memberships. An earlier cached decision can remain usable until its applicable expiry.
serviceobserved
INV-DOM-PFM-SEC-003-03
Only one invitation may remain outstanding for a membership; resend supersedes the earlier row before creating its replacement.
service, databaseobserved
INV-DOM-PFM-SEC-003-04
Invitation tokens are retained as hashes, expire after 168 elapsed hours and are consumed by a conditional update that admits only a usable invitation.
service, databaseobserved
INV-DOM-PFM-SEC-003-05
Authorization resolves existing sign-in identities without creating them; a provider identity can link to only one account within a pool.
service, databaseobserved
INV-DOM-PFM-SEC-003-06
An assignment names exactly one subject: a membership or a CRM contact.
databaseobserved
INV-DOM-PFM-SEC-003-07
Assignment scope must remain inside the subject’s boundary. Platform scope requires a console membership in Rhythm’s customer; contacts are limited to their workspace and its record-type scopes.
service, databaseobserved
INV-DOM-PFM-SEC-003-08
Evaluation uses active assignments within their validity windows. Pending assignments grant no access and revoked rows are terminal.
service, databaseobserved
INV-DOM-PFM-SEC-003-09
Uniqueness prevents duplicate non-revoked role grants for a subject, scope and window, and duplicate live derived rows for a role and resource key.
databaseobserved
services-platform:modules/security/db/security-assignments.table.ts (security_assignments_live_grant_uidx, security_assignments_derivation_uidx)
INV-DOM-PFM-SEC-003-10
Derived rows carry source and key metadata. Source synchronization controls them; manual amendment and withdrawal are refused.
service, databaseobserved
INV-DOM-PFM-SEC-003-11
Delegation checks require unconditional possession at the target scope and refuse grants to the caller’s own membership, subject to the documented founding-administrator exception.
serviceobserved
INV-DOM-PFM-SEC-003-12
Guarded changes roll back if no qualifying customer security administrator or no active Rhythm Administrator would remain.
serviceobserved
INV-DOM-PFM-SEC-003-13
Release reconciliation is the permitted writer for built-in definitions, rules and policy attachments; other writers are rejected.
service, databaseobserved
INV-DOM-PFM-SEC-003-14
Custom definitions belong to a customer. Role composition refuses another customer’s policy, archived policies and staff-only definitions.
service, databasetest
services-platform:modules/security/tests/integration/db/security-definition-integrity.integration.spec.js#refuses another customer's policy, the one way authority could cross a wall through a definition
INV-DOM-PFM-SEC-003-15
Custom definitions are retained by archiving. Existing role assignments and policy references prevent archive.
serviceobserved
INV-DOM-PFM-SEC-003-16
Reconciliation increments a built-in definition’s version only when its materialized content changes.
serviceobserved
INV-DOM-PFM-SEC-003-17
Cross-customer staff assignments require a matching active grant for member, role, scope and validity window.
service, databaseobserved
INV-DOM-PFM-SEC-003-18
Active-grant unique indexes protect staff target uniqueness. Open requests use a sequential precheck, with concurrent exclusion unknown. Approved entry lasts one to thirty days; emergency entry is at most 240 minutes and needs a reason of twenty characters or more.
service, databaseunknown
services-platform:modules/security/db/staff-access-grants.table.ts (staff_access_grants_active_uidx, EMERGENCY_MAX_MINUTES, EMERGENCY_REASON_MIN_LENGTH); modules/security/services/staff-access/request-tenant-access.ts:requestTenantAccess
INV-DOM-PFM-SEC-003-19
Reconciliation preserves a manually revoked standing grant rather than recreating access at that target.
serviceobserved
INV-DOM-PFM-SEC-003-20
Ordinary security writers append events and classified refusals follow rollback. Workspace purge can remove scoped events; general database append-only and credential-payload rejection guarantees are unknown.
serviceunknown
INV-DOM-PFM-SEC-003-21
Membership deletion retains a former-user identity and name and refuses unresolved references from other records.
service, databaseobserved
INV-DOM-PFM-SEC-003-22
Challenges use digests, ten-minute expiry and five-attempt accounting. Sequential replacement supersedes earlier rows and link writes check existing claims, but concurrent single-challenge and single-contact exclusion are unknown.
service, databaseunknown

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.