data report

2026-04-16 to 2026-06-28

Glossary — what do these terms mean?

gitcortex is a repository behavior analyzer, not a code analyzer. These metrics describe what people and processes did in git — who touched what, when, and with whom — not the quality of the source code itself. A file classified as silo or fading-silo reveals a human or process pattern; it is not a judgment on the code (a well-written library maintained by one person will classify as silo regardless of how good it is). Labels point at where to look, not what to conclude.

Bus factor
How many developers would need to leave before critical knowledge is lost. A file with bus factor 1 has a single owner — losing that person means losing the context.
Churn
Total lines added plus lines removed. High churn files are heavily modified — often where bugs accumulate.
Recent churn
Churn weighted so recent changes count more. Default half-life is 90 days — a change loses half its weight every 90 days, so a change from a year ago (≈4 half-lives) is worth ~1/16 of a change today.
Fading-silo
An old file with concentrated ownership whose activity is cooling — a silo whose owner is drifting away. Usually the most urgent refactor target.
Silo
Old, concentrated, and still stable or growing — a knowledge bottleneck. Plan transfer before the owner moves on.
Active-core
Newer code with a single main author. Often fine during early development; revisit if it ages without spreading ownership.
Trend
Ratio of recent churn to older churn for a file. Below 0.5 means activity is declining sharply; around 1 is stable; above 1.5 is growing. The declining case is what flips an old concentrated file from silo to fading-silo.
Age P__ / Trend P__
Percentile suffixes on Churn Risk labels show where this file sits in the repo's own distribution. Age P90 = older than 90% of tracked files; Trend P10 = declining more sharply than 90%. Useful to separate a borderline classification (P76/P24) from a real alarm (P98/P03).
Coupling
How often two files change in the same commit. 100% means every change to the less-active file touches the other too. Expected for test-plus-code pairs; unexpected coupling reveals hidden dependencies.
Pareto concentration
Fraction of items holding 80% of activity. "Extremely concentrated" means ≤10% of files or developers carry 80% of churn — either a critical core or a dangerous bottleneck, depending on context.
Specialization (Herfindahl index)
0 = the developer works across many directories; 1 = all their files are in one directory. Measures where files live on disk, not domain expertise.
Pace
Commits per active day. High pace can mean productive small-PR flow or noisy commit habits; low pace can mean large reviewed patches or part-time contribution. Beware bursts: 100 commits spread across 2 days with silence for the rest of the month shows pace=50, which reads steady but isn't.
Weekend %
Fraction of commits on Saturday or Sunday. The weekday is derived from the author's local timezone as recorded by git, so a commit from Australia at Friday 23:00 UTC counts as Saturday. High values often signal overtime, an internationally distributed team, or off-hours deploy cadence — context tells which.
Repo Structure — architecture at a glance

Directories sorted by total churn within each level; files listed after. Counts reflect history, so deleted files still appear (they shaped the codebase). Tree capped at the top 3 levels; deeper subtrees collapsed to keep the report readable.

. (53 files, 31.5k churn)
Commits
298
Developers
2
Files
53
Additions
26.4k
Deletions
5.1k
Merges
22

Concentration

Pareto distribution across files, developers, and directories. Few items carrying 80% of activity means high concentration. Red and yellow markers deserve a closer look — concentration may signal a critical core module or a knowledge bottleneck, depending on context. · docs

🟢
20 files concentrate 80% of all churn
out of 53 total files — well distributed
🟢
1 devs produce 80% of all commits
out of 2 total devs — well distributed
🟢
1 devs produce 80% of all line churn
out of 2 total devs — well distributed. Compare to the commits card: divergence reveals bots (commits ≫ churn) or feature owners (churn ≫ commits).
🟢
5 directories concentrate 80% of all churn
out of 11 total directories — well distributed

Activity

