@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
@@ -1,6 +1,6 @@
1
1
  // Generated protocol types shared by every Dart and Flutter Nomos host.
2
2
  //
3
- // The source of truth is proto/nomos/kernel/v1 plus proto/nomos/runtime/v2. This package owns the
3
+ // The source of truth is the typed protocol graph under proto/nomos. This package owns the
4
4
  // generated Dart projection so nomos_client and nomos_flutter cannot drift into
5
5
  // handwritten copies of the kernel/runtime ABI.
6
6
  library;
@@ -8,4 +8,24 @@ library;
8
8
  export 'src/proto/nomos/kernel/v1/kernel.pb.dart';
9
9
  export 'src/proto/nomos/kernel/v1/progress.pb.dart';
10
10
  export 'src/proto/nomos/custody/v1/snapshot.pb.dart';
11
+ export 'src/proto/nomos/discovery/v1/workspace_placement.pb.dart';
12
+ export 'src/proto/nomos/runtime/v2/application_desk.pb.dart';
13
+ export 'src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart';
14
+ export 'src/proto/nomos/runtime/v2/authentication_desk.pb.dart';
15
+ export 'src/proto/nomos/runtime/v2/custody_desk.pb.dart';
16
+ export 'src/proto/nomos/runtime/v2/interaction_desk.pb.dart';
17
+ export 'src/proto/nomos/runtime/v2/compatibility_desk.pb.dart';
18
+ export 'src/proto/nomos/runtime/v2/law_desk.pb.dart';
19
+ export 'src/proto/nomos/runtime/v2/maintenance_desk.pb.dart';
20
+ export 'src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart';
21
+ export 'src/proto/nomos/runtime/v2/residency_desk.pb.dart';
22
+ export 'src/proto/nomos/runtime/v2/correspondence_desk.pb.dart';
23
+ export 'src/proto/nomos/runtime/v2/sealing_desk.pb.dart';
24
+ export 'src/proto/nomos/runtime/v2/credentials_desk.pb.dart';
25
+ export 'src/proto/nomos/runtime/v2/placement_desk.pb.dart';
26
+ export 'src/proto/nomos/runtime/v2/recovery_desk.pb.dart';
27
+ export 'src/proto/nomos/runtime/v2/records_desk.pb.dart';
28
+ export 'src/proto/nomos/runtime/v2/observability_desk.pb.dart';
29
+ export 'src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart';
30
+ export 'src/proto/nomos/runtime/v2/framework.pb.dart';
11
31
  export 'src/proto/nomos/runtime/v2/runtime.pb.dart';
@@ -14,7 +14,7 @@
14
14
  /// - The ONE effectful write verb `offer(intent)` + the typed reactive read engine
15
15
  /// `NomosReads`.
16
16
  /// - The tri-state `NomosSlot<T>`, runtime aggregate metadata, schema validation, and
17
- /// the data-only error/trace types (`NomosBridgeError`, `NomosErrorInfo`,
17
+ /// the data-only error/trace types (`NomosRuntimeError`, `NomosErrorInfo`,
18
18
  /// `NomosTraceContext`) plus the typed diagnostics.
19
19
  library;
20
20
 
@@ -27,6 +27,7 @@ export 'src/schema_validation.dart';
27
27
  export 'src/aggregate_meta.dart';
28
28
  export 'src/error_info.dart';
29
29
  export 'src/errors.dart';
30
+ export 'src/runtime_outcome.dart';
30
31
  // Foreign references expose identity data, while navigation readers and attestation stay behind the
31
32
  // generated application runtime.
32
33
  export 'src/foreign_ref.dart' show ForeignRef;
@@ -57,3 +58,10 @@ export 'src/local_work_rejected.dart';
57
58
  // SURFACED MERGE CONFLICTS (architecture/surfaced_merge_conflict.md): the read-collapse types for a
58
59
  // `.merge(Surfaced(...))` field — SurfacedValue<T> (resolved scalar | pending observations). Pure data.
59
60
  export 'src/surfaced.dart';
