@githolon/dsl 0.108.7 → 0.110.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 (307) hide show
  1. package/assets/operation-contract.wasm +0 -0
  2. package/check_package.mjs +12 -15
  3. package/compile_package.mjs +17 -18
  4. package/compile_proof.mjs +16 -1
  5. package/dart/CHANGELOG.md +76 -1
  6. package/dart/README.md +25 -2
  7. package/dart/lib/src/admission_decision.dart +41 -0
  8. package/dart/lib/src/application_framework_calls.dart +52 -2
  9. package/dart/lib/src/application_model_adoption.dart +187 -0
  10. package/dart/lib/src/application_status.dart +73 -0
  11. package/dart/lib/src/console_enrolment.dart +271 -0
  12. package/dart/lib/src/console_http_io.dart +26 -0
  13. package/dart/lib/src/console_http_stub.dart +7 -0
  14. package/dart/lib/src/dev_cloud.dart +69 -22
  15. package/dart/lib/src/generated_call.dart +83 -23
  16. package/dart/lib/src/kernel_primitives.dart +119 -0
  17. package/dart/lib/src/nms_conformance_runtime.dart +1 -1
  18. package/dart/lib/src/nms_generated_runtime.dart +32 -10
  19. package/dart/lib/src/nms_test_environment.dart +1 -1
  20. package/dart/lib/src/node_runner_transport.dart +41 -46
  21. package/dart/lib/src/observed_session_directory.dart +70 -0
  22. package/dart/lib/src/operation_receipts.dart +112 -0
  23. package/dart/lib/src/peer_application_streams.dart +103 -0
  24. package/dart/lib/src/reception/dart_reception.dart +4280 -0
  25. package/dart/lib/src/reception/event_desk.dart +211 -0
  26. package/dart/lib/src/reception/extremum_read.dart +46 -0
  27. package/dart/lib/src/reception/local_copies.dart +371 -0
  28. package/dart/lib/src/reception/peer_office_connection.dart +11 -0
  29. package/dart/lib/src/reception/progress_desk.dart +267 -0
  30. package/dart/lib/src/reception/reception_contract.dart +11 -0
  31. package/dart/lib/src/reception/reception_session.dart +284 -0
  32. package/dart/lib/src/reception/sync_diagnostics.dart +26 -0
  33. package/dart/lib/src/reception/workspace_preparation_report.dart +126 -0
  34. package/dart/lib/src/replica_readiness.dart +123 -0
  35. package/dart/lib/src/runner/node-entry.mjs +23905 -15774
  36. package/dart/lib/src/runtime_v2_gateway.dart +56 -3
  37. package/dart/lib/src/runtime_v2_transport.dart +544 -3
  38. package/dart/lib/src/session_bound.dart +200 -311
  39. package/dart/lib/src/signing_identity_kernel.dart +84 -0
  40. package/dart/lib/src/sync_status_projection.dart +548 -0
  41. package/dart/lib/src/sync_status_reducer.dart +170 -0
  42. package/dart/lib/src/test_harness.dart +809 -1153
  43. package/dart/lib/src/testing/test_custody.dart +66 -0
  44. package/dart/lib/src/testing/test_peer.dart +328 -0
  45. package/dart/lib/src/typed_watch_registry.dart +169 -0
  46. package/dart/lib/src/workspace_open_progress.dart +27 -0
  47. package/dart/pubspec.lock +24 -1
  48. package/dart/pubspec.yaml +7 -2
  49. package/dart/pubspec_overrides.yaml +2 -0
  50. package/dart/test/admission_decision_test.dart +48 -0
  51. package/dart/test/background_model_adoption_test.dart +228 -0
  52. package/dart/test/bundle_version_pairing_test.dart +4 -4
  53. package/dart/test/child_authentication_repair_test.dart +359 -0
  54. package/dart/test/cloud_bound_local_shell_test.dart +119 -0
  55. package/dart/test/console_enrolment_refusal_test.dart +52 -0
  56. package/dart/test/console_enrolment_test.dart +227 -0
  57. package/dart/test/errors_test.dart +5 -5
  58. package/dart/test/event_plane_seam_test.dart +50 -164
  59. package/dart/test/extremum_read_test.dart +58 -0
  60. package/dart/test/fixtures/wedge/wedge-entry.mjs +3 -21
  61. package/dart/test/generated_query_test.dart +32 -0
  62. package/dart/test/harness_phase_timeout_test.dart +18 -23
  63. package/dart/test/kernel_author_after_read_test.dart +242 -0
  64. package/dart/test/kernel_fence_test.dart +137 -0
  65. package/dart/test/local_copies_test.dart +222 -0
  66. package/dart/test/model_adoption_test.dart +198 -0
  67. package/dart/test/node_peer_local_custody_test.dart +153 -0
  68. package/dart/test/offer_authentication_proof_test.dart +352 -52
  69. package/dart/test/operation_compatibility_test.dart +151 -0
  70. package/dart/test/platform_credential_effect_test.dart +386 -0
  71. package/dart/test/receiving_group_open_test.dart +213 -0
  72. package/dart/test/reception/workspace_preparation_report_test.dart +103 -0
  73. package/dart/test/reception_span_trace_test.dart +23 -0
  74. package/dart/test/replica_readiness_test.dart +156 -0
  75. package/dart/test/runtime_projections_test.dart +92 -0
  76. package/dart/test/runtime_v2_gateway_test.dart +131 -0
  77. package/dart/test/signing_identity_kernel_test.dart +75 -0
  78. package/dart/test/sync_status_preparation_report_test.dart +29 -0
  79. package/dart/test/sync_status_reducer_test.dart +419 -0
  80. package/dart/test/test_harness_test.dart +71 -95
  81. package/dart/test/typed_query_watch_test.dart +170 -0
  82. package/dart/test/typed_watch_registry_test.dart +249 -0
  83. package/dart_lints/README.md +18 -0
  84. package/dart_lints/lib/nomos_lints.dart +70 -0
  85. package/dart_lints/pubspec.lock +580 -0
  86. package/dart_lints/pubspec.yaml +12 -0
  87. package/dart_lints/test/reference_identity_test.dart +75 -0
  88. package/dart_types/CHANGELOG.md +18 -0
  89. package/dart_types/lib/nomos_kernel_protocol.dart +21 -1
  90. package/dart_types/lib/nomos_types.dart +9 -1
  91. package/dart_types/lib/src/admission_decision.dart +37 -0
  92. package/dart_types/lib/src/aggregate_meta.dart +1 -1
  93. package/dart_types/lib/src/approved_model.dart +65 -0
  94. package/dart_types/lib/src/custody.dart +10 -18
  95. package/dart_types/lib/src/error_info.dart +4 -4
  96. package/dart_types/lib/src/errors.dart +29 -29
  97. package/dart_types/lib/src/foreign_ref.dart +62 -33
  98. package/dart_types/lib/src/local_work_rejected.dart +3 -3
  99. package/dart_types/lib/src/nomos_ref.dart +3 -1
  100. package/dart_types/lib/src/principal.dart +2 -2
  101. package/dart_types/lib/src/proto/google/protobuf/any.pb.dart +163 -0
  102. package/dart_types/lib/src/proto/google/protobuf/any.pbenum.dart +11 -0
  103. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pb.dart +137 -0
  104. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pbenum.dart +11 -0
  105. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pb.dart +20721 -10433
  106. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pbenum.dart +555 -27
  107. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pb.dart +387 -0
  108. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pbenum.dart +46 -0
  109. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart +295 -0
  110. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pbenum.dart +139 -0
  111. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pb.dart +269 -0
  112. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pbenum.dart +103 -0
  113. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pb.dart +417 -0
  114. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pbenum.dart +62 -0
  115. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pb.dart +9968 -0
  116. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pbenum.dart +133 -0
  117. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pb.dart +204 -0
  118. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pbenum.dart +54 -0
  119. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pb.dart +1550 -0
  120. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pbenum.dart +11 -0
  121. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pb.dart +710 -0
  122. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pbenum.dart +11 -0
  123. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pb.dart +845 -0
  124. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pbenum.dart +11 -0
  125. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pb.dart +198 -0
  126. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pbenum.dart +11 -0
  127. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pb.dart +369 -0
  128. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pbenum.dart +11 -0
  129. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pb.dart +609 -0
  130. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pbenum.dart +65 -0
  131. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart +358 -0
  132. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pbenum.dart +100 -0
  133. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pb.dart +2231 -0
  134. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pbenum.dart +271 -0
  135. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pb.dart +1286 -0
  136. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pbenum.dart +11 -0
  137. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart +636 -0
  138. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pbenum.dart +116 -0
  139. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pb.dart +1637 -0
  140. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pbenum.dart +175 -0
  141. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pb.dart +1269 -0
  142. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pbenum.dart +129 -0
  143. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pb.dart +2782 -0
  144. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pbenum.dart +97 -0
  145. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +2232 -8627
  146. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pbenum.dart +0 -358
  147. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pb.dart +1639 -0
  148. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pbenum.dart +46 -0
  149. package/dart_types/lib/src/runtime_outcome.dart +133 -0
  150. package/dart_types/lib/src/subscriptions.dart +116 -23
  151. package/dart_types/pubspec.yaml +1 -1
  152. package/dart_types/test/extremum_subscriptions_test.dart +40 -0
  153. package/dart_types/test/foreign_ref_resolution_test.dart +75 -0
  154. package/dart_types/test/nomos_ref_address_test.dart +25 -0
  155. package/dart_types/test/ordered_subscriptions_test.dart +34 -0
  156. package/operation_contract_check.mjs +24 -0
  157. package/package.json +11 -6
  158. package/src/aggregate.ts +70 -10
  159. package/src/application_topology.ts +18 -11
  160. package/src/attested.ts +3 -0
  161. package/src/attested_core.ts +46 -3
  162. package/src/birth_meter_ensure.ts +19 -7
  163. package/src/births.ts +29 -4
  164. package/src/build_package.ts +140 -13
  165. package/src/business_birth.ts +181 -4
  166. package/src/codegen_call_proto.ts +1274 -0
  167. package/src/codegen_call_usda.ts +49 -6
  168. package/src/codegen_dart.ts +79 -44
  169. package/src/codegen_dart_client.ts +458 -800
  170. package/src/{codegen_dart_application.ts → codegen_dart_facade.ts} +331 -582
  171. package/src/codegen_dart_framework_calls.ts +320 -37
  172. package/src/codegen_dart_indexed_variant.ts +159 -0
  173. package/src/codegen_dart_scenario.ts +42 -13
  174. package/src/codegen_proof.ts +3 -3
  175. package/src/codegen_provider_dart.ts +5 -0
  176. package/src/codegen_query_proto.ts +158 -0
  177. package/src/codegen_refusal.ts +189 -0
  178. package/src/codegen_result_proto.ts +931 -0
  179. package/src/codegen_result_usda.ts +4 -0
  180. package/src/codegen_ts.ts +464 -616
  181. package/src/codegen_workspace_access.ts +105 -0
  182. package/src/compatibility_graph.ts +759 -0
  183. package/src/compatibility_usda.ts +264 -0
  184. package/src/compile_package_main.ts +1994 -1189
  185. package/src/custody_placement.ts +156 -0
  186. package/src/custody_placement_usda.ts +91 -0
  187. package/src/decl_shapes.ts +21 -2
  188. package/src/describe_model.ts +1 -0
  189. package/src/directive.ts +59 -2
  190. package/src/drivers.ts +51 -0
  191. package/src/engine_entry.ts +52 -8
  192. package/src/evolve_preview.ts +11 -4
  193. package/src/exists.ts +2 -0
  194. package/src/fields.ts +75 -11
  195. package/src/flow_gate.ts +2 -1
  196. package/src/framework/application_home.ts +170 -18
  197. package/src/framework/attested_receipts.ts +8 -3
  198. package/src/framework/auth_provider_law.ts +169 -9
  199. package/src/framework/birth_certificate_law.ts +4 -0
  200. package/src/framework/capability.ts +34 -3
  201. package/src/framework/child_authentication.ts +346 -0
  202. package/src/framework/console_governance.ts +295 -0
  203. package/src/framework/delegated_roles.ts +301 -0
  204. package/src/framework/domain_lifecycle.ts +26 -13
  205. package/src/framework/founding_genesis.ts +193 -0
  206. package/src/framework/framework_aggregates.ts +1 -1
  207. package/src/framework/genesis.ts +6 -1
  208. package/src/framework/governance_relations.ts +19 -0
  209. package/src/framework/home.ts +5 -734
  210. package/src/framework/legacy/child_auth_provider_epoch.ts +73 -0
  211. package/src/framework/model_authority_repair.ts +116 -0
  212. package/src/framework/model_authority_seed.ts +185 -0
  213. package/src/framework/model_transition.ts +211 -0
  214. package/src/framework/owned_custody.ts +1 -1
  215. package/src/framework/principal_enrollment.ts +302 -0
  216. package/src/framework/receiving_group.ts +857 -0
  217. package/src/framework/receiving_group_recovery.ts +314 -0
  218. package/src/framework/relations.ts +4 -8
  219. package/src/framework/signing_identity.ts +242 -95
  220. package/src/framework/source_roster.ts +11 -5
  221. package/src/framework/workspace_access.ts +149 -0
  222. package/src/framework/workspace_invariant.ts +73 -52
  223. package/src/framework/workspaces.ts +407 -40
  224. package/src/framework_call_definitions.ts +32 -3
  225. package/src/generated_client_bundle_boundary.ts +97 -0
  226. package/src/generated_client_names.ts +1 -0
  227. package/src/identity_usda.ts +27 -0
  228. package/src/index.ts +183 -12
  229. package/src/indexed_variant.ts +83 -0
  230. package/src/intent.ts +173 -45
  231. package/src/law_check.ts +8 -5
  232. package/src/law_dependency_index.ts +231 -0
  233. package/src/law_graph.ts +508 -71
  234. package/src/law_graph_usda.ts +170 -24
  235. package/src/law_identity.ts +119 -81
  236. package/src/law_source_map.ts +4 -1
  237. package/src/law_units.ts +498 -0
  238. package/src/law_value_type.ts +7 -3
  239. package/src/member_authentication.ts +302 -0
  240. package/src/null_meta.ts +1 -1
  241. package/src/openusd_compiled_layer.ts +132 -0
  242. package/src/operation_contract_check.ts +31 -0
  243. package/src/ordered_read.ts +2 -1
  244. package/src/package_config.ts +33 -12
  245. package/src/package_dependencies.ts +1 -0
  246. package/src/plan_source_slice.ts +30 -1
  247. package/src/protobuf_field_number.ts +36 -0
  248. package/src/provenance_wire.ts +6 -0
  249. package/src/query.ts +2 -1
  250. package/src/read.ts +50 -0
  251. package/src/relation.ts +4 -1
  252. package/src/relation_schema.ts +15 -2
  253. package/src/report.ts +2 -2
  254. package/src/sqlite_computation_bundle.ts +78 -0
  255. package/src/sqlite_computed.ts +102 -0
  256. package/src/sqlite_counts.ts +154 -0
  257. package/src/sqlite_layout.ts +823 -0
  258. package/src/sqlite_reads.ts +275 -0
  259. package/src/sqlite_samples.ts +185 -0
  260. package/src/stable_id_identity_bridge.ts +1 -1
  261. package/src/stable_ids_for_module.ts +16 -4
  262. package/src/test_call_usda.ts +6 -6
  263. package/src/usda_relationship_integrity.ts +20 -3
  264. package/src/usda_text.ts +21 -1
  265. package/src/value_object.ts +81 -11
  266. package/src/wire.ts +22 -0
  267. package/src/wire_encode.ts +227 -20
  268. package/src/workspace_sharding.ts +15 -6
  269. package/src/workspace_sharing.ts +51 -49
  270. package/src/zod_introspection.ts +2 -0
  271. package/compat_package.mjs +0 -46
  272. package/dart/lib/src/home.dart +0 -15
  273. package/dart/lib/src/runner/offline-install.mjs +0 -15367
  274. package/dart/lib/src/source_trust.dart +0 -51
  275. package/dart/lib/src/webview_bridge.dart +0 -6540
  276. package/dart/lib/src/workspace_name.dart +0 -30
  277. package/dart/test/acquire_session_credentials_test.dart +0 -150
  278. package/dart/test/acquire_session_test.dart +0 -534
  279. package/dart/test/adv_realm_interference_test.dart +0 -600
  280. package/dart/test/cloud_bound_topology_test.dart +0 -168
  281. package/dart/test/cluster_births_test.dart +0 -202
  282. package/dart/test/cluster_device_keyed_acceptance_test.dart +0 -105
  283. package/dart/test/cluster_local_autosync_test.dart +0 -123
  284. package/dart/test/cluster_scale_test.dart +0 -122
  285. package/dart/test/compat_test.dart +0 -61
  286. package/dart/test/dlq_session_surface_test.dart +0 -222
  287. package/dart/test/first_app_gauntlet_test.dart +0 -386
  288. package/dart/test/fixtures/wedge/fake-install.mjs +0 -11
  289. package/dart/test/four_layer_nested_topology_test.dart +0 -290
  290. package/dart/test/home_parity_test.dart +0 -13
  291. package/dart/test/local_sync_inert_test.dart +0 -107
  292. package/dart/test/node_runner_transport_test.dart +0 -78
  293. package/dart/test/parent_signer_recovery_test.dart +0 -155
  294. package/dart/test/residency_refusal_test.dart +0 -49
  295. package/dart/test/sealing_client_test.dart +0 -181
  296. package/dart/test/session_bound_test.dart +0 -285
  297. package/dart/test/stale_bundle_test.dart +0 -80
  298. package/dart/test/vo_read_typing_test.dart +0 -131
  299. package/dart/test/watch_after_offer_stall_test.dart +0 -100
  300. package/dart/test/webview_bridge_test.dart +0 -1930
  301. package/dart/test/workspace_name_test.dart +0 -24
  302. package/runtime/generated-application-host.js +0 -22860
  303. package/src/codegen_query_usda.ts +0 -214
  304. package/src/compat_manifest.ts +0 -26
  305. package/src/compat_package_main.ts +0 -224
  306. package/src/shape_compat.ts +0 -352
  307. package/src/usd_state.ts +0 -505
