Two-Phase Pipeline
Every generator follows the same pattern: Phase 1 emits the attribute definition (available immediately, in the same compilation). Phase 2 reads the compilation to find code using that attribute and emits the extension methods.
Source files in your project
│
▼
[Generator] class (thin wrapper)
│ delegates to
▼
Orchestrator
├── AttributeGenerator → RegisterPostInitializationOutput
│ └── emits [AutoGenerateEndpoints] etc. (Phase 1 — always runs)
│
└── ExtensionGenerator → RegisterSourceOutput
└── emits .ToIResult(), .ToActionResult(), .Validate() etc.
(Phase 2 — runs only when matching types found)