@githolon/dsl 0.108.7 → 0.110.1

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 (308) 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 +80 -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 +214 -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 +268 -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 +23950 -15776
  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 +550 -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_event_desk_close_test.dart +16 -0
  74. package/dart/test/reception_span_trace_test.dart +23 -0
  75. package/dart/test/replica_readiness_test.dart +156 -0
  76. package/dart/test/runtime_projections_test.dart +92 -0
  77. package/dart/test/runtime_v2_gateway_test.dart +131 -0
  78. package/dart/test/signing_identity_kernel_test.dart +75 -0
  79. package/dart/test/sync_status_preparation_report_test.dart +29 -0
  80. package/dart/test/sync_status_reducer_test.dart +419 -0
  81. package/dart/test/test_harness_test.dart +71 -95
  82. package/dart/test/typed_query_watch_test.dart +170 -0
  83. package/dart/test/typed_watch_registry_test.dart +249 -0
  84. package/dart_lints/README.md +18 -0
  85. package/dart_lints/lib/nomos_lints.dart +70 -0
  86. package/dart_lints/pubspec.lock +580 -0
  87. package/dart_lints/pubspec.yaml +12 -0
  88. package/dart_lints/test/reference_identity_test.dart +75 -0
  89. package/dart_types/CHANGELOG.md +18 -0
  90. package/dart_types/lib/nomos_kernel_protocol.dart +21 -1
  91. package/dart_types/lib/nomos_types.dart +9 -1
  92. package/dart_types/lib/src/admission_decision.dart +37 -0
  93. package/dart_types/lib/src/aggregate_meta.dart +1 -1
  94. package/dart_types/lib/src/approved_model.dart +65 -0
  95. package/dart_types/lib/src/custody.dart +10 -18
  96. package/dart_types/lib/src/error_info.dart +4 -4
  97. package/dart_types/lib/src/errors.dart +29 -29
  98. package/dart_types/lib/src/foreign_ref.dart +62 -33
  99. package/dart_types/lib/src/local_work_rejected.dart +3 -3
  100. package/dart_types/lib/src/nomos_ref.dart +3 -1
  101. package/dart_types/lib/src/principal.dart +2 -2
  102. package/dart_types/lib/src/proto/google/protobuf/any.pb.dart +163 -0
  103. package/dart_types/lib/src/proto/google/protobuf/any.pbenum.dart +11 -0
  104. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pb.dart +137 -0
  105. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pbenum.dart +11 -0
  106. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pb.dart +20721 -10433
  107. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pbenum.dart +555 -27
  108. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pb.dart +387 -0
  109. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pbenum.dart +46 -0
  110. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart +295 -0
  111. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pbenum.dart +139 -0
  112. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pb.dart +269 -0
  113. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pbenum.dart +103 -0
  114. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pb.dart +417 -0
  115. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pbenum.dart +62 -0
  116. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pb.dart +9968 -0
  117. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pbenum.dart +133 -0
  118. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pb.dart +204 -0
  119. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pbenum.dart +54 -0
  120. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pb.dart +1550 -0
  121. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pbenum.dart +11 -0
  122. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pb.dart +710 -0
  123. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pbenum.dart +11 -0
  124. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pb.dart +845 -0
  125. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pbenum.dart +11 -0
  126. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pb.dart +198 -0
  127. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pbenum.dart +11 -0
  128. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pb.dart +369 -0
  129. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pbenum.dart +11 -0
  130. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pb.dart +609 -0
  131. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pbenum.dart +65 -0
  132. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart +358 -0
  133. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pbenum.dart +100 -0
  134. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pb.dart +2231 -0
  135. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pbenum.dart +271 -0
  136. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pb.dart +1286 -0
  137. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pbenum.dart +11 -0
  138. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart +636 -0
  139. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pbenum.dart +116 -0
  140. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pb.dart +1637 -0
  141. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pbenum.dart +175 -0
  142. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pb.dart +1269 -0
  143. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pbenum.dart +129 -0
  144. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pb.dart +2782 -0
  145. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pbenum.dart +97 -0
  146. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +2232 -8627
  147. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pbenum.dart +0 -358
  148. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pb.dart +1639 -0
  149. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pbenum.dart +46 -0
  150. package/dart_types/lib/src/runtime_outcome.dart +133 -0
  151. package/dart_types/lib/src/subscriptions.dart +116 -23
  152. package/dart_types/pubspec.yaml +1 -1
  153. package/dart_types/test/extremum_subscriptions_test.dart +40 -0
  154. package/dart_types/test/foreign_ref_resolution_test.dart +75 -0
  155. package/dart_types/test/nomos_ref_address_test.dart +25 -0
  156. package/dart_types/test/ordered_subscriptions_test.dart +34 -0
  157. package/operation_contract_check.mjs +24 -0
  158. package/package.json +11 -6
  159. package/src/aggregate.ts +70 -10
  160. package/src/application_topology.ts +18 -11
  161. package/src/attested.ts +3 -0
  162. package/src/attested_core.ts +46 -3
  163. package/src/birth_meter_ensure.ts +19 -7
  164. package/src/births.ts +29 -4
  165. package/src/build_package.ts +140 -13
  166. package/src/business_birth.ts +181 -4
  167. package/src/codegen_call_proto.ts +1276 -0
  168. package/src/codegen_call_usda.ts +49 -6
  169. package/src/codegen_dart.ts +83 -44
  170. package/src/codegen_dart_client.ts +458 -800
  171. package/src/{codegen_dart_application.ts → codegen_dart_facade.ts} +331 -582
  172. package/src/codegen_dart_framework_calls.ts +320 -37
  173. package/src/codegen_dart_indexed_variant.ts +159 -0
  174. package/src/codegen_dart_scenario.ts +42 -13
  175. package/src/codegen_proof.ts +3 -3
  176. package/src/codegen_provider_dart.ts +5 -0
  177. package/src/codegen_query_proto.ts +158 -0
  178. package/src/codegen_refusal.ts +189 -0
  179. package/src/codegen_result_proto.ts +931 -0
  180. package/src/codegen_result_usda.ts +4 -0
  181. package/src/codegen_ts.ts +464 -616
  182. package/src/codegen_workspace_access.ts +105 -0
  183. package/src/compatibility_graph.ts +759 -0
  184. package/src/compatibility_usda.ts +264 -0
  185. package/src/compile_package_main.ts +2017 -1195
  186. package/src/custody_placement.ts +156 -0
  187. package/src/custody_placement_usda.ts +91 -0
  188. package/src/decl_shapes.ts +21 -2
  189. package/src/describe_model.ts +1 -0
  190. package/src/directive.ts +59 -2
  191. package/src/drivers.ts +51 -0
  192. package/src/engine_entry.ts +52 -8
  193. package/src/evolve_preview.ts +11 -4
  194. package/src/exists.ts +2 -0
  195. package/src/fields.ts +75 -11
  196. package/src/flow_gate.ts +2 -1
  197. package/src/framework/application_home.ts +170 -18
  198. package/src/framework/attested_receipts.ts +8 -3
  199. package/src/framework/auth_provider_law.ts +169 -9
  200. package/src/framework/birth_certificate_law.ts +4 -0
  201. package/src/framework/capability.ts +34 -3
  202. package/src/framework/child_authentication.ts +346 -0
  203. package/src/framework/console_governance.ts +295 -0
  204. package/src/framework/delegated_roles.ts +301 -0
  205. package/src/framework/domain_lifecycle.ts +26 -13
  206. package/src/framework/founding_genesis.ts +193 -0
  207. package/src/framework/framework_aggregates.ts +1 -1
  208. package/src/framework/genesis.ts +6 -1
  209. package/src/framework/governance_relations.ts +19 -0
  210. package/src/framework/home.ts +5 -734
  211. package/src/framework/legacy/child_auth_provider_epoch.ts +73 -0
  212. package/src/framework/model_authority_repair.ts +116 -0
  213. package/src/framework/model_authority_seed.ts +185 -0
  214. package/src/framework/model_transition.ts +211 -0
  215. package/src/framework/owned_custody.ts +1 -1
  216. package/src/framework/principal_enrollment.ts +302 -0
  217. package/src/framework/receiving_group.ts +857 -0
  218. package/src/framework/receiving_group_recovery.ts +314 -0
  219. package/src/framework/relations.ts +4 -8
  220. package/src/framework/signing_identity.ts +242 -95
  221. package/src/framework/source_roster.ts +11 -5
  222. package/src/framework/workspace_access.ts +149 -0
  223. package/src/framework/workspace_invariant.ts +73 -52
  224. package/src/framework/workspaces.ts +407 -40
  225. package/src/framework_call_definitions.ts +32 -3
  226. package/src/generated_client_bundle_boundary.ts +97 -0
  227. package/src/generated_client_names.ts +1 -0
  228. package/src/identity_usda.ts +27 -0
  229. package/src/index.ts +183 -12
  230. package/src/indexed_variant.ts +83 -0
  231. package/src/intent.ts +173 -45
  232. package/src/law_check.ts +8 -5
  233. package/src/law_dependency_index.ts +231 -0
  234. package/src/law_graph.ts +508 -71
  235. package/src/law_graph_usda.ts +170 -24
  236. package/src/law_identity.ts +119 -81
  237. package/src/law_source_map.ts +4 -1
  238. package/src/law_units.ts +498 -0
  239. package/src/law_value_type.ts +7 -3
  240. package/src/member_authentication.ts +302 -0
  241. package/src/null_meta.ts +1 -1
  242. package/src/openusd_compiled_layer.ts +132 -0
  243. package/src/operation_contract_check.ts +31 -0
  244. package/src/ordered_read.ts +2 -1
  245. package/src/package_config.ts +33 -12
  246. package/src/package_dependencies.ts +1 -0
  247. package/src/plan_source_slice.ts +30 -1
  248. package/src/protobuf_field_number.ts +36 -0
  249. package/src/provenance_wire.ts +6 -0
  250. package/src/query.ts +2 -1
  251. package/src/read.ts +50 -0
  252. package/src/relation.ts +4 -1
  253. package/src/relation_schema.ts +15 -2
  254. package/src/report.ts +2 -2
  255. package/src/sqlite_computation_bundle.ts +78 -0
  256. package/src/sqlite_computed.ts +102 -0
  257. package/src/sqlite_counts.ts +154 -0
  258. package/src/sqlite_layout.ts +823 -0
  259. package/src/sqlite_reads.ts +275 -0
  260. package/src/sqlite_samples.ts +185 -0
  261. package/src/stable_id_identity_bridge.ts +1 -1
  262. package/src/stable_ids_for_module.ts +16 -4
  263. package/src/test_call_usda.ts +6 -6
  264. package/src/usda_relationship_integrity.ts +20 -3
  265. package/src/usda_text.ts +21 -1
  266. package/src/value_object.ts +81 -11
  267. package/src/wire.ts +22 -0
  268. package/src/wire_encode.ts +227 -20
  269. package/src/workspace_sharding.ts +15 -6
  270. package/src/workspace_sharing.ts +51 -49
  271. package/src/zod_introspection.ts +2 -0
  272. package/compat_package.mjs +0 -46
  273. package/dart/lib/src/home.dart +0 -15
  274. package/dart/lib/src/runner/offline-install.mjs +0 -15367
  275. package/dart/lib/src/source_trust.dart +0 -51
  276. package/dart/lib/src/webview_bridge.dart +0 -6540
  277. package/dart/lib/src/workspace_name.dart +0 -30
  278. package/dart/test/acquire_session_credentials_test.dart +0 -150
  279. package/dart/test/acquire_session_test.dart +0 -534
  280. package/dart/test/adv_realm_interference_test.dart +0 -600
  281. package/dart/test/cloud_bound_topology_test.dart +0 -168
  282. package/dart/test/cluster_births_test.dart +0 -202
  283. package/dart/test/cluster_device_keyed_acceptance_test.dart +0 -105
  284. package/dart/test/cluster_local_autosync_test.dart +0 -123
  285. package/dart/test/cluster_scale_test.dart +0 -122
  286. package/dart/test/compat_test.dart +0 -61
  287. package/dart/test/dlq_session_surface_test.dart +0 -222
  288. package/dart/test/first_app_gauntlet_test.dart +0 -386
  289. package/dart/test/fixtures/wedge/fake-install.mjs +0 -11
  290. package/dart/test/four_layer_nested_topology_test.dart +0 -290
  291. package/dart/test/home_parity_test.dart +0 -13
  292. package/dart/test/local_sync_inert_test.dart +0 -107
  293. package/dart/test/node_runner_transport_test.dart +0 -78
  294. package/dart/test/parent_signer_recovery_test.dart +0 -155
  295. package/dart/test/residency_refusal_test.dart +0 -49
  296. package/dart/test/sealing_client_test.dart +0 -181
  297. package/dart/test/session_bound_test.dart +0 -285
  298. package/dart/test/stale_bundle_test.dart +0 -80
  299. package/dart/test/vo_read_typing_test.dart +0 -131
  300. package/dart/test/watch_after_offer_stall_test.dart +0 -100
  301. package/dart/test/webview_bridge_test.dart +0 -1930
  302. package/dart/test/workspace_name_test.dart +0 -24
  303. package/runtime/generated-application-host.js +0 -22860
  304. package/src/codegen_query_usda.ts +0 -214
  305. package/src/compat_manifest.ts +0 -26
  306. package/src/compat_package_main.ts +0 -224
  307. package/src/shape_compat.ts +0 -352
  308. package/src/usd_state.ts +0 -505
