169168cea9
Flips the container live. Plugin.ctor now builds the host after the schema gate clears, pulls PluginLifecycle out of the container, and backfills the Plugin.X static surface plus the instance properties (11 services + 8 windows) so existing consumers reach the same instances the container holds. Plugin.LoadAsync gets thinner: service and window allocations are gone (the container owns them), BuildFonts / Switch / FilterAllTabsAsync / Initialize moved to their hosted-service adapters inside Host.StartAsync, WindowSystem.AddWindow moved into PluginLifecycle.LoadAsync on the framework thread. Plugin-internal init (SelfTestRegistry, FirstRunWizard, SetupCommands + Commands.Initialise, RetentionSweep, EmoteCache.LoadData, FTS5 rebuild worker, UiBuilder.Disable*UiHide, AutoTranslate.PreloadCache, Framework / Draw / LanguageChanged subscribes) stays in Plugin.LoadAsync because each step reaches Plugin-private members or fields. Plugin.DisposeAsync keeps the manual teardown for ordering (IPC before windows, hooks first) and awaits _lifecycle.DisposeAsync at the end to stop the host and dispose the container on the framework thread. Double-disposes against container singletons are no-ops for the services that hold real resources (Dispose idempotency is the standard pattern). PluginLifecycle takes Plugin as a constructor arg so it can iterate the Window properties and call WindowSystem.AddWindow on the framework thread; v1.4.9 Stage-2 verified that AddWindow's backing List<> is not thread-safe. Plan drift D4 noted: Plugin.cs ends at 1050 lines instead of the 150-220 vision because helper methods (MigrateFromChatTwoLayout, SeedExampleThemeIfEmpty, RunRetentionSweepIfDue, FrameworkUpdate, Draw, LanguageChanged, SetupCommands, slash handlers, FTS worker) stay in Plugin.cs. Extracting them is DI-2b or a dedicated service refactor in v1.5.1+. C3 still hits the DI-2a goal: bootstrap is container-driven and LoadAsync is allocation-free. PlatformUtil and LogProxy keep the manual `new` for now; C5 (DI-3) removes those once C3 stabilises in the smoke test.