@@ -207,6 +207,15 @@ The `services` map still reports a registered stub as
207207it to ` unavailable ` — "something is in this slot, and it is a fake" says more
208208than "install a plugin".
209209
210+ Exactly one slot answers ` enabled ` by a different question, and the exception is
211+ declared rather than incidental: ` realtime ` is a ** channel slot**
212+ (` CHANNEL_SURFACE_SLOTS ` , ` @objectstack/spec/api ` ), so its ` enabled ` is
213+ ` isSubscribableChannel() ` — ` handlerReady: true ` ** and** a connectable route — instead of
214+ "the slot is filled" (#14646 ). A registered realtime stub therefore reads
215+ ` { enabled: false, status: "stub", handlerReady: false } ` . ` status ` still carries the
216+ "something is in this slot" half, which is why the entry is not collapsed to
217+ ` unavailable ` . Every other slot follows the sentence above.
218+
210219---
211220
212221## 2. data Service ✅ Implemented
@@ -584,8 +593,11 @@ When a plugin registers a service, the discovery endpoint automatically updates:
584593 ` __serviceInfo ` , which is reported verbatim instead)
585594- ` routes.auth ` → ` "/api/v1/auth" ` appears in routes
586595- ` features ` flags follow for the slots that have one — ` search ` , ` files ` ,
587- ` analytics ` , ` ai ` , ` workflow ` , ` notifications ` , ` i18n ` (` websockets ` is hardcoded
588- ` false ` ; there is no ` features.auth ` )
596+ ` analytics ` , ` ai ` , ` workflow ` , ` notifications ` , ` i18n ` (` websockets ` does ** not**
597+ follow slot presence: it is ` isSubscribableChannel(services.realtime) ` — `handlerReady:
598+ true` ** and** a connectable route — so registering a realtime service does not flip it,
599+ and it reads ` false ` on every host the open framework ships, #14646 ; there is no
600+ ` features.auth ` )
589601
590602---
591603
0 commit comments