@fuzdev/fuz_app 0.129.0 → 0.131.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.
Files changed (110) hide show
  1. package/dist/actions/CLAUDE.md +23 -6
  2. package/dist/actions/connection_closer.d.ts +3 -1
  3. package/dist/actions/connection_closer.d.ts.map +1 -1
  4. package/dist/actions/register_action_ws.d.ts +46 -0
  5. package/dist/actions/register_action_ws.d.ts.map +1 -1
  6. package/dist/actions/register_action_ws.js +108 -14
  7. package/dist/actions/rpc_client.d.ts.map +1 -1
  8. package/dist/actions/transports.d.ts +2 -1
  9. package/dist/actions/transports.d.ts.map +1 -1
  10. package/dist/actions/transports.js +2 -1
  11. package/dist/actions/transports_ws_backend.d.ts +38 -4
  12. package/dist/actions/transports_ws_backend.d.ts.map +1 -1
  13. package/dist/actions/transports_ws_backend.js +69 -4
  14. package/dist/auth/audit_log_routes.d.ts +7 -3
  15. package/dist/auth/audit_log_routes.d.ts.map +1 -1
  16. package/dist/auth/audit_log_routes.js +50 -26
  17. package/dist/auth/scope_kind_schema.d.ts.map +1 -1
  18. package/dist/auth/scope_kind_schema.js +1 -3
  19. package/dist/db/db_pg.js +1 -1
  20. package/dist/http/CLAUDE.md +1 -1
  21. package/dist/http/jsonrpc_errors.d.ts.map +1 -1
  22. package/dist/http/jsonrpc_errors.js +7 -5
  23. package/dist/realtime/sse.d.ts +14 -1
  24. package/dist/realtime/sse.d.ts.map +1 -1
  25. package/dist/realtime/sse.js +77 -1
  26. package/dist/realtime/sse_auth_guard.js +1 -1
  27. package/dist/realtime/subscriber_registry.d.ts +44 -8
  28. package/dist/realtime/subscriber_registry.d.ts.map +1 -1
  29. package/dist/realtime/subscriber_registry.js +64 -10
  30. package/dist/runtime/mock.js +1 -1
  31. package/dist/server/app_server.d.ts +4 -1
  32. package/dist/server/app_server.d.ts.map +1 -1
  33. package/dist/testing/CLAUDE.md +21 -6
  34. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
  35. package/dist/testing/cross_backend/account_lifecycle.js +0 -3
  36. package/dist/testing/cross_backend/action_manifest.d.ts +0 -4
  37. package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -1
  38. package/dist/testing/cross_backend/action_manifest.js +0 -4
  39. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
  40. package/dist/testing/cross_backend/actor_lookup.js +0 -3
  41. package/dist/testing/cross_backend/actor_search.d.ts.map +1 -1
  42. package/dist/testing/cross_backend/actor_search.js +0 -2
  43. package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
  44. package/dist/testing/cross_backend/app_settings.js +0 -2
  45. package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
  46. package/dist/testing/cross_backend/body_size.js +0 -3
  47. package/dist/testing/cross_backend/body_size_smuggling.d.ts.map +1 -1
  48. package/dist/testing/cross_backend/body_size_smuggling.js +0 -2
  49. package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +1 -1
  50. package/dist/testing/cross_backend/cell_cross_helpers.js +0 -3
  51. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  52. package/dist/testing/cross_backend/cell_crud.js +0 -3
  53. package/dist/testing/cross_backend/cell_gated_create.d.ts +0 -2
  54. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
  55. package/dist/testing/cross_backend/cell_gated_create.js +0 -4
  56. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
  57. package/dist/testing/cross_backend/cell_grant_role.js +0 -2
  58. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  59. package/dist/testing/cross_backend/cell_relations.js +0 -3
  60. package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
  61. package/dist/testing/cross_backend/cookie_attributes.js +0 -3
  62. package/dist/testing/cross_backend/credential_header_robustness.d.ts.map +1 -1
  63. package/dist/testing/cross_backend/credential_header_robustness.js +0 -2
  64. package/dist/testing/cross_backend/default_spine_surface.d.ts +0 -7
  65. package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
  66. package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
  67. package/dist/testing/cross_backend/fact_serving.js +0 -3
  68. package/dist/testing/cross_backend/full_spine_mount.d.ts +0 -5
  69. package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
  70. package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
  71. package/dist/testing/cross_backend/identity_parity.js +0 -2
  72. package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
  73. package/dist/testing/cross_backend/login_security.js +0 -3
  74. package/dist/testing/cross_backend/origin.d.ts.map +1 -1
  75. package/dist/testing/cross_backend/origin.js +0 -3
  76. package/dist/testing/cross_backend/peer_ping_ws.js +4 -4
  77. package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
  78. package/dist/testing/cross_backend/query_shape.js +0 -3
  79. package/dist/testing/cross_backend/ready.d.ts.map +1 -1
  80. package/dist/testing/cross_backend/ready.js +0 -3
  81. package/dist/testing/cross_backend/role_grant_offer_enumeration.d.ts.map +1 -1
  82. package/dist/testing/cross_backend/role_grant_offer_enumeration.js +0 -3
  83. package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
  84. package/dist/testing/cross_backend/role_grant_participation.js +0 -3
  85. package/dist/testing/cross_backend/session_cap.d.ts.map +1 -1
  86. package/dist/testing/cross_backend/session_cap.js +0 -3
  87. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
  88. package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +0 -3
  89. package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
  90. package/dist/testing/cross_backend/testing_backdoor.js +0 -3
  91. package/dist/testing/cross_backend/testing_server_bun.js +1 -1
  92. package/dist/testing/cross_backend/token_lifetime.d.ts.map +1 -1
  93. package/dist/testing/cross_backend/token_lifetime.js +0 -4
  94. package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
  95. package/dist/testing/cross_backend/token_scope_surface.js +0 -3
  96. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts +1 -1
  97. package/dist/testing/cross_backend/ts_spine_backend_config.js +1 -1
  98. package/dist/testing/cross_backend/ws_action_rate_limit.d.ts.map +1 -1
  99. package/dist/testing/cross_backend/ws_action_rate_limit.js +0 -3
  100. package/dist/testing/cross_backend/ws_connection_cap.d.ts.map +1 -1
  101. package/dist/testing/cross_backend/ws_connection_cap.js +0 -3
  102. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts +20 -0
  103. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts.map +1 -0
  104. package/dist/testing/cross_backend/ws_inbound_dispatch.js +177 -0
  105. package/dist/testing/transports/sse_frame_reader.d.ts.map +1 -1
  106. package/dist/testing/transports/sse_frame_reader.js +4 -1
  107. package/dist/ui/Datatable.svelte +2 -2
  108. package/dist/ui/ui_format.d.ts.map +1 -1
  109. package/dist/ui/ui_format.js +2 -0
  110. package/package.json +19 -19
