Manage users via Teams in GitLab and transition group sharing to Teams
## Problem
[Related FigJam board](https://www.figma.com/board/qaNvvTAiN1thkz4RgeXmDp/Transition-group-sharing-to-Teams?node-id=0-1&p=f&t=NdaIstziUBSYvasQ-0)
Groups in GitLab conflate resource organization with access control. This dual purpose
creates a fundamental issue: Resources (groups/projects) are owned by individuals rather
than teams, leading to single points of failure, unclear accountability, and permissions
that don't reflect organizational structure.
The core problem: Individual ownership of
resources means permissions are scattered across persons rather than teams, making it
impossible to model real organizational structures where teams, not individuals, own deliverables.
While we do a solid job on the former, we've got room to improve on the latter. Since groups do double-duty here and are relatively generic objects, we're losing an opportunity to refine specific features that might help people get work done. Specifics on where we see this evidenced:
* Reporting. We have few views in GitLab that allow someone else in the company to get a birds-eye view of team activity. This is especially frustrating for managers, who lack a single place to answer questions like "what is my team working on?" and "how can I effectively manage resourcing now and for the future?".
* Tim's sheet: https://docs.google.com/spreadsheets/d/1WVp-79ojhfJtjXYnpMWN0QpXU2HRXf09-1wMOL1liwQ/
* Access control. Requests to [share a group with a group](https://gitlab.com/gitlab-org/gitlab-ce/issues/33054) and allowing [project settings to inherit from a group](https://gitlab.com/gitlab-org/gitlab-ee/issues/5255) are needs that align well with the concept. What if we could define a team in GitLab and grant specific access controls and permissions to these teams?
* Communication. Issues are terrific async communication tools, but there's an opportunity here to build even richer tooling for both async and real-time communication. The concept of a GitLab Team would provide a great foundation to build on.
* Portfolio management and workflows. Triaging and assigning issues/code reviews can get a lot easier to manage if we're able to assign to specific teams.
## Proposal
We separate groups used to manage people from groups used to organize work like so:
```mermaid
graph TD
Organization --> Top-level_group --> Project_1
Top-level_group --> Project_2
Organization --> Team_group --> Team_1
Team_group --> Team_2
```
* In a way this is already possible today
* Existing group containers can be used to build team
* Teams would be optimized for what they are designed to do: organize members. All additional functionality would be removed from the group object except for `Group information > Members`.
* Teams are built on the namespace framework
We use the existing group sharing functionality to build links between teams and groups/projects like so:
```mermaid
graph TD
Organization --> Top-level_group --> Project_1
Top-level_group --> Project_2
Organization --> Team_group --> Team_1
Team_group --> Team_2
Team_1 -.-> Project_2
```
* Links can be built from both ends:
* A team can request membership to a group or project
* A group or project can invite a team to become members
* A team can be added to a project
* A team can be added to a subgroup containing several projects. In that case, team members would get access to both the subgroup and the contained projects.
## Implementation
When this epic is complete:
- Resources (groups/projects) will be owned by Teams, not individuals
- No individual 'Owner' role will exist at group/project level
- Organization Owners can create Teams
- Teams create and own resources
- Team membership determines individual permissions
- Migration tools will convert individual ownership to team ownership
## What does success look like?
A group's Owning Team can add another Team to a group or project and provide access that way.
## What does this look like elsewhere in the Market?
The standard seems to be a collection of individuals who are working together in an area to accomplish a set of goals. At this level you need to be able to manage general capacity, availability, ownership, etc. Conversely, a Group (in the market) functions more as a collection of permission and an access controls, very similar to how we handle them:
* [JIRA Groups](https://confluence.atlassian.com/cloud/create-and-update-groups-744721627.html)
* [Planview Groups](https://success.planview.com/Planview_PPM_Pro/150_PPM_Pro_Administrator_Documentation/030_Permissions/040_Groups%2F%2FTeams/005_About_Groups)
* [Azure DevOps Groups](https://docs.microsoft.com/en-us/azure/devops/reference/process-templates/define-groups-teams-permissions-plug-in?view=azure-devops-2019)
## Open Questions
* How does this relate to Members? Would team membership replace direct membership?
* Should inviting a team to a team be possible?
* Should we inform users that they've been added to a team?
* Should we display team membership anywhere outside of the team details page?
* Should we consider creating a Teams API as part of this epic?
## Designs
- [teams_prototype.html](/uploads/51e41c1886161bcb29626a6a1a80a2f7/teams_prototype.html)
epic