| name | compiler-architecture-validator |
| description | Validates Fakt implementation follows compiler plugin best practices including two-phase FIR→IR compilation, context-driven generation, CompilerPluginRegistrar structure, and IrGenerationExtension patterns. Use when validating architectural patterns, verifying compiler plugin structure, checking code quality, or when user mentions "architecture", "validate patterns", "compiler plugin", "check structure", or specific component names. |
| allowed-tools | Read, Grep, Glob, TodoWrite |
Compiler Architecture Validator
Validates Fakt compiler plugin implementation follows industry-standard architectural patterns and best practices.
Core Mission
Ensures Fakt follows proven Metro patterns for Kotlin compiler plugins: two-phase FIR→IR compilation, context-driven generation, proper extension registration, and professional code organization.
Instructions
1. Determine Validation Scope
Extract from conversation:
- Specific component: "validate Metro alignment for UnifiedFaktIrGenerationExtension"
- General check: "check Metro patterns", "validate architecture"
- Default: Validate ALL components if no specific mention
Components available for validation:
- CompilerPluginRegistrar - Plugin registration and configuration
- IrGenerationExtension - IR generation logic
- FirExtensionRegistrar - FIR phase detection
- Context Pattern - IrFaktContext usage
- Error Handling - Diagnostic patterns
- Testing Structure - Test organization
If unclear:
Ask: "Would you like me to validate a specific component or check all Metro pattern alignment?"
Options: all | plugin-registrar | ir-extension | fir-extension | context | error-handling | testing
2. Load Metro Pattern Reference
For detailed Metro patterns:
- Consult
resources/metro-patterns-reference.md - Or use fakt-docs-navigator:
.claude/docs/development/metro-alignment.md
Metro Architecture Baseline:
- Two-phase FIR → IR compilation
- Context-driven generation (IrMetroContext)
- CompilerPluginRegistrar with supportsK2 = true
- FirExtensionRegistrar + IrGenerationExtension
- Professional error handling with diagnostics
3. Validate CompilerPluginRegistrar Pattern
Read Fakt implementation:
Read compiler/src/main/kotlin/com/rsicarelli/fakt/compiler/FaktCompilerPluginRegistrar.kt
Metro Pattern Checklist:
- Extends
CompilerPluginRegistrar -
override val supportsK2: Boolean = true - Options loading pattern (FaktOptions.load())
- FIR extension registration (FirExtensionRegistrarAdapter)
- IR extension registration (IrGenerationExtension)
- Proper enabled check before registration
Comparison with Metro:
// Metro pattern:
class MetroCompilerPluginRegistrar : CompilerPluginRegistrar() {
override val supportsK2: Boolean = true
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
val options = MetroOptions.load(configuration)
if (!options.enabled) return
FirExtensionRegistrarAdapter.registerExtension(MetroFirExtensionRegistrar(...))
IrGenerationExtension.registerExtension(MetroIrGenerationExtension(...))
}
}
// Fakt should follow similar structure
Validation Output:
🔍 VALIDATING: CompilerPluginRegistrar Pattern
📋 Metro Pattern Requirements:
✅ CompilerPluginRegistrar inheritance
✅ supportsK2 = true
✅ Options loading
✅ FIR extension registration
✅ IR extension registration
📋 Fakt Implementation:
{Check each requirement and mark ✅ or ❌}
🎯 ALIGNMENT SCORE: {percentage}%
{List deviations if any}
4. Validate IrGenerationExtension Pattern
Read Fakt implementation:
Read compiler/src/main/kotlin/com/rsicarelli/fakt/compiler/ir/UnifiedFaktIrGenerationExtension.kt
Metro Pattern Checklist:
- Extends
IrGenerationExtension - Creates context object (IrFaktContext)
- Uses
context()for scoping - Separates
generate()and internal generation logic - Proper moduleFragment traversal
- Error handling with diagnostics
Comparison with Metro:
// Metro pattern:
class MetroIrGenerationExtension : IrGenerationExtension {
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
val context = IrMetroContext(pluginContext, messageCollector, symbols)
context(context) { generateInner(moduleFragment) }
}
context(context: IrMetroContext)
private fun generateInner(moduleFragment: IrModuleFragment) {
// Context-scoped generation logic
}
}
// Fakt should align
Validation Output:
🔍 VALIDATING: IrGenerationExtension Pattern
📋 Metro Pattern Requirements:
✅ IrGenerationExtension inheritance
✅ Context object creation
✅ context() scoping usage
✅ Separated generation logic
✅ Module traversal patterns
📋 Fakt Implementation:
{Check each requirement}
🎯 ALIGNMENT SCORE: {percentage}%
{List deviations}
5. Validate Context Pattern
Check for IrFaktContext:
Grep pattern="class.*Context" compiler/src/main/kotlin/com/rsicarelli/fakt/compiler/
Metro Context Pattern Requirements:
- Dedicated context class (IrFaktContext)
- Bundles all generation dependencies
- Contains pluginContext, messageCollector, options
- Used with
context()for scoping - Provides context-specific utilities
Comparison:
// Metro pattern:
data class IrMetroContext(
val pluginContext: IrPluginContext,
val messageCollector: MessageCollector,
val symbols: Symbols,
val options: MetroOptions
) {
val irFactory = pluginContext.irFactory
val irBuiltIns = pluginContext.irBuiltIns
}
// Fakt should have similar IrFaktContext
Validation Output:
🔍 VALIDATING: Context Pattern
📋 Metro Pattern Requirements:
✅ Dedicated context class
✅ Bundles dependencies
✅ Used for scoping
✅ Provides utilities
📋 Fakt Implementation:
{Check each}
🎯 ALIGNMENT SCORE: {percentage}%
6. Validate FIR Phase Implementation
Check for FirExtensionRegistrar:
Read compiler/src/main/kotlin/com/rsicarelli/fakt/compiler/fir/FaktFirExtensionRegistrar.kt
Metro FIR Pattern Requirements:
- FirExtensionRegistrar implementation
- @Fake annotation detection in FIR phase
- Validation before IR phase
- Passes metadata to IR phase
- Proper error reporting
Validation Output:
🔍 VALIDATING: FIR Phase Implementation
📋 Metro Pattern Requirements:
✅ FirExtensionRegistrar present
✅ Annotation detection
✅ Validation logic
✅ Metadata passing
📋 Fakt Implementation:
{Check each}
🎯 ALIGNMENT SCORE: {percentage}%
7. Validate Error Handling Patterns
Check diagnostic patterns:
Grep pattern="(messageCollector|reportError|reportWarning)" compiler/src/main/kotlin/com/rsicarelli/fakt/compiler/
Metro Error Handling Requirements:
- MessageCollector usage
- Proper error reporting with location
- Warning for non-critical issues
- Graceful failures (no crashes)
- User-friendly error messages
Comparison:
// Metro pattern:
if (!isValidComponent(element)) {
context.messageCollector.report(
CompilerMessageSeverity.ERROR,
"Invalid component structure",
CompilerMessageLocationWithRange.create(element.location)!!
)
return
}
// Fakt should follow similar diagnostic patterns
Validation Output:
🔍 VALIDATING: Error Handling Patterns
📋 Metro Pattern Requirements:
✅ MessageCollector usage
✅ Error reporting with location
✅ Warning for non-critical
✅ Graceful failures
📋 Fakt Implementation:
{Check each}
🎯 ALIGNMENT SCORE: {percentage}%
8. Validate Testing Structure
Check test organization:
ls -la compiler/src/test/kotlin/com/rsicarelli/fakt/compiler/
Metro Testing Pattern Requirements:
- Separate compiler-tests/ module (optional, future)
- Comprehensive integration tests
- Test fixtures for common scenarios
- Compilation validation tests
- GIVEN-WHEN-THEN naming
Note: Metro has compiler-tests/ module. Fakt can follow similar organization in future.
Validation Output:
🔍 VALIDATING: Testing Structure
📋 Metro Pattern Recommendations:
⚠️ Dedicated compiler-tests module (future improvement)
✅ Integration tests present
✅ GIVEN-WHEN-THEN patterns
✅ Compilation validation
📋 Fakt Implementation:
{Check each}
🎯 ALIGNMENT SCORE: {percentage}%
9. Generate Comprehensive Report
Overall alignment report:
═══════════════════════════════════════════════════
🏗️ METRO PATTERN COMPLIANCE VALIDATION REPORT
═══════════════════════════════════════════════════
📊 OVERALL ALIGNMENT SCORE: {average}%
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ COMPONENT SCORES:
1. CompilerPluginRegistrar Pattern: {score}%
{Brief status and key points}
2. IrGenerationExtension Pattern: {score}%
{Brief status}
3. Context Pattern: {score}%
{Brief status}
4. FIR Phase Implementation: {score}%
{Brief status}
5. Error Handling: {score}%
{Brief status}
6. Testing Structure: {score}%
{Brief status}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 KEY ALIGNMENTS (What's working well):
- {List strong alignments}
⚠️ DEVIATIONS FROM METRO (Areas for improvement):
- {List deviations}
📋 RECOMMENDATIONS:
1. {Recommendation 1}
2. {Recommendation 2}
...
🔗 REFERENCES:
- Metro Source: metro/compiler/src/main/kotlin/.../
- Fakt Docs: .claude/docs/development/metro-alignment.md
- Pattern Guide: resources/metro-patterns-reference.md
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ NEXT STEPS:
{Actionable next steps to improve alignment}
═══════════════════════════════════════════════════
10. Suggest Improvements
Based on validation results, suggest:
High Priority (Low alignment scores):
- Missing patterns that are critical
- Architectural deviations that impact quality
- Safety/correctness issues
Medium Priority:
- Style/organization improvements
- Optional Metro patterns not yet adopted
- Documentation gaps
Low Priority:
- Nice-to-have Metro features
- Advanced patterns for future consideration
Supporting Files
Progressive disclosure for Metro patterns:
resources/metro-patterns-reference.md- Complete Metro pattern catalog (loaded on-demand)resources/compiler-plugin-best-practices.md- Best practices from Metro (loaded on-demand)resources/metro-code-examples.md- Code examples from Metro source (loaded on-demand)
Related Skills
This Skill composes with:
fakt-docs-navigator- Access Metro alignment docskotlin-ir-debugger- Debug IR generation issues foundkotlin-api-consultant- Validate Kotlin API usage
Validation Scope Matrix
| Component | What's Validated | Metro Reference |
|---|---|---|
| CompilerPluginRegistrar | Registration, options, K2 support | MetroCompilerPluginRegistrar.kt |
| IrGenerationExtension | Generation logic, context usage | MetroIrGenerationExtension.kt |
| FirExtensionRegistrar | Annotation detection, validation | MetroFirExtensionRegistrar.kt |
| Context Pattern | IrFaktContext structure | IrMetroContext in Metro |
| Error Handling | MessageCollector, diagnostics | Error handling throughout Metro |
| Testing | Test structure, organization | metro/compiler-tests/ |
Best Practices
- Compare don't copy - Understand Metro patterns but adapt to Fakt needs
- Score objectively - Base scores on actual code inspection
- Prioritize critical patterns - CompilerPluginRegistrar and IrGenerationExtension first
- Document deviations - Explain why Fakt deviates if intentional
- Actionable recommendations - Suggest concrete next steps
Metro Alignment Philosophy
Why follow Metro patterns:
- Proven in production (Slack uses Metro)
- K2 compiler ready
- Professional architecture
- Clear separation of concerns
- Robust error handling
When to deviate:
- Fakt-specific requirements
- Simpler patterns work better
- Different problem domain (test fakes vs DI)
Goal: Not blind copying but principled adaptation
Known Metro Patterns to Follow
- Two-Phase Compilation: FIR detection → IR generation
- Context-Driven: Bundle dependencies in context object
- Options Pattern: Load configuration from CompilerConfiguration
- Error Diagnostics: MessageCollector with proper severity
- K2 Support: supportsK2 = true
- Testing Rigor: Comprehensive compiler tests
Current Fakt Status (Phase 1)
Expected alignment ~70-80% because:
- ✅ IR generation working
- ✅ Two-phase approach started
- ⚠️ Context pattern partial
- ⚠️ FIR phase basic
- ⚠️ Testing structure evolving
Phase 2 Target: 90%+ alignment with full Metro patterns