@@ -22,6 +22,7 @@
22
22
  *
23
23
  * @module
24
24
  */
25
+ import { Logger } from '@fuzdev/fuz_util/log.ts';
25
26
  /**
26
27
  * Generic subscriber registry with channel-based filtering and identity-keyed disconnection.
27
28
  *
@@ -52,6 +53,16 @@
52
53
  * behind it. The twin of the Rust `fuz_realtime` `SseRegistry`
53
54
  * (`subscribe_pending` / `admit` / `subscribe`).
54
55
  *
56
+ * ## Shutdown
57
+ *
58
+ * `close_all` — the close `AppServer.close` runs — closes every stream,
59
+ * pending or admitted, and leaves the registry **closing** for good: every
60
+ * later registration is born closed. `subscribe_pending` registers nothing,
61
+ * so `admit` refuses the handle and the route's stream ends after its connect
62
+ * comment; `subscribe` closes the stream it is given at once. A stream still
63
+ * opening when the server shuts down therefore ends rather than outliving it.
64
+ * The flag is set in the same synchronous step that closes the live streams.
65
+ *
55
66
  * @example
56
67
  * ```ts
57
68
  * const registry = new SubscriberRegistry<SseNotification>();
@@ -91,8 +102,10 @@
91
102
  * return unauthorized();
92
103
  * }
93
104
  * const {response, stream} = create_sse_response(c, log);
94
- * if (registry.admit(pending, stream)) stream.on_close(pending.unsubscribe);
95
- * else stream.close(); // closed while pending — the body is the connect comment alone
105
+ * // first: a client that already left closes the stream, its listener runs at
106
+ * // once, and `admit` then refuses the removed registration
107
+ * stream.on_close(pending.unsubscribe);
108
+ * if (!registry.admit(pending, stream)) stream.close(); // the body is the connect comment alone
96
109
  * return response;
97
110
  * ```
98
111
  */
