@fuzdev/fuz_app 0.90.0 → 0.91.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 (32) hide show
  1. package/dist/auth/CLAUDE.md +7 -0
  2. package/dist/auth/all_cell_actions.d.ts +35 -0
  3. package/dist/auth/all_cell_actions.d.ts.map +1 -0
  4. package/dist/auth/all_cell_actions.js +32 -0
  5. package/dist/testing/CLAUDE.md +82 -9
  6. package/dist/testing/cross_backend/action_manifest.d.ts +113 -0
  7. package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -0
  8. package/dist/testing/cross_backend/action_manifest.js +89 -0
  9. package/dist/testing/cross_backend/action_manifest_parity.d.ts +67 -0
  10. package/dist/testing/cross_backend/action_manifest_parity.d.ts.map +1 -0
  11. package/dist/testing/cross_backend/action_manifest_parity.js +88 -0
  12. package/dist/testing/cross_backend/capabilities.d.ts +47 -30
  13. package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
  14. package/dist/testing/cross_backend/capabilities.js +19 -4
  15. package/dist/testing/cross_backend/default_backend_configs.d.ts +31 -15
  16. package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
  17. package/dist/testing/cross_backend/default_backend_configs.js +30 -14
  18. package/dist/testing/cross_backend/full_spine_mount.d.ts +81 -0
  19. package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -0
  20. package/dist/testing/cross_backend/full_spine_mount.js +49 -0
  21. package/dist/testing/cross_backend/method_coverage.d.ts +71 -0
  22. package/dist/testing/cross_backend/method_coverage.d.ts.map +1 -0
  23. package/dist/testing/cross_backend/method_coverage.js +89 -0
  24. package/dist/testing/cross_backend/setup.d.ts +12 -0
  25. package/dist/testing/cross_backend/setup.d.ts.map +1 -1
  26. package/dist/testing/cross_backend/setup.js +19 -0
  27. package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
  28. package/dist/testing/cross_backend/testing_backdoor.js +9 -5
  29. package/dist/testing/cross_backend/testing_reset_actions.d.ts +76 -2
  30. package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
  31. package/dist/testing/cross_backend/testing_reset_actions.js +63 -2
  32. package/package.json +2 -2
@@ -4,6 +4,7 @@ import type { TestAccount } from '../app_server.js';
4
4
  import type { BackendCapabilities } from './capabilities.js';
5
5
  import { type FetchTransport } from '../transports/fetch_transport.js';
6
6
  import type { SchemaSnapshot } from '../schema_introspect.js';
7
+ import { ActionManifest } from './action_manifest.js';
7
8
  import type { BackendHandle } from './spawn_backend.js';
8
9
  /**
9
10
  * Options for `TestFixture.create_account` — mints an additional
@@ -377,6 +378,17 @@ export interface CrossProcessSetupOptions {
377
378
  export declare const capture_schema_snapshot: (handle: ReconstructedBootstrappedBackendHandle, options?: {
378
379
  exclude_tables?: ReadonlyArray<string>;
379
380
  }) => Promise<SchemaSnapshot>;
381
+ /**
382
+ * Capture a backend's live RPC action manifest over the
383
+ * `_testing_action_manifest` RPC action (keeper daemon-token channel). The
384
+ * action-surface twin of `capture_schema_snapshot` — pair two calls with
385
+ * `assert_action_manifests_equal` (`testing/cross_backend/action_manifest_parity.ts`)
386
+ * to gate that the TS spine and the Rust `testing_spine_stub` mount the same
387
+ * method set with the same per-method auth shape. Each impl answers from its
388
+ * own live registry (TS via `build_action_manifest`, Rust via the
389
+ * `fuz_testing` mirror); the normalized shapes match by design.
390
+ */
391
+ export declare const capture_action_manifest: (handle: ReconstructedBootstrappedBackendHandle) => Promise<ActionManifest>;
380
392
  /**
381
393
  * Backdating offset (seconds) the `mint_expired_session` seam passes to
382
394
  * `mint_test_session` / `_testing_mint_session`. A minute in the past is
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/setup.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ import { DAEMON_TOKEN_HEADER } from '../../auth/daemon_token.js';
27
27
  import { USERNAME_LENGTH_MAX } from '../../primitive_schemas.js';
28
28
  import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
29
29
  import { create_fetch_transport } from '../transports/fetch_transport.js';
30
+ import { ActionManifest } from './action_manifest.js';
30
31
  /**
31
32
  * Build an `ExtraAccountFixture` from a seeded `{account, actor,
32
33
  * api_token, session_cookie}` bundle and the session cookie name.
@@ -163,8 +164,26 @@ const rpc_via_transport = async (transport, rpc_path, method, params, backend_na
163
164
  */