@@ -21,7 +21,10 @@
21
21
  * REMOVAL (refuse) — a sid disappeared; declare a typed retirement in the evolution layer.
22
22
  * CONTRACT (refuse) — same sid, changed value language without a deterministic projection;
23
23
  * needs `.evolvesFrom(...)`, never a disposition.
24
- * DRIVER (refuse) — same sid, changed merge driver; needs a typed evolution or a new field.
24
+ * DRIVER (refuse) — same sid, merge driver moved to a different stored value space (e.g.
25
+ * Lww → Counter); needs a typed evolution or a new field. Switching among single-value
26
+ * drivers (Lww/LwwCausal/LwwBy/FirstWriterWins/FirstWriterCandidates/Surfaced/Attributed)
27
+ * is a plain law change (D20: the driver is a projection-time reduction).
25
28
  * PAYLOAD (warn) — a directive's payload shape changed; clients compiled against the old
26
29
  * law get typed 422s until regenerated (directives are not sid-tracked).
27
30
  *
@@ -31,13 +34,14 @@
31
34
  * reading the carried sids, never produces.
32
35
  */
33
36
  import type { Finding } from "./law_check.js";
34
- import type { DirectivePayloadShape, DomainInterface } from "./shape_compat.js";
35
- import { domainInterface } from "./shape_compat.js";
37
+ import type { DirectivePayloadShape, DomainInterface } from "./compatibility_graph.js";
38
+ import { domainInterface } from "./compatibility_graph.js";
36
39
  import type { StableIds } from "./stable_ids_types.js";