Monthly commit heatmap. Darker = more commits. Sudden drop-offs may mark team changes, re-orgs, or freezes; steady cadence signals healthy pace. Hover for details; toggle to table for exact numbers. · docs

J
F
M
A
M
J
J
A
S
O
N
D
2026
271
27
Less
More

Top Contributors

Ranked by commit count. High commit count with low lines may indicate small fixes; low count with high lines may indicate large features. · docs

NameEmailCommitsAdditionsDeletions
lex0c lex0c@proton.me 293
26,387 5,045
dependabot[bot] 49699333+dependabot[bot]@users.noreply.github.com 5
13 13

File Hotspots 30 of 53

Most frequently changed files. High churn with few devs = knowledge silo. High churn with many devs = shared bottleneck. · docs

PathCommitsChurnDevs
README.md 61 995
1
cmd/gitcortex/main.go 61 2,151
1
internal/stats/stats.go 58 3,729
1
internal/report/template.go 55 1,070
1
internal/report/report.go 45 2,072
1
internal/stats/stats_test.go 43 3,505
1
docs/METRICS.md 39 643
1
internal/stats/reader.go 32 1,452
1
internal/report/profile_template.go 30 459
1
internal/stats/format.go 25 877
1
internal/report/report_test.go 21 1,687
1
internal/extract/extract.go 17 1,023
1
cmd/gitcortex/main_test.go 15 691
1
docs/RUNBOOK.md 15 521
1
internal/scan/discovery_test.go 12 706
1
internal/report/scan_index.go 11 327
1
internal/scan/discovery.go 11 467
1
internal/stats/extension_test.go 9 915
1
.github/workflows/ci.yml 8 109
2
.github/workflows/pages.yml 8 67
2
internal/stats/suspect_test.go 8 528
1
internal/extract/extract_test.go 7 228
1
internal/git/stream.go 7 442
1
internal/stats/suspect.go 7 328
1
docs/TODO.md 6 124
1
.github/workflows/release.yml 5 66
2
internal/git/catfile.go 5 235
1
internal/git/commands.go 5 1,064
1
.gitignore 4 6
1
docs/PERF.md 4 486
1

Directories

Module-level health. File touches is the sum of per-file commit counts (one commit touching N files contributes N), not distinct commits. Low bus factor = knowledge concentrated in few people. · docs

DirectoryFile TouchesChurnFilesDevsBus Factor
internal/stats 196 12,843 12 1 1
internal/report 172 6,467 8 1 1
cmd/gitcortex 76 2,842 2 1 1
. 72 1,068 5 1 1
docs 66 1,883 5 1 1
internal/scan 34 2,060 6 1 1
internal/git 25 2,720 8 1 1
internal/extract 24 1,251 2 1 1
.github/workflows 21 242 3 2 1
internal/model 3 65 1 1 1
.github 1 17 1 1 1

Extensions

File extensions ranked by recent churn — "where is the team spending effort now", not "what exists at HEAD". Cross-read with Directories: a repo with high .yaml recent churn concentrated in one dir is config-as-code; spread across many dirs is config sprawl. · docs

ExtFilesChurnRecent ChurnDevsFirst SeenLast Seen
.go 39 28,248 17509.5
1 2026-04-16 2026-06-27
.md 6 2,878 1816.2
1 2026-04-16 2026-06-27
.yml 4 259 187.5
2 2026-04-17 2026-06-28
(none) 2 51 29.2
1 2026-04-16 2026-04-17
.mod 1 16 10.0
1 2026-04-16 2026-06-28
.gitignore 1 6 3.4
1 2026-04-16 2026-04-19

Tests test:source churn 0.57

A history-based proxy for test investment — files are classified by path convention (e.g. _test.go, *.spec.ts, tests/), not by measuring coverage. Ratios are test-over-source: docs, config, and vendored/generated files are excluded so the denominator is code a test could plausibly cover. · docs

MetricFilesChurn
Test1710,215
Source2218,033
Test : Source ratio0.770.57
Excluded (docs/config/vendor)14

