@fuzdev/fuz_app 0.111.0 → 0.112.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 (179) hide show
  1. package/dist/actions/CLAUDE.md +15 -11
  2. package/dist/actions/action_rpc.d.ts +1 -1
  3. package/dist/actions/action_rpc.d.ts.map +1 -1
  4. package/dist/actions/action_rpc.js +4 -6
  5. package/dist/actions/peer_ping.d.ts +8 -0
  6. package/dist/actions/peer_ping.d.ts.map +1 -1
  7. package/dist/actions/peer_ping.js +8 -0
  8. package/dist/actions/peer_request.d.ts +1 -1
  9. package/dist/actions/peer_request.js +1 -1
  10. package/dist/actions/perform_action.d.ts +16 -9
  11. package/dist/actions/perform_action.d.ts.map +1 -1
  12. package/dist/actions/perform_action.js +30 -21
  13. package/dist/actions/register_action_ws.d.ts +1 -1
  14. package/dist/actions/register_action_ws.d.ts.map +1 -1
  15. package/dist/actions/register_action_ws.js +88 -21
  16. package/dist/auth/CLAUDE.md +37 -7
  17. package/dist/auth/account_actions.d.ts.map +1 -1
  18. package/dist/auth/account_actions.js +10 -1
  19. package/dist/auth/account_queries.d.ts.map +1 -1
  20. package/dist/auth/account_queries.js +36 -16
  21. package/dist/auth/account_schema.d.ts +20 -0
  22. package/dist/auth/account_schema.d.ts.map +1 -1
  23. package/dist/auth/account_schema.js +22 -1
  24. package/dist/auth/actor_search_actions.d.ts +3 -3
  25. package/dist/auth/actor_search_actions.d.ts.map +1 -1
  26. package/dist/auth/actor_search_actions.js +10 -6
  27. package/dist/auth/api_token_queries.d.ts.map +1 -1
  28. package/dist/auth/api_token_queries.js +11 -5
  29. package/dist/auth/app_settings_queries.d.ts.map +1 -1
  30. package/dist/auth/app_settings_queries.js +6 -4
  31. package/dist/auth/audit_log_queries.d.ts +6 -0
  32. package/dist/auth/audit_log_queries.d.ts.map +1 -1
  33. package/dist/auth/audit_log_queries.js +11 -5
  34. package/dist/auth/cell_actions.d.ts.map +1 -1
  35. package/dist/auth/cell_actions.js +3 -8
  36. package/dist/auth/cell_audit_actions.d.ts.map +1 -1
  37. package/dist/auth/cell_audit_actions.js +1 -1
  38. package/dist/auth/cell_field_actions.js +1 -1
  39. package/dist/auth/cell_grant_actions.js +1 -1
  40. package/dist/auth/cell_item_actions.js +1 -1
  41. package/dist/auth/invite_queries.d.ts.map +1 -1
  42. package/dist/auth/invite_queries.js +10 -8
  43. package/dist/auth/role_grant_offer_ddl.d.ts +11 -0
  44. package/dist/auth/role_grant_offer_ddl.d.ts.map +1 -1
  45. package/dist/auth/role_grant_offer_ddl.js +20 -2
  46. package/dist/auth/role_grant_offer_queries.d.ts.map +1 -1
  47. package/dist/auth/role_grant_offer_queries.js +29 -15
  48. package/dist/auth/role_grant_queries.d.ts.map +1 -1
  49. package/dist/auth/role_grant_queries.js +21 -7
  50. package/dist/auth/session_queries.d.ts.map +1 -1
  51. package/dist/auth/session_queries.js +9 -4
  52. package/dist/db/CLAUDE.md +21 -2
  53. package/dist/db/cell_audit_queries.js +2 -2
  54. package/dist/db/cell_field_queries.d.ts +1 -1
  55. package/dist/db/cell_field_queries.d.ts.map +1 -1
  56. package/dist/db/cell_field_queries.js +8 -6
  57. package/dist/db/cell_grant_queries.d.ts +1 -1
  58. package/dist/db/cell_grant_queries.d.ts.map +1 -1
  59. package/dist/db/cell_grant_queries.js +12 -10
  60. package/dist/db/cell_item_queries.d.ts +1 -1
  61. package/dist/db/cell_item_queries.d.ts.map +1 -1
  62. package/dist/db/cell_item_queries.js +9 -7
  63. package/dist/db/cell_queries.d.ts +3 -3
  64. package/dist/db/cell_queries.d.ts.map +1 -1
  65. package/dist/db/cell_queries.js +6 -4
  66. package/dist/db/fact_queries.d.ts.map +1 -1
  67. package/dist/db/fact_queries.js +9 -3
  68. package/dist/db/sql_columns.d.ts +80 -3
  69. package/dist/db/sql_columns.d.ts.map +1 -1
  70. package/dist/db/sql_columns.js +91 -4
  71. package/dist/http/CLAUDE.md +3 -1
  72. package/dist/http/jsonrpc_helpers.d.ts +13 -0
  73. package/dist/http/jsonrpc_helpers.d.ts.map +1 -1
  74. package/dist/http/jsonrpc_helpers.js +13 -0
  75. package/dist/server/serve_fact_route.d.ts.map +1 -1
  76. package/dist/server/serve_fact_route.js +7 -2
  77. package/dist/testing/CLAUDE.md +53 -27
  78. package/dist/testing/admin_integration.d.ts +0 -3
  79. package/dist/testing/admin_integration.d.ts.map +1 -1
  80. package/dist/testing/admin_integration.js +0 -1
  81. package/dist/testing/adversarial_404.d.ts.map +1 -1
  82. package/dist/testing/adversarial_404.js +4 -1
  83. package/dist/testing/adversarial_input.d.ts.map +1 -1
  84. package/dist/testing/adversarial_input.js +5 -4
  85. package/dist/testing/app_server.d.ts +4 -3
  86. package/dist/testing/app_server.d.ts.map +1 -1
  87. package/dist/testing/app_server.js +11 -5
  88. package/dist/testing/attack_surface.d.ts +16 -0
  89. package/dist/testing/attack_surface.d.ts.map +1 -1
  90. package/dist/testing/attack_surface.js +36 -13
  91. package/dist/testing/audit_completeness.d.ts +0 -3
  92. package/dist/testing/audit_completeness.d.ts.map +1 -1
  93. package/dist/testing/audit_completeness.js +0 -1
  94. package/dist/testing/auth_apps.d.ts +9 -2
  95. package/dist/testing/auth_apps.d.ts.map +1 -1
  96. package/dist/testing/auth_apps.js +9 -2
  97. package/dist/testing/cross_backend/account_lifecycle.d.ts +5 -4
  98. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
  99. package/dist/testing/cross_backend/account_lifecycle.js +7 -0
  100. package/dist/testing/cross_backend/action_manifest.d.ts +19 -3
  101. package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -1
  102. package/dist/testing/cross_backend/action_manifest.js +10 -4
  103. package/dist/testing/cross_backend/action_manifest_parity.d.ts +9 -3
  104. package/dist/testing/cross_backend/action_manifest_parity.d.ts.map +1 -1
  105. package/dist/testing/cross_backend/action_manifest_parity.js +6 -0
  106. package/dist/testing/cross_backend/actor_lookup.d.ts +3 -2
  107. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
  108. package/dist/testing/cross_backend/body_size.d.ts +4 -2
  109. package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
  110. package/dist/testing/cross_backend/body_size.js +1 -1
  111. package/dist/testing/cross_backend/cell_crud.d.ts +2 -2
  112. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  113. package/dist/testing/cross_backend/cell_crud.js +10 -0
  114. package/dist/testing/cross_backend/cell_gated_create.d.ts +3 -3
  115. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
  116. package/dist/testing/cross_backend/cell_grant_role.d.ts +2 -2
  117. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
  118. package/dist/testing/cross_backend/cell_relations.d.ts +2 -2
  119. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  120. package/dist/testing/cross_backend/fact_serving.d.ts +2 -2
  121. package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
  122. package/dist/testing/cross_backend/make_cross_backend_project.d.ts +17 -2
  123. package/dist/testing/cross_backend/make_cross_backend_project.d.ts.map +1 -1
  124. package/dist/testing/cross_backend/make_cross_backend_project.js +23 -3
  125. package/dist/testing/cross_backend/origin.d.ts +4 -2
  126. package/dist/testing/cross_backend/origin.d.ts.map +1 -1
  127. package/dist/testing/cross_backend/origin.js +1 -1
  128. package/dist/testing/cross_backend/peer_ping_ws.d.ts.map +1 -1
  129. package/dist/testing/cross_backend/peer_ping_ws.js +11 -7
  130. package/dist/testing/cross_backend/query_shape.d.ts +6 -5
  131. package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
  132. package/dist/testing/cross_backend/ready.d.ts +2 -2
  133. package/dist/testing/cross_backend/ready.d.ts.map +1 -1
  134. package/dist/testing/cross_backend/role_grant_offer_enumeration.d.ts.map +1 -1
  135. package/dist/testing/cross_backend/role_grant_offer_enumeration.js +7 -1
  136. package/dist/testing/cross_backend/setup.d.ts +26 -6
  137. package/dist/testing/cross_backend/setup.d.ts.map +1 -1
  138. package/dist/testing/cross_backend/standard.d.ts +5 -1
  139. package/dist/testing/cross_backend/standard.d.ts.map +1 -1
  140. package/dist/testing/cross_backend/standard.js +1 -5
  141. package/dist/testing/cross_backend/testing_backdoor.js +1 -1
  142. package/dist/testing/cross_backend/testing_reset_actions.d.ts +5 -0
  143. package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
  144. package/dist/testing/cross_backend/token_lifetime.d.ts.map +1 -1
  145. package/dist/testing/cross_backend/token_lifetime.js +6 -0
  146. package/dist/testing/cross_backend/token_scope_surface.d.ts +2 -2
  147. package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
  148. package/dist/testing/cross_backend/wire_shapes.d.ts +22 -0
  149. package/dist/testing/cross_backend/wire_shapes.d.ts.map +1 -0
  150. package/dist/testing/cross_backend/wire_shapes.js +41 -0
  151. package/dist/testing/data_exposure.d.ts +0 -3
  152. package/dist/testing/data_exposure.d.ts.map +1 -1
  153. package/dist/testing/data_exposure.js +0 -1
  154. package/dist/testing/db.d.ts +44 -7
  155. package/dist/testing/db.d.ts.map +1 -1
  156. package/dist/testing/db.js +62 -27
  157. package/dist/testing/integration.d.ts.map +1 -1
  158. package/dist/testing/integration.js +15 -2
  159. package/dist/testing/round_trip.d.ts +0 -3
  160. package/dist/testing/round_trip.d.ts.map +1 -1
  161. package/dist/testing/round_trip.js +0 -4
  162. package/dist/testing/rpc_attack_surface.js +2 -2
  163. package/dist/testing/rpc_round_trip.d.ts +0 -3
  164. package/dist/testing/rpc_round_trip.d.ts.map +1 -1
  165. package/dist/testing/rpc_round_trip.js +0 -1
  166. package/dist/testing/schema_generators.d.ts +15 -0
  167. package/dist/testing/schema_generators.d.ts.map +1 -1
  168. package/dist/testing/schema_generators.js +45 -11
  169. package/dist/testing/standard.d.ts +5 -1
  170. package/dist/testing/standard.d.ts.map +1 -1
  171. package/dist/testing/standard.js +2 -7
  172. package/dist/timestamp.d.ts +58 -0
  173. package/dist/timestamp.d.ts.map +1 -0
  174. package/dist/timestamp.js +57 -0
  175. package/dist/ui/RoleGrantOfferHistory.svelte +3 -1
  176. package/dist/ui/RoleGrantOfferHistory.svelte.d.ts.map +1 -1
  177. package/dist/ui/role_grant_offers_state.svelte.d.ts.map +1 -1
  178. package/dist/ui/role_grant_offers_state.svelte.js +6 -2
  179. package/package.json +1 -1