164
165
  export const capture_schema_snapshot = async (handle, options = {}) => {
165
166
  const raw = await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, '_testing_schema_snapshot', { exclude_tables: [...(options.exclude_tables ?? [])] }, handle.config.name, { [DAEMON_TOKEN_HEADER]: handle.daemon_token });
167
+ // TODO: cast, not parse — `SchemaSnapshot.parse(raw)` would validate the wire
168
+ // against the schema (the `capture_action_manifest` twin parses + uses a
169
+ // strict object); parsing here may surface a latent schema-model gap to
170
+ // reconcile first, so it's left as a follow-up.
166
171
  return raw;
167
172
  };
173
+ /**
174
+ * Capture a backend's live RPC action manifest over the
175
+ * `_testing_action_manifest` RPC action (keeper daemon-token channel). The
176
+ * action-surface twin of `capture_schema_snapshot` — pair two calls with
177
+ * `assert_action_manifests_equal` (`testing/cross_backend/action_manifest_parity.ts`)
178
+ * to gate that the TS spine and the Rust `testing_spine_stub` mount the same
179
+ * method set with the same per-method auth shape. Each impl answers from its
180
+ * own live registry (TS via `build_action_manifest`, Rust via the
181
+ * `fuz_testing` mirror); the normalized shapes match by design.
182
+ */
183
+ export const capture_action_manifest = async (handle) => {
184
+ const raw = await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, '_testing_action_manifest', {}, handle.config.name, { [DAEMON_TOKEN_HEADER]: handle.daemon_token });
185
+ return ActionManifest.parse(raw);
186
+ };
168
187
  /**
169
188
  * Backdating offset (seconds) the `mint_expired_session` seam passes to
170
189
  * `mint_test_session` / `_testing_mint_session`. A minute in the past is
@@ -1 +1 @@
1
- {"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAyD9B,OAAO,KAAK,EAAC,wBAAwB,EAAc,MAAM,YAAY,CAAC;AA+DtE,kEAAkE;AAClE,MAAM,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AAEvE,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAiCF,CAAC"}
1
+ {"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,OAAO,KAAK,EAAC,wBAAwB,EAAc,MAAM,YAAY,CAAC;AAkEtE,kEAAkE;AAClE,MAAM,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AAEvE,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAiCF,CAAC"}
@@ -4,11 +4,12 @@ import '../assert_dev_env.js';
4
4
  * actions.
5
5
  *
6
6
  * `_testing_reset` / `_testing_mint_session` / `_testing_put_fact` /
7
- * `_testing_schema_snapshot` are privileged test-binary actions the
8
- * production wire never exposes — three direct DB writes (full auth wipe,
9
- * forged session row, raw fact insert) plus a full-schema introspection read
10
- * (the highest info-leak of the set were the gate to break). Their only
11
- * structural fence is the **daemon-token** credential gate on
7
+ * `_testing_schema_snapshot` / `_testing_action_manifest` are privileged
8
+ * test-binary actions the production wire never exposes — three direct DB
9
+ * writes (full auth wipe, forged session row, raw fact insert) plus two
10
+ * introspection reads (the live schema + the live RPC registry, the highest
11
+ * info-leak of the set were the gate to break). Their only structural fence
12
+ * is the **daemon-token** credential gate on
12
13
  * each spec's `auth` axis. A test binary live-mounts them on its RPC
13
14
  * endpoint but keeps them off the declared surface — so the spec-derived
14
15
  * `describe_rpc_attack_surface_tests` never enumerates them, and nothing
@@ -66,6 +67,9 @@ const backdoor_methods = [
66
67
  // The schema-dump read — `exclude_tables` is optional, so `{}` is valid
67
68
  // and clears the 400 phase like the writes above.
68
69
  { method: '_testing_schema_snapshot', params: {} },
70
+ // The RPC-registry-dump read — input is an empty strict object, so `{}` is
71
+ // valid and clears the 400 phase, reaching the credential gate like the rest.
72
+ { method: '_testing_action_manifest', params: {} },
69
73
  ];
70
74
  const principals = [
71
75
  {
@@ -2,13 +2,20 @@ import '../assert_dev_env.js';
2
2
  /**
3
3
  * Test-binary RPC actions for cross-process integration tests.
4
4
  *
5
- * Four daemon-token-authed actions, bundled by `create_testing_actions`:
5
+ * Five daemon-token-authed actions, bundled by `create_testing_actions`:
6
6
  * **`_testing_reset`** (DB wipe + keeper re-seed), **`_testing_drain_effects`**
7
7
  * (audit barrier), **`_testing_mint_session`** (forge an
8
8
  * expired-by-construction server-side session for the expiry conformance
9
- * cases), and **`_testing_schema_snapshot`** (introspect the live schema for
9
+ * cases), **`_testing_put_fact`** (seed an embedded fact for the fact-serving
10
+ * suite), and **`_testing_schema_snapshot`** (introspect the live schema for
10
11
  * cross-impl parity diffing against a Rust backend's `fuz_db` snapshot).
11
12
  *
13
+ * A sixth daemon-token action, **`_testing_action_manifest`** (dump the live
14
+ * RPC registry for cross-impl method-set + auth-shape parity), lives here too
15
+ * but is **not** bundled by `create_testing_actions` — it must enumerate
16
+ * *every* mounted method, so it's appended at the full-mount layer
17
+ * (`build_full_spine_rpc_actions`) where the complete list exists.
18
+ *
12
19
  * `_testing_reset` — full DB wipe + keeper re-seed + optional
13
20
  * secondary-account seeding. The
14
21
  * handler wipes every auth-namespace row (no keeper-preserve filter),
@@ -329,6 +336,73 @@ export declare const testing_schema_snapshot_action_spec: {
329
336
  * `create_testing_actions`; mount directly for in-process use.
330
337
  */
