vanilla-rails-models
Use when writing Rails models - enforces state-as-records not booleans, concerns as adjectives namespaced under model, and concern extraction triggers
What this skill does
# Vanilla Rails Models
Rich domain models with concerns. Decompose with concerns, not services.
**For method ordering and private indentation rules, see vanilla-rails-style.**
## State as Separate Records (NOT Booleans)
Don't use boolean columns for state. Create state records that capture who/when.
```ruby
# Bad - boolean
add_column :cards, :starred, :boolean, default: false
# Good - state record
create_table :stars, id: :uuid do |t|
t.uuid :card_id, null: false
t.uuid :user_id, null: false
t.timestamps
end
```
```ruby
class Card < ApplicationRecord
has_one :star, dependent: :destroy
def star(user: Current.user)
create_star!(user: user) unless starred?
end
def starred?
star.present?
end
end
```
**Binary state (one per item):** `has_one` — `closure`, `triage`, `goldness`
**Multi-user state:** `has_many` — `pins`, `watches`, `assignments`
## Concerns as Adjectives, Namespaced Under Model
Name as adjectives (-able/-ible ONLY). Namespace under the model. File at `app/models/card/closeable.rb`.
| Wrong | Right | Why |
|-------|-------|-----|
| `Card::Closing` | `Card::Closeable` | Verb → adjective |
| `Card::Stars` | `Card::Starrable` | Noun → adjective |
| `Card::Closed` | `Card::Closeable` | Past participle → capability |
| `Starrable` | `Card::Starrable` | Must namespace under model |
| `concerns/starrable.rb` | `card/starrable.rb` | File under model directory |
**Full pattern:**
```ruby
# app/models/card/closeable.rb
module Card::Closeable
extend ActiveSupport::Concern
included do
has_one :closure, dependent: :destroy
scope :closed, -> { joins(:closure) }
scope :open, -> { where.missing(:closure) }
end
def close(user: Current.user)
unless closed?
transaction do
create_closure!(user: user)
track_event :closed, creator: user
end
end
end
def reopen(user: Current.user)
if closed?
transaction do
closure&.destroy
track_event :reopened, creator: user
end
end
end
def closed?
closure.present?
end
end
```
**Multi-user pattern:**
```ruby
module Card::Pinnable
extend ActiveSupport::Concern
included do
has_many :pins, dependent: :destroy
end
def pinned_by?(user)
pins.exists?(user: user)
end
def pin_by(user)
pins.find_or_create_by!(user: user)
end
def unpin_by(user)
pins.find_by(user: user)&.destroy
end
end
```
## When to Extract
- Feature adds 3+ methods to model
- Clear adjective name exists (-able/-ible)
- Even if only one model uses it (decomposition, not just reuse)
- Model exceeds ~100 lines
## Red Flags
| Red flag | Fix |
|----------|-----|
| Boolean column for state | State record table (see data-modeling) |
| Concern not ending in -able/-ible | Rename immediately |
| Concern not namespaced under model | Move to `Card::Closeable` |
| Concern in `app/models/concerns/` for single model | Move to `app/models/card/` |
| Service object for domain logic | Rich model method instead |
| "Only extract if reused" | Extract for decomposition at 3+ methods |
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.