solid-architecture
Use when writing, reviewing, or refactoring code that involves structural decisions. Provides SOLID principles, composition patterns, module organization, and side-effect boundary guidelines.
What this skill does
# SOLID Architecture Guidelines Apply these principles when writing or modifying code. Use them as tie-breakers when design decisions conflict. ## Core Goals (Priority Order) 1. **Maintainability** - Easy to change without breaking unrelated parts 2. **Testability** - Core logic testable without I/O or UI 3. **Determinism** - Reproducible given same inputs/seeded RNG 4. **Separation of Concerns** - Domain, infrastructure, UI clearly separated ## Composition Over Inheritance Favor small, focused types composed together rather than deep inheritance trees. When tempted to extend a class, first ask: "Can this be achieved through composition instead?" ## SOLID Principles ### Single Responsibility (SRP) Each module/type/function has **one reason to change**. **Violation signals:** - Cannot describe purpose in one sentence - Domain logic mixed with infrastructure - Multiple unrelated reasons to modify the file **Action:** Split into focused modules with clear, singular purposes. ### Open/Closed (OCP) Extend via new implementations, not constant modification. **Violation signals:** - Adding behavior requires modifying existing code - Growing switch/if-else chains for new cases - Frequent changes to stable modules **Action:** Add behavior through new modules and composition, not conditionals. ### Liskov Substitution (LSP) Subtypes must work anywhere their base type is expected. **Violation signals:** - Subtypes that throw on inherited operations - Subtypes that ignore/no-op inherited methods - Deep inheritance hierarchies **Action:** Prefer interfaces over deep hierarchies. Ensure substitutability. ### Interface Segregation (ISP) Depend only on the minimal surface needed. **Violation signals:** - Large interfaces with many methods - Consumers only using subset of interface - "Fat" interfaces forcing empty implementations **Action:** Create small, specific interfaces. Split large ones. ### Dependency Inversion (DIP) Depend on abstractions, not concretions. **Violation signals:** - Direct imports of concrete implementations - Global singletons for RNG, config, I/O - Hard-coded dependencies **Action:** Inject dependencies. Use explicit context/environment objects passed to systems. ## Module Organization ### File Granularity - **Non-trivial types** (classes, structs, complex components): Dedicate a file - **Related utilities/functions**: Group by cohesive purpose in single module - **Avoid**: Grab-bag "utils" files - group by purpose instead ### Layering Establish clear dependency directions: ``` core → domain → application → UI ``` **Rules:** - Lower layers never import from higher layers (this preserves dependency direction) - Mark any temporary violations and track cleanup - Use barrel/index files only for public APIs - Internal modules import directly; external consumers use public API - Avoid circular dependencies ## Side Effects & Boundaries ### Pure vs Impure Separation Separate pure computation from side effects. **Pure (no side effects):** - Calculations, transformations, business logic - Receives all inputs as parameters - Returns results without modifying external state **Impure (side effects):** - I/O operations (file, network, database) - Random number generation - Time/date operations - Logging, metrics ### Dependency Injection Systems receive these via injection for deterministic testing: - Clocks - RNG (seeded for reproducibility) - I/O adapters ### Boundary Modules Push I/O and external integrations to small, well-named boundary modules at system edges. **When refactoring:** Bias toward making core logic purer and pushing side effects outward. ## Quick Reference Checklist Before committing code changes: - [ ] Can each module's purpose be described in one sentence? - [ ] Is domain logic free from infrastructure concerns? - [ ] Are dependencies injected, not hard-coded? - [ ] Do lower layers avoid importing from higher layers? - [ ] Are side effects pushed to system boundaries? - [ ] Is the code testable without mocking I/O?
Related in Writing & Docs
jax-development
IncludedUse this skill when the user is writing, debugging, profiling, refactoring, reviewing, benchmarking, parallelising, exporting, or explaining JAX code, or when they mention JAX, jax.numpy, jit, grad, value_and_grad, vmap, scan, lax, random keys, pytrees, jax.Array, sharding, Mesh, PartitionSpec, NamedSharding, pmap, shard_map, Pallas, XLA, StableHLO, checkify, profiler, or the JAX repo. It helps turn NumPy or PyTorch-style code into pure functional JAX, fix tracer/control-flow/shape/PRNG bugs, remove recompiles and host-device syncs, choose transforms and sharding strategies, inspect jaxpr/lowering/IR, and benchmark compiled code correctly.
nature-article-writer
IncludedDrafts, rewrites, diagnostically critiques, and style-calibrates primary research manuscripts for Nature and Nature Portfolio journals. Use when the user wants a Nature-style title, summary paragraph or abstract, introduction, results, discussion, methods, figure legends, presubmission enquiry, cover letter, reviewer response, or when a scientific draft sounds generic, jargon-heavy, structurally weak, or AI-ish and needs precise, broad-reader-friendly prose without inventing data, analyses, or references. Best for primary research articles and letters rather than reviews or press releases unless explicitly adapting one.
deckrd
IncludedDocument-driven framework that derives requirements, specifications, implementation plans, and executable tasks from goals through structured AI dialogue. Use when user says "write requirements", "create spec", "plan implementation", "derive tasks", "structure this feature", "break down into tasks", or "document this module". Also use for reverse engineering existing code into docs (/deckrd rev). Do NOT use for direct code writing — use /deckrd-coder after tasks are generated. Do NOT use when the user only wants to run or fix existing code without planning.
clinical-decision-support
IncludedGenerate professional clinical decision support (CDS) documents for pharmaceutical and clinical research settings, including patient cohort analyses (biomarker-stratified with outcomes) and treatment recommendation reports (evidence-based guidelines with decision algorithms). Supports GRADE evidence grading, statistical analysis (hazard ratios, survival curves, waterfall plots), biomarker integration, and regulatory compliance. Outputs publication-ready LaTeX/PDF format optimized for drug development, clinical research, and evidence synthesis.
handling-sf-data
IncludedSalesforce data operations with 130-point scoring. Use this skill to create, update, delete, bulk import/export, generate test data, and clean up org records using sf CLI and anonymous Apex. TRIGGER when: user creates test data, performs bulk import/export, uses sf data CLI commands, needs data factory patterns for Apex tests, or needs to seed/clean records in a Salesforce org. DO NOT TRIGGER when: SOQL query writing only (use querying-soql), Apex test execution (use running-apex-tests), or metadata deployment (use deploying-metadata).
accelint-ac-to-playwright
IncludedConvert and validate acceptance criteria for Playwright test automation. Use when user asks to (1) review/evaluate/check if AC are ready for automation, (2) assess if AC can be converted as-is, (3) validate AC quality for Playwright, (4) turn AC into tests, (5) generate tests from acceptance criteria, (6) convert .md bullets or .feature Gherkin files to Playwright specs, (7) create test automation from requirements. Handles both bullet-style markdown and Gherkin syntax with JSON test plan generation and validation.