By language

LangTest FilesSrc FilesFile RatioTest ChurnSrc ChurnChurn Ratio
.go 17 22 0.77 10,215 18,033 0.57

Test ratio over time (by year)

Is the codebase getting more or less tested? Yearly resolution smooths the low-volume-month noise that makes a monthly ratio spike.

YearTest ChurnSrc ChurnChurn Ratio
2026 10,215 18,033 0.57

Churn Risk 30 of 53

Files ranked by recent churn. Label classifies context so you can judge action: fading-silo (old code + concentrated + declining) is the urgent alarm; silo suggests knowledge transfer; active-core is young code with a single author (often fine); active is shared healthy work; cold is quiet. Age P__ / Trend P__ under the label show where this file sits in the repo's distribution: age P90 means older than 90% of tracked files; trend P10 means declining more sharply than 90%. Classification boundaries are the P75 age and P25 trend of this dataset (see docs).

18 silo 19 active-core 16 cold Distribution across the full dataset — the table below shows the top 30 by label priority, then recent churn.
PathLabelRecent ChurnBFAgeTrendLast Change
internal/stats/stats.go 🟡 silo
age P43 · trend P0
2205.8
1 72d → 1.00 2026-06-27
internal/stats/stats_test.go 🟡 silo
age P43 · trend P0
2047.9
1 72d → 1.00 2026-06-27
cmd/gitcortex/main.go 🟡 silo
age P43 · trend P0
1304.6
1 72d → 1.00 2026-06-27
internal/report/report.go 🟡 silo
age P43 · trend P0
1285.4
1 72d → 1.00 2026-06-27
internal/stats/reader.go 🟡 silo
age P43 · trend P0
1002.1
1 72d → 1.00 2026-06-27
internal/report/template.go 🟡 silo
age P43 · trend P0
643.0
1 72d → 1.00 2026-06-26
internal/extract/extract.go 🟡 silo
age P43 · trend P0
611.8
1 72d → 1.00 2026-06-27
internal/git/commands.go 🟡 silo
age P43 · trend P0
608.7
1 72d → 1.00 2026-04-16
README.md 🟡 silo
age P43 · trend P0
599.0
1 72d → 1.00 2026-06-27
internal/stats/format.go 🟡 silo
age P43 · trend P0
554.5
1 72d → 1.00 2026-06-26
docs/METRICS.md 🟡 silo
age P43 · trend P0
387.2
1 72d → 1.00 2026-06-27
docs/RUNBOOK.md 🟡 silo
age P43 · trend P0
298.6
1 72d → 1.00 2026-04-20
internal/report/profile_template.go 🟡 silo
age P43 · trend P0
267.2
1 72d → 1.00 2026-06-26
internal/git/stream.go 🟡 silo
age P43 · trend P0
258.0
1 72d → 1.00 2026-06-26
internal/git/stream_test.go 🟡 silo
age P43 · trend P0
251.2
1 72d → 1.00 2026-06-26
internal/git/parse.go 🟡 silo
age P43 · trend P0
202.5
1 72d → 1.00 2026-04-16
internal/extract/extract_test.go 🟡 silo
age P43 · trend P0
164.8
1 72d → 1.00 2026-06-27
internal/git/catfile.go 🟡 silo
age P43 · trend P0
136.0
1 72d → 1.00 2026-04-19
internal/report/report_test.go active-core
age P41 · trend P0
1016.4
1 71d → 1.00 2026-06-27
internal/stats/tests.go active-core
age P1 · trend P0
605.1
1 1d → 1.00 2026-06-27
internal/stats/extension_test.go active-core
age P28 · trend P0
560.5
1 69d → 1.00 2026-06-27
cmd/gitcortex/main_test.go active-core
age P7 · trend P0
441.4
1 68d → 1.00 2026-06-27
internal/scan/discovery_test.go active-core
age P7 · trend P0
416.8
1 68d → 1.00 2026-04-20
docs/PERF.md active-core
age P28 · trend P0
397.8
1 69d → 1.00 2026-06-27
internal/stats/tests_test.go active-core
age P1 · trend P0
323.7
1 1d → 1.00 2026-06-27
internal/stats/suspect_test.go active-core
age P37 · trend P0
308.3
1 70d → 1.00 2026-04-20
internal/scan/discovery.go active-core
age P7 · trend P0
275.8
1 68d → 1.00 2026-04-20
internal/report/tree.go active-core
age P28 · trend P0
225.4
1 69d → 1.00 2026-04-19
internal/report/tree_test.go active-core
age P28 · trend P0
198.4
1 69d → 1.00 2026-04-19
internal/report/scan_index.go active-core
age P7 · trend P0
193.4
1 68d → 1.00 2026-04-20