61
+
62
+ // THE APPROVED LAW MODEL: NomosApprovedModel — the package identity, approval reason, domain keys and
63
+ // package loader a release declares. A required Reception argument, and pure data like the rest of this
64
+ // package: it opens no custody and starts no runtime.
65
+ export 'src/approved_model.dart';
66
+
67
+ export 'src/admission_decision.dart';
@@ -0,0 +1,37 @@
1
+ import 'dart:typed_data';
2
+ import 'proto/nomos/kernel/v1/kernel.pbenum.dart' show KernelRefusalCode;
3
+ export 'proto/nomos/kernel/v1/kernel.pbenum.dart' show KernelRefusalCode;
4
+
5
+ /// Terminal admission decisions. Availability and delivery remain runtime observations.
6
+ sealed class AdmissionDecision<S, R> { const AdmissionDecision(); }
7
+ final class Admitted<S, R> extends AdmissionDecision<S, R> {
8
+ const Admitted(this.value);
9
+ final S value;
10
+ }
11
+ final class DomainRefused<S, R> extends AdmissionDecision<S, R> {
12
+ const DomainRefused(this.reason, this.evidence);
13
+ final R reason;
14
+ final NomosDomainRefusalEvidence evidence;
15
+ }
16
+ final class FrameworkRefused<S, R> extends AdmissionDecision<S, R> {
17
+ const FrameworkRefused(this.code, this.message);
18
+ final KernelRefusalCode code;
19
+ final String message;
20
+ }
21
+ final class UnsupportedRefusalContract<S, R> extends AdmissionDecision<S, R> {
22
+ const UnsupportedRefusalContract(this.evidence);
23
+ final NomosDomainRefusalEvidence evidence;
24
+ }
25
+
26
+ /// Ephemeral evidence attached by the deciding kernel. The law hash and type
27
+ /// address identify the complete schema closure. It is not a saved refusal.
28
+ final class NomosDomainRefusalEvidence {
29
+ NomosDomainRefusalEvidence({required List<int> lawSha256, required this.invariant,
30
+ required this.typeIdentity, required List<int> valueUsda})
31
+ : lawSha256 = Uint8List.fromList(lawSha256).asUnmodifiableView(),
32
+ valueUsda = Uint8List.fromList(valueUsda).asUnmodifiableView();
33
+ final Uint8List lawSha256;
34
+ final String invariant;
35
+ final String typeIdentity;
36
+ final Uint8List valueUsda;
37
+ }
@@ -71,7 +71,7 @@ class NomosAggregateMeta {
71
71
 
72
72
  /// The AGGREGATE WIRE TYPE of a kernel aggregate id: minted ids are
73
73
  /// `<domain>.<Type>_<uuidv7>`, so the type is the prefix before the trailing
74
- /// `_<uuid>` (the same rule `@githolon/client` applies to Create events).
74
+ /// `_<uuid>` (the same rule `@githolon/peer-office` applies to Create events).
75
75
  /// Returns the input unchanged when no uuid suffix is present (already a type).
76
76
  static String typeOfId(String aggregateId) =>
77
77
  aggregateId.replaceFirst(RegExp(r'_[0-9a-fA-F-]+$'), '');
@@ -0,0 +1,65 @@
1
+ /// THE LAW MODEL AN APPLICATION RELEASE APPROVES.
2
+ ///
3
+ /// Pure validated data, and a REQUIRED argument to the Reception, so a tenant
4
+ /// cannot bind an application without naming this type. It lives here — beside
5
+ /// `CustodyBreakPolicy` — precisely because it belongs to no runtime: it opens no
6
+ /// custody, holds no session and starts nothing. The Peer Office model-adoption
7
+ /// desk consumes it; its phases and outcomes are the desk's observations and stay
8
+ /// behind the Reception.
9
+ library;
10
+
11
+ import 'dart:typed_data';
12
+
13
+ final RegExp _lowerHex64 = RegExp(r'^[0-9a-f]{64}$');
14
+
15
+ /// The law model an application release approves, supplied once at the
16
+ /// application's Reception. Every field is required: the office refuses to
17
+ /// adopt without the package identity, the domain keys it observes, the
18
+ /// attributed reason the kernel's transition demands, or the package bytes a
19
+ /// child must stage — none of them can be invented later.
20
+ final class NomosApprovedModel {
21
+ NomosApprovedModel({
22
+ required this.lawSha256,
23
+ required this.reason,
24
+ required List<String> domainKeys,
25
+ required this.loadPackage,
26
+ }) : domainKeys = List.unmodifiable(domainKeys) {
27
+ if (!_lowerHex64.hasMatch(lawSha256)) {
28
+ throw ArgumentError.value(
29
+ lawSha256,
30
+ 'lawSha256',
31
+ 'must be the kernel-derived identity of the compiled law package (64 lowercase hex)',
32
+ );
33
+ }
34
+ if (reason.trim().isEmpty) {
35
+ throw ArgumentError.value(
36
+ reason,
37
+ 'reason',
38
+ 'must be the attributed approval text the release recorded',
39
+ );
40
+ }
41
+ if (this.domainKeys.isEmpty ||
42
+ this.domainKeys.any((key) => key.trim().isEmpty)) {
43
+ throw ArgumentError.value(
44
+ domainKeys,
45
+ 'domainKeys',
46
+ 'must name the application domain keys the office observes on each workspace',
47
+ );
48
+ }
49
+ }
50
+
51
+ /// The kernel-derived identity of the compiled `.law.usdz` closure.
52
+ final String lawSha256;
53
+
54
+ /// The attributed approval text. The kernel's transition demands it whenever
55
+ /// retirements or retypes are present; the office never invents one.
56
+ final String reason;
57
+
58
+ /// The application's domain keys. A workspace serving none of them is left
59
+ /// alone; keys it does not serve are ignored.
60
+ final List<String> domainKeys;
61
+
62
+ /// The exact compiled package bytes, read only when a workspace must stage
63
+ /// them (a bundled asset, a file beside the generated facade).
64
+ final Future<Uint8List> Function() loadPackage;
65
+ }
@@ -7,7 +7,7 @@
7
7
  // resolve them. The bridge decodes these from the runner's `custody` events + `custodyStatus` reply.
8
8
  library;
9
9
 
10
- import 'proto/nomos/runtime/v2/runtime.pb.dart' as runtime;
10
+ import 'proto/nomos/runtime/v2/recovery_desk.pb.dart' as recovery;
11
11
 
12
12
  /// WHY a chain was superseded — the lineage annotation lifted from the workspace status onto a break.
13
13
  class NomosCustodySupersession {
@@ -98,16 +98,13 @@ class NomosCustodyBreak {
98
98
  };
99
99
  }
100
100
 
101
- /// The app's decision for a custody break (the declared or interactive policy outcome).
101
+ /// The mount's declared response to a custody discontinuity.
102
102
  enum CustodyBreakPolicy {
103
103
  /// Salvage local-only work, re-clone the new incarnation, park the salvage re-offerable, resume.
104
104
  adopt,
105
105
 
106
106
  /// Stay on local truth, go offline-only (the local holon keeps serving; sync suspends).
107
- reject,
108
-
109
- /// Surface the break on [custodyEvents] and await `resolveCustodyBreak(...)` (async UX — a dialog).
110
- ask;
107
+ reject;
111
108
 
112
109
  String get wire => name;
113
110
  }
@@ -130,8 +127,7 @@ class NomosSupersededChain {
130
127
  {'ref': ref, 'supersededAt': supersededAt, 'reason': reason};
131
128
  }
132
129
 
133
- /// A custody lifecycle event pushed over the bridge (mirrors syncEvents). `kind` is one of
134
- /// "detected" | "rejected" | "adopting" | "adopted" | "ask"; "ask" awaits `resolveCustodyBreak`.
130
+ /// A custody lifecycle event pushed over the bridge (mirrors syncEvents).
135
131
  class NomosCustodyEvent {
136
132
  final String kind;
137
133
  final String? session;
@@ -147,22 +143,18 @@ class NomosCustodyEvent {
147
143
  this.parkedIntents,
148
144
  });
149
145
 
150
- /// True when this event is an interactive prompt awaiting a decision.
151
- bool get isAsk => kind == 'ask';
152
-
153
146
  factory NomosCustodyEvent.fromRuntime(
154
- runtime.CustodyChanged event, {
147
+ recovery.CustodyChanged event, {
155
148
  String? session,
156
149
  }) {
157
150
  final custodyBreak = event.hasCustodyBreak() ? event.custodyBreak : null;
158
151
  return NomosCustodyEvent(
159
152
  kind: switch (event.kind) {
160
- runtime.CustodyChangeKind.CUSTODY_CHANGE_KIND_DETECTED => 'detected',
161
- runtime.CustodyChangeKind.CUSTODY_CHANGE_KIND_REJECTED => 'rejected',
162
- runtime.CustodyChangeKind.CUSTODY_CHANGE_KIND_ADOPTING => 'adopting',
163
- runtime.CustodyChangeKind.CUSTODY_CHANGE_KIND_ADOPT_REFUSED =>
153
+ recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_DETECTED => 'detected',
154
+ recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_REJECTED => 'rejected',
155
+ recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_ADOPTING => 'adopting',
156
+ recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_ADOPT_REFUSED =>
164
157
  'adopt-refused',
165
- runtime.CustodyChangeKind.CUSTODY_CHANGE_KIND_ASK => 'ask',
166
158
  _ => 'unspecified',
167
159
  },
168
160
  session: session,
@@ -170,7 +162,7 @@ class NomosCustodyEvent {
170
162
  ? null
171
163
  : NomosCustodyBreak(
172
164
  kind: custodyBreak.kind ==
173
- runtime.CustodyBreakKind.CUSTODY_BREAK_KIND_DIVERGED
165
+ recovery.CustodyBreakKind.CUSTODY_BREAK_KIND_DIVERGED
174
166
  ? NomosCustodyBreakKind.diverged
175
167
  : NomosCustodyBreakKind.superseded,
176
168
  localGenesis: custodyBreak.localGenesis,
@@ -6,7 +6,7 @@
6
6
  /// Data-only error/trace types for the bridge boundary. These carry NO transport, NO
7
7
  /// bridge, NO runtime — they are pure serializable value types, so they live in
8
8
  /// `nomos_types` and are safe to depend on from generated types files + UI code. The
9
- /// async [NomosBridge] runtime (in `nomos_client`'s `webview_bridge.dart`) builds on them.
9
+ /// async Reception/runtime surface builds on them.
10
10
  library;
11
11
 
12
12
  /// Trace/span context carried over the bridge as plain JSON. It is intentionally OpenTelemetry-shaped without
@@ -174,11 +174,11 @@ class NomosErrorInfo {
174
174
 
175
175
  /// A typed refusal surfaced from the githolon's gate (a law refusal, a drift, a malformed op). Carries the
176
176
  /// human-first message verbatim plus structured detail for logging, UI mapping, and future OTel export.
177
- class NomosBridgeError implements Exception {
177
+ class NomosRuntimeError implements Exception {
178
178
  final String message;
179
179
  final NomosErrorInfo info;
180
- NomosBridgeError(this.message, {NomosErrorInfo? info})
180
+ NomosRuntimeError(this.message, {NomosErrorInfo? info})
181
181
  : info = info ?? NomosErrorInfo.legacy(message);
182
182
  @override
183
- String toString() => 'NomosBridgeError: $message';
183
+ String toString() => 'NomosRuntimeError: $message';
184
184
  }
@@ -5,22 +5,22 @@
5
5
 
6
6
  /// TYPED DIAGNOSTICS for the home factory (co2 feedback req 7).
7
7
  ///
8
- /// The generic [NomosBridgeError] (in `webview_bridge.dart`) is the catch-all for a refusal the githolon
8
+ /// The generic [NomosRuntimeError] is the catch-all for a refusal from the Peer Office or kernel
9
9
  /// surfaces verbatim. But the HOME-BIRTH CEREMONY ([NomosScope.home]) has a small, fixed set of ways it can
10
10
  /// fail — and each one wants a DIFFERENT remedy from the app (re-auth vs. retry vs. "deploy the home law").
11
11
  /// These typed errors name the exact failure so the app's `errorBuilder` can branch on `is`, and so a log
12
12
  /// line says WHICH leg of the ceremony broke, not just "connect failed".
13
13
  ///
14
- /// All extend [NomosBridgeError] so existing `catch (NomosBridgeError)` handlers still catch them.
14
+ /// All extend [NomosRuntimeError] so existing `catch (NomosRuntimeError)` handlers still catch them.
15
15
  library;
16
16
 
17
- import 'error_info.dart' show NomosBridgeError, NomosErrorInfo;
17
+ import 'error_info.dart' show NomosRuntimeError, NomosErrorInfo;
18
18
 
19
19
  /// Mint the MOST SPECIFIC typed error for a structured refusal — the one construction point the bridge
20
20
  /// uses everywhere it surfaces an `errorInfo`. A `nomos.custody.*` code becomes a [CustodyError] (typed,
21
21
  /// recoverable, carrying the eviction/escalation decision fields); everything else stays the generic
22
- /// [NomosBridgeError]. Apps `switch` on the type / `code`, never scrape prose.
23
- NomosBridgeError nomosErrorFromInfo(NomosErrorInfo info) {
22
+ /// [NomosRuntimeError]. Apps `switch` on the type / `code`, never scrape prose.
23
+ NomosRuntimeError nomosErrorFromInfo(NomosErrorInfo info) {
24
24
  if (info.code == 'nomos.owned.recovery_pending') {
25
25
  return OwnedRecoveryPending.fromInfo(info);
26
26
  }
@@ -38,7 +38,7 @@ NomosBridgeError nomosErrorFromInfo(NomosErrorInfo info) {
38
38
  if (info.code == 'kernel-capability-skew') {
39
39
  return KernelCoherenceError.fromInfo(info);
40
40
  }
41
- return NomosBridgeError(info.message, info: info);
41
+ return NomosRuntimeError(info.message, info: info);
42
42
  }
43
43
 
44
44
  /// THE ONE recommendedAction vocabulary, shared across EVERY typed error (custody, law, auth, load). A repair
@@ -77,9 +77,8 @@ class NomosRecommendedAction {
77
77
  /// [ParentSignerEnrollmentMissing] (a reborn parent that lost the signer tuple).
78
78
  static const ensureParentSignerEnrollment = 'ensureParentSignerEnrollment';
79
79
 
80
- /// Mount the SOURCE workspace of a colocated attested read as a session on this device's plane
81
- /// (`bridge.connect(session: <sourceWs>)` / `ref.acquire(bridge)`) — the ONE remedy for
82
- /// [SourceSessionNotMounted] (a directive's `read(q, {from})` resolves in-engine from the mounted source).
80
+ /// Retain the SOURCE workspace on this peer so Replica Follow can make its
81
+ /// custody locally resident — the remedy for [SourceSessionNotMounted].
83
82
  static const mountSourceSession = 'mountSourceSession';
84
83
 
85
84
  /// Ask the designated recovery person to open this workspace once. Nomos completes the handoff privately.
@@ -131,7 +130,7 @@ class NomosRecommendedAction {
131
130
 
132
131
  /// All-device-loss recovery is a normal, resumable lifecycle state. The app may render the one concrete
133
132
  /// [recommendedAction]; the private recovery protocol stays inside Nomos.
134
- class OwnedRecoveryPending extends NomosBridgeError {
133
+ class OwnedRecoveryPending extends NomosRuntimeError {
135
134
  final String code;
136
135
  final String? workspace;
137
136
  final String stage;
@@ -181,7 +180,7 @@ class OwnedRecoveryPending extends NomosBridgeError {
181
180
  /// §5 connect-time compat check, or a dispatch-time refusal when a payload's baked hash names law the workspace
182
181
  /// no longer runs. When [structurallyCompatible] is true the operation can still proceed (structural subtyping);
183
182
  /// when false it names the [incompatibleMember] that broke. REMEDY: `recompileClient` or `redeployLaw`.
184
- class LawMismatchError extends NomosBridgeError {
183
+ class LawMismatchError extends NomosRuntimeError {
185
184
  /// The stable machine code, e.g. `nomos.law.mismatch`.
186
185
  final String code;
187
186
 
@@ -287,7 +286,7 @@ class LawMismatchError extends NomosBridgeError {
287
286
  /// `.requires(<relation>)` tuple is absent for the actor on [object].
288
287
  /// These fields ride the UNSEALED presentation lanes only (verdict / 422 body / bridge errorInfo) —
289
288
  /// never the sealed chain bytes.
290
- class AuthzRefusedError extends NomosBridgeError {
289
+ class AuthzRefusedError extends NomosRuntimeError {
291
290
  /// The stable machine code, e.g. `nomos.authz.signer_enrollment_missing`.
292
291
  final String code;
293
292
 
@@ -415,7 +414,7 @@ class ParentSignerEnrollmentMissing extends AuthzRefusedError {
415
414
  /// AUTH — the auth-provider token was missing/malformed/expired/rejected, or its issuer does not match the
416
415
  /// workspace's law-declared key (`nomos.auth.*`, e.g. `nomos.auth.issuer_mismatch`, `nomos.auth.token_invalid`,
417
416
  /// `nomos.auth.token_expired`). REMEDY is always `reauth`: acquire a fresh token and reconnect.
418
- class AuthError extends NomosBridgeError {
417
+ class AuthError extends NomosRuntimeError {
419
418
  /// The stable machine code, e.g. `nomos.auth.issuer_mismatch`.
420
419
  final String code;
421
420
 
@@ -471,7 +470,7 @@ class AuthError extends NomosBridgeError {
471
470
  /// (`nomos.load.*`, e.g. `nomos.load.wasm_fetch_failed`, `nomos.load.instantiate_failed`,
472
471
  /// `nomos.load.manifest_failed`). This is a transport/runtime fault, never a law refusal. REMEDY: `retry` for a
473
472
  /// transient fetch, `reopen` when the loaded runtime is unusable.
474
- class LoadError extends NomosBridgeError {
473
+ class LoadError extends NomosRuntimeError {
475
474
  /// The stable machine code, e.g. `nomos.load.wasm_fetch_failed`.
476
475
  final String code;
477
476
 
@@ -520,12 +519,13 @@ class LoadError extends NomosBridgeError {
520
519
 
521
520
  /// SOURCE SESSION NOT MOUNTED (`nomos.attested_read.source_not_mounted`) — a directive whose law declares a
522
521
  /// colocated foreign read (`read(query, {from: <sourceWs>})`) was offered while the SOURCE workspace was NOT
523
- /// mounted as a session on this device's engine plane. A colocated attested read resolves + signs IN-ENGINE
522
+ /// mounted as a session on this device's kernel host. A colocated attested read resolves + signs IN-ENGINE
524
523
  /// (zero HTTP) from the mounted source; when the source is absent the bridge refuses IMMEDIATELY (this error)
525
524
  /// instead of a doomed ~31s remote fetch that answers an unsigned projection. The remedy is
526
- /// [NomosRecommendedAction.mountSourceSession]: open [sourceWorkspace] as a session on the SAME bridge/realm
527
- /// (`bridge.connect(session: sourceWorkspace)` / `ref.acquire(bridge)`) BEFORE offering the directive.
528
- class SourceSessionNotMounted extends NomosBridgeError {
525
+ /// [NomosRecommendedAction.mountSourceSession]: ensure [sourceWorkspace] has a retained placement on this
526
+ /// peer and wait for Replica Follow to make it resident before offering the directive. Binding an interaction
527
+ /// session is deliberately insufficient.
528
+ class SourceSessionNotMounted extends NomosRuntimeError {
529
529
  /// The stable machine code — always `nomos.attested_read.source_not_mounted`.
530
530
  final String code;
531
531
 
@@ -582,7 +582,7 @@ class SourceSessionNotMounted extends NomosBridgeError {
582
582
  }
583
583
 
584
584
  /// The provider-selected OSGi resource does not satisfy the generated law's Contract Namespace requirements.
585
- class KernelCoherenceError extends NomosBridgeError {
585
+ class KernelCoherenceError extends NomosRuntimeError {
586
586
  /// The stable machine code — always `kernel-contract-incompatible`.
587
587
  final String code;
588
588
 
@@ -609,12 +609,12 @@ enum CustodySource { localSnapshot, cloudPack, unknown }
609
609
  /// missing history the operation needed (`nomos.custody.shallow_insufficient` /
610
610
  /// `nomos.custody.missing_object`), and the in-client gap-fill repair could not complete it.
611
611
  ///
612
- /// This replaces pattern-matching `shallow-insufficient` out of a stringly [NomosBridgeError]: the app
612
+ /// This replaces pattern-matching `shallow-insufficient` out of a stringly [NomosRuntimeError]: the app
613
613
  /// switches on [code] and decides from the structured fields whether to EVICT LOCAL CUSTODY
614
614
  /// ([recommendedAction] == `quarantineLocalSnapshotAndReclone` — quarantine the snapshot, `inspectSnapshot`
615
615
  /// / `recoverFrom`, reconnect fresh) or ESCALATE CLOUD CUSTODY (`refetchFullHistoryAndRetry` — the cloud
616
- /// must serve the full chain). Trace IDs ride [NomosBridgeError.info.trace] as on every bridge error.
617
- class CustodyError extends NomosBridgeError {
616
+ /// must serve the full chain). Trace IDs ride [NomosRuntimeError.info.trace] as on every bridge error.
617
+ class CustodyError extends NomosRuntimeError {
618
618
  /// The stable machine code, e.g. `nomos.custody.shallow_insufficient`.
619
619
  final String code;
620
620
 
@@ -701,7 +701,7 @@ class CustodyError extends NomosBridgeError {
701
701
  /// The auth-provider access token the cloud was given was missing, malformed, expired, or rejected — the
702
702
  /// cloud answered 401 / "invalid token" on a lane that requires a verified principal (every birth does).
703
703
  /// REMEDY: re-acquire a fresh token from the auth provider and reconnect.
704
- class AuthTokenInvalid extends NomosBridgeError {
704
+ class AuthTokenInvalid extends NomosRuntimeError {
705
705
  final String code = 'nomos.auth.token_invalid';
706
706
  final String recommendedAction = NomosRecommendedAction.reauth;
707
707
  AuthTokenInvalid([String? message])
@@ -714,7 +714,7 @@ class AuthTokenInvalid extends NomosBridgeError {
714
714
  /// The workspace name the cloud reported for the born home does NOT equal `homeNameOf(subject)`. The home's
715
715
  /// own law commits to `home-<sha256(subject)>` (the squat invariant), so a mismatch means the cloud routed to
716
716
  /// the wrong slot — a fail-closed safety stop, never silently mount the wrong holon.
717
- class HomeNameMismatch extends NomosBridgeError {
717
+ class HomeNameMismatch extends NomosRuntimeError {
718
718
  final String code = 'nomos.home.name_mismatch';
719
719
  final String recommendedAction = NomosRecommendedAction.reopen;
720
720
 
@@ -737,7 +737,7 @@ class HomeNameMismatch extends NomosBridgeError {
737
737
  /// workspace, not a home holon. Per req 2 there is NO generic fallback: a home that cannot be confirmed to
738
738
  /// run the home law FAILS here rather than silently mounting a lawless workspace. REMEDY: the tenant's
739
739
  /// governance must install the home law (the birth offer should author it; if it didn't, the deploy is wrong).
740
- class HomeLawMissing extends NomosBridgeError {
740
+ class HomeLawMissing extends NomosRuntimeError {
741
741
  final String code = 'nomos.home.law_missing';
742
742
  final String recommendedAction = NomosRecommendedAction.redeployLaw;
743
743
 
@@ -753,7 +753,7 @@ class HomeLawMissing extends NomosBridgeError {
753
753
  /// The offer to the home's birth lane was REFUSED by the parent's gate (the law denied the birth — e.g. the
754
754
  /// principal lacks creation authority, the pool is exhausted, or the genesis recipe was rejected). Carries
755
755
  /// the cloud's verdict verbatim. REMEDY is tenant-specific (grant creation authority / raise the pool).
756
- class BirthRejected extends NomosBridgeError {
756
+ class BirthRejected extends NomosRuntimeError {
757
757
  final String code = 'nomos.home.birth_refused';
758
758
  final String recommendedAction = NomosRecommendedAction.redeployLaw;
759
759
 
@@ -772,7 +772,7 @@ class BirthRejected extends NomosBridgeError {
772
772
  /// A pack the cloud returned (or the local holon produced) was malformed — it could not be parsed/applied as
773
773
  /// a git pack. This is a transport/custody integrity fault, not a law refusal. REMEDY: retry; if persistent,
774
774
  /// the custody bytes are corrupt.
775
- class PackMalformed extends NomosBridgeError {
775
+ class PackMalformed extends NomosRuntimeError {
776
776
  final String code = 'nomos.custody.pack_malformed';
777
777
  final String recommendedAction =
778
778
  NomosRecommendedAction.refetchFullHistoryAndRetry;
@@ -786,7 +786,7 @@ class PackMalformed extends NomosBridgeError {
786
786
  /// The home law's content hash could not be resolved — the cloud reported no current law for the home's
787
787
  /// domain key, so the app cannot confirm WHICH law the home runs (and thus cannot baked-hash-pin or judge
788
788
  /// installed-ness). REMEDY: the home law must be deployed; if it was, retry once the deploy has folded.
789
- class LawHashUnavailable extends NomosBridgeError {
789
+ class LawHashUnavailable extends NomosRuntimeError {
790
790
  final String code = 'nomos.home.law_hash_unavailable';
791
791
  final String recommendedAction = NomosRecommendedAction.redeployLaw;
792
792
 
@@ -804,7 +804,7 @@ class LawHashUnavailable extends NomosBridgeError {
804
804
  /// BEFORE any submit, so an actorless gated offer is impossible to GENERATE (never merely refused at the
805
805
  /// kernel gate). REMEDY: construct the generated client with an `actor` (the verified principal — under a
806
806
  /// home scope this is the subject; the bridge owns signing). Secrets NEVER appear here — only the identity.
807
- class MissingOfferAuthority extends NomosBridgeError {
807
+ class MissingOfferAuthority extends NomosRuntimeError {
808
808
  /// The domain of the gated directive.
809
809
  final String domain;
810
810
 
@@ -4,13 +4,15 @@
4
4
  //
5
5
  // These types live in the pure `nomos_types` core (no bridge, no lifecycle) so BOTH the layered TYPES
6
6
  // package (frontend-safe) AND the runtime `nomos_client` package resolve them; `nomos_client` re-exports
7
- // this barrel, and its `NomosBridge` implements [NomosForeignReader] over the device's multi-workspace plane.
7
+ // this barrel, and Dart Reception implements [NomosForeignReader] over the device's multi-workspace plane.
8
8
  library;
9
9
 
10
+ import 'dart:typed_data';
11
+
10
12
  import 'nomos_ref.dart';
11
13
 
12
14
  /// Reads a FOREIGN workspace on demand — the surface a [ForeignRef] resolves against. It is STRUCTURAL: any
13
- /// object with this shape works. `nomos_client`'s `NomosBridge` implements it over the device's local
15
+ /// object with this shape works. `nomos_client`'s Reception implements it over the device's local
14
16
  /// multi-workspace plane (`bridge.session(ws).queryById(id)`, mounting the workspace lazily); the TS twin is
15
17
  /// the `openRealm()` reader. A plain single-workspace holon is NOT one — pass the multi-workspace reader.
16
18
  abstract class NomosForeignReader {
@@ -18,17 +20,16 @@ abstract class NomosForeignReader {
18
20
  NomosForeignWorkspaceReader foreignWorkspace(String workspace);
19
21
  }
20
22
 
21
- /// One foreign workspace's by-id read surface. Returns the
22
- /// RAW projection rows (`[{type,id,data}, …]`) — the ForeignRef decodes the matching row's flat `data` map
23
- /// via the target `fromJson` it captured at construction (the same shape [NomosReads.decodeRows] consumes).
23
+ /// One foreign workspace's by-id read surface. It returns the kernel's canonical
24
+ /// nominal USDA image; only code generated from the target domain may decode it.
24
25
  abstract class NomosForeignWorkspaceReader {
25
- /// The projection rows for kernel aggregate [id] (a by-id read). Each row is a `{type, id, data}` map, its
26
- /// `data` the flat already-decoded field map. An EMPTY list ⇒ the target has not been folded / is absent.
27
- Future<List<Map<String, dynamic>>> queryById(String id);
26
+ /// Canonical USDA result bytes for one nominal aggregate kind and identity.
27
+ /// Only the generated target codec may interpret the application value.
28
+ Future<Uint8List> queryById(String aggregateType, String id);
28
29
 
29
30
  /// OPTIONAL reactive by-id read — the target's rows re-emitted on each projection tick. `null` when this
30
31
  /// reader offers no watch lane (then the internal watcher calls back once with `null` and no-ops).
31
- Stream<List<Map<String, dynamic>>>? watchById(String id) => null;
32
+ Stream<Uint8List>? watchById(String aggregateType, String id) => null;
32
33
  }
33
34
 
34
35
  /// The outcome of an internal foreign-reference resolution, with the reason named — a foreign read can come back empty
@@ -61,11 +62,29 @@ class ForeignUnreachable<T> extends ForeignResolveResult<T> {
61
62
  const ForeignUnreachable(this.error);
62
63
  }
63
64
 
65
+ enum ForeignReadFailureKind { denied, unreachable }
66
+
67
+ /// A failed read is not an absent business record. Keep only address and
68
+ /// classification metadata here; never retain/print transport or auth payloads.
69
+ final class ForeignReadFailure implements Exception {
70
+ final ForeignReadFailureKind kind;
71
+ final String workspace;
72
+ final String type;
73
+ final String id;
74
+ final String sourceErrorType;
75
+ const ForeignReadFailure(
76
+ this.kind, this.workspace, this.type, this.id, this.sourceErrorType);
77
+
78
+ @override
79
+ String toString() => 'ForeignReadFailure(${kind.name}: $workspace/$type/$id; '
80
+ 'source=$sourceErrorType)';
81
+ }
82
+
64
83
  /// A typed, inspectable cross-application business reference. Tenant code can retain, serialize and pass
65
84
  /// it back to generated application methods; navigation, decoding and attestation remain framework state.
66
85
  final class ForeignRef<T> {
67
86
  final NomosRef<T> _ref;
68
- final T Function(Map<String, dynamic> data, [String id]) _decode;
87
+ final T? Function(Uint8List bytes, String workspace, String id)? _decode;
69
88
 
70
89
  const ForeignRef._(this._ref, this._decode);
71
90
 
@@ -92,31 +111,23 @@ abstract final class NmsInternalForeignRefs {
92
111
  required String id,
93
112
  required String workspace,
94
113
  required String type,
95
- required T Function(Map<String, dynamic> data, [String id]) fromJson,
114
+ T? Function(Uint8List bytes, String workspace, String id)? fromUsda,
96
115
  }) =>
97
116
  ForeignRef<T>._(
98
117
  NmsInternalNomosRefs.create<T>(
99
118
  workspace: workspace, type: type, id: id),
100
- fromJson,
119
+ fromUsda,
101
120
  );
102
121
 
103
- static T? _decodeRows<T>(
104
- ForeignRef<T> reference, List<Map<String, dynamic>> rows) {
105
- if (rows.isEmpty) return null;
106
- final id = NmsInternalNomosRefs.id(reference._ref);
107
- Map<String, dynamic>? match;
108
- for (final r in rows) {
109
- if (r['id'] == id) {
110
- match = r;
111
- break;
112
- }
122
+ static T? _decodeResult<T>(ForeignRef<T> reference, Uint8List bytes) {
123
+ final decoder = reference._decode;
124
+ if (decoder == null) {
125
+ throw StateError(
126
+ 'This ForeignRef was decoded by a retired projection-map path; '
127
+ 'regenerate its application client to install the nominal USDA codec.',
128
+ );
113
129
  }
114
- match ??= rows.first;
115
- final data = match['data'];
116
- if (data is! Map<String, dynamic>) return null;
117
- final rawId = match['id'];
118
- final rowId = rawId is String ? rawId : (rawId?.toString() ?? id);
119
- return reference._decode(data, rowId);
130
+ return decoder(bytes, reference.workspace, reference.id);
120
131
  }
121
132
 
122
133
  static Future<ForeignResolveResult<T>> resolveResult<T>(
@@ -125,8 +136,11 @@ abstract final class NmsInternalForeignRefs {
125
136
  final workspace = NmsInternalNomosRefs.workspace(reference._ref);
126
137
  if (id.isEmpty || workspace.isEmpty) return ForeignNotFound<T>();
127
138
  try {
128
- final rows = await nomos.foreignWorkspace(workspace).queryById(id);
129
- final row = _decodeRows(reference, rows);
139
+ final bytes = await nomos.foreignWorkspace(workspace).queryById(
140
+ reference.type,
141
+ id,
142
+ );
143
+ final row = _decodeResult(reference, bytes);
130
144
  return row != null ? ForeignFound<T>(row) : ForeignNotFound<T>();
131
145
  } catch (error) {
132
146
  final m = error.toString().toLowerCase();
@@ -140,7 +154,19 @@ abstract final class NmsInternalForeignRefs {
140
154
  static Future<T?> resolve<T>(
141
155
  ForeignRef<T> reference, NomosForeignReader nomos) async {
142
156
  final r = await resolveResult(reference, nomos);
143
- return r is ForeignFound<T> ? r.row : null;
157
+ if (r is ForeignFound<T>) return r.row;
158
+ if (r is ForeignNotFound<T>) return null;
159
+ final error =
160
+ r is ForeignDenied<T> ? r.error : (r as ForeignUnreachable<T>).error;
161
+ throw ForeignReadFailure(
162
+ r is ForeignDenied<T>
163
+ ? ForeignReadFailureKind.denied
164
+ : ForeignReadFailureKind.unreachable,
165
+ reference.workspace,
166
+ reference.type,
167
+ reference.id,
168
+ error.runtimeType.toString(),
169
+ );
144
170
  }
145
171
 
146
172
  static void Function() watch<T>(ForeignRef<T> reference,
@@ -151,13 +177,16 @@ abstract final class NmsInternalForeignRefs {
151
177
  cb(null);
152
178
  return () {};
153
179
  }
154
- final stream = nomos.foreignWorkspace(workspace).watchById(id);
180
+ final stream = nomos.foreignWorkspace(workspace).watchById(
181
+ reference.type,
182
+ id,
183
+ );
155
184
  if (stream == null) {
156
185
  cb(null);
157
186
  return () {};
158
187
  }
159
188
  final sub = stream.listen(
160
- (rows) => cb(_decodeRows(reference, rows)),
189
+ (bytes) => cb(_decodeResult(reference, bytes)),
161
190
  onError: (Object _) => cb(null),
162
191
  );
163
192
  return sub.cancel;