···219219220220 // Wait for features to be ready via the unified registry.
221221 // Gates on v2 tile readiness via api.features.list — no host window dependency.
222222- const waitForHybridExtensions = async (timeout: number): Promise<void> => {
222222+ const waitForFeaturesReady = async (timeout: number): Promise<void> => {
223223 const start = Date.now();
224224 while (Date.now() - start < timeout) {
225225 try {
···230230 const result = await api.features.list('builtin');
231231 const entries = result?.entries;
232232 if (!Array.isArray(entries)) return false;
233233- // cmd must be registered + at least 3 total builtins discovered.
234234- const hasCmd = entries.some((e: any) => e.id === 'cmd');
235235- return hasCmd && entries.length >= 3;
233233+ // Feature system is up once the registry has discovered a few
234234+ // builtins. (cmd is a core renderer in app/cmd/, not a feature
235235+ // tile, so it never appears in this list.)
236236+ return entries.length >= 3;
236237 });
237238 if (ready) {
238239 return;
···249250 const urls = windows.map(w => w.url());
250251 throw new Error(`Features failed to load within ${timeout}ms. Windows: ${JSON.stringify(urls)}`);
251252 };
252252- await waitForHybridExtensions(15000);
253253+ await waitForFeaturesReady(15000);
253254254255 const state: ElectronState = { app: electronApp, tempDir, profile };
255256