@@ -35,12 +35,15 @@ import type { QueryDecl } from "./query.js";
35
35
  import type { SpatialDecl } from "./spatial.js";
36
36
  import type { AnySum } from "./sum.js";
37
37
  import type { AnyExtremum } from "./extremum.js";
38
+ import type { AnyExists } from "./exists.js";
39
+ import type { OrderedReadDecl } from "./ordered_read.js";
38
40
  import type { AnyDerivedDecl, DerivedDecl, TemporalEnumDecl } from "./derived.js";
39
41
  import type { CombinedDecl } from "./combined.js";
40
42
  import type { ImpureCapabilityDecl } from "./codegen_provider_dart.js";
41
43
  import type { WorkspaceTypeDecl } from "./workspace_type.js";
42
44
  import type { WorkspaceInvariantDecl } from "./framework/workspace_invariant.js";
43
45
  import { withWorkspaceSharingInvitationExports } from "./workspace_sharing.js";
46
+ import { indexedVariantsOf } from "./indexed_variant.js";
44
47
  import {
45
48
  applicationLanguageOf,
46
49
  assertApplicationLanguageCoversAuthoredDirectives,
@@ -69,11 +72,32 @@ import {
69
72
  mergeRelationTypeDeclarations,
70
73
  type RelationTypeDecl,
71
74
  } from "./relation_schema.js";
72
- import { collectValueObjectDescriptors } from "./value_object.js";
75
+ import {
76
+ collectPayloadValueObjectDescriptors,
77
+ collectValueObjectDescriptors,
78
+ } from "./value_object.js";
73
79
  import { expandCapabilityExports, isCapabilityDecl } from "./capability_exports.js";
74
80
  import { RelationTuple, relationTuplesByObject } from "./framework/relations.js";
75
- import { signerDelegationByUser } from "./framework/signing_identity.js";
76
- import { AuthProvider, setAuthProvider, authProvider } from "./framework/workspaces.js";
81
+ import {
82
+ SignerDelegation,
83
+ signerDelegationByUser,
84
+ signerDelegationCertJsonRetired,
85
+ } from "./framework/signing_identity.js";
86
+ import {
87
+ AUTH_PROVIDER_AUTHORITY,
88
+ AuthProvider,
89
+ AuthProviderCertificate,
90
+ AuthProviderKey,
91
+ adoptIdentityProviderWitness,
92
+ authProvider,
93
+ authProviderCertificates,
94
+ authProviderKeys,
95
+ authProviderSourceRelations,
96
+ identityProviderSourceTrust,
97
+ seedAuthProvider,
98
+ setAuthProvider,
99
+ } from "./framework/workspaces.js";
100
+ import { nomosSourceFrontierEnsure } from "./attested.js";
77
101
  import { parentAttestedBirthMarker } from "./births.js";
78
102
  import { discoverUnsanctionedEnsures, sanctioningEnsureDirective } from "./secondary_ensure.js";
79
103
  import { probeEnsuredTypes, probePlanOps } from "./codegen_proof.js";
@@ -178,6 +202,8 @@ export interface DomainModuleSpec {
178
202
  /** Maintained MIN/MAX reads (#47 — the extremum RPC's manifest half). Config-named like sums. */
179
203
  readonly mins?: readonly AnyExtremum[];
180
204
  readonly maxes?: readonly AnyExtremum[];
205
+ readonly exists_?: readonly AnyExists[];
206
+ readonly orderedReads?: readonly OrderedReadDecl[];
181
207
  readonly spatials?: readonly SpatialDecl[];
182
208
  /** First-class workspace types (sharding §10 slice 1) — the law-declared taxonomy. */
183
209
  readonly workspaceTypes?: readonly WorkspaceTypeDecl[];
@@ -205,6 +231,7 @@ export interface DomainModuleSpec {
205
231
  */
206
232
  export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
207
233
  const domain = spec.domain ?? spec.name;
234
+ const indexedVariants = indexedVariantsOf(spec.modules);
208
235
  const conflictPolicies = conflictPoliciesOf(spec.modules, domain);
209
236
  const fieldEvolutions = fieldEvolutionsOf(spec.modules);
210
237
  const retirements = retirementsOf(spec.modules, domain);
@@ -264,9 +291,19 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
264
291
  const discoveredDirectives = directivesOf(merged);
265
292
  // A directive builder already possessed the typed aggregate handle. Retain that compiler link so
266
293
  // re-exporting a lawful directive is self-contained: its local target schema joins the domain without
267
- // a second magic re-export. A cross-workspace birth remains a dependency edge, not a copied child schema.
294
+ // a second magic re-export. A pure workspace-effect intent keeps the handle for runtime dispatch but
295
+ // has no local aggregate consequence, so its destination schema remains a dependency instead of being
296
+ // copied into the source domain's generated types. A cross-workspace birth follows the same boundary.
268
297
  for (const directive of discoveredDirectives) {
269
- if (directive.birthsChild !== true && directive.aggregate !== undefined) {
298
+ const pureWorkspaceEffect =
299
+ (directive as { steps?: readonly unknown[] }).steps?.length === 0 &&
300
+ ((directive as { workspaceEffects?: readonly unknown[] }).workspaceEffects
301
+ ?.length ?? 0) > 0;
302
+ if (
303
+ directive.birthsChild !== true &&
304
+ !pureWorkspaceEffect &&
305
+ directive.aggregate !== undefined
306
+ ) {
270
307
  const prior = byId.get(directive.aggregate.id);
271
308
  byId.set(
272
309
  directive.aggregate.id,
@@ -468,6 +505,17 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
468
505
  ? { ...setAuthProvider, businessBirthInternal: true } as Directive<any>
469
506
  : setAuthProvider);
470
507
  }
508
+ if (!directives.some((d) => d.id === adoptIdentityProviderWitness.id)) {
509
+ directives.push(declaresOwnedRead
510
+ ? { ...adoptIdentityProviderWitness, businessBirthInternal: true } as Directive<any>
511
+ : adoptIdentityProviderWitness);
512
+ }
513
+ for (const aggregate of [AuthProviderKey, AuthProviderCertificate, NomosSourceFrontier]) {
514
+ if (!byId.has(aggregate.id)) byId.set(aggregate.id, aggregate);
515
+ }
516
+ if (!directives.some((d) => d.id === nomosSourceFrontierEnsure.id)) {
517
+ directives.push(nomosSourceFrontierEnsure);
518
+ }
471
519
  }
472
520
  const usesRelations =
473
521
  declaresPrivateRead ||
@@ -491,11 +539,10 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
491
539
  for (const a of BIRTH_METER_AGGREGATES) {
492
540
  if (!byId.has(a.id)) byId.set(a.id, a);
493
541
  }
494
- // AUTHPROVIDER INHERITANCE (birthHome's default-on parent read — the same courtesy): a birth-capable
495
- // law serves the `authProvider` captured read (parent side) AND can fold the inherited
496
- // `setAuthProvider` genesis step (child side; the one-package fixture shape is both at once). Without
497
- // this carry, default-on inheritance would refuse on every law that never hand-exported the trio.
542
+ // Birth captures and seeds the current verifier once; later provider epochs use the ordinary
543
+ // authority-gated adoption directive above.
498
544
  if (!byId.has(AuthProvider.id)) byId.set(AuthProvider.id, AuthProvider);
545
+ if (!directives.some((d) => d.id === seedAuthProvider.id)) directives.push(seedAuthProvider);
499
546
  if (!directives.some((d) => d.id === setAuthProvider.id)) directives.push(setAuthProvider);
500
547
  }
501
548
  // SECONDARY-CREATE AUTO-DECLARE (secondary_ensure.ts — the id-mint-gate DX): a plan may `ensure(B, "det:id")`
@@ -528,6 +575,22 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
528
575
  directives.push(dir);
529
576
  autoDeclaredEnsures.push(ty);
530
577
  }
578
+ // Framework-owned schema evolution travels with the framework aggregate.
579
+ // Applications compose SignerDelegation into several domains; requiring each
580
+ // tenant evolution folder to repeat the same tombstone would make framework
581
+ // correctness application-maintained. Inject it only where the exact
582
+ // framework aggregate is present, and only when the tenant has not already
583
+ // declared the same retirement.
584
+ if (
585
+ byId.has(SignerDelegation.id) &&
586
+ !retirements.some((candidate) =>
587
+ candidate.kind === signerDelegationCertJsonRetired.kind &&
588
+ candidate.aggregate === signerDelegationCertJsonRetired.aggregate &&
589
+ candidate.field === signerDelegationCertJsonRetired.field
590
+ )
591
+ ) {
592
+ retirements.push(signerDelegationCertJsonRetired);
593
+ }
531
594
  const aggregates = applyFieldEvolutionsToAggregates(
532
595
  applyConflictPoliciesToAggregates(
533
596
  [...byId.values()],
@@ -610,6 +673,8 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
610
673
  }
611
674
  }
612
675
  const counts = [...(spec.counts ?? [])];
676
+ const exists_ = [...(spec.exists_ ?? [])];
677
+ const orderedReads = [...(spec.orderedReads ?? [])];
613
678
  const spatials = [...(spec.spatials ?? [])];
614
679
  const temporalEnums: TemporalEnumDecl[] = aggregates.flatMap((aggregate) =>
615
680
  Object.entries(aggregate.fields).flatMap(([sourceField, field]) =>
@@ -712,7 +777,7 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
712
777
  queries.push({ ...q, businessBirthInternal: true } as QueryDecl);
713
778
  }
714
779
  }
715
- // The inheritance read (`.reads("authProvider")` on birthHome) routes like any declared query.
780
+ // The inheritance read (`.reads("authProvider")` on birth) routes like any declared query.
716
781
  if (!haveQuery.has(authProvider.id)) queries.push(authProvider);
717
782
  // The client's private birth ceremony checks the actor's delegation before creating it. Carry the
718
783
  // structural read in certified routing law for every `.births()` domain, but keep it off tenant codegen.
@@ -724,9 +789,33 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
724
789
  queries.push(internalDelegationQuery);
725
790
  }
726
791
  }
