New Features in git11

git11 is an AI workspace for engineering teams. It understands repositories, auto-generates documentation, answers deep code questions, and works securely across your GitHub organization.

✦ AI Documentation for any repository

✦ Ask anything about your codebase

✦ Organization & team access with permissions

✦ Secure GitHub App integration with audit logs

git11 repository intelligence dashboard

How to evaluate code quality without reading every line

An AI-generated technical analysis

By git11 AI · Sun Feb 15 2026 · 7 min read

{ "title": "Entropy, Churn, and Cognitive Load: A Quantitative Framework for Codebase Assessment", "subtitle": "Moving beyond manual line-by-line review toward a heuristic-driven analysis of repository health and architectural stability.", "content": "## The Bottleneck of Manual Review\n\nWhen developers inherit a legacy codebase or evaluate an open-source library for production use, the instinctive reaction is to start reading the source code from the entry point. However, in modern microservices or large-scale monorepos, this approach scales linearly while complexity scales exponentially. A codebase of 100,000 lines of code (LOC) cannot be effectively audited via manual inspection within a reasonable timeframe.\n\nTo assess software health efficiently, we must shift from a qualitative, line-by-line reading strategy to a quantitative, heuristic-driven analysis. This involves identifying the structural patterns, temporal artifacts, and complexity metrics that serve as leading indicators for technical debt and maintainability risks.\n\n## 1. Temporal Analysis: Churn vs. Complexity\n\nThe most valuable data about a codebase often resides not in the current state of the files, but in their history. By intersecting file change frequency (churn) with cyclomatic complexity, we can identify \"Hotspots.\"\n\n### The Churn-Complexity Matrix\n\n- High Churn, High Complexity: These are high-interest technical debt components. They are modified frequently and are difficult to understand, leading to a high probability of regression.\n- Low Churn, High Complexity: Potential \"dead\" or stable code. It may be poorly written, but if it is rarely touched, the ROI of refactoring is low.\n- High Churn, Low Complexity: Frequently updated configuration or boilerplate. Potentially an indicator of a lack of abstraction.\n\nTo calculate this via the command line, one can use git log to count revisions per file:\n\n``bash\ngit log --format=format: --name-only | egrep -v '^

#39; | sort | uniq -c | sort -rg | head -20\n`\n\nWhen this list is cross-referenced with a cyclomatic complexity tool (like radon for Python or gocyclo for Go), the overlap reveals exactly where the architectural fragile points lie without reading a single line of logic.\n\n## 2. Structural Entropy and the 'God Object' Detection\n\nCode quality can be viewed through the lens of entropy—the tendency of a system to move toward disorder. A primary indicator of architectural decay is the emergence of files that violate the Single Responsibility Principle (SRP).\n\n### The Distribution of File Sizes\nIn a healthy codebase, file lengths usually follow a power-law distribution. Most files should be small (under 200 lines), with a few larger orchestrators. If the median file size is high (>500 lines) or if there are significant outliers (single files exceeding 3,000 lines), it indicates \"God Objects.\"\n\nThese large files often become synchronization bottlenecks in Git, leading to frequent merge conflicts. More importantly, they increase the cognitive load required to maintain state in a developer's mental model during debugging.\n\n## 3. Measuring Cognitive Load via Nesting Depth\n\nCyclomatic complexity (the number of linearly independent paths through a program's source code) is a standard metric, but it fails to account for how humans process information. A function with ten if statements in a row is easier to parse than a function with five deeply nested if statements.\n\nCognitive Complexity, as defined by SonarSource, provides a better heuristic. It penalizes nesting levels significantly. \n\nConsider this comparison:\n\nCase A (Sequential):\n`javascript\nfunction process(data) {\n if (!data) return;\n if (data.invalid) return;\n if (data.expired) return;\n // logic\n}\n`\n\nCase B (Nested):\n`javascript\nfunction process(data) {\n if (data) {\n if (!data.invalid) {\n if (!data.expired) {\n // logic\n }\n }\n }\n}\n`\n\nWhile Case A and Case B may have the same cyclomatic complexity in some engines, Case B is objectively harder to maintain. Rapidly scanning a codebase for deep indentation levels (e.g., code that is consistently indented > 4 levels) is a fast way to find areas where logic has likely become spaghetti.\n\n## 4. Dependency Graph Topology\n\nA codebase’s health is often determined by what it consumes. Analyzing the import or require graph reveals the degree of coupling.\n\n### Circular Dependencies\nCircular dependencies are a primary characteristic of a \"big ball of mud.\" They prevent the isolation of modules for testing and deployment. Tools like dependency-cruiser can visualize these relationships. A healthy project should resemble a Directed Acyclic Graph (DAG).\n\n### Fan-in vs. Fan-out\n- Fan-in: The number of modules that depend on a specific module. High fan-in for a core utility is good.\n- Fan-out: The number of modules a specific module depends on. High fan-out in the middle of an architecture suggests a component that knows too much about the rest of the system.\n\n## 5. The Documentation-to-Code Ratio\n\nWhile \"self-documenting code\" is a common ideal, the reality is that complex business logic requires context that code alone cannot provide. A rapid metric is the comment-to-code ratio. \n\nHowever, a more nuanced approach is to check for the freshness of documentation. If the source code has been updated 50 times in the last six months but the accompanying README.md or internal docs haven't changed in two years, the documentation has likely become a liability rather than an asset. \n\nModern tools, including git11, automate this correlation by analyzing how documentation evolves alongside the codebase, identifying where the \"knowledge gap\" is widening. By using LLMs to map code changes to descriptive intent, it becomes possible to identify when the implementation has diverged from the documented architecture.\n\n## 6. Identifying \"Dead Code\" and Ghost Features\n\nCode that is never executed adds to the maintenance burden without providing value. Detecting dead code is difficult via static analysis in dynamic languages like Ruby or Python, but in compiled languages, we can look for unreferenced symbols.\n\nOn a broader level, we look for \"Ghost Features\": entire modules or subdirectories that have not been modified or imported by new features in over 12 months. Pruning these is often the fastest way to improve a team's velocity, as it reduces the search space for global grep operations and simplifies the dependency tree.\n\n## 7. Automated Reasoning and LLM Heuristics\n\nThe most recent development in rapid assessment is the use of Large Language Models (LLMs) to perform \"semantic compression.\" Instead of reading 1,000 lines, a developer can use an LLM-based tool to generate an architectural summary.\n\nWhen evaluating a codebase with AI, the goal shouldn't be to ask “Is this good code?” (which is subjective). Instead, ask for specific structural patterns:\n- \"Summarize the state management pattern used here. Is it consistent?\"\n- \"Find all places where database calls are made inside a loop.\"\n- \"Identify functions that handle more than three distinct external API contracts.\"\n\nAt git11, we find that these targeted queries provide a clearer picture of codebase maturity than any single engineering metric, as they capture the developer's intent rather than just the syntax.\n\n## 8. Summary Checklist for Rapid Assessment\n\nIf you have 30 minutes to evaluate a repository of 50k+ lines, follow this sequence:\n\n1. Run churn analysis: Identify the 10 most changed files in the last 6 months.\n2. Check for outliers: Find the 5 largest files and the 5 most deeply nested functions.\n3. Review the package.json / requirements.txt / go.mod`: Are there 50+ dependencies? Are they outdated?\n4. Visualize the graph: Are there circular dependencies between top-level folders?\n5. Scan for 'TODOs' and 'FIXMEs': A high density of these in high-churn files is a strong signal of impending technical debt.\n\n## Conclusion\n\nLine-by-line reading is an act of deep focus, but it is an inefficient tool for broad assessment. By treating code as a data set—analyzing its evolution, its shape, and its connections—we can form a more accurate diagnostic of codebase health. Technical debt is rarely hidden in a single clever line of code; it is usually visible in the broad-stroke patterns of how that code changes over time.", "tags": ["static-analysis", "software-architecture", "git", "technical-debt", "engineering-productivity"], "category": "education", "read_time": 11 }

Ask this question directly on your own repo →