@@ -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,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,gBAAyB,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAK5D,eAAO,MAAM,oCAAoC,GAAI,SAAS,wBAAwB,KAAG,IAsOxF,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;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,4 +1,4 @@
1
1
  import '../assert_dev_env.js';
2
- import type { RpcPathCrossSuiteOptions } from './setup.js';
3
- export declare const describe_cell_relations_cross_tests: (options: RpcPathCrossSuiteOptions) => void;
2
+ import type { RpcPathCapabilityGatedCrossSuiteOptions } from './setup.js';
3
+ export declare const describe_cell_relations_cross_tests: (options: RpcPathCapabilityGatedCrossSuiteOptions) => void;
4
4
  //# sourceMappingURL=cell_relations.d.ts.map
@@ -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,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAsF3D,eAAO,MAAM,mCAAmC,GAAI,SAAS,wBAAwB,KAAG,IAi2BvF,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;AA4F9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAsF1E,eAAO,MAAM,mCAAmC,GAC/C,SAAS,uCAAuC,KAC9C,IAi2BF,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import '../assert_dev_env.js';
2
- import type { RpcPathCrossSuiteOptions, SetupTest } from './setup.js';
2
+ import type { RpcPathCapabilityGatedCrossSuiteOptions, SetupTest } from './setup.js';
3
3
  /**
4
4
  * The fact suite adds one optional knob to the shared cell options: a setup
5
5
  * variant whose keeper carries a **second actor**. Only the multi-actor case
6
6
  * needs it; the rest of the suite runs single-actor, so wiring it is opt-in.
7
7
  * Omit it and the multi-actor case silently skips.
8
8
  */
