Evidence ledger
One row per claim in Your singletons choose where you fail: ten years of GitLab's architecture: who published it, what grade it carries, when it was written, when the link was last checked, and the quote or figure it rests on. Nothing in the guide is cited from memory, so anything not in this table is not in the guide.
Topic: how GitLab's architecture changed between 2016 and 2026, read from the company's own design documents, architecture decision records and public incident reviews.
Research date: 2026-09-25. Every row was fetched in this session, through the GitLab REST API
(gitlab.com/api/v4) for file contents and issue bodies, and through the rendered page for the
URLs cited in the guide.
Evidence-base limitation, stated up front. This session's network policy allowed outbound
HTTPS to gitlab.com, github.com and a short list of package hosts, and blocked every
engineering-blog and conference host tried, including about.gitlab.com, handbook.gitlab.com,
docs.gitlab.com and the blogs of every comparable company. The hunt was therefore confined to
material GitLab publishes inside its own repositories. That is unusually rich for one company
(207 design documents, 172 labelled incident reviews) but it means the guide has two blind
spots: GitLab's own narrative blog posts, and any independent or competing account. Both are
named in the page.
| # | Org | Title | Tier | Published | Checked | URL | Claim I take from it | Supporting quote or figure |
|---|---|---|---|---|---|---|---|---|
| 1 | GitLab | Cells (design document) | adr | 2022-09-07, revised through 2026 | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/_index.md | The Cells architecture has been redesigned four times and the current iteration's goal is narrower than the original | "Protocells is the current iteration of the Cells architecture, replacing the earlier Cells 1.0, Cells 1.5, and Cells 2.0 iterations with a new focus on permanently reducing load on the legacy cell's database." |
| 2 | GitLab | Cells (design document) | adr | 2022-09-07 | 2026-09-25 | same as #1 | Organizations are the logical boundary, Cells the physical one | "Organizations serve as logical boundaries and Cells serve as physical boundaries." |
| 3 | GitLab | Cells: Goals | adr | undated page, part of the Cells set | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/goals.md | The binding constraint is named as PostgreSQL and Redis, and partitioning and decomposition are explicitly said not to be enough | "we have estimated (internally) that the current architecture has scalability limitations, particularly for the PostgreSQL database … and Redis non-horizontally scalable resources, even when database partitioning and decomposition are taken into account." |
| 4 | GitLab | Cells: Goals | adr | — | 2026-09-25 | same as #3 | The shared-instance shape produces cross-tenant interference | "A major challenge for shared-infrastructure architectures is a lack of isolation between top-level Groups. This can lead to noisy neighbor effects." |
| 5 | GitLab | Cells ADR 001: Routing Technology using Cloudflare Workers | adr | ADR set opened 2023-12 (epic 11002) | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/decisions/001_routing_technology.md | GitLab chose a third party's edge runtime for the routing layer and recorded the dependency as a known cost | "More vendor locking with Cloudflare, but are already heavily dependent on them." |
| 6 | GitLab | Cells ADR 001 | adr | — | 2026-09-25 | same as #5 | Istio and both stateless-router proposals were considered and rejected | "We considered Istio … but concluded that it's not the right fit. We considered Request Buffering … We considered Routes Learning" |
| 7 | GitLab | Cells ADR 001 | adr | — | 2026-09-25 | same as #5 | The routing layer is expected to stay small enough to rewrite | "We don't expect this to be big risk, since we expect Routing Service to be very small and simple (up to 1000 lines of code)." |
| 8 | GitLab | Proposal: Stateless Router using Requests Buffering (rejected) | adr | rejected | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/rejected/proposal-stateless-router-with-buffering-requests.md | The rejected design's cost was duplicate request execution | "This means that each request might be sent more than once and be processed more than once as result." |
| 9 | GitLab | Proposal: Stateless Router using Routes Learning (rejected) | adr | rejected | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/rejected/proposal-stateless-router-with-routes-learning.md | GitLab deliberately keeps rejected designs published | "This documentation will be kept even if we decide not to implement this so that we can document the reasons for not choosing this approach." |
| 10 | GitLab | Cells ADR 008: Cluster wide unique database sequences | adr | — | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/decisions/008_database_sequences.md | Tenant mobility between cells forced a global identifier scheme, with five alternatives recorded | "All cells will have bigint IDs on creation. While provisioning, each of them will get a range of sequences to use from the Topology Service." |
| 11 | GitLab | Cells ADR 019: AWS Primary Region Selection for Cells Infrastructure | adr | 2025-05-08 | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/decisions/019_aws_primary_region_selection_for_cells.md | The next-generation platform is deliberately cross-cloud | "we are using AWS to provision our first Cells while maintaining critical infrastructure components like the Topology Service in GCP." |
| 12 | GitLab | Cells ADR 015: Cloud Spanner Region Configuration for Topology Service | adr | 2025-05-08 | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/decisions/015_spanner_multiregional.md | The routing control plane is a managed strongly-consistent store, not GitLab's own PostgreSQL | "The Topology Service in the Cells architecture requires a highly available database with strong consistency guarantees." |
| 13 | GitLab | Rails Monolith Decomposition | adr | created 2023-05-22, status still proposed |
2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/modular_monolith/_index.md | The codebase size, and the fact that decomposition has not been accepted in three years | "It has over 2.2 million lines of Ruby code and hundreds of engineers contributing to it every day." |
| 14 | GitLab | Rails Monolith Decomposition | adr | 2023-05-22, revised 2026 | 2026-09-25 | same as #13 | The justification for decomposition has been rewritten around agents rather than scale | "This reframes modularization. It is no longer only about engineering velocity and cognitive load; it is the structural prerequisite for agentic development at scale." |
| 15 | GitLab | Database Scalability: Limit on-disk table size to < 100 GB | adr | 2021-06-23, status accepted |
2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/database_size_limits/_index.md | A measurable ceiling, not a principle, is what drove a decade of database work | "we target a table size less than 100 GB for a physical table on GitLab.com (including its indexes)" and "start action to reduce table sizes when the table is around 10 GB" |
| 16 | GitLab | Database Scalability: Limit on-disk table size | adr | 2021-06-23 | 2026-09-25 | same as #15 | The size of the worst table and its growth rate | "the ci_builds table is 1.5 TB in size as of June 2021 and has 31 indexes associated with it which sum up to 1 TB in size. The overall on-disk size for this table is 2.5 TB. Currently, this grows at 300 GB per month." |
| 17 | GitLab | CI/CD Scaling | adr | 2021-01-21, status ongoing |
2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/ci_scale/_index.md | CI volume and the 2012 data model are the named constraint | "we are creating more than 5 million builds each day on GitLab.com we are reaching database limits that are slowing our development velocity down." |
| 18 | GitLab | CI/CD Scaling | adr | 2021-01-21 | 2026-09-25 | same as #17 | Cumulative build counts and the stated growth target | "On February 1st, 2021, GitLab.com surpassed 1 billion CI/CD builds created. In February 2022 we reached 2 billion of CI/CD build stored in the database." and "Enable future growth by making processing 20M builds in a day possible." |
| 19 | GitLab | Scaling Git | adr | 2026-06-16, status proposed |
2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/scaling-git/_index.md | Git storage is being re-architected onto object storage, ten years after the first move off NFS | "Gitaly stores the authoritative copy of a repository on the serving nodes' filesystem. Compute and storage are thus tightly coupled with one another, which makes it hard to scale either of these dimensions." |
| 20 | GitLab | Siphon | adr | 2024-11-20, status ongoing |
2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/siphon/_index.md | Analytical load was moved off PostgreSQL by CDC rather than by read replicas | "delivers serialized CDC (change data capture) data from the PostgreSQL logical replication stream to a queueing system. From the queueing system, consumers can process the data and ingest it into other database systems (e.g. ClickHouse, Snowflake)." |
| 21 | GitLab | Coordinating changes in Cells | adr | 2024-07-16 | 2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cells/infrastructure/managing_changes.md | Many cells turn deployment into a sequencing problem the existing pipeline cannot express | "Merge requests and pipelines alone cannot enforce those properties; they could be building blocks of our solution, but there is a need for a coordinator engine." |
| 22 | GitLab | Cloudflare Standardization across GitLab | adr | 2025-05-20, status proposed |
2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/cloudflare-standardization/_index.md | The edge dependency is spreading across teams by default rather than by decision | "GitLab's usage of Cloudflare as our preferred edge networking provider continues to grow, with several teams implementing solutions for DNS management, WAF configuration, and worker deployments across our infrastructure estate" |
| 23 | GitLab | Incident Review: Error rates violating SLO (INC-10096 / #22103) | postmortem | 2026-05-12 | 2026-09-25 | https://gitlab.com/gitlab-com/gl-infra/production/-/work_items/22108 | One worker's jobs exhausted the shared Redis and took the platform down | "At its worst, the Sidekiq queue backlog reached over 12 million jobs, causing pipeline creation and job processing to stall." and "Earlier mitigation for a previous incident led to audit event jobs being deferred, which then accumulated and consumed all available memory on the Redis Sidekiq cluster." |
| 24 | GitLab | Incident Review: Redis primary CPU saturation on redis-sidekiq nodes | postmortem | 2026-05-20 (incident 2026-05-19) | 2026-09-25 | https://gitlab.com/gitlab-com/gl-infra/production/-/work_items/22170 | The same worker nearly repeated the outage a week later; Redis's own shape is the ceiling | "Redis memory grew from normal levels to 35 GiB before intervention. Redis's single-threaded architecture limited CPU scaling, compounding the resource bottleneck." |
| 25 | GitLab | Incident review: Slow Gitaly operations on gitlab.com and gitlab-org 500 errors | postmortem | 2026-03-24 | 2026-09-25 | https://gitlab.com/gitlab-com/gl-infra/production/-/work_items/21629 | A single stateful storage node still owns the availability of everything on it | "A single Gitaly storage node (gitaly-cny-01-stor-gprd.c.gitlab-production.internal) experienced a sharp spike in anonymous memory usage, leading to degraded performance. After rebooting the node as mitigation, it failed to mount its data disk" |
| 26 | GitLab | Incident Review: (Gitlab.com is down) INC-6113 | postmortem | 2025-12-05 | 2026-09-25 | https://gitlab.com/gitlab-com/gl-infra/production/-/work_items/20942 | The edge dependency accepted in ADR 001 was measured 22 months later | "Customers Affected: All SaaS users", "Requests Affected: All public API's, ~155 million requests", "Total Duration |
| 27 | GitLab | Incident review for 2022-11-30: GitLab.com site-wide outage | postmortem | 2022-11-30 | 2026-09-25 | https://gitlab.com/gitlab-com/gl-infra/production/-/work_items/8100 | The change path, not the request path, produced the worst full outage in the corpus | "An engineer triggered a routine task using our tools on a local development environment that … resulted in performing a change to production that took down a core component (Consul) of our Postgres HA solution (Patroni)." and "Our CDN reports ~13M requests that resulted in 503 during the outage." |
| 28 | GitLab | Gitaly README | source | continuously updated | 2026-09-25 | https://gitlab.com/gitlab-org/gitaly/-/blob/master/README.md | Gitaly's stated goal, and the completion of the ten-year migration of Git access behind an RPC boundary | "Fault-tolerant horizontal scaling of Git storage in GitLab, and particularly, on GitLab.com." and "All application code accesses Git repositories via Gitaly." |
| 29 | GitLab | Gitaly: Transactions | source | current on master |
2026-09-25 | https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/transactions.md | The transactional storage layer is running on GitLab.com but is not generally available and warns about data loss | "Transactions enabled. Transactions are an experimental feature. The feature is not production ready yet and might lead to various issues including data loss." |
| 30 | GitLab | Gitaly: High Availability (HA) Design | source | long-running design doc | 2026-09-25 | https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/design_ha.md | Praefect's shape: a routing front end plus quorum voting over Gitaly nodes | "Praefect - a transparent front end to all Gitaly shards. This reverse proxy ensures that all gRPC calls are forwarded to the correct shard by consulting the coordinator." |
| 31 | GitLab | Merge request 8895: "Remove raft, wal, transactions" (closed, unmerged) | source | opened 2026-06-10 | 2026-09-25 | https://gitlab.com/gitlab-org/gitaly/-/merge_requests/8895 | A 365-file change deleting the entire transactional storage layer was opened and closed without merging, six days before the object-storage proposal was published | "Removes raft, transactions, wal and associated helpers, CLI tools" ; state closed, merged_at: null, changes_count 365 |
| 32 | GitLab | cells-mailroom/ in the main Rails repository |
source | current on master |
2026-09-25 | https://gitlab.com/gitlab-org/gitlab/-/tree/master/cells-mailroom | Cells is no longer only a design document; cell-specific code sits at the root of the monolith | directory present in the repository tree listing alongside app, ee, workhorse, sidekiq_cluster |
| 33 | Git project | Documentation/technical/reftable | source | current on master |
2026-09-25 | https://github.com/git/git/blob/master/Documentation/technical/reftable.adoc | The upstream Git change GitLab's storage plan depends on, and why ref storage is a scaling problem at all | "Some repositories contain a lot of references (e.g. android at 866k, rails at 31k). The existing packed-refs format takes up a lot of space (e.g. 62M), and does not scale with additional references." |
| 34 | GitLab | Capacity planning (Tamland) | adr | 2023-09-11, status implemented |
2026-09-25 | https://gitlab.com/gitlab-com/content-sites/handbook/-/blob/main/content/handbook/engineering/architecture/design-documents/capacity_planning/_index.md | Saturation forecasting is a named, owned artefact rather than a dashboard habit | "Tamland predicts SLO violations and their respective dates, which need to be reviewed and acted upon." |
| 35 | GitLab | Design document index (207 entries) and incident-review issues (172) | source | live | 2026-09-25 | https://gitlab.com/gitlab-com/gl-infra/production/-/work_items | The size of the public record this guide is built from | x-total: 172 on the incident-review label; 207 entries under content/handbook/engineering/architecture/design-documents |
Tier mix
- postmortem: 5 (rows 23-27)
- adr: 17
- source: 6
- blog: 0 (host blocked)
- paper: 0
- talk: 0
- vendor: 0
Distinct hosts: 2 (gitlab.com, github.com). This is below the breadth this format normally
asks for and the reason is stated in the page: the network policy in this session blocked every
other candidate host, and GitLab's primary record happens to live on one of the two that
remained.
Queries that worked
https://gitlab.com/api/v4/projects/gitlab-com%2Fgl-infra%2Fproduction/issues?labels=incident-review&per_page=50
https://gitlab.com/api/v4/projects/gitlab-com%2Fgl-infra%2Fproduction/issues?search=Incident%20Review&in=title&state=closed&sort=asc
https://gitlab.com/api/v4/projects/gitlab-com%2Fcontent-sites%2Fhandbook/repository/tree?path=content/handbook/engineering/architecture/design-documents&per_page=100
https://gitlab.com/api/v4/projects/gitlab-org%2Fgitaly/merge_requests?state=closed&order_by=updated_at
https://gitlab.com/api/v4/projects/<ns%2Fproject>/repository/files/<url-encoded-path>/raw?ref=main