|
| 1 | +# Session 108: Fix Failing Patterns + Push to Main |
| 2 | + |
| 3 | +**Goal**: Clean up the 6 failing patterns in `fix_failure_tracking`, validate, and push to main branch. |
| 4 | + |
| 5 | +**Prerequisites**: |
| 6 | +- Supabase connection active |
| 7 | +- Access to `fix_pattern_guidance` table |
| 8 | +- All Session 106-107 work complete |
| 9 | + |
| 10 | +--- |
| 11 | + |
| 12 | +## Tasks |
| 13 | + |
| 14 | +### 1. Create Pattern for UselessParentheses (pmd/java) |
| 15 | +**Goal**: Add guidance pattern for UselessParentheses rule |
| 16 | +**Steps**: |
| 17 | +1. Navigate to fix-pattern-registry directory |
| 18 | +2. Create pattern with anti-patterns and correct patterns |
| 19 | +3. Add to Supabase `fix_pattern_guidance` table |
| 20 | +4. Verify pattern is active |
| 21 | +**Pattern**: |
| 22 | +```typescript |
| 23 | +{ |
| 24 | + ruleId: 'UselessParentheses', |
| 25 | + language: 'java', |
| 26 | + tool: 'pmd', |
| 27 | + antiPatterns: [ |
| 28 | + 'Removing ALL parentheses without checking operator precedence', |
| 29 | + 'Changing expression meaning by removing grouping' |
| 30 | + ], |
| 31 | + correctPatterns: [ |
| 32 | + 'Only remove parentheses that do not affect precedence', |
| 33 | + 'Keep parentheses around complex boolean expressions', |
| 34 | + 'Check Java operator precedence: *, /, % > +, - > ==, != > && > ||' |
| 35 | + ], |
| 36 | + promptAdditions: 'Check Java operator precedence before removing. Only remove redundant parens that do not affect evaluation order.' |
| 37 | +} |
| 38 | +``` |
| 39 | + |
| 40 | +--- |
| 41 | + |
| 42 | +### 2. Create Pattern for F632 (ruff/python) |
| 43 | +**Goal**: Add guidance pattern for F632 rule (is literal comparison) |
| 44 | +**Steps**: |
| 45 | +1. Create pattern for F632 rule |
| 46 | +2. Add anti-patterns for common mistakes |
| 47 | +3. Add correct patterns with examples |
| 48 | +4. Insert into Supabase |
| 49 | +**Pattern**: |
| 50 | +```typescript |
| 51 | +{ |
| 52 | + ruleId: 'F632', |
| 53 | + language: 'python', |
| 54 | + tool: 'ruff', |
| 55 | + antiPatterns: [ |
| 56 | + 'Using is True or is False for comparisons', |
| 57 | + 'Using == True in boolean context where truthiness works' |
| 58 | + ], |
| 59 | + correctPatterns: [ |
| 60 | + 'Remove comparison entirely if checking truthiness: if x: not if x == True:', |
| 61 | + 'Use is None for None checks, == True/False only for explicit bool comparison', |
| 62 | + 'For boolean flags, prefer if flag: over if flag == True:' |
| 63 | + ], |
| 64 | + promptAdditions: 'In boolean context, prefer if x: over if x == True:. Only keep explicit comparison when the variable might not be a boolean.' |
| 65 | +} |
| 66 | +``` |
| 67 | + |
| 68 | +--- |
| 69 | + |
| 70 | +### 3. Create Pattern for @typescript-eslint/no-explicit-any |
| 71 | +**Goal**: Add guidance pattern for no-explicit-any rule |
| 72 | +**Steps**: |
| 73 | +1. Create pattern for TypeScript any type issues |
| 74 | +2. Add anti-patterns for incorrect fixes |
| 75 | +3. Add correct patterns with type inference guidance |
| 76 | +4. Insert into Supabase |
| 77 | +**Pattern**: |
| 78 | +```typescript |
| 79 | +{ |
| 80 | + ruleId: '@typescript-eslint/no-explicit-any', |
| 81 | + language: 'typescript', |
| 82 | + tool: 'eslint', |
| 83 | + antiPatterns: [ |
| 84 | + 'Replacing any with unknown without updating usage code', |
| 85 | + 'Using overly generic types that lose all type safety', |
| 86 | + 'Adding type assertions (as Type) everywhere' |
| 87 | + ], |
| 88 | + correctPatterns: [ |
| 89 | + 'Replace any with specific interface or type based on actual usage', |
| 90 | + 'Use unknown with type guards when type is truly unknown', |
| 91 | + 'Use generics for flexible but type-safe code', |
| 92 | + 'For event handlers, use the specific event type (MouseEvent, ChangeEvent, etc.)' |
| 93 | + ], |
| 94 | + promptAdditions: 'Analyze the actual usage of the variable to determine the proper type. Prefer specific interfaces over unknown. Check what properties/methods are accessed.' |
| 95 | +} |
| 96 | +``` |
| 97 | + |
| 98 | +--- |
| 99 | + |
| 100 | +### 4. Create Pattern for AvoidDollarSigns (pmd/java) |
| 101 | +**Goal**: Add guidance pattern for AvoidDollarSigns rule |
| 102 | +**Steps**: |
| 103 | +1. Create pattern for dollar sign in identifiers |
| 104 | +2. Document when dollar signs are intentional (generated code, inner classes) |
| 105 | +3. Insert into Supabase |
| 106 | +**Pattern**: |
| 107 | +```typescript |
| 108 | +{ |
| 109 | + ruleId: 'AvoidDollarSigns', |
| 110 | + language: 'java', |
| 111 | + tool: 'pmd', |
| 112 | + antiPatterns: [ |
| 113 | + 'Removing dollar signs from generated code or inner class references', |
| 114 | + 'Renaming variables that are part of framework conventions' |
| 115 | + ], |
| 116 | + correctPatterns: [ |
| 117 | + 'Rename user-defined variables to use camelCase without dollar signs', |
| 118 | + 'Keep dollar signs in generated code (mark as suppressed if needed)', |
| 119 | + 'For inner class references like Outer$Inner, this is compiler-generated - suppress' |
| 120 | + ], |
| 121 | + promptAdditions: 'Dollar signs are reserved for compiler-generated code. For user variables, rename to camelCase. If this is generated code or inner class reference, add @SuppressWarnings instead.' |
| 122 | +} |
| 123 | +``` |
| 124 | + |
| 125 | +--- |
| 126 | + |
| 127 | +### 5. Create Pattern for UnnecessaryAnnotationValueElement (pmd/java) |
| 128 | +**Goal**: Add guidance pattern for UnnecessaryAnnotationValueElement rule |
| 129 | +**Steps**: |
| 130 | +1. Create pattern for annotation value simplification |
| 131 | +2. Add examples of correct simplification |
| 132 | +3. Insert into Supabase |
| 133 | +**Pattern**: |
| 134 | +```typescript |
| 135 | +{ |
| 136 | + ruleId: 'UnnecessaryAnnotationValueElement', |
| 137 | + language: 'java', |
| 138 | + tool: 'pmd', |
| 139 | + antiPatterns: [ |
| 140 | + 'Removing value= when multiple elements exist in annotation', |
| 141 | + 'Breaking annotation syntax by incorrect removal' |
| 142 | + ], |
| 143 | + correctPatterns: [ |
| 144 | + '@SuppressWarnings(value = "unchecked") -> @SuppressWarnings("unchecked")', |
| 145 | + '@RequestMapping(value = "/path") -> @RequestMapping("/path")', |
| 146 | + 'Only remove value= when it is the ONLY element in the annotation' |
| 147 | + ], |
| 148 | + promptAdditions: 'Only simplify when value is the single element. @Anno(value="x") becomes @Anno("x"). But @Anno(value="x", other="y") must keep value= explicit.' |
| 149 | +} |
| 150 | +``` |
| 151 | + |
| 152 | +--- |
| 153 | + |
| 154 | +### 6. Create Pattern for UseUtilityClass (pmd/java) |
| 155 | +**Goal**: Add guidance pattern for UseUtilityClass rule |
| 156 | +**Steps**: |
| 157 | +1. Create pattern for utility class detection |
| 158 | +2. Add guidance on private constructor placement |
| 159 | +3. Insert into Supabase |
| 160 | +**Pattern**: |
| 161 | +```typescript |
| 162 | +{ |
| 163 | + ruleId: 'UseUtilityClass', |
| 164 | + language: 'java', |
| 165 | + tool: 'pmd', |
| 166 | + antiPatterns: [ |
| 167 | + 'Adding private constructor to classes that are meant to be instantiated', |
| 168 | + 'Adding private constructor to Spring @Configuration or @Component classes', |
| 169 | + 'Breaking dependency injection by making class non-instantiable' |
| 170 | + ], |
| 171 | + correctPatterns: [ |
| 172 | + 'Add private constructor only to true utility classes (all static methods)', |
| 173 | + 'For Spring beans, suppress the warning instead', |
| 174 | + 'Private constructor should be: private ClassName() { throw new UnsupportedOperationException(); }' |
| 175 | + ], |
| 176 | + promptAdditions: 'Check if class is a Spring bean (@Component, @Service, @Configuration) - if so, suppress warning. Only add private constructor to pure utility classes with all static methods.' |
| 177 | +} |
| 178 | +``` |
| 179 | + |
| 180 | +--- |
| 181 | + |
| 182 | +### 7. Remove Fixed Patterns from fix_failure_tracking |
| 183 | +**Goal**: Clean up the failure tracking table |
| 184 | +**Steps**: |
| 185 | +1. Query fix_failure_tracking for the 6 rules |
| 186 | +2. Delete entries that now have guidance patterns |
| 187 | +3. Verify table is clean |
| 188 | + |
| 189 | +--- |
| 190 | + |
| 191 | +### 8. Run Validation Tests |
| 192 | +**Goal**: Verify patterns work correctly |
| 193 | +**Steps**: |
| 194 | +1. Run live integration tests |
| 195 | +2. Verify no regressions |
| 196 | +3. Check pattern lookup works |
| 197 | +**Commands**: |
| 198 | +```bash |
| 199 | +cd packages/agents |
| 200 | +npm test -- --testPathPattern="live-" --verbose |
| 201 | +``` |
| 202 | + |
| 203 | +--- |
| 204 | + |
| 205 | +### 9. Commit Changes |
| 206 | +**Goal**: Commit pattern additions |
| 207 | +**Steps**: |
| 208 | +1. Stage all changes |
| 209 | +2. Create descriptive commit message |
| 210 | +3. Verify commit |
| 211 | +**Commands**: |
| 212 | +```bash |
| 213 | +git add -A |
| 214 | +git status |
| 215 | +git commit -m "feat(kb): Add 6 guidance patterns for failing rules |
| 216 | +
|
| 217 | +- UselessParentheses (pmd/java): Operator precedence guidance |
| 218 | +- F632 (ruff/python): Boolean comparison guidance |
| 219 | +- no-explicit-any (eslint/typescript): Type inference guidance |
| 220 | +- AvoidDollarSigns (pmd/java): Generated code handling |
| 221 | +- UnnecessaryAnnotationValueElement (pmd/java): Annotation simplification |
| 222 | +- UseUtilityClass (pmd/java): Spring bean detection |
| 223 | +
|
| 224 | +Resolves 6 entries in fix_failure_tracking table." |
| 225 | +``` |
| 226 | + |
| 227 | +--- |
| 228 | + |
| 229 | +### 10. Push to Main |
| 230 | +**Goal**: Push validated changes to main branch |
| 231 | +**Steps**: |
| 232 | +1. Verify on main branch |
| 233 | +2. Push to origin |
| 234 | +3. Verify push succeeded |
| 235 | +**Commands**: |
| 236 | +```bash |
| 237 | +git branch |
| 238 | +git push origin main |
| 239 | +git log --oneline -3 |
| 240 | +``` |
| 241 | + |
| 242 | +--- |
| 243 | + |
| 244 | +## Validation |
| 245 | + |
| 246 | +```bash |
| 247 | +# Run all live tests |
| 248 | +cd packages/agents |
| 249 | +npm test -- --testPathPattern="live-" --verbose |
| 250 | + |
| 251 | +# Check Supabase pattern count |
| 252 | +node -e " |
| 253 | +const { createClient } = require('@supabase/supabase-js'); |
| 254 | +require('dotenv').config({ path: '.env' }); |
| 255 | +const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY); |
| 256 | +supabase.from('fix_pattern_guidance').select('rule_id', { count: 'exact' }) |
| 257 | + .then(({count}) => console.log('Guidance patterns:', count)); |
| 258 | +" |
| 259 | +``` |
| 260 | + |
| 261 | +## Expected Outcomes |
| 262 | + |
| 263 | +- 6 new entries in `fix_pattern_guidance` table (total: 19) |
| 264 | +- 0 entries remaining in `fix_failure_tracking` for these rules |
| 265 | +- All live tests passing |
| 266 | +- Clean commit pushed to main |
| 267 | + |
| 268 | +## Notes |
| 269 | + |
| 270 | +- Patterns should be tested with actual issues before marking complete |
| 271 | +- If a pattern still causes regressions, refine the guidance |
| 272 | +- Document any edge cases discovered during testing |
0 commit comments