data report

2026-04-16 to 2026-04-23

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.

. (49 files, 28.3k churn)
Commits
271
Developers
1
Files
49
Additions
23.7k
Deletions
4.6k
Merges
13

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

🟢
18 files concentrate 80% of all churn
out of 49 total files — well distributed
🟢
1 devs produce 80% of all commits
out of 1 total devs — well distributed
🟢
1 devs produce 80% of all line churn
out of 1 total devs — well distributed. Compare to the commits card: divergence reveals bots (commits ≫ churn) or feature owners (churn ≫ commits).
🟢
6 directories concentrate 80% of all churn
out of 10 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
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 271
23,708 4,630

File Hotspots 30 of 49

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

PathCommitsChurnDevs
cmd/gitcortex/main.go 59 2,013
1
README.md 57 940
1
internal/report/template.go 54 1,015
1
internal/stats/stats.go 54 3,608
1
internal/report/report.go 42 1,874
1
internal/stats/stats_test.go 42 3,471
1
docs/METRICS.md 36 608
1
internal/report/profile_template.go 29 456
1
internal/stats/reader.go 27 1,059
1
internal/stats/format.go 24 759
1
internal/report/report_test.go 19 1,614
1
docs/RUNBOOK.md 15 521
1
internal/extract/extract.go 15 962
1
cmd/gitcortex/main_test.go 14 610
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 8 859
1
internal/stats/suspect_test.go 8 528
1
internal/stats/suspect.go 7 328
1
docs/TODO.md 6 124
1
internal/git/stream.go 6 430
1
.github/workflows/ci.yml 5 71
1
internal/extract/extract_test.go 5 148
1
internal/git/catfile.go 5 235
1
internal/git/commands.go 5 1,064
1
.gitignore 4 6
1
internal/report/tree.go 4 384
1
internal/scan/ignore.go 4 261
1
.github/workflows/pages.yml 3 57
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 174 11,017 9 1 1
internal/report 165 6,138 8 1 1
cmd/gitcortex 73 2,623 2 1 1
. 67 1,011 5 1 1
docs 61 1,574 5 1 1
internal/scan 34 2,060 6 1 1
internal/git 23 2,584 8 1 1
internal/extract 20 1,110 2 1 1
.github/workflows 9 169 3 1 1
internal/model 1 52 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 36 25,584 24584.0
1 2026-04-16 2026-04-21
.md 6 2,514 2404.2
1 2026-04-16 2026-04-23
.yml 3 169 161.4
1 2026-04-17 2026-04-21
(none) 2 51 48.4
1 2026-04-16 2026-04-17
.mod 1 14 13.3
1 2026-04-16 2026-04-17
.gitignore 1 6 5.7
1 2026-04-16 2026-04-19

Churn Risk 30 of 49

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).

13 silo 20 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 P59 · trend P0
3449.9
1 7d → 1.00 2026-04-21
internal/stats/stats_test.go 🟡 silo
age P59 · trend P0
3331.7
1 7d → 1.00 2026-04-21
cmd/gitcortex/main.go 🟡 silo
age P59 · trend P0
1931.2
1 7d → 1.00 2026-04-21
internal/stats/reader.go 🟡 silo
age P59 · trend P0
1010.2
1 7d → 1.00 2026-04-20
internal/git/commands.go 🟡 silo
age P59 · trend P0
1006.9
1 7d → 1.00 2026-04-16
internal/extract/extract.go 🟡 silo
age P59 · trend P0
911.3
1 7d → 1.00 2026-04-20
README.md 🟡 silo
age P59 · trend P0
900.3
1 7d → 1.00 2026-04-23
internal/stats/format.go 🟡 silo
age P59 · trend P0
723.8
1 7d → 1.00 2026-04-21
docs/RUNBOOK.md 🟡 silo
age P59 · trend P0
494.0
1 7d → 1.00 2026-04-20
internal/git/stream.go 🟡 silo
age P59 · trend P0
407.1
1 7d → 1.00 2026-04-16
internal/git/parse.go 🟡 silo
age P59 · trend P0
335.0
1 7d → 1.00 2026-04-16
internal/git/catfile.go 🟡 silo
age P59 · trend P0
225.0
1 7d → 1.00 2026-04-19
internal/git/stream_test.go 🟡 silo
age P59 · trend P0
212.2
1 7d → 1.00 2026-04-16
internal/report/report.go active-core
age P36 · trend P0
1799.9
1 6d → 1.00 2026-04-21
internal/report/report_test.go active-core
age P36 · trend P0
1560.9
1 6d → 1.00 2026-04-21
internal/report/template.go active-core
age P36 · trend P0
973.6
1 6d → 1.00 2026-04-21
internal/stats/extension_test.go active-core
age P4 · trend P0
834.9
1 3d → 1.00 2026-04-20
internal/scan/discovery_test.go active-core
age P4 · trend P0
689.5
1 3d → 1.00 2026-04-20
cmd/gitcortex/main_test.go active-core
age P4 · trend P0
596.5
1 3d → 1.00 2026-04-21
docs/METRICS.md active-core
age P36 · trend P0
583.1
1 6d → 1.00 2026-04-21
internal/stats/suspect_test.go active-core
age P32 · trend P0
510.0
1 4d → 1.00 2026-04-20
internal/scan/discovery.go active-core
age P4 · trend P0
456.2
1 3d → 1.00 2026-04-20
internal/report/profile_template.go active-core
age P36 · trend P0
437.1
1 6d → 1.00 2026-04-21
internal/report/tree.go active-core
age P4 · trend P0
372.9
1 3d → 1.00 2026-04-19
internal/report/tree_test.go active-core
age P4 · trend P0
328.2
1 3d → 1.00 2026-04-19
internal/report/scan_index.go active-core
age P0 · trend P0
319.9
1 2d → 1.00 2026-04-20
internal/stats/suspect.go active-core
age P32 · trend P0
316.6
1 4d → 1.00 2026-04-20
internal/scan/scan.go active-core
age P4 · trend P0
302.6
1 3d → 1.00 2026-04-20
internal/scan/ignore.go active-core
age P4 · trend P0
254.8
1 3d → 1.00 2026-04-20
internal/stats/repo_breakdown.go active-core
age P4 · trend P0
222.5
1 3d → 1.00 2026-04-20

