vertical-slice-architecture
Vertical Slice Architecture
Quick Reference: The 5 Rules
- One feature = one directory containing handler, request/response types, validation, and tests
- One entry point per feature — a setup/registration function that receives the router and dependencies. Name varies by convention (
Setup,RegisterRoute,Map); the role is the invariant, not the name. - Minimize coupling between slices, maximize coupling within a slice
- No premature abstractions — no shared repository/service layers until genuine duplication emerges across multiple slices
- Test each feature primarily through its entry point, verifying outcomes (DB state, API calls, response). Platform/adapter tests are also encouraged.
Project Structure
{project}/
features/ # or internal/features/ (Go), Features/ (.NET)
{domain}/ # orders/, users/, kvs/
{operation}/ # create/, list/, delete/
handler # Single entry point + orchestration
request/response # DTOs
validator # Input validation (optional)
test # Co-located integration test
internal/ # Feature-private helpers (optional)
platform/ # or Infrastructure/ — shared cross-cutting concerns
middleware/ # Auth, error handling, idempotency
database/ # Connection pooling, circuit breakers
observability/ # Metrics, tracing, structured logging
opqueue/ # Operation queues, outbox patterns (if needed)
main # Composition root wires features + infrastructure
Workflow: Adding a New Feature
- Create directory:
features/{domain}/{operation}/ - Define the handler with a single exported setup function
- Define request/response types (inline for simple cases)
- Add validation logic
- Register in the composition root (
main) - Write integration test that calls the setup function, sends request, verifies outcomes
Workflow: Adding Cross-Cutting Concerns
Place in platform/ (not inside a feature). Examples:
- Auth middleware, error handling, request logging
- Database connection pooling, circuit breakers
- Idempotency middleware, operation queues, event notifications
- Observability (metrics, tracing, structured logging)
Workflow: Extracting Shared Logic
Only extract when genuine duplication emerges across multiple slices (use judgment — the "3+ slices" heuristic is guidance, not a hard rule):
- Duplicate business rule: extract to a domain entity/value object
- Duplicate data access pattern: extract to a shared repository (only for that specific pattern)
- Duplicate HTTP helper: extract to
platform/httpx/
Key Decisions by Language
Detect the project's language/framework and consult the appropriate reference:
- Patterns per language: See references/patterns-by-language.md for Go, .NET, Java, TypeScript, Python
- Testing per language: See references/testing.md for testcontainers, mock verification, integration test patterns
- Core principles: See references/principles.md for detailed rules, anti-patterns, and shared domain model guidance
Single Entry Point Contract
Every feature exposes one primary setup/registration function. Internal types stay private. The entry point name is conventional — the invariant is: one public function per feature that wires the slice to the framework.
| Language | Convention | Signature | DI mechanism |
|---|---|---|---|
| Go | Setup or RegisterRoute |
func Setup(r gin.IRoutes, repo Repository) |
Explicit params |
| .NET | Map (static) |
static void Map(IEndpointRouteBuilder app) |
DI container resolves deps in handler |
| Java/Kotlin | @RestController class |
Controller discovered by component scan | Spring DI (constructor injection) |
| TypeScript | setup |
function setup(router: Router, db: Database): void |
Explicit params |
| Python | setup |
def setup(router: APIRouter, db: Database) -> None |
Explicit params or Depends() |
Exceptions: Versioned APIs may have SetupV1/SetupV2 wrappers sharing internal handler wiring. Frameworks with auto-discovery (Spring, NestJS) use the controller/module class itself as the entry point.
Testing
See references/testing.md for full testing strategy per language, including feature integration tests, platform/adapter tests, mock verification patterns, and test naming conventions.
More from mryll/skills
agentmd
Generate minimal, research-backed CLAUDE.md / AGENTS.md / COPILOT.md context files for coding agent CLIs. Based on "Evaluating AGENTS.md" (ETH Zurich, Feb 2026) which found that auto-generated context files DECREASE performance by ~3% and increase costs by 20-23%, while minimal human-written files improve performance by ~4%. Use when the user says "generate CLAUDE.md", "create AGENTS.md", "generate context file", "agentmd", "create recommended CLAUDE.md", "generate agent instructions", "init context file", or any request to create/improve a coding agent context file for a repository. Replaces the default /init command which generates bloated, counterproductive context files.
36low-complexity
Enforce low Cognitive Complexity (SonarSource) and low Cyclomatic Complexity in ALL code written or modified, in any programming language, framework, or platform. This skill MUST activate automatically whenever code is being written, generated, modified, or refactored — no explicit trigger needed. Triggers include writing any function, method, class, module, script, handler, endpoint, test, or code block. Also triggers on "low complexity", "cognitive complexity", "cyclomatic complexity", "reduce complexity", "simplify code", "too complex", "refactor for readability", "clean code", "implement", "fix bug", "add feature", "generate test", "optimize", "rewrite", "scaffold".
23codex-review
Iterative code review and planning discussion between the local agent and Codex CLI (model and reasoning effort taken from the user's local Codex configuration at ~/.codex/config.toml, overridable per invocation). Orchestrates an automatic back-and-forth debate where both agents discuss findings, architecture decisions, or implementation plans until reaching consensus. Codex CLI operates in READ-ONLY mode — it never modifies files. Supports plan mode: when the local agent has a plan ready, invoke this skill to have Codex evaluate and iterate on the plan before implementation, producing an updated consensus plan. Use when the user asks to review with codex, analyze with codex, discuss with codex, iterate with codex, consult codex, ask codex, review the plan with codex, validate plan with codex, or any request involving Codex CLI for code review, architecture review, planning discussion, or collaborative analysis of code, design, or implementation strategy.
23test-namer
Guide for writing expressive, behavior-focused tests following Vladimir Khorikov's testing principles. Apply when writing, reviewing, or renaming any test (unit, integration, e2e) in any programming language. Triggers: writing tests, creating test files, adding test cases, reviewing test names, 'test naming', 'rename tests', 'Khorikov', or any test creation task. Covers: naming conventions (plain English over rigid policies), what to test (behavior not implementation), testing styles (output > state > communication), and pragmatic test investment.
17dual-testing
Go dual testing strategy: integration tests (testcontainers) verify full-chain wiring for happy paths, unit tests (testify/mock) verify error handling logic. Apply when designing test strategy for a Go project, creating a new handler or feature that needs tests, or deciding what type of test to write for a scenario. Triggers: 'dual testing', 'error path coverage', 'testcontainers vs mocks', 'what type of test', 'where should this test go', 'integration vs unit', creating Go handlers/features/workers that need tests. Does NOT trigger on: writing individual test assertions, renaming tests, test naming conventions (use test-namer for those).
3