Bus Factor Risk 30 of 53

Files with fewest developers owning 80%+ of changes. Bus factor 1 = if that person leaves, nobody else knows the code. · docs

PathBus FactorTop Devs
.github/dependabot.yml 1 lex0c@proton.me
.github/workflows/ci.yml 1 lex0c@proton.me
.github/workflows/pages.yml 1 lex0c@proton.me
.github/workflows/release.yml 1 lex0c@proton.me
.gitignore 1 lex0c@proton.me
LICENSE 1 lex0c@proton.me
Makefile 1 lex0c@proton.me
README.md 1 lex0c@proton.me
cmd/gitcortex/main.go 1 lex0c@proton.me
cmd/gitcortex/main_test.go 1 lex0c@proton.me
docs/DEPLOY.md 1 lex0c@proton.me
docs/METRICS.md 1 lex0c@proton.me
docs/PERF.md 1 lex0c@proton.me
docs/RUNBOOK.md 1 lex0c@proton.me
docs/TODO.md 1 lex0c@proton.me
go.mod 1 lex0c@proton.me
internal/extract/extract.go 1 lex0c@proton.me
internal/extract/extract_test.go 1 lex0c@proton.me
internal/git/catfile.go 1 lex0c@proton.me
internal/git/catfile_test.go 1 lex0c@proton.me
internal/git/commands.go 1 lex0c@proton.me
internal/git/discard.go 1 lex0c@proton.me
internal/git/parse.go 1 lex0c@proton.me
internal/git/parse_test.go 1 lex0c@proton.me
internal/git/stream.go 1 lex0c@proton.me
internal/git/stream_test.go 1 lex0c@proton.me
internal/model/model.go 1 lex0c@proton.me
internal/report/profile_template.go 1 lex0c@proton.me
internal/report/report.go 1 lex0c@proton.me
internal/report/report_test.go 1 lex0c@proton.me

File Coupling

Files that always change together. Expected for test+code pairs. Unexpected coupling between unrelated modules signals hidden dependencies. · docs

File AFile BCo-changesCoupling
internal/report/report.go internal/report/template.go 32
71%
internal/stats/stats.go internal/stats/stats_test.go 26
60%
internal/stats/format.go internal/stats/stats.go 22
88%
cmd/gitcortex/main.go internal/stats/stats.go 20
34%
cmd/gitcortex/main.go internal/report/report.go 19
42%
internal/report/template.go internal/stats/stats.go 19
35%
internal/report/profile_template.go internal/report/template.go 18
60%
internal/report/report.go internal/report/report_test.go 16
76%
README.md docs/METRICS.md 15
38%
cmd/gitcortex/main.go internal/report/template.go 15
27%
README.md docs/RUNBOOK.md 14
93%
internal/report/report_test.go internal/report/template.go 14
67%
docs/METRICS.md internal/stats/stats.go 14
36%
docs/METRICS.md internal/stats/stats_test.go 14
36%
internal/report/report.go internal/stats/stats.go 14
31%
internal/report/template.go internal/stats/format.go 13
52%
cmd/gitcortex/main.go internal/stats/format.go 12
48%
cmd/gitcortex/main.go cmd/gitcortex/main_test.go 11
73%
internal/stats/reader.go internal/stats/stats.go 11
34%
internal/scan/discovery.go internal/scan/discovery_test.go 10
91%
cmd/gitcortex/main.go internal/extract/extract.go 10
59%
cmd/gitcortex/main.go internal/stats/reader.go 10
31%
internal/report/template.go internal/stats/stats_test.go 10
23%
internal/stats/format.go internal/stats/stats_test.go 9
36%
internal/stats/reader.go internal/stats/stats_test.go 9
28%
README.md cmd/gitcortex/main.go 9
15%
internal/stats/extension_test.go internal/stats/stats.go 8
89%
internal/report/profile_template.go internal/stats/format.go 8
32%
internal/report/profile_template.go internal/report/report.go 8
27%
docs/METRICS.md internal/report/template.go 8
21%

