@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.
- package/assets/operation-contract.wasm +0 -0
- package/check_package.mjs +12 -15
- package/compile_package.mjs +17 -18
- package/compile_proof.mjs +16 -1
- package/dart/CHANGELOG.md +80 -1
- package/dart/README.md +25 -2
- package/dart/lib/src/admission_decision.dart +41 -0
- package/dart/lib/src/application_framework_calls.dart +52 -2
- package/dart/lib/src/application_model_adoption.dart +187 -0
- package/dart/lib/src/application_status.dart +73 -0
- package/dart/lib/src/console_enrolment.dart +271 -0
- package/dart/lib/src/console_http_io.dart +26 -0
- package/dart/lib/src/console_http_stub.dart +7 -0
- package/dart/lib/src/dev_cloud.dart +69 -22
- package/dart/lib/src/generated_call.dart +83 -23
- package/dart/lib/src/kernel_primitives.dart +119 -0
- package/dart/lib/src/nms_conformance_runtime.dart +1 -1
- package/dart/lib/src/nms_generated_runtime.dart +32 -10
- package/dart/lib/src/nms_test_environment.dart +1 -1
- package/dart/lib/src/node_runner_transport.dart +41 -46
- package/dart/lib/src/observed_session_directory.dart +70 -0
- package/dart/lib/src/operation_receipts.dart +112 -0
- package/dart/lib/src/peer_application_streams.dart +103 -0
- package/dart/lib/src/reception/dart_reception.dart +4280 -0
- package/dart/lib/src/reception/event_desk.dart +214 -0
- package/dart/lib/src/reception/extremum_read.dart +46 -0
- package/dart/lib/src/reception/local_copies.dart +371 -0
- package/dart/lib/src/reception/peer_office_connection.dart +11 -0
- package/dart/lib/src/reception/progress_desk.dart +268 -0
- package/dart/lib/src/reception/reception_contract.dart +11 -0
- package/dart/lib/src/reception/reception_session.dart +284 -0
- package/dart/lib/src/reception/sync_diagnostics.dart +26 -0
- package/dart/lib/src/reception/workspace_preparation_report.dart +126 -0
- package/dart/lib/src/replica_readiness.dart +123 -0
- package/dart/lib/src/runner/node-entry.mjs +23950 -15776
- package/dart/lib/src/runtime_v2_gateway.dart +56 -3
- package/dart/lib/src/runtime_v2_transport.dart +544 -3
- package/dart/lib/src/session_bound.dart +200 -311
- package/dart/lib/src/signing_identity_kernel.dart +84 -0
- package/dart/lib/src/sync_status_projection.dart +550 -0
- package/dart/lib/src/sync_status_reducer.dart +170 -0
- package/dart/lib/src/test_harness.dart +809 -1153
- package/dart/lib/src/testing/test_custody.dart +66 -0
- package/dart/lib/src/testing/test_peer.dart +328 -0
- package/dart/lib/src/typed_watch_registry.dart +169 -0
- package/dart/lib/src/workspace_open_progress.dart +27 -0
- package/dart/pubspec.lock +24 -1
- package/dart/pubspec.yaml +7 -2
- package/dart/pubspec_overrides.yaml +2 -0
- package/dart/test/admission_decision_test.dart +48 -0
- package/dart/test/background_model_adoption_test.dart +228 -0
- package/dart/test/bundle_version_pairing_test.dart +4 -4
- package/dart/test/child_authentication_repair_test.dart +359 -0
- package/dart/test/cloud_bound_local_shell_test.dart +119 -0
- package/dart/test/console_enrolment_refusal_test.dart +52 -0
- package/dart/test/console_enrolment_test.dart +227 -0
- package/dart/test/errors_test.dart +5 -5
- package/dart/test/event_plane_seam_test.dart +50 -164
- package/dart/test/extremum_read_test.dart +58 -0
- package/dart/test/fixtures/wedge/wedge-entry.mjs +3 -21
- package/dart/test/generated_query_test.dart +32 -0
- package/dart/test/harness_phase_timeout_test.dart +18 -23
- package/dart/test/kernel_author_after_read_test.dart +242 -0
- package/dart/test/kernel_fence_test.dart +137 -0
- package/dart/test/local_copies_test.dart +222 -0
- package/dart/test/model_adoption_test.dart +198 -0
- package/dart/test/node_peer_local_custody_test.dart +153 -0
- package/dart/test/offer_authentication_proof_test.dart +352 -52
- package/dart/test/operation_compatibility_test.dart +151 -0
- package/dart/test/platform_credential_effect_test.dart +386 -0
- package/dart/test/receiving_group_open_test.dart +213 -0
- package/dart/test/reception/workspace_preparation_report_test.dart +103 -0
- package/dart/test/reception_event_desk_close_test.dart +16 -0
- package/dart/test/reception_span_trace_test.dart +23 -0
- package/dart/test/replica_readiness_test.dart +156 -0
- package/dart/test/runtime_projections_test.dart +92 -0
- package/dart/test/runtime_v2_gateway_test.dart +131 -0
- package/dart/test/signing_identity_kernel_test.dart +75 -0
- package/dart/test/sync_status_preparation_report_test.dart +29 -0
- package/dart/test/sync_status_reducer_test.dart +419 -0
- package/dart/test/test_harness_test.dart +71 -95
- package/dart/test/typed_query_watch_test.dart +170 -0
- package/dart/test/typed_watch_registry_test.dart +249 -0
- package/dart_lints/README.md +18 -0
- package/dart_lints/lib/nomos_lints.dart +70 -0
- package/dart_lints/pubspec.lock +580 -0
- package/dart_lints/pubspec.yaml +12 -0
- package/dart_lints/test/reference_identity_test.dart +75 -0
- package/dart_types/CHANGELOG.md +18 -0
- package/dart_types/lib/nomos_kernel_protocol.dart +21 -1
- package/dart_types/lib/nomos_types.dart +9 -1
- package/dart_types/lib/src/admission_decision.dart +37 -0
- package/dart_types/lib/src/aggregate_meta.dart +1 -1
- package/dart_types/lib/src/approved_model.dart +65 -0
- package/dart_types/lib/src/custody.dart +10 -18
- package/dart_types/lib/src/error_info.dart +4 -4
- package/dart_types/lib/src/errors.dart +29 -29
- package/dart_types/lib/src/foreign_ref.dart +62 -33
- package/dart_types/lib/src/local_work_rejected.dart +3 -3
- package/dart_types/lib/src/nomos_ref.dart +3 -1
- package/dart_types/lib/src/principal.dart +2 -2
- package/dart_types/lib/src/proto/google/protobuf/any.pb.dart +163 -0
- package/dart_types/lib/src/proto/google/protobuf/any.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pb.dart +137 -0
- package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pb.dart +20721 -10433
- package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pbenum.dart +555 -27
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pb.dart +387 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pbenum.dart +46 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart +295 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pbenum.dart +139 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pb.dart +269 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pbenum.dart +103 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pb.dart +417 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pbenum.dart +62 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pb.dart +9968 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pbenum.dart +133 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pb.dart +204 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pbenum.dart +54 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pb.dart +1550 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pb.dart +710 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pb.dart +845 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pb.dart +198 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pb.dart +369 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pb.dart +609 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pbenum.dart +65 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart +358 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pbenum.dart +100 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pb.dart +2231 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pbenum.dart +271 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pb.dart +1286 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart +636 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pbenum.dart +116 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pb.dart +1637 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pbenum.dart +175 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pb.dart +1269 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pbenum.dart +129 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pb.dart +2782 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pbenum.dart +97 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +2232 -8627
- package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pbenum.dart +0 -358
- package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pb.dart +1639 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pbenum.dart +46 -0
- package/dart_types/lib/src/runtime_outcome.dart +133 -0
- package/dart_types/lib/src/subscriptions.dart +116 -23
- package/dart_types/pubspec.yaml +1 -1
- package/dart_types/test/extremum_subscriptions_test.dart +40 -0
- package/dart_types/test/foreign_ref_resolution_test.dart +75 -0
- package/dart_types/test/nomos_ref_address_test.dart +25 -0
- package/dart_types/test/ordered_subscriptions_test.dart +34 -0
- package/operation_contract_check.mjs +24 -0
- package/package.json +11 -6
- package/src/aggregate.ts +70 -10
- package/src/application_topology.ts +18 -11
- package/src/attested.ts +3 -0
- package/src/attested_core.ts +46 -3
- package/src/birth_meter_ensure.ts +19 -7
- package/src/births.ts +29 -4
- package/src/build_package.ts +140 -13
- package/src/business_birth.ts +181 -4
- package/src/codegen_call_proto.ts +1276 -0
- package/src/codegen_call_usda.ts +49 -6
- package/src/codegen_dart.ts +83 -44
- package/src/codegen_dart_client.ts +458 -800
- package/src/{codegen_dart_application.ts → codegen_dart_facade.ts} +331 -582
- package/src/codegen_dart_framework_calls.ts +320 -37
- package/src/codegen_dart_indexed_variant.ts +159 -0
- package/src/codegen_dart_scenario.ts +42 -13
- package/src/codegen_proof.ts +3 -3
- package/src/codegen_provider_dart.ts +5 -0
- package/src/codegen_query_proto.ts +158 -0
- package/src/codegen_refusal.ts +189 -0
- package/src/codegen_result_proto.ts +931 -0
- package/src/codegen_result_usda.ts +4 -0
- package/src/codegen_ts.ts +464 -616
- package/src/codegen_workspace_access.ts +105 -0
- package/src/compatibility_graph.ts +759 -0
- package/src/compatibility_usda.ts +264 -0
- package/src/compile_package_main.ts +2017 -1195
- package/src/custody_placement.ts +156 -0
- package/src/custody_placement_usda.ts +91 -0
- package/src/decl_shapes.ts +21 -2
- package/src/describe_model.ts +1 -0
- package/src/directive.ts +59 -2
- package/src/drivers.ts +51 -0
- package/src/engine_entry.ts +52 -8
- package/src/evolve_preview.ts +11 -4
- package/src/exists.ts +2 -0
- package/src/fields.ts +75 -11
- package/src/flow_gate.ts +2 -1
- package/src/framework/application_home.ts +170 -18
- package/src/framework/attested_receipts.ts +8 -3
- package/src/framework/auth_provider_law.ts +169 -9
- package/src/framework/birth_certificate_law.ts +4 -0
- package/src/framework/capability.ts +34 -3
- package/src/framework/child_authentication.ts +346 -0
- package/src/framework/console_governance.ts +295 -0
- package/src/framework/delegated_roles.ts +301 -0
- package/src/framework/domain_lifecycle.ts +26 -13
- package/src/framework/founding_genesis.ts +193 -0
- package/src/framework/framework_aggregates.ts +1 -1
- package/src/framework/genesis.ts +6 -1
- package/src/framework/governance_relations.ts +19 -0
- package/src/framework/home.ts +5 -734
- package/src/framework/legacy/child_auth_provider_epoch.ts +73 -0
- package/src/framework/model_authority_repair.ts +116 -0
- package/src/framework/model_authority_seed.ts +185 -0
- package/src/framework/model_transition.ts +211 -0
- package/src/framework/owned_custody.ts +1 -1
- package/src/framework/principal_enrollment.ts +302 -0
- package/src/framework/receiving_group.ts +857 -0
- package/src/framework/receiving_group_recovery.ts +314 -0
- package/src/framework/relations.ts +4 -8
- package/src/framework/signing_identity.ts +242 -95
- package/src/framework/source_roster.ts +11 -5
- package/src/framework/workspace_access.ts +149 -0
- package/src/framework/workspace_invariant.ts +73 -52
- package/src/framework/workspaces.ts +407 -40
- package/src/framework_call_definitions.ts +32 -3
- package/src/generated_client_bundle_boundary.ts +97 -0
- package/src/generated_client_names.ts +1 -0
- package/src/identity_usda.ts +27 -0
- package/src/index.ts +183 -12
- package/src/indexed_variant.ts +83 -0
- package/src/intent.ts +173 -45
- package/src/law_check.ts +8 -5
- package/src/law_dependency_index.ts +231 -0
- package/src/law_graph.ts +508 -71
- package/src/law_graph_usda.ts +170 -24
- package/src/law_identity.ts +119 -81
- package/src/law_source_map.ts +4 -1
- package/src/law_units.ts +498 -0
- package/src/law_value_type.ts +7 -3
- package/src/member_authentication.ts +302 -0
- package/src/null_meta.ts +1 -1
- package/src/openusd_compiled_layer.ts +132 -0
- package/src/operation_contract_check.ts +31 -0
- package/src/ordered_read.ts +2 -1
- package/src/package_config.ts +33 -12
- package/src/package_dependencies.ts +1 -0
- package/src/plan_source_slice.ts +30 -1
- package/src/protobuf_field_number.ts +36 -0
- package/src/provenance_wire.ts +6 -0
- package/src/query.ts +2 -1
- package/src/read.ts +50 -0
- package/src/relation.ts +4 -1
- package/src/relation_schema.ts +15 -2
- package/src/report.ts +2 -2
- package/src/sqlite_computation_bundle.ts +78 -0
- package/src/sqlite_computed.ts +102 -0
- package/src/sqlite_counts.ts +154 -0
- package/src/sqlite_layout.ts +823 -0
- package/src/sqlite_reads.ts +275 -0
- package/src/sqlite_samples.ts +185 -0
- package/src/stable_id_identity_bridge.ts +1 -1
- package/src/stable_ids_for_module.ts +16 -4
- package/src/test_call_usda.ts +6 -6
- package/src/usda_relationship_integrity.ts +20 -3
- package/src/usda_text.ts +21 -1
- package/src/value_object.ts +81 -11
- package/src/wire.ts +22 -0
- package/src/wire_encode.ts +227 -20
- package/src/workspace_sharding.ts +15 -6
- package/src/workspace_sharing.ts +51 -49
- package/src/zod_introspection.ts +2 -0
- package/compat_package.mjs +0 -46
- package/dart/lib/src/home.dart +0 -15
- package/dart/lib/src/runner/offline-install.mjs +0 -15367
- package/dart/lib/src/source_trust.dart +0 -51
- package/dart/lib/src/webview_bridge.dart +0 -6540
- package/dart/lib/src/workspace_name.dart +0 -30
- package/dart/test/acquire_session_credentials_test.dart +0 -150
- package/dart/test/acquire_session_test.dart +0 -534
- package/dart/test/adv_realm_interference_test.dart +0 -600
- package/dart/test/cloud_bound_topology_test.dart +0 -168
- package/dart/test/cluster_births_test.dart +0 -202
- package/dart/test/cluster_device_keyed_acceptance_test.dart +0 -105
- package/dart/test/cluster_local_autosync_test.dart +0 -123
- package/dart/test/cluster_scale_test.dart +0 -122
- package/dart/test/compat_test.dart +0 -61
- package/dart/test/dlq_session_surface_test.dart +0 -222
- package/dart/test/first_app_gauntlet_test.dart +0 -386
- package/dart/test/fixtures/wedge/fake-install.mjs +0 -11
- package/dart/test/four_layer_nested_topology_test.dart +0 -290
- package/dart/test/home_parity_test.dart +0 -13
- package/dart/test/local_sync_inert_test.dart +0 -107
- package/dart/test/node_runner_transport_test.dart +0 -78
- package/dart/test/parent_signer_recovery_test.dart +0 -155
- package/dart/test/residency_refusal_test.dart +0 -49
- package/dart/test/sealing_client_test.dart +0 -181
- package/dart/test/session_bound_test.dart +0 -285
- package/dart/test/stale_bundle_test.dart +0 -80
- package/dart/test/vo_read_typing_test.dart +0 -131
- package/dart/test/watch_after_offer_stall_test.dart +0 -100
- package/dart/test/webview_bridge_test.dart +0 -1930
- package/dart/test/workspace_name_test.dart +0 -24
- package/runtime/generated-application-host.js +0 -22860
- package/src/codegen_query_usda.ts +0 -214
- package/src/compat_manifest.ts +0 -26
- package/src/compat_package_main.ts +0 -224
- package/src/shape_compat.ts +0 -352
- package/src/usd_state.ts +0 -505
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { z } from "zod";
|
|
21
21
|
import { aggregate, instance } from "../aggregate.js";
|
|
22
|
-
import { Lww
|
|
22
|
+
import { Lww } from "../drivers.js";
|
|
23
23
|
import {
|
|
24
24
|
attributionField,
|
|
25
25
|
gitObjectId,
|
|
@@ -31,6 +31,7 @@ import { directive } from "../directive.js";
|
|
|
31
31
|
import { formerAggregate, retirement } from "../evolution.js";
|
|
32
32
|
import { set, withMarker, addToSet, type PlannedOp } from "../ops.js";
|
|
33
33
|
import { key, relationRef, relationType, self, user } from "../relation_schema.js";
|
|
34
|
+
import { consolePrincipals, custodianPrincipals, principalsOf } from "../member_authentication.js";
|
|
34
35
|
|
|
35
36
|
/** The two authenticated capabilities which may execute a lifecycle install.
|
|
36
37
|
* Callers choose a role; the serialized USDA route is an implementation detail. */
|
|
@@ -98,7 +99,12 @@ export function domainInstallGenesisOffer(
|
|
|
98
99
|
* delegation remains an ordinary, replayable Zanzibar edge. */
|
|
99
100
|
export const modelLifecycleRelations = relationType("workspace")
|
|
100
101
|
.asGlobal()
|
|
101
|
-
|
|
102
|
+
// Token-free genesis (D22): a child founded by a console principal, or a root founded by a custodian,
|
|
103
|
+
// receives this leaf in its own name from `seedGenesis`, so those two framework scopes are admitted too.
|
|
104
|
+
.relation(MODEL_LIFECYCLE_AUTHORITY, {
|
|
105
|
+
rewrite: self(),
|
|
106
|
+
allow: [user(), key(), principalsOf(consolePrincipals), principalsOf(custodianPrincipals)],
|
|
107
|
+
});
|
|
102
108
|
|
|
103
109
|
/** The lifecycle state machine is a framework type, not a bag of coincidentally matching strings. */
|
|
104
110
|
export enum DomainInstallationPhase {
|
|
@@ -134,13 +140,12 @@ export const DomainInstallation = aggregate("DomainInstallation", {
|
|
|
134
140
|
"status.phase": t.enum(DOMAIN_INSTALLATION_PHASES).merge(Lww),
|
|
135
141
|
"status.observedGeneration": t.int().merge(Lww),
|
|
136
142
|
"status.supersededBy": t.sha256Digest().merge(Lww).optional(),
|
|
137
|
-
"status.conditions": t.map(t.json()).merge(MapOf(Lww)),
|
|
138
143
|
}).public();
|
|
139
144
|
|
|
140
145
|
/**
|
|
141
146
|
* The accepted current-frontier evidence for one activation. This is deliberately an
|
|
142
147
|
* obscure framework concept: tenant models never author or name it. The generated
|
|
143
|
-
* lifecycle client
|
|
148
|
+
* lifecycle client derives the current-frontier transition and folds this receipt in the SAME intent that
|
|
144
149
|
* activates the candidate, so recording evidence cannot make its own head anchor stale.
|
|
145
150
|
*/
|
|
146
151
|
export const RELEASE_RECEIPT_AGGREGATE = "nomos_internal_ReleaseReceipt_6f0d3a";
|
|
@@ -211,7 +216,9 @@ const dispositions = z.object({
|
|
|
211
216
|
|
|
212
217
|
const lowerHex64 = sha256Digest();
|
|
213
218
|
const gitOid = gitObjectId();
|
|
214
|
-
|
|
219
|
+
// `preflight` is the already-shipped law field name; its value is now strictly a
|
|
220
|
+
// current-frontier receipt and never carries counterfactual history results.
|
|
221
|
+
const frontierReceipt = z.object({
|
|
215
222
|
candidateHash: lowerHex64,
|
|
216
223
|
domain: z.string().min(1),
|
|
217
224
|
atHash: gitOid,
|
|
@@ -263,7 +270,10 @@ export const installDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Install)
|
|
|
263
270
|
}
|
|
264
271
|
return ops;
|
|
265
272
|
})
|
|
266
|
-
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
273
|
+
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
274
|
+
// Model custody is exercised by an enrolled user/device or executor key which independently
|
|
275
|
+
// holds installDomain. It must never inherit the customer-facing provider used by business law.
|
|
276
|
+
.authenticatesWithEnrolledDevice();
|
|
267
277
|
|
|
268
278
|
/** Store candidate law in the ledger without changing the served law frontier. The
|
|
269
279
|
* kernel content-verifies the package and lifecycle pair, while the Pending phase is
|
|
@@ -291,7 +301,8 @@ export const stageDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Stage)
|
|
|
291
301
|
if ((p.finalizers ?? []).length > 0) ops.push(addToSet(install, "spec.finalizers", p.finalizers ?? []));
|
|
292
302
|
return ops;
|
|
293
303
|
})
|
|
294
|
-
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
304
|
+
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
305
|
+
.authenticatesWithEnrolledDevice();
|
|
295
306
|
|
|
296
307
|
/** Make a staged or retained Active package current. The package bytes are already
|
|
297
308
|
* committed; the kernel re-loads them from prefix state and runs the evolve gate on
|
|
@@ -306,12 +317,12 @@ export const promoteDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Promote)
|
|
|
306
317
|
replaces: sha256Digest().optional(),
|
|
307
318
|
retireReplaced: z.boolean().default(false),
|
|
308
319
|
dispositions,
|
|
309
|
-
preflight:
|
|
320
|
+
preflight: frontierReceipt,
|
|
310
321
|
}).refine((p) => p.replaces === undefined || p.replaces !== p.domainHash, {
|
|
311
322
|
message: "a promoted domain package cannot replace itself",
|
|
312
323
|
path: ["replaces"],
|
|
313
324
|
}).refine((p) => p.preflight.candidateHash === p.domainHash, {
|
|
314
|
-
message: "the
|
|
325
|
+
message: "the current-frontier receipt must name the package being promoted",
|
|
315
326
|
path: ["preflight", "candidateHash"],
|
|
316
327
|
}))
|
|
317
328
|
.plan((p, ctx): PlannedOp[] => {
|
|
@@ -343,7 +354,8 @@ export const promoteDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Promote)
|
|
|
343
354
|
return ops;
|
|
344
355
|
})
|
|
345
356
|
.alsoEnsures(ReleaseReceipt)
|
|
346
|
-
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
357
|
+
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
358
|
+
.authenticatesWithEnrolledDevice();
|
|
347
359
|
|
|
348
360
|
/** Rollback is a new governed transition, never a history-pointer rewind. The prior
|
|
349
361
|
* package is promoted from committed custody and the failed candidate becomes Disabled;
|
|
@@ -354,12 +366,12 @@ export const rollbackDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Rollback)
|
|
|
354
366
|
candidateHash: sha256Digest(),
|
|
355
367
|
priorHash: sha256Digest(),
|
|
356
368
|
dispositions,
|
|
357
|
-
preflight:
|
|
369
|
+
preflight: frontierReceipt,
|
|
358
370
|
}).refine((p) => p.candidateHash !== p.priorHash, {
|
|
359
371
|
message: "rollback candidate and prior package must differ",
|
|
360
372
|
path: ["priorHash"],
|
|
361
373
|
}).refine((p) => p.preflight.candidateHash === p.priorHash, {
|
|
362
|
-
message: "the rollback
|
|
374
|
+
message: "the rollback current-frontier receipt must name the prior package being restored",
|
|
363
375
|
path: ["preflight", "candidateHash"],
|
|
364
376
|
}).refine((p) => (p.preflight.acceptanceReason ?? "").trim().length > 0, {
|
|
365
377
|
message: "restoring previous law needs an attributed business reason",
|
|
@@ -388,4 +400,5 @@ export const rollbackDomain = directive(DOMAIN_LIFECYCLE_DIRECTIVES.Rollback)
|
|
|
388
400
|
];
|
|
389
401
|
})
|
|
390
402
|
.alsoEnsures(ReleaseReceipt)
|
|
391
|
-
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
403
|
+
.requires(MODEL_LIFECYCLE_AUTHORITY)
|
|
404
|
+
.authenticatesWithEnrolledDevice();
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// NOMOS — Nomos Sovereign: participants act · verify · remember LOCALLY; hosted
|
|
2
|
+
// remotes are replaceable custody/transport, not truth. ⇒ ONE Nomos GitHolon
|
|
3
|
+
// wasm32-wasip1 artifact {kernel · projection · embedded QuickJS engine}.
|
|
4
|
+
// If a file isn't this / hosting this / authoring for this / proving this — it's gone.
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* framework/founding_genesis.ts — TOKEN-FREE GENESIS (identity target model D22, build order step 2).
|
|
8
|
+
*
|
|
9
|
+
* A workspace's founding facts land in ONE control-plane step on its warrant-free genesis prefix:
|
|
10
|
+
* `seedFoundingPrincipal` seats
|
|
11
|
+
*
|
|
12
|
+
* - `identity:P#signer@key:K` the founding admin principal's founding signer key;
|
|
13
|
+
* - `workspace:self#admin@P` the founding admin;
|
|
14
|
+
* - `workspace:self#operator@S` each operator the parent held at birth (D15);
|
|
15
|
+
* - `principalScope:<s>#enroller@S` each enroller the parent held at birth (D22),
|
|
16
|
+
*
|
|
17
|
+
* and records them on the singleton {@link FoundingPrincipal} the kernel reads when it judges the
|
|
18
|
+
* warrant. Nothing here is a token, an issuer key, a JWKS or a certificate: P is a `<scope>:<subject>`
|
|
19
|
+
* principal and K is the sha256 of a public key.
|
|
20
|
+
*
|
|
21
|
+
* Why one requires-free step: on the warrant-free prefix no admin exists yet, so an admin-gated grant
|
|
22
|
+
* (`grantAdmin`, `grantLawOperator`, `grantEnroller`) is refused by the kernel's relation gate. The
|
|
23
|
+
* step is instead fenced by {@link foundingPrincipalVirginOnly}: it is admitted only before the warrant
|
|
24
|
+
* and only once, so it can never be replayed to seat a second founder. What makes the prefix
|
|
25
|
+
* trustworthy is the warrant that closes it — the root's is signed by the pinned K_root; a child's is
|
|
26
|
+
* appended by the kernel's birth effect of the parent's admitted, signed `birthChild`, and the kernel
|
|
27
|
+
* binds the warrant's principal to this record (`executor/src/founding_genesis.rs`).
|
|
28
|
+
*
|
|
29
|
+
* The founding principal must be one the framework's governance relations admit (`user:`, `console:` or
|
|
30
|
+
* `custodian:`, `isGovernanceSubject`): the framework cannot name a tenant's scopes. A `user:` founder is
|
|
31
|
+
* an application's signed-in user founding their own workspace (a Home), enrolled by the user scope's
|
|
32
|
+
* enroller (`principalScope:user#enroller`) exactly like any enrolled principal.
|
|
33
|
+
*/
|
|
34
|
+
import { z } from "zod";
|
|
35
|
+
import { aggregate, instance } from "../aggregate.js";
|
|
36
|
+
import { t } from "../fields.js";
|
|
37
|
+
import { Lww } from "../drivers.js";
|
|
38
|
+
import { directive } from "../directive.js";
|
|
39
|
+
import { set, type PlannedOp } from "../ops.js";
|
|
40
|
+
import { principalScopeOf } from "../member_authentication.js";
|
|
41
|
+
import { RelationTuple, relationTuplesByObject, writeTuple } from "./relations.js";
|
|
42
|
+
import { readFrameworkDeclaredRows } from "../read.js";
|
|
43
|
+
import { readRef, readSet, workspaceInvariant } from "./workspace_invariant.js";
|
|
44
|
+
import { GENESIS_WARRANT_ID } from "./genesis.js";
|
|
45
|
+
import { signerObject, SIGNER_RELATION } from "./signing_identity.js";
|
|
46
|
+
import { WORKSPACE_ADMIN_RELATION, WORKSPACE_OPERATOR_RELATION, PRINCIPAL_SCOPE_ENROLLER_RELATION } from "./governance_relations.js";
|
|
47
|
+
import { isGovernanceSubject, principalScopeObject, providerScopeField } from "./principal_enrollment.js";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* OPERATOR INHERITANCE (identity target model D15): the parent's CURRENT `operator` subjects, read
|
|
51
|
+
* off the parent's folded state by the calling plan (a declared captured read, `relationTuplesByObject`
|
|
52
|
+
* on `workspace:self`). The founding step seats each one in the child — a fact copied once at birth,
|
|
53
|
+
* never a live dependency on the parent afterward (D15's whole point). Sorted so the recipe is a pure
|
|
54
|
+
* function of the tuple set.
|
|
55
|
+
*/
|
|
56
|
+
export function readInheritedOperators(): readonly string[] {
|
|
57
|
+
const rows = readFrameworkDeclaredRows(relationTuplesByObject, RelationTuple, { object: "workspace:self" });
|
|
58
|
+
const row = rows.find((candidate) => candidate.relation === WORKSPACE_OPERATOR_RELATION);
|
|
59
|
+
const subjects = row?.subjects as Record<string, { status?: string }> | undefined;
|
|
60
|
+
if (!subjects) return [];
|
|
61
|
+
return Object.keys(subjects)
|
|
62
|
+
.filter((subject) => subjects[subject]?.status === "active")
|
|
63
|
+
.sort();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** The singleton id of the founding record — MUST equal `executor::founding_genesis::FOUNDING_PRINCIPAL_ID`. */
|
|
67
|
+
export const FOUNDING_PRINCIPAL_ID = "founding-principal:self";
|
|
68
|
+
|
|
69
|
+
/** The directive id — MUST equal `executor::founding_genesis::SEED_FOUNDING_PRINCIPAL_DIRECTIVE`. */
|
|
70
|
+
export const SEED_FOUNDING_PRINCIPAL_DIRECTIVE = "seedFoundingPrincipal" as const;
|
|
71
|
+
|
|
72
|
+
/** The one record the kernel reads to bind the warrant to the founder (an O(1) point read). */
|
|
73
|
+
export const FoundingPrincipal = aggregate("FoundingPrincipal", {
|
|
74
|
+
principal: t.string().merge(Lww), // `<scope>:<subject>`, the founding admin
|
|
75
|
+
keyHash: t.string().merge(Lww), // sha256hex of the founding signer's public key
|
|
76
|
+
}).public();
|
|
77
|
+
|
|
78
|
+
const sha256Hex = z.string().regex(/^[0-9a-f]{64}$/, "expected lowercase sha256 hex (a public key hash)");
|
|
79
|
+
/** Every field that is law on the founding step. Strict: no token-, issuer- or certificate-shaped field.
|
|
80
|
+
* Subject-class checks are object-level refinements (the compiler's security discovery must be able to
|
|
81
|
+
* sample each field on its own). */
|
|
82
|
+
export const foundingPrincipalPayload = z
|
|
83
|
+
.object({
|
|
84
|
+
/** The founding admin: a user:, console: or custodian: `<scope>:<subject>` principal. */
|
|
85
|
+
principal: z.string().min(1),
|
|
86
|
+
keyHash: sha256Hex,
|
|
87
|
+
/** The parent's active operator subjects at birth, sorted (D15). */
|
|
88
|
+
operators: z.array(z.string().min(1)).default([]),
|
|
89
|
+
/** The parent's active enroller tuples at birth, sorted by (scope, subject) (D22). */
|
|
90
|
+
enrollers: z.array(z.object({ scope: providerScopeField, subject: z.string().min(1) }).strict()).default([]),
|
|
91
|
+
grantedAt: z.number().int().nonnegative(),
|
|
92
|
+
})
|
|
93
|
+
.strict()
|
|
94
|
+
.refine((p) => principalScopeOf(p.principal) !== undefined && isGovernanceSubject(p.principal), {
|
|
95
|
+
message: "the founding principal is a console: or custodian: <scope>:<subject> principal",
|
|
96
|
+
path: ["principal"],
|
|
97
|
+
})
|
|
98
|
+
.refine((p) => p.operators.every(isGovernanceSubject) && p.enrollers.every((e) => isGovernanceSubject(e.subject)), {
|
|
99
|
+
message: "every inherited operator and enroller is a framework governance subject",
|
|
100
|
+
path: ["operators"],
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
export type FoundingPrincipalPayload = z.input<typeof foundingPrincipalPayload>;
|
|
104
|
+
|
|
105
|
+
/** The founding facts as planned ops — a pure function of the payload. */
|
|
106
|
+
export function writeFoundingPrincipal(p: z.output<typeof foundingPrincipalPayload>): PlannedOp[] {
|
|
107
|
+
// The grant's authority is the genesis itself: at a root the K_root-signed warrant that closes this
|
|
108
|
+
// prefix, at a child the parent's admitted birth whose effect appends that warrant.
|
|
109
|
+
const grantedBy = "genesis";
|
|
110
|
+
const grantedAt = String(p.grantedAt);
|
|
111
|
+
const record = instance(FoundingPrincipal, FOUNDING_PRINCIPAL_ID);
|
|
112
|
+
return [
|
|
113
|
+
set(record, "principal", p.principal),
|
|
114
|
+
set(record, "keyHash", p.keyHash),
|
|
115
|
+
...writeTuple({
|
|
116
|
+
object: signerObject(p.principal),
|
|
117
|
+
relation: SIGNER_RELATION,
|
|
118
|
+
subject: `key:${p.keyHash}`,
|
|
119
|
+
grantedBy,
|
|
120
|
+
grantedAt,
|
|
121
|
+
}),
|
|
122
|
+
...writeTuple({ object: "workspace:self", relation: WORKSPACE_ADMIN_RELATION, subject: p.principal, grantedBy, grantedAt }),
|
|
123
|
+
...(p.operators ?? []).flatMap((subject) =>
|
|
124
|
+
writeTuple({ object: "workspace:self", relation: WORKSPACE_OPERATOR_RELATION, subject, grantedBy, grantedAt })),
|
|
125
|
+
...(p.enrollers ?? []).flatMap((enroller) =>
|
|
126
|
+
writeTuple({
|
|
127
|
+
object: principalScopeObject(enroller.scope),
|
|
128
|
+
relation: PRINCIPAL_SCOPE_ENROLLER_RELATION,
|
|
129
|
+
subject: enroller.subject,
|
|
130
|
+
grantedBy,
|
|
131
|
+
grantedAt,
|
|
132
|
+
})),
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** `seedFoundingPrincipal` — the one founding step of a token-free genesis. See the module doc. */
|
|
137
|
+
export const seedFoundingPrincipal = directive(SEED_FOUNDING_PRINCIPAL_DIRECTIVE)
|
|
138
|
+
.ensures(FoundingPrincipal)
|
|
139
|
+
.payload(foundingPrincipalPayload)
|
|
140
|
+
.plan((p) => writeFoundingPrincipal(p))
|
|
141
|
+
.alsoEnsures(RelationTuple);
|
|
142
|
+
|
|
143
|
+
/** Admitted only on a virgin, warrant-free prefix, and only once: no second founder, ever. */
|
|
144
|
+
export const foundingPrincipalVirginOnly = workspaceInvariant("FoundingPrincipalVirginOnly")
|
|
145
|
+
.on(SEED_FOUNDING_PRINCIPAL_DIRECTIVE)
|
|
146
|
+
.reads(readSet(
|
|
147
|
+
readRef("warrant", "GenesisWarrant").pre().at(GENESIS_WARRANT_ID),
|
|
148
|
+
readRef("founding", FoundingPrincipal).pre().at(FOUNDING_PRINCIPAL_ID),
|
|
149
|
+
))
|
|
150
|
+
.assert(({ warrant, founding }) => {
|
|
151
|
+
if ((warrant as { principal?: string } | undefined)?.principal) return { reject: "founding-after-warrant" };
|
|
152
|
+
if ((founding as { principal?: string } | undefined)?.principal) return { reject: "founding-principal-already-seeded" };
|
|
153
|
+
return { accept: true };
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
/** The birth-origin record's singleton id — MUST equal `executor::founding_genesis::BIRTH_ORIGIN_ID`. */
|
|
157
|
+
export const BIRTH_ORIGIN_ID = "birth-origin:self";
|
|
158
|
+
|
|
159
|
+
/** The directive id — MUST equal `executor::founding_genesis::SEED_BIRTH_ORIGIN_DIRECTIVE`. */
|
|
160
|
+
export const SEED_BIRTH_ORIGIN_DIRECTIVE = "seedBirthOrigin" as const;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Where a token-free child came from: the parent workspace and the id of the parent's admitted, signed
|
|
164
|
+
* birth intent whose births witness re-derives this child's genesis prefix. Appended by the KERNEL's
|
|
165
|
+
* birth effect (never by a plan), just before the warrant, so the child's own chain names the parent
|
|
166
|
+
* birth it can be checked against offline. A root has none.
|
|
167
|
+
*/
|
|
168
|
+
export const BirthOrigin = aggregate("BirthOrigin", {
|
|
169
|
+
parent: t.string().merge(Lww),
|
|
170
|
+
parentIntent: t.string().merge(Lww),
|
|
171
|
+
}).public();
|
|
172
|
+
|
|
173
|
+
/** `seedBirthOrigin` — the kernel-appended parent reference of a token-free birth. */
|
|
174
|
+
export const seedBirthOrigin = directive(SEED_BIRTH_ORIGIN_DIRECTIVE)
|
|
175
|
+
.ensures(BirthOrigin)
|
|
176
|
+
.payload(z.object({ parent: z.string().min(1), parentIntent: z.string().min(1) }).strict())
|
|
177
|
+
.plan((p) => {
|
|
178
|
+
const record = instance(BirthOrigin, BIRTH_ORIGIN_ID);
|
|
179
|
+
return [set(record, "parent", p.parent), set(record, "parentIntent", p.parentIntent)];
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
/** Kernel-appended once, before the warrant; never again. */
|
|
183
|
+
export const birthOriginVirginOnly = workspaceInvariant("BirthOriginVirginOnly")
|
|
184
|
+
.on(SEED_BIRTH_ORIGIN_DIRECTIVE)
|
|
185
|
+
.reads(readSet(
|
|
186
|
+
readRef("warrant", "GenesisWarrant").pre().at(GENESIS_WARRANT_ID),
|
|
187
|
+
readRef("origin", BirthOrigin).pre().at(BIRTH_ORIGIN_ID),
|
|
188
|
+
))
|
|
189
|
+
.assert(({ warrant, origin }) => {
|
|
190
|
+
if ((warrant as { principal?: string } | undefined)?.principal) return { reject: "birth-origin-after-warrant" };
|
|
191
|
+
if ((origin as { parent?: string } | undefined)?.parent) return { reject: "birth-origin-already-seeded" };
|
|
192
|
+
return { accept: true };
|
|
193
|
+
});
|
|
@@ -43,7 +43,7 @@ import * as domainLifecycle from "./domain_lifecycle.js";
|
|
|
43
43
|
import * as encryptionIdentity from "./encryption_identity.js";
|
|
44
44
|
import * as encryptionScope from "./encryption_scope.js";
|
|
45
45
|
import * as genesis from "./genesis.js";
|
|
46
|
-
import * as home from "./
|
|
46
|
+
import * as home from "./receiving_group.js";
|
|
47
47
|
import * as ownedCustody from "./owned_custody.js";
|
|
48
48
|
import * as relations from "./relations.js";
|
|
49
49
|
import * as repair from "./repair.js";
|
package/src/framework/genesis.ts
CHANGED
|
@@ -35,6 +35,7 @@ import { directive } from "../directive.js";
|
|
|
35
35
|
import { set, type PlannedOp } from "../ops.js";
|
|
36
36
|
import { RelationTuple, writeTuple } from "./relations.js";
|
|
37
37
|
import { MODEL_LIFECYCLE_AUTHORITY } from "./domain_lifecycle.js";
|
|
38
|
+
import { principalScopeOf } from "../member_authentication.js";
|
|
38
39
|
import {
|
|
39
40
|
ADMISSION_CHECKPOINT_PRINCIPAL,
|
|
40
41
|
SIGNER_RELATION,
|
|
@@ -133,7 +134,11 @@ export const seedGenesis = directive("seedGenesis")
|
|
|
133
134
|
...writeTuple({
|
|
134
135
|
object: "workspace:self",
|
|
135
136
|
relation: MODEL_LIFECYCLE_AUTHORITY,
|
|
136
|
-
subject
|
|
137
|
+
// A `<scope>:<subject>` principal (token-free genesis, D22) is its own Zanzibar subject; a bare
|
|
138
|
+
// legacy uid is still spelled `user:<uid>`.
|
|
139
|
+
subject: /^(user|key):/.test(p.principal) || principalScopeOf(p.principal) !== undefined
|
|
140
|
+
? p.principal
|
|
141
|
+
: `user:${p.principal}`,
|
|
137
142
|
grantedBy: p.principal,
|
|
138
143
|
grantedAt: p.bornAt,
|
|
139
144
|
}),
|
|
@@ -8,3 +8,22 @@ import { relationRef } from "../relation_schema.js";
|
|
|
8
8
|
/** The global workspace authority seated at `workspace:self#admin`. */
|
|
9
9
|
export const WORKSPACE_ADMIN_RELATION = relationRef("admin");
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* The global workspace authority seated at `workspace:self#operator` (identity target model,
|
|
13
|
+
* `architecture/identity_target_model.md` D15): who may install, stage or promote law here. Narrower
|
|
14
|
+
* than {@link WORKSPACE_ADMIN_RELATION} — an admin grants and revokes it, exactly as an admin grants
|
|
15
|
+
* admin — and, unlike admin, it is copied into a child's own genesis chain when the child is born
|
|
16
|
+
* (`buildGenesisChain`'s `inheritedOperators`), a fact recorded once at birth, never a live dependency
|
|
17
|
+
* on the parent afterward. A child may change who it trusts as an operator the moment it exists; the
|
|
18
|
+
* parent has no ongoing authority over it.
|
|
19
|
+
*/
|
|
20
|
+
export const WORKSPACE_OPERATOR_RELATION = relationRef("operator");
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The framework authority seated at `principalScope:<scope>#enroller` (identity target model D22): who
|
|
24
|
+
* may write the FIRST signer key of a principal of an enrolled scope (`enrollDevice`) and revoke that
|
|
25
|
+
* scope's keys (`revokeDevice`). A relation tuple, revocable and replaceable by one intent — never a key
|
|
26
|
+
* in law. Like {@link WORKSPACE_OPERATOR_RELATION}, an admin grants it and a child is born with a copy
|
|
27
|
+
* of its parent's enroller tuples (`buildGenesisChain`'s `inheritedEnrollers`).
|
|
28
|
+
*/
|
|
29
|
+
export const PRINCIPAL_SCOPE_ENROLLER_RELATION = relationRef("enroller");
|