.claude/skills/ln-511-code-quality-checker/SKILL.md
Worker that checks DRY/KISS/YAGNI/architecture compliance with quantitative Code Quality Score. Validates architectural decisions via MCP Ref: (1) Optimality (2) Compliance (3) Performance. Reports issues with SEC-, PERF-, MNT-, ARCH-, BP-, OPT- prefixes.
npx skillsauth add cbbkrd-tech/jl-finishes ln-511-code-quality-checkerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Paths: File paths (
shared/,references/,../ln-*) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root.
Analyzes Done implementation tasks with quantitative Code Quality Score based on metrics, MCP Ref validation, and issue penalties.
| Metric | Threshold | Penalty | |--------|-----------|---------| | Cyclomatic Complexity | ≤10 OK, 11-20 warning, >20 fail | -5 (warning), -10 (fail) per function | | Function size | ≤50 lines OK, >50 warning | -3 per function | | File size | ≤500 lines OK, >500 warning | -5 per file | | Nesting depth | ≤3 OK, >3 warning | -3 per instance | | Parameter count | ≤4 OK, >4 warning | -2 per function |
Formula: Code Quality Score = 100 - metric_penalties - issue_penalties
Issue penalties by severity:
| Severity | Penalty | Examples | |----------|---------|----------| | high | -20 | Security vulnerability, O(n²)+ algorithm, N+1 query | | medium | -10 | DRY violation, suboptimal approach, missing config | | low | -3 | Naming convention, minor code smell |
Score interpretation:
| Score | Status | Verdict | |-------|--------|---------| | 90-100 | Excellent | PASS | | 70-89 | Acceptable | CONCERNS | | <70 | Below threshold | ISSUES_FOUND |
| Prefix | Category | Default Severity | MCP Ref | |--------|----------|------------------|---------| | SEC- | Security (auth, validation, secrets) | high | — | | PERF- | Performance (algorithms, configs, bottlenecks) | medium/high | ✓ Required | | MNT- | Maintainability (DRY, SOLID, complexity, dead code) | medium | — | | ARCH- | Architecture (layers, boundaries, patterns, contracts) | medium | — | | BP- | Best Practices (implementation differs from recommended) | medium | ✓ Required | | OPT- | Optimality (better approach exists for this goal) | medium | ✓ Required |
OPT- subcategories:
| Prefix | Category | Severity | |--------|----------|----------| | OPT-OSS- | Open-source replacement available (cross-ref ln-645 audit) | medium (high if >200 LOC) |
ARCH- subcategories:
| Prefix | Category | Severity | |--------|----------|----------| | ARCH-LB- | Layer Boundary: I/O outside infra, HTTP in domain | high | | ARCH-TX- | Transaction Boundaries: commit() in 3+ layers, mixed UoW ownership | high (CRITICAL if auth/payment) | | ARCH-DTO- | Missing DTO (4+ params without DTO), Entity Leakage (ORM entity in API response) | medium (high if auth/payment) | | ARCH-DI- | Dependency Injection: direct instantiation in business logic, mixed DI+imports | medium | | ARCH-CEH- | Centralized Error Handling: no global handler, stack traces in prod, uncaughtException | medium (high if no handler at all) | | ARCH-SES- | Session Ownership: DI session + local session in same module | medium | | ARCH-AI-SEB | Side-Effect Breadth: 3+ side-effect categories in one function | medium | | ARCH-AI-AH | Architectural Honesty: read-named function with write side-effects | medium | | ARCH-AI-FO | Flat Orchestration: service imports 3+ other services | medium |
PERF- subcategories:
| Prefix | Category | Severity | |--------|----------|----------| | PERF-ALG- | Algorithm complexity (Big O) | high if O(n²)+ | | PERF-CFG- | Package/library configuration | medium | | PERF-PTN- | Architectural pattern performance | high | | PERF-DB- | Database queries, indexes | high |
MNT- subcategories:
| Prefix | Category | Severity | |--------|----------|----------| | MNT-DC- | Dead code: replaced implementations, unused exports/re-exports, backward-compat wrappers, deprecated aliases | medium (high if public API) | | MNT-DRY- | DRY violations: duplicate logic across files | medium | | MNT-GOD- | God Classes: class with >15 methods or >500 lines (not just file size) | medium (high if >1000 lines) | | MNT-SIG- | Method Signature Quality: boolean flag params, unclear return types, inconsistent naming, >5 optional params | low | | MNT-ERR- | Error Contract inconsistency: mixed raise + return None in same service | medium |
Load Story (full) and Done implementation tasks (full descriptions) via Linear; skip tasks with label "tests".
Collect affected files from tasks (Affected Components/Existing Code Impact) and recent commits/diffs if noted.
Calculate code metrics:
MCP Ref Validation (MANDATORY for code changes — SKIP if --skip-mcp-ref flag passed):
Fast-track mode: When invoked with
--skip-mcp-ref, skip this entire step (no OPT-, BP-, PERF- checks). Proceed directly to step 5 (static analysis). This reduces cost from ~5000 to ~800 tokens while preserving metrics + static analysis coverage.
Level 1 — OPTIMALITY (OPT-):
ref_search_documentation("{goal} approaches comparison {tech_stack} 2026")Level 2 — BEST PRACTICES (BP-):
ref_search_documentation("{chosen_approach} best practices {tech_stack} 2026")query-docs(library_id, "best practices implementation patterns")Level 3 — PERFORMANCE (PERF-):
query-docsref_search_documentation("{pattern} performance bottlenecks")query-docs(orm_library_id, "query optimization")Triggers for MCP Ref validation:
Analyze code for static issues (assign prefixes):
MANDATORY READ: shared/references/clean_code_checklist.md
catch.*Error|handleError, validators: validate|isValid, config access: getSettings|getConfig) across ALL src/ files (count mode). If any pattern appears in 5+ files, sample 3 files (Read 50 lines each) and check structural similarity. If >80% similar → MNT-DRY-CROSS (medium, -10 points): Pattern X duplicated in N files — extract to shared module.export declarations. Then Grep across ALL src/ for import references to those exports. Exports with 0 import references → MNT-DC-CROSS (medium, -10 points): {export} in {file} exported but never imported — remove or mark internal.docs/project/.audit/645-open-source-replacer*.md exists, check if any HIGH-confidence replacement matches files changed in current Story. IF match found → create OPT-OSS-{N} issue with module path, goal, recommended package, confidence, stars, license from ln-645 report. Severity: high if >200 LOC, medium otherwise. This check reads local files only — no MCP calls — runs even with --skip-mcp-ref.Calculate Code Quality Score:
Output verdict with score and structured issues. Add Linear comment with findings.
verdict: PASS | CONCERNS | ISSUES_FOUND
code_quality_score: {0-100}
metrics:
avg_cyclomatic_complexity: {value}
functions_over_50_lines: {count}
files_over_500_lines: {count}
issues:
# OPTIMALITY
- id: "OPT-001"
severity: medium
file: "src/auth/index.ts"
goal: "User session management"
finding: "Suboptimal approach for session management"
chosen: "Custom JWT with localStorage"
recommended: "httpOnly cookies + refresh token rotation"
reason: "httpOnly cookies prevent XSS token theft"
source: "ref://owasp-session-management"
# OPTIMALITY - OSS Replacement (from ln-645, fast-track safe)
- id: "OPT-OSS-001"
severity: high
file: "src/utils/email-validator.ts"
goal: "Email validation with MX checking"
finding: "Custom 245-line module has HIGH-confidence OSS replacement"
chosen: "Custom email-validator.ts (245 lines)"
recommended: "zod + zod-email (28k stars, MIT, 95% coverage)"
reason: "Battle-tested, actively maintained, reduces maintenance burden"
source: "ln-645-audit"
# BEST PRACTICES
- id: "BP-001"
severity: medium
file: "src/api/routes.ts"
finding: "POST for idempotent operation"
best_practice: "Use PUT for idempotent updates (RFC 7231)"
source: "ref://api-design-guide#idempotency"
# PERFORMANCE - Algorithm
- id: "PERF-ALG-001"
severity: high
file: "src/utils/search.ts:42"
finding: "Nested loops cause O(n²) complexity"
current: "O(n²) - nested filter().find()"
optimal: "O(n) - use Map/Set for lookup"
source: "ref://javascript-performance#data-structures"
# PERFORMANCE - Config
- id: "PERF-CFG-001"
severity: medium
file: "src/db/connection.ts"
finding: "Missing connection pool config"
current_config: "default (pool: undefined)"
recommended: "pool: { min: 2, max: 10 }"
source: "context7://pg#connection-pooling"
# PERFORMANCE - Database
- id: "PERF-DB-001"
severity: high
file: "src/repositories/user.ts:89"
finding: "N+1 query pattern detected"
issue: "users.map(u => u.posts) triggers N queries"
solution: "Use eager loading: include: { posts: true }"
source: "context7://prisma#eager-loading"
# ARCHITECTURE - Entity Leakage
- id: "ARCH-DTO-001"
severity: high
file: "src/api/users.ts:35"
finding: "ORM entity returned directly from API endpoint"
issue: "User entity with password hash exposed in GET /users response"
fix: "Create UserResponseDTO, map entity → DTO before return"
# ARCHITECTURE - Centralized Error Handling
- id: "ARCH-CEH-001"
severity: medium
file: "src/app.ts"
finding: "No global error handler registered"
issue: "Unhandled exceptions return stack traces to client in production"
fix: "Add app.use(globalErrorHandler) with sanitized error responses"
# MAINTAINABILITY - God Class
- id: "MNT-GOD-001"
severity: medium
file: "src/services/order-service.ts"
finding: "God class with 22 methods and 680 lines"
issue: "OrderService handles creation, payment, shipping, notifications"
fix: "Extract PaymentService, ShippingService, NotificationService"
# MAINTAINABILITY - Dead Code
- id: "MNT-DC-001"
severity: medium
file: "src/auth/legacy-adapter.ts"
finding: "Backward-compatibility wrapper kept after migration"
dead_code: "legacyLogin() wraps newLogin() — callers already migrated"
action: "Delete legacy-adapter.ts, remove re-export from index.ts"
# MAINTAINABILITY - DRY
- id: "MNT-DRY-001"
severity: medium
file: "src/service.ts:42"
finding: "DRY violation: duplicate validation logic"
suggested_action: "Extract to shared validator"
references/code_metrics.md (thresholds and penalties)docs/guides/shared/templates/task_template_implementation.mdshared/references/clean_code_checklist.mdVersion: 5.0.0 Last Updated: 2026-01-29
testing
When the user wants to plan a content strategy, decide what content to create, or figure out what topics to cover. Also use when the user mentions "content strategy," "what should I write about," "content ideas," "blog strategy," "topic clusters," or "content planning." For writing individual pieces, see copywriting. For SEO-specific audits, see seo-audit.
development
When the user wants to create competitor comparison or alternative pages for SEO and sales enablement. Also use when the user mentions 'alternative page,' 'vs page,' 'competitor comparison,' 'comparison page,' '[Product] vs [Product],' '[Product] alternative,' or 'competitive landing pages.' Covers four formats: singular alternative, plural alternatives, you vs competitor, and competitor vs competitor. Emphasizes deep research, modular content architecture, and varied section types beyond feature tables.
development
Write B2B cold emails and follow-up sequences that get replies. Use when the user wants to write cold outreach emails, prospecting emails, cold email campaigns, sales development emails, or SDR emails. Covers subject lines, opening lines, body copy, CTAs, personalization, and multi-touch follow-up sequences.
development
When the user wants to reduce churn, build cancellation flows, set up save offers, recover failed payments, or implement retention strategies. Also use when the user mentions 'churn,' 'cancel flow,' 'offboarding,' 'save offer,' 'dunning,' 'failed payment recovery,' 'win-back,' 'retention,' 'exit survey,' 'pause subscription,' or 'involuntary churn.' This skill covers voluntary churn (cancel flows, save offers, exit surveys) and involuntary churn (dunning, payment recovery). For post-cancel win-back email sequences, see email-sequence. For in-app upgrade paywalls, see paywall-upgrade-cro.