| name | code-structure-cleanup |
| description | Use after an AI-built feature works but the code has duplicated mechanics, repeated API calls, or messy structure. Guides a cleanup pass that extracts reusable service-layer modules without changing behavior. |
| version | 1.0.0 |
| author | David Ondrej / Michael Shimeles interview notes |
| license | MIT |
| metadata | {"hermes":{"tags":["agentic-engineering","refactor","service-layer","code-quality"],"related_skills":["agentic-engineering-workflow"]}} |
Code Structure Cleanup After Every Feature
Overview
AI agents often take the easiest path: they create new functions instead of reusing existing ones. A feature can work while still leaving behind duplicated logic, inconsistent validation, repeated API calls, and code that future agents struggle to understand.
Run this cleanup pass after a feature works, not before.
When to Use
- A feature works locally but the code feels duplicated or messy.
- The agent created similar helper functions in multiple files.
- You want future agents to pick up the codebase without confusion.
- You need a smaller, cleaner PR before review.
Do not use this as permission to redesign the whole app.
What "Service Layer" Means
A service layer is a place for reusable mechanics:
- sending an email,
- streaming an AI response,
- creating a sandbox,
- validating a webhook,
- calling an external API,
- transforming a payload,
- parsing or normalizing data.
The UI/route/action decides what should happen. The service handles how it happens.
Cleanup Prompt
The feature is working. Now do a code-structure cleanup pass.
Goal:
- Find duplicated runtime mechanics, repeated API calls, repeated parsing, repeated validation, or repeated business logic.
- Move repeated mechanics into reusable service-layer functions/modules.
- Keep domain policy in the calling route/action/component.
- Do not change user-facing behavior.
- Keep the diff small.
Process:
1. Inspect the files touched by the feature.
2. Identify repeated logic and name the duplication clearly.
3. Propose the smallest service-layer extraction.
4. Implement it.
5. Run the relevant tests/typechecks.
6. Summarize exactly what got simpler.
Good Outcome
Instead of 4 files each having their own slightly different sendEmail() logic, there is one tested email service that all 4 files call.
Common Pitfalls
- Refactoring the whole app. Keep the scope tied to the feature.
- Renaming everything. Naming churn makes PRs hard to review.
- Mixing cleanup with a new feature. Cleanup is a separate pass.
- Only formatting code. Pretty code can still contain duplicated logic.
- Moving domain policy into services. Services should handle mechanics, not business decisions.
Verification Checklist