Bus Factor Risk 30 of 49

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/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
internal/report/scan_index.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 31
74%
internal/stats/stats.go internal/stats/stats_test.go 25
60%
internal/stats/format.go internal/stats/stats.go 21
88%
cmd/gitcortex/main.go internal/stats/stats.go 19
35%
internal/report/template.go internal/stats/stats.go 18
33%
internal/report/profile_template.go internal/report/template.go 17
59%
cmd/gitcortex/main.go internal/report/report.go 17
40%
README.md docs/RUNBOOK.md 14
93%
internal/report/report.go internal/report/report_test.go 14
74%
internal/report/report_test.go internal/report/template.go 14
74%
docs/METRICS.md internal/stats/stats_test.go 14
39%
cmd/gitcortex/main.go internal/report/template.go 14
26%
README.md docs/METRICS.md 13
36%
internal/report/template.go internal/stats/format.go 12
50%
docs/METRICS.md internal/stats/stats.go 12
33%
internal/report/report.go internal/stats/stats.go 12
29%
cmd/gitcortex/main.go internal/stats/format.go 11
46%
internal/scan/discovery.go internal/scan/discovery_test.go 10
91%
cmd/gitcortex/main.go cmd/gitcortex/main_test.go 10
71%
internal/stats/reader.go internal/stats/stats.go 10
37%
internal/report/template.go internal/stats/stats_test.go 10
24%
cmd/gitcortex/main.go internal/extract/extract.go 9
60%
internal/stats/format.go internal/stats/stats_test.go 9
38%
cmd/gitcortex/main.go internal/stats/reader.go 9
33%
internal/stats/reader.go internal/stats/stats_test.go 9
33%
internal/stats/suspect.go internal/stats/suspect_test.go 7
100%
internal/stats/extension_test.go internal/stats/stats.go 7
88%
internal/report/profile_template.go internal/stats/format.go 7
29%
docs/METRICS.md internal/stats/reader.go 7
26%
internal/report/profile_template.go internal/report/report.go 7
24%

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
10
5
Sat
6
1
5
5
10
5
8
4
Sun
5
7
6
2
1
3
7
3
4
6

Top Commits 30 of 271

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...
54d43df8a191 lex0c 2026-04-17 898 8 Add timezone normalization, rename tracking, and churn-risk labels Three cro...
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...
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 ...
c6dc96c0d1ea lex0c 2026-04-16 229 3 Add developer profile stat with per-dev report Shows for each developer (or ...
fefced53834a lex0c 2026-04-20 225 5 Fix report-dir pending accounting, downgrade render errors, reserve index slu...
f1f65be6a24a lex0c 2026-04-20 222 6 Fix DevProfile Pct sums and surface hidden-bucket counts Two related changes...
8658c89778fb lex0c 2026-04-17 213 4 Fix enterprise compliance issues: nil deref, global maps, coverage 1. Fix ni...

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-04-23 · 7 active days · 271 commits
Scope internal/stats (18%), internal/git (16%), internal/report (16%), internal/scan (12%), . (10%) (+5 more) Extensions .go (74%), .md (12%), .yml (6%), (none) (4%), .mod (2%) (+1 more) Specialization 0.130 (broad generalist) Contribution growth (ratio 0.20 · +23,708 −4,630) Pace 38.7 commits/active day Collaboration solo contributor Weekend 32.5%
Top files:
internal/stats/stats.go 54 commits 3,608 churn
internal/stats/stats_test.go 42 commits 3,471 churn
cmd/gitcortex/main.go 59 commits 2,013 churn
internal/report/report.go 42 commits 1,874 churn
internal/report/report_test.go 19 commits 1,614 churn
internal/git/commands.go 5 commits 1,064 churn
internal/stats/reader.go 27 commits 1,059 churn
internal/report/template.go 54 commits 1,015 churn
internal/extract/extract.go 15 commits 962 churn
README.md 57 commits 940 churn
+39 more files not shown