@objectstack/observability 17.2.0 → 17.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,384 @@
1
1
  # @objectstack/observability
2
2
 
3
+ ## 17.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 37e82eb: Surface a licensed `max_nodes` oversell to operators as telemetry
8
+
9
+ `os serve` already warned loudly at boot when `OS_CLUSTER_REPLICAS` declared more
10
+ nodes than the licence gate admits, but that warning existed only in one
11
+ process's startup output: an operator who scaled past their cap three weeks ago
12
+ had no way to ask the question today, and no way to alert on it. The same
13
+ advisory verdict is now also published through the deployment's configured
14
+ metrics backend, so it reaches the place operators already look.
15
+
16
+ Three names join `SEMCONV` in `@objectstack/observability`, emitted once per boot
17
+ by `os serve` when a remote cluster driver is configured, each labelled with the
18
+ gate's own verdict vocabulary (`admitted` / `capped` / `refused`):
19
+
20
+ - `cluster_declared_nodes` (gauge) — the replica count the operator **declared**;
21
+ - `cluster_admitted_nodes` (gauge) — how many of them the licence **admits**;
22
+ - `cluster_node_cap_verdicts_total` (counter) — one increment per process boot
23
+ that consulted the gate, so an alert stays writable after a one-shot gauge has
24
+ aged out of a push-based backend.
25
+
26
+ **Visibility only — the cap remains advisory and nothing is refused.** The gate is
27
+ consulted once per process at boot, every replica computes the same verdict, and
28
+ none can know whether it is one of the admitted ones, so all of them still join.
29
+ The names say so on purpose: this process has no cluster membership view at all,
30
+ so a series called `cluster_nodes` or `cluster_active_nodes` would be a false
31
+ statement dressed as telemetry. Nothing here counts peers, and no accept/reject
32
+ behaviour changed.
33
+
34
+ Absence is meaningful rather than an instrumentation gap: a single-node
35
+ deployment never consults the gate and emits nothing, and an emission also needs
36
+ a metrics backend configured via `OS_OBS_EXPORTER`.
37
+
38
+ ### Patch Changes
39
+
40
+ - e7191ce: fix(build): give each `exports` condition its own `types` target in the 28 dual-build packages (#13112)
41
+
42
+ **Published-surface change, zero runtime change.** No emitted byte moves; what
43
+ moves is which declaration file a resolver READS. Maintainer ruling 2026-08-29
44
+ (decision batch #3, verbatim 「同意」) chose declaring the files over deleting
45
+ them.
46
+
47
+ ## What was wrong
48
+
49
+ These 28 packages are `"type": "module"` and dual-built, and each spelled one
50
+ `types` condition as a **sibling** of `import`/`require`:
51
+
52
+ ```json
53
+ "exports": { ".": {
54
+ "types": "./dist/index.d.ts", "import": "./dist/index.js", "require": "./dist/index.cjs"
55
+ } }
56
+ ```
57
+
58
+ A sibling `types` answers for **both** conditions, so a CommonJS consumer was
59
+ handed `dist/index.d.ts` — an ES-module declaration, because the package is
60
+ `"type": "module"` — for an entry point it reaches with `require`. Measured with
61
+ `tsc --traceResolution` on a `"type": "commonjs"` fixture at `moduleResolution:
62
+ node16`:
63
+
64
+ ```
65
+ error TS1479: The current file is a CommonJS module whose imports will produce
66
+ 'require' calls; however, the referenced file is an ECMAScript module and cannot
67
+ be imported with 'require'.
68
+ ```
69
+
70
+ The JavaScript at `dist/index.cjs` loads perfectly (`check:dual-build-cjs-loads`
71
+ has asserted that for months). It is the **types** that told the consumer the
72
+ supported `require` entry point could not be required. The `dist/index.d.cts`
73
+ twin tsup emits beside it — 36 files, 5,517,701 B on this build — was named by
74
+ no condition at all and shipped in every tarball unreachable.
75
+
76
+ ## What changed
77
+
78
+ Each condition now names its own declaration, the shape TypeScript documents:
79
+
80
+ ```json
81
+ "exports": { ".": {
82
+ "import": { "types": "./dist/index.d.ts", "default": "./dist/index.js" },
83
+ "require": { "types": "./dist/index.d.cts", "default": "./dist/index.cjs" }
84
+ } }
85
+ ```
86
+
87
+ 33 entry points across 27 packages, subpaths included. The root `types` field is
88
+ untouched, so `node10` resolvers are unaffected; the `import` condition resolves
89
+ exactly what it resolved before, measured as an unchanged control in the same
90
+ run.
91
+
92
+ ## `@objectstack/core` is deliberately NOT changed
93
+
94
+ Splitting a declaration in two makes TypeScript compare it nominally, and
95
+ `ObjectKernel` carries a `private plugins` member that reaches every plugin
96
+ through `PluginContext.getKernel()`. With core split, whole-repo `pnpm build`
97
+ fails in `@objectstack/verify` with 5 × TS2345 ("Types have separate
98
+ declarations of a private property 'plugins'"); with core held back and the
99
+ other 27 split, 71/71 tasks pass. So core keeps the sibling-`types` shape and
100
+ its two `.d.cts` files (220,854 B) stay unreachable, declared as such in
101
+ `check:dual-build-cjs-loads`. Splitting it needs a decision about core's public
102
+ types, not about an exports map.
103
+
104
+ ## For consumers
105
+
106
+ - **ESM consumers: nothing changes.** Same declaration file, byte for byte.
107
+ - **CJS consumers under `node16`/`nodenext`: TS1479 goes away** and the
108
+ declarations they get are the ones built for CommonJS.
109
+ - **`node10` / `moduleResolution: node` consumers: nothing changes** — they never
110
+ read `exports`.
111
+ - Nothing is removed: every path that resolved before still resolves.
112
+
113
+ Packages that are CJS-first (`require` → `./dist/index.js`, no `"type": "module"`)
114
+ were already correct and are untouched — their `dist/index.d.ts` really is the
115
+ CommonJS declaration. Their ESM mirror (an unreachable `.d.mts` under the
116
+ `import` condition) is a separate, larger population and is filed separately per
117
+ the ruling, not fixed here.
118
+
119
+ `check:dual-build-cjs-loads` grew a fourth invariant (TYPED) that reds on the old
120
+ shape, so the drift cannot return silently.
121
+ - Updated dependencies [809d417]
122
+ - Updated dependencies [387e231]
123
+ - Updated dependencies [f794e4e]
124
+ - Updated dependencies [cae2169]
125
+ - Updated dependencies [b812a54]
126
+ - Updated dependencies [2d4fa75]
127
+ - Updated dependencies [0e4e51b]
128
+ - Updated dependencies [e84bbf6]
129
+ - Updated dependencies [effae80]
130
+ - Updated dependencies [d62f990]
131
+ - Updated dependencies [c45d8e6]
132
+ - Updated dependencies [2e3e8c7]
133
+ - Updated dependencies [e621291]
134
+ - Updated dependencies [40a93b5]
135
+ - Updated dependencies [d5b330d]
136
+ - Updated dependencies [dda969c]
137
+ - Updated dependencies [1f45690]
138
+ - Updated dependencies [277948f]
139
+ - Updated dependencies [8bdd955]
140
+ - Updated dependencies [f3bbbef]
141
+ - Updated dependencies [4f24e9d]
142
+ - Updated dependencies [474242f]
143
+ - Updated dependencies [63cd487]
144
+ - Updated dependencies [bd4aa4e]
145
+ - Updated dependencies [803eaab]
146
+ - Updated dependencies [f8e8f03]
147
+ - Updated dependencies [eae824e]
148
+ - Updated dependencies [f6fa22c]
149
+ - Updated dependencies [8a483b3]
150
+ - Updated dependencies [97bcd99]
151
+ - Updated dependencies [df59de0]
152
+ - Updated dependencies [96e25a8]
153
+ - Updated dependencies [f75a38a]
154
+ - Updated dependencies [7a25e7d]
155
+ - Updated dependencies [1fa05a6]
156
+ - Updated dependencies [c85a265]
157
+ - Updated dependencies [dcb10a5]
158
+ - Updated dependencies [773a999]
159
+ - Updated dependencies [35dffea]
160
+ - Updated dependencies [776a098]
161
+ - Updated dependencies [5060877]
162
+ - Updated dependencies [4f6325d]
163
+ - Updated dependencies [52954c0]
164
+ - Updated dependencies [2aa8456]
165
+ - Updated dependencies [93809a3]
166
+ - Updated dependencies [7c0d0c3]
167
+ - Updated dependencies [daae7aa]
168
+ - Updated dependencies [8dc22d6]
169
+ - Updated dependencies [279431e]
170
+ - Updated dependencies [948dd6b]
171
+ - Updated dependencies [3b4c56c]
172
+ - Updated dependencies [ae8edd2]
173
+ - Updated dependencies [e25403c]
174
+ - Updated dependencies [64baa68]
175
+ - Updated dependencies [9fa70d7]
176
+ - Updated dependencies [09db64a]
177
+ - Updated dependencies [92916e7]
178
+ - Updated dependencies [a84f3ea]
179
+ - Updated dependencies [f2eaae8]
180
+ - Updated dependencies [c09451b]
181
+ - Updated dependencies [ba64877]
182
+ - Updated dependencies [7345308]
183
+ - Updated dependencies [79b6a22]
184
+ - Updated dependencies [30d96ab]
185
+ - Updated dependencies [f658793]
186
+ - Updated dependencies [c95ad19]
187
+ - Updated dependencies [e58ea8b]
188
+ - Updated dependencies [4a17645]
189
+ - Updated dependencies [3795c5f]
190
+ - Updated dependencies [8ab926b]
191
+ - Updated dependencies [7317cf2]
192
+ - Updated dependencies [e25e839]
193
+ - Updated dependencies [5997207]
194
+ - Updated dependencies [8b13cc8]
195
+ - Updated dependencies [4a4a35d]
196
+ - Updated dependencies [86e765a]
197
+ - Updated dependencies [1d7e76a]
198
+ - Updated dependencies [53dc739]
199
+ - Updated dependencies [fd289be]
200
+ - Updated dependencies [03bf7b1]
201
+ - Updated dependencies [f90e820]
202
+ - Updated dependencies [18d816a]
203
+ - Updated dependencies [e8bd715]
204
+ - Updated dependencies [b91c351]
205
+ - Updated dependencies [a28a3c0]
206
+ - Updated dependencies [daeaaf9]
207
+ - Updated dependencies [c459da6]
208
+ - Updated dependencies [e914733]
209
+ - Updated dependencies [f887e52]
210
+ - Updated dependencies [881f8d8]
211
+ - Updated dependencies [3bfa1e6]
212
+ - Updated dependencies [901355c]
213
+ - Updated dependencies [34ce8e7]
214
+ - Updated dependencies [33681ea]
215
+ - Updated dependencies [4635f3e]
216
+ - Updated dependencies [ee3595c]
217
+ - Updated dependencies [b2eab95]
218
+ - Updated dependencies [93940d4]
219
+ - Updated dependencies [3a04b01]
220
+ - Updated dependencies [45b9051]
221
+ - Updated dependencies [b9e9227]
222
+ - Updated dependencies [d395692]
223
+ - Updated dependencies [5894d30]
224
+ - Updated dependencies [a3765f6]
225
+ - Updated dependencies [e22158f]
226
+ - Updated dependencies [7404925]
227
+ - Updated dependencies [0c2334f]
228
+ - Updated dependencies [778c59f]
229
+ - Updated dependencies [d2619fd]
230
+ - Updated dependencies [6acb11a]
231
+ - Updated dependencies [33c5fd3]
232
+ - Updated dependencies [20b0fdb]
233
+ - Updated dependencies [905019b]
234
+ - Updated dependencies [a286411]
235
+ - Updated dependencies [98c0d33]
236
+ - Updated dependencies [368a82e]
237
+ - Updated dependencies [a3d5724]
238
+ - Updated dependencies [93ea19b]
239
+ - Updated dependencies [9ee2dcf]
240
+ - Updated dependencies [8cb96ec]
241
+ - Updated dependencies [8f10a79]
242
+ - Updated dependencies [6269a55]
243
+ - Updated dependencies [0fb8760]
244
+ - Updated dependencies [e5ce2ed]
245
+ - Updated dependencies [be21955]
246
+ - Updated dependencies [bc56e18]
247
+ - Updated dependencies [be21955]
248
+ - Updated dependencies [a9ee989]
249
+ - Updated dependencies [4d0d944]
250
+ - Updated dependencies [15d58db]
251
+ - Updated dependencies [d63b014]
252
+ - Updated dependencies [9abe4e4]
253
+ - Updated dependencies [2cc7122]
254
+ - Updated dependencies [50d6c92]
255
+ - Updated dependencies [9e0ba21]
256
+ - Updated dependencies [311433f]
257
+ - Updated dependencies [3e5ad08]
258
+ - Updated dependencies [9abe4e4]
259
+ - Updated dependencies [b7131f3]
260
+ - Updated dependencies [e5812fa]
261
+ - Updated dependencies [7085f90]
262
+ - Updated dependencies [dee4dd4]
263
+ - Updated dependencies [ce7e497]
264
+ - Updated dependencies [51ecb2f]
265
+ - Updated dependencies [9086761]
266
+ - Updated dependencies [42a117b]
267
+ - Updated dependencies [1401ae7]
268
+ - Updated dependencies [4297fe7]
269
+ - Updated dependencies [e398863]
270
+ - Updated dependencies [d16df74]
271
+ - Updated dependencies [f11fc61]
272
+ - Updated dependencies [e808890]
273
+ - Updated dependencies [8f79379]
274
+ - Updated dependencies [e6ca40e]
275
+ - Updated dependencies [0c77ea4]
276
+ - Updated dependencies [52954c0]
277
+ - Updated dependencies [89eb997]
278
+ - Updated dependencies [aa5994e]
279
+ - Updated dependencies [be93457]
280
+ - Updated dependencies [a65db76]
281
+ - Updated dependencies [15eb2c9]
282
+ - Updated dependencies [5691b07]
283
+ - Updated dependencies [2a6122b]
284
+ - Updated dependencies [225e769]
285
+ - Updated dependencies [8af88dd]
286
+ - Updated dependencies [fb5fbb8]
287
+ - Updated dependencies [d7b3963]
288
+ - Updated dependencies [b72db01]
289
+ - Updated dependencies [dce5cd4]
290
+ - Updated dependencies [177ebdc]
291
+ - Updated dependencies [8d237b4]
292
+ - Updated dependencies [2d2e6f0]
293
+ - Updated dependencies [2d8dd8d]
294
+ - Updated dependencies [22d573e]
295
+ - Updated dependencies [b5a2398]
296
+ - Updated dependencies [348860c]
297
+ - Updated dependencies [5383fa6]
298
+ - Updated dependencies [5b3ff63]
299
+ - Updated dependencies [1a6a19c]
300
+ - Updated dependencies [527e050]
301
+ - Updated dependencies [dd33bf9]
302
+ - Updated dependencies [4cb2a90]
303
+ - Updated dependencies [74a7804]
304
+ - Updated dependencies [53d3689]
305
+ - Updated dependencies [b3a63d3]
306
+ - Updated dependencies [033a34c]
307
+ - Updated dependencies [4d25d22]
308
+ - Updated dependencies [1ffee51]
309
+ - Updated dependencies [5ae4303]
310
+ - Updated dependencies [ece4dad]
311
+ - Updated dependencies [e9b377e]
312
+ - Updated dependencies [146f448]
313
+ - Updated dependencies [735f5c7]
314
+ - Updated dependencies [a7e18de]
315
+ - Updated dependencies [366f895]
316
+ - Updated dependencies [dc75ba8]
317
+ - Updated dependencies [cce0aa9]
318
+ - Updated dependencies [e764507]
319
+ - Updated dependencies [cff17af]
320
+ - Updated dependencies [39404f3]
321
+ - Updated dependencies [ca1965f]
322
+ - Updated dependencies [8619f95]
323
+ - Updated dependencies [b706af9]
324
+ - Updated dependencies [fc9ba76]
325
+ - Updated dependencies [0f94cc7]
326
+ - Updated dependencies [a11c1a5]
327
+ - Updated dependencies [71f9cd1]
328
+ - Updated dependencies [ee17d86]
329
+ - Updated dependencies [cdbd920]
330
+ - Updated dependencies [18c432e]
331
+ - Updated dependencies [3c418c4]
332
+ - Updated dependencies [fa8715a]
333
+ - Updated dependencies [a933ed7]
334
+ - Updated dependencies [b3ca463]
335
+ - Updated dependencies [a933ed7]
336
+ - Updated dependencies [0d4a6a8]
337
+ - Updated dependencies [518d5e5]
338
+ - Updated dependencies [6643ba1]
339
+ - Updated dependencies [eeba2ef]
340
+ - Updated dependencies [ec4c4d2]
341
+ - Updated dependencies [424f73c]
342
+ - Updated dependencies [cccbe51]
343
+ - Updated dependencies [a8d6b1d]
344
+ - Updated dependencies [e4a7695]
345
+ - Updated dependencies [87075b1]
346
+ - Updated dependencies [fc58a99]
347
+ - Updated dependencies [14cfc00]
348
+ - Updated dependencies [1c6f7b4]
349
+ - Updated dependencies [e854a53]
350
+ - Updated dependencies [dfebfc8]
351
+ - Updated dependencies [d028b37]
352
+ - Updated dependencies [122ef38]
353
+ - Updated dependencies [4a37870]
354
+ - Updated dependencies [428f9b2]
355
+ - Updated dependencies [aa7ff56]
356
+ - Updated dependencies [c41b42e]
357
+ - Updated dependencies [c4db311]
358
+ - Updated dependencies [750fff5]
359
+ - Updated dependencies [c19035e]
360
+ - Updated dependencies [ececf7a]
361
+ - Updated dependencies [d173125]
362
+ - Updated dependencies [8eeca27]
363
+ - Updated dependencies [8425c17]
364
+ - Updated dependencies [a5ef1d8]
365
+ - Updated dependencies [772d5de]
366
+ - Updated dependencies [ce80ec2]
367
+ - Updated dependencies [b372318]
368
+ - Updated dependencies [97a2263]
369
+ - Updated dependencies [29d0676]
370
+ - Updated dependencies [0169d49]
371
+ - Updated dependencies [6bd3231]
372
+ - Updated dependencies [d2b5ba8]
373
+ - Updated dependencies [b799ac5]
374
+ - Updated dependencies [8f74307]
375
+ - Updated dependencies [d23dc08]
376
+ - Updated dependencies [644ad50]
377
+ - Updated dependencies [0da7cd2]
378
+ - Updated dependencies [28a5c3e]
379
+ - Updated dependencies [4bc18e5]
380
+ - @objectstack/spec@17.3.0
381
+
3
382
  ## 17.2.0
4
383
 
5
384
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -148,7 +148,55 @@ var SEMCONV = {
148
148
  /** Histogram (ms). */
149
149
  registryLookupDurationMs: "registry_lookup_duration_ms",
150
150
  /** Counter, labels: `source` (`r2`|`http`|`local`), `result` (`hit`|`miss`|`error`). */
151
- registrySourceFetchesTotal: "registry_source_fetches_total"
151
+ registrySourceFetchesTotal: "registry_source_fetches_total",
152
+ // ── Cluster licensing — emitted by `@objectstack/cli`'s `os serve` at boot ──
153
+ //
154
+ // ⚠️ Every name in this group is a reading of what the operator DECLARED
155
+ // and what the licence gate SAID about that declaration. **None of them is
156
+ // a membership reading**, and none may be renamed into one. At the moment
157
+ // `os serve` consults the multi-node gate, the process has no cluster
158
+ // membership view at all: `nodeId` is generated randomly per process, there
159
+ // is no join/leave registry, and the only count in existence is
160
+ // `OS_CLUSTER_REPLICAS` — an operator-declared desired count that is
161
+ // identical in every replica. A series called `cluster_nodes` or
162
+ // `cluster_active_nodes` fed from here would be a false statement dressed
163
+ // as telemetry, so the honesty lives in the NAMES: `declared` is what the
164
+ // operator wrote, `admitted` is what the gate says fits the licence.
165
+ //
166
+ // The cap these describe is ADVISORY and is not enforced: no replica can
167
+ // act on the verdict alone to refuse itself, so a `capped` verdict means
168
+ // every declared replica still joins. Read a `capped` series as "this
169
+ // deployment is configured beyond what it paid for", never as "replicas
170
+ // were turned away".
171
+ //
172
+ // ⚠️ Absence is meaningful and is NOT an instrumentation gap: the gate is
173
+ // consulted only when `OS_CLUSTER_DRIVER` names a remote driver, so a
174
+ // single-node deployment emits nothing here at all. An emission also needs
175
+ // a configured metrics backend (`OS_OBS_EXPORTER`); with none, the boot log
176
+ // line remains the only reading.
177
+ /**
178
+ * Gauge, labels: `verdict` (`admitted`|`capped`|`refused`). The replica
179
+ * count the operator DECLARED via `OS_CLUSTER_REPLICAS` — not a count of
180
+ * anything observed. Absent when nothing was declared; deliberately never
181
+ * emitted as `0`, which would read as a declaration of zero replicas.
182
+ */
183
+ clusterDeclaredNodes: "cluster_declared_nodes",
184
+ /**
185
+ * Gauge, labels: `verdict` (`admitted`|`capped`|`refused`). How many of the
186
+ * declared nodes the licence gate admits. Absent when the gate imposes no
187
+ * count cap at all — emitting a number there would invent a limit that was
188
+ * never expressed.
189
+ */
190
+ clusterAdmittedNodes: "cluster_admitted_nodes",
191
+ /**
192
+ * Counter, labels: `verdict` (`admitted`|`capped`|`refused`). One
193
+ * increment per PROCESS BOOT that consulted the gate — a boot-event count,
194
+ * never a node count. It exists because the two gauges above are written
195
+ * once per boot and a push-based exporter lets a one-shot gauge age out of
196
+ * the backend; `increase(cluster_node_cap_verdicts_total{verdict="capped"}[1h]) > 0`
197
+ * stays alertable after the gauges have gone stale.
198
+ */
199
+ clusterNodeCapVerdictsTotal: "cluster_node_cap_verdicts_total"
152
200
  };
153
201
  var RUNTIME_METRICS = {
154
202
  httpRequestsTotal: SEMCONV.httpRequestsTotal,