← all reports

GitLab Monolith — Code Churn Report

Repository: gitlab (Rails monolith) · Window: 2025-06-30 to 2026-06-30 (last 12 months) · Generated 2026-06-30 18:03

36,292
Non-merge commits
248,642
File changes
84,938
Distinct files touched
1,384
Distinct authors
Churn = number of commits that touched a file in the window. High churn marks files under constant change — candidates for refactoring, stronger test coverage, or ownership review when combined with complexity. Note that ~12.4% of all file changes land in generated / lockfile / todo-list artifacts (flagged below); these are expected to churn and are usually not actionable.

Churn by feature domain

ee/app/*/ai
2009
ee/app/*/security
1385
app/*/projects
1265
app/*/ci
1075
lib/gitlab/ci
813
ee/app/*/groups
807
ee/app/*/projects
735
lib/gitlab/background_migration
714
ee/app/*/gitlab_subscriptions
617
ee/app/graphql/*/ai
585
lib/gitlab/database
557
ee/app/*/vulnerabilities
549
ee/lib/search
531
ee/app/*/work_items
488
ee/app/*/admin
477
app/*/groups
445
app/*/work_items
394
ee/app/*/secrets_management
366
ee/app/*/search
344
ee/lib/gitlab/llm
338
ee/app/*/virtual_registries
337
app/*/admin
327
ee/app/*/geo
322
app/*/packages
307
ee/app/graphql/*/security
307
ee/lib/ai
299
ee/lib/gitlab/ci
285
app/*/shared
278
lib/tasks
264
app/*/merge_requests
261
lib/banzai
257
app/*/rapid_diffs
254
app/*/layouts
224
ee/app/*/ci
222
app/graphql/*/ci
219
ee/lib/security
217
app/*/json_schemas
209
app/*/import
206
ee/app/*/analytics
206
ee/app/*/merge_requests
204

Top 40 feature domains. Churn is summed across each domain's files. The single * is exactly one wildcard directory (e.g. services, models, types); the optional ee/ layer is folded into the same domain. app/assets is excluded; lib/api, ee/lib/api, ee/lib/gitlab, app/graphql and ee/app/graphql are expanded a level deeper, and */concerns and api/entities a further level.

Hand-written Ruby hotspots

ee/app/policies/ee/project_policy.rb
199
ee/app/policies/ee/group_policy.rb
160
app/models/project.rb
159
app/models/merge_request.rb
142
app/models/user.rb
136
ee/lib/api/ai/duo_workflows/workflows.rb
136
app/policies/project_policy.rb
128
ee/app/graphql/ee/types/mutation_type.rb
128
ee/app/models/ee/project.rb
121
ee/app/services/ai/duo_workflows/start_workflow_service.rb
102
app/models/ci/pipeline.rb
93
app/models/group.rb
90
ee/app/models/ee/application_setting.rb
85
ee/app/models/ee/namespace.rb
84
app/policies/group_policy.rb
81
config/initializers/1_settings.rb
80
app/models/ci/build.rb
79
ee/app/graphql/ee/types/query_type.rb
79
app/models/application_setting.rb
74
ee/app/models/ai/catalog/item.rb
73
ee/app/policies/ee/global_policy.rb
72
ee/app/models/ee/merge_request.rb
69
ee/app/models/ee/user.rb
64
ee/app/models/ee/group.rb
63
lib/gitlab/gon_helper.rb
63
app/models/namespace.rb
62
ee/app/controllers/projects/duo_agents_platform_controller.rb
61
ee/app/helpers/ee/groups/settings_helper.rb
61
ee/app/models/ee/vulnerability.rb
61
ee/app/models/concerns/ai/user_authorizable.rb
60

Top 30 .rb/.rake files excluding specs, QA, and generated files — the real application hotspots worth watching.

Most-changed files (raw)

locale/gitlab.potgenerated
3087
doc/api/graphql/reference/_index.mdgenerated
1259
db/structure.sqlgenerated
1143
GITLAB_KAS_VERSIONgenerated
521
public/-/graphql/introspection_result.jsongenerated
516
Gemfile.lockgenerated
514
Gemfile.next.lockgenerated
514
doc/api/openapi/openapi_v2.yamlgenerated
395
Gemfile.checksumgenerated
394
Gemfile.next.checksumgenerated
391
doc/api/openapi/openapi_v3.yamlgenerated
387
package.json
368
yarn.lockgenerated
355
Gemfile
338
GITALY_SERVER_VERSIONgenerated
278
.rubocop_todo/rspec/feature_category.ymlgenerated
223
.gitlab/ci/rules.gitlab-ci.yml
212
config/sidekiq_queues.ymlgenerated
204
ee/app/workers/all_queues.ymlgenerated
203
ee/app/policies/ee/project_policy.rb
199
app/assets/stylesheets/framework/application-chrome.scss
189
spec/support/rspec_order_todo.ymlgenerated
188
ee/spec/policies/project_policy_spec.rb
180
public/-/graphql/introspection_result_no_deprecated.json
175
.rubocop_todo/rspec/named_subject.ymlgenerated
166
.gitlab/CODEOWNERS
163
ee/app/policies/ee/group_policy.rb
160
app/models/project.rb
159
ee/spec/requests/api/ai/duo_workflows/workflows_spec.rb
156
.rubocop_todo/layout/line_length.ymlgenerated
153

Top 30 of 84,938 files. generated = machine-generated/aggregated artifact, not hand-edited.

Methodology

Computed with git log --no-merges --no-renames --name-only over the 12-month window. Merge commits are excluded so each change is counted once. Rename detection is disabled — the source is a blob:none partial clone, and rename similarity scoring would otherwise force on-demand blob fetches from gitlab.com. With renames off, a renamed file shows as one delete + one add; for churn-hotspot purposes this is immaterial. Feature domains are classified by path: ee/app/*/<domain> (and ee/app/*/ee/<domain>), app/*/<domain>, app/*/concerns/<capability>, app/graphql/*/<domain>, ee/app/*/concerns/<capability>, ee/app/graphql/*/<domain>, lib/gitlab/<capability>, lib/api/<domain>, lib/api/entities/<domain>, lib/<capability>, ee/lib/gitlab/<capability>, ee/lib/api/<domain>, ee/lib/api/entities/<domain>, and ee/lib/<capability> (and the ee/lib/ee/… sibling) — one wildcard directory only, with the ee/ sibling folded into the same group. app/assets and ee/app/assets are ignored. Files outside these prefixes (specs, docs, db, config, generated) — and files sitting directly under an expanded prefix with no <domain> subdirectory (e.g. lib/api/merge_requests.rb) — are excluded from that chart. Generated-file classification is heuristic (locales, db/structure.sql, lockfiles, *_VERSION, GraphQL/OpenAPI references, rubocop/eslint todo lists, queue manifests).