ADR-0122: Organization-Level Administration — the Cascade Stays, Becomes Visible, and Founds Projects¶
- Status: accepted (2026-08-23 — his live walkthrough found all three halves: the org-admin cascade working by design, its invisibility in project rosters, and "an org admin can't start new projects"; rulings: keep-and-reveal agreed, "let's keep it flexible" on role suitability, "agree with the new permission")
- Date: 2026-08-23
- Deciders: Nicolas Burri
- Relates to: V005 (the three cascade disjuncts this documents), ADR-0121 (the Project
Administrator whose position now decides reach; the classification guard this reuses), ADR-0097
(
MANAGE_SCOPES, here split), ADR-0108 (tenant self-administration — this completes for projects what that did for people), ADR-0106 (derived-facts pattern for the visibility rows).
Context¶
V005's resolution gives a MANDATOR-scope assignment effect in every current and future scope
of that organization. That IS the org-admin mechanism — Project Administrator staffed at the org
anchor administers the whole organization — and it is hierarchically sound: the organization owns
its projects. But it shipped undocumented and invisible: a project's staffing view lists only
assignment rows at that scope, while the four-eyes evaluator (correctly) counts effective
permissions — so an org-level approver holds power in a project while appearing nowhere in its
roster. A roster that hides an approver poisons the very audit argument this product sells.
Separately, MANAGE_SCOPES conflated founding ORGANIZATIONS (installation-level, cross-tenant)
with founding PROJECTS inside one's own organization (org sovereignty), so only global admins
could start a project.
Decision¶
- The cascade is kept and is now a documented contract: activation at the org scope makes a role staffable THERE and nothing else; an assignment there reaches every current and future scope of the organization at permission-evaluation time; project-level activation choices are deliberately outrankable by the organization. Sovereignty flows downhill.
- Cascaded holders become visible where they act: project staffing/people views render them as derived "via organization" rows (ADR-0106 pattern — one derivation, the same set the evaluators count). What an evaluator counts, a surface must show.
- Warning, not restriction: org-activating a role holding authoring/approval-class content permissions warns (the ADR-0121 classification guard already knows the classes). Which roles suit org-level staffing is left FLEXIBLE per his ruling — organizations differ; a per-role org-activatable flag is configuration at an unproven variation point and is deliberately not built until a real case demands it.
CREATE_PROJECTsplits out ofMANAGE_SCOPES. Classified project-admin (the guard forces the choice), added to the Project Administrator cut AND toSYSTEM_ADMIN_PERMISSIONS(whose class-equality invariant already implies it), and checked at the target organization's anchor scope — whereupon the cascade yields the intended semantics for free: an org-level Project Administrator founds projects in their organization; a project-level one holds the permission only where the check never looks.MANAGE_SCOPESretains organization founding and the remaining cross-organization provisioning acts, global-class as before.- The setup wizard's birth path opens to org-level administrators for their own organization — tenant self-administration for projects, completing ADR-0108's arc.
Consequences¶
- A vocabulary migration adds the
CREATE_PROJECTpermission row;PermissionClassificationTestfails until the classification and both grant lists agree — the guard working as designed. - The provisioning gates change from MANAGE_SCOPES-at-GLOBAL to CREATE_PROJECT-at-target-anchor for project creation specifically; every other provisioning act keeps its gate.
- The visibility rows are read-model work in the staffing surfaces plus their e2e pins; the four-eyes evaluator changes NOT AT ALL (it was already right — the surfaces catch up to it).
- Realization rides v0.9.18 with the finding-wave fixes.