PatchProcessor: Intelligent Code Patching
Badges: Core · Stable
Sophisticated fuzzy matching code patching system for AI-assisted development. Apply modifications even when source code has drifted from the patch context.
Example: Config → Output
Configuration:
// Configure a custom FuzzyPatchMatcher
val processor = FuzzyPatchMatcher(
contextSize = 3,
levenshteinThresholdDivisor = 4,
minLineLengthForFuzzyMatch = 5,
enableFuzzyMatching = true,
enableSnippetPatching = true,
snippetMatchThreshold = 0.8
)
// Apply a patch
val result = processor.applyPatch(source, patch)
Output:
// Source (with minor variations)
fun calculateTotal(items: List<Item>) {
- var total = 0
+ var total = 0.0
for (item in items) {
- total += item.price
+ total += item.price * item.quantity
}
return total.roundToTwoDecimals()
+ return total.roundToTwoDecimals()
}
✓ Patch applied successfully
- 2 lines modified, 1 line added
- Fuzzy matched 3 context lines
Available Processors
Pre-configured processors optimized for different use cases and precision requirements.
| Processor | Description | Access |
|---|---|---|
| 🔷 Fuzzy (Default) | Balanced default for most languages. Uses a Levenshtein threshold divisor of 4 and 80% snippet match threshold. | PatchProcessors.Fuzzy |
| 🔒 Strict | Maximum precision. No fuzzy matching or snippet patching. Requires exact line matches with 5 lines of context. | PatchProcessors.Strict |
| 🍃 Lenient | Maximum flexibility for heavily modified codebases. Very lenient thresholds and minimal context requirements. | PatchProcessors.Lenient |
| 🐍 Python | Specialized for indentation-sensitive languages like Python and YAML. Preserves leading whitespace exactly. | PatchProcessors.Python |
| ⚛️ Thermodynamic | Physics-based matching using DNA-binding principles. Calculates optimal alignment via binding energy. | PatchProcessors.Thermodynamic |
| 🔄 FullReplacement | Simple full-file replacement. Ideal for creating new files or complete rewrites where patching is unnecessary. | PatchProcessors.FullReplacement |
10 Key Innovations
What makes Cognotik's patching system different from traditional diff/patch tools.
- Bidirectional Line Linking — Lines know their neighbors, enabling context-aware matching and bidirectional traversal during the alignment phase.
- Multi-Phase Matching — Unique line matching → Adjacent line propagation → Recursive subsequence linking. Adapts to code structure organically.
- Adaptive Fuzzy Matching — Levenshtein distance with structural type checking and adaptive thresholds that scale with line length.
- Snippet Patching — Handles AI-generated code blocks without explicit diff markers using a three-tier matching strategy.
- Move Detection — Identifies relocated code blocks by detecting order inversions, representing them as clean delete + add operations.
- Intelligent Context Management — Truncates large context blocks with ellipsis while preserving critical lines before and after changes.
- No-op Annihilation — Cleans up redundant DELETE/ADD pairs where the content remains identical after processing.
- Thermodynamic Alternative — Physics-based matching for specialized scenarios where traditional string matching fails.
- Language-Specific Support — Dedicated processors for indentation-sensitive languages like Python and YAML.
- Validation Integration — Seamlessly integrates with grammar validation to ensure patches don't introduce syntax errors.
Configuration Reference
FuzzyPatchMatcher
val processor = FuzzyPatchMatcher(
contextSize = 3, // Context lines before/after changes
maxRecursionDepth = 100, // Max recursion in subsequence linking
levenshteinThresholdDivisor = 4, // Stricter = higher value
minLineLengthForFuzzyMatch = 5, // Min length for fuzzy matching
enableFuzzyMatching = true, // Enable Levenshtein matching
enableSnippetPatching = true, // Enable snippet application
snippetMatchThreshold = 0.8, // Min match % for snippets
requireAnchorMatch = true // Require first/last line match
)
ThermodynamicPatchMatcher
val thermoProcessor = ThermodynamicPatchMatcher(
temperature = 1.0, // Matching stringency
cooperativityBonus = 2.0, // Bonus for adjacent matches
entropyPenalty = 1.0, // Energy cost per gap
contextSize = 3
)
Integration
High-level API: SimpleDiffApplier
val applier = SimpleDiffApplier()
val result = applier.apply(
originalCode = sourceCode,
response = aiMarkdownResponse,
filename = "Service.kt",
processor = PatchProcessors.Fuzzy
)
if (result.isValid) {
println("Patched successfully: ${result.newCode}")
} else {
result.errors.forEach { println("Error: ${it.message}") }
}
Basic Patch Generation
val processor = PatchProcessors.Fuzzy
val patch = processor.generatePatch(oldCode, newCode)
/* Output:
fun hello() {
- return 1
+ return 2
return 2
}
*/