|
| 1 | +--- |
| 2 | +"@objectstack/core": patch |
| 3 | +"@objectstack/plugin-auth": patch |
| 4 | +"@objectstack/plugin-email": patch |
| 5 | +"@objectstack/plugin-hono-server": patch |
| 6 | +"@objectstack/plugin-security": patch |
| 7 | +"@objectstack/service-storage": patch |
| 8 | +"@objectstack/service-settings": patch |
| 9 | +"@objectstack/service-realtime": patch |
| 10 | +"@objectstack/service-i18n": patch |
| 11 | +"@objectstack/service-analytics": patch |
| 12 | +"@objectstack/service-messaging": patch |
| 13 | +"@objectstack/service-cluster": patch |
| 14 | +"@objectstack/service-sms": patch |
| 15 | +"@objectstack/service-cache": patch |
| 16 | +"@objectstack/service-queue": patch |
| 17 | +"@objectstack/service-job": patch |
| 18 | +"@objectstack/service-datasource": patch |
| 19 | +"@objectstack/service-automation": patch |
| 20 | +"@objectstack/mcp": patch |
| 21 | +--- |
| 22 | + |
| 23 | +chore(plugins,services): declare `providesServices` on the 20 remaining init-time service providers (ADR-0116 follow-up, #4131) |
| 24 | + |
| 25 | +ADR-0116 gave the kernel a declared ordering contract, but only |
| 26 | +`ObjectQLPlugin` and `MetadataPlugin` had declared what their `init()` |
| 27 | +registers. The pre-Phase-1 ordering check can only *name a provider* for |
| 28 | +services someone declared, so its coverage was two plugins wide. |
| 29 | + |
| 30 | +An audit of every plugin's `init()` body (brace-matched, comments stripped, |
| 31 | +each call classified by whether it sits inside a `try`/`if`) found 20 plugins |
| 32 | +that register a service on every path without declaring it. All 20 now |
| 33 | +declare `providesServices`. Purely additive: no ordering changes, no new |
| 34 | +failure modes — a `providesServices` entry only lets the kernel say *who* |
| 35 | +provides a service when it reports a misordering, and enriches the Phase-1 |
| 36 | +`getService` miss diagnostic. |
| 37 | + |
| 38 | +Three needed a closer read before declaring, because they register the same |
| 39 | +service from several branches (`cache`, `queue`, `job`): each early-return |
| 40 | +branch plus the fallback registers it, so every path does — the declaration |
| 41 | +is honest. ADR-0116's rule that a *conditionally* registered service must |
| 42 | +never be declared is unchanged and was applied throughout. |
| 43 | + |
| 44 | +The same audit found 12 plugins that hard-resolve a service during `init()` |
| 45 | +(11 of them `manifest`) without declaring `requiresServices`. None is a live |
| 46 | +exposure — every one already declares a hard `dependencies` entry on the |
| 47 | +provider, so the kernel orders them correctly today. Those are tracked |
| 48 | +separately: with a hard dependency in place, `requiresServices` mostly |
| 49 | +restates what the kernel already enforces, and its real value is on |
| 50 | +*soft*-dependency consumers, of which `AppPlugin` is currently the only one. |
0 commit comments