Use before implementing or refactoring software when the task requires designing module boundaries, APIs, layers, abstractions, services, repositories, adapters, or architecture. Helps coding agents reduce total system complexity by creating deep modules, hiding implementation knowledge, avoiding leakage and pass-through APIs, comparing alternative designs, documenting interfaces before coding, and critiquing existing architecture.
90
90%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
Use these examples as patterns while designing or reviewing modules.
Bad shallow wrapper:
class OrderService:
def create_order(self, request):
return self.order_repository.create_order(request)Why bad:
Better deep module:
class OrderPlacement:
def place_order(self, customer_id, cart_id, payment_method_id):
cart = self.carts.load(cart_id)
customer = self.customers.load(customer_id)
order = Order.from_cart(customer, cart)
order.require_valid_shipping_address()
order.require_available_inventory()
authorization = self.payments.authorize(order.total, payment_method_id)
reservation = self.inventory.reserve(order.items)
return self.orders.save_confirmed(order, authorization, reservation)Why better:
place_order.Bad leaky code:
def cancel_order(order_row):
if order_row["status_code"] == 7:
raise Exception("Already shipped")
order_row["status_code"] = 9
db.orders.update(order_row)Why bad:
Better domain abstraction:
class Order:
def cancel(self):
if self.has_shipped():
raise OrderCannotBeCancelled("Shipped orders cannot be cancelled.")
self.status = OrderStatus.CANCELLEDWhy better:
Bad pass-through variables:
def generate_invoice(order, locale, tax_table, rounding_mode, currency_rules):
...
def email_invoice(order, locale, tax_table, rounding_mode, currency_rules):
invoice = generate_invoice(order, locale, tax_table, rounding_mode, currency_rules)
...Why bad:
Better owned policy:
class InvoiceGenerator:
def generate_for(self, order):
tax = self.tax_policy.calculate(order)
total = self.currency_policy.round(order.subtotal + tax)
return Invoice(order, tax, total)Why better:
Bad temporal modules:
RequestParser
RequestValidator
RequestProcessor
ResponseBuilderProblem:
Better conceptual modules:
SubscriptionSignup
EligibilityPolicy
BillingAccount
WelcomeMessageWhy better:
Bad layered pass-through stack:
UserController.get_user
UserService.get_user
UserManager.get_user
UserRepository.get_user
UserDAO.get_userProblem:
Better distinct layers:
HTTP layer: translate request/response details.
Application layer: load an active member profile use case.
Domain layer: represent member eligibility and account status.
Infrastructure layer: hide user, membership, and permission storage.Example operation:
class MemberProfileQuery:
def load_active_profile(self, member_id):
user = self.users.fetch(member_id)
membership = self.memberships.fetch_current(member_id)
permissions = self.permissions.resolve(member_id)
if not user.active or not membership.current:
return None
return MemberProfile(user, membership, permissions)Why better: