Commits
100
Nodes
30
dir edges
49
co_change edges
45
Hub shadows
5
Universal hubs
0
Cross-layer hub correlation
directory_coupling ↔ co_change
r = -0.3962
weak negative hub persistence — layers show partially independent structure
not significant
Hub shadows (5)
Files with a large gap between directory rank (declared) and co-change rank (behavioral).
Lib/profiling/sampling/cli.py
3 commits
dir rank
#27
→
co_change rank
#2
gap
25
Lib/typing.py
2 commits
dir rank
#6
→
co_change rank
#30
gap
24
Lib/functools.py
2 commits
dir rank
#4
→
co_change rank
#27
gap
23
Lib/argparse.py
3 commits
dir rank
#2
→
co_change rank
#24
gap
22
Modules/_testinternalcapi.c
5 commits
dir rank
#22
→
co_change rank
#1
gap
21
Hub ranking (30 nodes)
| # | File | hub score | commits | archetype |
|---|---|---|---|---|
| 1 | optimizer.c | 0.3448 | 3 | |
| 2 | optimizer_bytecodes.c | 0.3103 | 4 | |
| 3 | test_stable_abi_ctypes.py | 0.3103 | 4 | |
| 4 | specialize.c | 0.3103 | 3 | |
| 5 | inspect.py | 0.3103 | 3 | |
| 6 | pdb.py | 0.3103 | 3 | |
| 7 | tarfile.py | 0.3103 | 2 | |
| 8 | binary_io_reader.c | 0.2759 | 4 | |
| 9 | bytecodes.c | 0.2759 | 4 | |
| 10 | _testinternalcapi.c | 0.2414 | 5 | hub_shadow |
| 11 | module.c | 0.2414 | 3 | |
| 12 | argparse.py | 0.2414 | 3 | hub_shadow |
| 13 | pylifecycle.c | 0.2414 | 2 | |
| 14 | difflib.py | 0.2414 | 2 | |
| 15 | test_binary_format.py | 0.2069 | 4 | |
| 16 | test_frame_pointer_unwind.py | 0.2069 | 4 | |
| 17 | cli.py | 0.2069 | 3 | hub_shadow |
| 18 | binary_io_writer.c | 0.2069 | 3 | |
| 19 | functools.py | 0.2069 | 2 | hub_shadow |
| 20 | typing.py | 0.2069 | 2 | hub_shadow |
| 21 | test_robotparser.py | 0.1724 | 4 | |
| 22 | test_opt.py | 0.1724 | 4 | |
| 23 | test_argparse.py | 0.1724 | 3 | |
| 24 | typeobject.c | 0.1379 | 3 | |
| 25 | python3dll.c | 0.1379 | 3 | |
| 26 | test_collectors.py | 0.1379 | 2 | |
| 27 | test_webbrowser.py | 0.1379 | 2 | |
| 28 | threads.c | 0.1034 | 2 | |
| 29 | arraymodule.c | 0.0690 | 3 | |
| 30 | robotparser.py | 0.0345 | 3 |