--- name: python-clean-code description: Use when the user explicitly wants Python cleanup, refactoring, or clean-code review. Apply broad Python code-quality guidance without taking over domain-specific GenLayer design or testing workflows. --- # Clean Python: Complete Reference Use this skill for comprehensive Python cleanup or review work. It is the broadest of the imported clean-code skills. ## In This Repo - Use this skill for Python refactors, cleanup passes, and explicit clean-code review. - If the task is designing or significantly changing GenLayer contract logic, let `write-contract` lead. - If the task is executing GenLayer test workflows, let `direct-tests` and `integration-tests` lead. - After contract edits, keep `genvm-lint` and the repo test workflow in the loop. ## Comments (C1-C5) - C1: No metadata in comments; use Git - C2: Delete obsolete comments immediately - C3: No redundant comments - C4: Write comments well if you must - C5: Never commit commented-out code ## Functions (F1-F4) - F1: Maximum 3 arguments when practical; use a data structure for more - F2: No output arguments; return values instead - F3: No flag arguments when separate functions are clearer - F4: Delete dead functions ## General (G1-G36) - G1: One language per file - G2: Implement expected behavior - G3: Handle boundary conditions - G4: Do not override safeties casually - G5: DRY; avoid duplication - G6: Keep abstraction levels consistent - G7: Base classes should not know about children - G8: Minimize public surface area - G9: Delete dead code - G10: Keep variables near usage - G11: Be consistent - G12: Remove clutter - G13: Avoid artificial coupling - G14: Avoid feature envy - G15: Avoid selector arguments - G16: Keep intent obvious - G17: Put code where readers expect it - G18: Prefer instance methods when behavior belongs to the object - G19: Use explanatory variables when they help - G20: Function names should say what they do - G21: Understand the algorithm before reshaping it - G22: Make dependencies physical and visible - G23: Prefer polymorphism to long if/else ladders - G24: Follow conventions - G25: Replace magic numbers with named constants - G26: Be precise - G27: Prefer structure over convention-only behavior - G28: Encapsulate conditionals - G29: Avoid negative conditionals when possible - G30: Functions should do one thing - G31: Make temporal coupling explicit - G32: Do not be arbitrary - G33: Encapsulate boundary conditions - G34: Keep one abstraction level per function - G35: Keep configuration at higher levels - G36: Avoid train wrecks ## Python-Specific Rules (P1-P3) - P1: No wildcard imports - P2: Prefer enums or named constants to magic constants - P3: Use type hints on public interfaces when they improve clarity ## Names (N1-N7) - N1: Choose descriptive names - N2: Match the abstraction level - N3: Use standard nomenclature - N4: Prefer unambiguous names - N5: Match name length to scope - N6: Avoid encodings - N7: Names should reveal side effects ## Tests (T1-T9) - T1: Test everything that could break - T2: Use coverage tools - T3: Do not skip trivial tests - T4: An ignored test signals ambiguity - T5: Test boundary conditions - T6: Exhaustively test near bugs - T7: Look for failure patterns - T8: Look for coverage patterns - T9: Keep tests fast ## Anti-Patterns | Do not | Prefer | |--------|--------| | Comment every line | Delete obvious comments | | Use `from x import *` | Use explicit imports | | Keep magic number `86400` inline | Use `SECONDS_PER_DAY = 86400` | | Pass `process(data, True)` | Split into clearer functions | | Keep deep nesting | Use guard clauses and early returns | | Chain through `obj.a.b.c.value` | Introduce a clearer boundary | ## AI Behavior When reviewing code, identify issues by rule number when that adds clarity. When editing code, favor concrete improvements over style-only churn and summarize the important fixes made.