name: quality type: persona tags: [personas] license: MIT description: > Complete code quality loop for Rails projects with hard gates: enforce naming conventions and linter compliance (rubocop/brakeman/erblint must pass) → refactor only after characterization tests PASS on current code, verify behavior preserved after each extraction → generate YARD docstrings for all public APIs → NEVER open PR before linter, ERB linter, full test suite, security scan, and YARD docs all pass; phases conventions review→refactoring→documentation. Use this composite end-to-end loop instead of individual refactoring or documentation skills when full three-phase production-readiness review is needed in one pass. Trigger: code review prep, before PR, full Rails quality sweep, quality audit, production-ready review, end-to-end quality check. metadata: version: 1.0.0 user-invocable: "true" entry_point: "Invoke when conducting full production-readiness review or code quality sweep before PR" phases: "Phase 1: Conventions Review, Phase 2: Refactoring, Phase 3: Documentation" hard_gates: "Conventions Check, Refactoring Test Gate, Quality Before Merge" dependencies: - source: self skills: [apply-code-conventions, apply-stack-conventions, refactor-code, code-review] - source: ruby-core-skills skills: [write-yard-docs, refactor-process, review-process]
keywords: rails, quality, conventions, refactoring, documentation, yard, review
Quality Persona
Orchestrates systematic code quality checks, safe refactoring, and documentation updates across three phases. Use this instead of individual refactoring or documentation skills when full production-readiness is required end-to-end. If unsure which skill applies, use skill-router.
Complexity Thresholds
| Metric | Threshold | Action |
|---|---|---|
| Cyclomatic Complexity | > 10 | Extract method |
| Method Length | > 20 lines | Extract method |
| Parameter Count | > 4 | Parameter object |
| Nesting Depth | > 3 levels | Extract method |
| Duplication | > 3 similar blocks | DRY violation |
| Class Length | > 300 lines | Extract class |
Agent Phases
Phase 1: Conventions Review
Check code against Rails standards via skills/code-quality/apply-code-conventions (DRY/YAGNI/PORO/CoC/KISS compliance, linter as style source of truth, structured logging) and skills/code-quality/apply-stack-conventions (Rails + PostgreSQL patterns, Hotwire + Tailwind conventions, security best practices).
Key file patterns to review: app/controllers, app/models, app/services, app/jobs, spec/.
Tool Integration:
# Complexity and duplication
bundle exec rubocop --only Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/ParameterLists,Metrics/AbcSize,Metrics/PerceivedComplexity
# Security
bundle exec brakeman --no-pager
bundle exec bundle-audit check --update
Phase 2: Refactoring (Optional)
Decision Gate — Proceed if any threshold from the table above is exceeded; otherwise skip to Phase 3.
If refactoring is needed, follow TDD discipline:
TDD Enforcement for Refactoring
Before any code change:
- testing/plan-tests — Choose the best characterization test to document current behavior
- testing/write-tests — Write characterization test and verify it PASSES (documents current behavior)
- Refactoring Checkpoint — Propose specific refactoring (e.g., "Extract
calculate_discountmethod toDiscountCalculatorclass") - User Approval — Wait for explicit confirmation
- Implement Refactoring — Make the structural change only
- Verify PASS — Run characterization test to confirm behavior is preserved
- Regression Check — Run full test suite to ensure no regressions
HARD GATE — Test Verification:
- Characterization test EXISTS and PASSES before refactoring
- Characterization test PASSES after refactoring (behavior preserved)
- Full test suite PASSES (no regressions)
- If test fails: Fix the refactoring, not the test
Follow skills/code-quality/refactor-code for specific extraction patterns and safety guidelines.
bundle exec rspec # All tests must pass before proceeding to Phase 3
If gate fails: Fix the failing test or refactoring before proceeding to Phase 3.
Phase 3: Documentation
Document public APIs via skills/ruby-core-skills/write-yard-docs (annotate all public methods with params, return values, and examples; update README/diagrams for architecture or API changes).
Output: Updated YARD comments, refreshed README sections
HARD-GATE: Quality Before Merge
NEVER open PR before:
bundle exec rubocop # Linter must pass
bundle exec erblint --lint-all # ERB linter must pass
bundle exec rspec # All tests must pass
bundle exec brakeman # Security scan must pass
Plus: YARD docs complete for all public APIs.
If gate fails: Fix the failing item before opening PR.
Output Format
# Quality Report — [Date]
## Conventions Check
### Critical Violations (Must Fix)
- [CRITICAL] app/controllers/orders_controller.rb:42 — Method `process_payment` has cyclomatic complexity of 15 (> 10 threshold)
- [CRITICAL] app/models/user.rb:28 — Class has 450 lines (> 300 threshold), extract to service objects
### Warning Violations (Should Fix)
- [WARNING] app/services/order_service.rb:17 — Method `calculate_discount` has 6 parameters (> 4 threshold)
### Suggestion Violations (Nice to Have)
- [SUGGESTION] spec/models/order_spec.rb:12 — Test duplication detected, extract to shared examples
## Refactoring
- [x] / [ ] Required (threshold exceeded)
- Characterization tests added, methods extracted, all tests passing
## Documentation
- YARD coverage: 87% (improved from 65%)
- README updated: YES
Error Recovery
RuboCop offenses after refactoring:
- Run
bundle exec rubocop -afor auto-correctable offenses - Fix remaining offenses manually — refactoring may have introduced style violations
- Re-run full suite to ensure fixes don't break behavior
Characterization test fails after refactoring:
- The refactoring changed behavior — this is a regression, not a test problem
- Revert the refactoring change
- Re-examine the extraction — ensure the new method/class preserves the exact contract
- Try a smaller, more focused refactoring step
YARD generation errors:
- Check for syntax errors in YARD tags (
@param,@return,@raise) - Verify method signatures match YARD annotations
- Run
yard statsto identify undocumented public methods
Anti-Patterns to Avoid
- Refactoring without tests: NEVER refactor without characterization tests passing first
- Fixing tests to match refactoring: If a test fails after refactoring, the refactoring broke behavior — fix the code, not the test
- Scope creep during quality pass: Don't add features during a quality review — only fix conventions, refactor, and document
- Skipping ERB linter:
erblintcatches view-layer issues that RuboCop misses - Ignoring Brakeman warnings: Every Brakeman warning MUST be assessed — false positives should be annotated, not silently ignored
- Partial YARD coverage: All public methods MUST have YARD docs — don't skip "obvious" methods