@githolon/dsl 0.108.7 → 0.110.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +76 -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 +211 -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 +267 -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 +23905 -15774
- 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 +548 -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_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 +1274 -0
- package/src/codegen_call_usda.ts +49 -6
- package/src/codegen_dart.ts +79 -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 +1994 -1189
- 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
package/src/build_package.ts
CHANGED
|
@@ -35,12 +35,15 @@ import type { QueryDecl } from "./query.js";
|
|
|
35
35
|
import type { SpatialDecl } from "./spatial.js";
|
|
36
36
|
import type { AnySum } from "./sum.js";
|
|
37
37
|
import type { AnyExtremum } from "./extremum.js";
|
|
38
|
+
import type { AnyExists } from "./exists.js";
|
|
39
|
+
import type { OrderedReadDecl } from "./ordered_read.js";
|
|
38
40
|
import type { AnyDerivedDecl, DerivedDecl, TemporalEnumDecl } from "./derived.js";
|
|
39
41
|
import type { CombinedDecl } from "./combined.js";
|
|
40
42
|
import type { ImpureCapabilityDecl } from "./codegen_provider_dart.js";
|
|
41
43
|
import type { WorkspaceTypeDecl } from "./workspace_type.js";
|
|
42
44
|
import type { WorkspaceInvariantDecl } from "./framework/workspace_invariant.js";
|
|
43
45
|
import { withWorkspaceSharingInvitationExports } from "./workspace_sharing.js";
|
|
46
|
+
import { indexedVariantsOf } from "./indexed_variant.js";
|
|
44
47
|
import {
|
|
45
48
|
applicationLanguageOf,
|
|
46
49
|
assertApplicationLanguageCoversAuthoredDirectives,
|
|
@@ -69,11 +72,32 @@ import {
|
|
|
69
72
|
mergeRelationTypeDeclarations,
|
|
70
73
|
type RelationTypeDecl,
|
|
71
74
|
} from "./relation_schema.js";
|
|
72
|
-
import {
|
|
75
|
+
import {
|
|
76
|
+
collectPayloadValueObjectDescriptors,
|
|
77
|
+
collectValueObjectDescriptors,
|
|
78
|
+
} from "./value_object.js";
|
|
73
79
|
import { expandCapabilityExports, isCapabilityDecl } from "./capability_exports.js";
|
|
74
80
|
import { RelationTuple, relationTuplesByObject } from "./framework/relations.js";
|
|
75
|
-
import {
|
|
76
|
-
|
|
81
|
+
import {
|
|
82
|
+
SignerDelegation,
|
|
83
|
+
signerDelegationByUser,
|
|
84
|
+
signerDelegationCertJsonRetired,
|
|
85
|
+
} from "./framework/signing_identity.js";
|
|
86
|
+
import {
|
|
87
|
+
AUTH_PROVIDER_AUTHORITY,
|
|
88
|
+
AuthProvider,
|
|
89
|
+
AuthProviderCertificate,
|
|
90
|
+
AuthProviderKey,
|
|
91
|
+
adoptIdentityProviderWitness,
|
|
92
|
+
authProvider,
|
|
93
|
+
authProviderCertificates,
|
|
94
|
+
authProviderKeys,
|
|
95
|
+
authProviderSourceRelations,
|
|
96
|
+
identityProviderSourceTrust,
|
|
97
|
+
seedAuthProvider,
|
|
98
|
+
setAuthProvider,
|
|
99
|
+
} from "./framework/workspaces.js";
|
|
100
|
+
import { nomosSourceFrontierEnsure } from "./attested.js";
|
|
77
101
|
import { parentAttestedBirthMarker } from "./births.js";
|
|
78
102
|
import { discoverUnsanctionedEnsures, sanctioningEnsureDirective } from "./secondary_ensure.js";
|
|
79
103
|
import { probeEnsuredTypes, probePlanOps } from "./codegen_proof.js";
|
|
@@ -178,6 +202,8 @@ export interface DomainModuleSpec {
|
|
|
178
202
|
/** Maintained MIN/MAX reads (#47 — the extremum RPC's manifest half). Config-named like sums. */
|
|
179
203
|
readonly mins?: readonly AnyExtremum[];
|
|
180
204
|
readonly maxes?: readonly AnyExtremum[];
|
|
205
|
+
readonly exists_?: readonly AnyExists[];
|
|
206
|
+
readonly orderedReads?: readonly OrderedReadDecl[];
|
|
181
207
|
readonly spatials?: readonly SpatialDecl[];
|
|
182
208
|
/** First-class workspace types (sharding §10 slice 1) — the law-declared taxonomy. */
|
|
183
209
|
readonly workspaceTypes?: readonly WorkspaceTypeDecl[];
|
|
@@ -205,6 +231,7 @@ export interface DomainModuleSpec {
|
|
|
205
231
|
*/
|
|
206
232
|
export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
207
233
|
const domain = spec.domain ?? spec.name;
|
|
234
|
+
const indexedVariants = indexedVariantsOf(spec.modules);
|
|
208
235
|
const conflictPolicies = conflictPoliciesOf(spec.modules, domain);
|
|
209
236
|
const fieldEvolutions = fieldEvolutionsOf(spec.modules);
|
|
210
237
|
const retirements = retirementsOf(spec.modules, domain);
|
|
@@ -264,9 +291,19 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
264
291
|
const discoveredDirectives = directivesOf(merged);
|
|
265
292
|
// A directive builder already possessed the typed aggregate handle. Retain that compiler link so
|
|
266
293
|
// re-exporting a lawful directive is self-contained: its local target schema joins the domain without
|
|
267
|
-
// a second magic re-export. A
|
|
294
|
+
// a second magic re-export. A pure workspace-effect intent keeps the handle for runtime dispatch but
|
|
295
|
+
// has no local aggregate consequence, so its destination schema remains a dependency instead of being
|
|
296
|
+
// copied into the source domain's generated types. A cross-workspace birth follows the same boundary.
|
|
268
297
|
for (const directive of discoveredDirectives) {
|
|
269
|
-
|
|
298
|
+
const pureWorkspaceEffect =
|
|
299
|
+
(directive as { steps?: readonly unknown[] }).steps?.length === 0 &&
|
|
300
|
+
((directive as { workspaceEffects?: readonly unknown[] }).workspaceEffects
|
|
301
|
+
?.length ?? 0) > 0;
|
|
302
|
+
if (
|
|
303
|
+
directive.birthsChild !== true &&
|
|
304
|
+
!pureWorkspaceEffect &&
|
|
305
|
+
directive.aggregate !== undefined
|
|
306
|
+
) {
|
|
270
307
|
const prior = byId.get(directive.aggregate.id);
|
|
271
308
|
byId.set(
|
|
272
309
|
directive.aggregate.id,
|
|
@@ -468,6 +505,17 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
468
505
|
? { ...setAuthProvider, businessBirthInternal: true } as Directive<any>
|
|
469
506
|
: setAuthProvider);
|
|
470
507
|
}
|
|
508
|
+
if (!directives.some((d) => d.id === adoptIdentityProviderWitness.id)) {
|
|
509
|
+
directives.push(declaresOwnedRead
|
|
510
|
+
? { ...adoptIdentityProviderWitness, businessBirthInternal: true } as Directive<any>
|
|
511
|
+
: adoptIdentityProviderWitness);
|
|
512
|
+
}
|
|
513
|
+
for (const aggregate of [AuthProviderKey, AuthProviderCertificate, NomosSourceFrontier]) {
|
|
514
|
+
if (!byId.has(aggregate.id)) byId.set(aggregate.id, aggregate);
|
|
515
|
+
}
|
|
516
|
+
if (!directives.some((d) => d.id === nomosSourceFrontierEnsure.id)) {
|
|
517
|
+
directives.push(nomosSourceFrontierEnsure);
|
|
518
|
+
}
|
|
471
519
|
}
|
|
472
520
|
const usesRelations =
|
|
473
521
|
declaresPrivateRead ||
|
|
@@ -491,11 +539,10 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
491
539
|
for (const a of BIRTH_METER_AGGREGATES) {
|
|
492
540
|
if (!byId.has(a.id)) byId.set(a.id, a);
|
|
493
541
|
}
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
// `setAuthProvider` genesis step (child side; the one-package fixture shape is both at once). Without
|
|
497
|
-
// this carry, default-on inheritance would refuse on every law that never hand-exported the trio.
|
|
542
|
+
// Birth captures and seeds the current verifier once; later provider epochs use the ordinary
|
|
543
|
+
// authority-gated adoption directive above.
|
|
498
544
|
if (!byId.has(AuthProvider.id)) byId.set(AuthProvider.id, AuthProvider);
|
|
545
|
+
if (!directives.some((d) => d.id === seedAuthProvider.id)) directives.push(seedAuthProvider);
|
|
499
546
|
if (!directives.some((d) => d.id === setAuthProvider.id)) directives.push(setAuthProvider);
|
|
500
547
|
}
|
|
501
548
|
// SECONDARY-CREATE AUTO-DECLARE (secondary_ensure.ts — the id-mint-gate DX): a plan may `ensure(B, "det:id")`
|
|
@@ -528,6 +575,22 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
528
575
|
directives.push(dir);
|
|
529
576
|
autoDeclaredEnsures.push(ty);
|
|
530
577
|
}
|
|
578
|
+
// Framework-owned schema evolution travels with the framework aggregate.
|
|
579
|
+
// Applications compose SignerDelegation into several domains; requiring each
|
|
580
|
+
// tenant evolution folder to repeat the same tombstone would make framework
|
|
581
|
+
// correctness application-maintained. Inject it only where the exact
|
|
582
|
+
// framework aggregate is present, and only when the tenant has not already
|
|
583
|
+
// declared the same retirement.
|
|
584
|
+
if (
|
|
585
|
+
byId.has(SignerDelegation.id) &&
|
|
586
|
+
!retirements.some((candidate) =>
|
|
587
|
+
candidate.kind === signerDelegationCertJsonRetired.kind &&
|
|
588
|
+
candidate.aggregate === signerDelegationCertJsonRetired.aggregate &&
|
|
589
|
+
candidate.field === signerDelegationCertJsonRetired.field
|
|
590
|
+
)
|
|
591
|
+
) {
|
|
592
|
+
retirements.push(signerDelegationCertJsonRetired);
|
|
593
|
+
}
|
|
531
594
|
const aggregates = applyFieldEvolutionsToAggregates(
|
|
532
595
|
applyConflictPoliciesToAggregates(
|
|
533
596
|
[...byId.values()],
|
|
@@ -610,6 +673,8 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
610
673
|
}
|
|
611
674
|
}
|
|
612
675
|
const counts = [...(spec.counts ?? [])];
|
|
676
|
+
const exists_ = [...(spec.exists_ ?? [])];
|
|
677
|
+
const orderedReads = [...(spec.orderedReads ?? [])];
|
|
613
678
|
const spatials = [...(spec.spatials ?? [])];
|
|
614
679
|
const temporalEnums: TemporalEnumDecl[] = aggregates.flatMap((aggregate) =>
|
|
615
680
|
Object.entries(aggregate.fields).flatMap(([sourceField, field]) =>
|
|
@@ -712,7 +777,7 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
712
777
|
queries.push({ ...q, businessBirthInternal: true } as QueryDecl);
|
|
713
778
|
}
|
|
714
779
|
}
|
|
715
|
-
// The inheritance read (`.reads("authProvider")` on
|
|
780
|
+
// The inheritance read (`.reads("authProvider")` on birth) routes like any declared query.
|
|
716
781
|
if (!haveQuery.has(authProvider.id)) queries.push(authProvider);
|
|
717
782
|
// The client's private birth ceremony checks the actor's delegation before creating it. Carry the
|
|
718
783
|
// structural read in certified routing law for every `.births()` domain, but keep it off tenant codegen.
|
|
@@ -724,9 +789,33 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
724
789
|
queries.push(internalDelegationQuery);
|
|
725
790
|
}
|
|
726
791
|
}
|
|
727
|
-
const
|
|
792
|
+
const authoredRelationTypes = [
|
|
728
793
|
...exportedRelationTypes,
|
|
729
794
|
...(spec.relationTypes ?? []),
|
|
795
|
+
];
|
|
796
|
+
const authoredProviderAuthority = authoredRelationTypes.find(
|
|
797
|
+
(declaration) =>
|
|
798
|
+
declaration.global === true &&
|
|
799
|
+
declaration.type === authProviderSourceRelations.type &&
|
|
800
|
+
declaration.relations.has(AUTH_PROVIDER_AUTHORITY),
|
|
801
|
+
);
|
|
802
|
+
const frameworkProviderAuthority = authProviderSourceRelations.relations.get(
|
|
803
|
+
AUTH_PROVIDER_AUTHORITY,
|
|
804
|
+
);
|
|
805
|
+
const carriesExactProviderAuthority =
|
|
806
|
+
authoredProviderAuthority !== undefined &&
|
|
807
|
+
frameworkProviderAuthority !== undefined &&
|
|
808
|
+
JSON.stringify(authoredProviderAuthority.relations.get(AUTH_PROVIDER_AUTHORITY)) ===
|
|
809
|
+
JSON.stringify(frameworkProviderAuthority);
|
|
810
|
+
const relationTypes = mergeRelationTypeDeclarations([
|
|
811
|
+
...authoredRelationTypes,
|
|
812
|
+
// This relation belongs to the exact provider-adoption member. Supply the
|
|
813
|
+
// framework declaration only when tenant law has not already declared the
|
|
814
|
+
// same authority; a divergent declaration is deliberately composed below
|
|
815
|
+
// so the duplicate-relation guard refuses it loudly.
|
|
816
|
+
...(declaresPrivateRead && !carriesExactProviderAuthority
|
|
817
|
+
? [authProviderSourceRelations]
|
|
818
|
+
: []),
|
|
730
819
|
]);
|
|
731
820
|
// RELATION-USING LAW AUTO-COMPOSES ITS AUDIT READ (co2 recovery DX — same idiom as the meter
|
|
732
821
|
// queries above): a domain that declares relation law (a relation schema, a `.requires(...)` gated
|
|
@@ -746,8 +835,17 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
746
835
|
? { ...authProvider, businessBirthInternal: true } as QueryDecl
|
|
747
836
|
: authProvider);
|
|
748
837
|
}
|
|
838
|
+
if (declaresPrivateRead) {
|
|
839
|
+
for (const providerQuery of [authProviderKeys, authProviderCertificates]) {
|
|
840
|
+
if (!queries.some((candidate) => candidate.id === providerQuery.id)) {
|
|
841
|
+
queries.push(declaresOwnedRead
|
|
842
|
+
? { ...providerQuery, businessBirthInternal: true } as QueryDecl
|
|
843
|
+
: providerQuery);
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
}
|
|
749
847
|
if (usesRelations && !queries.some((q) => q.id === relationTuplesByObject.id)) {
|
|
750
|
-
queries.push(declaresOwnedRead
|
|
848
|
+
queries.push(declaresOwnedRead || (byId.get(RelationTuple.id) as { businessBirthInternal?: boolean } | undefined)?.businessBirthInternal === true
|
|
751
849
|
? { ...relationTuplesByObject, businessBirthInternal: true } as QueryDecl
|
|
752
850
|
: relationTuplesByObject);
|
|
753
851
|
}
|
|
@@ -761,7 +859,30 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
761
859
|
// contracts. A contract may be the only local owner of a named value object (especially a
|
|
762
860
|
// cross-domain publication DTO); collecting aggregates alone left a dangling type reference in
|
|
763
861
|
// the canonical law graph. Transitive nested VOs remain included by the descriptor collector.
|
|
764
|
-
const
|
|
862
|
+
const valueObjectByName = new Map(
|
|
863
|
+
collectValueObjectDescriptors([...aggregates, ...contracts])
|
|
864
|
+
.map((descriptor) => [descriptor.name, descriptor] as const),
|
|
865
|
+
);
|
|
866
|
+
for (const descriptor of collectPayloadValueObjectDescriptors(directives)) {
|
|
867
|
+
// Payload contracts are law contracts too. A value object used only by an
|
|
868
|
+
// offer must therefore inhabit the same nominal law type graph as one used
|
|
869
|
+
// by stored state; generated clients must not own a parallel type registry.
|
|
870
|
+
if (!valueObjectByName.has(descriptor.name)) {
|
|
871
|
+
valueObjectByName.set(descriptor.name, descriptor);
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
for (const invariant of workspaceInvariants) {
|
|
875
|
+
if (!invariant.refusal) continue;
|
|
876
|
+
for (const descriptor of [invariant.refusal.descriptor, ...invariant.refusal.dependencies]) {
|
|
877
|
+
const prior = valueObjectByName.get(descriptor.name);
|
|
878
|
+
if (prior && JSON.stringify(prior) !== JSON.stringify(descriptor)) {
|
|
879
|
+
throw new Error(`invariant '${invariant.id}' conflicts with nominal type '${descriptor.name}'`);
|
|
880
|
+
}
|
|
881
|
+
valueObjectByName.set(descriptor.name, descriptor);
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
const valueObjects = [...valueObjectByName.values()]
|
|
885
|
+
.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
765
886
|
// SPATIAL × VO PAIRING (fail at build, not at fold): a spatial index over a VO-typed field
|
|
766
887
|
// must index a GEO value object (an RFC 7946 geometry — the R*Tree's bbox source). A
|
|
767
888
|
// structural VO (e.g. a PostalAddress) has no geometry to index. Non-VO fields (a
|
|
@@ -848,6 +969,9 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
848
969
|
for (const v of Object.values(merged)) {
|
|
849
970
|
if (isTrustPolicyDecl(v)) policyById.set(v.policyId, v);
|
|
850
971
|
}
|
|
972
|
+
if (declaresPrivateRead) {
|
|
973
|
+
policyById.set(identityProviderSourceTrust.policyId, identityProviderSourceTrust);
|
|
974
|
+
}
|
|
851
975
|
const trustPolicies = [...policyById.values()].sort((a, b) =>
|
|
852
976
|
a.policyId < b.policyId ? -1 : a.policyId > b.policyId ? 1 : 0,
|
|
853
977
|
);
|
|
@@ -921,6 +1045,8 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
921
1045
|
...(retirements.length > 0 ? { retirements } : {}),
|
|
922
1046
|
...(queries.length > 0 ? { queries } : {}),
|
|
923
1047
|
...(counts.length > 0 ? { counts } : {}),
|
|
1048
|
+
...(exists_.length > 0 ? { exists_ } : {}),
|
|
1049
|
+
...(orderedReads.length > 0 ? { orderedReads } : {}),
|
|
924
1050
|
...(spatials.length > 0 ? { spatials } : {}),
|
|
925
1051
|
...(deriveds.length > 0 ? { deriveds } : {}),
|
|
926
1052
|
...(combineds.length > 0 ? { combineds } : {}),
|
|
@@ -942,6 +1068,7 @@ export function composeDomainModule(spec: DomainModuleSpec): DomainModule {
|
|
|
942
1068
|
// Omit-when-empty — the `nomosValueObjects` era rule: a VO-free domain's USD/package
|
|
943
1069
|
// bytes are byte-identical to before value objects existed.
|
|
944
1070
|
...(valueObjects.length > 0 ? { valueObjects } : {}),
|
|
1071
|
+
...(indexedVariants.length > 0 ? { indexedVariants } : {}),
|
|
945
1072
|
// Omit-when-empty — the `nomosContracts` era rule: a contract-free domain's USD/package bytes
|
|
946
1073
|
// are byte-identical to before domain contracts existed (pure additive typing metadata).
|
|
947
1074
|
...(contracts.length > 0 ? { contracts } : {}),
|
package/src/business_birth.ts
CHANGED
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from "./births.js";
|
|
21
21
|
import type { Field } from "./fields.js";
|
|
22
22
|
import {
|
|
23
|
+
AUTH_PROVIDER_EPOCH_CONSUMER,
|
|
23
24
|
AuthProvider,
|
|
24
25
|
authProvider,
|
|
25
26
|
authProviderCertificates,
|
|
@@ -48,21 +49,93 @@ import {
|
|
|
48
49
|
BirthAttestationLink,
|
|
49
50
|
birthAttestation,
|
|
50
51
|
seedBirthAttestation,
|
|
51
|
-
} from "./framework/
|
|
52
|
+
} from "./framework/receiving_group.js";
|
|
52
53
|
import { RelationTuple, relationTuplesByObject, writeTuple } from "./framework/relations.js";
|
|
53
54
|
import {
|
|
55
|
+
inheritedModelAuthorityGenesisStep,
|
|
56
|
+
modelAuthoritySeedBeforeWarrant,
|
|
57
|
+
seatInheritedModelAuthority,
|
|
58
|
+
} from "./framework/model_authority_seed.js";
|
|
59
|
+
import {
|
|
60
|
+
SIGNER_RELATION,
|
|
54
61
|
SignerDelegation,
|
|
55
62
|
enrollDelegation,
|
|
56
63
|
enrollFirstDevice,
|
|
57
64
|
enrollSigner,
|
|
58
65
|
identityRelations,
|
|
59
66
|
signerDelegationByUser,
|
|
67
|
+
signerObject,
|
|
60
68
|
} from "./framework/signing_identity.js";
|
|
61
69
|
import {
|
|
62
70
|
DomainInstallExecutor,
|
|
63
71
|
currentLawReference,
|
|
64
72
|
domainInstallGenesisOffer,
|
|
65
73
|
} from "./framework/domain_lifecycle.js";
|
|
74
|
+
import {
|
|
75
|
+
BirthOrigin,
|
|
76
|
+
FoundingPrincipal,
|
|
77
|
+
birthOriginVirginOnly,
|
|
78
|
+
foundingPrincipalVirginOnly,
|
|
79
|
+
seedBirthOrigin,
|
|
80
|
+
seedFoundingPrincipal,
|
|
81
|
+
} from "./framework/founding_genesis.js";
|
|
82
|
+
import {
|
|
83
|
+
enrollDevice,
|
|
84
|
+
principalScopeRelations,
|
|
85
|
+
readInheritedEnrollers,
|
|
86
|
+
relationTuplesByRelation,
|
|
87
|
+
revokeDevice,
|
|
88
|
+
} from "./framework/principal_enrollment.js";
|
|
89
|
+
import { readInheritedOperators, workspaceOperatorRelations } from "./framework/workspaces.js";
|
|
90
|
+
import {
|
|
91
|
+
delegatedRoleRelations,
|
|
92
|
+
delegatedRolesSteps,
|
|
93
|
+
grantDelegatedRole,
|
|
94
|
+
revokeDelegatedRole,
|
|
95
|
+
} from "./framework/delegated_roles.js";
|
|
96
|
+
import { consoleGovernanceLaw, inheritedGovernanceStep, INHERITED_SIGNER_GRANTOR } from "./framework/console_governance.js";
|
|
97
|
+
import { readFrameworkDeclaredRows } from "./read.js";
|
|
98
|
+
import { endorsementOf } from "./principal_evidence.js";
|
|
99
|
+
|
|
100
|
+
/** The `grantedBy` of every tuple `seedFoundingPrincipal` seats (`writeFoundingPrincipal` in
|
|
101
|
+
* framework/founding_genesis.ts); nothing else grants as it. */
|
|
102
|
+
const FOUNDING_GRANTOR = "genesis";
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* THE MODE IS SELECTED BY LAW, FROM THE PARENT'S STATE (identity target model D22). A parent founded
|
|
106
|
+
* by token-free genesis by P holds `workspace:self#admin@P` granted by {@link FOUNDING_GRANTOR}
|
|
107
|
+
* (`seedFoundingPrincipal`; nothing else grants admin as it), and P's founding key as a signer seated
|
|
108
|
+
* on its warrant-free prefix. When the birth's principal IS that founder (a founded Home birthing its
|
|
109
|
+
* owner's estate), the child is founded the same way: the author is its founding principal, with that
|
|
110
|
+
* key, and the parent's operators and enrollers. Every other parent (every workspace born on the
|
|
111
|
+
* certificate lane) keeps the historical recipe byte-for-byte, so live chains keep their path until
|
|
112
|
+
* regenerated. Both reads are the declared `relationTuplesByObject` every birth already captures.
|
|
113
|
+
*
|
|
114
|
+
* The founding key is P's one `genesis`-granted signer. A workspace founded on the e712cae05 law, whose
|
|
115
|
+
* inherited-governance step re-seated that same leaf as {@link INHERITED_SIGNER_GRANTOR} when P was also
|
|
116
|
+
* an inherited operator or enroller, has no `genesis` key left; there the key is P's one
|
|
117
|
+
* inheritance-granted signer instead. Current law never rewrites the founding leaf
|
|
118
|
+
* (`inheritedGovernanceStepFrom` skips it), so its founders keep exactly one `genesis` key. Anything
|
|
119
|
+
* else — no founding admin grant, or not exactly one such key — is not a founded parent of P.
|
|
120
|
+
*/
|
|
121
|
+
function foundedBirthKeyHash(principal: string): string | undefined {
|
|
122
|
+
const adminRow = readFrameworkDeclaredRows(relationTuplesByObject, RelationTuple, { object: "workspace:self" })
|
|
123
|
+
.find((candidate) => candidate.relation === "admin");
|
|
124
|
+
const admin = (adminRow?.subjects as Record<string, { status?: string; grantedBy?: string }> | undefined)?.[principal];
|
|
125
|
+
if (admin?.status !== "active" || admin.grantedBy !== FOUNDING_GRANTOR) return undefined;
|
|
126
|
+
const rows = readFrameworkDeclaredRows(relationTuplesByObject, RelationTuple, { object: signerObject(principal) });
|
|
127
|
+
const row = rows.find((candidate) => candidate.relation === SIGNER_RELATION);
|
|
128
|
+
const subjects = row?.subjects as Record<string, { status?: string; grantedBy?: string }> | undefined;
|
|
129
|
+
const keysGrantedBy = (grantor: string) => Object.entries(subjects ?? {})
|
|
130
|
+
.filter(([subject, leaf]) =>
|
|
131
|
+
leaf?.status === "active" && leaf.grantedBy === grantor && /^key:[0-9a-f]{64}$/.test(subject))
|
|
132
|
+
.map(([subject]) => subject.slice("key:".length))
|
|
133
|
+
.sort();
|
|
134
|
+
const genesis = keysGrantedBy(FOUNDING_GRANTOR);
|
|
135
|
+
if (genesis.length > 0) return genesis.length === 1 ? genesis[0] : undefined;
|
|
136
|
+
const inherited = keysGrantedBy(INHERITED_SIGNER_GRANTOR);
|
|
137
|
+
return inherited.length === 1 ? inherited[0] : undefined;
|
|
138
|
+
}
|
|
66
139
|
|
|
67
140
|
/** @internal Compiler-only domain enumeration. It carries no allowance or authority. */
|
|
68
141
|
export const BUSINESS_BIRTH_POLICY_DOMAINS_EXPORT = "__nomos_birth_policy_domains_c9f14a";
|
|
@@ -252,9 +325,28 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
252
325
|
const birthBase = directive(birthId)
|
|
253
326
|
.creates(decl.aggregate)
|
|
254
327
|
.payload(parentSchema)
|
|
255
|
-
.plan((p) => {
|
|
328
|
+
.plan((p, ctx) => {
|
|
256
329
|
const founder = p.principal as string;
|
|
257
330
|
const child = workspaceNameForKey(namespace, String(decl.key(p as P)));
|
|
331
|
+
const foundingKeyHash = foundedBirthKeyHash(founder);
|
|
332
|
+
const founded = foundingKeyHash !== undefined;
|
|
333
|
+
if (founded) {
|
|
334
|
+
// No certificate or token proves who the founder is, so the parent's own admission does: the
|
|
335
|
+
// birth's author — the principal the kernel authenticated from a signed key — must be the
|
|
336
|
+
// principal it founds. Nobody founds a workspace in someone else's name.
|
|
337
|
+
const author = endorsementOf(ctx.principal().asAttribution())?.principal ?? "";
|
|
338
|
+
if (author !== founder) {
|
|
339
|
+
throw new Error(
|
|
340
|
+
`birth(${decl.aggregate.id}): founded-business-birth-must-be-authored-by-its-founder ` +
|
|
341
|
+
`(principal '${founder}', author '${author}')`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
if (!Number.isFinite(Date.parse(String(p.bornAt)))) {
|
|
345
|
+
throw new Error(`birth(${decl.aggregate.id}): a founded birth needs bornAt as an ISO-8601 instant`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const inheritedEnrollers = founded ? readInheritedEnrollers() : [];
|
|
349
|
+
const inheritedOperators = founded ? readInheritedOperators() : [];
|
|
258
350
|
const childPayload = { ...(p as Record<string, unknown>) };
|
|
259
351
|
if (encryptedBirth) {
|
|
260
352
|
const sealedSeed = childPayload[BUSINESS_BIRTH_SEED_PAYLOAD_FIELD];
|
|
@@ -287,6 +379,33 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
287
379
|
setAt: p.bornAt,
|
|
288
380
|
},
|
|
289
381
|
})),
|
|
382
|
+
// The founder founds the child (D22): their key, themselves as admin, and the parent's operators
|
|
383
|
+
// and enrollers, in the one requires-free founding step on the warrant-free prefix.
|
|
384
|
+
...(founded
|
|
385
|
+
? [{
|
|
386
|
+
domain,
|
|
387
|
+
directiveId: seedFoundingPrincipal.id,
|
|
388
|
+
actor: founder,
|
|
389
|
+
payload: seedFoundingPrincipal.payloadSchema.parse({
|
|
390
|
+
principal: founder,
|
|
391
|
+
keyHash: foundingKeyHash,
|
|
392
|
+
operators: [...inheritedOperators],
|
|
393
|
+
enrollers: inheritedEnrollers.map((enroller) => ({
|
|
394
|
+
scope: enroller.scope,
|
|
395
|
+
subject: enroller.subject,
|
|
396
|
+
})),
|
|
397
|
+
grantedAt: Date.parse(String(p.bornAt)),
|
|
398
|
+
}) as Record<string, unknown>,
|
|
399
|
+
},
|
|
400
|
+
// The inherited operators' and enrollers' keys, and installDomain for the operators, so the
|
|
401
|
+
// jurisdiction can act here — enrol the founder's next device, roll out law — without the
|
|
402
|
+
// child ever being re-founded (framework/console_governance.ts).
|
|
403
|
+
...inheritedGovernanceStep(domain, founder, inheritedOperators, inheritedEnrollers, Date.parse(String(p.bornAt)),
|
|
404
|
+
{ principal: founder, keyHash: foundingKeyHash as string }),
|
|
405
|
+
// The roles the parent delegates into every child of this namespace its founder's scope
|
|
406
|
+
// founds (formerly a per-intent delegation certificate), as state tuples for the founder.
|
|
407
|
+
...delegatedRolesSteps(founder, founder, namespace, Date.parse(String(p.bornAt)))]
|
|
408
|
+
: []),
|
|
290
409
|
{
|
|
291
410
|
domain,
|
|
292
411
|
directiveId: seedId,
|
|
@@ -295,6 +414,13 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
295
414
|
},
|
|
296
415
|
];
|
|
297
416
|
|
|
417
|
+
if (founded) {
|
|
418
|
+
// No provider verifier, inherited model authority (operators ride the founding step instead),
|
|
419
|
+
// parent workspace role or epoch edge: those belong to the certificate lane's attestation.
|
|
420
|
+
birth({ workspace: child, genesisChain: chain });
|
|
421
|
+
return [];
|
|
422
|
+
}
|
|
423
|
+
|
|
298
424
|
const inheritedProvider = readAuthProviderVerifyingConfiguration();
|
|
299
425
|
if (inheritedProvider !== undefined) {
|
|
300
426
|
chain.push({
|
|
@@ -309,6 +435,11 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
309
435
|
},
|
|
310
436
|
});
|
|
311
437
|
}
|
|
438
|
+
// MODEL AUTHORITY DESCENDS (architecture/parent_directed_model_transition.md §4, lane A): the child is
|
|
439
|
+
// born holding this workspace's current installDomain holders + their devices (by induction, the
|
|
440
|
+
// platform's operators), so the platform's own signer may lawfully stage and promote law in it.
|
|
441
|
+
const inheritedAuthority = inheritedModelAuthorityGenesisStep(domain, founder, p.bornAt as string);
|
|
442
|
+
if (inheritedAuthority !== undefined) chain.push(inheritedAuthority);
|
|
312
443
|
birth({
|
|
313
444
|
workspace: child,
|
|
314
445
|
genesisChain: chain,
|
|
@@ -316,11 +447,25 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
316
447
|
? { parentWorkspaceRoles: decl.parentWorkspaceRoles }
|
|
317
448
|
: {}),
|
|
318
449
|
});
|
|
319
|
-
|
|
450
|
+
// THE INVERSE EPOCH EDGE: the born child may ask THIS workspace for its current verifier epoch
|
|
451
|
+
// (`nomosInternalServeAuthProviderEpoch7c1f5e` gates on it). Seated in the same plan that births
|
|
452
|
+
// the child, so neither the host nor the caller can redirect it; the child's own genesis seats the
|
|
453
|
+
// downward `authProviderAuthority` for this workspace (`parentWorkspaceRoles`).
|
|
454
|
+
return writeTuple({
|
|
455
|
+
object: "workspace:self",
|
|
456
|
+
relation: AUTH_PROVIDER_EPOCH_CONSUMER,
|
|
457
|
+
subject: `workspace:${child}`,
|
|
458
|
+
grantedBy: founder,
|
|
459
|
+
grantedAt: p.bornAt as string,
|
|
460
|
+
});
|
|
320
461
|
})
|
|
321
462
|
.reads(authProvider)
|
|
322
463
|
.reads(authProviderKeys)
|
|
323
464
|
.reads(authProviderCertificates)
|
|
465
|
+
.reads(relationTuplesByObject)
|
|
466
|
+
// Token-free founding: the enroller tuples a founded child inherits.
|
|
467
|
+
.reads(relationTuplesByRelation)
|
|
468
|
+
.alsoEnsures(RelationTuple)
|
|
324
469
|
.births();
|
|
325
470
|
|
|
326
471
|
const metadata: BusinessBirthMetadata = {
|
|
@@ -335,9 +480,12 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
335
480
|
genesisDirectiveIds: [
|
|
336
481
|
"enrollSigner",
|
|
337
482
|
"seedAuthProvider",
|
|
483
|
+
seatInheritedModelAuthority.id,
|
|
338
484
|
"seedBirthAttestation",
|
|
339
485
|
"seedGenesis",
|
|
340
486
|
"nomosBirthRecordEnsure",
|
|
487
|
+
seedFoundingPrincipal.id,
|
|
488
|
+
seedBirthOrigin.id,
|
|
341
489
|
],
|
|
342
490
|
founderRoles: decl.founderRoles,
|
|
343
491
|
founderScope: decl.founderScope,
|
|
@@ -357,7 +505,7 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
357
505
|
|
|
358
506
|
// THE SOVEREIGN-WORKSPACE CORE. These are ordinary law declarations, composed automatically so the
|
|
359
507
|
// tenant's one business declaration is also a complete child law: it can fold the kernel-injected
|
|
360
|
-
// travelling attestation + warrant, seat its founding device,
|
|
508
|
+
// travelling attestation + warrant, seat its founding device, bind its provider root, and verify itself
|
|
361
509
|
// offline after custody is moved or reopened. The generated tenant client hides every one of them.
|
|
362
510
|
__nomos_GenesisWarrant: internalSurface(GenesisWarrant),
|
|
363
511
|
__nomos_seedGenesis: internalDirective(seedGenesis),
|
|
@@ -376,6 +524,8 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
376
524
|
__nomos_AuthProvider: internalSurface(AuthProvider),
|
|
377
525
|
__nomos_seedAuthProvider: internalDirective(seedAuthProvider),
|
|
378
526
|
__nomos_authProviderSeedBeforeWarrant: internalSurface(authProviderSeedBeforeWarrant),
|
|
527
|
+
__nomos_seatInheritedModelAuthority: internalDirective(seatInheritedModelAuthority),
|
|
528
|
+
__nomos_modelAuthoritySeedBeforeWarrant: internalSurface(modelAuthoritySeedBeforeWarrant),
|
|
379
529
|
__nomos_setAuthProvider: internalDirective(setAuthProvider),
|
|
380
530
|
__nomos_authProvider: internalSurface(authProvider),
|
|
381
531
|
__nomos_authProviderKeys: internalSurface(authProviderKeys),
|
|
@@ -393,6 +543,33 @@ function lowerOne<P extends Record<string, unknown>, F extends Record<string, Fi
|
|
|
393
543
|
__nomos_birthPolicy: internalSurface(birthPolicy),
|
|
394
544
|
__nomos_birthGrantByPrincipal: internalSurface(birthGrantByPrincipal),
|
|
395
545
|
__nomos_parentAttestedBirth: internalSurface(businessParentAttestedBirth),
|
|
546
|
+
// TOKEN-FREE FOUNDING (D22). Child side: the founding step a founded recipe carries, the birth origin
|
|
547
|
+
// the kernel's founded birth effect appends before the warrant, the relations the founding step seats
|
|
548
|
+
// (operator, enroller), and the enrolled scope's device lane, so an enroller the child inherited
|
|
549
|
+
// enrols (and revokes) the founder's further devices there. Parent side: the enroller read the recipe
|
|
550
|
+
// captures.
|
|
551
|
+
__nomos_FoundingPrincipal: internalSurface(FoundingPrincipal),
|
|
552
|
+
__nomos_seedFoundingPrincipal: internalDirective(seedFoundingPrincipal),
|
|
553
|
+
__nomos_foundingPrincipalVirginOnly: internalSurface(foundingPrincipalVirginOnly),
|
|
554
|
+
__nomos_BirthOrigin: internalSurface(BirthOrigin),
|
|
555
|
+
__nomos_seedBirthOrigin: internalDirective(seedBirthOrigin),
|
|
556
|
+
__nomos_birthOriginVirginOnly: internalSurface(birthOriginVirginOnly),
|
|
557
|
+
__nomos_workspaceOperatorRelations: internalSurface(workspaceOperatorRelations),
|
|
558
|
+
__nomos_principalScopeRelations: internalSurface(principalScopeRelations),
|
|
559
|
+
__nomos_relationTuplesByRelation: internalSurface(relationTuplesByRelation),
|
|
560
|
+
__nomos_seedInheritedGovernance: internalDirective(consoleGovernanceLaw.seedInheritedGovernance),
|
|
561
|
+
__nomos_inheritedGovernanceBeforeWarrant: internalSurface(consoleGovernanceLaw.inheritedGovernanceBeforeWarrant),
|
|
562
|
+
__nomos_grantConsoleOperator: internalDirective(consoleGovernanceLaw.grantConsoleOperator),
|
|
563
|
+
__nomos_revokeConsoleOperator: internalDirective(consoleGovernanceLaw.revokeConsoleOperator),
|
|
564
|
+
__nomos_lastOperatorRemains: internalSurface(consoleGovernanceLaw.lastOperatorRemains),
|
|
565
|
+
__nomos_enrollConsoleSigner: internalDirective(consoleGovernanceLaw.enrollConsoleSigner),
|
|
566
|
+
__nomos_revokeConsoleSigner: internalDirective(consoleGovernanceLaw.revokeConsoleSigner),
|
|
567
|
+
__nomos_lastConsoleSignerRemains: internalSurface(consoleGovernanceLaw.lastConsoleSignerRemains),
|
|
568
|
+
__nomos_delegatedRoleRelations: internalSurface(delegatedRoleRelations),
|
|
569
|
+
__nomos_grantDelegatedRole: internalDirective(grantDelegatedRole),
|
|
570
|
+
__nomos_revokeDelegatedRole: internalDirective(revokeDelegatedRole),
|
|
571
|
+
__nomos_enrollDevice: internalDirective(enrollDevice),
|
|
572
|
+
__nomos_revokeDevice: internalDirective(revokeDevice),
|
|
396
573
|
};
|
|
397
574
|
}
|
|
398
575
|
|