727
- const relationTypes = mergeRelationTypeDeclarations([
792
+ const authoredRelationTypes = [
728
793
  ...exportedRelationTypes,
729
794
  ...(spec.relationTypes ?? []),
795
+ ];
796
+ const authoredProviderAuthority = authoredRelationTypes.find(
797
+ (declaration) =>
798
+ declaration.global === true &&
799
+ declaration.type === authProviderSourceRelations.type &&
800
+ declaration.relations.has(AUTH_PROVIDER_AUTHORITY),
801
+ );
802
+ const frameworkProviderAuthority = authProviderSourceRelations.relations.get(
803
+ AUTH_PROVIDER_AUTHORITY,
804
+ );
805
+ const carriesExactProviderAuthority =
806
+ authoredProviderAuthority !== undefined &&
807
+ frameworkProviderAuthority !== undefined &&
808
+ JSON.stringify(authoredProviderAuthority.relations.get(AUTH_PROVIDER_AUTHORITY)) ===
809
+ JSON.stringify(frameworkProviderAuthority);
810
+ const relationTypes = mergeRelationTypeDeclarations([
811
+ ...authoredRelationTypes,
812
+ // This relation belongs to the exact provider-adoption member. Supply the
813
+ // framework declaration only when tenant law has not already declared the
814
+ // same authority; a divergent declaration is deliberately composed below
815
+ // so the duplicate-relation guard refuses it loudly.
816
+ ...(declaresPrivateRead && !carriesExactProviderAuthority
817
+ ? [authProviderSourceRelations]
818
+ : []),
730
819
  ]);
731
820
  // RELATION-USING LAW AUTO-COMPOSES ITS AUDIT READ (co2 recovery DX — same idiom as the meter
732
821
  // queries above): a domain that declares relation law (a relation schema, a `.requires(...)` gated
@@ -746,8 +835,17 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
746
835
  ? { ...authProvider, businessBirthInternal: true } as QueryDecl
747
836
  : authProvider);
748
837
  }