37
40
  import type { CompilerIdentityModel } from "./identity_model.js";
38
41
  export type { CompilerIdentityModel } from "./identity_model.js";
39
42
  import type { DomainModule } from "./codegen_dart.js";
40
43
  import type { WireSchema } from "./wire.js";
44
+ import { driversShareValueSpace } from "./drivers.js";
41
45
 
42
46
  // ── the normalized law shape both sides of the diff speak ──────────────────────────
43
47
 
@@ -346,8 +350,11 @@ function diffDomain(
346
350
  });
347
351
  }
348
352
  const kindChanged = oldF.kind !== "" && newF.kind !== "" && oldF.kind !== newF.kind;
353
+ // A driver switch that keeps the stored value space (among single-value drivers, D20)
354
+ // is a plain law change: the projection re-reduces the same stored antichain.
349
355
  const driverChanged =
350
- oldF.driver !== undefined && newF.driver !== undefined && oldF.driver !== newF.driver;
356
+ oldF.driver !== undefined && newF.driver !== undefined && oldF.driver !== newF.driver &&
357
+ !driversShareValueSpace(JSON.parse(oldF.driver), JSON.parse(newF.driver));
351
358
  const contractChanged =
352
359
  oldF.contract !== undefined && newF.contract !== undefined && oldF.contract !== newF.contract;
