@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
@@ -19,7 +19,7 @@
19
19
  */
20
20
  import { z } from "zod";
21
21
  import { aggregate, instance } from "../aggregate.js";
22
- import { Lww, MapOf } from "../drivers.js";
22
+ import { Lww } from "../drivers.js";
23
23
  import {
24
24
  attributionField,
25
25
  gitObjectId,
@@ -31,6 +31,7 @@ import { directive } from "../directive.js";
31
31
  import { formerAggregate, retirement } from "../evolution.js";
32
32
  import { set, withMarker, addToSet, type PlannedOp } from "../ops.js";
33
33
  import { key, relationRef, relationType, self, user } from "../relation_schema.js";
34
+ import { consolePrincipals, custodianPrincipals, principalsOf } from "../member_authentication.js";
34
35
 
35
36
  /** The two authenticated capabilities which may execute a lifecycle install.
36
37
  * Callers choose a role; the serialized USDA route is an implementation detail. */
@@ -98,7 +99,12 @@ export function domainInstallGenesisOffer(
98
99
  * delegation remains an ordinary, replayable Zanzibar edge. */
99
100
  export const modelLifecycleRelations = relationType("workspace")
100
101
  .asGlobal()
101
- .relation(MODEL_LIFECYCLE_AUTHORITY, { rewrite: self(), allow: [user(), key()] });
102
+ // Token-free genesis (D22): a child founded by a console principal, or a root founded by a custodian,
103
+ // receives this leaf in its own name from `seedGenesis`, so those two framework scopes are admitted too.
104
+ .relation(MODEL_LIFECYCLE_AUTHORITY, {
105
+ rewrite: self(),
106
+ allow: [user(), key(), principalsOf(consolePrincipals), principalsOf(custodianPrincipals)],
107
+ });
102
108
 
103
109
  /** The lifecycle state machine is a framework type, not a bag of coincidentally matching strings. */
104
110
  export enum DomainInstallationPhase {
@@ -134,13 +140,12 @@ export const DomainInstallation = aggregate("DomainInstallation", {
134
140
  "status.phase": t.enum(DOMAIN_INSTALLATION_PHASES).merge(Lww),
135
141
  "status.observedGeneration": t.int().merge(Lww),
136
142
  "status.supersededBy": t.sha256Digest().merge(Lww).optional(),
137
- "status.conditions": t.map(t.json()).merge(MapOf(Lww)),
138
143
  }).public();
139
144
 
140
145
  /**
141
146
  * The accepted current-frontier evidence for one activation. This is deliberately an
142
147
  * obscure framework concept: tenant models never author or name it. The generated
143
- * lifecycle client runs pre-flight and folds this receipt in the SAME intent that
148
+ * lifecycle client derives the current-frontier transition and folds this receipt in the SAME intent that
144
149
  * activates the candidate, so recording evidence cannot make its own head anchor stale.
145
150
  */
146
151
  export const RELEASE_RECEIPT_AGGREGATE = "nomos_internal_ReleaseReceipt_6f0d3a";
@@ -211,7 +216,9 @@ const dispositions = z.object({
211
216
 
212
217
  const lowerHex64 = sha256Digest();
213
218
  const gitOid = gitObjectId();
214
- const preflightReceipt = z.object({
219
+ // `preflight` is the already-shipped law field name; its value is now strictly a
220
+ // current-frontier receipt and never carries counterfactual history results.
221
+ const frontierReceipt = z.object({
215
222
  candidateHash: lowerHex64,
216
223
  domain: z.string().min(1),
217
224
  atHash: gitOid,
@@ -263,7 +270,10 @@ export const installDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Install)
263
270
  }
264
271
  return ops;
265
272
  })
266
- .requires(MODEL_LIFECYCLE_AUTHORITY);
273
+ .requires(MODEL_LIFECYCLE_AUTHORITY)
274
+ // Model custody is exercised by an enrolled user/device or executor key which independently
275
+ // holds installDomain. It must never inherit the customer-facing provider used by business law.
276
+ .authenticatesWithEnrolledDevice();
267
277
 
268
278
  /** Store candidate law in the ledger without changing the served law frontier. The
269
279
  * kernel content-verifies the package and lifecycle pair, while the Pending phase is
@@ -291,7 +301,8 @@ export const stageDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Stage)
291
301
  if ((p.finalizers ?? []).length > 0) ops.push(addToSet(install, "spec.finalizers", p.finalizers ?? []));
292
302
  return ops;
293
303
  })
294
- .requires(MODEL_LIFECYCLE_AUTHORITY);
304
+ .requires(MODEL_LIFECYCLE_AUTHORITY)
305
+ .authenticatesWithEnrolledDevice();
295
306
 
296
307
  /** Make a staged or retained Active package current. The package bytes are already
297
308
  * committed; the kernel re-loads them from prefix state and runs the evolve gate on
@@ -306,12 +317,12 @@ export const promoteDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Promote)
306
317
  replaces: sha256Digest().optional(),
307
318
  retireReplaced: z.boolean().default(false),
308
319
  dispositions,
309
- preflight: preflightReceipt,
320
+ preflight: frontierReceipt,
310
321
  }).refine((p) => p.replaces === undefined || p.replaces !== p.domainHash, {
311
322
  message: "a promoted domain package cannot replace itself",
312
323
  path: ["replaces"],
313
324
  }).refine((p) => p.preflight.candidateHash === p.domainHash, {
314
- message: "the pre-flight receipt must name the package being promoted",
325
+ message: "the current-frontier receipt must name the package being promoted",
315
326
  path: ["preflight", "candidateHash"],
316
327
  }))
317
328
  .plan((p, ctx): PlannedOp[] => {
@@ -343,7 +354,8 @@ export const promoteDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Promote)
343
354
  return ops;
344
355
  })
345
356
  .alsoEnsures(ReleaseReceipt)
346
- .requires(MODEL_LIFECYCLE_AUTHORITY);
357
+ .requires(MODEL_LIFECYCLE_AUTHORITY)
358
+ .authenticatesWithEnrolledDevice();
347
359
 
348
360
  /** Rollback is a new governed transition, never a history-pointer rewind. The prior
349
361
  * package is promoted from committed custody and the failed candidate becomes Disabled;
@@ -354,12 +366,12 @@ export const rollbackDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Rollback)
354
366
  candidateHash: sha256Digest(),
355
367
  priorHash: sha256Digest(),
356
368
  dispositions,
357
- preflight: preflightReceipt,
369
+ preflight: frontierReceipt,
358
370
  }).refine((p) => p.candidateHash !== p.priorHash, {
359
371
  message: "rollback candidate and prior package must differ",
360
372
  path: ["priorHash"],
361
373
  }).refine((p) => p.preflight.candidateHash === p.priorHash, {
362
- message: "the rollback pre-flight receipt must name the prior package being restored",
374
+ message: "the rollback current-frontier receipt must name the prior package being restored",
363
375
  path: ["preflight", "candidateHash"],
364
376
  }).refine((p) => (p.preflight.acceptanceReason ?? "").trim().length > 0, {
365
377
  message: "restoring previous law needs an attributed business reason",
@@ -388,4 +400,5 @@ export const rollbackDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Rollback)
388
400
  ];
389
401
  })
390
402
  .alsoEnsures(ReleaseReceipt)
391
- .requires(MODEL_LIFECYCLE_AUTHORITY);
403
+ .requires(MODEL_LIFECYCLE_AUTHORITY)
404
+ .authenticatesWithEnrolledDevice();
@@ -0,0 +1,193 @@
1
+ // NOMOS — Nomos Sovereign: participants act · verify · remember LOCALLY; hosted
2
+ // remotes are replaceable custody/transport, not truth. ⇒ ONE Nomos GitHolon
3
+ // wasm32-wasip1 artifact {kernel · projection · embedded QuickJS engine}.
4
+ // If a file isn't this / hosting this / authoring for this / proving this — it's gone.
5
+
6
+ /**
7
+ * framework/founding_genesis.ts — TOKEN-FREE GENESIS (identity target model D22, build order step 2).
8
+ *
9
+ * A workspace's founding facts land in ONE control-plane step on its warrant-free genesis prefix:
10
+ * `seedFoundingPrincipal` seats
11
+ *
12
+ * - `identity:P#signer@key:K` the founding admin principal's founding signer key;
13
+ * - `workspace:self#admin@P` the founding admin;
14
+ * - `workspace:self#operator@S` each operator the parent held at birth (D15);
15
+ * - `principalScope:<s>#enroller@S` each enroller the parent held at birth (D22),
16
+ *
17
+ * and records them on the singleton {@link FoundingPrincipal} the kernel reads when it judges the
18
+ * warrant. Nothing here is a token, an issuer key, a JWKS or a certificate: P is a `<scope>:<subject>`
19
+ * principal and K is the sha256 of a public key.
20
+ *
21
+ * Why one requires-free step: on the warrant-free prefix no admin exists yet, so an admin-gated grant
22
+ * (`grantAdmin`, `grantLawOperator`, `grantEnroller`) is refused by the kernel's relation gate. The
23
+ * step is instead fenced by {@link foundingPrincipalVirginOnly}: it is admitted only before the warrant
24
+ * and only once, so it can never be replayed to seat a second founder. What makes the prefix
25
+ * trustworthy is the warrant that closes it — the root's is signed by the pinned K_root; a child's is
26
+ * appended by the kernel's birth effect of the parent's admitted, signed `birthChild`, and the kernel
27
+ * binds the warrant's principal to this record (`executor/src/founding_genesis.rs`).
28
+ *
29
+ * The founding principal must be one the framework's governance relations admit (`user:`, `console:` or
30
+ * `custodian:`, `isGovernanceSubject`): the framework cannot name a tenant's scopes. A `user:` founder is
31
+ * an application's signed-in user founding their own workspace (a Home), enrolled by the user scope's
32
+ * enroller (`principalScope:user#enroller`) exactly like any enrolled principal.
33
+ */
34
+ import { z } from "zod";
35
+ import { aggregate, instance } from "../aggregate.js";
36
+ import { t } from "../fields.js";
37
+ import { Lww } from "../drivers.js";
38
+ import { directive } from "../directive.js";
39
+ import { set, type PlannedOp } from "../ops.js";
40
+ import { principalScopeOf } from "../member_authentication.js";
41
+ import { RelationTuple, relationTuplesByObject, writeTuple } from "./relations.js";
42
+ import { readFrameworkDeclaredRows } from "../read.js";
43
+ import { readRef, readSet, workspaceInvariant } from "./workspace_invariant.js";
44
+ import { GENESIS_WARRANT_ID } from "./genesis.js";
45
+ import { signerObject, SIGNER_RELATION } from "./signing_identity.js";
46
+ import { WORKSPACE_ADMIN_RELATION, WORKSPACE_OPERATOR_RELATION, PRINCIPAL_SCOPE_ENROLLER_RELATION } from "./governance_relations.js";
47
+ import { isGovernanceSubject, principalScopeObject, providerScopeField } from "./principal_enrollment.js";
48
+
49
+ /**
50
+ * OPERATOR INHERITANCE (identity target model D15): the parent's CURRENT `operator` subjects, read
51
+ * off the parent's folded state by the calling plan (a declared captured read, `relationTuplesByObject`
52
+ * on `workspace:self`). The founding step seats each one in the child — a fact copied once at birth,
53
+ * never a live dependency on the parent afterward (D15's whole point). Sorted so the recipe is a pure
54
+ * function of the tuple set.
55
+ */
56
+ export function readInheritedOperators(): readonly string[] {
57
+ const rows = readFrameworkDeclaredRows(relationTuplesByObject, RelationTuple, { object: "workspace:self" });
58
+ const row = rows.find((candidate) => candidate.relation === WORKSPACE_OPERATOR_RELATION);
59
+ const subjects = row?.subjects as Record<string, { status?: string }> | undefined;
60
+ if (!subjects) return [];
61
+ return Object.keys(subjects)
62
+ .filter((subject) => subjects[subject]?.status === "active")
63
+ .sort();
64
+ }
65
+
66
+ /** The singleton id of the founding record — MUST equal `executor::founding_genesis::FOUNDING_PRINCIPAL_ID`. */
67
+ export const FOUNDING_PRINCIPAL_ID = "founding-principal:self";
68
+
69
+ /** The directive id — MUST equal `executor::founding_genesis::SEED_FOUNDING_PRINCIPAL_DIRECTIVE`. */
70
+ export const SEED_FOUNDING_PRINCIPAL_DIRECTIVE = "seedFoundingPrincipal" as const;
71
+
72
+ /** The one record the kernel reads to bind the warrant to the founder (an O(1) point read). */
73
+ export const FoundingPrincipal = aggregate("FoundingPrincipal", {
74
+ principal: t.string().merge(Lww), // `<scope>:<subject>`, the founding admin
75
+ keyHash: t.string().merge(Lww), // sha256hex of the founding signer's public key
76
+ }).public();
77
+
78
+ const sha256Hex = z.string().regex(/^[0-9a-f]{64}$/, "expected lowercase sha256 hex (a public key hash)");
79
+ /** Every field that is law on the founding step. Strict: no token-, issuer- or certificate-shaped field.
80
+ * Subject-class checks are object-level refinements (the compiler's security discovery must be able to
81
+ * sample each field on its own). */
82
+ export const foundingPrincipalPayload = z
83
+ .object({
84
+ /** The founding admin: a user:, console: or custodian: `<scope>:<subject>` principal. */
85
+ principal: z.string().min(1),
86
+ keyHash: sha256Hex,
87
+ /** The parent's active operator subjects at birth, sorted (D15). */
88
+ operators: z.array(z.string().min(1)).default([]),
89
+ /** The parent's active enroller tuples at birth, sorted by (scope, subject) (D22). */
90
+ enrollers: z.array(z.object({ scope: providerScopeField, subject: z.string().min(1) }).strict()).default([]),
91
+ grantedAt: z.number().int().nonnegative(),
92
+ })
93
+ .strict()
94
+ .refine((p) => principalScopeOf(p.principal) !== undefined && isGovernanceSubject(p.principal), {
95
+ message: "the founding principal is a console: or custodian: <scope>:<subject> principal",
96
+ path: ["principal"],
97
+ })
98
+ .refine((p) => p.operators.every(isGovernanceSubject) && p.enrollers.every((e) => isGovernanceSubject(e.subject)), {
99
+ message: "every inherited operator and enroller is a framework governance subject",
100
+ path: ["operators"],
101
+ });
102
+
103
+ export type FoundingPrincipalPayload = z.input<typeof foundingPrincipalPayload>;
104
+
105
+ /** The founding facts as planned ops — a pure function of the payload. */
106
+ export function writeFoundingPrincipal(p: z.output<typeof foundingPrincipalPayload>): PlannedOp[] {
107
+ // The grant's authority is the genesis itself: at a root the K_root-signed warrant that closes this
108
+ // prefix, at a child the parent's admitted birth whose effect appends that warrant.
109
+ const grantedBy = "genesis";
110
+ const grantedAt = String(p.grantedAt);
111
+ const record = instance(FoundingPrincipal, FOUNDING_PRINCIPAL_ID);
112
+ return [
113
+ set(record, "principal", p.principal),
114
+ set(record, "keyHash", p.keyHash),
115
+ ...writeTuple({
116
+ object: signerObject(p.principal),
117
+ relation: SIGNER_RELATION,
118
+ subject: `key:${p.keyHash}`,
119
+ grantedBy,
120
+ grantedAt,
121
+ }),
122
+ ...writeTuple({ object: "workspace:self", relation: WORKSPACE_ADMIN_RELATION, subject: p.principal, grantedBy, grantedAt }),
123
+ ...(p.operators ?? []).flatMap((subject) =>
124
+ writeTuple({ object: "workspace:self", relation: WORKSPACE_OPERATOR_RELATION, subject, grantedBy, grantedAt })),
125
+ ...(p.enrollers ?? []).flatMap((enroller) =>
126
+ writeTuple({
127
+ object: principalScopeObject(enroller.scope),
128
+ relation: PRINCIPAL_SCOPE_ENROLLER_RELATION,
129
+ subject: enroller.subject,
130
+ grantedBy,
131
+ grantedAt,
132
+ })),
133
+ ];
134
+ }
135
+
136
+ /** `seedFoundingPrincipal` — the one founding step of a token-free genesis. See the module doc. */
137
+ export const seedFoundingPrincipal = directive(SEED_FOUNDING_PRINCIPAL_DIRECTIVE)
138
+ .ensures(FoundingPrincipal)
139
+ .payload(foundingPrincipalPayload)
140
+ .plan((p) => writeFoundingPrincipal(p))
141
+ .alsoEnsures(RelationTuple);
142
+
143
+ /** Admitted only on a virgin, warrant-free prefix, and only once: no second founder, ever. */
144
+ export const foundingPrincipalVirginOnly = workspaceInvariant("FoundingPrincipalVirginOnly")
145
+ .on(SEED_FOUNDING_PRINCIPAL_DIRECTIVE)
146
+ .reads(readSet(
147
+ readRef("warrant", "GenesisWarrant").pre().at(GENESIS_WARRANT_ID),
148
+ readRef("founding", FoundingPrincipal).pre().at(FOUNDING_PRINCIPAL_ID),
149
+ ))
150
+ .assert(({ warrant, founding }) => {
151
+ if ((warrant as { principal?: string } | undefined)?.principal) return { reject: "founding-after-warrant" };
152
+ if ((founding as { principal?: string } | undefined)?.principal) return { reject: "founding-principal-already-seeded" };
153
+ return { accept: true };
154
+ });
155
+
156
+ /** The birth-origin record's singleton id — MUST equal `executor::founding_genesis::BIRTH_ORIGIN_ID`. */
157
+ export const BIRTH_ORIGIN_ID = "birth-origin:self";
158
+
159
+ /** The directive id — MUST equal `executor::founding_genesis::SEED_BIRTH_ORIGIN_DIRECTIVE`. */
160
+ export const SEED_BIRTH_ORIGIN_DIRECTIVE = "seedBirthOrigin" as const;
161
+
162
+ /**
163
+ * Where a token-free child came from: the parent workspace and the id of the parent's admitted, signed
164
+ * birth intent whose births witness re-derives this child's genesis prefix. Appended by the KERNEL's
165
+ * birth effect (never by a plan), just before the warrant, so the child's own chain names the parent
166
+ * birth it can be checked against offline. A root has none.
167
+ */
168
+ export const BirthOrigin = aggregate("BirthOrigin", {
169
+ parent: t.string().merge(Lww),
170
+ parentIntent: t.string().merge(Lww),
171
+ }).public();
172
+
173
+ /** `seedBirthOrigin` — the kernel-appended parent reference of a token-free birth. */
174
+ export const seedBirthOrigin = directive(SEED_BIRTH_ORIGIN_DIRECTIVE)
175
+ .ensures(BirthOrigin)
176
+ .payload(z.object({ parent: z.string().min(1), parentIntent: z.string().min(1) }).strict())
177
+ .plan((p) => {
178
+ const record = instance(BirthOrigin, BIRTH_ORIGIN_ID);
179
+ return [set(record, "parent", p.parent), set(record, "parentIntent", p.parentIntent)];
180
+ });
181
+
182
+ /** Kernel-appended once, before the warrant; never again. */
183
+ export const birthOriginVirginOnly = workspaceInvariant("BirthOriginVirginOnly")
184
+ .on(SEED_BIRTH_ORIGIN_DIRECTIVE)
185
+ .reads(readSet(
186
+ readRef("warrant", "GenesisWarrant").pre().at(GENESIS_WARRANT_ID),
187
+ readRef("origin", BirthOrigin).pre().at(BIRTH_ORIGIN_ID),
188
+ ))
189
+ .assert(({ warrant, origin }) => {
190
+ if ((warrant as { principal?: string } | undefined)?.principal) return { reject: "birth-origin-after-warrant" };
191
+ if ((origin as { parent?: string } | undefined)?.parent) return { reject: "birth-origin-already-seeded" };
192
+ return { accept: true };
193
+ });
@@ -43,7 +43,7 @@ import * as domainLifecycle from "./domain_lifecycle.js";
43
43
  import * as encryptionIdentity from "./encryption_identity.js";
44
44
  import * as encryptionScope from "./encryption_scope.js";
45
45
  import * as genesis from "./genesis.js";
46
- import * as home from "./home.js";
46
+ import * as home from "./receiving_group.js";
47
47
  import * as ownedCustody from "./owned_custody.js";
48
48
  import * as relations from "./relations.js";
49
49
  import * as repair from "./repair.js";
@@ -35,6 +35,7 @@ import { directive } from "../directive.js";
35
35
  import { set, type PlannedOp } from "../ops.js";
36
36
  import { RelationTuple, writeTuple } from "./relations.js";
37
37
  import { MODEL_LIFECYCLE_AUTHORITY } from "./domain_lifecycle.js";
38
+ import { principalScopeOf } from "../member_authentication.js";
38
39
  import {
39
40
  ADMISSION_CHECKPOINT_PRINCIPAL,
40
41
  SIGNER_RELATION,
@@ -133,7 +134,11 @@ export const seedGenesis = directive("seedGenesis")
133
134
  ...writeTuple({
134
135
  object: "workspace:self",
135
136
  relation: MODEL_LIFECYCLE_AUTHORITY,
136
- subject: /^(user|key):/.test(p.principal) ? p.principal : `user:${p.principal}`,
137
+ // A `<scope>:<subject>` principal (token-free genesis, D22) is its own Zanzibar subject; a bare
138
+ // legacy uid is still spelled `user:<uid>`.
139
+ subject: /^(user|key):/.test(p.principal) || principalScopeOf(p.principal) !== undefined
140
+ ? p.principal
141
+ : `user:${p.principal}`,
137
142
  grantedBy: p.principal,
138
143
  grantedAt: p.bornAt,
139
144
  }),
@@ -8,3 +8,22 @@ import { relationRef } from "../relation_schema.js";
8
8
  /** The global workspace authority seated at `workspace:self#admin`. */
9
9
  export const WORKSPACE_ADMIN_RELATION = relationRef("admin");
10
10
 
11
+ /**
12
+ * The global workspace authority seated at `workspace:self#operator` (identity target model,
13
+ * `architecture/identity_target_model.md` D15): who may install, stage or promote law here. Narrower
14
+ * than {@link WORKSPACE_ADMIN_RELATION} — an admin grants and revokes it, exactly as an admin grants
15
+ * admin — and, unlike admin, it is copied into a child's own genesis chain when the child is born
16
+ * (`buildGenesisChain`'s `inheritedOperators`), a fact recorded once at birth, never a live dependency
17
+ * on the parent afterward. A child may change who it trusts as an operator the moment it exists; the
18
+ * parent has no ongoing authority over it.
19
+ */
20
+ export const WORKSPACE_OPERATOR_RELATION = relationRef("operator");
21
+
22
+ /**
23
+ * The framework authority seated at `principalScope:<scope>#enroller` (identity target model D22): who
24
+ * may write the FIRST signer key of a principal of an enrolled scope (`enrollDevice`) and revoke that
25
+ * scope's keys (`revokeDevice`). A relation tuple, revocable and replaceable by one intent — never a key
26
+ * in law. Like {@link WORKSPACE_OPERATOR_RELATION}, an admin grants it and a child is born with a copy
27
+ * of its parent's enroller tuples (`buildGenesisChain`'s `inheritedEnrollers`).
28
+ */
29
+ export const PRINCIPAL_SCOPE_ENROLLER_RELATION = relationRef("enroller");