331
338
  export declare const create_testing_schema_snapshot_action: () => RpcAction;
339
+ /**
340
+ * `_testing_action_manifest` — dump the backend's live RPC method set as a
341
+ * normalized `ActionManifest` (one entry per method: `{method, side_effects,
342
+ * account, actor, roles, credential_types}`) for cross-impl parity diffing.
343
+ * The action-surface twin of `_testing_schema_snapshot`: where that
344
+ * introspects the live *database*, this introspects the live *RPC registry*.
345
+ * The cross-backend harness calls it on each backend, then
346
+ * `assert_action_manifests_equal`s the results (the Rust mirror is
347
+ * `fuz_testing::create_testing_action_manifest_action_spec`, whose
348
+ * normalization matches by design). Complements the in-repo
349
+ * `spine_method_coverage` gate (mounted ⟹ covered) by proving the TS
350
+ * mount-set ≡ the Rust mount-set, method-for-method and auth-shape-for-shape.
351
+ *
352
+ * Unlike its `_testing_*` siblings this action is **not** bundled by
353
+ * `create_testing_actions` — the manifest must enumerate *every* mounted
354
+ * method, which `create_testing_actions` (one sub-factory among many) can't
355
+ * see. It's appended at the full-mount layer (`build_full_spine_rpc_actions`)
356
+ * via `create_testing_action_manifest_action`, where the complete list exists.
357
+ *
358
+ * `auth` gates on the daemon-token credential, matching `_testing_reset`.
359
+ */
360
+ export declare const testing_action_manifest_action_spec: {
361
+ readonly method: "_testing_action_manifest";
362
+ readonly kind: "request_response";
363
+ readonly initiator: "frontend";
364
+ readonly auth: {
365
+ readonly account: "required";
366
+ readonly actor: "none";
367
+ readonly credential_types: readonly ["daemon_token"];
368
+ };
369
+ readonly side_effects: false;
370
+ readonly input: z.ZodObject<{}, z.core.$strict>;
371
+ readonly output: z.ZodObject<{
372
+ methods: z.ZodArray<z.ZodObject<{
373
+ method: z.ZodString;
374
+ side_effects: z.ZodBoolean;
375
+ account: z.ZodEnum<{
376
+ optional: "optional";
377
+ none: "none";
378
+ required: "required";
379
+ }>;
380
+ actor: z.ZodEnum<{
381
+ optional: "optional";
382
+ none: "none";
383
+ required: "required";
384
+ }>;
385
+ roles: z.ZodArray<z.ZodString>;
386
+ credential_types: z.ZodArray<z.ZodString>;
387
+ }, z.core.$strict>>;
388
+ }, z.core.$strict>;
389
+ readonly async: true;
390
+ readonly description: string;
391
+ };
392
+ /**
393
+ * Build the `_testing_action_manifest` action over a backend's full live RPC
394
+ * mount. The handler closes over a manifest computed once at assembly time
395
+ * from every `mounted` spec **plus this action's own spec** — the manifest
396
+ * action is itself a live method, so it must appear in the dump it serves.
397
+ * `mounted` excludes it (it's appended to the mount *after* the rest is
398
+ * assembled, in `build_full_spine_rpc_actions`), so its static spec is folded
399
+ * in here; the Rust mirror folds in its own descriptor the same way.
400
+ *
401
+ * Pass the protocol-action-free full mount: the protocol actions
402
+ * (`heartbeat` / `cancel`) are excluded by construction so the cross-impl
403
+ * diff stays apples-to-apples (see `action_manifest.ts` §Scope).
404
+ */
405
+ export declare const create_testing_action_manifest_action: (mounted: ReadonlyArray<RpcAction>) => RpcAction;
332
406
  /** Options for `create_testing_actions`. */
