--- name: ai-code-cleanup description: Remove AI-generated code slop from branches. Use after AI-assisted coding sessions to clean up defensive bloat, unnecessary comments, type casts, and style inconsistencies. Focuses on identifying and removing AI artifacts that degrade code quality. author: Joseph OBrien status: unpublished updated: '2025-12-23' version: 1.0.1 tag: skill type: skill --- # AI Code Cleanup This skill identifies and removes AI-generated artifacts that degrade code quality, including defensive bloat, unnecessary comments, type casts, and style inconsistencies. ## When to Use This Skill - After AI-assisted coding sessions - Before code reviews or merging branches - When cleaning up code that feels "over-engineered" - When removing unnecessary defensive code - When standardizing code style after AI generation - When preparing code for production ## What This Skill Does 1. **Identifies AI Artifacts**: Detects patterns typical of AI-generated code 2. **Removes Bloat**: Eliminates unnecessary defensive code and comments 3. **Fixes Type Issues**: Removes unnecessary type casts and workarounds 4. **Standardizes Style**: Ensures consistency with project conventions 5. **Preserves Functionality**: Maintains code behavior while improving quality 6. **Validates Changes**: Ensures code still compiles and tests pass ## How to Use ### Clean Up Branch ``` Remove AI slop from this branch ``` ``` Clean up the code in this pull request ``` ### Specific Cleanup ``` Remove unnecessary comments and defensive code from src/ ``` ## Slop Patterns to Remove ### 1. Unnecessary Comments **Patterns:** - Comments explaining obvious code - Comments inconsistent with file's documentation style - Redundant comments that restate the code - Over-documentation of simple operations **Example:** ```javascript // ❌ AI-generated: Obvious comment // Set the user's name user.name = name; // ✅ Clean: Self-documenting code user.name = name; ``` ### 2. Defensive Bloat **Patterns:** - Extra try/catch blocks abnormal for that codebase - Defensive null/undefined checks on trusted paths - Redundant input validation when callers already validate - Error handling that can never trigger **Example:** ```javascript // ❌ AI-generated: Unnecessary defensive code function processUser(user) { try { if (user && user.name && typeof user.name === 'string') { return user.name.toUpperCase(); } return null; } catch (error) { console.error(error); return null; } } // ✅ Clean: Trust the input, handle real errors function processUser(user) { return user.name.toUpperCase(); } ``` ### 3. Type Workarounds **Patterns:** - Casts to `any` to bypass type issues - Unnecessary type assertions (`as X`) - `@ts-ignore` or `@ts-expect-error` without legitimate reason - Overly complex generic constraints **Example:** ```typescript // ❌ AI-generated: Type workaround const data = response.data as any; const result = processData(data as ProcessedData); // ✅ Clean: Proper typing const data = response.data; const result = processData(data); ``` ### 4. Style Inconsistencies **Patterns:** - Naming conventions different from rest of file - Formatting that doesn't match surrounding code - Import organization inconsistent with file patterns - Variable declarations inconsistent with file style **Example:** ```javascript // ❌ AI-generated: Inconsistent style const UserData = fetchUser(); var processedData = process(UserData); let FinalResult = format(processedData); // ✅ Clean: Consistent style const userData = fetchUser(); const processedData = process(userData); const finalResult = format(processedData); ``` ### 5. AI Tells **Patterns:** - Unnecessary emoji usage in code or comments - Overly verbose variable names - Redundant intermediate variables - "Just in case" code with no actual use case ## Cleanup Process ### 1. Get the Diff ```bash git diff $(git merge-base HEAD main)..HEAD --name-only ``` ### 2. Analyze Each File For each changed file: - Read the full file to understand existing style - Identify patterns from slop categories - Make surgical edits to remove slop - Preserve functionality ### 3. Verification - Ensure code still compiles/runs - Changes should reduce code, not add more - Run tests to verify behavior - Check for any regressions ## Examples ### Example 1: Comment Cleanup **Input**: Remove unnecessary comments from `src/auth.js` **Output**: ```markdown ## AI Code Cleanup: src/auth.js ### Removed - 12 redundant comments explaining obvious code - 3 comments inconsistent with file style - 5 over-documented simple operations ### Changes ```javascript // Before // Function to validate user email // Takes email string as input // Returns boolean indicating validity function validateEmail(email) { // Check if email is not empty if (!email) { return false; // Return false if empty } // Return regex test result return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); } // After function validateEmail(email) { if (!email) return false; return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); } ``` ### Result - Lines reduced: 12 → 4 - Functionality preserved - Tests pass ``` ### Example 2: Defensive Bloat Removal **Input**: Remove defensive bloat from `src/api/users.js` **Output**: ```markdown ## AI Code Cleanup: src/api/users.js ### Removed - 3 unnecessary try/catch blocks - 8 redundant null checks on validated inputs - 2 error handlers that can never trigger ### Changes ```javascript // Before async function getUser(userId) { try { if (!userId || typeof userId !== 'string') { throw new Error('Invalid userId'); } const user = await db.users.findById(userId); if (user && user.id) { return user; } return null; } catch (error) { console.error(error); throw error; } } // After async function getUser(userId) { const user = await db.users.findById(userId); return user || null; } ``` ### Result - Code reduced: 15 lines → 3 lines - Functionality preserved - Error handling appropriate for context ``` ## Reference Files - **`references/REFACTORING_PLAN.template.md`** - Refactoring plan template with code smells, before/after metrics, and rollback strategy ## Best Practices ### Cleanup Guidelines 1. **Preserve Functionality**: Only remove code that doesn't affect behavior 2. **Maintain Style**: Follow existing project conventions 3. **Keep Real Errors**: Don't remove legitimate error handling 4. **Test After Changes**: Always verify code still works 5. **Incremental**: Make changes incrementally, test as you go ### What to Keep - Legitimate error handling - Necessary type assertions - Helpful comments that add context - Defensive code for untrusted inputs - Style that matches the codebase ### What to Remove - Obvious comments - Unnecessary defensive code - Type workarounds - Style inconsistencies - AI-generated artifacts ## Related Use Cases - Post-AI coding cleanup - Code review preparation - Code quality improvement - Style standardization - Removing technical debt