Files that are both large and changed often are where bugs tend to cluster and where refactoring pays off first. Each file in the current tree is placed by its size and by the number of commits that changed it; its hotspot score is changes × √lines. Files without counted lines, such as binary files, are left out.
Each dot is a file; a bigger dot is a higher score. The dashed lines mark the median file size and the median number of changes, so the large files that change often are in the top right. Both axes are logarithmic.
The files ranked by hotspot score: the larger a file is and the more often it changes, the higher it ranks. Authors is how many people have changed the file, bots aside, as on the Code Ownership page: a hotspot only one person has changed is also a bus-factor risk.
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| README.md | 485 | 16 | 1 | 352.4 | |
| data/runs/real_run.json | 12,460 | 2 | 1 | 223.2 | |
| src/prismprice/web/index.html | 281 | 13 | 1 | 217.9 | |
| pyproject.toml | 180 | 16 | 1 | 214.7 | |
| docs/architecture.md | 388 | 9 | 1 | 177.3 | |
| src/prismprice/data/synthetic.py | 470 | 6 | 1 | 130.1 | |
| src/prismprice/web/layout.css | 186 | 9 | 1 | 122.7 | |
| src/prismprice/web/responsive.css | 207 | 8 | 1 | 115.1 | |
| src/prismprice/storage/store.py | 464 | 5 | 1 | 107.7 | |
| src/prismprice/web/product-story.js | 451 | 5 | 1 | 106.2 |
| File | Lines | Changes | Authors | Score | |
|---|---|---|---|---|---|
| README.md | 485 | 16 | 1 | 352.4 | |
| data/runs/real_run.json | 12,460 | 2 | 1 | 223.2 | |
| src/prismprice/web/index.html | 281 | 13 | 1 | 217.9 | |
| pyproject.toml | 180 | 16 | 1 | 214.7 | |
| docs/architecture.md | 388 | 9 | 1 | 177.3 | |
| src/prismprice/data/synthetic.py | 470 | 6 | 1 | 130.1 | |
| src/prismprice/web/layout.css | 186 | 9 | 1 | 122.7 | |
| src/prismprice/web/responsive.css | 207 | 8 | 1 | 115.1 | |
| src/prismprice/storage/store.py | 464 | 5 | 1 | 107.7 | |
| src/prismprice/web/product-story.js | 451 | 5 | 1 | 106.2 | |
| src/prismprice/observability/dashboard.py | 676 | 4 | 1 | 104.0 | |
| src/prismprice/config.py | 566 | 4 | 1 | 95.2 | |
| src/prismprice/estimation/elasticity.py | 957 | 3 | 1 | 92.8 | |
| src/prismprice/data/augment.py | 320 | 5 | 1 | 89.4 | |
| src/prismprice/web/demo-data.json | 6,965 | 1 | 1 | 83.5 | |
| tests/test_demand.py | 421 | 4 | 1 | 82.1 | |
| src/prismprice/web/tokens.css | 81 | 9 | 1 | 81.0 | |
| .github/workflows/ci.yml | 98 | 8 | 1 | 79.2 | |
| src/prismprice/estimation/retention.py | 693 | 3 | 1 | 79.0 | |
| data/runs/robust_markdown_benchmark.json | 5,952 | 1 | 1 | 77.1 | |
| src/prismprice/pipeline.py | 336 | 4 | 1 | 73.3 | |
| src/prismprice/estimation/demand.py | 591 | 3 | 1 | 72.9 | |
| src/prismprice/web/workbench.js | 146 | 6 | 1 | 72.5 | |
| tests/test_elasticity.py | 569 | 3 | 1 | 71.6 | |
| src/prismprice/web/components.css | 94 | 7 | 1 | 67.9 | |
| src/prismprice/serving/app.py | 180 | 5 | 1 | 67.1 | |
| .tmp-gsap/package/gsap-core.js | 4,481 | 1 | 1 | 66.9 | |
| tests/test_storage.py | 411 | 3 | 1 | 60.8 | |
| .tmp-gsap/package/src/gsap-core.js | 3,256 | 1 | 1 | 57.1 | |
| src/prismprice/web/vendor/gsap/gsap-core.js | 3,256 | 1 | 1 | 57.1 | |
| .tmp-gsap/package/Draggable.js | 2,712 | 1 | 1 | 52.1 | |
| .tmp-gsap/package/ScrollTrigger.js | 2,703 | 1 | 1 | 52.0 | |
| src/prismprice/features/builder.py | 293 | 3 | 1 | 51.4 | |
| src/prismprice/data/sources.py | 280 | 3 | 1 | 50.2 | |
| tests/test_guardrails.py | 570 | 2 | 1 | 47.7 | |
| src/prismprice/governance/guardrails.py | 567 | 2 | 1 | 47.6 | |
| tests/test_decision.py | 543 | 2 | 1 | 46.6 | |
| src/prismprice/decision/joint_markdown.py | 498 | 2 | 1 | 44.6 | |
| src/prismprice/observability/evaluation.py | 495 | 2 | 1 | 44.5 | |
| .tmp-gsap/package/src/Draggable.js | 1,951 | 1 | 1 | 44.2 | |
| src/prismprice/governance/schemas.py | 481 | 2 | 1 | 43.9 | |
| src/prismprice/web/demo-dataset.js | 209 | 3 | 1 | 43.4 | |
| .tmp-gsap/package/utils/PathEditor.js | 1,824 | 1 | 1 | 42.7 | |
| .tmp-gsap/package/src/ScrollTrigger.js | 1,791 | 1 | 1 | 42.3 | |
| src/prismprice/web/vendor/gsap/ScrollTrigger.js | 1,791 | 1 | 1 | 42.3 | |
| .tmp-gsap/package/utils/paths.js | 1,614 | 1 | 1 | 40.2 | |
| .tmp-gsap/package/CSSPlugin.js | 1,599 | 1 | 1 | 40.0 | |
| .tmp-gsap/package/GSDevTools.js | 1,573 | 1 | 1 | 39.7 | |
| src/prismprice/web/render.js | 175 | 3 | 1 | 39.7 | |
| src/prismprice/compute.py | 392 | 2 | 1 | 39.6 | |
| .tmp-gsap/package/Flip.js | 1,562 | 1 | 1 | 39.5 | |
| src/prismprice/estimation/__init__.py | 61 | 5 | 1 | 39.1 | |
| src/prismprice/decision/objective.py | 341 | 2 | 1 | 36.9 | |
| tests/test_serving.py | 336 | 2 | 1 | 36.7 | |
| tests/test_provenance.py | 334 | 2 | 1 | 36.6 | |
| .tmp-gsap/package/src/utils/PathEditor.js | 1,316 | 1 | 1 | 36.3 | |
| .tmp-gsap/package/src/utils/paths.js | 1,317 | 1 | 1 | 36.3 | |
| tests/test_markdown.py | 317 | 2 | 1 | 35.6 | |
| src/prismprice/decision/engine.py | 301 | 2 | 1 | 34.7 | |
| .tmp-gsap/package/src/GSDevTools.js | 1,181 | 1 | 1 | 34.4 | |
| .tmp-gsap/package/src/CSSPlugin.js | 1,170 | 1 | 1 | 34.2 | |
| src/prismprice/web/vendor/gsap/CSSPlugin.js | 1,170 | 1 | 1 | 34.2 | |
| .tmp-gsap/package/MorphSVGPlugin.js | 1,150 | 1 | 1 | 33.9 | |
| scripts/evaluate_robust_markdown.py | 1,090 | 1 | 1 | 33.0 | |
| src/prismprice/observability/__init__.py | 67 | 4 | 1 | 32.7 | |
| .tmp-gsap/package/src/Flip.js | 1,059 | 1 | 1 | 32.5 | |
| .tmp-gsap/package/ScrollSmoother.js | 1,010 | 1 | 1 | 31.8 | |
| src/prismprice/features/uncensoring.py | 234 | 2 | 1 | 30.6 | |
| src/prismprice/decision/robust_markdown.py | 928 | 1 | 1 | 30.5 | |
| .tmp-gsap/package/types/scroll-trigger.d.ts | 923 | 1 | 1 | 30.4 | |
| src/prismprice/decision/__init__.py | 56 | 4 | 1 | 29.9 | |
| .tmp-gsap/package/src/MorphSVGPlugin.js | 860 | 1 | 1 | 29.3 | |
| tests/test_compute.py | 183 | 2 | 1 | 27.1 | |
| src/prismprice/webapp.py | 81 | 3 | 1 | 27.0 | |
| .tmp-gsap/package/Observer.js | 707 | 1 | 1 | 26.6 | |
| .tmp-gsap/package/types/gsap-core.d.ts | 705 | 1 | 1 | 26.6 | |
| .tmp-gsap/package/src/ScrollSmoother.js | 682 | 1 | 1 | 26.1 | |
| .tmp-gsap/package/types/animation.d.ts | 639 | 1 | 1 | 25.3 | |
| src/prismprice/decision/ladder.py | 159 | 2 | 1 | 25.2 | |
| src/prismprice/data/contracts.py | 616 | 1 | 1 | 24.8 | |
| src/prismprice/serving/service.py | 153 | 2 | 1 | 24.7 | |
| .tmp-gsap/package/types/css-plugin.d.ts | 589 | 1 | 1 | 24.3 | |
| .tmp-gsap/package/types/Flip.d.ts | 551 | 1 | 1 | 23.5 | |
| .tmp-gsap/package/src/SplitText.ts | 518 | 1 | 1 | 22.8 | |
| .tmp-gsap/package/types/timeline.d.ts | 511 | 1 | 1 | 22.6 | |
| .tmp-gsap/package/types/gsap-utils.d.ts | 508 | 1 | 1 | 22.5 | |
| tests/test_robust_markdown.py | 506 | 1 | 1 | 22.5 | |
| .tmp-gsap/package/InertiaPlugin.js | 478 | 1 | 1 | 21.9 | |
| .tmp-gsap/package/PixiPlugin.js | 473 | 1 | 1 | 21.7 | |
| data/runs/dashboard.html | 466 | 1 | 1 | 21.6 | |
| src/prismprice/serving/security.py | 117 | 2 | 1 | 21.6 | |
| src/prismprice/web/app.js | 13 | 6 | 1 | 21.6 | |
| .tmp-gsap/package/types/Draggable.d.ts | 455 | 1 | 1 | 21.3 | |
| .tmp-gsap/package/src/Observer.js | 439 | 1 | 1 | 21.0 | |
| src/prismprice/web/vendor/gsap/Observer.js | 439 | 1 | 1 | 21.0 | |
| .tmp-gsap/package/utils/matrix.js | 434 | 1 | 1 | 20.8 | |
| docs/data-and-modelling.md | 108 | 2 | 1 | 20.8 | |
| docs/metrics.md | 108 | 2 | 1 | 20.8 | |
| .tmp-gsap/package/types/scroll-smoother.d.ts | 408 | 1 | 1 | 20.2 | |
| src/prismprice/estimation/competitor.py | 388 | 1 | 1 | 19.7 |