838
+ if (declaresPrivateRead) {
839
+ for (const providerQuery of [authProviderKeys, authProviderCertificates]) {
840
+ if (!queries.some((candidate) => candidate.id === providerQuery.id)) {
841
+ queries.push(declaresOwnedRead
842
+ ? { ...providerQuery, businessBirthInternal: true } as QueryDecl
843
+ : providerQuery);
844
+ }
845
+ }
846
+ }
749
847
  if (usesRelations && !queries.some((q) => q.id === relationTuplesByObject.id)) {
750
- queries.push(declaresOwnedRead
848
+ queries.push(declaresOwnedRead || (byId.get(RelationTuple.id) as { businessBirthInternal?: boolean } | undefined)?.businessBirthInternal === true
751
849
  ? { ...relationTuplesByObject, businessBirthInternal: true } as QueryDecl
752
850
  : relationTuplesByObject);
753
851
  }
@@ -761,7 +859,30 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
761
859
  // contracts. A contract may be the only local owner of a named value object (especially a
762
860
  // cross-domain publication DTO); collecting aggregates alone left a dangling type reference in
763
861
  // the canonical law graph. Transitive nested VOs remain included by the descriptor collector.
764
- const valueObjects = collectValueObjectDescriptors([...aggregates, ...contracts]);
862
+ const valueObjectByName = new Map(
863
+ collectValueObjectDescriptors([...aggregates, ...contracts])
864
+ .map((descriptor) => [descriptor.name, descriptor] as const),
865
+ );
866
+ for (const descriptor of collectPayloadValueObjectDescriptors(directives)) {
867
+ // Payload contracts are law contracts too. A value object used only by an
868
+ // offer must therefore inhabit the same nominal law type graph as one used
869
+ // by stored state; generated clients must not own a parallel type registry.
870
+ if (!valueObjectByName.has(descriptor.name)) {
871
+ valueObjectByName.set(descriptor.name, descriptor);
872
+ }
873
+ }
874
+ for (const invariant of workspaceInvariants) {
875
+ if (!invariant.refusal) continue;
876
+ for (const descriptor of [invariant.refusal.descriptor, ...invariant.refusal.dependencies]) {
877
+ const prior = valueObjectByName.get(descriptor.name);
878
+ if (prior && JSON.stringify(prior) !== JSON.stringify(descriptor)) {
879
+ throw new Error(`invariant '${invariant.id}' conflicts with nominal type '${descriptor.name}'`);
880
+ }
881
+ valueObjectByName.set(descriptor.name, descriptor);
882
+ }
883
+ }
884
+ const valueObjects = [...valueObjectByName.values()]
885
+ .sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
765
886
  // SPATIAL × VO PAIRING (fail at build, not at fold): a spatial index over a VO-typed field
766
887
  // must index a GEO value object (an RFC 7946 geometry — the R*Tree's bbox source). A
767
888
  // structural VO (e.g. a PostalAddress) has no geometry to index. Non-VO fields (a
@@ -848,6 +969,9 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
848
969
  for (const v of Object.values(merged)) {
849
970
  if (isTrustPolicyDecl(v)) policyById.set(v.policyId, v);
850
971
  }
972
+ if (declaresPrivateRead) {
973
+ policyById.set(identityProviderSourceTrust.policyId, identityProviderSourceTrust);
974
+ }
851
975
  const trustPolicies = [...policyById.values()].sort((a, b) =>
852
976
  a.policyId < b.policyId ? -1 : a.policyId > b.policyId ? 1 : 0,
853
977
  );
@@ -921,6 +1045,8 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
921
1045
  ...(retirements.length > 0 ? { retirements } : {}),
922
1046
  ...(queries.length > 0 ? { queries } : {}),
923
1047
  ...(counts.length > 0 ? { counts } : {}),
1048
+ ...(exists_.length > 0 ? { exists_ } : {}),
1049
+ ...(orderedReads.length > 0 ? { orderedReads } : {}),
924
1050
  ...(spatials.length > 0 ? { spatials } : {}),
925
1051
  ...(deriveds.length > 0 ? { deriveds } : {}),
926
1052
  ...(combineds.length > 0 ? { combineds } : {}),
@@ -942,6 +1068,7 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
942
1068
  // Omit-when-empty — the `nomosValueObjects` era rule: a VO-free domain's USD/package
943
1069
  // bytes are byte-identical to before value objects existed.
944
1070
  ...(valueObjects.length > 0 ? { valueObjects } : {}),
1071
+ ...(indexedVariants.length > 0 ? { indexedVariants } : {}),
945
1072
  // Omit-when-empty — the `nomosContracts` era rule: a contract-free domain's USD/package bytes
946
1073
  // are byte-identical to before domain contracts existed (pure additive typing metadata).
947
1074
  ...(contracts.length > 0 ? { contracts } : {}),
@@ -20,6 +20,7 @@ import {
20
20
  } from "./births.js";
21
21
  import type { Field } from "./fields.js";
22
22
  import {
23
+ AUTH_PROVIDER_EPOCH_CONSUMER,
23
24
  AuthProvider,
24
25
  authProvider,
25
26
  authProviderCertificates,
@@ -48,21 +49,93 @@ import {
48
49
  BirthAttestationLink,
49
50
  birthAttestation,
50
51
  seedBirthAttestation,
51
- } from "./framework/home.js";
52
+ } from "./framework/receiving_group.js";
52
53
  import { RelationTuple, relationTuplesByObject, writeTuple } from "./framework/relations.js";
53
54
  import {
55
+ inheritedModelAuthorityGenesisStep,
56
+ modelAuthoritySeedBeforeWarrant,
57
+ seatInheritedModelAuthority,
58
+ } from "./framework/model_authority_seed.js";
59
+ import {
60
+ SIGNER_RELATION,
54
61
  SignerDelegation,
55
62
  enrollDelegation,
56
63
  enrollFirstDevice,
57
64
  enrollSigner,
58
65
  identityRelations,
59
66
  signerDelegationByUser,
67
+ signerObject,
60
68
  } from "./framework/signing_identity.js";
61
69
  import {
62
70
  DomainInstallExecutor,
63
71
  currentLawReference,
64
72
  domainInstallGenesisOffer,
65
73
  } from "./framework/domain_lifecycle.js";
74
+ import {
75
+ BirthOrigin,
76
+ FoundingPrincipal,
77
+ birthOriginVirginOnly,
78
+ foundingPrincipalVirginOnly,
79
+ seedBirthOrigin,
80
+ seedFoundingPrincipal,
81
+ } from "./framework/founding_genesis.js";
82
+ import {
83
+ enrollDevice,
84
+ principalScopeRelations,
85
+ readInheritedEnrollers,
86
+ relationTuplesByRelation,
87
+ revokeDevice,
88
+ } from "./framework/principal_enrollment.js";
89
+ import { readInheritedOperators, workspaceOperatorRelations } from "./framework/workspaces.js";
90
+ import {
91
+ delegatedRoleRelations,
92
+ delegatedRolesSteps,
93
+ grantDelegatedRole,
94
+ revokeDelegatedRole,
95
+ } from "./framework/delegated_roles.js";
96
+ import { consoleGovernanceLaw, inheritedGovernanceStep, INHERITED_SIGNER_GRANTOR } from "./framework/console_governance.js";
97
+ import { readFrameworkDeclaredRows } from "./read.js";
98
+ import { endorsementOf } from "./principal_evidence.js";
99
+
100
+ /** The `grantedBy` of every tuple `seedFoundingPrincipal` seats (`writeFoundingPrincipal` in
101
+ * framework/founding_genesis.ts); nothing else grants as it. */
102
+ const FOUNDING_GRANTOR = "genesis";
103
+
104
+ /**
105
+ * THE MODE IS SELECTED BY LAW, FROM THE PARENT'S STATE (identity target model D22). A parent founded
106
+ * by token-free genesis by P holds `workspace:self#admin@P` granted by {@link FOUNDING_GRANTOR}
107
+ * (`seedFoundingPrincipal`; nothing else grants admin as it), and P's founding key as a signer seated
108
+ * on its warrant-free prefix. When the birth's principal IS that founder (a founded Home birthing its
109
+ * owner's estate), the child is founded the same way: the author is its founding principal, with that
110
+ * key, and the parent's operators and enrollers. Every other parent (every workspace born on the
111
+ * certificate lane) keeps the historical recipe byte-for-byte, so live chains keep their path until
112
+ * regenerated. Both reads are the declared `relationTuplesByObject` every birth already captures.
113
+ *
114
+ * The founding key is P's one `genesis`-granted signer. A workspace founded on the e712cae05 law, whose
115
+ * inherited-governance step re-seated that same leaf as {@link INHERITED_SIGNER_GRANTOR} when P was also
116
+ * an inherited operator or enroller, has no `genesis` key left; there the key is P's one
117
+ * inheritance-granted signer instead. Current law never rewrites the founding leaf
118
+ * (`inheritedGovernanceStepFrom` skips it), so its founders keep exactly one `genesis` key. Anything
119
+ * else — no founding admin grant, or not exactly one such key — is not a founded parent of P.
120
+ */
121
+ function foundedBirthKeyHash(principal: string): string | undefined {
122
+ const adminRow = readFrameworkDeclaredRows(relationTuplesByObject, RelationTuple, { object: "workspace:self" })
123
+ .find((candidate) => candidate.relation === "admin");
124
+ const admin = (adminRow?.subjects as Record<string, { status?: string; grantedBy?: string }> | undefined)?.[principal];
125
+ if (admin?.status !== "active" || admin.grantedBy !== FOUNDING_GRANTOR) return undefined;
126
+ const rows = readFrameworkDeclaredRows(relationTuplesByObject, RelationTuple, { object: signerObject(principal) });
127
+ const row = rows.find((candidate) => candidate.relation === SIGNER_RELATION);
128
+ const subjects = row?.subjects as Record<string, { status?: string; grantedBy?: string }> | undefined;
129
+ const keysGrantedBy = (grantor: string) => Object.entries(subjects ?? {})
130
+ .filter(([subject, leaf]) =>
131
+ leaf?.status === "active" && leaf.grantedBy === grantor && /^key:[0-9a-f]{64}$/.test(subject))
132
+ .map(([subject]) => subject.slice("key:".length))
133
+ .sort();
134
+ const genesis = keysGrantedBy(FOUNDING_GRANTOR);
135
+ if (genesis.length > 0) return genesis.length === 1 ? genesis[0] : undefined;
136
+ const inherited = keysGrantedBy(INHERITED_SIGNER_GRANTOR);
137
+ return inherited.length === 1 ? inherited[0] : undefined;
138
+ }
66
139
 
67
140
  /** @internal Compiler-only domain enumeration. It carries no allowance or authority. */
68
141
  export const BUSINESS_BIRTH_POLICY_DOMAINS_EXPORT = "__nomos_birth_policy_domains_c9f14a";
@@ -252,9 +325,28 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
252
325
  const birthBase = directive(birthId)
253
326
  .creates(decl.aggregate)
254
327
  .payload(parentSchema)
255
- .plan((p) => {
328
+ .plan((p, ctx) => {
256
329
  const founder = p.principal as string;
257
330
  const child = workspaceNameForKey(namespace, String(decl.key(p as P)));
331
+ const foundingKeyHash = foundedBirthKeyHash(founder);
332
+ const founded = foundingKeyHash !== undefined;
333
+ if (founded) {
334
+ // No certificate or token proves who the founder is, so the parent's own admission does: the
335
+ // birth's author — the principal the kernel authenticated from a signed key — must be the
336
+ // principal it founds. Nobody founds a workspace in someone else's name.
337
+ const author = endorsementOf(ctx.principal().asAttribution())?.principal ?? "";
338
+ if (author !== founder) {
339
+ throw new Error(
340
+ `birth(${decl.aggregate.id}): founded-business-birth-must-be-authored-by-its-founder ` +
341
+ `(principal '${founder}', author '${author}')`,
342
+ );
343
+ }
344
+ if (!Number.isFinite(Date.parse(String(p.bornAt)))) {
345
+ throw new Error(`birth(${decl.aggregate.id}): a founded birth needs bornAt as an ISO-8601 instant`);
346
+ }
347
+ }
348
+ const inheritedEnrollers = founded ? readInheritedEnrollers() : [];
349
+ const inheritedOperators = founded ? readInheritedOperators() : [];
258
350
  const childPayload = { ...(p as Record<string, unknown>) };
259
351
  if (encryptedBirth) {
260
352
  const sealedSeed = childPayload[BUSINESS_BIRTH_SEED_PAYLOAD_FIELD];
@@ -287,6 +379,33 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
287
379
  setAt: p.bornAt,
288
380
  },
289
381
  })),
382
+ // The founder founds the child (D22): their key, themselves as admin, and the parent's operators
383
+ // and enrollers, in the one requires-free founding step on the warrant-free prefix.
384
+ ...(founded
385
+ ? [{
386
+ domain,
387
+ directiveId: seedFoundingPrincipal.id,
388
+ actor: founder,
389
+ payload: seedFoundingPrincipal.payloadSchema.parse({
390
+ principal: founder,
391
+ keyHash: foundingKeyHash,
392
+ operators: [...inheritedOperators],
393
+ enrollers: inheritedEnrollers.map((enroller) => ({
394
+ scope: enroller.scope,
395
+ subject: enroller.subject,
396
+ })),
397
+ grantedAt: Date.parse(String(p.bornAt)),
398
+ }) as Record<string, unknown>,
399
+ },
400
+ // The inherited operators' and enrollers' keys, and installDomain for the operators, so the
401
+ // jurisdiction can act here — enrol the founder's next device, roll out law — without the
402
+ // child ever being re-founded (framework/console_governance.ts).
403
+ ...inheritedGovernanceStep(domain, founder, inheritedOperators, inheritedEnrollers, Date.parse(String(p.bornAt)),
404
+ { principal: founder, keyHash: foundingKeyHash as string }),
405
+ // The roles the parent delegates into every child of this namespace its founder's scope
406
+ // founds (formerly a per-intent delegation certificate), as state tuples for the founder.
407
+ ...delegatedRolesSteps(founder, founder, namespace, Date.parse(String(p.bornAt)))]
408
+ : []),
290
409
  {
291
410
  domain,
292
411
  directiveId: seedId,
@@ -295,6 +414,13 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
295
414
  },
296
415
  ];
297
416
 
417
+ if (founded) {
418
+ // No provider verifier, inherited model authority (operators ride the founding step instead),
419
+ // parent workspace role or epoch edge: those belong to the certificate lane's attestation.
420
+ birth({ workspace: child, genesisChain: chain });
421
+ return [];
422
+ }
423
+
298
424
  const inheritedProvider = readAuthProviderVerifyingConfiguration();
299
425
  if (inheritedProvider !== undefined) {
300
426
  chain.push({
@@ -309,6 +435,11 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
309
435
  },
310
436
  });
311
437
  }
