@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
@@ -0,0 +1,314 @@
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
+ * RECEIVING-GROUP DEVICE RECOVERY — framework law, composed by the application's declaration.
8
+ *
9
+ * A verified person's receiving group is the framework's identity anchor. When the application
10
+ * declares `application.receivingGroup.recovery = "platform-identity-provider"`, the anchor is born
11
+ * with that posture (`receiving_group.ts`, the policy seed) and this module supplies the ONE recovery door that
12
+ * posture means: a replacement device, already seated on the attested parent platform by the ordinary
13
+ * `enrollFirstDevice` lane, asks the platform to re-seat it on the receiving group. Platform law derives
14
+ * both the target and the evidence from its own committed state (the user's current typed
15
+ * `SignerDelegation` and the platform's current typed `AuthProvider`); the host delivers a sealed effect
16
+ * and chooses nothing. The receiving group's own gate then proves the evidence against ITS birth record,
17
+ * ITS group facts and ITS selected posture before seating anything.
18
+ *
19
+ * Both halves live in the injected application-home domain, which runs on the platform workspace AND is
20
+ * installed into every receiving group at genesis, so the parent door and the child acceptor are one
21
+ * exported `Directive` pair in one law module (the compiler's exact-export rule).
22
+ *
23
+ * Provenance: this is the framework form of the door CO2 authored as tenant law
24
+ * (`co2_platform/auth_provider_epoch.ts`, `co2_home/auth_provider_epoch_accept.ts`,
25
+ * `auth_provider_authority.ts`). The composition of policy + signer seat + delegation + verifier epoch +
26
+ * parent-authority seat into ONE target transition is load-bearing: split into independently delivered
27
+ * effects, delivery order would become transport state rather than law.
28
+ */
29
+ import { z } from "zod";
30
+ import { directive, nomosImplementationDetail } from "../directive.js";
31
+ import { intent } from "../intent.js";
32
+ import {
33
+ AuthProvider,
34
+ AuthProviderCertificate,
35
+ AuthProviderKey,
36
+ authProvider,
37
+ authProviderCertificates,
38
+ authProviderConfiguration,
39
+ authProviderKeys,
40
+ readAuthProviderConfiguration,
41
+ writeAuthProviderConfiguration,
42
+ } from "./auth_provider_law.js";
43
+ // THE SHARED EPOCH ACCEPTOR + PARENT-AUTHORITY SEAT live in the framework's child-authentication law
44
+ // (every business-born child adopts its parent's verifier epoch through the same door a receiving group
45
+ // does); this module re-exports them under their historical names so the composed posture law is unchanged.
46
+ import {
47
+ ACCEPT_PARENT_AUTH_PROVIDER_EPOCH_ID,
48
+ acceptParentAuthProviderEpoch,
49
+ acceptParentAuthProviderEpochEffect,
50
+ seatVerifiedBirthParentAuthority,
51
+ verifiedBirthAttestation,
52
+ } from "./child_authentication.js";
53
+ import {
54
+ BIRTH_ATTESTATION_ID,
55
+ BirthAttestation,
56
+ DEFAULT_RECEIVING_GROUP_POLICY,
57
+ PLATFORM_IDENTITY_PROVIDER_RECOVERY,
58
+ RECEIVING_GROUP_ID,
59
+ RECEIVING_GROUP_POLICY_ID,
60
+ ReceivingGroup,
61
+ ReceivingGroupPolicy,
62
+ type ReceivingGroupRecoveryPolicy,
63
+ writeReceivingGroupPolicy,
64
+ } from "./receiving_group.js";
65
+ import { RelationTuple, writeTuple } from "./relations.js";
66
+ import {
67
+ SIGNER_RELATION,
68
+ SignerDelegation,
69
+ readSignerDelegationRecoveryEvidence,
70
+ signerDelegationByUser,
71
+ signerDelegationEvidenceIsRetained,
72
+ signerDelegationRecoveryEvidence,
73
+ signerObject,
74
+ writeSignerDelegationRecoveryEvidence,
75
+ } from "./signing_identity.js";
76
+ import { readRef, readSet, workspaceInvariant } from "./workspace_invariant.js";
77
+
78
+ /** Wire ids — framework-internal, obscure on purpose (the 7c1f5e suffix convention). */
79
+ export const RECOVER_RECEIVING_GROUP_DEVICE_ID = "nomosInternalRecoverReceivingGroupDevice7c1f5e";
80
+ export const ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID = "nomosInternalAcceptReceivingGroupDeviceRecovery7c1f5e";
81
+ export { ACCEPT_PARENT_AUTH_PROVIDER_EPOCH_ID, verifiedBirthAttestation };
82
+
83
+ /** The exact typed parent disclosure used to recover a receiving-group device. Neither the host nor
84
+ * the caller supplies verifier members: platform law reads both values from its committed state. */
85
+ export const receivingGroupDeviceRecoveryEvidence = z
86
+ .object({
87
+ delegation: signerDelegationRecoveryEvidence,
88
+ authProvider: authProviderConfiguration,
89
+ })
90
+ .strict();
91
+ export type ReceivingGroupDeviceRecoveryEvidence = z.infer<typeof receivingGroupDeviceRecoveryEvidence>;
92
+
93
+ // ── CHILD SIDE: the receiving group's own consequences ────────────────────────────────────────────
94
+
95
+ /** Re-seat the selected posture for a group born under the untouched framework default. Genesis seeds
96
+ * the declared posture directly; this exists for anchors born before the application declared one.
97
+ * ONE module-level singleton (the only posture with a door is the attested parent), so every evaluation
98
+ * of the composed law resolves the same declaration object — the compiler registers these singletons as
99
+ * the application-home domain's declaration exports exactly like `child_authentication.ts`. */
100
+ export const setReceivingGroupRecoveryPosture = nomosImplementationDetail(
101
+ directive("nomosInternalSetReceivingGroupRecoveryPosture7c1f5e")
102
+ .ensures(ReceivingGroupPolicy)
103
+ .payload(z.object({ setAt: z.string().min(1) }).strict())
104
+ .plan((p) => writeReceivingGroupPolicy({ setAt: p.setAt, recovery: PLATFORM_IDENTITY_PROVIDER_RECOVERY })),
105
+ );
106
+
107
+ export const seatRecoveredDevice = nomosImplementationDetail(
108
+ directive("nomosInternalSeatRecoveredReceivingGroupDevice7c1f5e")
109
+ .ensures(RelationTuple)
110
+ .payload(receivingGroupDeviceRecoveryEvidence)
111
+ .plan(({ delegation }) =>
112
+ writeTuple({
113
+ object: signerObject(delegation.user),
114
+ relation: SIGNER_RELATION,
115
+ subject: delegation.deviceKeySubject,
116
+ grantedBy: `workspace:${delegation.certificate.parentId}`,
117
+ grantedAt: delegation.enrolledAt,
118
+ ...(delegation.certificate.verifiedVia === undefined
119
+ ? {}
120
+ : { verifiedVia: delegation.certificate.verifiedVia }),
121
+ ...(delegation.certificate.epoch === undefined
122
+ ? {}
123
+ : { validFromEpoch: delegation.certificate.epoch }),
124
+ }),
125
+ ),
126
+ );
127
+
128
+ /** A recovered key must carry the parent's typed delegation certificate too, otherwise a later child
129
+ * birth combines a certificate signed by the recovered device with the group's original-device lineage
130
+ * and fails the offline chain walk. */
131
+ export const adoptRecoveryDelegation = nomosImplementationDetail(
132
+ directive("nomosInternalAdoptRecoveryDelegation7c1f5e")
133
+ .ensures(SignerDelegation)
134
+ .payload(receivingGroupDeviceRecoveryEvidence)
135
+ .plan(({ delegation }) => writeSignerDelegationRecoveryEvidence(delegation)),
136
+ );
137
+
138
+ export const adoptRecoveryAuthProvider = nomosImplementationDetail(
139
+ directive("nomosInternalAdoptRecoveryAuthProvider7c1f5e")
140
+ .ensures(AuthProvider)
141
+ .payload(receivingGroupDeviceRecoveryEvidence)
142
+ .plan(({ authProvider: configuration }) => writeAuthProviderConfiguration(configuration))
143
+ .alsoEnsuresMany(AuthProviderKey)
144
+ .alsoEnsuresMany(AuthProviderCertificate),
145
+ );
146
+
147
+ /** The child-owned gate: the evidence must match THIS group's principal, name and verified birth, be
148
+ * delivered by THAT birth's parent, cite the parent's current provider issuer, and the group must be
149
+ * either untouched-birth-default or already the platform posture. */
150
+ function receivingGroupDeviceRecoveryFollowsPosture(posture: ReceivingGroupRecoveryPolicy) {
151
+ return workspaceInvariant("ReceivingGroupDeviceRecoveryFollowsPosture")
152
+ .on(ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID)
153
+ .reads(
154
+ readSet(
155
+ readRef("group", ReceivingGroup).at(RECEIVING_GROUP_ID),
156
+ readRef("policy", ReceivingGroupPolicy).at(RECEIVING_GROUP_POLICY_ID),
157
+ readRef("birth", BirthAttestation).at(BIRTH_ATTESTATION_ID),
158
+ ),
159
+ )
160
+ .declassify(
161
+ "device recovery deliberately reveals only whether the receiving group selected its attested parent identity provider",
162
+ )
163
+ .assert(({ group, policy, birth }, ctx) => {
164
+ const evidence = ctx?.intent as ReceivingGroupDeviceRecoveryEvidence | undefined;
165
+ const delegation = evidence?.delegation;
166
+ const certificate = delegation?.certificate;
167
+ const provider = evidence?.authProvider;
168
+ const untouchedBirthDefault =
169
+ policy?.recovery === DEFAULT_RECEIVING_GROUP_POLICY.recovery &&
170
+ typeof policy.setAt === "string" &&
171
+ typeof group?.bornAt === "string" &&
172
+ policy.setAt === group.bornAt;
173
+ const alreadySelected = policy?.recovery === posture;
174
+ if (!untouchedBirthDefault && !alreadySelected) {
175
+ return { reject: "receiving-group-recovery-posture-is-neither-birth-default-nor-declared" };
176
+ }
177
+ if (
178
+ typeof group?.principal !== "string" ||
179
+ typeof group.workspaceName !== "string" ||
180
+ delegation === undefined ||
181
+ certificate === undefined ||
182
+ provider === undefined ||
183
+ birth === undefined ||
184
+ delegation.user !== group.principal ||
185
+ certificate.founder !== group.principal ||
186
+ certificate.child !== group.workspaceName ||
187
+ certificate.verified !== true ||
188
+ certificate.parentId.length === 0 ||
189
+ birth.child !== group.workspaceName ||
190
+ birth.founder !== group.principal ||
191
+ birth.verified !== "true" ||
192
+ birth.parentId !== certificate.parentId ||
193
+ ctx?.principal !== `workspace:${certificate.parentId}` ||
194
+ certificate.verifiedVia !== provider.issuer ||
195
+ certificate.idpToken === undefined ||
196
+ certificate.capturedClock === undefined
197
+ ) {
198
+ return { reject: "receiving-group-device-recovery-evidence-mismatch" };
199
+ }
200
+ return { accept: true };
201
+ });
202
+ }
203
+
204
+ // ── PARENT SIDE: the platform's door ──────────────────────────────────────────────────────────────
205
+
206
+ function currentRecoveryEvidence(user: string, deviceKeySubject?: string) {
207
+ const delegation = readSignerDelegationRecoveryEvidence(user, deviceKeySubject);
208
+ if (delegation === undefined) {
209
+ throw new Error(`receiving-group recovery requires the platform's current typed SignerDelegation for '${user}'`);
210
+ }
211
+ const provider = readAuthProviderConfiguration();
212
+ if (provider === undefined) {
213
+ throw new Error("receiving-group recovery requires the platform's current typed AuthProvider");
214
+ }
215
+ if (
216
+ delegation.certificate.founder !== user ||
217
+ delegation.certificate.verified !== true ||
218
+ delegation.certificate.parentId.length === 0 ||
219
+ delegation.certificate.verifiedVia !== provider.issuer ||
220
+ delegation.certificate.idpToken === undefined ||
221
+ delegation.certificate.capturedClock === undefined
222
+ ) {
223
+ throw new Error(
224
+ "receiving-group recovery found a delegation which is not exact current platform identity-provider evidence",
225
+ );
226
+ }
227
+ return receivingGroupDeviceRecoveryEvidence.parse({ delegation, authProvider: provider });
228
+ }
229
+
230
+ export const acceptReceivingGroupDeviceRecovery = nomosImplementationDetail(
231
+ intent(ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID)
232
+ .contract({ accepts: receivingGroupDeviceRecoveryEvidence })
233
+ // Selecting the posture and applying the recovery evidence are ONE target-workspace transition.
234
+ .directs(setReceivingGroupRecoveryPosture, ({ delegation }) => ({ setAt: String(delegation.enrolledAt) }))
235
+ .directs(seatRecoveredDevice, (evidence) => evidence)
236
+ .directs(adoptRecoveryDelegation, (evidence) => evidence)
237
+ .directs(adoptRecoveryAuthProvider, (evidence) => evidence)
238
+ .directs(seatVerifiedBirthParentAuthority, () => ({}))
239
+ .acceptsVerifiedBirthParentRecoveryEffect()
240
+ .atomically(),
241
+ );
242
+
243
+ /** The replacement device authors on the platform, where its exact key is already enrolled. */
244
+ export const recoverReceivingGroupDevice = nomosImplementationDetail(
245
+ intent(RECOVER_RECEIVING_GROUP_DEVICE_ID)
246
+ .contract({
247
+ accepts: z.object({
248
+ user: z.string().min(1),
249
+ deviceKeySubject: z.string().regex(/^key:[0-9a-f]{64}$/).optional(),
250
+ }).strict(),
251
+ })
252
+ .reads(signerDelegationByUser, authProvider, authProviderKeys, authProviderCertificates)
253
+ .directsWorkspace(acceptReceivingGroupDeviceRecovery, {
254
+ workspace: ({ user, deviceKeySubject }) =>
255
+ currentRecoveryEvidence(user, deviceKeySubject).delegation.certificate.child,
256
+ payload: ({ user, deviceKeySubject }) => currentRecoveryEvidence(user, deviceKeySubject),
257
+ })
258
+ .directsWorkspace(acceptParentAuthProviderEpoch, {
259
+ workspace: ({ user, deviceKeySubject }) =>
260
+ currentRecoveryEvidence(user, deviceKeySubject).delegation.certificate.child,
261
+ payload: ({ user, deviceKeySubject }) => currentRecoveryEvidence(user, deviceKeySubject).authProvider,
262
+ })
263
+ .authenticatesWithEnrolledDevice()
264
+ .atomically(),
265
+ );
266
+
267
+ /** A device may request recovery only for its own authenticated identity. */
268
+ export const recoverReceivingGroupDeviceBindsPrincipal = workspaceInvariant(
269
+ "RecoverReceivingGroupDeviceBindsPrincipal",
270
+ )
271
+ .on(RECOVER_RECEIVING_GROUP_DEVICE_ID)
272
+ .reads(readSet())
273
+ .assert((_snapshots, ctx) =>
274
+ ctx?.principal === (ctx?.intent as { user?: unknown } | undefined)?.user
275
+ ? { accept: true }
276
+ : { reject: "receiving-group-device-recovery-must-bind-authenticated-user" },
277
+ );
278
+
279
+ /**
280
+ * The recovery law an application composes when its declared posture is the attested parent identity
281
+ * provider. Returned as one export map so the application-home policy law can merge it exactly like its
282
+ * other `__nomos_*` members; every member is presentation-internal.
283
+ */
284
+ export function receivingGroupRecoveryLaw(posture: ReceivingGroupRecoveryPolicy) {
285
+ if (posture !== PLATFORM_IDENTITY_PROVIDER_RECOVERY) {
286
+ throw new Error(
287
+ `receivingGroupRecoveryLaw: posture '${posture}' has no platform recovery door; only ` +
288
+ `'${PLATFORM_IDENTITY_PROVIDER_RECOVERY}' re-seats a device through the attested parent`,
289
+ );
290
+ }
291
+ return {
292
+ __nomos_receivingGroupDeviceRecoveryEvidence: receivingGroupDeviceRecoveryEvidence,
293
+ __nomos_verifiedBirthAttestation: verifiedBirthAttestation,
294
+ __nomos_setReceivingGroupRecoveryPosture: setReceivingGroupRecoveryPosture,
295
+ // `seatRecoveredDevice` rides ONLY the acceptor's step closure (as `child_authentication.ts` carries its
296
+ // gated acceptor effect): the compiler infers the framework RelationTuple bookkeeping onto an exported
297
+ // tuple-writing directive as a fresh object, so a second export slot would resolve the one step to two
298
+ // declarations (`NMS-GRAPH-001`).
299
+ __nomos_adoptRecoveryDelegation: adoptRecoveryDelegation,
300
+ __nomos_adoptRecoveryAuthProvider: adoptRecoveryAuthProvider,
301
+ __nomos_acceptParentAuthProviderEpochEffect: acceptParentAuthProviderEpochEffect,
302
+ __nomos_seatVerifiedBirthParentAuthority: seatVerifiedBirthParentAuthority,
303
+ __nomos_acceptReceivingGroupDeviceRecovery: acceptReceivingGroupDeviceRecovery,
304
+ __nomos_acceptParentAuthProviderEpoch: acceptParentAuthProviderEpoch,
305
+ __nomos_receivingGroupDeviceRecoveryFollowsPosture: receivingGroupDeviceRecoveryFollowsPosture(posture),
306
+ __nomos_receivingGroupDeviceRecoveryRetainsEvidence: signerDelegationEvidenceIsRetained(
307
+ "ReceivingGroupDeviceRecoveryRetainsEvidence",
308
+ ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID,
309
+ "delegation.user",
310
+ ),
311
+ __nomos_recoverReceivingGroupDevice: recoverReceivingGroupDevice,
312
+ __nomos_recoverReceivingGroupDeviceBindsPrincipal: recoverReceivingGroupDeviceBindsPrincipal,
313
+ };
314
+ }
@@ -211,20 +211,16 @@ export const RelationshipSubjectValue = valueObject("RelationshipSubject", {
211
211
  ownedCustody: OwnedCustodyValue.optional(),
212
212
  });
213
213
 
214
- // Historical RelationTuple law declared this map value as `t.json()`, but the
215
- // kernel has always admitted and stored only the nominal RelationshipSubject
216
- // palette for this framework field. Keep that exact prior declaration as the
217
- // source of the explicit evolution edge: this is a type-disclosure refinement
218
- // of existing structured custody, not a JSON parser or a business-data cast.
219
- const LegacyRelationshipSubjects = t.map(t.json()).merge(MapOf(Lww));
220
-
221
214
  export const RelationTuple = aggregate("RelationTuple", {
222
215
  object: t.string().merge(Lww),
223
216
  relation: t.string().merge(Lww),
224
217
  subjects: t
225
218
  .map(RelationshipSubjectValue.field())
226
219
  .merge(MapOf(Lww))
227
- .evolvesFrom(LegacyRelationshipSubjects),
220
+ // Historical metadata called this leaf JSON, although the kernel's relation
221
+ // gate already required RelationshipSubject. Declare that exact disclosure
222
+ // transition; this does not permit arbitrary tenant JSON-to-object narrowing.
223
+ .evolvesFrom(t.map(t.json()).merge(MapOf(Lww))),
228
224
  }).public();
229
225
  export type RelationTupleHandle = typeof RelationTuple;
230
226