333
407
  export interface CreateTestingActionsOptions {
334
408
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"testing_reset_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_reset_actions.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,OAAO,EAAa,KAAK,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAIvE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,gBAAgB,CAAC;AA+BvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;QAiBpC;;;;;;;;WAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWyC,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;CAWA,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;CAwBC,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,QAAO,SACiB,CAAC;AAEzE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;CAeK,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWF,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,QAAO,SAGvD,CAAC;AAEH,4CAA4C;AAC5C,MAAM,WAAW,2BAA2B;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC9C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACxD;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,OAAO,EACb,SAAS,2BAA2B,KAClC,KAAK,CAAC,SAAS,CAqIjB,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,UAAmC,CAAC"}
1
+ {"version":3,"file":"testing_reset_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_reset_actions.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,OAAO,EAAa,KAAK,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAIvE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,gBAAgB,CAAC;AAgCvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;QAiBpC;;;;;;;;WAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWyC,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;CAWA,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;CAwBC,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,QAAO,SACiB,CAAC;AAEzE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;CAeK,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWF,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,QAAO,SAGvD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYF,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qCAAqC,GACjD,SAAS,aAAa,CAAC,SAAS,CAAC,KAC/B,SAMF,CAAC;AAEF,4CAA4C;AAC5C,MAAM,WAAW,2BAA2B;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC9C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACxD;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,OAAO,EACb,SAAS,2BAA2B,KAClC,KAAK,CAAC,SAAS,CAqIjB,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,UAAmC,CAAC"}
@@ -2,13 +2,20 @@ import '../assert_dev_env.js';
2
2
  /**
3
3
  * Test-binary RPC actions for cross-process integration tests.
4
4
  *
5
- * Four daemon-token-authed actions, bundled by `create_testing_actions`:
5
+ * Five daemon-token-authed actions, bundled by `create_testing_actions`:
6
6
  * **`_testing_reset`** (DB wipe + keeper re-seed), **`_testing_drain_effects`**
7
7
  * (audit barrier), **`_testing_mint_session`** (forge an
8
8
  * expired-by-construction server-side session for the expiry conformance
9
- * cases), and **`_testing_schema_snapshot`** (introspect the live schema for
9
+ * cases), **`_testing_put_fact`** (seed an embedded fact for the fact-serving
10
+ * suite), and **`_testing_schema_snapshot`** (introspect the live schema for
10
11
  * cross-impl parity diffing against a Rust backend's `fuz_db` snapshot).
11
12
  *
13
+ * A sixth daemon-token action, **`_testing_action_manifest`** (dump the live
14
+ * RPC registry for cross-impl method-set + auth-shape parity), lives here too
15
+ * but is **not** bundled by `create_testing_actions` — it must enumerate
16
+ * *every* mounted method, so it's appended at the full-mount layer
17
+ * (`build_full_spine_rpc_actions`) where the complete list exists.
18
+ *
12
19
  * `_testing_reset` — full DB wipe + keeper re-seed + optional
13
20
  * secondary-account seeding. The
14
21
  * handler wipes every auth-namespace row (no keeper-preserve filter),
@@ -66,6 +73,7 @@ import { query_put_fact } from '../../db/fact_queries.js';
66
73
  import { ROLE_ADMIN, ROLE_KEEPER } from '../../auth/role_schema.js';
67
74
  import { auth_integration_truncate_tables } from '../db.js';
68
75
  import { query_schema_snapshot, SchemaSnapshot } from '../schema_introspect.js';
76
+ import { ActionManifest, build_action_manifest } from './action_manifest.js';
69
77
  import { query_create_actor } from '../../auth/account_queries.js';
70
78
  import { create_test_account_with_credentials, mint_test_session } from '../app_server.js';
71
79
  import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
@@ -293,6 +301,59 @@ export const testing_schema_snapshot_action_spec = {
293
301
  * `create_testing_actions`; mount directly for in-process use.
294
302
  */
