2026-04-27 to 2026-07-14
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 | 171 | 53,549 | 4,161 | 0.08 |
| 2026-05 | 1,019 | 317,080 | 36,069 | 0.11 |
| 2026-06 | 728 | 87,654 | 18,500 | 0.21 |
| 2026-07 | 226 | 28,891 | 8,741 | 0.30 |
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 | 2,138 | 487,167 | 67,464 | |
| dependabot[bot] | 49699333+dependabot[bot]@users.noreply.github.com | 6 | 7 | 7 |
Most frequently changed files. High churn with few devs = knowledge silo. High churn with many devs = shared bottleneck. · docs
| Path | Commits | Churn | Devs | |
|---|---|---|---|---|
| src/harness/loop.ts | 238 | 12,390 | 1 | |
| src/cli/repl.ts | 210 | 8,750 | 1 | |
| src/cli/bootstrap.ts | 137 | 3,755 | 1 | |
| tests/cli/repl.test.ts | 137 | 10,956 | 1 | |
| src/tui/state.ts | 128 | 5,223 | 1 | |
| src/harness/types.ts | 121 | 1,857 | 1 | |
| tests/permissions/engine.test.ts | 98 | 6,086 | 1 | |
| src/permissions/resolvers/bash.ts | 97 | 9,007 | 1 | |
| tests/cli/bootstrap.test.ts | 93 | 3,332 | 1 | |
| tests/tui/state.test.ts | 86 | 4,637 | 1 | |
| src/cli/run.ts | 85 | 1,612 | 1 | |
| tests/permissions/resolvers.test.ts | 85 | 6,916 | 1 | |
| src/permissions/engine.ts | 82 | 5,433 | 1 | |
| src/tui/events.ts | 82 | 1,362 | 1 | |
| src/cli/args.ts | 81 | 3,089 | 1 | |
| src/storage/migrations/index.ts | 81 | 185 | 1 | |
| src/subagents/runtime.ts | 77 | 6,102 | 1 | |
| src/cli/subagent-child.ts | 66 | 2,193 | 1 | |
| src/tools/types.ts | 66 | 982 | 1 | |
| src/tui/render/permanent.ts | 62 | 1,440 | 1 | |
| src/tui/harness-adapter.ts | 58 | 1,776 | 1 | |
| tests/harness/loop.test.ts | 57 | 4,190 | 1 | |
| tests/subagents/runtime.test.ts | 56 | 7,604 | 1 | |
| tests/tui/render/permanent.test.ts | 53 | 2,917 | 1 | |
| src/cli/slash/commands/memory.ts | 50 | 4,639 | 1 | |
| tests/tui/render/footer.test.ts | 49 | 1,953 | 1 | |
| src/storage/index.ts | 48 | 806 | 1 | |
| src/tui/modal-manager.ts | 47 | 1,586 | 1 | |
| tests/tui/harness-adapter.test.ts | 47 | 2,570 | 1 | |
| tests/cli/args.test.ts | 44 | 1,719 | 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 |
|---|---|---|---|---|---|
| src/cli | 989 | 37,788 | 70 | 1 | 1 |
| tests/cli | 738 | 48,414 | 78 | 1 | 1 |
| src/harness | 514 | 22,487 | 27 | 1 | 1 |
| src/permissions | 481 | 25,751 | 40 | 1 | 1 |
| tests/permissions | 465 | 33,780 | 44 | 1 | 1 |
| src/tools/builtin | 395 | 16,510 | 51 | 1 | 1 |
| src/tui | 381 | 13,175 | 14 | 1 | 1 |
| tests/tools | 263 | 14,670 | 46 | 1 | 1 |
| src/subagents | 258 | 17,339 | 20 | 1 | 1 |
| tests/harness | 248 | 18,517 | 40 | 1 | 1 |
| src/tui/render | 239 | 7,046 | 31 | 1 | 1 |
| tests/tui | 229 | 13,868 | 15 | 1 | 1 |
| tests/tui/render | 222 | 10,144 | 26 | 1 | 1 |
| src/memory | 219 | 16,210 | 34 | 1 | 1 |
| src/storage/migrations | 202 | 6,220 | 87 | 1 | 1 |
| src/cli/slash/commands | 198 | 13,127 | 25 | 1 | 1 |
| src/storage/repos | 198 | 14,140 | 47 | 1 | 1 |
| tests/cli/slash | 178 | 12,339 | 15 | 1 | 1 |
| tests/subagents | 177 | 19,156 | 18 | 1 | 1 |
| tests/providers | 171 | 10,066 | 34 | 1 | 1 |
| tests/storage | 160 | 15,308 | 46 | 1 | 1 |
| tests/memory | 141 | 17,153 | 31 | 1 | 1 |
| src/permissions/resolvers | 123 | 9,782 | 6 | 1 | 1 |
| . | 110 | 2,257 | 10 | 2 | 1 |
| src/evals | 97 | 4,400 | 8 | 1 | 1 |
| tests/evals | 88 | 4,690 | 10 | 1 | 1 |
| src/providers | 87 | 2,062 | 15 | 1 | 1 |
| src/cli/init-playbooks | 82 | 2,480 | 13 | 1 | 1 |
| src/tools | 82 | 1,459 | 7 | 1 | 1 |
| scripts | 73 | 5,746 | 18 | 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 | |
|---|---|---|---|---|---|---|---|
| .ts | 1,273 | 541,718 | 362323.2 | 1 | 2026-04-27 | 2026-07-14 | |
| .md | 56 | 6,212 | 4431.3 | 1 | 2026-04-27 | 2026-07-14 | |
| .yaml | 13 | 3,689 | 2291.3 | 1 | 2026-05-10 | 2026-06-28 | |
| .yml | 5 | 845 | 672.8 | 2 | 2026-04-27 | 2026-07-12 | |
| .py | 2 | 783 | 665.9 | 1 | 2026-06-21 | 2026-06-24 | |
| .sh | 1 | 691 | 590.1 | 1 | 2026-05-10 | 2026-07-12 | |
| .json | 4 | 304 | 223.8 | 2 | 2026-04-27 | 2026-07-13 | |
| (none) | 2 | 316 | 223.2 | 1 | 2026-04-27 | 2026-07-11 | |
| .gitignore | 2 | 72 | 50.0 | 1 | 2026-04-27 | 2026-06-28 | |
| .editorconfig | 1 | 15 | 8.2 | 1 | 2026-04-27 | 2026-04-27 | |
| .wasm | 1 | 0 | 0.0 | 0 | 2026-05-11 | 2026-05-11 |
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
| Metric | Files | Churn |
|---|---|---|
| Test | 557 | 271,800 |
| Source | 719 | 271,392 |
| Test : Source ratio | 0.77 | 1.00 |
| Excluded (docs/config/vendor) | 84 |
| Lang | Test Files | Src Files | File Ratio | Test Churn | Src Churn | Churn Ratio | |
|---|---|---|---|---|---|---|---|
| .ts | 557 | 716 | 0.78 | 271,800 | 269,918 | 1.01 | |
| .py | 0 | 2 | 0.00 | 0 | 783 | 0.00 | |
| .sh | 0 | 1 | 0.00 | 0 | 691 | 0.00 |
Is the codebase getting more or less tested? Yearly resolution smooths the low-volume-month noise that makes a monthly ratio spike.
| Year | Test Churn | Src Churn | Churn Ratio | |
|---|---|---|---|---|
| 2026 | 271,800 | 271,392 | 1.00 |
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 | |
|---|---|---|---|---|---|---|---|
| src/harness/loop.ts | 🟡 silo age P92 · trend P0 |
8744.2 | 1 | 77d | → 1.00 | 2026-07-13 | |
| tests/cli/repl.test.ts | 🟡 silo age P76 · trend P0 |
7770.2 | 1 | 72d | → 1.00 | 2026-07-13 | |
| src/cli/repl.ts | 🟡 silo age P76 · trend P0 |
6237.3 | 1 | 72d | → 1.00 | 2026-07-13 | |
| tests/subagents/runtime.test.ts | 🟡 silo age P85 · trend P0 |
4435.8 | 1 | 75d | → 1.00 | 2026-07-11 | |
| tests/permissions/engine.test.ts | 🟡 silo age P92 · trend P0 |
4188.9 | 1 | 77d | → 1.00 | 2026-07-11 | |
| src/permissions/engine.ts | 🟡 silo age P92 · trend P0 |
3704.0 | 1 | 77d | → 1.00 | 2026-07-11 | |
| src/tui/state.ts | 🟡 silo age P76 · trend P0 |
3671.6 | 1 | 72d | → 1.00 | 2026-07-13 | |
| src/subagents/runtime.ts | 🟡 silo age P85 · trend P0 |
3549.0 | 1 | 75d | → 1.00 | 2026-07-11 | |
| tests/tui/state.test.ts | 🟡 silo age P76 · trend P0 |
3074.2 | 1 | 72d | → 1.00 | 2026-07-13 | |
| src/cli/slash/commands/memory.ts | 🟡 silo age P72 · trend P0 |
2983.7 | 1 | 70d | → 1.00 | 2026-07-11 | |
| tests/cli/slash/memory.test.ts | 🟡 silo age P72 · trend P0 |
2943.3 | 1 | 70d | → 1.00 | 2026-06-26 | |
| tests/harness/loop.test.ts | 🟡 silo age P92 · trend P0 |
2672.3 | 1 | 77d | → 1.00 | 2026-07-11 | |
| src/cli/bootstrap.ts | 🟡 silo age P92 · trend P0 |
2627.9 | 1 | 77d | → 1.00 | 2026-07-12 | |
| tests/cli/subagent-child.test.ts | 🟡 silo age P83 · trend P0 |
2322.2 | 1 | 74d | → 1.00 | 2026-07-13 | |
| tests/cli/bootstrap.test.ts | 🟡 silo age P92 · trend P0 |
2296.9 | 1 | 77d | → 1.00 | 2026-07-11 | |
| src/cli/args.ts | 🟡 silo age P92 · trend P0 |
1986.4 | 1 | 77d | → 1.00 | 2026-07-12 | |
| tests/tui/render/permanent.test.ts | 🟡 silo age P76 · trend P0 |
1886.7 | 1 | 72d | → 1.00 | 2026-07-13 | |
| tests/tui/harness-adapter.test.ts | 🟡 silo age P76 · trend P0 |
1644.3 | 1 | 72d | → 1.00 | 2026-07-13 | |
| tests/cli/slash/commands.test.ts | 🟡 silo age P76 · trend P0 |
1558.2 | 1 | 72d | → 1.00 | 2026-06-25 | |
| tests/tui/render/footer.test.ts | 🟡 silo age P76 · trend P0 |
1396.4 | 1 | 72d | → 1.00 | 2026-07-11 | |
| src/cli/subagent-child.ts | 🟡 silo age P83 · trend P0 |
1355.7 | 1 | 74d | → 1.00 | 2026-07-13 | |
| tests/tui/renderer.test.ts | 🟡 silo age P76 · trend P0 |
1329.6 | 1 | 72d | → 1.00 | 2026-07-13 | |
| tests/harness/invoke-tool.test.ts | 🟡 silo age P92 · trend P0 |
1247.8 | 1 | 77d | → 1.00 | 2026-07-13 | |
| src/harness/types.ts | 🟡 silo age P92 · trend P0 |
1192.7 | 1 | 77d | → 1.00 | 2026-07-12 | |
| tests/memory/registry.test.ts | 🟡 silo age P81 · trend P0 |
1185.0 | 1 | 73d | → 1.00 | 2026-05-28 | |
| tests/hooks/dispatcher.test.ts | 🟡 silo age P72 · trend P0 |
1169.6 | 1 | 70d | → 1.00 | 2026-07-11 | |
| src/tui/harness-adapter.ts | 🟡 silo age P76 · trend P0 |
1139.8 | 1 | 72d | → 1.00 | 2026-07-13 | |
| src/memory/registry.ts | 🟡 silo age P81 · trend P0 |
1127.2 | 1 | 73d | → 1.00 | 2026-07-11 | |
| src/bg/manager.ts | 🟡 silo age P88 · trend P0 |
1119.9 | 1 | 76d | → 1.00 | 2026-07-11 | |
| tests/cli/args.test.ts | 🟡 silo age P92 · trend P0 |
1067.2 | 1 | 77d | → 1.00 | 2026-07-02 |
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 |
|---|---|---|
| .editorconfig | 1 | lex0c@proton.me |
| .forja/.gitignore | 1 | lex0c@proton.me |
| .github/dependabot.yml | 1 | lex0c@proton.me |
| .github/workflows/ci.yml | 1 | lex0c@proton.me |
| .github/workflows/eval-regression.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 |
| CLAUDE.md | 1 | lex0c@proton.me |
| LICENSE | 1 | lex0c@proton.me |
| README.md | 1 | lex0c@proton.me |
| SECURITY.md | 1 | lex0c@proton.me |
| biome.json | 1 | lex0c@proton.me |
| install.sh | 1 | lex0c@proton.me |
| npm/launcher/README.md | 1 | lex0c@proton.me |
| npm/launcher/bin/forja | 1 | lex0c@proton.me |
| npm/launcher/package.json | 1 | lex0c@proton.me |
| package.json | 1 | lex0c@proton.me |
| scripts/build-targets.ts | 1 | lex0c@proton.me |
| scripts/check-size.ts | 1 | lex0c@proton.me |
| scripts/checksums.ts | 1 | lex0c@proton.me |
| scripts/model-ranking.ts | 1 | lex0c@proton.me |
| scripts/npm-pack.ts | 1 | lex0c@proton.me |
| scripts/npm-publish.ts | 1 | lex0c@proton.me |
| scripts/plot_benchmark.py | 1 | lex0c@proton.me |
| scripts/plot_ranking.md | 1 | lex0c@proton.me |
| scripts/plot_ranking.py | 1 | lex0c@proton.me |
| scripts/proactive-calibration.ts | 1 | lex0c@proton.me |
| scripts/repro-check.ts | 1 | lex0c@proton.me |
| scripts/sbom.ts | 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 |
|---|---|---|---|
| src/cli/repl.ts | tests/cli/repl.test.ts | 120 | |
| src/harness/loop.ts | src/harness/types.ts | 100 | |
| src/tui/state.ts | tests/tui/state.test.ts | 80 | |
| src/permissions/resolvers/bash.ts | tests/permissions/resolvers.test.ts | 77 | |
| src/tui/events.ts | src/tui/state.ts | 73 | |
| src/permissions/engine.ts | tests/permissions/engine.test.ts | 55 | |
| src/cli/repl.ts | src/tui/state.ts | 55 | |
| src/harness/loop.ts | tests/harness/loop.test.ts | 54 | |
| src/cli/bootstrap.ts | tests/cli/bootstrap.test.ts | 51 | |
| src/tui/events.ts | tests/tui/state.test.ts | 50 | |
| src/tui/render/permanent.ts | tests/tui/render/permanent.test.ts | 49 | |
| src/subagents/runtime.ts | tests/subagents/runtime.test.ts | 49 | |
| src/cli/repl.ts | src/tui/events.ts | 45 | |
| src/cli/args.ts | src/cli/run.ts | 42 | |
| src/cli/args.ts | tests/cli/args.test.ts | 40 | |
| src/tui/harness-adapter.ts | tests/tui/harness-adapter.test.ts | 40 | |
| src/harness/loop.ts | src/tools/types.ts | 40 | |
| src/tui/render/footer.ts | tests/tui/render/footer.test.ts | 37 | |
| src/permissions/resolvers/bash.ts | tests/permissions/engine.test.ts | 36 | |
| src/cli/bootstrap.ts | src/harness/loop.ts | 34 | |
| src/tui/render/permanent.ts | src/tui/state.ts | 33 | |
| src/tui/harness-adapter.ts | src/tui/state.ts | 32 | |
| src/cli/repl.ts | tests/tui/state.test.ts | 32 | |
| src/cli/bootstrap.ts | src/harness/types.ts | 32 | |
| src/cli/repl.ts | src/harness/types.ts | 31 | |
| src/cli/slash/commands/memory.ts | tests/cli/slash/memory.test.ts | 30 | |
| src/harness/loop.ts | src/storage/migrations/index.ts | 30 | |
| src/mcp/manager.ts | tests/mcp/manager.test.ts | 29 | |
| src/tui/modal-manager.ts | src/tui/state.ts | 29 | |
| src/tui/state.ts | tests/tui/render/footer.test.ts | 29 |
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 |
|---|---|---|---|---|---|
| e42627aeca28 | lex0c | 2026-05-07 | 7,847 | 62 | feat(playbooks): full subsystem from frontmatter typing to eval fixtures Clo... |
| 25bd915c21cc | lex0c | 2026-05-31 | 6,510 | 68 | refactor: remove the self-critique subsystem (code-only; spec kept) The oper... |
| 7b0b8159eaa6 | lex0c | 2026-05-14 | 4,673 | 34 | chore(permissions): comment cleanup pass — drop slice refs + spec citations... |
| 1a37af6f1c72 | lex0c | 2026-05-17 | 4,422 | 11 | feat(memory): governance proposal substrate (S8 / Phase 2 opens) Lands the p... |
| 501fe977f055 | lex0c | 2026-05-05 | 3,849 | 22 | feat(subagents): close subsystem with parent↔child IPC Subagents stayed gl... |
| bd8553eefa4c | lex0c | 2026-05-09 | 3,597 | 30 | feat(recap): wire LLM `pr` render with cache, fallback, audit (M4.2 slice a) ... |
| f41bdd9a9aee | lex0c | 2026-07-11 | 3,564 | 374 | tooling: unbreak lint after the Biome 2.5.3 bump Biome 2.5.3 (dependabot) le... |
| 734efa835170 | lex0c | 2026-05-18 | 3,462 | 23 | feat(memory): S13 LLM-judge conflict_detected detector + post-review (P1-P10)... |
| 420868a4ffa7 | lex0c | 2026-05-09 | 3,357 | 29 | feat(recap): add `changelog`, `slack`, `terse` renderers (M4.2 slice b) Thre... |
| 0058059110bd | lex0c | 2026-06-15 | 3,288 | 238 | refactor: rename the agent namespace to forja Consolidates the split where t... |
| 9033b3a2b7f8 | lex0c | 2026-05-17 | 3,160 | 25 | feat(memory): LLM-judge verify_failed detector (S11 / Phase 2) Opt-in detect... |
| 28e01124ede5 | lex0c | 2026-05-09 | 3,061 | 33 | feat(recap): spec compliance + RecapMini + /recap list (M4.2 slices c-quick, ... |
| 2869700f258a | lex0c | 2026-05-10 | 3,054 | 27 | feat(permission-engine): v2 slice 1 — audit hash-chain + protected paths I... |
| 4ef32fa2e349 | lex0c | 2026-04-30 | 2,967 | 10 | feat(subagents): subprocess spawn + IPC plumbing (Step 4.2b.ii.a) Step 4.2b ... |
| 8abc10f33622 | lex0c | 2026-04-28 | 2,960 | 23 | feat(providers): Anthropic + Gemini + OpenAI adapters with extensible registr... |
| 79fa52da25aa | lex0c | 2026-06-28 | 2,797 | 22 | feat(mcp): stdio client machinery — storage, manager, SDK adapter, 'mcp' pe... |
| b2b5ae3750ac | lex0c | 2026-07-06 | 2,763 | 29 | feat(mesh): implement the message-bus model The mesh moves from a paired req... |
| b4acae512fed | lex0c | 2026-05-04 | 2,678 | 14 | feat(hooks): foundation — types, config, dispatcher, audit storage Slice 1... |
| bca56e57fb44 | lex0c | 2026-05-04 | 2,668 | 23 | feat(history): persistent REPL input history with recall + reverse-search Ad... |
| 0dafa959a168 | lex0c | 2026-04-28 | 2,471 | 35 | feat(tools+permissions): tool framework, permission engine, 6 builtin tools ... |
| ac65ccf92763 | lex0c | 2026-04-29 | 2,432 | 23 | feat(bg): bash_background subsystem closes M3/Step 2.1 Adds the three-tool b... |
| 67e9ab13b524 | lex0c | 2026-05-13 | 2,390 | 22 | feat(failure-events): slice 130 — failure_events table + sink + 3 wire site... |
| 81dfa02278b4 | lex0c | 2026-05-31 | 2,157 | 89 | refactor: remove plan mode (the --plan read-only profile; code-only, spec kep... |
| 0ed7f2271443 | lex0c | 2026-05-04 | 2,144 | 20 | feat(memory): wire memory_write modal producer (closes D182) Modal `memory:w... |
| f49e1bbd7dba | lex0c | 2026-05-09 | 2,091 | 16 | feat(recap): headless + cross-session + auto-rehydrate (M4.2 d, M4.3 e1+e2+e3... |
| b51b75cdc99c | lex0c | 2026-05-02 | 2,062 | 18 | feat(memory): read tools + lazy registry with audit (M3 / 5.2.a) Adds the di... |
| 59f562892919 | lex0c | 2026-05-19 | 2,031 | 9 | feat(cli): agent purge — project-scope filesystem reset with audit New top... |
| 89fa81ac9b11 | lex0c | 2026-05-02 | 2,012 | 15 | feat(memory): storage primitives for cross-session memory (M3 / 5.1) Foundat... |
| 3db8838b38e4 | lex0c | 2026-05-13 | 2,010 | 22 | feat(outcome-signals): slice 131 — outcome_signals + aggregator + 4 wire si... |
| 1ba8690a3253 | lex0c | 2026-05-14 | 1,992 | 26 | sec(perm-engine): code-review round on feat/permission-engine (slices 169-178... |
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