…izable type behind its declared return type
A synchronous factory whose declared return type is plainer than the concrete type it builds hides that type's asynchronous initialization from the container: the container reads async-init taint off the declared return type, so a concrete IAsyncInitializable returned behind an interface is never initialized and is handed out uninitialized. This adds a best-effort, zero-false-positive lint that inspects the factory method's own return expressions (expression-bodied and block-bodied, never descending into nested lambdas or local functions) and fires only when the statically determined returned type is provably a non-abstract, non-interface named type that is async-initializable while the declared return type is not. Metadata-only factories and unanalyzable returns are left silent; helper-returned or runtime-selected implementations are accepted false negatives.
The lint is scoped to the one capability with no other compile-time signal and no runtime safety net. A hidden IDisposable is not reported: the container already disposes factory outputs behind a runtime is-IDisposable check, so it does not leak. An asynchronous Task<T> / ValueTask<T> factory is not reported either: it is the explicit manual-initialization escape hatch, so the container awaits the factory and trusts it to initialize its result - matching how the container declines to drive InitializeAsync on an async factory's produced type.
Severity Warning, since the lint has false negatives by design. The id reuses the retired AWT106 slot (the old per-registration disposable-transient check, removed before it ever shipped), filling the numbering gap.
Taint and disposability for a factory registration are read off the producer method's declared return type, so a concrete type that implements
IAsyncInitializableorIDisposablebut is returned behind a plainer interface is invisible to the container: its async initialization never runs, or its disposable is never disposed. This adds a best-effort, zero-false-positive lint that inspects the factory method's own return expressions (expression-bodied and block-bodied, never descending into nested lambdas or local functions) and fires only when the statically determined returned type is provably a non-abstract, non-interface named type carrying a capability the declared return type does not expose. Metadata-only factories and unanalyzable returns are left silent; helper-returned or runtime-selected implementations are accepted false negatives.Severity Warning, since the lint has false negatives by design. One descriptor with a {capability} placeholder (async-initializable / disposable) keeps the AWT numbering tight.