295
303
  export const create_testing_schema_snapshot_action = () => rpc_action(testing_schema_snapshot_action_spec, async (input, ctx) => query_schema_snapshot(ctx.db, { exclude_tables: input.exclude_tables }));
304
+ /**
305
+ * `_testing_action_manifest` — dump the backend's live RPC method set as a
306
+ * normalized `ActionManifest` (one entry per method: `{method, side_effects,
307
+ * account, actor, roles, credential_types}`) for cross-impl parity diffing.
308
+ * The action-surface twin of `_testing_schema_snapshot`: where that
309
+ * introspects the live *database*, this introspects the live *RPC registry*.
310
+ * The cross-backend harness calls it on each backend, then
311
+ * `assert_action_manifests_equal`s the results (the Rust mirror is
312
+ * `fuz_testing::create_testing_action_manifest_action_spec`, whose
313
+ * normalization matches by design). Complements the in-repo
314
+ * `spine_method_coverage` gate (mounted ⟹ covered) by proving the TS
315
+ * mount-set ≡ the Rust mount-set, method-for-method and auth-shape-for-shape.
316
+ *
317
+ * Unlike its `_testing_*` siblings this action is **not** bundled by
318
+ * `create_testing_actions` — the manifest must enumerate *every* mounted
319
+ * method, which `create_testing_actions` (one sub-factory among many) can't
320
+ * see. It's appended at the full-mount layer (`build_full_spine_rpc_actions`)
321
+ * via `create_testing_action_manifest_action`, where the complete list exists.
322
+ *
323
+ * `auth` gates on the daemon-token credential, matching `_testing_reset`.
324
+ */
325
+ export const testing_action_manifest_action_spec = {
326
+ method: '_testing_action_manifest',
327
+ kind: 'request_response',
328
+ initiator: 'frontend',
329
+ auth: TESTING_ACTION_AUTH,
330
+ side_effects: false,
331
+ input: z.strictObject({}),
332
+ output: ActionManifest,
333
+ async: true,
334
+ description: 'Test-binary only — dump the live RPC registry as a normalized {method, auth, side_effects} ' +
335
+ 'manifest for cross-impl method-set + auth-shape parity diffing.',
336
+ };
337
+ /**
338
+ * Build the `_testing_action_manifest` action over a backend's full live RPC
339
+ * mount. The handler closes over a manifest computed once at assembly time
340
+ * from every `mounted` spec **plus this action's own spec** — the manifest
341
+ * action is itself a live method, so it must appear in the dump it serves.
342
+ * `mounted` excludes it (it's appended to the mount *after* the rest is
343
+ * assembled, in `build_full_spine_rpc_actions`), so its static spec is folded
344
+ * in here; the Rust mirror folds in its own descriptor the same way.
345
+ *
346
+ * Pass the protocol-action-free full mount: the protocol actions
347
+ * (`heartbeat` / `cancel`) are excluded by construction so the cross-impl
348
+ * diff stays apples-to-apples (see `action_manifest.ts` §Scope).
349
+ */
350
+ export const create_testing_action_manifest_action = (mounted) => {
351
+ const manifest = build_action_manifest([
352
+ ...mounted.map((action) => action.spec),
353
+ testing_action_manifest_action_spec,
354
+ ]);
355
+ return rpc_action(testing_action_manifest_action_spec, async () => manifest);
356
+ };
296
357
  /**
297
358
  * Build the testing RPC actions for a test binary's registry.
298
359
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fuzdev/fuz_app",
3
- "version": "0.90.0",
3
+ "version": "0.91.0",
4
4
  "description": "fullstack app library",
5
5
  "glyph": "🗝",
6
6
  "logo": "logo.svg",
@@ -16,7 +16,7 @@
16
16
  "test": "gro test",
17
17
  "test:cross:ts": "FUZ_TEST_CROSS_BACKEND=1 vitest run --project cross_backend_ts_node --project cross_backend_ts_deno --project cross_backend_ts_bun",
18
18
  "test:cross:rust-spine-stub": "FUZ_TEST_CROSS_BACKEND=1 vitest run --project cross_backend_rust_spine_stub",
19
- "test:cross:schema-parity": "FUZ_TEST_CROSS_BACKEND=1 vitest run --project cross_backend_schema_parity",
19
+ "test:cross:parity": "FUZ_TEST_CROSS_BACKEND=1 vitest run --project cross_backend_parity",
20
20
  "benchmark:cross-impl": "gro run src/benchmarks/cross_impl.bench.ts",
21
21
  "preview": "vite preview",
22
22
  "deploy": "gro deploy"