353
360
  const evolutionCovered = evolutionReaches(newF, oldF.schema, newF.schema);
package/src/exists.ts CHANGED
@@ -57,6 +57,7 @@ export interface ExistsDecl extends CountDecl {
57
57
  export interface ExistsBuilder<F extends Record<string, Field> = Record<string, Field>> {
58
58
  readonly id: string;
59
59
  readonly of: string;
60
+ readonly _existsMarker: true;
60
61
  /** Attach a PREDICATE: only aggregates satisfying it count toward existence. */
61
62
  where(fn: (p: ReturnType<typeof predBuilder<F>>) => Predicate<F>): ExistsBuilder<F>;
62
63
  /** Partition by a GROUP-BY field: exists per distinct group-key value. */
@@ -136,6 +137,7 @@ function makeExistsBuilder<F extends Record<string, Field>>(
136
137
  const b = {
137
138
  id,
138
139
  of: ofType,
140
+ _existsMarker: true as const,
139
141
  ...(where !== undefined ? { _where: where } : {}),
140
142
  where(fn: (p: ReturnType<typeof predBuilder<F>>) => Predicate<F>): ExistsBuilder<F> {
141
143
  const pred = fn(predBuilder<F>());
package/src/fields.ts CHANGED
@@ -143,7 +143,11 @@ export interface EvidenceRefValue {
143
143
  storageClass: "git" | "external";
144
144
  }
145
145
 
146
- /** One portable address inside Nomos custody. This is identity and routing, never authority. */
146
+ /**
147
+ * One workspace-qualified record identity inside Nomos custody.
148
+ * `workspace` is an identity, not a URL: routing and retention come from that
149
+ * workspace's independently verified placement ref. This value grants no authority.
150
+ */
147
151
  export interface NomosRefValue {
148
152
  readonly workspace: string;
149
153
  readonly type: string;
@@ -250,6 +254,55 @@ export const versionedNomosRefValueSchema: z.ZodType<VersionedNomosRefValue> = z
250
254
  series: nomosRefValueSchema,
251
255
  }).strict();
252
256
 
257
+ // These are the same global brands consumed by `law_value_type.ts`. Field
258
+ // builders must put nominal reference meaning on the Zod value itself because
259
+ // that value is what is lowered into the shared law graph and, from there, the
260
+ // Protobuf contract used by every language. Keeping the target solely on the
261
+ // outer Field made the graph see an anonymous record and forced generators to
262
+ // rediscover type meaning independently.
263
+ const NOMOS_REFOF_SCHEMA_BRAND = Symbol.for("nomos.refOf");
264
+ const NOMOS_VERSIONED_REFOF_SCHEMA_BRAND = Symbol.for("nomos.versionedRefOf");
265
+
266
+ function nomosRefSchema(
267
+ aggregateType: string,
268
+ targetKind: "aggregate" | "contract",
269
+ ): z.ZodType<NomosRefValue> {
270
+ const schema = z.object({
271
+ workspace: z.string().min(1),
272
+ type: z.string().min(1),
273
+ id: z.string().min(1),
274
+ }).strict();
275
+ Object.defineProperty(schema, NOMOS_REFOF_SCHEMA_BRAND, {
276
+ value: { aggregateType, targetKind },
277
+ enumerable: false,
278
+ });
279
+ return schema;
280
+ }
281
+
282
+ function versionedNomosRefSchema(
283
+ targetAggregateType: string,
284
+ targetKind: "aggregate" | "contract",
285
+ seriesAggregateType: string,
286
+ seriesKind: "aggregate" | "contract",
287
+ currentField: string,
288
+ ): z.ZodType<VersionedNomosRefValue> {
289
+ const schema = z.object({
290
+ pinned: nomosRefValueSchema,
291
+ series: nomosRefValueSchema,
292
+ }).strict();
293
+ Object.defineProperty(schema, NOMOS_VERSIONED_REFOF_SCHEMA_BRAND, {
294
+ value: {
295
+ targetAggregateType,
296
+ targetKind,
297
+ seriesAggregateType,
298
+ seriesKind,
299
+ currentField,
300
+ },
301
+ enumerable: false,
302
+ });
303
+ return schema;
304
+ }
305
+
253
306
  /** The Zod schema for an authored `EvidenceRefValue` — the single source of truth. */
254
307
  export const evidenceRefSchema: z.ZodType<EvidenceRefValue> = z.object({
255
308
  hash: z.string(),
@@ -288,28 +341,30 @@ export type ValueObjectFieldDescriptor =
288
341
  /** Present only for an `idOf(recordContract(...))` target. Aggregate is the default. */
289
342
  readonly idOfContract?: true;
290
343
  readonly optional?: true;
344
+ readonly nullable?: true;
291
345
  }
292
346
  /** `int: true` when the zod carried `.int()` (Dart `int`, TS `number`); `unit` when the field
293
347
  * was declared through `unit(...)` — the generated Dart extension-type wrapper's name. */
294
- | { readonly type: "number"; readonly int?: true; readonly unit?: string; readonly optional?: true }
295
- | { readonly type: "boolean"; readonly optional?: true }
348
+ | { readonly type: "number"; readonly int?: true; readonly unit?: string; readonly optional?: true; readonly nullable?: true }
349
+ | { readonly type: "boolean"; readonly optional?: true; readonly nullable?: true }
296
350
  | {
297
351
  readonly type: "enum";
298
352
  readonly values: readonly string[];
299
353
  /** Stable authored scalar name from enumType(...), when this is shared vocabulary. */
300
354
  readonly name?: string;
301
355
  readonly optional?: true;
356
+ readonly nullable?: true;
302
357
  }
303
358
  /** A `z.literal(<string>)` — a CONSTANT discriminator-style member (generated as a getter). */
304
- | { readonly type: "literal"; readonly value: string; readonly optional?: true }
305
- | { readonly type: "array"; readonly items: ValueObjectFieldDescriptor; readonly optional?: true }
359
+ | { readonly type: "literal"; readonly value: string; readonly optional?: true; readonly nullable?: true }
360
+ | { readonly type: "array"; readonly items: ValueObjectFieldDescriptor; readonly optional?: true; readonly nullable?: true }
306
361
  /** A MAP/RECORD (`z.record(z.string(), X)`) — string-keyed entries of `values`. TS
307
362
  * `Record<string, V>`, Dart `Map<String, V>`; the wire is a plain json object. */
308
- | { readonly type: "map"; readonly values: ValueObjectFieldDescriptor; readonly optional?: true }
363
+ | { readonly type: "map"; readonly values: ValueObjectFieldDescriptor; readonly optional?: true; readonly nullable?: true }
309
364
  /** A nested value object, referenced BY NAME (its own descriptor rides alongside). */
310
- | { readonly type: "object"; readonly ref: string; readonly optional?: true }
365
+ | { readonly type: "object"; readonly ref: string; readonly optional?: true; readonly nullable?: true }
311
366
  /** A nested GEO value object (RFC 7946 geometry), referenced by name. */
312
- | { readonly type: "geometry"; readonly ref: string; readonly geometry: GeometryKind; readonly optional?: true };
367
+ | { readonly type: "geometry"; readonly ref: string; readonly geometry: GeometryKind; readonly optional?: true; readonly nullable?: true };
313
368
 
314
369
  /**
315
370
  * One arm of a `union(...)` value object: either an ANONYMOUS shape (fields ride inline,
@@ -947,7 +1002,7 @@ function assertNullEligible(field: Field<unknown, FieldKind>, wrapper: "clearabl
947
1002
  );
948
1003
  }
949
1004
  const dk = (field.driver as { kind?: string }).kind;
950
- if (dk !== "FirstWriterWins" && dk !== "Lww" && dk !== "LwwCausal" && dk !== "LwwBy") {
1005
+ if (dk !== "FirstWriterWins" && dk !== "FirstWriterCandidates" && dk !== "Lww" && dk !== "LwwCausal" && dk !== "LwwBy") {
951
1006
  throw new Error(
952
1007
  `t.${wrapper}(...) needs a wholesale scalar field (FirstWriterWins / Lww / LwwCausal / LwwBy) — ` +
953
1008
  `a null/clear replaces the value WHOLESALE, which a '${dk}' merge cannot express.`,
@@ -1282,7 +1337,10 @@ export const t = {
1282
1337
  target: AggregateHandle<string, Record<string, Field>> | ContractHandle,
1283
1338
  ): Field<NomosRefValue, "ref"> {
1284
1339
  const isContract = (target as { __isContract?: unknown }).__isContract === true;
1285
- return makeField<NomosRefValue, "ref">("ref", nomosRefValueSchema, FirstWriterWins, {
1340
+ return makeField<NomosRefValue, "ref">("ref", nomosRefSchema(
1341
+ target.id,
1342
+ isContract ? "contract" : "aggregate",
1343
+ ), FirstWriterWins, {
1286
1344
  refAggregateId: target.id,
1287
1345
  nomosRef: {
1288
1346
  targetAggregateId: target.id,
@@ -1314,7 +1372,13 @@ export const t = {
1314
1372
  const seriesIsContract = (opts.series as { __isContract?: unknown }).__isContract === true;
1315
1373
  return makeField<VersionedNomosRefValue, "ref">(
1316
1374
  "ref",
1317
- versionedNomosRefValueSchema,
1375
+ versionedNomosRefSchema(
1376
+ opts.target.id,
1377
+ targetIsContract ? "contract" : "aggregate",
1378
+ opts.series.id,
1379
+ seriesIsContract ? "contract" : "aggregate",
1380
+ opts.current,
1381
+ ),
1318
1382
  FirstWriterWins,
1319
1383
  {
1320
1384
  versionedForeignRef: {
package/src/flow_gate.ts CHANGED
@@ -33,6 +33,7 @@ type Projection = {
33
33
  readonly key?: readonly string[];
34
34
  readonly by?: string;
35
35
  readonly valueField?: string;
36
+ readonly orderKey?: string;
36
37
  readonly where?: CanonicalPred;
37
38
  };
38
39
 
@@ -120,7 +121,7 @@ export function assertFlowGate(m: FlowLaw, mod?: FlowModule): void {
120
121
  const typeOf = (p: Projection): string | undefined =>
121
122
  p.of ?? (typeof p.returns === "string" ? p.returns : undefined);
122
123
  const fieldsOf = (p: Projection): (string | undefined)[] =>
123
- [...(p.key ?? []), p.by, p.valueField, ...predFields(p.where)];
124
+ [...(p.key ?? []), p.by, p.valueField, p.orderKey, ...predFields(p.where)];
124
125
  const reads: { list: readonly Projection[]; sink: string }[] = [
125
126
  { list: (m.queries ?? []) as unknown as Projection[], sink: "a query key" },
126
127
  { list: (m.counts ?? []) as unknown as Projection[], sink: "a count group / where" },
@@ -10,13 +10,20 @@
10
10
 
11
11
  import type { AggregateHandle } from "../aggregate.js";
12
12
  import type { ApplicationHomeGenesis } from "../application_home_genesis.js";
13
- import type { WorkspaceRole } from "../births.js";
14
13
  import type { Directive } from "../directive.js";
14
+ import { intent } from "../intent.js";
15
15
  import type { QueryDecl } from "../query.js";
16
16
  import { APPLICATION_HOME_DOMAIN } from "./application_home_domain.js";
17
17
  import {
18
18
  AuthProvider,
19
+ AuthProviderCertificate,
20
+ AuthProviderKey,
21
+ AUTH_PROVIDER_AUTHORITY,
22
+ adoptIdentityProviderWitness,
19
23
  authProvider,
24
+ authProviderCertificates,
25
+ authProviderKeys,
26
+ identityProviderSourceTrust,
20
27
  authProviderSeedBeforeWarrant,
21
28
  seedAuthProvider,
22
29
  setAuthProvider,
@@ -38,12 +45,44 @@ import {
38
45
  receivingGroupRelations,
39
46
  receivingGroupRevocationFollowsPolicy,
40
47
  recordShare,
48
+ recordReceivedWorkspaceAccess,
49
+ receivedWorkspaceAccess,
50
+ receivedWorkspaceAccessIsForOwner,
51
+ receivingGroupFoundedBirthBindsOwner,
41
52
  seedBirthAttestation,
42
53
  seedReceivingGroup,
43
54
  seedReceivingGroupPolicy,
44
55
  sharedByObject,
45
56
  sharedByWorkspace,
46
- } from "./home.js";
57
+ PLATFORM_IDENTITY_PROVIDER_RECOVERY,
58
+ type ReceivingGroupRecoveryPolicy,
59
+ } from "./receiving_group.js";
60
+ import { receivingGroupRecoveryLaw } from "./receiving_group_recovery.js";
61
+ import {
62
+ BirthOrigin,
63
+ FoundingPrincipal,
64
+ birthOriginVirginOnly,
65
+ foundingPrincipalVirginOnly,
66
+ seedBirthOrigin,
67
+ seedFoundingPrincipal,
68
+ } from "./founding_genesis.js";
69
+ import {
70
+ enrollDevice,
71
+ principalScopeRelations,
72
+ relationTuplesByRelation,
73
+ revokeDevice,
74
+ } from "./principal_enrollment.js";
75
+ import { workspaceOperatorRelations } from "./workspaces.js";
76
+ import {
77
+ delegatedRoleRelations,
78
+ grantDelegatedRole,
79
+ revokeDelegatedRole,
80
+ } from "./delegated_roles.js";
81
+ import { consoleGovernanceLaw } from "./console_governance.js";
82
+ import { childAuthenticationExports } from "./child_authentication.js";
83
+ import { modelTransitionExports } from "./model_transition.js";
84
+ import { modelAuthorityRepairExports } from "./model_authority_repair.js";
85
+ import { modelAuthoritySeedBeforeWarrant, seatInheritedModelAuthority } from "./model_authority_seed.js";
47
86
  import { RelationTuple, relationTuplesByObject } from "./relations.js";
48
87
  import {
49
88
  SignerDelegation,
@@ -55,7 +94,11 @@ import {
55
94
  enrollSigner,
56
95
  enrollSignerSelf,
57
96
  enrollSignerSelfRequiresVerified,
97
+ enrollDelegationRetainsEvidence,
98
+ enrollFirstDeviceRetainsEvidence,
58
99
  identityRelations,
100
+ lastAdmissionCheckpointSignerRemains,
101
+ revokeAdmissionCheckpointSigner,
59
102
  revokeSigner,
60
103
  revokeSignerEpochStrictlyIncreases,
61
104
  signerDelegationByUser,
@@ -70,8 +113,10 @@ const internal = <T extends object>(value: T): Internal<T> => ({
70
113
  ...value,
71
114
  businessBirthInternal: true,
72
115
  });
73
- const aggregate = (value: AggregateHandle): Internal<AggregateHandle> => internal(value);
74
- const directive = <P>(value: Directive<P>): Internal<Directive<P>> => internal(value);
116
+ const aggregate = (value: AggregateHandle): Internal<AggregateHandle> =>
117
+ internal(value);
118
+ const directive = <P>(value: Directive<P>): Internal<Directive<P>> =>
119
+ internal(value);
75
120
  const query = (value: QueryDecl): Internal<QueryDecl> => internal(value);
76
121
 
77
122
  // Parent primitive + the law its born home uses. The compiler supplies the application's explicit
@@ -80,8 +125,11 @@ export function applicationHomePolicyLaw(
80
125
  maxChildWorkspacesPerUser: number,
81
126
  birthPolicyDomains: readonly string[],
82
127
  homeGenesis?: ApplicationHomeGenesis,
83
- parentWorkspaceRoles: readonly WorkspaceRole[] = [],
128
+ recoveryPosture?: ReceivingGroupRecoveryPolicy,
84
129
  ) {
130
+ // THE PARENT'S ROLE ON A RECEIVING GROUP IS A FRAMEWORK CONSTANT. The platform that births the anchor is
131
+ // its provider authority (verifier epochs + device repair flow down through that seat); no tenant names it.
132
+ const providerRootRoles = [AUTH_PROVIDER_AUTHORITY];
85
133
  return {
86
134
  __nomos_birthReceivingGroup: directive(
87
135
  birthReceivingGroupForDomain(
@@ -89,20 +137,96 @@ export function applicationHomePolicyLaw(
89
137
  maxChildWorkspacesPerUser,
90
138
  birthPolicyDomains,
91
139
  homeGenesis,
92
- parentWorkspaceRoles,
93
- ),
140
+ providerRootRoles,
141
+ recoveryPosture,
142
+ )
94
143
  ),
144
+ // THE RECOVERY DOOR IS DECLARED, NOT DISCOVERED. Only the attested-parent posture has a platform
145
+ // door; an application that declares nothing (or the guardian default) composes no recovery law at
146
+ // all, so its application-home identity is byte-identical to a compile before this existed.
147
+ ...(recoveryPosture === PLATFORM_IDENTITY_PROVIDER_RECOVERY
148
+ ? receivingGroupRecoveryLaw(recoveryPosture)
149
+ : {}),
150
+ // CHILD AUTHENTICATION IS FRAMEWORK LAW FOR EVERY PACKAGE THAT BIRTHS CHILDREN (receiving_group_
151
+ // lifecycle.md, cut 1 item 3): the verifier-epoch serve/accept pair and the workspace-parameterised
152
+ // child repair, composed here — the one compiler-owned domain, installed into every born workspace —
153
+ // so no tenant copies them per child kind. A package whose only birth-capable domain is this one
154
+ // births no children and composes none of it (the era rule).
155
+ ...(birthPolicyDomains.some((domain) => domain !== APPLICATION_HOME_DOMAIN)
156
+ ? childAuthenticationExports()
157
+ : {}),
158
+ // THE PARENT-DIRECTED MODEL TRANSITION (architecture/parent_directed_model_transition.md) rides the
159
+ // same seam: the platform's direction and the child's attested-parent acceptor, one exported pair,
160
+ // composed only when the package births children.
161
+ ...(birthPolicyDomains.some((domain) => domain !== APPLICATION_HOME_DOMAIN)
162
+ ? modelTransitionExports()
163
+ : {}),
164
+ // THE SELF-HEAL (same design, the third door): a child born before the birth seat existed, and
165
+ // never directed, asks its OWN verified parent for the model authority it should have been born
166
+ // holding. Composed under the same era rule, so a package that births nothing is byte-identical.
167
+ ...(birthPolicyDomains.some((domain) => domain !== APPLICATION_HOME_DOMAIN)
168
+ ? modelAuthorityRepairExports()
169
+ : {}),
95
170
  };
96
171
  }
172
+ // MODEL AUTHORITY DESCENDS: every receiving group is born holding its platform's installDomain holders
173
+ // (the genesis step the birth above embeds), so the anchor law declares the seed + its genesis-only posture.
174
+ export const __nomos_seatInheritedModelAuthority = directive(seatInheritedModelAuthority);
175
+ export const __nomos_modelAuthoritySeedBeforeWarrant = internal(modelAuthoritySeedBeforeWarrant);
97
176
  export const __nomos_ReceivingGroup = aggregate(ReceivingGroup);
98
177
  export const __nomos_seedReceivingGroup = directive(seedReceivingGroup);
99
178
  export const __nomos_ReceivingGroupPolicy = aggregate(ReceivingGroupPolicy);
100
- export const __nomos_seedReceivingGroupPolicy = directive(seedReceivingGroupPolicy);
101
- export const __nomos_receivingGroupNameBindsPrincipal = internal(receivingGroupNameBindsPrincipal);
102
- export const __nomos_receivingGroupRejectsKeylessAdditionalDevice = internal(receivingGroupRejectsKeylessAdditionalDevice);
103
- export const __nomos_receivingGroupAdditionalDeviceFollowsPolicy = internal(receivingGroupAdditionalDeviceFollowsPolicy);
104
- export const __nomos_receivingGroupRevocationFollowsPolicy = internal(receivingGroupRevocationFollowsPolicy);
105
- export const __nomos_receivingGroupRelations = internal(receivingGroupRelations);
179
+ export const __nomos_seedReceivingGroupPolicy = directive(
180
+ seedReceivingGroupPolicy
181
+ );
182
+ export const __nomos_receivingGroupNameBindsPrincipal = internal(
183
+ receivingGroupNameBindsPrincipal
184
+ );
185
+ export const __nomos_receivingGroupRejectsKeylessAdditionalDevice = internal(
186
+ receivingGroupRejectsKeylessAdditionalDevice
187
+ );
188
+ export const __nomos_receivingGroupAdditionalDeviceFollowsPolicy = internal(
189
+ receivingGroupAdditionalDeviceFollowsPolicy
190
+ );
191
+ export const __nomos_receivingGroupRevocationFollowsPolicy = internal(
192
+ receivingGroupRevocationFollowsPolicy
193
+ );
194
+ export const __nomos_receivingGroupRelations = internal(
195
+ receivingGroupRelations
196
+ );
197
+
198
+ // TOKEN-FREE FOUNDING (identity target model D22): the founding step a founded group's recipe carries,
199
+ // the birth origin and warrant the kernel's founded birth effect appends, and what they seat — the
200
+ // operator and enroller relations — plus the enrolled scope's first-key lane, so an enroller the group
201
+ // inherited from its parent enrols (and revokes) the owner's further devices here.
202
+ export const __nomos_FoundingPrincipal = aggregate(FoundingPrincipal);
203
+ // Parent side: the proof that a founded group's author is its owner, and the enroller read its recipe captures.
204
+ export const __nomos_receivingGroupFoundedBirthBindsOwner = internal(receivingGroupFoundedBirthBindsOwner);
205
+ export const __nomos_relationTuplesByRelation = query(relationTuplesByRelation);
206
+ export const __nomos_seedFoundingPrincipal = directive(seedFoundingPrincipal);
207
+ export const __nomos_foundingPrincipalVirginOnly = internal(foundingPrincipalVirginOnly);
208
+ export const __nomos_BirthOrigin = aggregate(BirthOrigin);
209
+ export const __nomos_seedBirthOrigin = directive(seedBirthOrigin);
210
+ export const __nomos_birthOriginVirginOnly = internal(birthOriginVirginOnly);
211
+ export const __nomos_workspaceOperatorRelations = internal(workspaceOperatorRelations);
212
+ export const __nomos_principalScopeRelations = internal(principalScopeRelations);
213
+ // The console's lawful reach into the group (framework/console_governance.ts): the founding seat of the
214
+ // inherited operators' and enrollers' keys and law authority, operator handover, console key rotation.
215
+ export const __nomos_seedInheritedGovernance = directive(consoleGovernanceLaw.seedInheritedGovernance);
216
+ export const __nomos_inheritedGovernanceBeforeWarrant = internal(consoleGovernanceLaw.inheritedGovernanceBeforeWarrant);
217
+ export const __nomos_grantConsoleOperator = directive(consoleGovernanceLaw.grantConsoleOperator);
218
+ export const __nomos_revokeConsoleOperator = directive(consoleGovernanceLaw.revokeConsoleOperator);
219
+ export const __nomos_lastOperatorRemains = internal(consoleGovernanceLaw.lastOperatorRemains);
220
+ export const __nomos_enrollConsoleSigner = directive(consoleGovernanceLaw.enrollConsoleSigner);
221
+ export const __nomos_revokeConsoleSigner = directive(consoleGovernanceLaw.revokeConsoleSigner);
222
+ export const __nomos_lastConsoleSignerRemains = internal(consoleGovernanceLaw.lastConsoleSignerRemains);
223
+ // Roles a parent delegates into founded groups: the parent's policy and grant lane. The child's seat
224
+ // and adoption lane are the tenant's `delegatedRoles(...)` declaration, in the domain that owns the role.
225
+ export const __nomos_delegatedRoleRelations = internal(delegatedRoleRelations);
226
+ export const __nomos_grantDelegatedRole = directive(grantDelegatedRole);
227
+ export const __nomos_revokeDelegatedRole = directive(revokeDelegatedRole);
228
+ export const __nomos_enrollDevice = directive(enrollDevice);
229
+ export const __nomos_revokeDevice = directive(revokeDevice);
106
230
 
107
231
  // Subject-side discovery/share custody.
108
232
  export const __nomos_SharedWithMe = aggregate(SharedWithMe);
@@ -110,6 +234,9 @@ export const __nomos_recordShare = directive(recordShare);
110
234
  export const __nomos_pruneShare = directive(pruneShare);
111
235
  export const __nomos_sharedByWorkspace = query(sharedByWorkspace);
112
236
  export const __nomos_sharedByObject = query(sharedByObject);
237
+ export const __nomos_recordReceivedWorkspaceAccess = recordReceivedWorkspaceAccess;
238
+ export const __nomos_receivedWorkspaceAccess = query(receivedWorkspaceAccess);
239
+ export const __nomos_receivedWorkspaceAccessIsForOwner = internal(receivedWorkspaceAccessIsForOwner);
113
240
 
114
241
  // Warrant, provenance, signer seating, recovery and verifier state.
115
242
  export const __nomos_GenesisWarrant = aggregate(GenesisWarrant);
@@ -123,21 +250,46 @@ export const __nomos_RelationTuple = aggregate(RelationTuple);
123
250
  export const __nomos_relationTuplesByObject = query(relationTuplesByObject);
124
251
  export const __nomos_identityRelations = internal(identityRelations);
125
252
  export const __nomos_enrollSigner = directive(enrollSigner);
126
- export const __nomos_enrollAdmissionCheckpointSigner = directive(enrollAdmissionCheckpointSigner);
253
+ export const __nomos_enrollAdmissionCheckpointSignerIntent = internal(
254
+ intent("enrollAdmissionCheckpointSigner").performs(
255
+ enrollAdmissionCheckpointSigner
256
+ )
257
+ );
258
+ // Called directly (as revokeSigner is), so its last-key invariant binds the directive the offer names.
259
+ export const __nomos_revokeAdmissionCheckpointSigner = directive(revokeAdmissionCheckpointSigner);
260
+ export const __nomos_lastAdmissionCheckpointSignerRemains = internal(
261
+ lastAdmissionCheckpointSignerRemains
262
+ );
127
263
  export const __nomos_enrollFirstDevice = directive(enrollFirstDevice);
128
264
  export const __nomos_enrollSignerSelf = directive(enrollSignerSelf);
129
- export const __nomos_enrollSignerSelfRequiresVerified = internal(enrollSignerSelfRequiresVerified);
265
+ export const __nomos_enrollSignerSelfRequiresVerified = internal(
266
+ enrollSignerSelfRequiresVerified
267
+ );
130
268
  export const __nomos_revokeSigner = directive(revokeSigner);
131
- export const __nomos_revokeSignerEpochStrictlyIncreases = internal(revokeSignerEpochStrictlyIncreases);
269
+ export const __nomos_revokeSignerEpochStrictlyIncreases = internal(
270
+ revokeSignerEpochStrictlyIncreases
271
+ );
132
272
  export const __nomos_SignerEpoch = aggregate(SignerEpoch);
133
273
  export const __nomos_signerEpochCurrent = query(signerEpochCurrent);
134
274
  export const __nomos_advanceSignerEpoch = directive(advanceSignerEpoch);
135
- export const __nomos_signerEpochStrictlyIncreases = internal(signerEpochStrictlyIncreases);
275
+ export const __nomos_signerEpochStrictlyIncreases = internal(
276
+ signerEpochStrictlyIncreases
277
+ );
278
+ export const __nomos_enrollDelegationRetainsEvidence = internal(enrollDelegationRetainsEvidence);
279
+ export const __nomos_enrollFirstDeviceRetainsEvidence = internal(enrollFirstDeviceRetainsEvidence);
136
280
  export const __nomos_SignerDelegation = aggregate(SignerDelegation);
137
281
  export const __nomos_enrollDelegation = directive(enrollDelegation);
138
282
  export const __nomos_signerDelegationByUser = query(signerDelegationByUser);
139
283
  export const __nomos_AuthProvider = aggregate(AuthProvider);
284
+ export const __nomos_AuthProviderKey = aggregate(AuthProviderKey);
285
+ export const __nomos_AuthProviderCertificate = aggregate(AuthProviderCertificate);
140
286
  export const __nomos_seedAuthProvider = directive(seedAuthProvider);
141
- export const __nomos_authProviderSeedBeforeWarrant = internal(authProviderSeedBeforeWarrant);
287
+ export const __nomos_authProviderSeedBeforeWarrant = internal(
288
+ authProviderSeedBeforeWarrant
289
+ );
142
290
  export const __nomos_setAuthProvider = directive(setAuthProvider);
291
+ export const __nomos_adoptIdentityProviderWitness = directive(adoptIdentityProviderWitness);
292
+ export const __nomos_identityProviderSourceTrust = internal(identityProviderSourceTrust);
143
293
  export const __nomos_authProvider = query(authProvider);
294
+ export const __nomos_authProviderKeys = query(authProviderKeys);
295
+ export const __nomos_authProviderCertificates = query(authProviderCertificates);
@@ -32,6 +32,7 @@ import { Lww } from "../drivers.js";
32
32
  import { directive } from "../directive.js";
33
33
  import { set } from "../ops.js";
34
34
  import { query } from "../query.js";
35
+ import { valueObject } from "../value_object.js";
35
36
 
36
37
  /** The framework-reserved receipt instance-id prefix (kernel mirror:
37
38
  * `nomos_executor::ATTESTATION_RECEIPT_PREFIX`). */
@@ -58,6 +59,10 @@ export function sourceDishonorId(sourceGenesis: string, keyHash: string): string
58
59
  * extra signed bytes and NO reader identity (least-disclosure). `receiptPath` (the kernel
59
60
  * query op) serves Merkle inclusion `{batchRoot, index, path}` from the folded `leaves`.
60
61
  */
62
+ export const AttestationReceiptLeaves = valueObject("AttestationReceiptLeaves", {
63
+ values: z.array(z.string().min(1)).min(1),
64
+ });
65
+
61
66
  export const NomosAttestationReceipt = aggregate("NomosAttestationReceipt", {
62
67
  /** `"<epoch>-<nSealedReceiptsInFold>-<keyHash8>"` — chain-derived mint (collision-free across remounts); promised on every envelope's `receipt_hint`. */
63
68
  batchId: t.string().merge(Lww),
@@ -65,8 +70,8 @@ export const NomosAttestationReceipt = aggregate("NomosAttestationReceipt", {
65
70
  batchRoot: t.string().merge(Lww),
66
71
  /** The leaf count (kernel-verified == leaves.length at the gate). */
67
72
  leafCount: t.int().merge(Lww),
68
- /** The leaf hashes, in serve order (JSON array) — what `receiptPath` serves from. */
69
- leaves: t.json().merge(Lww),
73
+ /** The leaf hashes, in serve order, stored as a typed structural value object. */
74
+ leaves: AttestationReceiptLeaves.field().merge(Lww),
70
75
  /** The `attested_at_ms` range the batch covers. */
71
76
  firstAt: t.int().merge(Lww),
72
77
  lastAt: t.int().merge(Lww),
@@ -113,7 +118,7 @@ export const recordAttestationBatch = directive("recordAttestationBatch")
113
118
  set(r, "batchId", p.batchId),
114
119
  set(r, "batchRoot", p.batchRoot),
115
120
  set(r, "leafCount", p.leafCount),
116
- set(r, "leaves", JSON.stringify(p.leaves)),
121
+ set(r, "leaves", { values: p.leaves }),
117
122
  set(r, "firstAt", p.firstAt),
118
123
  set(r, "lastAt", p.lastAt),
119
124
  set(r, "headAtSeal", p.headAtSeal),