← 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
84,938
Distinct files touched
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
lib/gitlab/background_migration
714
ee/app/*/gitlab_subscriptions
617
ee/app/*/vulnerabilities
549
ee/app/*/secrets_management
366
ee/app/*/virtual_registries
337
ee/app/graphql/*/security
307
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/merge_request.rb
142
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
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
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.next.lockgenerated
514
doc/api/openapi/openapi_v2.yamlgenerated
395
Gemfile.checksumgenerated
394
Gemfile.next.checksumgenerated
391
doc/api/openapi/openapi_v3.yamlgenerated
387
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
ee/app/policies/ee/group_policy.rb
160
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).