438
+ // MODEL AUTHORITY DESCENDS (architecture/parent_directed_model_transition.md §4, lane A): the child is
439
+ // born holding this workspace's current installDomain holders + their devices (by induction, the
440
+ // platform's operators), so the platform's own signer may lawfully stage and promote law in it.
441
+ const inheritedAuthority = inheritedModelAuthorityGenesisStep(domain, founder, p.bornAt as string);
442
+ if (inheritedAuthority !== undefined) chain.push(inheritedAuthority);
312
443
  birth({
313
444
  workspace: child,
314
445
  genesisChain: chain,
@@ -316,11 +447,25 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
316
447
  ? { parentWorkspaceRoles: decl.parentWorkspaceRoles }
317
448
  : {}),
318
449
  });
319
- return [];
450
+ // THE INVERSE EPOCH EDGE: the born child may ask THIS workspace for its current verifier epoch
451
+ // (`nomosInternalServeAuthProviderEpoch7c1f5e` gates on it). Seated in the same plan that births
452
+ // the child, so neither the host nor the caller can redirect it; the child's own genesis seats the
453
+ // downward `authProviderAuthority` for this workspace (`parentWorkspaceRoles`).
454
+ return writeTuple({
455
+ object: "workspace:self",
456
+ relation: AUTH_PROVIDER_EPOCH_CONSUMER,
457
+ subject: `workspace:${child}`,
458
+ grantedBy: founder,
459
+ grantedAt: p.bornAt as string,
460
+ });
320
461
  })
