From Technical Debt to AI-Assisted Remediation
Olivier Vitrac, PhD, HDR | olivier.vitrac@adservio.fr
November 2025
Modern challenges:
Rapid delivery cycles → shorter review time
Complex codebases → harder to maintain
Security threats → constant evolution
Technical debt → accumulates silently
Solution: Systematic, AI-assisted auditing
By the end of this lecture:
Understand technical debt types and measurement
Apply audit frameworks (ISO/IEC 25010, CWE/OWASP)
Use Claude Code for comprehensive audits
Automate audits in CI/CD pipelines
Implement responsible AI auditing practices
"Every line of code is a liability until proven safe."
Auditing philosophy:
Prevention over reaction
Continuous over sporadic
Automated over manual
Contextual over rule-based
"Not refactoring is like taking a loan—you gain speed now, pay interest later."
The debt metaphor:
Principal: Suboptimal code written initially
Interest: Extra effort required for changes
Compound interest: Debt makes future debt worse
mindmap
root((Technical<br/>Debt))
Code Debt
Duplication
Complexity
Style inconsistency
Design Debt
Poor modularity
Wrong abstractions
Tight coupling
Test Debt
Missing tests
Flaky tests
Low coverage
Documentation Debt
Missing docs
Outdated docs
Knowledge silos
Security Debt
Known vulnerabilities
Outdated dependencies
Weak authentication
Examples:
Duplication
High complexity
Cyclomatic complexity > 10
Deeply nested conditionals
Poor modularity:
class GodClass:
def handle_user_auth(self): ...
def process_payment(self): ...
def send_email(self): ...
def generate_report(self): ...
def update_database(self): ...
# 50+ methods in one class!Better: Separate concerns into focused classes
Missing test coverage:
# Production code
def transfer_funds(from_account, to_account, amount):
# Critical financial logic
# NO TESTS! 😱
passImpact:
Fear of refactoring
Regression bugs
Slow development
Static metrics:
Cyclomatic complexity (McCabe)
Maintainability index
Lines of code (LOC)
Code duplication percentage
Tools:
SonarQube: Debt ratio, code smells
Radon: Python complexity
CodeClimate: Maintainability scores
Claude Code prompt:
Analyze this repository for technical debt.
Rank top 5 debt items by:
impact × remediation_effort
Consider:
- Complexity, duplication, test coverage
- Dependencies, documentation
- Security vulnerabilities
Output: Prioritized list with estimated hours
Benefit: Context-aware prioritization
| Aspect | Code Review | Code Audit |
|---|---|---|
| Purpose | Correctness | Compliance/Risk |
| Timing | Pre-merge | Periodic |
| Scope | Changes | Entire codebase |
| Actor | Peer | Independent |
| Output | Approval | Report |
The Four Pillars:
Security: Vulnerabilities, exploits
Quality: Maintainability, complexity
Standards: Style guides, conventions
Reliability: Error handling, edge cases
Goal: Holistic assessment, not just "does it work?"
1. Static Analysis
AST inspection
Pattern matching
Type checking
2. Dynamic Analysis
Runtime instrumentation
Test coverage measurement
Performance profiling
3. Semantic Analysis
LLM reasoning (Claude Code)
Logic anomaly detection
Context-aware validation
graph TB
Code[Source Code] --> Static[Static Tools]
Code --> Dynamic[Dynamic Analysis]
Static --> Results[Raw Findings]
Dynamic --> Results
Results --> AI[Claude Code]
AI --> Context[Context Analysis]
Context --> Report[Prioritized Report]
style AI fill:#FF6B35
style Report fill:#4CAF50
Advantage: Reduced false positives, better prioritization
Capabilities:
200k token context window
Multi-file reasoning
MCP tool integration
Structured output (JSON/Markdown)
Perfect for:
Cross-file analysis
Dependency tracking
Logic flow verification
1. Code Smells
Analyze repo for code smells.
Rate severity 1-5.
Focus: duplication, complexity, poor naming.
2. Security
Scan for:
- SQL injection
- XSS vulnerabilities
- Hardcoded secrets
Output: security_audit.json
3. Standards Compliance
Audit for PEP 8 and PEP 484 compliance.
Suggest auto-fixable changes.
Highlight breaking changes separately.
4. Documentation Debt
List all public functions lacking docstrings.
Categorize by module.
Estimate effort to document.
Local development:
MCP integration:
# Via MCP tool
result = mcp_call("code-audit", {
"target": "src/",
"tools": ["ruff", "bandit"],
"severity_threshold": "important"
})CI/CD:
Multi-agent workflow:
graph LR
A[Analysis Agent] -->|issues.json| B[Fix Agent]
B -->|patches/| C[Validation Agent]
C -->|report.md| D[Human Review]
style A fill:#FF6B35
style C fill:#4CAF50
Analysis: Detect issues
Fix: Propose remediation
Validation: Test fixes
Review: Human approval
Track debt over time:
audits/
├── 2025-01-01_audit.json
├── 2025-02-01_audit.json
├── 2025-03-01_audit.json
└── trends.jsonBenefits:
Identify accumulating debt
Measure remediation effectiveness
Predict future debt
8 Quality Characteristics:
Functional Suitability
Performance Efficiency
Compatibility
Usability
Reliability
Security ← Audit focus
Maintainability ← Audit focus
Portability
Sub-characteristics:
Confidentiality: Data protection
Integrity: Data accuracy
Non-repudiation: Action traceability
Accountability: User identification
Authenticity: Identity verification
Audit mapping:
SQL injection → Integrity
Hardcoded secrets → Confidentiality
Sub-characteristics:
Modularity: Isolated changes
Reusability: Component reuse
Analyzability: Easy diagnosis
Modifiability: Easy changes
Testability: Easy testing
Audit mapping:
High complexity → Analyzability
Code duplication → Reusability
Common Weakness Enumeration (CWE):
| Vulnerability | CWE ID | OWASP Category |
|---|---|---|
| SQL Injection | CWE-89 | A03: Injection |
| XSS | CWE-79 | A03: Injection |
| Hardcoded Credentials | CWE-798 | A07: Auth Failures |
| Weak Crypto | CWE-327 | A02: Crypto Failures |
Use in audits: Standardized vulnerability references
Language-specific:
Python: PEP 8, PEP 484 (type hints)
JavaScript: ESLint, Airbnb Style Guide
Java: Google Java Style
C++: Google C++ Style
PHP: PSR-12
Benefit: Team consistency, onboarding ease
Human-readable: audit.md
# Code Audit Report
## Executive Summary
- Critical: 3
- Important: 12
- Minor: 45
## Critical Issues
### 1. SQL Injection (CWE-89)
File: src/auth.py:42
...Machine-readable: audit.json
Project: Python FastAPI backend Size: 15k LOC, 87 files Goal: Pre-release audit
Team concerns:
Outdated dependencies?
Security vulnerabilities?
Technical debt level?
Step 1: Static Analysis
Step 2: Claude Analysis
Analyze src/ using context from out/*.
Focus:
1. Dependency vulnerabilities
2. Code complexity
3. Error handling
Output: audit.md + audit.json
| Category | File | Issue | Severity |
|---|---|---|---|
| Dependency | requirements.txt | FastAPI 0.78 (CVE-2023-XXXX) | 🔴 |
| Complexity | app/utils.py | Cyclomatic=18 | 🔶 |
| Security | db/query.py | SQL f-strings | 🔴 |
| Test | app/auth.py | No tests (critical path) | 🔶 |
Priority: Fix 🔴 before release
Issue 1: FastAPI upgrade
Issue 2: SQL injection
After fixes:
# Re-run static tools
bandit -r src/ -q
# Re-run Claude audit
claude code audit src/ --compare previous_audit.json
# Verify improvements
python tools/scripts/audit_diff.pyResult:
🔴 Critical: 3 → 0
🔶 Important: 12 → 8
⚪ Minor: 45 → 40
File: .git/hooks/pre-commit
#!/usr/bin/env bash
set -e
# Run static analysis
ruff check src/ || exit 1
bandit -r src/ --exit-zero -o out/bandit.json
# Run AI audit
python tools/scripts/audit_gate.py
# Block if critical issues
if grep -q '"severity": "critical"' audit.json; then
echo "❌ Critical issues found"
exit 1
fi
echo "✅ Audit passed"name: Code Audit
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install tools
run: pip install ruff bandit
- name: Run audit
run: python tools/scripts/run_audit.py
- name: Upload report
uses: actions/upload-artifact@v3
with:
name: audit-report
path: audit.mdScheduled audit:
Benefits:
Track debt trends
Early warning system
Historical data for analysis
Visualization:
graph LR
Audits[Daily Audits] --> DB[(PostgreSQL)]
DB --> API[REST API]
API --> Dashboard[Web Dashboard]
Dashboard --> Metrics[KPIs]
Dashboard --> Trends[Trend Charts]
Dashboard --> Alerts[Alert System]
style Dashboard fill:#4CAF50
Metrics:
Debt accumulation rate
Time to fix critical issues
Hot spots (files with recurring issues)
Include in reports:
# Audit Metadata
- **Tool**: Claude Code (claude-sonnet-4-5-20250929)
- **Date**: 2025-11-01T14:30:00Z
- **Prompt**: [Full prompt text]
- **Static tools**: ruff 0.1.9, bandit 1.7.5
- **Auditor**: Olivier VitracWhy: Reproducibility, accountability
Never blindly apply AI suggestions:
Review: Human examines AI findings
Validate: Verify with tests
Approve: Human makes final decision
Apply: Automated or manual
Critical areas:
Security fixes
Architecture changes
Public API modifications
Claude Pro Max:
No training on your data
Enterprise privacy controls
Audit logs
Best practices:
Don't include secrets in prompts
Use environment variables
Redact sensitive data
Strategies:
Start conservative: High severity threshold
Iterate prompts: Refine based on results
Use static tools as baseline: Cross-validate
Build false positive database: Learn over time
Typical false positive rate:
Static tools alone: 30-50%
AI-assisted: 10-20%
Be specific:
❌ "Check code quality"
✅ "Audit for PEP 8 violations, cyclomatic complexity >10, missing type hints"
Define output format:
Output format:
- audit.md (human-readable)
- audit.json (machine-readable)
JSON schema: {
"issues": [{
"file": str,
"line": int,
"severity": "critical"|"important"|"minor",
...
}]
}
Phase 1: Observation
Run audits, generate reports
Don't block builds
Learn typical issues
Phase 2: Soft Gates
Block on critical (🔴) only
Warn on important (🔶)
Ignore minor (⚪)
Phase 3: Strict Enforcement
Block on 🔴 and 🔶
Track trends for ⚪
Onboarding:
Train team on audit reading
Establish triage process
Define severity criteria
Create remediation SLAs
SLA example:
🔴 Critical: Fix within 24 hours
🔶 Important: Fix within 1 week
⚪ Minor: Fix within sprint
✅ Technical debt types and measurement ✅ Audit dimensions and strategies ✅ Claude Code for comprehensive audits ✅ ISO/IEC 25010 and CWE/OWASP frameworks ✅ Case study: Real-world audit ✅ CI/CD integration ✅ Responsible AI auditing
graph TD
A[Detect] --> B[Understand]
B --> C[Refactor]
C --> D[Verify]
D -->|Continuous| A
style A fill:#FF6B35
style B fill:#F7931E
style C fill:#FDC830
style D fill:#4CAF50
Detect: Find issues (static + AI)
Understand: Contextualize and prioritize
Refactor: Fix systematically
Verify: Test and re-audit
Technical debt is inevitable; manage it proactively
Hybrid auditing (static + AI) beats either alone
Standards mapping (ISO 25010, CWE) provides structure
Automation enables continuous auditing
Human oversight remains essential
Try these on your codebase:
Run static analysis + Claude audit
Map findings to ISO/IEC 25010
Calculate debt remediation estimate
Track trends over 1 month
Integrate audit gate in CI/CD
Documentation:
ISO/IEC 25010: Quality model
OWASP Top 10: https://owasp.org/
Claude Code: https://docs.anthropic.com/
Course materials:
lectures/lecture2_audit/pages/ —
Detailed guides
lectures/lecture2_audit/content.md
— Summary
Immediate:
Run audit on internal project
Establish baseline metrics
Create audit dashboard
Long-term:
Integrate into CI/CD
Train team on triage
Build trend database
Contact: Olivier Vitrac, PhD, HDR olivier.vitrac@adservio.fr
Course repository:
lectures/lecture2_audit/
You're now equipped to:
Identify and measure technical debt
Run comprehensive AI-assisted audits
Apply industry standards (ISO, CWE, OWASP)
Automate auditing in pipelines
Practice responsible AI auditing
Keep auditing! 🔍