@@ -103,8 +116,13 @@ export class SubscriberRegistry {
103
116
  // another registry names nothing here
104
117
  #pending = new WeakMap();
105
118
  #max_per_scope;
119
+ #log;
120
+ // set once by `close_all`, never cleared — every later registration is born
121
+ // closed (class doc, "Shutdown")
122
+ #closing = false;
106
123
  constructor(options) {
107
124
  this.#max_per_scope = options?.max_per_scope ?? null;
125
+ this.#log = options?.log === undefined ? new Logger('[sse]') : options.log;
108
126
  }
109
127
  /**
110
128
  * Number of open — **admitted** — subscribers. A registration still pending
@@ -130,6 +148,15 @@ export class SubscriberRegistry {
130
148
  }
131
149
  return count;
132
150
  }
151
+ /**
152
+ * Whether `close_all` has run — the registry is shutting down and every
153
+ * registration from now on is born closed (class doc, "Shutdown"). The
154
+ * audit stream route reads it to skip the re-reads for a registration
155
+ * admission will refuse anyway.
156
+ */
157
+ get closing() {
158
+ return this.#closing;
159
+ }
133
160
  /**
134
161
  * Add a subscriber, admitted at once — the one-step form of
135
162
  * `subscribe_pending` + `admit`.
@@ -139,12 +166,20 @@ export class SubscriberRegistry {
139
166
  * nothing, and the stream would open on a dead credential (class doc,
140
167
  * "Two-phase registration").
141
168
  *
169
+ * Once the registry is closing, the subscriber is born closed: `stream` is
170
+ * closed at once, nothing is registered, and the returned function is a
171
+ * no-op.
172
+ *
142
173
  * @param stream - SSE stream to send data to
143
174
  * @param options - channel filter and identity slots (`scope` + `groups`)
144
175
  * @returns unsubscribe function
145
176
  * @mutates registry - adds the new subscriber; closes oldest matching subscribers when `max_per_scope` is exceeded
146
177
  */
147
178
  subscribe(stream, options) {
179
+ if (this.#closing) {
180
+ stream.close();
181
+ return () => { };
182
+ }
148
183
  const subscriber = this.#create_entry(options);
149
184
  this.#admit_entry(subscriber, stream);
150
185
  this.#subscribers.add(subscriber);
@@ -161,13 +196,17 @@ export class SubscriberRegistry {
161
196
  * broadcast, is not counted, and evicts nothing. A caller that then refuses
162
197
  * the request calls the returned handle's `unsubscribe`.
163
198
  *
199
+ * Once the registry is closing, the registration is born closed: nothing
200
+ * is registered, and `admit` refuses the handle.
201
+ *
164
202
  * @param options - channel filter and identity slots (`scope` + `groups`)
165
203
  * @returns the pending handle `admit` takes
166
- * @mutates registry - adds the un-admitted registration
204
+ * @mutates registry - adds the un-admitted registration, unless the registry is closing
167
205
  */
168
206
  subscribe_pending(options) {
169
207
  const subscriber = this.#create_entry(options);
170
- this.#subscribers.add(subscriber);
208
+ if (!this.#closing)
209
+ this.#subscribers.add(subscriber);
171
210
  const pending = {
172
211
  unsubscribe: () => {
173
212
  this.#subscribers.delete(subscriber);
@@ -180,9 +219,9 @@ export class SubscriberRegistry {
180
219
  * Admit a pending subscription, attaching the stream it delivers to — phase
181
220
  * two (class doc).
182
221
  *
183
- * If the registration is gone — a revocation closed it while it was
184
- * pending, or it was unsubscribed — nothing is evicted and the subscription
185
- * is refused. Otherwise the per-scope cap is enforced as in `subscribe`,
222
+ * If the registration is gone — a revocation or the shutdown closed it
223
+ * while it was pending, it was born closed, or it was unsubscribed —
224
+ * nothing is evicted and the subscription is refused. Otherwise the per-scope cap is enforced as in `subscribe`,
186
225
  * counting only admitted subscribers, and the stream starts receiving
187
226
  * `broadcast` data. Admitting twice is refused the second time.
188
227
  *
@@ -240,16 +279,20 @@ export class SubscriberRegistry {
240
279
  }
241
280
  /**
242
281
  * Force-close every subscriber, pending or admitted — the shutdown close
243
- * `AppServer.close` runs through the registry's `ConnectionCloser`.
282
+ * `AppServer.close` runs through the registry's `ConnectionCloser` — and
283
+ * leave the registry closing, for good: every later registration is born
284
+ * closed (class doc, "Shutdown"). A second call closes nothing.
244
285
  *
245
286
  * A stream whose `close` throws does not stop the loop: every subscriber is
246
287
  * removed and closed, and the first error is thrown afterward.
247
288
  *
248
289
  * @returns the number of subscribers closed
249
- * @mutates registry - removes every subscriber and closes its stream
290
+ * @mutates registry - sets the registry closing, removes every subscriber, and closes its stream
250
291
  * @throws the first error a stream's `close` threw, after every subscriber was attempted
251
292
  */
252
293
  close_all() {
294
+ // before any close, so a registration a close listener triggers is born closed too
295
+ this.#closing = true;
253
296
  return this.#close_where(() => true);
254
297
  }
255
298
  #close_where(predicate) {
@@ -304,6 +347,11 @@ export class SubscriberRegistry {
304
347
  * Close `scope`'s oldest **admitted** subscribers until one more fits under
305
348
  * `max`. Pending registrations are neither counted nor closed — a
306
349
  * subscription that may yet be refused must not cost a live one its slot.
350
+ *
351
+ * Every victim is removed, then closed in its own `try`: a stream whose
352
+ * `close` throws is still unregistered, the rest are still closed, and the
353
+ * error is logged — it belongs to another subscriber, so it must not fail
354
+ * the admission that evicted it.
307
355
  */
308
356
  #enforce_scope_limit(scope, max) {
309
357
  // admitted subscribers with this scope, in registration order (the
@@ -318,8 +366,14 @@ export class SubscriberRegistry {
318
366
  const overflow = matching.length - (max - 1);
319
367
  for (let i = 0; i < overflow; i++) {
320
368
  const [victim, stream] = matching[i];
321
- stream.close();
369
+ // removed first, so a stream whose close throws is unregistered too
322
370
  this.#subscribers.delete(victim);
371
+ try {
372
+ stream.close();
373
+ }
374
+ catch (error) {
375
+ this.#log?.error('error closing a stream evicted by the cap:', error);
376
+ }
323
377
  }
324
378
  }
325
379
  }
@@ -299,7 +299,7 @@ export const create_mock_runtime = (args = []) => {
299
299
  },
300
300
  // === HTTP ===
301
301
  fetch: async (input, init) => {
302
- fetch_calls.push({ input: input, init });
302
+ fetch_calls.push({ input, init });
303
303
  const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
304
304
  for (const [pattern, response] of mock_fetch_responses) {
305
305
  if (url.includes(pattern))
@@ -433,7 +433,10 @@ export interface AppServer {
433
433
  * audit stream — including transports supplied through
434
434
  * `WsEndpointSpec.transport` or added by hand, since they are registered
435
435
  * on the backend's closer and the backend is going away; a close that
436
- * throws is logged and the shutdown goes on
436
+ * throws is logged and the shutdown goes on. Each transport and registry
437
+ * is left closing, so an upgrade or stream that registers afterward is
438
+ * born closed — refused at once rather than outliving the server — and
439
+ * a closed transport hosts no other server
437
440
  * 3. release what assembly acquired, last acquired first: remove the
438
441
  * audit listeners `create_app_server` registered on `deps.audit` (the
439
442
  * audit-log SSE listener, the WS auth guards, each
@@ -1 +1 @@
1
- {"version":3,"file":"app_server.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/server/app_server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app_server.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/server/app_server.ts"],"names":[],"mappings":"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"}
@@ -1202,6 +1202,22 @@ action (manifest-excluded), so parity is behavioral here, not via the manifest
1202
1202
  gate. Cross-process only; fuz_app's own wiring is
1203
1203
  `src/test/cross_backend/peer_ping_ws.cross.test.ts`.
1204
1204
 
1205
+ ### `cross_backend/ws_inbound_dispatch.ts` — `describe_ws_inbound_dispatch_cross_tests`
1206
+
1207
+ Real-upgrade parity for the two refusals a WebSocket request meets ahead of
1208
+ dispatch: a request whose id names a request still running on the socket →
1209
+ `invalid_request` with `data.reason: 'duplicate_request_id'`, not dispatched
1210
+ (the running request answers under its id as usual, and the id frees once it
1211
+ has); and past the per-socket in-flight ceiling (128 on both spines) a new
1212
+ request → `queue_overflow` with its id, not dispatched, the socket left open,
1213
+ the duplicate check first. Requests are held in flight with `peer/ping` — the
1214
+ client's responder withholds the server's ping echo until the test releases
1215
+ it — so the suite gates on `capabilities.peer_request`.
1216
+ `describe_ws_inbound_dispatch_cross_tests({setup_test, capabilities, base_url,
1217
+ ws_path})`. The wire literals are independent copies of the producers'
1218
+ constants, so a value changed on one spine fails here. Cross-process only;
1219
+ fuz_app's own wiring is `src/test/cross_backend/ws_inbound_dispatch.cross.test.ts`.
1220
+
1205
1221
  ### `cross_backend/ws_connection_cap.ts` — `describe_ws_connection_cap_cross_tests`
1206
1222
 
1207
1223
  Real-upgrade parity for the **per-account WebSocket connection cap** — the
@@ -1595,7 +1611,7 @@ success-path gate. Gated on `capabilities.ready`. Imperative (not a
1595
1611
  `conformance_table` row) because `/ready` is a public flat-REST route, not a
1596
1612
  JSON-RPC envelope, and the probe needs `fresh_transport({origin: null})` —
1597
1613
  the same reasons the sibling `cross_backend/origin.ts` suite is imperative.
1598
- `$lib`-free; runs both legs (`cross_backend/ready_parity.db.test.ts` +
1614
+ Runs both legs (`cross_backend/ready_parity.db.test.ts` +
1599
1615
  `cross_backend/ready.cross.test.ts`).
1600
1616
 
1601
1617
  Both backends read the **same** committed
@@ -1677,7 +1693,7 @@ USERNAME_LENGTH_MAX]` = `[3, 39]` boundary edges (just-outside → 400,
1677
1693
 
1678
1694
  Ungated (login + signup are on every spine). Runs both legs via the shared
1679
1695
  `{setup_test}` protocol: in-process (`identity_parity.db.test.ts`, plain
1680
- `gro test`) and cross-process (`identity_parity.cross.test.ts`). `$lib`-free.
1696
+ `gro test`) and cross-process (`identity_parity.cross.test.ts`).
1681
1697
  The accepted-case 403s rely on `create_spine_route_specs` zeroing
1682
1698
  `signup_fail_floor_ms` (mirroring `login_fail_floor_ms: 0`) so they don't each
1683
1699
  pay the 250ms denial floor.
@@ -1822,8 +1838,8 @@ re-roll the serve / daemon-info / WS-attach / drain boilerplate:
1822
1838
  - `testing/cross_backend/testing_server_node.ts` — `create_node_testing_adapter()` (`@hono/node-server` + `@hono/node-ws`). Optional peer deps (like `ws`); only test binaries import them. Its factory sets the `ws` server's `maxPayload` to `max_message_bytes` (default `DEFAULT_WS_MAX_MESSAGE_BYTES`) — `@hono/node-ws` takes no option for it, and `ws`'s own default is 100 MiB — so an oversized message is refused at the frame layer (still `WS_CLOSE_MESSAGE_TOO_BIG`) before it is buffered whole. Bun's adapter sets twice it as its frame cap (see below); Deno takes no frame cap and keeps the per-message check alone.
1823
1839
  - `testing/cross_backend/testing_server_deno.ts` — `create_deno_testing_adapter()` (`Deno.serve` + `@hono/deno`, an optional peer dep; `Deno` declared locally so it typechecks under the Node toolchain). Spawn the entry with `--sloppy-imports` (Deno doesn't do `.js`→`.ts`; Gro's loader does, so the Node path needs no flag).
1824
1840
  - `testing/cross_backend/testing_server_bun.ts` — `create_bun_testing_adapter()` (`Bun.serve` + `@hono/bun`'s module-level `getConnInfo`, `upgradeWebSocket`, and `websocket`; `Bun.serve` declared locally so it typechecks under the Node toolchain). Needs the optional `@hono/bun` peer dep (the counterpart to Node's `@hono/node-server` + `@hono/node-ws`; `Bun.serve` is built in), and Bun resolves `.js`→`.ts` natively (no flag, unlike Deno). Reuses `create_node_runtime` (Bun implements the `node:fs`/`node:process` surface). WS is module-level + stateless (like Deno) — the `websocket` handler is threaded into `serve`, where `Bun.serve` wants it, so no post-serve attach. It carries `maxPayloadLength` at twice `max_message_bytes` rather than Bun's 16 MiB default: past its cap Bun drops the socket without a close frame (1006), so the headroom leaves a message just over the limit to the per-message check (`WS_CLOSE_MESSAGE_TOO_BIG`, as on Node), while a grossly oversized one is refused before Bun buffers it whole.
1825
- - `testing/cross_backend/default_spine_surface.ts` — the canonical no-domain spine surface (account/admin/audit/signup + bootstrap): `spine_session_options`, `spine_roles`, `create_spine_route_specs`, `spine_rpc_endpoints`, `create_spine_surface_spec`. This is the **declared** surface — the `create_standard_rpc_actions` bundle the spec-derived suites auto-enumerate. It passes `daemon_token: true` (both spine binaries mount the daemon-token layer) and leaves `GET /api/surface` at its default, off — the TS spine binary does too, and the Rust `testing_spine_stub` serves none. `$lib`-free (it's reached by the spawned binary under Gro's loader, which doesn't resolve `$lib`), so keep it on relative imports. Shared by the spine_stub cross test, the TS cross tests, and the binary.
1826
- - `testing/cross_backend/full_spine_mount.ts` — `build_full_spine_rpc_actions(deps, options)` — the **full** live RPC mount: the declared bundle **plus** the off-declared-surface families the binary live-mounts (`_testing_*` backdoors, the cell verb set, the opt-in `actor_lookup` / `actor_search` resolvers). `build_full_spine_mount(deps, options)` builds it once for both of the binary's endpoints, returning `FullSpineMount` (`{rpc_actions, ws_actions}`): the WS list is `protocol_actions` plus every RPC action not already among them, twinning the Rust `testing_spine_stub`, which serves one registry on RPC and WS (the one difference is `cancel` — a registered protocol action on TS, owned by the read loop on Rust). Single-sources the mount so the binary and the `spine_method_coverage` reconciliation test build the same list. Also `$lib`-free.
1841
+ - `testing/cross_backend/default_spine_surface.ts` — the canonical no-domain spine surface (account/admin/audit/signup + bootstrap): `spine_session_options`, `spine_roles`, `create_spine_route_specs`, `spine_rpc_endpoints`, `create_spine_surface_spec`. This is the **declared** surface — the `create_standard_rpc_actions` bundle the spec-derived suites auto-enumerate. It passes `daemon_token: true` (both spine binaries mount the daemon-token layer) and leaves `GET /api/surface` at its default, off — the TS spine binary does too, and the Rust `testing_spine_stub` serves none. Shared by the spine_stub cross test, the TS cross tests, and the binary.
1842
+ - `testing/cross_backend/full_spine_mount.ts` — `build_full_spine_rpc_actions(deps, options)` — the **full** live RPC mount: the declared bundle **plus** the off-declared-surface families the binary live-mounts (`_testing_*` backdoors, the cell verb set, the opt-in `actor_lookup` / `actor_search` resolvers). `build_full_spine_mount(deps, options)` builds it once for both of the binary's endpoints, returning `FullSpineMount` (`{rpc_actions, ws_actions}`): the WS list is `protocol_actions` plus every RPC action not already among them, twinning the Rust `testing_spine_stub`, which serves one registry on RPC and WS (the one difference is `cancel` — a registered protocol action on TS, owned by the read loop on Rust). Single-sources the mount so the binary and the `spine_method_coverage` reconciliation test build the same list.
1827
1843
  - `testing/cross_backend/ts_spine_backend_config.ts` — `ts_spine_node_backend_config()` / `ts_spine_deno_backend_config()` / `ts_spine_bun_backend_config()` presets (in-memory PGlite, no external infra), the TS analog of `rust_spine_stub_backend_config()`.
1828
1844
 
1829
1845
  fuz_app's own binary wiring (`src/test/cross_backend/testing_spine_server{,_node,_deno,_bun}.ts`) is the worked example: ~one `build_app` over `create_app_backend` + `create_app_server` (`rate_limiters: 'disabled_for_testing'` plus whichever login / action limiters its env toggles built, `build_full_spine_mount`'s two lists on one `rpc_endpoints` entry and one `ws_endpoints` entry, whose `transport` is also the role-grant-offer `notification_sender`), reusing `default_spine_surface`. `src/test/cross_backend/testing_spine_server.db.test.ts` builds it with the Node adapter in-process and asserts its surface lists `/api/ws` and passes the surface invariants. The `_node`/`_deno`/`_bun` entries differ only in which adapter they wire — `build_spine_app` is runtime-agnostic. It leaves `create_app_server`'s `auth_cleanup` off, as the Rust `testing_spine_stub` leaves its twin unscheduled: a background pass would delete rows and write audit rows under a running suite. A consumer's cross-process test binary may schedule it when nothing its suites seed is already expired (the conformance table's `expired_session` principal seeds a backdated session row); an in-process harness leaves it off.
@@ -1865,8 +1881,7 @@ beyond the `audit_log_list` RPC reads — structurally in-process).
1865
1881
  above). The TS spine binary serves `GET /api/admin/audit/stream` —
1866
1882
  `build_spine_app` passes `audit_log_sse: true` and `create_spine_route_specs`
1867
1883
  mounts `create_audit_log_route_specs({stream: ctx.audit_sse})` when
1868
- `ctx.audit_sse` is set (keeps `default_spine_surface.ts` `$lib`-free and the
1869
- shared surface snapshot SSE-free, since the surface stub ctx has
1884
+ `ctx.audit_sse` is set (keeps the shared surface snapshot SSE-free, since the surface stub ctx has
1870
1885
  `audit_sse: null`). `capabilities.sse` is scoped to the TS spine configs
1871
1886
  (`ts_spine_backend_config.ts`), not the shared `ts_default_capabilities`,
1872
1887
  which stays honest for consumers who don't wire `audit_log_sse`. The
@@ -1 +1 @@
1
- {"version":3,"file":"account_lifecycle.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/account_lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAsC9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E;;;;;GAKG;AACH,MAAM,MAAM,gCAAgC,GAAG,uCAAuC,CAAC;AAEvF,eAAO,MAAM,sCAAsC,GAClD,SAAS,gCAAgC,KACvC,IAoUF,CAAC"}
1
+ {"version":3,"file":"account_lifecycle.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/account_lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmC9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E;;;;;GAKG;AACH,MAAM,MAAM,gCAAgC,GAAG,uCAAuC,CAAC;AAEvF,eAAO,MAAM,sCAAsC,GAClD,SAAS,gCAAgC,KACvC,IAoUF,CAAC"}
@@ -12,9 +12,6 @@ import '../assert_dev_env.js';
12
12
  * `result` is parsed against the verb's declared Zod **output** schema, so
13
13
  * a TS↔Rust envelope drift fails the assertion.
14
14
  *
15
- * `$lib`-free by contract (relative specifiers only) so it can be imported
16
- * from the spawnable cross-process test files.
17
- *
18
15
  * @module
19
16
  */
20
17
  import { describe, assert } from 'vitest';
@@ -27,10 +27,6 @@ import '../assert_dev_env.js';
27
27
  *
28
28
  * Paired with `action_manifest_parity.ts` for the diff + assertion helpers.
29
29
  *
30
- * `$lib`-free by contract — reached by the spawned TS binary (via
31
- * `testing_reset_actions.ts` → `full_spine_mount.ts`), so every import is
32
- * relative.
33
- *
34
30
  * @module
35
31
  */
36
32
  import { z } from 'zod';
@@ -1 +1 @@
1
- {"version":3,"file":"action_manifest.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/action_manifest.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB;IAC/B,uCAAuC;;IAEvC,iGAAiG;;IAEjG,+BAA+B;;;;;;IAE/B,6BAA6B;;;;;;IAE7B,mFAAmF;;IAEnF,iFAAiF;;IAEjF,4EAA4E;;;;;;kBAE3E,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,kEAAkE;AAClE,eAAO,MAAM,cAAc;;QAlB1B,uCAAuC;;QAEvC,iGAAiG;;QAEjG,+BAA+B;;;;;;QAE/B,6BAA6B;;;;;;QAE7B,mFAAmF;;QAEnF,iFAAiF;;QAEjF,4EAA4E;;;;;;;kBAQ3E,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAM5D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC;CACnC,KAAG,mBAQF,CAAC;AAMH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GACjC,OAAO,aAAa,CACnB,IAAI,CAAC,yBAAyB,EAAE,QAAQ,GAAG,MAAM,GAAG,cAAc,GAAG,YAAY,CAAC,CAClF,KACC,cAED,CAAC"}
1
+ {"version":3,"file":"action_manifest.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/action_manifest.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB;IAC/B,uCAAuC;;IAEvC,iGAAiG;;IAEjG,+BAA+B;;;;;;IAE/B,6BAA6B;;;;;;IAE7B,mFAAmF;;IAEnF,iFAAiF;;IAEjF,4EAA4E;;;;;;kBAE3E,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,kEAAkE;AAClE,eAAO,MAAM,cAAc;;QAlB1B,uCAAuC;;QAEvC,iGAAiG;;QAEjG,+BAA+B;;;;;;QAE/B,6BAA6B;;;;;;QAE7B,mFAAmF;;QAEnF,iFAAiF;;QAEjF,4EAA4E;;;;;;;kBAQ3E,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAM5D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC;CACnC,KAAG,mBAQF,CAAC;AAMH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GACjC,OAAO,aAAa,CACnB,IAAI,CAAC,yBAAyB,EAAE,QAAQ,GAAG,MAAM,GAAG,cAAc,GAAG,YAAY,CAAC,CAClF,KACC,cAED,CAAC"}
@@ -27,10 +27,6 @@ import '../assert_dev_env.js';
27
27
  *
28
28
  * Paired with `action_manifest_parity.ts` for the diff + assertion helpers.
29
29
  *
30
- * `$lib`-free by contract — reached by the spawned TS binary (via
31
- * `testing_reset_actions.ts` → `full_spine_mount.ts`), so every import is
32
- * relative.
33
- *
34
30
  * @module
35
31
  */
36
32
  import { z } from 'zod';
@@ -1 +1 @@
1
- {"version":3,"file":"actor_lookup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/actor_lookup.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAqC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;GAKG;AACH,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AASnE,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IAkDxF,CAAC"}
1
+ {"version":3,"file":"actor_lookup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/actor_lookup.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;GAKG;AACH,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AASnE,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IAkDxF,CAAC"}
@@ -25,9 +25,6 @@ import '../assert_dev_env.js';
25
25
  * binaries + Rust `testing_spine_stub` over real HTTP). `actor_lookup` is
26
26
  * mounted on every spine, so the suite is ungated.
27
27
  *
28
- * `$lib`-free by contract (relative specifiers only), like the sibling
29
- * cross-backend suites.
30
- *
31
28
  * @module
32
29
  */
33
30
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"actor_search.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/actor_search.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2C9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,qFAAqF;AACrF,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AASnE,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IAyDxF,CAAC"}
1
+ {"version":3,"file":"actor_search.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/actor_search.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAyC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,qFAAqF;AACrF,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AASnE,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IAyDxF,CAAC"}
@@ -29,8 +29,6 @@ import '../assert_dev_env.js';
29
29
  * (`cross_backend/actor_search.cross.test.ts`, TS spine binaries + Rust
30
30
  * `testing_spine_stub`). Mounted on every spine, so the suite is ungated.
31
31
  *
32
- * `$lib`-free by contract (relative specifiers only).
33
- *
34
32
  * @module
35
33
  */
36
34
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"app_settings.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/app_settings.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAsC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,qFAAqF;AACrF,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AAiBnE,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IA8DxF,CAAC"}
1
+ {"version":3,"file":"app_settings.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/app_settings.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAoC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,qFAAqF;AACrF,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AAiBnE,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IA8DxF,CAAC"}
@@ -26,8 +26,6 @@ import '../assert_dev_env.js';
26
26
  * binaries + Rust `testing_spine_stub`). Mounted on every spine, so the
27
27
  * suite is ungated.
28
28
  *
29
- * `$lib`-free by contract (relative specifiers only).
30
- *
31
29
  * @module
32
30
  */
33
31
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"body_size.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA6D9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAAC;AAmDhE,eAAO,MAAM,8BAA8B,GAAI,SAAS,wBAAwB,KAAG,IA0ClF,CAAC"}
1
+ {"version":3,"file":"body_size.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAAC;AAmDhE,eAAO,MAAM,8BAA8B,GAAI,SAAS,wBAAwB,KAAG,IA0ClF,CAAC"}
@@ -47,9 +47,6 @@ import '../assert_dev_env.js';
47
47
  *
48
48
  * Cited property: `docs/security.md` §"Body Size Limiting".
49
49
  *
50
- * `$lib`-free by contract (relative specifiers only), like the sibling
51
- * cross-backend suites.
52
- *
53
50
  * @module
54
51
  */
55
52
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"body_size_smuggling.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size_smuggling.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,4EAA4E;AAC5E,MAAM,WAAW,iCAAiC;IACjD,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACrC;AAqDD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAiFF,CAAC"}
1
+ {"version":3,"file":"body_size_smuggling.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size_smuggling.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAwD9B,4EAA4E;AAC5E,MAAM,WAAW,iCAAiC;IACjD,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACrC;AAqDD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAiFF,CAAC"}
@@ -44,8 +44,6 @@ import '../assert_dev_env.js';
44
44
  * Cited property: `docs/security.md` §"Body Size Limiting" (connection handling
45
45
  * on oversized reject).
46
46
  *
47
- * `$lib`-free by contract (relative + `node:` specifiers only).
48
- *
49
47
  * @module
50
48
  */
51
49
  import { connect } from 'node:net';
@@ -1 +1 @@
1
- {"version":3,"file":"cell_cross_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_cross_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmB9B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEvE,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9F;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAC1B,WAAW,cAAc,EACzB,MAAM,MAAM,EACZ,QAAQ,MAAM,EACd,QAAQ,OAAO,EACf,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,SAAS,CAMnB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,YAAY,GAAI,GAAG,SAAS,KAAG,OAG/B,CAAC;AAEd;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAG,CAUrE,CAAC"}
1
+ {"version":3,"file":"cell_cross_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_cross_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAgB9B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEvE,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9F;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAC1B,WAAW,cAAc,EACzB,MAAM,MAAM,EACZ,QAAQ,MAAM,EACd,QAAQ,OAAO,EACf,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,SAAS,CAMnB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,YAAY,GAAI,GAAG,SAAS,KAAG,OAG/B,CAAC;AAEd;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAG,CAUrE,CAAC"}
@@ -9,9 +9,6 @@ import '../assert_dev_env.js';
9
9
  * the wire-shape parity gate. A TS↔Rust envelope drift, not just a payload
10
10
  * field drift, fails the assertion.
11
11
  *
12
- * `$lib`-free by contract (relative specifiers only) so the suites can be
13
- * imported from the spawnable cross-process test files.
14
- *
15
12
  * @module
16
13
  */
17
14
  import { assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"cell_crud.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_crud.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4D9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E,eAAO,MAAM,8BAA8B,GAC1C,SAAS,uCAAuC,KAC9C,IA+cF,CAAC"}
1
+ {"version":3,"file":"cell_crud.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_crud.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAyD9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E,eAAO,MAAM,8BAA8B,GAC1C,SAAS,uCAAuC,KAC9C,IA+cF,CAAC"}
@@ -39,9 +39,6 @@ import '../assert_dev_env.js';
39
39
  * `describe_cell_relations_cross_tests` alongside the grant verbs rather than
40
40
  * here.
41
41
  *
42
- * `$lib`-free by contract (relative specifiers only) so the suite can be
43
- * imported from the spawnable cross-process test files.
44
- *
45
42
  * @module
46
43
  */
47
44
  import { describe, assert } from 'vitest';
@@ -21,8 +21,6 @@ export declare const describe_cell_gated_create_cross_tests: (options: RpcPathCa
21
21
  *
22
22
  * Gated on `capabilities.cell_gated_create` — a `pending` contribution only
23
23
  * exists when the directory authorizer is mounted (reference spine binaries).
24
- *
25
- * `$lib`-free by contract (relative specifiers only).
26
24
  */
27
25
  export declare const describe_cell_moderate_cross_tests: (options: RpcPathCapabilityGatedCrossSuiteOptions) => void;
28
26
  //# sourceMappingURL=cell_gated_create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cell_gated_create.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_gated_create.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAyD9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAkB1E,eAAO,MAAM,sCAAsC,GAClD,SAAS,uCAAuC,KAC9C,IAwPF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,kCAAkC,GAC9C,SAAS,uCAAuC,KAC9C,IAyKF,CAAC"}
1
+ {"version":3,"file":"cell_gated_create.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_gated_create.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAuD9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAkB1E,eAAO,MAAM,sCAAsC,GAClD,SAAS,uCAAuC,KAC9C,IAwPF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,kCAAkC,GAC9C,SAAS,uCAAuC,KAC9C,IAyKF,CAAC"}
@@ -39,8 +39,6 @@ import '../assert_dev_env.js';
39
39
  * the in-process default app (the authorizer hook's in-process coverage is the
40
40
  * standalone `auth/cell_create_authorize.db.test.ts`).
41
41
  *
42
- * `$lib`-free by contract (relative specifiers only).
43
- *
44
42
  * @module
45
43
  */
46
44
  import { describe, assert } from 'vitest';
@@ -168,8 +166,6 @@ export const describe_cell_gated_create_cross_tests = (options) => {
168
166
  *
169
167
  * Gated on `capabilities.cell_gated_create` — a `pending` contribution only
170
168
  * exists when the directory authorizer is mounted (reference spine binaries).
171
- *
172
- * `$lib`-free by contract (relative specifiers only).
173
169
  */
174
170
  export const describe_cell_moderate_cross_tests = (options) => {
175
171
  const { setup_test, capabilities } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"cell_grant_role.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_grant_role.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmD9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,gBAAyB,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAK5D,eAAO,MAAM,oCAAoC,GAChD,SAAS,uCAAuC,KAC9C,IAsOF,CAAC"}
1
+ {"version":3,"file":"cell_grant_role.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_grant_role.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAiD9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,gBAAyB,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAK5D,eAAO,MAAM,oCAAoC,GAChD,SAAS,uCAAuC,KAC9C,IAsOF,CAAC"}
@@ -29,8 +29,6 @@ import '../assert_dev_env.js';
29
29
  * (`cross_backend/cell_grant_role.cross.test.ts`). Gated on
30
30
  * `capabilities.cell_relations` (true on every spine, so it never skips).
31
31
  *
32
- * `$lib`-free by contract (relative specifiers only).
33
- *
34
32
  * @module
35
33
  */
36
34
  import { describe, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"cell_relations.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_relations.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4F9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAsF1E,eAAO,MAAM,mCAAmC,GAC/C,SAAS,uCAAuC,KAC9C,IAi2BF,CAAC"}
1
+ {"version":3,"file":"cell_relations.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_relations.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAyF9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAsF1E,eAAO,MAAM,mCAAmC,GAC/C,SAAS,uCAAuC,KAC9C,IAi2BF,CAAC"}
@@ -52,9 +52,6 @@ import '../assert_dev_env.js';
52
52
  * closed role registry the Rust spine deliberately lacks, so role-grant
53
53
  * parity is out of scope here (the TS impl covers it in-process).
54
54
  *
55
- * `$lib`-free by contract (relative specifiers only) so the suite can be
56
- * imported from the spawnable cross-process test files.
57
- *
58
55
  * @module
59
56
  */
60
57
  import { describe, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"cookie_attributes.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cookie_attributes.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+C9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,6DAA6D;AAC7D,MAAM,WAAW,gCAAgC;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAoED,eAAO,MAAM,sCAAsC,GAClD,SAAS,gCAAgC,KACvC,IAmFF,CAAC"}
1
+ {"version":3,"file":"cookie_attributes.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cookie_attributes.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4C9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,6DAA6D;AAC7D,MAAM,WAAW,gCAAgC;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAoED,eAAO,MAAM,sCAAsC,GAClD,SAAS,gCAAgC,KACvC,IAmFF,CAAC"}
@@ -35,9 +35,6 @@ import '../assert_dev_env.js';
35
35
  * codec directly). Cited property: `docs/security.md` §"Session Security"
36
36
  * (the "Cookie attributes" bullet — `HttpOnly; Secure; SameSite=Strict; Path=/`).
37
37
  *
38
- * `$lib`-free by contract (relative specifiers only), like the sibling
39
- * cross-backend suites.
40
- *
41
38
  * @module
42
39
  */
43
40
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"credential_header_robustness.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/credential_header_robustness.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2D9B,qGAAqG;AACrG,MAAM,WAAW,0CAA0C;IAC1D,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAwFD,eAAO,MAAM,iDAAiD,GAC7D,SAAS,0CAA0C,KACjD,IAkHF,CAAC"}
1
+ {"version":3,"file":"credential_header_robustness.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/credential_header_robustness.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAyD9B,qGAAqG;AACrG,MAAM,WAAW,0CAA0C;IAC1D,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAwFD,eAAO,MAAM,iDAAiD,GAC7D,SAAS,0CAA0C,KACjD,IAkHF,CAAC"}
@@ -44,8 +44,6 @@ import '../assert_dev_env.js';
44
44
  * §"Credential Type Hierarchy" (a leaked / conflicting credential header can't
45
45
  * escalate the credential ceiling) + §"API Token Security" (bearer handling).
46
46
  *
47
- * `$lib`-free by contract (relative + `node:` specifiers only).
48
- *
49
47
  * @module
50
48
  */
51
49
  import { connect } from 'node:net';
@@ -14,13 +14,6 @@ import '../assert_dev_env.js';
14
14
  * `create_app_server`), and
15
15
  * - the `cross_backend_ts_*` self-test projects.
16
16
  *
17
- * **`$lib`-free by contract.** This module and everything it imports use
18
- * relative specifiers (no `$lib` SvelteKit alias) so the spawned TS test
19
- * binary — run under Gro's loader, which resolves `.js`→`.ts` and package
20
- * imports but **not** the `$lib` alias — can import it transitively. Keep
21
- * it that way: a `$lib` import anywhere in this graph breaks the binary
22
- * spawn while still typechecking under vitest.
23
- *
24
17
  * @module
25
18
  */
26
19
  import type { Logger } from '@fuzdev/fuz_util/log.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"default_spine_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/default_spine_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAItD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI1F,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAe3E;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,MAAM,CAAwC,CAAC;AAElG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,gBAGxB,CAAC;AAEH,yCAAyC;AACzC,MAAM,WAAW,wBAAwB;IACxC;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,GAC/B,KAAK,gBAAgB,EACrB,UAAU,wBAAwB,KAChC,KAAK,CAAC,eAAe,CAQvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GAAI,KAAK,gBAAgB,KAAG,KAAK,CAAC,SAAS,CAgC/E,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,GAAI,MAAM,MAAM,KAAG,SAC+B,CAAC;AAE7F;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAAO,cAS1C,CAAC"}
1
+ {"version":3,"file":"default_spine_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/default_spine_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAItD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI1F,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAe3E;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,MAAM,CAAwC,CAAC;AAElG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,gBAGxB,CAAC;AAEH,yCAAyC;AACzC,MAAM,WAAW,wBAAwB;IACxC;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,GAC/B,KAAK,gBAAgB,EACrB,UAAU,wBAAwB,KAChC,KAAK,CAAC,eAAe,CAQvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GAAI,KAAK,gBAAgB,KAAG,KAAK,CAAC,SAAS,CAgC/E,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,GAAI,MAAM,MAAM,KAAG,SAC+B,CAAC;AAE7F;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAAO,cAS1C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fact_serving.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/fact_serving.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAiD9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAErF;;;;;GAKG;AACH,MAAM,WAAW,2BAA4B,SAAQ,uCAAuC;IAC3F,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,CAAC;CAC5C;AA8BD,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IAiOxF,CAAC"}
1
+ {"version":3,"file":"fact_serving.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/fact_serving.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA8C9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAErF;;;;;GAKG;AACH,MAAM,WAAW,2BAA4B,SAAQ,uCAAuC;IAC3F,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,CAAC;CAC5C;AA8BD,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IAiOxF,CAAC"}
@@ -31,9 +31,6 @@ import '../assert_dev_env.js';
31
31
  * the TS spine binary and the Rust `testing_spine_stub` both mount the serve
32
32
  * routes + the seeder.
33
33
  *
34
- * `$lib`-free by contract (relative specifiers only) so it imports from the
35
- * spawnable cross-process test files.
36
- *
37
34
  * @module
38
35
  */
39
36
  import { describe, assert } from 'vitest';