321
462
  .reads(authProvider)
322
463
  .reads(authProviderKeys)
323
464
  .reads(authProviderCertificates)
465
+ .reads(relationTuplesByObject)
466
+ // Token-free founding: the enroller tuples a founded child inherits.
467
+ .reads(relationTuplesByRelation)
468
+ .alsoEnsures(RelationTuple)
324
469
  .births();
325
470
 
326
471
  const metadata: BusinessBirthMetadata = {
@@ -335,9 +480,12 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
335
480
  genesisDirectiveIds: [
336
481
  "enrollSigner",
337
482
  "seedAuthProvider",
483
+ seatInheritedModelAuthority.id,
338
484
  "seedBirthAttestation",
339
485
  "seedGenesis",
340
486
  "nomosBirthRecordEnsure",
487
+ seedFoundingPrincipal.id,
488
+ seedBirthOrigin.id,
341
489
  ],
342
490
  founderRoles: decl.founderRoles,
343
491
  founderScope: decl.founderScope,
@@ -357,7 +505,7 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
357
505
 
358
506
  // THE SOVEREIGN-WORKSPACE CORE. These are ordinary law declarations, composed automatically so the
359
507
  // tenant's one business declaration is also a complete child law: it can fold the kernel-injected
360
- // travelling attestation + warrant, seat its founding device, inherit its verifier, and verify itself
508
+ // travelling attestation + warrant, seat its founding device, bind its provider root, and verify itself
361
509
  // offline after custody is moved or reopened. The generated tenant client hides every one of them.
362
510
  __nomos_GenesisWarrant: internalSurface(GenesisWarrant),
363
511
  __nomos_seedGenesis: internalDirective(seedGenesis),
@@ -376,6 +524,8 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
376
524
  __nomos_AuthProvider: internalSurface(AuthProvider),
377
525
  __nomos_seedAuthProvider: internalDirective(seedAuthProvider),
378
526
  __nomos_authProviderSeedBeforeWarrant: internalSurface(authProviderSeedBeforeWarrant),
527
+ __nomos_seatInheritedModelAuthority: internalDirective(seatInheritedModelAuthority),
528
+ __nomos_modelAuthoritySeedBeforeWarrant: internalSurface(modelAuthoritySeedBeforeWarrant),
379
529
  __nomos_setAuthProvider: internalDirective(setAuthProvider),
380
530
  __nomos_authProvider: internalSurface(authProvider),
381
531
  __nomos_authProviderKeys: internalSurface(authProviderKeys),
@@ -393,6 +543,33 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
393
543
  __nomos_birthPolicy: internalSurface(birthPolicy),
394
544
  __nomos_birthGrantByPrincipal: internalSurface(birthGrantByPrincipal),
395
545
  __nomos_parentAttestedBirth: internalSurface(businessParentAttestedBirth),
546
+ // TOKEN-FREE FOUNDING (D22). Child side: the founding step a founded recipe carries, the birth origin
547
+ // the kernel's founded birth effect appends before the warrant, the relations the founding step seats
548
+ // (operator, enroller), and the enrolled scope's device lane, so an enroller the child inherited
549
+ // enrols (and revokes) the founder's further devices there. Parent side: the enroller read the recipe
550
+ // captures.
551
+ __nomos_FoundingPrincipal: internalSurface(FoundingPrincipal),
552
+ __nomos_seedFoundingPrincipal: internalDirective(seedFoundingPrincipal),
553
+ __nomos_foundingPrincipalVirginOnly: internalSurface(foundingPrincipalVirginOnly),
554
+ __nomos_BirthOrigin: internalSurface(BirthOrigin),
555
+ __nomos_seedBirthOrigin: internalDirective(seedBirthOrigin),
556
+ __nomos_birthOriginVirginOnly: internalSurface(birthOriginVirginOnly),
557
+ __nomos_workspaceOperatorRelations: internalSurface(workspaceOperatorRelations),
558
+ __nomos_principalScopeRelations: internalSurface(principalScopeRelations),
559
+ __nomos_relationTuplesByRelation: internalSurface(relationTuplesByRelation),
560
+ __nomos_seedInheritedGovernance: internalDirective(consoleGovernanceLaw.seedInheritedGovernance),
561
+ __nomos_inheritedGovernanceBeforeWarrant: internalSurface(consoleGovernanceLaw.inheritedGovernanceBeforeWarrant),
562
+ __nomos_grantConsoleOperator: internalDirective(consoleGovernanceLaw.grantConsoleOperator),
563
+ __nomos_revokeConsoleOperator: internalDirective(consoleGovernanceLaw.revokeConsoleOperator),
564
+ __nomos_lastOperatorRemains: internalSurface(consoleGovernanceLaw.lastOperatorRemains),
565
+ __nomos_enrollConsoleSigner: internalDirective(consoleGovernanceLaw.enrollConsoleSigner),
566
+ __nomos_revokeConsoleSigner: internalDirective(consoleGovernanceLaw.revokeConsoleSigner),
567
+ __nomos_lastConsoleSignerRemains: internalSurface(consoleGovernanceLaw.lastConsoleSignerRemains),
568
+ __nomos_delegatedRoleRelations: internalSurface(delegatedRoleRelations),
569
+ __nomos_grantDelegatedRole: internalDirective(grantDelegatedRole),
570
+ __nomos_revokeDelegatedRole: internalDirective(revokeDelegatedRole),
571
+ __nomos_enrollDevice: internalDirective(enrollDevice),
572
+ __nomos_revokeDevice: internalDirective(revokeDevice),
396
573
  };
397
574
  }
398
575