@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,386 +0,0 @@
1
- // THE LOCAL-RUNTIME GAUNTLET — one sequential journey through the internal test harness and runtime
2
- // lifecycle beneath the generated application. Tenant DX is compiled and exercised separately by
3
- // dsl/src/dart_packages.test.ts through the generated application/scenario barrels; this file must not
4
- // pretend that framework-conformance setup is tenant API. Every lifecycle bug co2 found (session watch delegation,
5
- // local autoSync deadlock, the keyed-reconnect lane, …) has a leg here, so the NEXT one is found
6
- // by CI, not by a tenant.
7
- //
8
- // Structure: ONE test, numbered legs, fail-fast — a failure names its leg, so CI output reads as
9
- // a checklist. Its first act drives the compiled CO2 law through the internal runtime lane solely to
10
- // establish the child workspace used by the remaining runtime checks.
11
- //
12
- // Prereqs (fixtures compiled + a warm ~/.holon/runtime): locally the test SKIPS with the recipe
13
- // when they are missing; in CI the job sets NOMOS_GAUNTLET_REQUIRED=1 so a missing prereq is a
14
- // LOUD FAILURE, never a silently-green skip.
15
- @TestOn('vm')
16
- library;
17
-
18
- import 'dart:io';
19
-
20
- import 'package:nomos_client/src/nms_conformance_runtime.dart';
21
- import 'package:nomos_types/src/nomos_ref.dart' show NmsInternalNomosRefs;
22
- import 'package:test/test.dart';
23
-
24
- String get _root => '${Directory.current.path}/../..';
25
- String get _repoEntry => '$_root/cloud/web-client/runner/node-entry.ts';
26
- String get _homeDeploy => '$_root/examples/co2-birth/build/co2.law.usdz';
27
- String get _docsDeploy =>
28
- '$_root/bench/scale/fixtures/surfaced/build/surfaced.law.usdz';
29
- String get _catDeploy =>
30
- '$_root/bench/scale/fixtures/catalogue-src/build/cat.law.usdz';
31
- String get _readerDeploy =>
32
- '$_root/bench/scale/fixtures/catalogue-reader/build/estate.law.usdz';
33
- String get _runtimeDir =>
34
- Platform.environment['NOMOS_DART_RUNTIME'] ??
35
- Platform.environment['NOMOS_OFFLINE_RUNTIME'] ??
36
- '${Platform.environment['HOME'] ?? ''}/.holon/runtime';
37
-
38
- const _owner = 'user:gauntlet-owner';
39
- const _keyed = 'catalogue';
40
-
41
- /// Phantom test-only aggregate type for the internal runtime locator below. Tenant code gets the real
42
- /// generated `NomosRef<Estate>` from its application package.
43
- final class _GauntletEstate {}
44
-
45
- String? _missingPrereq() {
46
- if (!File(_repoEntry).existsSync())
47
- return 'in-repo runner not found at $_repoEntry';
48
- final fixtures = {
49
- _homeDeploy: 'examples/co2-birth',
50
- _docsDeploy: 'bench/scale/fixtures/surfaced',
51
- _catDeploy: 'bench/scale/fixtures/catalogue-src',
52
- _readerDeploy: 'bench/scale/fixtures/catalogue-reader',
53
- };
54
- for (final e in fixtures.entries) {
55
- if (!File(e.key).existsSync()) {
56
- return 'missing fixture ${e.key} — compile it: (cd ${e.value} && node ../../../../dsl/compile_package.mjs)';
57
- }
58
- }
59
- if (!File('$_runtimeDir/holon-testmint.wasm').existsSync() ||
60
- !File('$_runtimeDir/bootstrap.law.usdz').existsSync() ||
61
- !File('$_runtimeDir/nomos.law.usdz').existsSync()) {
62
- return 'warm ~/.holon/runtime first (run any `githolon` command once, or fetch '
63
- '/v1/runtime/holon-testmint.wasm + /v1/runtime/packages from the cloud)';
64
- }
65
- return null;
66
- }
67
-
68
- /// Run one numbered leg fail-fast: log enter/exit so CI output reads as a checklist, and wrap any
69
- /// failure so the failing LEG is named at the top of the report.
70
- Future<T> _leg<T>(String name, Future<T> Function() body) async {
71
- final sw = Stopwatch()..start();
72
- // ignore: avoid_print
73
- print('▶ GAUNTLET $name …');
74
- try {
75
- final r = await body();
76
- // ignore: avoid_print
77
- print('✔ GAUNTLET $name (${sw.elapsedMilliseconds}ms)');
78
- return r;
79
- } catch (e, st) {
80
- throw TestFailure(
81
- 'GAUNTLET $name FAILED after ${sw.elapsedMilliseconds}ms:\n$e\n$st');
82
- }
83
- }
84
-
85
- void main() {
86
- test(
87
- 'THE LOCAL-RUNTIME GAUNTLET: harness → law setup → local posture → '
88
- 'acquire → reactive reads → attested read → diagnostics → disposal',
89
- () async {
90
- final required = Platform.environment['NOMOS_GAUNTLET_REQUIRED'] == '1';
91
- final missing = _missingPrereq();
92
- if (missing != null) {
93
- if (required) {
94
- fail(
95
- 'NOMOS_GAUNTLET_REQUIRED=1 but a prereq is missing — the CI job must provide it: '
96
- '$missing');
97
- }
98
- markTestSkipped(missing);
99
- return;
100
- }
101
-
102
- final diagnostics = <String>[];
103
-
104
- // ── LEG 1: harness up — a 4-workspace cluster, one deviceKeyed, phase diagnostics on. ──
105
- final harness = await _leg(
106
- 'leg 1: NomosTestHarness.cluster (4 ws, one deviceKeyed)', () async {
107
- final h = await NomosTestHarness.cluster(
108
- workspaces: {
109
- 'home': [_homeDeploy],
110
- 'docs-ws': [_docsDeploy],
111
- _keyed: [_catDeploy],
112
- 'reader': [_readerDeploy],
113
- },
114
- deviceKeyed: {_keyed},
115
- nodeEntry: _repoEntry,
116
- runtimeDir: _runtimeDir,
117
- onDiagnostic: diagnostics.add,
118
- phaseTimeout: const Duration(seconds: 120),
119
- );
120
- // Phase diagnostics (the "no silent hangs" promise): install, ready, connect, and the
121
- // keyed 3b legs all log enter AND exit lines.
122
- expect(diagnostics.any((l) => l.contains('offline law install')), isTrue,
123
- reason: 'phase 1 install diagnostics must appear');
124
- expect(diagnostics.any((l) => l.startsWith('[offline-install]')), isTrue,
125
- reason:
126
- 'an in-repo runner must install through its adjacent in-repo helper, never silently fall back to the published CLI');
127
- expect(
128
- diagnostics
129
- .any((l) => l.contains('runner ready') && l.contains('done')),
130
- isTrue,
131
- reason: 'the runner-ready phase must log its exit');
132
- expect(diagnostics.any((l) => l.contains('3b: device keygen')), isTrue,
133
- reason: 'the deviceKeyed keygen phase must log');
134
- expect(
135
- diagnostics.any((l) =>
136
- l.contains("3b: keyed reconnect of '$_keyed'") &&
137
- l.contains('done')),
138
- isTrue,
139
- reason:
140
- 'the keyed reconnect phase must log its exit (the reported wedge)');
141
- expect(h.sessions.toSet(), {'home', 'docs-ws', _keyed, 'reader'});
142
- return h;
143
- });
144
-
145
- try {
146
- // ── LEG 2: internal conformance setup — establish Estate → Site → Asset directly against the
147
- // compiled law. The generated, business-only surface has its own compile-and-run proof. ──
148
- final home = harness.session('home');
149
- final bornEstate = await _leg(
150
- 'leg 2: internal CO2 law setup (Estate → Site → Asset)', () async {
151
- // This is an internal framework-conformance setup, so declare its parent allowance explicitly
152
- // through the same offer a compiled application ceremony uses. There is deliberately no harness
153
- // or kernel fallback for a birth-capable workspace with missing policy.
154
- final bornAt = DateTime.now().toUtc().toIso8601String();
155
- await home.offerOutcome(
156
- domain: 'co2',
157
- directiveId: 'seedBirthPolicy',
158
- payload: {
159
- 'maxBirthsPerPrincipal': 1,
160
- 'setBy': _owner,
161
- 'setAt': bornAt,
162
- },
163
- actor: _owner,
164
- authorSecret: harness.deviceSecret(home.workspace),
165
- );
166
- final birth = await home.offerOutcome(
167
- domain: 'co2',
168
- directiveId: 'nomosBirthEstate',
169
- payload: {
170
- 'reference': 'E-001',
171
- 'name': 'Foundry',
172
- 'country': 'GB',
173
- 'baselineTonnesCo2e': 4200,
174
- 'principal': _owner,
175
- 'bornAt': bornAt,
176
- },
177
- actor: _owner,
178
- );
179
- expect(birth.born, hasLength(1));
180
- final ref = NmsInternalNomosRefs.create<_GauntletEstate>(
181
- workspace: birth.born.single,
182
- type: 'Estate',
183
- id: 'estate:self',
184
- );
185
- expect(NmsInternalNomosRefs.workspace(ref), startsWith('estate-'));
186
- expect(NmsInternalNomosRefs.type(ref), 'Estate');
187
-
188
- final estateSession = await harness.bridge.follow(
189
- ref,
190
- authorSecret: harness.deviceSecret(home.workspace),
191
- );
192
- expect(estateSession.workspace, NmsInternalNomosRefs.workspace(ref));
193
-
194
- final rows =
195
- await estateSession.queryById(NmsInternalNomosRefs.id(ref));
196
- expect(rows, hasLength(1), reason: 'the born business root reads back');
197
- final estateData = (rows.single['data'] as Map).cast<String, Object?>();
198
- expect(estateData['reference'], 'E-001');
199
- expect(estateData['name'], 'Foundry');
200
-
201
- final siteOutcome = await estateSession.offerOutcome(
202
- domain: 'co2',
203
- directiveId: 'addSite',
204
- payload: {'name': 'Trafford Depot'},
205
- actor: _owner,
206
- );
207
- final site = siteOutcome.created.single;
208
- expect(site.type, 'co2.Site');
209
- // An estate is the workspace boundary, so its Site records need no copied
210
- // estateId foreign key. This framework test uses the primitive type read;
211
- // tenant code gets estate.sites from the generated application.
212
- final sites = await estateSession
213
- .query('aggregatesByType', {'__type': 'co2.Site'});
214
- expect(sites, hasLength(1));
215
- final siteData = (sites.single['data'] as Map).cast<String, Object?>();
216
- expect(siteData['name'], 'Trafford Depot');
217
-
218
- final assetOutcome = await estateSession.offerOutcome(
219
- domain: 'co2',
220
- directiveId: 'commissionAsset',
221
- payload: {
222
- 'siteId': site.id,
223
- 'name': 'Main electricity meter',
224
- 'rfidQrIdentity': 'E20034120123456789012345',
225
- },
226
- actor: _owner,
227
- );
228
- final asset = assetOutcome.created.single;
229
- expect(asset.type, 'co2.Asset');
230
- final assets =
231
- await estateSession.query('assetsBySite', {'siteId': site.id});
232
- expect(assets, hasLength(1));
233
- final assetData =
234
- (assets.single['data'] as Map).cast<String, Object?>();
235
- expect(assetData['name'], 'Main electricity meter');
236
- expect(assetData['operationalStatus'], 'commissioned');
237
- return (session: estateSession, ref: ref);
238
- });
239
- final estate = bornEstate.session;
240
-
241
- // ── LEG 3: local posture — autoSync on a local-only session returns promptly and never
242
- // monopolizes the plane; zero network fetch attempts (asserted again at the end). ──
243
- await _leg(
244
- 'leg 3: local-only autoSync completes promptly, plane stays responsive',
245
- () async {
246
- await home.autoSync().timeout(const Duration(seconds: 10),
247
- onTimeout: () => throw StateError(
248
- 'autoSync() on a local-only session did not return within 10s (the deadlock class)'));
249
- // The plane is NOT blocked: a sibling session still answers.
250
- final listed = await harness.bridge.listWorkspaces().timeout(
251
- const Duration(seconds: 10),
252
- onTimeout: () => throw StateError(
253
- 'listWorkspaces() hung after a local-only autoSync'));
254
- expect(listed.map((workspace) => workspace.session).toSet(),
255
- containsAll({'home', 'docs-ws', _keyed, 'reader'}));
256
- await home.stopAutoSync().timeout(const Duration(seconds: 10),
257
- onTimeout: () => throw StateError(
258
- 'stopAutoSync() hung on a local-only session'));
259
- });
260
-
261
- // ── LEG 4: acquireSession — concurrent double-acquire single-flights to ONE handle; the
262
- // credentials callback is NEVER invoked for a plane-known workspace. ──
263
- await _leg(
264
- 'leg 4: acquireSession (concurrent, credential-free for a known workspace)',
265
- () async {
266
- final acquired = await Future.wait([
267
- harness.bridge.acquireSession('reader',
268
- ifAbsentCredentials: () async => fail(
269
- 'reader is on the plane — credentials must not be requested')),
270
- harness.bridge.acquireSession('reader',
271
- ifAbsentCredentials: () async => fail(
272
- 'reader is on the plane — credentials must not be requested')),
273
- ]);
274
- expect(identical(acquired[0], acquired[1]), isTrue,
275
- reason: 'a concurrent double-acquire yields ONE handle');
276
- expect(identical(acquired[0], harness.session('reader')), isTrue,
277
- reason: 'the acquired handle IS the mounted session');
278
- });
279
-
280
- // ── LEG 5: reactive reads on a SESSION — watchById / watch / watchPendingConflicts must
281
- // all deliver a FIRST SNAPSHOT (the 0.48.x dead-delegation class). ──
282
- await _leg('leg 5: session reactive reads emit their first snapshot',
283
- () async {
284
- final raw =
285
- await estate.queryById(NmsInternalNomosRefs.id(bornEstate.ref));
286
- final aggId = ((raw.single as Map)['id'] ?? '').toString();
287
- expect(aggId, isNotEmpty);
288
- final byId = await estate.watchById(aggId).first.timeout(
289
- const Duration(seconds: 30),
290
- onTimeout: () =>
291
- throw StateError('watchById never emitted its first snapshot'));
292
- expect(byId, hasLength(1));
293
- final byQuery = await estate
294
- .watch('estatesByReference', {'reference': 'E-001'})
295
- .first
296
- .timeout(const Duration(seconds: 30),
297
- onTimeout: () => throw StateError(
298
- 'watch(query) never emitted its first snapshot'));
299
- expect(byQuery, hasLength(1));
300
- // The docs-ws session carries the Surfaced law — its pending-conflicts stream must emit a
301
- // first snapshot (empty is correct; EMITTING at all is the regression under test).
302
- final conflicts = await harness
303
- .session('docs-ws')
304
- .watchPendingConflicts()
305
- .first
306
- .timeout(const Duration(seconds: 30),
307
- onTimeout: () => throw StateError(
308
- 'watchPendingConflicts never emitted (the session-delegation regression)'));
309
- expect(conflicts, isEmpty);
310
- });
311
-
312
- // ── LEG 6: the keyed lane end-to-end — the re-opened workspace remains writable/readable.
313
- // Cross-workspace premises are exercised through ordinary offers in the kernel acceptance suite.
314
- await _leg('leg 6: ordinary read/write on the deviceKeyed workspace',
315
- () async {
316
- final public = harness.devicePublicKey(_keyed);
317
- expect(public, isNotNull);
318
- expect(public, isNotEmpty,
319
- reason: 'the 3b keygen public half rides the harness');
320
- final cat = harness.session(_keyed);
321
- final seeded = await cat.offerCreates(
322
- domain: 'cat',
323
- directiveId: 'listCatalogue',
324
- payload: {
325
- 'listingId': 'L-1',
326
- 'title': 'Walnut desk',
327
- 'priceGbp': '900',
328
- 'listedAt': DateTime.now().toUtc().toIso8601String(),
329
- },
330
- actor: 'user:seller',
331
- );
332
- expect(seeded.head, isNotEmpty);
333
- final rows = await cat.query('listingById', {'listingId': 'L-1'});
334
- expect(rows, hasLength(1));
335
- });
336
-
337
- // ── LEG 7: harness diagnostics — assertDomainInstalled, resetWorkspaceCustody, and a
338
- // mid-test seedWorkspaceFromLawUsdz round-trip. ──
339
- await _leg(
340
- 'leg 7: harness diagnostics (assertDomainInstalled / reset / seed)',
341
- () async {
342
- await harness.assertDomainInstalled(
343
- workspace: estate.workspace, domain: 'co2');
344
- // The negative arm names the active domains.
345
- await expectLater(
346
- harness.assertDomainInstalled(
347
- workspace: 'docs-ws', domain: 'definitely-not-here'),
348
- throwsA(isA<NomosTestHarnessException>()));
349
- // Reset a workspace's local custody to its seed snapshot, then prove it still serves.
350
- await harness.resetWorkspaceCustody('docs-ws');
351
- final postReset = await harness
352
- .session('docs-ws')
353
- .watchPendingConflicts()
354
- .first
355
- .timeout(const Duration(seconds: 30),
356
- onTimeout: () => throw StateError(
357
- 'the reset docs-ws session never served a read'));
358
- expect(postReset, isEmpty,
359
- reason: 'the reset workspace is back at its seed');
360
- // Seed a brand-new workspace mid-test from a deploy.json and use it immediately.
361
- final late = await harness.seedWorkspaceFromLawUsdz(
362
- workspace: 'late-ws', lawUsdzPaths: [_docsDeploy]);
363
- expect(late.workspace, 'late-ws');
364
- await harness.assertDomainInstalled(
365
- workspace: 'late-ws', domain: 'docs');
366
- });
367
-
368
- // Local posture postscript (leg 3's zero-network promise, checked over the WHOLE run): no
369
- // session on this plane ever attempted a network fetch.
370
- final offending = diagnostics
371
- .where((l) =>
372
- l.contains('intent-offers') ||
373
- l.contains('refusing network fetch'))
374
- .toList();
375
- expect(offending, isEmpty,
376
- reason:
377
- 'local-only sessions must perform NO network work — saw:\n${offending.join('\n')}');
378
- } finally {
379
- // ── LEG 8: clean disposal within the deadline (a hung teardown is a failure, not a wedge). ──
380
- await _leg('leg 8: harness disposal within the deadline', () async {
381
- await harness.dispose().timeout(const Duration(seconds: 30),
382
- onTimeout: () => throw StateError('harness disposal hung'));
383
- });
384
- }
385
- }, timeout: const Timeout(Duration(minutes: 8)));
386
- }
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- // A FAKE offline-install helper for the hermetic HARNESS PHASE-TIMEOUT tests: honours the real helper's
3
- // flag + one-line-JSON contract (--law/--workspace/--out) but installs nothing — it just writes a tiny
4
- // dummy snapshot so the harness proceeds to the runner phases.
5
- import { writeFileSync } from "node:fs";
6
- const args = process.argv.slice(2);
7
- const val = (f) => { const i = args.indexOf(f); return i >= 0 ? args[i + 1] : undefined; };
8
- const out = val("--out");
9
- const workspace = val("--workspace");
10
- writeFileSync(out, Buffer.from("fake-snapshot"));
11
- process.stdout.write(JSON.stringify({ ok: true, snapshot: out, workspace, lawHashes: ["deadbeef"], frameworkHash: "cafebabe" }) + "\n");