Working Patterns

Commit distribution by day and hour. Reveals team timezones, work-life balance, and off-hours work patterns. · docs

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Mon
5
2
7
4
2
5
3
8
3
2
Tue
1
1
4
7
1
Wed
Thu
5
4
10
1
5
9
15
10
11
14
12
11
Fri
3
1
1
1
1
11
5
Sat
1
7
6
6
6
12
5
8
4
5
Sun
4
5
5
7
6
2
1
3
7
3
4
6

Top Commits 30 of 298

Largest commits by lines changed. Unusually large commits may be imports, generated code, or risky big-bang changes worth reviewing. · docs

SHAAuthorDateLinesFilesMessage
369e78b51ed0 lex0c 2026-04-20 1,545 13 Add scan command for multi-repo discovery and consolidated reporting Walks o...
542f47ed92c0 lex0c 2026-04-16 1,400 6 Rewrite extraction to streaming pipeline: 2 git processes instead of 4N Repl...
20c0f0e600ed lex0c 2026-04-16 1,381 8 Initial project structure: CLI for git metrics extraction Restructured monol...
3f8c7696fbb1 lex0c 2026-06-26 1,053 10 Add test-stats: history-based test-to-source ratio New `--stat tests` (plus ...
54d43df8a191 lex0c 2026-04-17 898 8 Add timezone normalization, rename tracking, and churn-risk labels Three cro...
53ce88f9fe7d lex0c 2026-06-27 770 11 perf: opt-in blob sizes, single-parse load, parallel stats/report Three inde...
303fdb523ad6 lex0c 2026-04-16 763 3 Rewrite stats to streaming aggregation: 6x memory reduction Replace raw reco...
84dd74ac76e4 lex0c 2026-04-16 737 4 Add test suite: 43 tests covering parsing, stats, and state management Tests...
4a19388afdad lex0c 2026-04-16 712 3 Add churn-risk, working-patterns, dev-network stats and diff subcommand New ...
13af042987ad lex0c 2026-04-16 684 4 Add stats subcommand with summary, contributors, hotspots, activity, and bus ...
a945050d5361 lex0c 2026-04-19 583 3 Remove executive summary section from HTML report The at-a-glance section wa...
a0a6251af16c lex0c 2026-04-20 482 4 Add --report-dir for per-repo HTML reports plus an index landing page The ol...
09f25dca8699 lex0c 2026-04-19 432 5 Add repo structure tree to CLI and HTML report Architecture-view section bui...
11aa502f8679 lex0c 2026-04-19 412 4 Add executive summary and glossary to HTML reports Summary renders triage bu...
17b33dfbc7b3 lex0c 2026-04-16 394 1 Add operational runbook with recipes, troubleshooting, and schema reference ...
6ae4afd182a7 lex0c 2026-04-16 379 4 Add report subcommand: self-contained HTML dashboard Generates a single HTML...
5143f4d487ce lex0c 2026-04-19 371 9 Add extensions stat: file extensions ranked by recent churn Historical lens ...
f111e731f133 lex0c 2026-04-20 367 4 Attribute extension churn per era, not by canonical path ds.files is keyed b...
0150a71aaea7 lex0c 2026-04-19 359 6 Cap DevProfiles and ChurnRisk memory to unblock Linux-scale reports Two hot ...
ccf2b14837dd lex0c 2026-04-18 323 4 Calibrate churn-risk thresholds per dataset and surface percentiles Classifi...
71668f8fc45b lex0c 2026-04-19 301 5 Address repo-structure review findings - Honest comment on the leaf Commits ...
b6e80be54de9 lex0c 2026-04-17 273 4 Align HTML report hints, activity toggle, and add smoke tests Rewrite hints ...
0bfb45fb9d34 lex0c 2026-04-18 270 3 Warn when likely vendor/generated paths dominate churn High-confidence path ...
a6224f925180 lex0c 2026-04-20 270 6 Add extension footprint to developer profiles DevProfile now surfaces the to...
213d4b9dbd7b lex0c 2026-04-18 263 5 Add developer specialization index to DevProfile DevProfile.Specialization i...
591a50a5484f lex0c 2026-06-26 259 4 Harden ingest: unicode paths, windowed-date filter, ingest perf Four changes...
3efc9f7134ca lex0c 2026-04-19 256 4 Humanize HTML report counts and comma-separate table cells Summary cards and...
4957e872532b lex0c 2026-04-16 251 7 Remove score and ranking stat entirely Score was an arbitrary composite metr...
6e3f0474c82f lex0c 2026-04-21 250 4 Add per-dev top commits to dev profile Mirrors dataset-level TopCommits per ...
99d8c454bd96 lex0c 2026-06-27 235 3 Fix test-stats: per-era role for cross-boundary renames ComputeTestSummary/T...

Developer Profiles

Per-developer view. Use to spot silos (narrow scope + few collaborators), knowledge concentration (high pace on few directories), and cultural patterns (weekend or refactor-heavy work). · docs

lex0c <lex0c@proton.me>
2026-04-16 to 2026-06-28 · 10 active days · 293 commits
Scope internal/stats (23%), internal/git (15%), internal/report (15%), internal/scan (11%), . (9%) (+6 more) Extensions .go (74%), .md (11%), .yml (8%), (none) (4%), .mod (2%) (+1 more) Tests 36% of code churn (test:source 0.57 · 10,215 test / 18,033 src) Specialization 0.134 (broad generalist) Contribution growth (ratio 0.19 · +26,387 −5,045) Pace 29.3 commits/active day Collaboration 49699333+dependabot[bot]@users.noreply.github.com (3 files, 26 lines) Weekend 36.9%
Top files:
internal/stats/stats.go 58 commits 3,729 churn
internal/stats/stats_test.go 43 commits 3,505 churn
cmd/gitcortex/main.go 61 commits 2,151 churn
internal/report/report.go 45 commits 2,072 churn
internal/report/report_test.go 21 commits 1,687 churn
internal/stats/reader.go 32 commits 1,452 churn
internal/report/template.go 55 commits 1,070 churn
internal/git/commands.go 5 commits 1,064 churn
internal/extract/extract.go 17 commits 1,023 churn
README.md 61 commits 995 churn
+43 more files not shown
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 to 2026-06-28 · 1 active days · 5 commits
Scope .github/workflows (100%) Extensions .yml (100%) Specialization 1.000 (narrow specialist) Contribution refactor (ratio 1.00 · +13 −13) Pace 5.0 commits/active day Collaboration lex0c@proton.me (3 files, 26 lines) Weekend 100.0%
Top files:
.github/workflows/ci.yml 2 commits 12 churn
.github/workflows/pages.yml 4 commits 8 churn
.github/workflows/release.yml 3 commits 6 churn