2026-04-16 to 2026-04-23
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.
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.
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
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
| Period | Commits | Additions | Deletions | Del/Add |
|---|---|---|---|---|
| 2026-04 | 271 | 23,708 | 4,630 | 0.20 |
Ranked by commit count. High commit count with low lines may indicate small fixes; low count with high lines may indicate large features. · docs
| Name | Commits | Additions | Deletions | ||
|---|---|---|---|---|---|
| lex0c | lex0c@proton.me | 271 | 23,708 | 4,630 |
Most frequently changed files. High churn with few devs = knowledge silo. High churn with many devs = shared bottleneck. · docs
| Path | Commits | Churn | Devs | |
|---|---|---|---|---|
| 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 |
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
| Directory | File Touches | Churn | Files | Devs | Bus 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 |
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
| Ext | Files | Churn | Recent Churn | Devs | First Seen | Last 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 |
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).
| Path | Label | Recent Churn | BF | Age | Trend | Last 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 |
Files with fewest developers owning 80%+ of changes. Bus factor 1 = if that person leaves, nobody else knows the code. · docs
| Path | Bus Factor | Top 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 |
Files that always change together. Expected for test+code pairs. Unexpected coupling between unrelated modules signals hidden dependencies. · docs
| File A | File B | Co-changes | Coupling |
|---|---|---|---|
| internal/report/report.go | internal/report/template.go | 31 | |
| internal/stats/stats.go | internal/stats/stats_test.go | 25 | |
| internal/stats/format.go | internal/stats/stats.go | 21 | |
| cmd/gitcortex/main.go | internal/stats/stats.go | 19 | |
| internal/report/template.go | internal/stats/stats.go | 18 | |
| internal/report/profile_template.go | internal/report/template.go | 17 | |
| cmd/gitcortex/main.go | internal/report/report.go | 17 | |
| README.md | docs/RUNBOOK.md | 14 | |
| internal/report/report.go | internal/report/report_test.go | 14 | |
| internal/report/report_test.go | internal/report/template.go | 14 | |
| docs/METRICS.md | internal/stats/stats_test.go | 14 | |
| cmd/gitcortex/main.go | internal/report/template.go | 14 | |
| README.md | docs/METRICS.md | 13 | |
| internal/report/template.go | internal/stats/format.go | 12 | |
| docs/METRICS.md | internal/stats/stats.go | 12 | |
| internal/report/report.go | internal/stats/stats.go | 12 | |
| cmd/gitcortex/main.go | internal/stats/format.go | 11 | |
| internal/scan/discovery.go | internal/scan/discovery_test.go | 10 | |
| cmd/gitcortex/main.go | cmd/gitcortex/main_test.go | 10 | |
| internal/stats/reader.go | internal/stats/stats.go | 10 | |
| internal/report/template.go | internal/stats/stats_test.go | 10 | |
| cmd/gitcortex/main.go | internal/extract/extract.go | 9 | |
| internal/stats/format.go | internal/stats/stats_test.go | 9 | |
| cmd/gitcortex/main.go | internal/stats/reader.go | 9 | |
| internal/stats/reader.go | internal/stats/stats_test.go | 9 | |
| internal/stats/suspect.go | internal/stats/suspect_test.go | 7 | |
| internal/stats/extension_test.go | internal/stats/stats.go | 7 | |
| internal/report/profile_template.go | internal/stats/format.go | 7 | |
| docs/METRICS.md | internal/stats/reader.go | 7 | |
| internal/report/profile_template.go | internal/report/report.go | 7 |
Commit distribution by day and hour. Reveals team timezones, work-life balance, and off-hours work patterns. · docs
Largest commits by lines changed. Unusually large commits may be imports, generated code, or risky big-bang changes worth reviewing. · docs
| SHA | Author | Date | Lines | Files | Message |
|---|---|---|---|---|---|
| 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... |
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