Paths: File paths (
references/,../ln-*) are relative to this skill directory.
Duplication & Over-Abstraction Auditor (L3 Worker)
Type: L3 Worker
Specialized worker auditing duplication, over-abstraction, and unused extensibility.
Purpose & Scope
- Audit duplication and over-abstraction (DRY/KISS/YAGNI)
- Return structured findings with severity, location, effort, pattern_signature, recommendations
- Emit
MERGE_DUPLICATION,REMOVE_ABSTRACTION, orREMOVE_YAGNI - Calculate compliance score (X/10) for Duplication & Over-Abstraction category
Inputs
MANDATORY READ: Load references/audit_worker_core_contract.md.
Tool policy: follow host AGENTS.md MCP preferences; load references/mcp_tool_preferences.md and references/mcp_integration_patterns.md only when host policy is absent or MCP behavior is unclear.
Receives contextStore with: tech_stack, best_practices, principles, codebase_root, output_dir.
Domain-aware: Supports domain_mode + current_domain (see audit_output_schema.md#domain-aware-worker-output).
Use hex-graph first when clone groups, implementations, or semantic relationships materially improve the audit. Use hex-line first for local code reads when available. If MCP is unavailable, unsupported, or not indexed, continue with built-in Read/Grep/Glob/Bash and state the fallback in the report.
Workflow
Detection policy: use two-layer detection (candidate scan, then context verification); load references/two_layer_detection.md only when the verification method is ambiguous.
- Parse context -- extract fields, determine
scan_path(domain-aware if specified), extractoutput_dir - Load detection patterns
- MANDATORY READ: Load
references/detection_patterns.mdfor language-specific Grep/Glob patterns - Select patterns matching project's
tech_stack
- MANDATORY READ: Load
- Scan codebase for violations (Layer 1)
- All Grep/Glob patterns use
scan_path(not codebase_root) - Graph acceleration (if available): IF
contextStore.graph_indexedOR.hex-skills/codegraph/index.dbexists:- DRY (1.1-1.10):
audit_workspace(path=scan_path, verbosity="minimal", limit=5, clone_member_limit=3)-- each returned clone group = DRY candidate. Raise limits only for deliberate drill-down. Use clone kind and hotspot context for severity triage. Fall back to grep patterns if unavailable. - KISS inheritance:
find_implementations(symbol)for abstract classes -- count implementations (1 = KISS candidate). Trace inheritance depth via graph. - Complexity:
audit_workspace(path=scan_path, verbosity="minimal", limit=5)-- use returned hotspots to pre-identify complex functions for KISS/quality analysis. Raiselimitonly for deliberate drill-down. - Outline-first read:
outline(file_path)before reading large source files -- understand structure before analyzing principles.
- DRY (1.1-1.10):
- Follow step-by-step detection from
detection_patterns.md - Apply exclusions from
detection_patterns.md#exclusions
- All Grep/Glob patterns use
- Analyze context per candidate (Layer 2)
- DRY: read both code blocks to confirm true duplication (not just similar naming or shared interface)
- KISS: check if abstraction serves DI pattern (valid single-impl interface) or is premature
- YAGNI: check if feature flag was recently added (intentional) or dormant for months
- Generate recommendations
- MANDATORY READ: Load
references/refactoring_decision_tree.mdfor pattern selection - Match each finding to appropriate refactoring pattern via decision tree
- MANDATORY READ: Load
- Collect findings with severity, location, effort, pattern_id, pattern_signature, recommendation
- Tag each finding with
domain: domain_name(if domain-aware) - Assign
pattern_signaturefor managed aggregation
- Tag each finding with
- Calculate score using penalty algorithm
- Write Report: Build full markdown report in memory per
references/templates/audit_worker_report_template.md, write to{output_dir}/ln-623--{domain}.md(or623-principles.mdin global mode) in single Write call. Include<!-- FINDINGS-EXTENDED -->JSON block with pattern_signature fields for cross-domain DRY analysis - Return Summary: Return minimal summary (see Output Format)
Two-Layer Detection
Detection policy: use two-layer detection (candidate scan, then context verification); load references/two_layer_detection.md only when the verification method is ambiguous.
All findings require Layer 2 context analysis. Layer 1 finding without Layer 2 = NOT a valid finding. Before reporting, ask: "Is this violation intentional or justified by design?"
| Finding Type | Layer 2 Downgrade Examples |
|---|---|
| DRY | Modules with different lifecycle/ownership -> skip. Intentional duplication for decoupling -> skip |
| KISS | Framework-required abstraction (e.g., DI in Spring) -> downgrade. Single implementation today but interface for testing -> skip |
| YAGNI | Feature flag used in A/B testing -> skip. Config option used by ops team -> skip |
Audit Rules
1. DRY Violations (Don't Repeat Yourself)
MANDATORY READ: Load references/detection_patterns.md for detection steps per type.
| Type | What | Severity | Exception (skip/downgrade) | Default Recommendation | Effort |
|---|---|---|---|---|---|
| 1.1 Identical Code | Same functions/constants/blocks (>10 lines) in multiple files | HIGH: business-critical (auth, payment). MEDIUM: utilities. LOW: simple constants <5x | Different lifecycle/ownership modules -> skip. Intentional decoupling -> skip | Extract function -> decide location by duplication scope | M |
| 1.2 Duplicated Validation | Same validation patterns (email, password, phone, URL) across files | HIGH: auth/payment. MEDIUM: user input 3+x. LOW: format checks <3x | Different security contexts (auth vs public) -> skip | Extract to shared validators module | M |
| 1.3 Repeated Error Messages | Hardcoded error strings instead of centralized catalog | MEDIUM: critical messages hardcoded or no error catalog. LOW: <3 places | User-facing strings requiring per-context wording -> downgrade | Create constants/error-messages file | M |
| 1.4 Similar Patterns | Functions with same call sequence/control flow but different names/entities | MEDIUM: business logic in critical paths. LOW: utilities <3x | Modules with divergent evolution expected -> skip | Extract common logic (see decision tree for pattern) | M |
| 1.5 Duplicated SQL/ORM | Same queries in different services | HIGH: payment/auth queries. MEDIUM: common 3+x. LOW: simple <3x | Different bounded contexts; shared DB is worse than duplication -> skip | Extract to Repository layer | M |
| 1.6 Copy-Pasted Tests | Identical setup/teardown/fixtures across test files | MEDIUM: setup in 5+ files. LOW: <5 files | Tests intentionally isolated for clarity/independence -> downgrade | Extract to test helpers | M |
| 1.7 Repeated API Responses | Same response object shapes without DTOs | MEDIUM: in 5+ endpoints. LOW: <5 endpoints | Responses with different versioning lifecycle -> skip | Create DTO/Response classes | M |
| 1.8 Duplicated Middleware Chains | Identical middleware/decorator stacks on multiple routes | MEDIUM: same chain on 5+ routes. LOW: <5 routes | Routes with different auth/rate-limit requirements -> skip | Create named middleware group, apply at router level | M |
| 1.9 Duplicated Type Definitions | Interfaces/structs/types with 80%+ same fields | MEDIUM: in 5+ files. LOW: 2-4 files | Types with different ownership/evolution paths -> skip | Create shared base type, extend where needed | M |
| 1.10 Duplicated Mapping Logic | Same entity->DTO / DTO->entity transformations in multiple locations | MEDIUM: in 3+ locations. LOW: 2 locations | Mappings with different validation/enrichment rules -> skip | Create dedicated Mappe |