Commit d7079beb authored by Alex Pooley's avatar Alex Pooley 🔴 Committed by Peter Hegman
Browse files

Add ADR: Organization is a scoped space

parent 1f9e8ee7
Loading
Loading
Loading
Loading
+7 −2
Changes for content/handbook/engineering/architecture/design-documents/organization/_index.md: 7 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -203,12 +203,16 @@ There are situations that might require intervention by an Instance Admin, for i
When that is the case, actions taken by the Instance Admin overrule actions of the Organization Owner.
For instance, the Instance Admin can ban or delete a User on behalf of the Organization Owner.

## Routing
## Organization Space

Every Organization, including non-isolated ones, occupies its own scoped space — independent of [isolation](isolation.md) and Cell placement. This gives each its own namespace, keeps paths stable across Cell moves, and provides a home for Organization-level features. See [ADR 012: Organization is a scoped space](decisions/012_organization_space.md) for the rationale.

### Routing

Today only Users, Projects, Namespaces and container images are considered routable entities which require global uniqueness on `https://gitlab.com/<path>/-/`.
We will update routing rules to allow existing globally scoped routes, and introduce a new parallel set of Organization scoped routes.
The globally scoped routes will maintain backwards compatibility with existing routes, and also reduce path verbosity for platforms other than GitLab.com which are likely to have a single Organization.
There are further details on [Current Organization](current_organization.md)
The URL mechanism is decided in [ADR 004](decisions/004_path_scope.md), and there are further details on [Current Organization](current_organization.md).

## Organization Development

@@ -342,6 +346,7 @@ Based on this analysis we expect to see similar behavior when rolling out Organi
- [008: Non-isolated organizations on GitLab.com](decisions/008_non_isolated_organizations_gitlab_com.md)
- [009: State machine for organization lifecycle](decisions/009_state_machine.md)
- [010: Organization Read-Only Mode](decisions/010_organization_read_only_mode.md)
- [012: Organization is a scoped space](decisions/012_organization_space.md)

## Links

+54 −0
Changes for content/handbook/engineering/architecture/design-documents/organization/decisions/012_organization_space.md: 54 added lines, 0 removed lines.
Original line number Diff line number Diff line
---
owning-stage: "~devops::tenant scale"
title: 'Organizations ADR 012: Organization is a scoped space'
description: 'Every Organization occupies its own scoped space, independent of isolation and Cell placement.'
creation-date: "2026-06-16"
authors: [ "@alexpooley" ]
toc_hide: true
---

## Context

An Organization is a **logical boundary** — more than a data boundary, it is a
self-contained space that owns its own resources, names, and features. That
boundary shows up in three independent ways:

- **Scoped space** — the boundary in the address space (names, routes). Always
  present.
- **Isolation** — whether the data layer actually prevents data from crossing
  between Organizations (see [Organization Isolation](../isolation.md)). Enforced
  gradually, so a [non-isolated](008_non_isolated_organizations_gitlab_com.md)
  Organization already has its space even if its data boundary is not yet enforced.
- **Cell placement** — the boundary realized in physical infrastructure.

These are orthogonal. Scoped space is the logical boundary made addressable, so
it exists whether or not the data is isolated or the Organization lives on its
own Cell.

## Decision

Every Organization occupies its own scoped space, including non-isolated ones.
Scoping is an addressing and ownership decision, so it does not wait on isolation
being enforced or on a move to a dedicated Cell. Concretely, this means:

1. **Its own namespace.** Today every routable name (e.g. Groups and Projects)
   must be unique across one shared global namespace (cluster-wide on GitLab.com). Two customers cannot both have a "Marketing" group; they
   contend for the same global name. An Organization space partitions that
   namespace, so names need only be unique within the Organization.
2. **A single, predictable point of change.** Legacy URLs are retained, but the
   URL format changes once a resource enters an Organization. We make that change
   at one logical point — entering the Organization — rather than later when the
   Organization moves to a Cell. The path does not encode the Cell, so Cell moves
   never change URLs.
3. **A home for Organization-level features.** Organizations own features, such
   as security dashboards, that need a place to live in the URL space, just as
   Groups, Projects, and Users do.

## Consequences

- Non-isolated Organizations are scoped from creation, not retrofitted later.
- The URL mechanism for this is the `/o/<organization>/` scope decided in
  [ADR 004](004_path_scope.md).
- The transition away from the legacy system to the Organization system does come
  with complications — for example, legacy global routes and scoped routes
  coexisting — but these are essentially unavoidable.