9
- export interface FactServingCrossTestOptions extends RpcPathCrossSuiteOptions {
9
+ export interface FactServingCrossTestOptions extends RpcPathCapabilityGatedCrossSuiteOptions {
10
10
  readonly setup_test_multi_actor?: SetupTest;
11
11
  }
12
12
  export declare const describe_fact_serving_cross_tests: (options: FactServingCrossTestOptions) => void;
@@ -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,wBAAwB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,WAAW,2BAA4B,SAAQ,wBAAwB;IAC5E,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;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"}
@@ -48,14 +48,27 @@ export interface CrossBackendProjectOptions {
48
48
  readonly exclude?: ReadonlyArray<string>;
49
49
  /** vitest `sequence.groupOrder`. Default: `3` (runs after unit + db). */
50
50
  readonly group_order?: number;
51
+ /**
52
+ * Per-test timeout in ms. Default: `30_000` — see `DEFAULT_TEST_TIMEOUT`
53
+ * for why the 5 s vitest default does not fit a spawned-backend suite.
54
+ * Always emitted, so a consumer's root `testTimeout` never leaks in.
55
+ */
56
+ readonly test_timeout?: number;
57
+ /**
58
+ * Per-hook timeout in ms for `beforeAll` / `afterAll` etc. Default:
59
+ * `30_000`. Always emitted, so a consumer's root `hookTimeout` never
60
+ * leaks in.
61
+ */
62
+ readonly hook_timeout?: number;
51
63
  }
52
64
  /**
53
65
  * Build a single cross-backend vitest project config. Spread the results
54
66
  * into `test.projects` in the consumer's `vite.config.ts`. `isolate: false`
55
67
  * + `fileParallelism: false` because a project shares one spawned backend
56
- * across its files.
68
+ * across its files, and `testTimeout` / `hookTimeout` are always emitted so
69
+ * a spawned-backend case is never held to vitest's 5 s / 10 s defaults.
57
70
  */
58
- export declare const make_cross_backend_project: ({ name, global_setup, include, exclude, group_order }: CrossBackendProjectOptions) => {
71
+ export declare const make_cross_backend_project: ({ name, global_setup, include, exclude, group_order, test_timeout, hook_timeout }: CrossBackendProjectOptions) => {
59
72
  extends: true;
60
73
  test: {
61
74
  name: string;
@@ -67,6 +80,8 @@ export declare const make_cross_backend_project: ({ name, global_setup, include,
67
80
  sequence: {
68
81
  groupOrder: number;
69
82
  };
83
+ testTimeout: number;
84
+ hookTimeout: number;
70
85
  };
71
86
  };
72
87
  //# sourceMappingURL=make_cross_backend_project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"make_cross_backend_project.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/make_cross_backend_project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAQH,MAAM,WAAW,0BAA0B;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,uDAMxC,0BAA0B,KAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC;QACf,eAAe,EAAE,KAAK,CAAC;QACvB,QAAQ,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC;KACjC,CAAC;CAYD,CAAC"}
1
+ {"version":3,"file":"make_cross_backend_project.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/make_cross_backend_project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA2BH,MAAM,WAAW,0BAA0B;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,GAAI,mFAQxC,0BAA0B,KAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC;QACf,eAAe,EAAE,KAAK,CAAC;QACvB,QAAQ,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC;QACjC,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;CAcD,CAAC"}
@@ -31,13 +31,31 @@
31
31
  const DEFAULT_INCLUDE = ['src/test/cross_backend/*.cross.test.ts'];
32
32
  /** vitest `sequence.groupOrder` for cross-backend projects — after unit (1) + db (2). */
33
33
  const DEFAULT_GROUP_ORDER = 3;
34
+ /**
35
+ * Per-test timeout (ms). vitest's 5 s default is far too tight here: a
36
+ * cross-backend case talks to a spawned backend over a real socket and most
37
+ * begin with a full `_testing_reset` (truncate + reseed the auth tables,
38
+ * mint a session), which alone can outlast 5 s on a cold pool or a loaded
39
+ * machine. 30 s is the ecosystem's convention for backend-spawning suites —
40
+ * long enough that no honest case flakes, short enough that a hung socket
41
+ * still fails the run rather than stalling CI.
42
+ */
43
+ const DEFAULT_TEST_TIMEOUT = 30_000;
44
+ /**
45
+ * Per-hook timeout (ms). `beforeAll` / `afterAll` in these suites do the
46
+ * heaviest work in the project — bootstrap fixtures, seeded accounts, file
47
+ * uploads — so hooks get the same 30 s budget as tests rather than vitest's
48
+ * 10 s default.
49
+ */
50
+ const DEFAULT_HOOK_TIMEOUT = 30_000;
34
51
  /**
35
52
  * Build a single cross-backend vitest project config. Spread the results
36
53
  * into `test.projects` in the consumer's `vite.config.ts`. `isolate: false`
37
54
  * + `fileParallelism: false` because a project shares one spawned backend
38
- * across its files.
55
+ * across its files, and `testTimeout` / `hookTimeout` are always emitted so
56
+ * a spawned-backend case is never held to vitest's 5 s / 10 s defaults.
39
57
  */
40
- export const make_cross_backend_project = ({ name, global_setup, include = DEFAULT_INCLUDE, exclude = [], group_order = DEFAULT_GROUP_ORDER }) => ({
58
+ export const make_cross_backend_project = ({ name, global_setup, include = DEFAULT_INCLUDE, exclude = [], group_order = DEFAULT_GROUP_ORDER, test_timeout = DEFAULT_TEST_TIMEOUT, hook_timeout = DEFAULT_HOOK_TIMEOUT }) => ({
41
59
  extends: true,
42
60
  test: {
43
61
  name,
@@ -46,6 +64,8 @@ export const make_cross_backend_project = ({ name, global_setup, include = DEFAU
46
64
  globalSetup: [global_setup],
47
65
  isolate: false,
48
66
  fileParallelism: false,
49
- sequence: { groupOrder: group_order }
67
+ sequence: { groupOrder: group_order },
68
+ testTimeout: test_timeout,
69
+ hookTimeout: hook_timeout
50
70
  }
51
71
  });
@@ -2,8 +2,10 @@ import '../assert_dev_env.js';
2
2
  import type { RpcPathCrossSuiteOptions } from './setup.js';
3
3
  /**
4
4
  * Options for the origin parity suite. The standard RPC-dispatched
5
- * cross-suite shape (`setup_test` / `capabilities` / `rpc_path`); aliases
6
- * the shared `RpcPathCrossSuiteOptions` rather than minting a duplicate.
5
+ * cross-suite shape (`setup_test` / `rpc_path`); aliases the shared
6
+ * `RpcPathCrossSuiteOptions` rather than minting a duplicate. Origin
7
+ * middleware is on every spine, so no case is capability-gated and the flag
8
+ * bundle is not on the shape.
7
9
  */
8
10
  export type OriginCrossTestOptions = RpcPathCrossSuiteOptions;
9
11
  export declare const describe_origin_cross_tests: (options: OriginCrossTestOptions) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"origin.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/origin.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAM9D,eAAO,MAAM,2BAA2B,GAAI,SAAS,sBAAsB,KAAG,IAwC7E,CAAC"}
1
+ {"version":3,"file":"origin.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/origin.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAM9D,eAAO,MAAM,2BAA2B,GAAI,SAAS,sBAAsB,KAAG,IAwC7E,CAAC"}
@@ -15,7 +15,7 @@ import '../assert_dev_env.js';
15
15
  * clients (curl, CLI, server-to-server) carry no `Origin` and must not be
16
16
  * blocked; token auth is the control for those callers.
17
17
  *
18
- * Runs both legs via the shared `{setup_test, capabilities}` protocol: the
18
+ * Runs both legs via the shared `setup_test` protocol: the
19
19
  * in-process leg (`auth/origin_parity.db.test.ts`, plain `gro test`) and the
20
20
  * cross-process leg (`cross_backend/origin.cross.test.ts`, the TS spine
21
21
  * binaries + Rust `testing_spine_stub` over real HTTP). Origin middleware is
@@ -1 +1 @@
1
- {"version":3,"file":"peer_ping_ws.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/peer_ping_ws.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkD9B,OAAO,EAAE,KAAK,mBAAmB,EAAW,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkB5C,6DAA6D;AAC7D,MAAM,WAAW,qBAAqB;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GAAI,SAAS,qBAAqB,KAAG,IAwN5E,CAAC"}
1
+ {"version":3,"file":"peer_ping_ws.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/peer_ping_ws.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkD9B,OAAO,EAAE,KAAK,mBAAmB,EAAW,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAuB5C,6DAA6D;AAC7D,MAAM,WAAW,qBAAqB;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GAAI,SAAS,qBAAqB,KAAG,IAwN5E,CAAC"}
@@ -40,16 +40,20 @@ import { create_ws_transport } from '../transports/ws_transport.js';
40
40
  import { is_response_for } from '../transports/ws_client.js';
41
41
  import { create_jsonrpc_request, is_jsonrpc_request } from '../../http/jsonrpc_helpers.js';
42
42
  import { test_if } from './capabilities.js';
43
- /** JSON-RPC endpoint path — matches the spine's `/api/rpc` (and the forge's). */
44
- const RPC_PATH = '/api/rpc';
43
+ // The wire literals below are deliberate independent copies of the
44
+ // producers' constants (`actions/peer_ping.ts` on TS, `REASON_PEER_*` /
45
+ // `PEER_PING_METHOD` on Rust) — parity by test, not codegen. The harness
46
+ // asserts the bytes on the wire, so importing the producer would make a
47
+ // renamed-value regression invisible on both sides at once. Names track the
48
+ // producers'.
45
49
  /** Wire method (both directions). Mirrors the Rust `PEER_PING_METHOD`. */
46
50
  const PEER_PING_METHOD = 'peer/ping';
47
- // Stable `data.reason` discriminators — the cross-impl wire contract, kept
48
- // as an independent TS-side copy of the Rust `REASON_PEER_*` constants
49
- // (parity by test, not codegen).
51
+ /** Stable `data.reason` discriminators — the cross-impl wire contract. */
50
52
  const REASON_PEER_TIMEOUT = 'peer_timeout';
51
- const REASON_PEER_INVALID_REPLY = 'peer_ping_invalid_reply';
53
+ const REASON_PEER_PING_INVALID_REPLY = 'peer_ping_invalid_reply';
52
54
  const REASON_PEER_NO_TRANSPORT = 'peer_no_transport';
55
+ /** JSON-RPC endpoint path — matches the spine's `/api/rpc` (and the forge's). */
56
+ const RPC_PATH = '/api/rpc';
53
57
  /** A reply payload that satisfies the Rust `PingResponse` shape. */
54
58
  const valid_reply = (nonce) => ({ nonce, protocol_version: 1 });
55
59
  /**
@@ -126,7 +130,7 @@ export const describe_peer_ping_ws_tests = (options) => {
126
130
  try {
127
131
  const frame = await ping_raw(ws, 3, { nonce: 1, timeout_ms: 2000 });
128
132
  assert.ok('error' in frame, 'a malformed reply must error, not return garbage');
129
- assert.strictEqual(error_reason(frame), REASON_PEER_INVALID_REPLY);
133
+ assert.strictEqual(error_reason(frame), REASON_PEER_PING_INVALID_REPLY);
130
134
  }
131
135
  finally {
132
136
  await ws.close();
@@ -1,10 +1,11 @@
1
1
  import '../assert_dev_env.js';
2
- import type { RpcPathCrossSuiteOptions } from './setup.js';
2
+ import type { RpcPathCapabilityGatedCrossSuiteOptions } from './setup.js';
3
3
  /**
4
- * Options for the query-shape parity suite. The standard RPC-dispatched
5
- * cross-suite shape (`setup_test` / `capabilities` / `rpc_path`); aliases the
6
- * shared `RpcPathCrossSuiteOptions` rather than minting a duplicate.
4
+ * Options for the query-shape parity suite. The standard capability-gating
5
+ * RPC-dispatched cross-suite shape (`setup_test` / `capabilities` /
6
+ * `rpc_path`); aliases the shared `RpcPathCapabilityGatedCrossSuiteOptions`
7
+ * rather than minting a duplicate.
7
8
  */
8
- export type QueryShapeCrossTestOptions = RpcPathCrossSuiteOptions;
9
+ export type QueryShapeCrossTestOptions = RpcPathCapabilityGatedCrossSuiteOptions;
9
10
  export declare const describe_query_shape_cross_tests: (options: QueryShapeCrossTestOptions) => void;
10
11
  //# sourceMappingURL=query_shape.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query_shape.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/query_shape.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0C9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AAQlE,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IAwHtF,CAAC"}
1
+ {"version":3,"file":"query_shape.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/query_shape.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0C9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,uCAAuC,CAAC;AAQjF,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IAwHtF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import '../assert_dev_env.js';
2
- import type { CrossSuiteOptions } from './setup.js';
2
+ import type { CapabilityGatedCrossSuiteOptions } from './setup.js';
3
3
  /** Options for the readiness-probe parity suite. */
4
- export interface ReadyCrossTestOptions extends CrossSuiteOptions {
4
+ export interface ReadyCrossTestOptions extends CapabilityGatedCrossSuiteOptions {
5
5
  /** Readiness probe path. Default `/ready`. */
6
6
  readonly ready_path?: string;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ready.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ready.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,oDAAoD;AACpD,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC/D,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,0BAA0B,GAAI,SAAS,qBAAqB,KAAG,IAuB3E,CAAC"}
1
+ {"version":3,"file":"ready.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ready.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkC9B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,YAAY,CAAC;AAEnE,oDAAoD;AACpD,MAAM,WAAW,qBAAsB,SAAQ,gCAAgC;IAC9E,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,0BAA0B,GAAI,SAAS,qBAAqB,KAAG,IAuB3E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"role_grant_offer_enumeration.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/role_grant_offer_enumeration.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAuD9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAEtD,sDAAsD;AACtD,MAAM,WAAW,yCAAyC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAQD,eAAO,MAAM,iDAAiD,GAC7D,SAAS,yCAAyC,KAChD,IA4FF,CAAC"}
1
+ {"version":3,"file":"role_grant_offer_enumeration.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/role_grant_offer_enumeration.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAwD9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAEtD,sDAAsD;AACtD,MAAM,WAAW,yCAAyC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAQD,eAAO,MAAM,iDAAiD,GAC7D,SAAS,yCAAyC,KAChD,IAqGF,CAAC"}
@@ -46,6 +46,7 @@ import { describe, test, assert } from 'vitest';
46
46
  import { rpc_call } from '../rpc_helpers.js';
47
47
  import { ROLE_ADMIN } from '../../auth/role_schema.js';
48
48
  import { ERROR_ROLE_GRANT_OFFER_ACTOR_MISMATCH, ERROR_ROLE_GRANT_OFFER_NOT_FOUND } from '../../auth/role_grant_offer_action_specs.js';
49
+ import { assert_iso8601_seconds } from './wire_shapes.js';
49
50
  import { SPINE_RPC_PATH } from './spine_surface_constants.js';
50
51
  /** A well-formed UUID that never names a real offer — exercises the not-found arm. */
51
52
  const NIL_UUID = '00000000-0000-0000-0000-000000000000';
@@ -84,7 +85,12 @@ export const describe_role_grant_offer_enumeration_cross_tests = (options) => {
84
85
  // Offer ROLE_ADMIN to the keeper's account, TARGETED at actor A.
85
86
  const created = await rpc(fixture.fresh_transport(), 'role_grant_offer_create', { to_account_id: fixture.account.id, to_actor_id: target_actor.id, role: ROLE_ADMIN }, grantor.create_session_headers());
86
87
  assert.ok(created.ok, `offer create must succeed: ${JSON.stringify(created)}`);
87
- const offer_id = created.result.offer.id;
88
+ const offer = created.result.offer;
89
+ // Byte-shape gate on the offer's server-minted timestamps — a
90
+ // millisecond stamp parses the same but is a wire divergence.
91
+ assert_iso8601_seconds(offer.created_at, 'offer.created_at');
92
+ assert_iso8601_seconds(offer.expires_at, 'offer.expires_at');
93
+ const offer_id = offer.id;
88
94
  // Sibling actor B (same account) tries to accept A's offer → 403
89
95
  // actor_mismatch. The offer stays pending (no mutation on the denial).
90
96
  const sibling_accept = await rpc(fixture.transport, 'role_grant_offer_accept', { offer_id, acting: sibling.id }, fixture.create_session_headers());
@@ -217,16 +217,27 @@ export type SetupTest = () => Promise<TestFixture>;
217
217
  * Base options shared by every imperative cross-backend parity suite
218
218
  * (`origin` / `ready` / `body_size` / `cell_*` / `actor_*` /
219
219
  * `account_lifecycle` / `app_settings` / `testing_backdoor` / …). The
220
- * `{setup_test, capabilities}` core is identical across them; each suite
221
- * extends this with its own path field (`rpc_path` for RPC-dispatched
222
- * suites via `RpcPathCrossSuiteOptions`, `ready_path` for the readiness
223
- * probe, etc.). Lives here in the neutral fixture-types home rather than in
224
- * any one domain helper, so a non-cell suite no longer reaches into the
225
- * cell helpers for its option shape.
220
+ * `setup_test` core is identical across them; each suite extends this with
221
+ * its own path field (`rpc_path` for RPC-dispatched suites via
222
+ * `RpcPathCrossSuiteOptions`, `ready_path` for the readiness probe, etc.),
223
+ * and a suite that actually gates cases on a capability flag extends
224
+ * `CapabilityGatedCrossSuiteOptions` instead. Lives here in the neutral
225
+ * fixture-types home rather than in any one domain helper, so a non-cell
226
+ * suite never reaches into the cell helpers for its option shape.
226
227
  */
227
228
  export interface CrossSuiteOptions {
228
229
  /** Per-test fixture-producing function (fresh keeper + db per call). */
229
230
  readonly setup_test: SetupTest;
231
+ }
232
+ /**
233
+ * `CrossSuiteOptions` for a suite that reads capability flags — the ones
234
+ * whose cases are `test_if`-gated on a per-backend declaration. The field is
235
+ * on this variant rather than the base so a suite's option type states
236
+ * whether it consults capabilities: a caller cannot pass a flag bundle to a
237
+ * suite that ignores it, and a suite cannot quietly stop reading one while
238
+ * still demanding it.
239
+ */
240
+ export interface CapabilityGatedCrossSuiteOptions extends CrossSuiteOptions {
230
241
  /** Backend capability declarations — each suite gates on its own flag. */
231
242
  readonly capabilities: BackendCapabilities;
232
243
  }
@@ -241,6 +252,15 @@ export interface RpcPathCrossSuiteOptions extends CrossSuiteOptions {
241
252
  /** RPC endpoint path the methods are mounted on. Default `/api/rpc`. */
242
253
  readonly rpc_path?: string;
243
254
  }
255
+ /**
256
+ * The RPC-dispatched shape for a capability-gating suite — the intersection
257
+ * of `RpcPathCrossSuiteOptions` and `CapabilityGatedCrossSuiteOptions`, and
258
+ * the most common option shape among the imperative cross suites (every
259
+ * `cell_*` suite, `query_shape`, `token_scope_surface`, `fact_serving`,
260
+ * `account_lifecycle`).
261
+ */
262
+ export interface RpcPathCapabilityGatedCrossSuiteOptions extends RpcPathCrossSuiteOptions, CapabilityGatedCrossSuiteOptions {
263
+ }
244
264
  /**
245
265
  * Cross-process backend handle enriched with the bootstrapped keeper's
246
266
  * captured credentials. Consumers compose this in vitest's
@@ -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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"}
@@ -59,7 +59,11 @@ export interface StandardCrossProcessTestOptions {
59
59
  * in-process and cross-process tests.
60
60
  */
61
61
  surface_source: AppSurfaceSpec;
62
- /** Backend capability declarations. */
62
+ /**
63
+ * Backend capability declarations. Forwarded to the one bundled suite
64
+ * that gates on them (`describe_standard_integration_tests`); the other
65
+ * suites in the bundle read no flags and take no capability field.
66
+ */
63
67
  capabilities: BackendCapabilities;
64
68
  /** Session config — needed for cookie_name + factory-form rpc_endpoints resolution. */
65
69
  session_options: SessionOptions<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"standard.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/standard.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,+BAA+B;IAC/C,2CAA2C;IAC3C,UAAU,EAAE,SAAS,CAAC;IACtB;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B,uCAAuC;IACvC,YAAY,EAAE,mBAAmB,CAAC;IAClC,uFAAuF;IACvF,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;OAKG;IACH,aAAa,EAAE,uBAAuB,CAAC;IACvC;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,GAAG,CAC1B,MAAM,EACN,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CACnF,CAAC;CACF;AAED;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAwCF,CAAC"}
1
+ {"version":3,"file":"standard.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/standard.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,+BAA+B;IAC/C,2CAA2C;IAC3C,UAAU,EAAE,SAAS,CAAC;IACtB;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B;;;;OAIG;IACH,YAAY,EAAE,mBAAmB,CAAC;IAClC,uFAAuF;IACvF,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;OAKG;IACH,aAAa,EAAE,uBAAuB,CAAC;IACvC;;;OAGG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,GAAG,CAC1B,MAAM,EACN,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CACnF,CAAC;CACF;AAED;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAoCF,CAAC"}
@@ -21,28 +21,24 @@ export const describe_standard_cross_process_tests = (options) => {
21
21
  describe_round_trip_validation({
22
22
  setup_test: options.setup_test,
23
23
  surface_source: options.surface_source,
24
- capabilities: options.capabilities,
25
24
  skip_routes: options.round_trip_skip_routes,
26
25
  success_fixtures: options.rest_success_fixtures
27
26
  });
28
27
  describe_rpc_round_trip_tests({
29
28
  setup_test: options.setup_test,
30
29
  surface_source: options.surface_source,
31
- capabilities: options.capabilities,
32
30
  session_options: options.session_options,
33
31
  rpc_endpoints: options.rpc_endpoints,
34
32
  success_fixtures: options.rpc_success_fixtures
35
33
  });
36
34
  describe_data_exposure_tests({
37
35
  setup_test: options.setup_test,
38
- surface_source: options.surface_source,
39
- capabilities: options.capabilities
36
+ surface_source: options.surface_source
40
37
  });
41
38
  if (options.roles) {
42
39
  describe_standard_admin_integration_tests({
43
40
  setup_test: options.setup_test,
44
41
  surface_source: options.surface_source,
45
- capabilities: options.capabilities,
46
42
  session_options: options.session_options,
47
43
  roles: options.roles,
48
44
  rpc_endpoints: options.rpc_endpoints,
@@ -30,7 +30,7 @@ import '../assert_dev_env.js';
30
30
  *
31
31
  * Each method is sent with **valid** params so each case varies only the
32
32
  * credential. (Validation runs after the gates — the order is 401 → authz →
33
- * 403 → 400 — so the shapes are belt-and-suspenders here rather than load-
33
+ * 403 → 429 → 400 — so the shapes are belt-and-suspenders here rather than load-
34
34
  * bearing.) The handler never runs (the gate refuses first), so the writes
35
35
  * never execute.
36
36
  *
@@ -428,6 +428,11 @@ export declare const testing_action_manifest_action_spec: {
428
428
  }>;
429
429
  roles: z.ZodArray<z.ZodString>;
430
430
  credential_types: z.ZodArray<z.ZodString>;
431
+ rate_limit: z.ZodNullable<z.ZodEnum<{
432
+ account: "account";
433
+ ip: "ip";
434
+ both: "both";
435
+ }>>;
431
436
  }, z.core.$strict>>;
432
437
  }, z.core.$strict>;
433
438
  readonly async: true;
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAKzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAqCzC;;;;;;;;;;;;;;;;;;;;;;;;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,SACmB,CAAC;AAE3E;;;;;;;;;;;;;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;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;CAYJ,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,uCAAuC,QAAO,SAGzD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYF,CAAC;AAyB/C,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,CAsIjB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAKzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAqCzC;;;;;;;;;;;;;;;;;;;;;;;;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,SACmB,CAAC;AAE3E;;;;;;;;;;;;;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;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;CAYJ,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,uCAAuC,QAAO,SAGzD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYF,CAAC;AAyB/C,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,CAsIjB,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,UAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"token_lifetime.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_lifetime.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+C9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC7C,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAaD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IAiHF,CAAC"}
1
+ {"version":3,"file":"token_lifetime.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_lifetime.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAgD9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC7C,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAaD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IAsHF,CAAC"}
@@ -37,6 +37,7 @@ import '../assert_dev_env.js';
37
37
  import { describe, test, assert } from 'vitest';
38
38
  import { account_token_create_action_spec, account_token_list_action_spec, TokenCreateOutput, TokenListOutput } from '../../auth/account_action_specs.js';
39
39
  import { cross_rpc_call, error_reason, expect_output } from './cell_cross_helpers.js';
40
+ import { assert_iso8601_seconds } from './wire_shapes.js';
40
41
  import { SPINE_RPC_PATH } from './spine_surface_constants.js';
41
42
  /** TTL used by the bounded-mint case. */
42
43
  const TTL_DAYS = 30;
@@ -61,6 +62,9 @@ export const describe_token_lifetime_cross_tests = (options) => {
61
62
  }, fixture.create_session_headers());
62
63
  const created = expect_output(create_res, TokenCreateOutput);
63
64
  assert.ok(created.expires_at !== null, 'a ttl mint must return a non-null expires_at — null means the spine dropped the field');
65
+ // Byte-shape gate: `z.string()` accepts a millisecond stamp too, so
66
+ // `expect_output` above can't tell the two spines apart.
67
+ assert_iso8601_seconds(created.expires_at, 'token_create.expires_at');
64
68
  const expires_ms = Date.parse(created.expires_at);
65
69
  assert.ok(!Number.isNaN(expires_ms), `expires_at must parse as a date: ${created.expires_at}`);
66
70
  const expected = before + TTL_DAYS * 86_400_000;
@@ -71,6 +75,8 @@ export const describe_token_lifetime_cross_tests = (options) => {
71
75
  const row = listed.tokens.find((t) => t.id === created.id);
72
76
  assert.ok(row, 'the minted token must appear in account_token_list');
73
77
  assert.ok(row.expires_at !== null, 'account_token_list must report the stored expiry, not null');
78
+ assert_iso8601_seconds(row.expires_at, 'token_list.expires_at');
79
+ assert_iso8601_seconds(row.created_at, 'token_list.created_at');
74
80
  });
75
81
  test('an eternal mint stores NULL expiry', async () => {
76
82
  const fixture = await setup_test();
@@ -1,7 +1,7 @@
1
1
  import '../assert_dev_env.js';
2
- import type { RpcPathCrossSuiteOptions } from './setup.js';
2
+ import type { RpcPathCapabilityGatedCrossSuiteOptions } from './setup.js';
3
3
  /** Options for the token-scope surface parity suite. */
4
- export interface TokenScopeSurfaceCrossTestOptions extends RpcPathCrossSuiteOptions {
4
+ export interface TokenScopeSurfaceCrossTestOptions extends RpcPathCapabilityGatedCrossSuiteOptions {
5
5
  /** Audit-log SSE path. Default `/api/admin/audit/stream`. */
6
6
  readonly sse_path?: string;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token_scope_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_scope_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAiE9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAkB3D,wDAAwD;AACxD,MAAM,WAAW,iCAAkC,SAAQ,wBAAwB;IAClF,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2DD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAwHF,CAAC"}
1
+ {"version":3,"file":"token_scope_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_scope_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAiE9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAkB1E,wDAAwD;AACxD,MAAM,WAAW,iCAAkC,SAAQ,uCAAuC;IACjG,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2DD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAwHF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import '../assert_dev_env.js';
2
+ /**
3
+ * Assert `value` is a timestamp in the spine's canonical wire shape:
4
+ * second-precision UTC, exactly 20 characters. The TS spine emits it from
5
+ * the `iso8601_timestamp_column` SQL projection (`db/sql_columns.ts`) and
6
+ * `to_iso8601_seconds` (`timestamp.ts`); the Rust spine from
7
+ * `fuz_db::iso8601_timestamp_column` and `fuz_sys::rfc3339_now`.
8
+ *
9
+ * @param value - the field read off a wire response
10
+ * @param label - the field's name, for the failure message
11
+ */
12
+ export declare const assert_iso8601_seconds: (value: unknown, label: string) => void;
13
+ /**
14
+ * Assert `value` is either `null` or a canonical second-precision UTC
15
+ * timestamp — the shape of every nullable timestamp on the wire
16
+ * (`expires_at`, `deleted_at`, `updated_at`, …).
17
+ *
18
+ * @param value - the field read off a wire response
19
+ * @param label - the field's name, for the failure message
20
+ */
21
+ export declare const assert_iso8601_seconds_nullable: (value: unknown, label: string) => void;
22
+ //# sourceMappingURL=wire_shapes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire_shapes.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/wire_shapes.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkB9B;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,EAAE,OAAO,MAAM,KAAG,IAMtE,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,GAAI,OAAO,OAAO,EAAE,OAAO,MAAM,KAAG,IAG/E,CAAC"}
@@ -0,0 +1,41 @@
1
+ import '../assert_dev_env.js';
2
+ /**
3
+ * Wire-shape assertions shared by the cross-backend suites.
4
+ *
5
+ * A field can carry the right value on both backends and still be a parity
6
+ * defect if the two serialize it differently — a millisecond
7
+ * `2026-05-17T12:34:56.789Z` and a second-precision `2026-05-17T12:34:56Z`
8
+ * both parse as the same instant, so a Zod `z.string()` check and an
9
+ * `assert.ok(value)` pass on either. These helpers pin the bytes.
10
+ *
11
+ * @module
12
+ */
13
+ import { assert } from 'vitest';
14
+ import { ISO8601_SECONDS } from '../../timestamp.js';
15
+ /**
16
+ * Assert `value` is a timestamp in the spine's canonical wire shape:
17
+ * second-precision UTC, exactly 20 characters. The TS spine emits it from
18
+ * the `iso8601_timestamp_column` SQL projection (`db/sql_columns.ts`) and
19
+ * `to_iso8601_seconds` (`timestamp.ts`); the Rust spine from
20
+ * `fuz_db::iso8601_timestamp_column` and `fuz_sys::rfc3339_now`.
21
+ *
22
+ * @param value - the field read off a wire response
23
+ * @param label - the field's name, for the failure message
24
+ */
25
+ export const assert_iso8601_seconds = (value, label) => {
26
+ assert.isTrue(typeof value === 'string', `${label} must be a string, got ${JSON.stringify(value)}`);
27
+ assert.match(value, ISO8601_SECONDS, `${label} must be second-precision UTC`);
28
+ };
29
+ /**
30
+ * Assert `value` is either `null` or a canonical second-precision UTC
31
+ * timestamp — the shape of every nullable timestamp on the wire
32
+ * (`expires_at`, `deleted_at`, `updated_at`, …).
33
+ *
34
+ * @param value - the field read off a wire response
35
+ * @param label - the field's name, for the failure message
36
+ */
37
+ export const assert_iso8601_seconds_nullable = (value, label) => {
38
+ if (value === null)
39
+ return;
40
+ assert_iso8601_seconds(value, label);
41
+ };
@@ -1,6 +1,5 @@
1
1
  import './assert_dev_env.js';
2
2
  import type { AppSurface, AppSurfaceSpec } from '../http/surface.js';
3
- import type { BackendCapabilities } from './cross_backend/capabilities.js';
4
3
  import type { SetupTest } from './cross_backend/setup.js';
5
4
  /**
6
5
  * Recursively collect all property names from a JSON Schema.
@@ -26,8 +25,6 @@ export interface DataExposureTestOptions {
26
25
  * TS by the consumer; same shape for in-process and cross-process tests.
27
26
  */
28
27
  surface_source: AppSurfaceSpec;
29
- /** Backend capability declarations. */
30
- capabilities: BackendCapabilities;
31
28
  /** Fields that must never appear in any response. Default: `sensitive_field_blocklist`. */
32
29
  sensitive_fields?: ReadonlyArray<string>;
33
30
  /** Fields that must not appear in non-admin responses. Default: `admin_only_field_blocklist`. */
@@ -1 +1 @@
1
- {"version":3,"file":"data_exposure.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/data_exposure.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAqB7B,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,0BAA0B,CAAC;AAIvE;;;;;GAKG;AACH,eAAO,MAAM,kCAAkC,GAAI,QAAQ,OAAO,KAAG,GAAG,CAAC,MAAM,CAuB9E,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,yCAAyC,GACrD,SAAS,UAAU,EACnB,mBAAkB,aAAa,CAAC,MAAM,CAA6B,KACjE,IAWF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wCAAwC,GACpD,SAAS,UAAU,EACnB,oBAAmB,aAAa,CAAC,MAAM,CAA8B,KACnE,IAgBF,CAAC;AAIF,kDAAkD;AAClD,MAAM,WAAW,uBAAuB;IACvC,kEAAkE;IAClE,UAAU,EAAE,SAAS,CAAC;IACtB;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B,uCAAuC;IACvC,YAAY,EAAE,mBAAmB,CAAC;IAClC,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,iGAAiG;IACjG,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,kDAAkD;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,GAAI,SAAS,uBAAuB,KAAG,IA2L/E,CAAC"}
1
+ {"version":3,"file":"data_exposure.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/data_exposure.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAqB7B,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYrE,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,0BAA0B,CAAC;AAIvE;;;;;GAKG;AACH,eAAO,MAAM,kCAAkC,GAAI,QAAQ,OAAO,KAAG,GAAG,CAAC,MAAM,CAuB9E,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,yCAAyC,GACrD,SAAS,UAAU,EACnB,mBAAkB,aAAa,CAAC,MAAM,CAA6B,KACjE,IAWF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wCAAwC,GACpD,SAAS,UAAU,EACnB,oBAAmB,aAAa,CAAC,MAAM,CAA8B,KACnE,IAgBF,CAAC;AAIF,kDAAkD;AAClD,MAAM,WAAW,uBAAuB;IACvC,kEAAkE;IAClE,UAAU,EAAE,SAAS,CAAC;IACtB;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,iGAAiG;IACjG,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,kDAAkD;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,GAAI,SAAS,uBAAuB,KAAG,IA0L/E,CAAC"}
@@ -96,7 +96,6 @@ export const describe_data_exposure_tests = (options) => {
96
96
  const { surface, route_specs } = options.surface_source;
97
97
  const { sensitive_fields = sensitive_field_blocklist, admin_only_fields = admin_only_field_blocklist } = options;
98
98
  const skip_set = new Set(options.skip_routes);
99
- void options.capabilities;
100
99
  describe('data exposure — schema-level', () => {
101
100
  test('no sensitive fields in any output schema', () => {
102
101
  assert_output_schemas_no_sensitive_fields(surface, sensitive_fields);