@rathnasgala2/schemas 2.11.0 → 2.12.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/README.md +164 -56
- package/THIRD_PARTY_LICENSES.json +79 -106
- package/diagnostics/diagnostic-map.json +443 -405
- package/diagnostics/diagnostic-map.public-runtime-origins.json +5 -0
- package/docs/catalogs/schema-inventory.json +33 -54
- package/examples/valid/adapter-capability/rules.json +11 -0
- package/examples/valid/artifact-manifest/rules.json +156 -177
- package/examples/valid/build-input/rules.json +67 -63
- package/examples/valid/build-provenance/rules.json +151 -172
- package/examples/valid/deployment-intent/rules.json +152 -148
- package/examples/valid/deployment-observation/rules.json +24 -20
- package/examples/valid/deployment-receipt/rules.json +152 -148
- package/examples/valid/navigation/rules.json +2 -4
- package/examples/valid/theme-contract/rules.json +4 -1
- package/fixtures/boundary/adapter-capability/rules.json +16 -0
- package/fixtures/boundary/artifact-manifest/rules.json +195 -202
- package/fixtures/boundary/build-input/rules.json +99 -86
- package/fixtures/boundary/build-provenance/rules.json +193 -202
- package/fixtures/boundary/deployment-intent/rules.json +186 -140
- package/fixtures/boundary/deployment-observation/rules.json +68 -18
- package/fixtures/boundary/deployment-receipt/rules.json +186 -140
- package/fixtures/boundary/navigation/rules.json +2 -17
- package/fixtures/boundary/theme-contract/rules.json +34 -0
- package/fixtures/invalid/adapter-capability/SCHEMA_STRING_TOO_LONG/cases.json +11 -0
- package/fixtures/invalid/adapter-capability/UTF8_BYTE_LENGTH_INVALID/cases.json +11 -0
- package/fixtures/invalid/artifact-manifest/ASCII_BYTE_LENGTH_INVALID/cases.json +13 -0
- package/fixtures/invalid/artifact-manifest/INTEGER_RANGE_INVALID/cases.json +24 -0
- package/fixtures/invalid/artifact-manifest/REQUEST_FIELD_UNKNOWN/cases.json +19 -19
- package/fixtures/invalid/artifact-manifest/SCHEMA_CONSTANT_INVALID/cases.json +48 -48
- package/fixtures/invalid/artifact-manifest/SCHEMA_ENUM_INVALID/cases.json +11 -11
- package/fixtures/invalid/artifact-manifest/SCHEMA_FORMAT_INVALID/cases.json +0 -9
- package/fixtures/invalid/artifact-manifest/SCHEMA_NEGATED_RULE_MATCHED/cases.json +0 -11
- package/fixtures/invalid/artifact-manifest/SCHEMA_PATTERN_INVALID/cases.json +0 -22
- package/fixtures/invalid/artifact-manifest/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +1105 -1105
- package/fixtures/invalid/artifact-manifest/SCHEMA_STRING_TOO_LONG/cases.json +4 -6
- package/fixtures/invalid/artifact-manifest/SCHEMA_STRING_TOO_SHORT/cases.json +9 -11
- package/fixtures/invalid/artifact-manifest/SCHEMA_TYPE_INVALID/cases.json +22 -31
- package/fixtures/invalid/artifact-manifest/UTF8_BYTE_LENGTH_INVALID/cases.json +0 -11
- package/fixtures/invalid/build-input/INTEGER_RANGE_INVALID/cases.json +13 -0
- package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +32 -32
- package/fixtures/invalid/build-input/SCHEMA_CONSTANT_INVALID/cases.json +11 -11
- package/fixtures/invalid/build-input/SCHEMA_ENUM_INVALID/cases.json +11 -11
- package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +78 -78
- package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +51 -18
- package/fixtures/invalid/build-provenance/ASCII_BYTE_LENGTH_INVALID/cases.json +13 -0
- package/fixtures/invalid/build-provenance/INTEGER_RANGE_INVALID/cases.json +22 -0
- package/fixtures/invalid/build-provenance/REQUEST_FIELD_UNKNOWN/cases.json +56 -56
- package/fixtures/invalid/build-provenance/SCHEMA_CONSTANT_INVALID/cases.json +37 -37
- package/fixtures/invalid/build-provenance/SCHEMA_ENUM_INVALID/cases.json +11 -11
- package/fixtures/invalid/build-provenance/SCHEMA_FORMAT_INVALID/cases.json +0 -9
- package/fixtures/invalid/build-provenance/SCHEMA_NEGATED_RULE_MATCHED/cases.json +0 -11
- package/fixtures/invalid/build-provenance/SCHEMA_PATTERN_INVALID/cases.json +0 -22
- package/fixtures/invalid/build-provenance/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +927 -927
- package/fixtures/invalid/build-provenance/SCHEMA_STRING_TOO_LONG/cases.json +9 -11
- package/fixtures/invalid/build-provenance/SCHEMA_STRING_TOO_SHORT/cases.json +8 -10
- package/fixtures/invalid/build-provenance/SCHEMA_TYPE_INVALID/cases.json +20 -25
- package/fixtures/invalid/build-provenance/UTF8_BYTE_LENGTH_INVALID/cases.json +0 -11
- package/fixtures/invalid/deployment-intent/INTEGER_RANGE_INVALID/cases.json +24 -0
- package/fixtures/invalid/deployment-intent/REQUEST_FIELD_UNKNOWN/cases.json +30 -30
- package/fixtures/invalid/deployment-intent/SCHEMA_CONSTANT_INVALID/cases.json +41 -41
- package/fixtures/invalid/deployment-intent/SCHEMA_ENUM_INVALID/cases.json +11 -11
- package/fixtures/invalid/deployment-intent/SCHEMA_FORMAT_INVALID/cases.json +0 -9
- package/fixtures/invalid/deployment-intent/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +1209 -1209
- package/fixtures/invalid/deployment-intent/SCHEMA_STRING_TOO_LONG/cases.json +9 -0
- package/fixtures/invalid/deployment-intent/SCHEMA_STRING_TOO_SHORT/cases.json +9 -0
- package/fixtures/invalid/deployment-intent/SCHEMA_TYPE_INVALID/cases.json +22 -20
- package/fixtures/invalid/deployment-observation/INTEGER_RANGE_INVALID/cases.json +24 -0
- package/fixtures/invalid/deployment-observation/REQUEST_FIELD_UNKNOWN/cases.json +16 -16
- package/fixtures/invalid/deployment-observation/SCHEMA_FORMAT_INVALID/cases.json +0 -9
- package/fixtures/invalid/deployment-observation/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +39 -39
- package/fixtures/invalid/deployment-observation/SCHEMA_STRING_TOO_LONG/cases.json +11 -0
- package/fixtures/invalid/deployment-observation/SCHEMA_STRING_TOO_SHORT/cases.json +11 -0
- package/fixtures/invalid/deployment-observation/SCHEMA_TYPE_INVALID/cases.json +11 -11
- package/fixtures/invalid/deployment-receipt/INTEGER_RANGE_INVALID/cases.json +24 -0
- package/fixtures/invalid/deployment-receipt/REQUEST_FIELD_UNKNOWN/cases.json +70 -70
- package/fixtures/invalid/deployment-receipt/SCHEMA_CONSTANT_INVALID/cases.json +36 -36
- package/fixtures/invalid/deployment-receipt/SCHEMA_ENUM_INVALID/cases.json +11 -11
- package/fixtures/invalid/deployment-receipt/SCHEMA_FORMAT_INVALID/cases.json +0 -9
- package/fixtures/invalid/deployment-receipt/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +1304 -1304
- package/fixtures/invalid/deployment-receipt/SCHEMA_STRING_TOO_LONG/cases.json +9 -0
- package/fixtures/invalid/deployment-receipt/SCHEMA_STRING_TOO_SHORT/cases.json +9 -0
- package/fixtures/invalid/deployment-receipt/SCHEMA_TYPE_INVALID/cases.json +22 -20
- package/fixtures/invalid/navigation/SCHEMA_ARRAY_TOO_LONG/cases.json +0 -15
- package/fixtures/invalid/navigation/SCHEMA_CONSTANT_INVALID/cases.json +11 -0
- package/fixtures/invalid/navigation/SCHEMA_TYPE_INVALID/cases.json +0 -11
- package/fixtures/invalid/theme-contract/INTEGER_RANGE_INVALID/cases.json +11 -0
- package/fixtures/invalid/theme-contract/SCHEMA_FORMAT_INVALID/cases.json +0 -9
- package/fixtures/invalid/theme-contract/SCHEMA_STRING_TOO_LONG/cases.json +9 -0
- package/fixtures/invalid/theme-contract/SCHEMA_STRING_TOO_SHORT/cases.json +9 -0
- package/fixtures/manifest.json +3217 -2930
- package/fixtures/unknown-field/adapter-capability/rules.json +2 -0
- package/fixtures/unknown-field/artifact-manifest/rules.json +111 -114
- package/fixtures/unknown-field/build-input/rules.json +36 -32
- package/fixtures/unknown-field/build-provenance/rules.json +111 -114
- package/fixtures/unknown-field/deployment-intent/rules.json +109 -105
- package/fixtures/unknown-field/deployment-observation/rules.json +24 -20
- package/fixtures/unknown-field/deployment-receipt/rules.json +109 -105
- package/fixtures/unknown-field/navigation/rules.json +1 -3
- package/fixtures/unknown-field/theme-contract/rules.json +3 -0
- package/generated/browser/runtime-origins-validator-core.d.mts +10 -0
- package/generated/browser/runtime-origins-validator-core.mjs +35 -0
- package/generated/browser/validator-core.d.mts +10 -0
- package/generated/browser/validator-core.mjs +80 -0
- package/generated/typescript/contracts/artifact-manifest.d.ts +49 -48
- package/generated/typescript/contracts/build-input.d.ts +15 -15
- package/generated/typescript/contracts/build-provenance.d.ts +51 -50
- package/generated/typescript/contracts/deployment-intent.d.ts +6 -6
- package/generated/typescript/contracts/deployment-observation.d.ts +1 -1
- package/generated/typescript/contracts/deployment-receipt.d.ts +5 -5
- package/generated/typescript/contracts/navigation.d.ts +1 -1
- package/generated/typescript/index.js +11 -37
- package/openapi/http-catalog.json +2 -2
- package/openapi/openapi.yaml +18 -10
- package/package.json +19 -16
- package/sbom.cdx.json +23 -23
- package/schemas/adapter-capability.schema.json +5 -1
- package/schemas/appearance.schema.json +1 -1
- package/schemas/artifact-manifest.schema.json +15 -18
- package/schemas/build-input.schema.json +18 -11
- package/schemas/build-provenance.schema.json +15 -18
- package/schemas/deployment-intent.schema.json +13 -8
- package/schemas/deployment-observation.schema.json +10 -5
- package/schemas/deployment-receipt.schema.json +12 -7
- package/schemas/navigation.schema.json +5 -26
- package/schemas/theme-contract.schema.json +4 -2
- package/src/index.js +2 -2
- package/src/internal/browser-schema-validator.js +43 -0
- package/src/internal/format-validators.js +1 -1
- package/src/internal/gala-keywords.js +148 -0
- package/src/internal/validator-core.js +244 -108
- package/src/runtime-origins.js +18 -18
- package/types/index.d.ts +2 -2
- package/types/internal/browser-schema-validator.d.ts +16 -0
- package/types/internal/format-validators.d.ts +1 -1
- package/types/internal/gala-keywords.d.ts +68 -0
- package/types/internal/validator-core.d.ts +80 -1
- package/compatibility/compatibility.json +0 -594
- package/generated/java/src/main/java/io/gala/schema/generated/GalaSchemaRegistry.java +0 -67
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityAdapterConfigurationCapabilities.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityAdapterIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityCapabilityDecision.java +0 -62
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityCredentialEgressProfile.java +0 -35
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityDestinationIdentity.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityDestinationProviderCoordinates.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityDocument.java +0 -52
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityFilesystemProviderLimits.java +0 -32
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityGithubActionsOidcOriginCatalog.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityHttpProviderLimits.java +0 -72
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemAllowlist.java +0 -21
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemAllowlistEntry.java +0 -28
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemCapabilityEvidence.java +0 -42
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemControlPublication.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemControlRow.java +0 -44
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemFailureEvidence.java +0 -40
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemObservationEvidence.java +0 -40
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemPlatform.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemProbeSummary.java +0 -32
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemProbeTranscript.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemReplacement.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityLocalFilesystemSurfaceIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityManagedExecutionBudget.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityPagesOidcCredentialEgress.java +0 -30
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityProviderCallClassBinding.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityProviderCredentialEgress.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityProviderCredentialHeader.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityProviderDerivedHeader.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityProviderFixedHeader.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilityProviderRequestTemplate.java +0 -39
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilitySpacesControlPlaneBinding.java +0 -32
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilitySpacesControlPlaneRequest.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilitySpacesControlPlaneRequestCatalog.java +0 -31
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilitySpacesControlPlaneResponseCatalog.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/AdapterCapabilitySpacesWebsiteConfiguration.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/AppearanceColorMode.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/AppearanceDocument.java +0 -37
- package/generated/java/src/main/java/io/gala/schema/generated/model/AppearanceExtensionMap.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/AppearanceSemanticTokens.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestActionPinEvidence.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestArtifactLicenseConclusion.java +0 -21
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestAssertedWorkload.java +0 -44
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestBuildSandboxEvidence.java +0 -38
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestDocument.java +0 -73
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestFinding.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestAsset.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestCompositionIdentity.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestExcludedInput.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestIncludedSource.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestRedirect.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestRoute.java +0 -28
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestSourceIdentity.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestManifestValidationEvidence.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestMeasurement.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestPackageIdentity.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestRenderPolicyIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestReproducibleBuildRecord.java +0 -56
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestWorkflowCarrierEvidence.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/ArtifactManifestWorkflowFileEvidence.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/AuthorDocument.java +0 -33
- package/generated/java/src/main/java/io/gala/schema/generated/model/AuthorExtensionMap.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/AuthorLocalizedAuthor.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/AuthorSocialLink.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputAdapterIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputAppearanceNormalized.java +0 -33
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputAuthorNormalized.java +0 -31
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputBuildPackages.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputColorMode.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputContentBuildRecord.java +0 -33
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputContentFrontmatterNormalized.java +0 -44
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputDestinationCapabilityProfile.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputDocument.java +0 -51
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputLocalizedAuthor.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputModuleBuildSelection.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputNavigationItem.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputNavigationLeaf.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputNavigationNormalized.java +0 -21
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputPackageIdentity.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputPublicationNormalized.java +0 -39
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputRenderPolicyIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputRenderableBody.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputRepositorySnapshot.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputResolvedFile.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputResolvedMedia.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputSemanticTokens.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildInputSocialLink.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceActionPinEvidence.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceArtifactLicenseConclusion.java +0 -21
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceAssertedWorkload.java +0 -44
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceBuildSandboxEvidence.java +0 -38
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceDocument.java +0 -69
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceFinding.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestAsset.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestCompositionIdentity.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestExcludedInput.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestIncludedSource.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestRedirect.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestRoute.java +0 -28
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestSourceIdentity.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceManifestValidationEvidence.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceMeasurement.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenancePackageIdentity.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceRenderPolicyIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceReproducibleBuildRecord.java +0 -56
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceWorkflowCarrierEvidence.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/BuildProvenanceWorkflowFileEvidence.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/ContentFrontmatterDocument.java +0 -50
- package/generated/java/src/main/java/io/gala/schema/generated/model/ContentFrontmatterExtensionMap.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/ContentFrontmatterMediaRef.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentActivationBasis.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentActivationDetectionObservation.java +0 -33
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentActivationDetectionPlan.java +0 -44
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentActivationDetectionProbe.java +0 -52
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentAdapterIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentCancellationFinalizationEvidence.java +0 -41
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentDeadlineFinalizationEvidence.java +0 -39
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentDeadlineFinalizationStream.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentDeploymentPolicyDecision.java +0 -75
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentDestinationIdentity.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentDestinationMutationAuthority.java +0 -36
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentDestinationProviderCoordinates.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentDocument.java +0 -136
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentExpectedRedirectHop.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentObservedVerificationHeader.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentPackageIdentity.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentPagesInterveningRunAttempt.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentPagesReconciliationCommand.java +0 -48
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentPagesReconciliationRecovery.java +0 -41
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentPagesRunAttemptGapProof.java +0 -27
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentPublicGenerationMarkerPayload.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentPublicProbeObservation.java +0 -54
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentRecognizedPriorRouteContract.java +0 -30
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentRenderPolicyIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentReproducibleBuildRecord.java +0 -56
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentSupersessionFinalizationEvidence.java +0 -45
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentVerificationHeaderExpectation.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentIntentVerificationPlanTarget.java +0 -52
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationActivationDetectionObservation.java +0 -33
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationActivationDetectionProbe.java +0 -52
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationAdapterIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationCancellationFinalizationEvidence.java +0 -41
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationDeadlineFinalizationEvidence.java +0 -39
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationDeadlineFinalizationStream.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationDestinationIdentity.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationDestinationProviderCoordinates.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationDocument.java +0 -57
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationExpectedRedirectHop.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationObservedVerificationHeader.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationPackageIdentity.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationPublicProbeObservation.java +0 -54
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationRecognizedPriorRouteContract.java +0 -30
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationRenderPolicyIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationSupersessionFinalizationEvidence.java +0 -45
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationVerificationHeaderExpectation.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentObservationVerificationPlanTarget.java +0 -52
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptActivationBasis.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptActivationDetectionObservation.java +0 -33
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptActivationDetectionPlan.java +0 -44
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptActivationDetectionProbe.java +0 -52
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptAdapterIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptCancellationFinalizationEvidence.java +0 -41
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeadlineFinalizationEvidence.java +0 -39
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeadlineFinalizationStream.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentAttempt.java +0 -38
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentFailure.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentObservation.java +0 -53
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentPolicyDecision.java +0 -75
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentStageEvidence.java +0 -36
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentStageInput.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentStageObservationEvidenceReference.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDeploymentStageResult.java +0 -31
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDestinationIdentity.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDestinationMutationAuthority.java +0 -36
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDestinationProviderCoordinates.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptDocument.java +0 -105
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptExpectedRedirectHop.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptFinding.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptObservedVerificationHeader.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptPackageIdentity.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptPagesInterveningRunAttempt.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptPagesReconciliationCommand.java +0 -48
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptPagesReconciliationRecovery.java +0 -41
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptPagesRunAttemptGapProof.java +0 -27
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptPublicGenerationMarkerPayload.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptPublicProbeObservation.java +0 -54
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptRecognizedPriorRouteContract.java +0 -30
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptRenderPolicyIdentity.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptReproducibleBuildRecord.java +0 -56
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptSupersessionFinalizationEvidence.java +0 -45
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptVerificationHeaderExpectation.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/DeploymentReceiptVerificationPlanTarget.java +0 -52
- package/generated/java/src/main/java/io/gala/schema/generated/model/EventEnvelopeDocument.java +0 -46
- package/generated/java/src/main/java/io/gala/schema/generated/model/EventEnvelopeRegisteredEventPayload.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/LockDependencyEdge.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/LockDocument.java +0 -39
- package/generated/java/src/main/java/io/gala/schema/generated/model/LockLockedPackage.java +0 -26
- package/generated/java/src/main/java/io/gala/schema/generated/model/LockLockedTemplate.java +0 -28
- package/generated/java/src/main/java/io/gala/schema/generated/model/LockPackageIdentity.java +0 -22
- package/generated/java/src/main/java/io/gala/schema/generated/model/NavigationDocument.java +0 -25
- package/generated/java/src/main/java/io/gala/schema/generated/model/NavigationExtensionMap.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/NavigationNavigationItem.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/NavigationNavigationLeaf.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/ProblemDocument.java +0 -37
- package/generated/java/src/main/java/io/gala/schema/generated/model/ProblemFieldError.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/PublicGenerationMarkerDocument.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/PublicRuntimeOriginsDocument.java +0 -44
- package/generated/java/src/main/java/io/gala/schema/generated/model/PublicationDocument.java +0 -41
- package/generated/java/src/main/java/io/gala/schema/generated/model/PublicationExtensionMap.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/PublicationFooterCard.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/PublicationPublicationProfile.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/PublicationSocialLink.java +0 -19
- package/generated/java/src/main/java/io/gala/schema/generated/model/RepositoryAssetRoot.java +0 -16
- package/generated/java/src/main/java/io/gala/schema/generated/model/RepositoryContentRoot.java +0 -23
- package/generated/java/src/main/java/io/gala/schema/generated/model/RepositoryDocument.java +0 -41
- package/generated/java/src/main/java/io/gala/schema/generated/model/RepositoryExtensionMap.java +0 -15
- package/generated/java/src/main/java/io/gala/schema/generated/model/RepositoryGeneratedRoot.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/TemplateCompositionDocument.java +0 -18
- package/generated/java/src/main/java/io/gala/schema/generated/model/ThemeContractDocument.java +0 -53
- package/generated/java/src/main/java/io/gala/schema/generated/model/ThemeContractPassiveAsset.java +0 -24
- package/generated/java/src/main/java/io/gala/schema/generated/model/ThemeContractThemeBudgets.java +0 -20
- package/generated/java/src/main/java/io/gala/schema/generated/model/ThemeContractThemeToken.java +0 -22
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/adapter-capability.schema.json +0 -2689
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/appearance.schema.json +0 -226
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/artifact-manifest.schema.json +0 -1063
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/author.schema.json +0 -231
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/build-input.schema.json +0 -866
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/build-provenance.schema.json +0 -937
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/content-frontmatter.schema.json +0 -241
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/deployment-intent.schema.json +0 -2067
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/deployment-observation.schema.json +0 -1654
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/deployment-receipt.schema.json +0 -5546
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/event-envelope.schema.json +0 -195
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/lock.schema.json +0 -326
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/navigation.schema.json +0 -229
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/problem.schema.json +0 -194
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/public-generation-marker.schema.json +0 -142
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/public-runtime-origins.schema.json +0 -183
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/publication.schema.json +0 -248
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/repository.schema.json +0 -219
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/template-composition.schema.json +0 -133
- package/generated/java/src/main/resources/io/gala/schema/generated/schemas/theme-contract.schema.json +0 -850
- package/generated/typescript/validator-core.cjs +0 -17
- package/openapi/generator/spring.json +0 -22
- package/openapi/generator/typescript-fetch.json +0 -19
- package/openapi/source/authentication.yaml +0 -557
- package/openapi/source/callbacks.yaml +0 -332
- package/openapi/source/components.yaml +0 -5670
- package/openapi/source/github.yaml +0 -351
- package/openapi/source/internal.yaml +0 -71
- package/openapi/source/membership-invitations.yaml +0 -203
- package/openapi/source/organizations.yaml +0 -11144
- package/openapi/source/root.yaml +0 -20
- package/openapi/source/self.yaml +0 -1940
- package/openapi/source/session.yaml +0 -308
- package/openapi/source/workloads.yaml +0 -744
- package/src/internal/build-artifact-semantics.js +0 -4391
- package/src/internal/deployment-record-semantics.js +0 -7567
- package/src/internal/deployment-stage-semantics.js +0 -1207
- package/src/internal/http-problem-contract.js +0 -35
- package/src/internal/managed-evidence-journal.js +0 -160
- package/src/internal/public-runtime-origins.js +0 -143
- package/src/internal/theme-composition-semantics.js +0 -2441
- package/types/internal/build-artifact-semantics.d.ts +0 -77
- package/types/internal/deployment-record-semantics.d.ts +0 -313
- package/types/internal/deployment-stage-semantics.d.ts +0 -108
- package/types/internal/http-problem-contract.d.ts +0 -4
- package/types/internal/managed-evidence-journal.d.ts +0 -26
- package/types/internal/public-runtime-origins.d.ts +0 -22
- package/types/internal/theme-composition-semantics.d.ts +0 -143
|
@@ -1,1207 +0,0 @@
|
|
|
1
|
-
import { canonicalizeJcs, canonicalizeJcsBytes } from './canonical-jcs.js';
|
|
2
|
-
import { ACTIVE_DIGEST_PROFILES } from './digest-profiles.js';
|
|
3
|
-
import { validateRfc3339 } from './portable-scalars.js';
|
|
4
|
-
import { SemanticValidationError } from './semver.js';
|
|
5
|
-
|
|
6
|
-
const DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/u;
|
|
7
|
-
const STABLE_ID_PATTERN =
|
|
8
|
-
/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
|
|
9
|
-
const NONNEGATIVE_INT64_PATTERN = /^(?:0|[1-9][0-9]*)$/u;
|
|
10
|
-
const INT64_MAXIMUM = 9_223_372_036_854_775_807n;
|
|
11
|
-
|
|
12
|
-
const PROBE_PROFILE = 'gala-local-filesystem-probe-transcript-v2';
|
|
13
|
-
const PROBE_PAYLOAD_PROFILE = 'gala-local-filesystem-probe-payload-v2';
|
|
14
|
-
|
|
15
|
-
const STAGES = [
|
|
16
|
-
'staging',
|
|
17
|
-
'activation',
|
|
18
|
-
'public-verification',
|
|
19
|
-
'managed-reconciliation',
|
|
20
|
-
'cleanup',
|
|
21
|
-
];
|
|
22
|
-
const DESTINATION_CHANGES = ['yes', 'no', 'unknown'];
|
|
23
|
-
const TERMINAL_OUTCOMES = ['succeeded', 'failed', 'skipped', 'unknown'];
|
|
24
|
-
const ALL_OUTCOMES = ['not-started', 'running', ...TERMINAL_OUTCOMES];
|
|
25
|
-
const PROBE_PAYLOAD_SOURCES = ['control', 'race-a', 'race-b'];
|
|
26
|
-
|
|
27
|
-
const TRANSCRIPT_KEYS = [
|
|
28
|
-
'profile',
|
|
29
|
-
'initialTarget',
|
|
30
|
-
'replacements',
|
|
31
|
-
'controlPublication',
|
|
32
|
-
'racePublication',
|
|
33
|
-
];
|
|
34
|
-
const REPLACEMENT_KEYS = [
|
|
35
|
-
'operationNumber',
|
|
36
|
-
'preparedTarget',
|
|
37
|
-
'renameResult',
|
|
38
|
-
'readerResult',
|
|
39
|
-
];
|
|
40
|
-
const CONTROL_PUBLICATION_KEYS = [
|
|
41
|
-
'publisherSource',
|
|
42
|
-
'publicationResult',
|
|
43
|
-
'conflictingSource',
|
|
44
|
-
'conflictingResult',
|
|
45
|
-
'publishedInodeSource',
|
|
46
|
-
'publishedByteSource',
|
|
47
|
-
];
|
|
48
|
-
const RACE_PUBLICATION_KEYS = [
|
|
49
|
-
'contenders',
|
|
50
|
-
'winner',
|
|
51
|
-
'publishedInodeSource',
|
|
52
|
-
'publishedByteSource',
|
|
53
|
-
];
|
|
54
|
-
const RACE_CONTENDER_KEYS = ['source', 'linkResult'];
|
|
55
|
-
|
|
56
|
-
const LOCAL_OBSERVATION_REQUIRED_KEYS = [
|
|
57
|
-
'profile',
|
|
58
|
-
'filesystemEvidenceDigest',
|
|
59
|
-
'rootIdentityDigest',
|
|
60
|
-
'operationId',
|
|
61
|
-
'attemptId',
|
|
62
|
-
'stageAttemptId',
|
|
63
|
-
'observedCurrentState',
|
|
64
|
-
'controlHeadDigest',
|
|
65
|
-
'observedAt',
|
|
66
|
-
'evidenceDigest',
|
|
67
|
-
];
|
|
68
|
-
const LOCAL_OBSERVATION_OPTIONAL_KEYS = [
|
|
69
|
-
'expectedGenerationId',
|
|
70
|
-
'observedGenerationId',
|
|
71
|
-
'observedArtifactDigest',
|
|
72
|
-
'observedMarkerDigest',
|
|
73
|
-
'observedFileCount',
|
|
74
|
-
'observedByteCount',
|
|
75
|
-
];
|
|
76
|
-
const LOCAL_OBSERVATION_STATE_KEYS = [
|
|
77
|
-
'observedGenerationId',
|
|
78
|
-
'observedArtifactDigest',
|
|
79
|
-
'observedMarkerDigest',
|
|
80
|
-
'observedFileCount',
|
|
81
|
-
'observedByteCount',
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
const STAGE_INPUT_KEYS = [
|
|
85
|
-
'profile',
|
|
86
|
-
'intentDigest',
|
|
87
|
-
'destinationMutationAuthority',
|
|
88
|
-
'stageAttemptId',
|
|
89
|
-
'causationId',
|
|
90
|
-
'stage',
|
|
91
|
-
];
|
|
92
|
-
const STAGE_RESULT_REQUIRED_KEYS = [
|
|
93
|
-
'profile',
|
|
94
|
-
'stageInput',
|
|
95
|
-
'inputDigest',
|
|
96
|
-
'outcome',
|
|
97
|
-
'destinationChanged',
|
|
98
|
-
'retryable',
|
|
99
|
-
'finalizationObservation',
|
|
100
|
-
];
|
|
101
|
-
const STAGE_RESULT_OPTIONAL_KEYS = ['failureCode', 'startedAt', 'completedAt'];
|
|
102
|
-
const STAGE_EVIDENCE_REQUIRED_KEYS = [
|
|
103
|
-
'profile',
|
|
104
|
-
'stageInput',
|
|
105
|
-
'inputDigest',
|
|
106
|
-
'outcome',
|
|
107
|
-
'destinationChanged',
|
|
108
|
-
'retryable',
|
|
109
|
-
'observationEvidence',
|
|
110
|
-
'evidenceDigest',
|
|
111
|
-
];
|
|
112
|
-
const STAGE_EVIDENCE_OPTIONAL_KEYS = [
|
|
113
|
-
'failureCode',
|
|
114
|
-
'startedAt',
|
|
115
|
-
'completedAt',
|
|
116
|
-
'stageResult',
|
|
117
|
-
'resultDigest',
|
|
118
|
-
];
|
|
119
|
-
const OBSERVATION_REFERENCE_KEYS = ['observationId', 'evidenceDigest'];
|
|
120
|
-
const ATTEMPT_REQUIRED_KEYS = [
|
|
121
|
-
'attemptId',
|
|
122
|
-
'stageAttemptId',
|
|
123
|
-
'causationId',
|
|
124
|
-
'stage',
|
|
125
|
-
'sequence',
|
|
126
|
-
'outcome',
|
|
127
|
-
'destinationChanged',
|
|
128
|
-
'inputDigest',
|
|
129
|
-
'retryable',
|
|
130
|
-
'evidenceDigest',
|
|
131
|
-
];
|
|
132
|
-
const ATTEMPT_OPTIONAL_KEYS = [
|
|
133
|
-
'resultDigest',
|
|
134
|
-
'failureCode',
|
|
135
|
-
'startedAt',
|
|
136
|
-
'completedAt',
|
|
137
|
-
];
|
|
138
|
-
const COPIED_RESULT_FIELDS = [
|
|
139
|
-
'outcome',
|
|
140
|
-
'destinationChanged',
|
|
141
|
-
'failureCode',
|
|
142
|
-
'retryable',
|
|
143
|
-
'startedAt',
|
|
144
|
-
'completedAt',
|
|
145
|
-
];
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* @typedef {{ stage: string, code: string, outcome: string, destinationChanges: readonly string[], retryable: boolean }} FailureCatalogRow
|
|
149
|
-
*/
|
|
150
|
-
|
|
151
|
-
/** @type {readonly FailureCatalogRow[]} */
|
|
152
|
-
const FAILURE_CATALOG = [
|
|
153
|
-
{
|
|
154
|
-
stage: 'staging',
|
|
155
|
-
code: 'TARGET_CAPABILITY_UNAVAILABLE',
|
|
156
|
-
outcome: 'failed',
|
|
157
|
-
destinationChanges: ['no'],
|
|
158
|
-
retryable: false,
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
stage: 'staging',
|
|
162
|
-
code: 'ATOMIC_ACTIVATION_UNSUPPORTED',
|
|
163
|
-
outcome: 'failed',
|
|
164
|
-
destinationChanges: ['no'],
|
|
165
|
-
retryable: false,
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
stage: 'staging',
|
|
169
|
-
code: 'REJECTED',
|
|
170
|
-
outcome: 'failed',
|
|
171
|
-
destinationChanges: ['no'],
|
|
172
|
-
retryable: false,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
stage: 'staging',
|
|
176
|
-
code: 'NOT_ATTEMPTED_RETRYABLE',
|
|
177
|
-
outcome: 'failed',
|
|
178
|
-
destinationChanges: ['no'],
|
|
179
|
-
retryable: true,
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
stage: 'staging',
|
|
183
|
-
code: 'AUTHORIZATION_LOST',
|
|
184
|
-
outcome: 'failed',
|
|
185
|
-
destinationChanges: ['no'],
|
|
186
|
-
retryable: false,
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
stage: 'staging',
|
|
190
|
-
code: 'RATE_LIMITED',
|
|
191
|
-
outcome: 'failed',
|
|
192
|
-
destinationChanges: ['no'],
|
|
193
|
-
retryable: true,
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
stage: 'staging',
|
|
197
|
-
code: 'PROVIDER_CONTRACT_VIOLATION',
|
|
198
|
-
outcome: 'failed',
|
|
199
|
-
destinationChanges: ['no'],
|
|
200
|
-
retryable: false,
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
stage: 'staging',
|
|
204
|
-
code: 'OUTCOME_UNKNOWN_RECONCILING',
|
|
205
|
-
outcome: 'unknown',
|
|
206
|
-
destinationChanges: ['unknown', 'yes'],
|
|
207
|
-
retryable: false,
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
stage: 'activation',
|
|
211
|
-
code: 'REJECTED',
|
|
212
|
-
outcome: 'failed',
|
|
213
|
-
destinationChanges: ['no'],
|
|
214
|
-
retryable: false,
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
stage: 'activation',
|
|
218
|
-
code: 'NOT_ATTEMPTED_RETRYABLE',
|
|
219
|
-
outcome: 'failed',
|
|
220
|
-
destinationChanges: ['no'],
|
|
221
|
-
retryable: true,
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
stage: 'activation',
|
|
225
|
-
code: 'AUTHORIZATION_LOST',
|
|
226
|
-
outcome: 'failed',
|
|
227
|
-
destinationChanges: ['no'],
|
|
228
|
-
retryable: false,
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
stage: 'activation',
|
|
232
|
-
code: 'RATE_LIMITED',
|
|
233
|
-
outcome: 'failed',
|
|
234
|
-
destinationChanges: ['no'],
|
|
235
|
-
retryable: true,
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
stage: 'activation',
|
|
239
|
-
code: 'PROVIDER_CONTRACT_VIOLATION',
|
|
240
|
-
outcome: 'failed',
|
|
241
|
-
destinationChanges: ['no'],
|
|
242
|
-
retryable: false,
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
stage: 'activation',
|
|
246
|
-
code: 'OUTCOME_UNKNOWN_RECONCILING',
|
|
247
|
-
outcome: 'unknown',
|
|
248
|
-
destinationChanges: ['unknown', 'yes'],
|
|
249
|
-
retryable: false,
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
stage: 'public-verification',
|
|
253
|
-
code: 'PUBLIC_VERIFICATION_INCONCLUSIVE',
|
|
254
|
-
outcome: 'unknown',
|
|
255
|
-
destinationChanges: ['unknown', 'yes'],
|
|
256
|
-
retryable: false,
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
stage: 'public-verification',
|
|
260
|
-
code: 'PUBLIC_INTEGRITY_MISMATCH',
|
|
261
|
-
outcome: 'failed',
|
|
262
|
-
destinationChanges: ['unknown', 'yes'],
|
|
263
|
-
retryable: false,
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
stage: 'managed-reconciliation',
|
|
267
|
-
code: 'REJECTED',
|
|
268
|
-
outcome: 'failed',
|
|
269
|
-
destinationChanges: ['no'],
|
|
270
|
-
retryable: false,
|
|
271
|
-
},
|
|
272
|
-
{
|
|
273
|
-
stage: 'managed-reconciliation',
|
|
274
|
-
code: 'NOT_ATTEMPTED_RETRYABLE',
|
|
275
|
-
outcome: 'unknown',
|
|
276
|
-
destinationChanges: ['unknown', 'yes'],
|
|
277
|
-
retryable: true,
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
stage: 'managed-reconciliation',
|
|
281
|
-
code: 'AUTHORIZATION_LOST',
|
|
282
|
-
outcome: 'unknown',
|
|
283
|
-
destinationChanges: ['unknown', 'yes'],
|
|
284
|
-
retryable: false,
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
stage: 'managed-reconciliation',
|
|
288
|
-
code: 'RATE_LIMITED',
|
|
289
|
-
outcome: 'unknown',
|
|
290
|
-
destinationChanges: ['unknown', 'yes'],
|
|
291
|
-
retryable: true,
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
stage: 'managed-reconciliation',
|
|
295
|
-
code: 'OUTCOME_UNKNOWN_RECONCILING',
|
|
296
|
-
outcome: 'unknown',
|
|
297
|
-
destinationChanges: ['unknown', 'yes'],
|
|
298
|
-
retryable: false,
|
|
299
|
-
},
|
|
300
|
-
{
|
|
301
|
-
stage: 'managed-reconciliation',
|
|
302
|
-
code: 'PROVIDER_CONTRACT_VIOLATION',
|
|
303
|
-
outcome: 'failed',
|
|
304
|
-
destinationChanges: ['unknown', 'yes'],
|
|
305
|
-
retryable: false,
|
|
306
|
-
},
|
|
307
|
-
{
|
|
308
|
-
stage: 'cleanup',
|
|
309
|
-
code: 'REJECTED',
|
|
310
|
-
outcome: 'failed',
|
|
311
|
-
destinationChanges: ['no', 'yes'],
|
|
312
|
-
retryable: false,
|
|
313
|
-
},
|
|
314
|
-
{
|
|
315
|
-
stage: 'cleanup',
|
|
316
|
-
code: 'NOT_ATTEMPTED_RETRYABLE',
|
|
317
|
-
outcome: 'failed',
|
|
318
|
-
destinationChanges: ['no', 'yes'],
|
|
319
|
-
retryable: true,
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
stage: 'cleanup',
|
|
323
|
-
code: 'AUTHORIZATION_LOST',
|
|
324
|
-
outcome: 'failed',
|
|
325
|
-
destinationChanges: ['no', 'yes'],
|
|
326
|
-
retryable: false,
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
stage: 'cleanup',
|
|
330
|
-
code: 'RATE_LIMITED',
|
|
331
|
-
outcome: 'failed',
|
|
332
|
-
destinationChanges: ['no', 'yes'],
|
|
333
|
-
retryable: true,
|
|
334
|
-
},
|
|
335
|
-
{
|
|
336
|
-
stage: 'cleanup',
|
|
337
|
-
code: 'OUTCOME_UNKNOWN_RECONCILING',
|
|
338
|
-
outcome: 'unknown',
|
|
339
|
-
destinationChanges: ['unknown', 'yes'],
|
|
340
|
-
retryable: false,
|
|
341
|
-
},
|
|
342
|
-
{
|
|
343
|
-
stage: 'cleanup',
|
|
344
|
-
code: 'PROVIDER_CONTRACT_VIOLATION',
|
|
345
|
-
outcome: 'failed',
|
|
346
|
-
destinationChanges: ['no', 'yes'],
|
|
347
|
-
retryable: false,
|
|
348
|
-
},
|
|
349
|
-
];
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Throw an internal assertion failure.
|
|
353
|
-
*
|
|
354
|
-
* @returns {never} never returns
|
|
355
|
-
*/
|
|
356
|
-
function fail() {
|
|
357
|
-
throw new TypeError('DEPLOYMENT_STAGE_ASSERTION_FAILED');
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Throw a stable public semantic diagnostic.
|
|
362
|
-
*
|
|
363
|
-
* @param {string} code diagnostic code
|
|
364
|
-
* @returns {never} never returns
|
|
365
|
-
*/
|
|
366
|
-
function invalid(code) {
|
|
367
|
-
throw new SemanticValidationError(code);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* Return a candidate as a plain JSON object.
|
|
372
|
-
*
|
|
373
|
-
* @param {unknown} value candidate value
|
|
374
|
-
* @returns {Record<string, unknown>} plain object
|
|
375
|
-
*/
|
|
376
|
-
function asObject(value) {
|
|
377
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
378
|
-
fail();
|
|
379
|
-
}
|
|
380
|
-
const prototype = Object.getPrototypeOf(value);
|
|
381
|
-
if (prototype !== Object.prototype && prototype !== null) fail();
|
|
382
|
-
return /** @type {Record<string, unknown>} */ (value);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/**
|
|
386
|
-
* Require an exact closed-object member ledger.
|
|
387
|
-
*
|
|
388
|
-
* @param {unknown} value candidate object
|
|
389
|
-
* @param {readonly string[]} required required members
|
|
390
|
-
* @param {readonly string[]} [optional] optional members
|
|
391
|
-
* @returns {Record<string, unknown>} validated object
|
|
392
|
-
*/
|
|
393
|
-
function assertLedger(value, required, optional = []) {
|
|
394
|
-
const object = asObject(value);
|
|
395
|
-
const allowed = new Set([...required, ...optional]);
|
|
396
|
-
const actual = Object.keys(object);
|
|
397
|
-
if (
|
|
398
|
-
required.some((key) => !Object.hasOwn(object, key)) ||
|
|
399
|
-
actual.some((key) => !allowed.has(key))
|
|
400
|
-
) {
|
|
401
|
-
fail();
|
|
402
|
-
}
|
|
403
|
-
return object;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* Require one exact literal value.
|
|
408
|
-
*
|
|
409
|
-
* @param {unknown} value candidate value
|
|
410
|
-
* @param {unknown} expected required value
|
|
411
|
-
* @returns {void}
|
|
412
|
-
*/
|
|
413
|
-
function assertEqual(value, expected) {
|
|
414
|
-
if (value !== expected) fail();
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* Require one string from a closed catalog.
|
|
419
|
-
*
|
|
420
|
-
* @param {unknown} value candidate value
|
|
421
|
-
* @param {readonly string[]} catalog exact catalog
|
|
422
|
-
* @returns {string} validated value
|
|
423
|
-
*/
|
|
424
|
-
function assertCatalog(value, catalog) {
|
|
425
|
-
if (typeof value !== 'string' || !catalog.includes(value)) fail();
|
|
426
|
-
return value;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* Require one portable tagged SHA-256 digest.
|
|
431
|
-
*
|
|
432
|
-
* @param {unknown} value candidate value
|
|
433
|
-
* @returns {string} validated digest
|
|
434
|
-
*/
|
|
435
|
-
function assertDigest(value) {
|
|
436
|
-
if (typeof value !== 'string' || !DIGEST_PATTERN.test(value)) fail();
|
|
437
|
-
return value;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* Require one lowercase UUIDv7 stable identifier.
|
|
442
|
-
*
|
|
443
|
-
* @param {unknown} value candidate value
|
|
444
|
-
* @returns {string} validated identifier
|
|
445
|
-
*/
|
|
446
|
-
function assertStableId(value) {
|
|
447
|
-
if (typeof value !== 'string' || !STABLE_ID_PATTERN.test(value)) fail();
|
|
448
|
-
return value;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
/**
|
|
452
|
-
* Require a boolean.
|
|
453
|
-
*
|
|
454
|
-
* @param {unknown} value candidate value
|
|
455
|
-
* @returns {boolean} validated boolean
|
|
456
|
-
*/
|
|
457
|
-
function assertBoolean(value) {
|
|
458
|
-
if (typeof value !== 'boolean') fail();
|
|
459
|
-
return value;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
/**
|
|
463
|
-
* Require an integer in an inclusive range.
|
|
464
|
-
*
|
|
465
|
-
* @param {unknown} value candidate value
|
|
466
|
-
* @param {number} minimum inclusive minimum
|
|
467
|
-
* @param {number} maximum inclusive maximum
|
|
468
|
-
* @returns {number} validated integer
|
|
469
|
-
*/
|
|
470
|
-
function assertInteger(value, minimum, maximum) {
|
|
471
|
-
if (
|
|
472
|
-
typeof value !== 'number' ||
|
|
473
|
-
!Number.isInteger(value) ||
|
|
474
|
-
value < minimum ||
|
|
475
|
-
value > maximum
|
|
476
|
-
) {
|
|
477
|
-
fail();
|
|
478
|
-
}
|
|
479
|
-
return value;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/**
|
|
483
|
-
* Require one canonical non-negative signed-64-bit decimal string.
|
|
484
|
-
*
|
|
485
|
-
* @param {unknown} value candidate value
|
|
486
|
-
* @returns {string} validated decimal string
|
|
487
|
-
*/
|
|
488
|
-
function assertNonnegativeInt64(value) {
|
|
489
|
-
if (
|
|
490
|
-
typeof value !== 'string' ||
|
|
491
|
-
value.length > 19 ||
|
|
492
|
-
!NONNEGATIVE_INT64_PATTERN.test(value) ||
|
|
493
|
-
BigInt(value) > INT64_MAXIMUM
|
|
494
|
-
) {
|
|
495
|
-
fail();
|
|
496
|
-
}
|
|
497
|
-
return value;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
/**
|
|
501
|
-
* Require one canonical Gala timestamp.
|
|
502
|
-
*
|
|
503
|
-
* @param {unknown} value candidate value
|
|
504
|
-
* @returns {string} validated timestamp
|
|
505
|
-
*/
|
|
506
|
-
function assertTimestamp(value) {
|
|
507
|
-
if (typeof value !== 'string') fail();
|
|
508
|
-
validateRfc3339(value);
|
|
509
|
-
return value;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
/**
|
|
513
|
-
* Require a field to be absent.
|
|
514
|
-
*
|
|
515
|
-
* @param {Record<string, unknown>} object record
|
|
516
|
-
* @param {string} key member name
|
|
517
|
-
* @returns {void}
|
|
518
|
-
*/
|
|
519
|
-
function assertAbsent(object, key) {
|
|
520
|
-
if (Object.hasOwn(object, key)) fail();
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
/**
|
|
524
|
-
* Require all named fields to be absent.
|
|
525
|
-
*
|
|
526
|
-
* @param {Record<string, unknown>} object record
|
|
527
|
-
* @param {readonly string[]} keys member names
|
|
528
|
-
* @returns {void}
|
|
529
|
-
*/
|
|
530
|
-
function assertAllAbsent(object, keys) {
|
|
531
|
-
for (const key of keys) assertAbsent(object, key);
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
/**
|
|
535
|
-
* Require all named fields to be present.
|
|
536
|
-
*
|
|
537
|
-
* @param {Record<string, unknown>} object record
|
|
538
|
-
* @param {readonly string[]} keys member names
|
|
539
|
-
* @returns {void}
|
|
540
|
-
*/
|
|
541
|
-
function assertAllPresent(object, keys) {
|
|
542
|
-
if (keys.some((key) => !Object.hasOwn(object, key))) fail();
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
/**
|
|
546
|
-
* Compare two validated JSON values by their exact RFC 8785 bytes.
|
|
547
|
-
*
|
|
548
|
-
* @param {unknown} left first value
|
|
549
|
-
* @param {unknown} right second value
|
|
550
|
-
* @returns {void}
|
|
551
|
-
*/
|
|
552
|
-
function assertJcsEqual(left, right) {
|
|
553
|
-
if (canonicalizeJcs(left) !== canonicalizeJcs(right)) fail();
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
/**
|
|
557
|
-
* Require identical presence and value for copied scalar fields.
|
|
558
|
-
*
|
|
559
|
-
* @param {Record<string, unknown>} left first record
|
|
560
|
-
* @param {Record<string, unknown>} right second record
|
|
561
|
-
* @param {readonly string[]} keys copied fields
|
|
562
|
-
* @returns {void}
|
|
563
|
-
*/
|
|
564
|
-
function assertCopiedFields(left, right, keys) {
|
|
565
|
-
for (const key of keys) {
|
|
566
|
-
if (
|
|
567
|
-
Object.hasOwn(left, key) !== Object.hasOwn(right, key) ||
|
|
568
|
-
left[key] !== right[key]
|
|
569
|
-
) {
|
|
570
|
-
fail();
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
/**
|
|
576
|
-
* Compute one digest through the shared named-profile authority.
|
|
577
|
-
*
|
|
578
|
-
* @param {string} name exact active profile name
|
|
579
|
-
* @param {unknown} value complete profile input
|
|
580
|
-
* @returns {string} tagged digest
|
|
581
|
-
*/
|
|
582
|
-
function digestNamedProfile(name, value) {
|
|
583
|
-
const profile = ACTIVE_DIGEST_PROFILES[name];
|
|
584
|
-
if (!profile) throw new TypeError('DIGEST_PROFILE_REQUIRED');
|
|
585
|
-
return profile.digest(value);
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
/**
|
|
589
|
-
* Validate the exact credential-free stage input ledger.
|
|
590
|
-
*
|
|
591
|
-
* The embedded authority's complete schema remains owned by the generated
|
|
592
|
-
* contract; this validator reads only the identity fields used by DEC-098's
|
|
593
|
-
* cross-record equalities.
|
|
594
|
-
*
|
|
595
|
-
* @param {unknown} value candidate stage input
|
|
596
|
-
* @returns {Record<string, unknown>} validated stage input
|
|
597
|
-
*/
|
|
598
|
-
function validateStageInputInternal(value) {
|
|
599
|
-
const input = assertLedger(value, STAGE_INPUT_KEYS);
|
|
600
|
-
assertEqual(input.profile, 'gala-deployment-stage-input-v2');
|
|
601
|
-
assertDigest(input.intentDigest);
|
|
602
|
-
const authority = asObject(input.destinationMutationAuthority);
|
|
603
|
-
assertEqual(authority.profile, 'gala-destination-mutation-authority-v2');
|
|
604
|
-
assertStableId(authority.operationId);
|
|
605
|
-
assertStableId(authority.attemptId);
|
|
606
|
-
assertStableId(input.stageAttemptId);
|
|
607
|
-
assertStableId(input.causationId);
|
|
608
|
-
assertCatalog(input.stage, STAGES);
|
|
609
|
-
if (input.stageAttemptId === input.causationId) fail();
|
|
610
|
-
canonicalizeJcs(input);
|
|
611
|
-
return input;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
/**
|
|
615
|
-
* Validate one closed observation-evidence reference.
|
|
616
|
-
*
|
|
617
|
-
* @param {unknown} value candidate reference
|
|
618
|
-
* @returns {Record<string, unknown>} validated reference
|
|
619
|
-
*/
|
|
620
|
-
function validateObservationReference(value) {
|
|
621
|
-
const reference = assertLedger(value, OBSERVATION_REFERENCE_KEYS);
|
|
622
|
-
assertStableId(reference.observationId);
|
|
623
|
-
assertDigest(reference.evidenceDigest);
|
|
624
|
-
return reference;
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
/**
|
|
628
|
-
* Require a valid managed failure-catalog tuple.
|
|
629
|
-
*
|
|
630
|
-
* @param {string} stage stage
|
|
631
|
-
* @param {string} outcome attempt outcome
|
|
632
|
-
* @param {string} destinationChanged cumulative destination mutation
|
|
633
|
-
* @param {unknown} failureCode failure code
|
|
634
|
-
* @param {boolean} retryable retryability value
|
|
635
|
-
* @returns {void}
|
|
636
|
-
*/
|
|
637
|
-
function assertFailureCatalogTuple(
|
|
638
|
-
stage,
|
|
639
|
-
outcome,
|
|
640
|
-
destinationChanged,
|
|
641
|
-
failureCode,
|
|
642
|
-
retryable,
|
|
643
|
-
) {
|
|
644
|
-
if (typeof failureCode !== 'string') fail();
|
|
645
|
-
const matched = FAILURE_CATALOG.some(
|
|
646
|
-
(row) =>
|
|
647
|
-
row.stage === stage &&
|
|
648
|
-
row.code === failureCode &&
|
|
649
|
-
row.outcome === outcome &&
|
|
650
|
-
row.destinationChanges.includes(destinationChanged) &&
|
|
651
|
-
row.retryable === retryable,
|
|
652
|
-
);
|
|
653
|
-
if (!matched) fail();
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
/**
|
|
657
|
-
* Validate outcome, change, failure, retry, and timestamp state.
|
|
658
|
-
*
|
|
659
|
-
* @param {Record<string, unknown>} record result, evidence, or attempt
|
|
660
|
-
* @param {string} stage owning stage
|
|
661
|
-
* @returns {string} validated outcome
|
|
662
|
-
*/
|
|
663
|
-
function validateStateFacts(record, stage) {
|
|
664
|
-
const outcome = assertCatalog(record.outcome, ALL_OUTCOMES);
|
|
665
|
-
const destinationChanged = assertCatalog(
|
|
666
|
-
record.destinationChanged,
|
|
667
|
-
DESTINATION_CHANGES,
|
|
668
|
-
);
|
|
669
|
-
const retryable = assertBoolean(record.retryable);
|
|
670
|
-
|
|
671
|
-
if (outcome === 'not-started') {
|
|
672
|
-
assertEqual(destinationChanged, 'no');
|
|
673
|
-
assertEqual(retryable, false);
|
|
674
|
-
assertAllAbsent(record, [
|
|
675
|
-
'resultDigest',
|
|
676
|
-
'failureCode',
|
|
677
|
-
'startedAt',
|
|
678
|
-
'completedAt',
|
|
679
|
-
]);
|
|
680
|
-
return outcome;
|
|
681
|
-
}
|
|
682
|
-
if (outcome === 'running') {
|
|
683
|
-
assertEqual(retryable, false);
|
|
684
|
-
assertAllPresent(record, ['startedAt']);
|
|
685
|
-
assertTimestamp(record.startedAt);
|
|
686
|
-
assertAllAbsent(record, ['resultDigest', 'failureCode', 'completedAt']);
|
|
687
|
-
return outcome;
|
|
688
|
-
}
|
|
689
|
-
if (outcome === 'skipped') {
|
|
690
|
-
assertEqual(destinationChanged, 'no');
|
|
691
|
-
assertEqual(retryable, false);
|
|
692
|
-
assertAllAbsent(record, ['failureCode', 'startedAt', 'completedAt']);
|
|
693
|
-
return outcome;
|
|
694
|
-
}
|
|
695
|
-
if (outcome === 'succeeded') {
|
|
696
|
-
assertCatalog(destinationChanged, ['no', 'yes']);
|
|
697
|
-
assertEqual(retryable, false);
|
|
698
|
-
assertAbsent(record, 'failureCode');
|
|
699
|
-
} else {
|
|
700
|
-
assertFailureCatalogTuple(
|
|
701
|
-
stage,
|
|
702
|
-
outcome,
|
|
703
|
-
destinationChanged,
|
|
704
|
-
record.failureCode,
|
|
705
|
-
retryable,
|
|
706
|
-
);
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
assertAllPresent(record, ['startedAt', 'completedAt']);
|
|
710
|
-
const startedAt = assertTimestamp(record.startedAt);
|
|
711
|
-
const completedAt = assertTimestamp(record.completedAt);
|
|
712
|
-
if (startedAt > completedAt) fail();
|
|
713
|
-
return outcome;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
/**
|
|
717
|
-
* Validate a stage result without remapping its public diagnostic.
|
|
718
|
-
*
|
|
719
|
-
* @param {unknown} value candidate result
|
|
720
|
-
* @returns {Record<string, unknown>} validated result
|
|
721
|
-
*/
|
|
722
|
-
function validateStageResultInternal(value) {
|
|
723
|
-
const result = assertLedger(
|
|
724
|
-
value,
|
|
725
|
-
STAGE_RESULT_REQUIRED_KEYS,
|
|
726
|
-
STAGE_RESULT_OPTIONAL_KEYS,
|
|
727
|
-
);
|
|
728
|
-
assertEqual(result.profile, 'gala-deployment-stage-result-v2');
|
|
729
|
-
const input = validateStageInputInternal(result.stageInput);
|
|
730
|
-
const inputDigest = assertDigest(result.inputDigest);
|
|
731
|
-
assertEqual(inputDigest, computeDeploymentStageInputDigest(input));
|
|
732
|
-
const stage = assertCatalog(input.stage, STAGES);
|
|
733
|
-
const outcome = validateStateFacts(result, stage);
|
|
734
|
-
if (!TERMINAL_OUTCOMES.includes(outcome)) fail();
|
|
735
|
-
validateObservationReference(result.finalizationObservation);
|
|
736
|
-
return result;
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
/**
|
|
740
|
-
* Sort complete observation references by RFC 8785 UTF-8 bytes.
|
|
741
|
-
*
|
|
742
|
-
* @param {Record<string, unknown>[]} references observation references
|
|
743
|
-
* @returns {Record<string, unknown>[]} sorted copy
|
|
744
|
-
*/
|
|
745
|
-
function sortReferences(references) {
|
|
746
|
-
return [...references].sort((left, right) =>
|
|
747
|
-
Buffer.compare(canonicalizeJcsBytes(left), canonicalizeJcsBytes(right)),
|
|
748
|
-
);
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
/**
|
|
752
|
-
* Validate a complete stage evidence owner without remapping diagnostics.
|
|
753
|
-
*
|
|
754
|
-
* @param {unknown} value candidate evidence
|
|
755
|
-
* @returns {Record<string, unknown>} validated evidence
|
|
756
|
-
*/
|
|
757
|
-
function validateStageEvidenceInternal(value) {
|
|
758
|
-
const evidence = assertLedger(
|
|
759
|
-
value,
|
|
760
|
-
STAGE_EVIDENCE_REQUIRED_KEYS,
|
|
761
|
-
STAGE_EVIDENCE_OPTIONAL_KEYS,
|
|
762
|
-
);
|
|
763
|
-
assertEqual(evidence.profile, 'gala-deployment-stage-evidence-v2');
|
|
764
|
-
const input = validateStageInputInternal(evidence.stageInput);
|
|
765
|
-
const inputDigest = assertDigest(evidence.inputDigest);
|
|
766
|
-
assertEqual(inputDigest, computeDeploymentStageInputDigest(input));
|
|
767
|
-
const stage = assertCatalog(input.stage, STAGES);
|
|
768
|
-
const outcome = validateStateFacts(evidence, stage);
|
|
769
|
-
|
|
770
|
-
if (!Array.isArray(evidence.observationEvidence)) fail();
|
|
771
|
-
const observationEvidence = evidence.observationEvidence.map((reference) =>
|
|
772
|
-
validateObservationReference(reference),
|
|
773
|
-
);
|
|
774
|
-
if (observationEvidence.length > 1_000) fail();
|
|
775
|
-
|
|
776
|
-
const observationIds = new Set();
|
|
777
|
-
let previousBytes;
|
|
778
|
-
for (const reference of observationEvidence) {
|
|
779
|
-
if (observationIds.has(reference.observationId)) fail();
|
|
780
|
-
observationIds.add(reference.observationId);
|
|
781
|
-
const bytes = canonicalizeJcsBytes(reference);
|
|
782
|
-
if (previousBytes && Buffer.compare(previousBytes, bytes) >= 0) fail();
|
|
783
|
-
previousBytes = bytes;
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
const ownedDigests = new Set([
|
|
787
|
-
inputDigest,
|
|
788
|
-
evidence.resultDigest,
|
|
789
|
-
evidence.evidenceDigest,
|
|
790
|
-
]);
|
|
791
|
-
if (
|
|
792
|
-
observationEvidence.some((reference) =>
|
|
793
|
-
ownedDigests.has(reference.evidenceDigest),
|
|
794
|
-
)
|
|
795
|
-
) {
|
|
796
|
-
fail();
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
if (outcome === 'not-started') {
|
|
800
|
-
if (observationEvidence.length !== 0) fail();
|
|
801
|
-
assertAllAbsent(evidence, ['stageResult', 'resultDigest']);
|
|
802
|
-
} else if (outcome === 'running') {
|
|
803
|
-
assertAllAbsent(evidence, ['stageResult', 'resultDigest']);
|
|
804
|
-
} else {
|
|
805
|
-
if (observationEvidence.length === 0) fail();
|
|
806
|
-
assertAllPresent(evidence, ['stageResult', 'resultDigest']);
|
|
807
|
-
const result = validateStageResultInternal(evidence.stageResult);
|
|
808
|
-
assertJcsEqual(result.stageInput, input);
|
|
809
|
-
assertEqual(result.inputDigest, inputDigest);
|
|
810
|
-
assertCopiedFields(evidence, result, COPIED_RESULT_FIELDS);
|
|
811
|
-
const resultDigest = assertDigest(evidence.resultDigest);
|
|
812
|
-
assertEqual(resultDigest, computeDeploymentStageResultDigest(result));
|
|
813
|
-
const finalization = validateObservationReference(
|
|
814
|
-
result.finalizationObservation,
|
|
815
|
-
);
|
|
816
|
-
if (
|
|
817
|
-
!observationEvidence.some(
|
|
818
|
-
(reference) =>
|
|
819
|
-
canonicalizeJcs(reference) === canonicalizeJcs(finalization),
|
|
820
|
-
)
|
|
821
|
-
) {
|
|
822
|
-
fail();
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
const evidenceDigest = assertDigest(evidence.evidenceDigest);
|
|
827
|
-
assertEqual(evidenceDigest, computeDeploymentStageEvidenceDigest(evidence));
|
|
828
|
-
return evidence;
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
/**
|
|
832
|
-
* Validate one enclosing deployment attempt.
|
|
833
|
-
*
|
|
834
|
-
* @param {unknown} value candidate attempt
|
|
835
|
-
* @returns {Record<string, unknown>} validated attempt
|
|
836
|
-
*/
|
|
837
|
-
function validateAttemptInternal(value) {
|
|
838
|
-
const attempt = assertLedger(
|
|
839
|
-
value,
|
|
840
|
-
ATTEMPT_REQUIRED_KEYS,
|
|
841
|
-
ATTEMPT_OPTIONAL_KEYS,
|
|
842
|
-
);
|
|
843
|
-
assertStableId(attempt.attemptId);
|
|
844
|
-
assertStableId(attempt.stageAttemptId);
|
|
845
|
-
assertStableId(attempt.causationId);
|
|
846
|
-
const stage = assertCatalog(attempt.stage, STAGES);
|
|
847
|
-
assertInteger(attempt.sequence, 1, 100);
|
|
848
|
-
assertDigest(attempt.inputDigest);
|
|
849
|
-
assertDigest(attempt.evidenceDigest);
|
|
850
|
-
const outcome = validateStateFacts(attempt, stage);
|
|
851
|
-
if (TERMINAL_OUTCOMES.includes(outcome)) {
|
|
852
|
-
assertDigest(attempt.resultDigest);
|
|
853
|
-
}
|
|
854
|
-
return attempt;
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
/**
|
|
858
|
-
* Return the exact no-newline payload bytes for one probe source.
|
|
859
|
-
*
|
|
860
|
-
* @param {string} source `control`, `race-a`, or `race-b`
|
|
861
|
-
* @returns {Buffer} exact compact-JCS payload bytes
|
|
862
|
-
*/
|
|
863
|
-
export function createLocalFilesystemProbePayload(source) {
|
|
864
|
-
try {
|
|
865
|
-
assertCatalog(source, PROBE_PAYLOAD_SOURCES);
|
|
866
|
-
return Buffer.from(
|
|
867
|
-
`{"profile":"${PROBE_PAYLOAD_PROFILE}","source":"${source}"}`,
|
|
868
|
-
'utf8',
|
|
869
|
-
);
|
|
870
|
-
} catch {
|
|
871
|
-
invalid('LOCAL_FILESYSTEM_PROBE_PAYLOAD_INVALID');
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
/**
|
|
876
|
-
* Validate exact local-filesystem probe payload bytes.
|
|
877
|
-
*
|
|
878
|
-
* @param {unknown} payload exact payload bytes
|
|
879
|
-
* @param {string} source expected source
|
|
880
|
-
* @returns {void}
|
|
881
|
-
*/
|
|
882
|
-
export function validateLocalFilesystemProbePayload(payload, source) {
|
|
883
|
-
try {
|
|
884
|
-
if (!(payload instanceof Uint8Array)) fail();
|
|
885
|
-
const expected = createLocalFilesystemProbePayload(source);
|
|
886
|
-
if (!Buffer.from(payload).equals(expected)) fail();
|
|
887
|
-
} catch {
|
|
888
|
-
invalid('LOCAL_FILESYSTEM_PROBE_PAYLOAD_INVALID');
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
/**
|
|
893
|
-
* Compute the exact DEC-098 local-filesystem probe transcript digest.
|
|
894
|
-
*
|
|
895
|
-
* @param {unknown} transcript complete transcript
|
|
896
|
-
* @returns {string} tagged digest
|
|
897
|
-
*/
|
|
898
|
-
export function computeLocalFilesystemProbeTranscriptDigest(transcript) {
|
|
899
|
-
return digestNamedProfile('localFilesystemProbeTranscript', transcript);
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
/**
|
|
903
|
-
* Validate the exact 10,000-operation local-filesystem probe transcript.
|
|
904
|
-
*
|
|
905
|
-
* @param {unknown} value candidate transcript
|
|
906
|
-
* @returns {void}
|
|
907
|
-
*/
|
|
908
|
-
export function validateLocalFilesystemProbeTranscript(value) {
|
|
909
|
-
try {
|
|
910
|
-
const transcript = assertLedger(value, TRANSCRIPT_KEYS);
|
|
911
|
-
assertEqual(transcript.profile, PROBE_PROFILE);
|
|
912
|
-
assertEqual(transcript.initialTarget, 'target-a');
|
|
913
|
-
if (
|
|
914
|
-
!Array.isArray(transcript.replacements) ||
|
|
915
|
-
transcript.replacements.length !== 10_000
|
|
916
|
-
) {
|
|
917
|
-
fail();
|
|
918
|
-
}
|
|
919
|
-
for (let index = 0; index < transcript.replacements.length; index += 1) {
|
|
920
|
-
const replacement = assertLedger(
|
|
921
|
-
transcript.replacements[index],
|
|
922
|
-
REPLACEMENT_KEYS,
|
|
923
|
-
);
|
|
924
|
-
const operationNumber = index + 1;
|
|
925
|
-
assertEqual(replacement.operationNumber, operationNumber);
|
|
926
|
-
assertEqual(
|
|
927
|
-
replacement.preparedTarget,
|
|
928
|
-
operationNumber % 2 === 1 ? 'target-b' : 'target-a',
|
|
929
|
-
);
|
|
930
|
-
assertEqual(replacement.renameResult, 'success');
|
|
931
|
-
assertCatalog(replacement.readerResult, ['target-a', 'target-b']);
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
const control = assertLedger(
|
|
935
|
-
transcript.controlPublication,
|
|
936
|
-
CONTROL_PUBLICATION_KEYS,
|
|
937
|
-
);
|
|
938
|
-
assertEqual(control.publisherSource, 'control');
|
|
939
|
-
assertEqual(control.publicationResult, 'success');
|
|
940
|
-
assertEqual(control.conflictingSource, 'race-a');
|
|
941
|
-
assertEqual(control.conflictingResult, 'EEXIST');
|
|
942
|
-
assertEqual(control.publishedInodeSource, 'control');
|
|
943
|
-
assertEqual(control.publishedByteSource, 'control');
|
|
944
|
-
|
|
945
|
-
const race = assertLedger(
|
|
946
|
-
transcript.racePublication,
|
|
947
|
-
RACE_PUBLICATION_KEYS,
|
|
948
|
-
);
|
|
949
|
-
if (!Array.isArray(race.contenders) || race.contenders.length !== 2) {
|
|
950
|
-
fail();
|
|
951
|
-
}
|
|
952
|
-
const contenders = race.contenders.map((contender) =>
|
|
953
|
-
assertLedger(contender, RACE_CONTENDER_KEYS),
|
|
954
|
-
);
|
|
955
|
-
assertEqual(contenders[0]?.source, 'race-a');
|
|
956
|
-
assertEqual(contenders[1]?.source, 'race-b');
|
|
957
|
-
for (const contender of contenders) {
|
|
958
|
-
assertCatalog(contender.linkResult, ['success', 'EEXIST']);
|
|
959
|
-
}
|
|
960
|
-
const successful = contenders.filter(
|
|
961
|
-
(contender) => contender.linkResult === 'success',
|
|
962
|
-
);
|
|
963
|
-
const conflicting = contenders.filter(
|
|
964
|
-
(contender) => contender.linkResult === 'EEXIST',
|
|
965
|
-
);
|
|
966
|
-
if (successful.length !== 1 || conflicting.length !== 1) fail();
|
|
967
|
-
const winner = successful[0]?.source;
|
|
968
|
-
assertEqual(race.winner, winner);
|
|
969
|
-
assertEqual(race.publishedInodeSource, winner);
|
|
970
|
-
assertEqual(race.publishedByteSource, winner);
|
|
971
|
-
|
|
972
|
-
computeLocalFilesystemProbeTranscriptDigest(transcript);
|
|
973
|
-
} catch {
|
|
974
|
-
invalid('LOCAL_FILESYSTEM_PROBE_TRANSCRIPT_INVALID');
|
|
975
|
-
}
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
/**
|
|
979
|
-
* Compute a local observation evidence self-exclusion digest.
|
|
980
|
-
*
|
|
981
|
-
* @param {unknown} evidence complete local observation evidence
|
|
982
|
-
* @returns {string} tagged digest
|
|
983
|
-
*/
|
|
984
|
-
export function computeLocalFilesystemObservationEvidenceDigest(evidence) {
|
|
985
|
-
return digestNamedProfile('localFilesystemObservationEvidence', evidence);
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
/**
|
|
989
|
-
* Validate local observation evidence and its five-field state ledger.
|
|
990
|
-
*
|
|
991
|
-
* @param {unknown} value candidate evidence
|
|
992
|
-
* @returns {void}
|
|
993
|
-
*/
|
|
994
|
-
export function validateLocalFilesystemObservationEvidence(value) {
|
|
995
|
-
try {
|
|
996
|
-
const evidence = assertLedger(
|
|
997
|
-
value,
|
|
998
|
-
LOCAL_OBSERVATION_REQUIRED_KEYS,
|
|
999
|
-
LOCAL_OBSERVATION_OPTIONAL_KEYS,
|
|
1000
|
-
);
|
|
1001
|
-
assertEqual(evidence.profile, 'gala-local-directory-observation-v2');
|
|
1002
|
-
assertDigest(evidence.filesystemEvidenceDigest);
|
|
1003
|
-
assertDigest(evidence.rootIdentityDigest);
|
|
1004
|
-
assertStableId(evidence.operationId);
|
|
1005
|
-
assertStableId(evidence.attemptId);
|
|
1006
|
-
assertStableId(evidence.stageAttemptId);
|
|
1007
|
-
if (Object.hasOwn(evidence, 'expectedGenerationId')) {
|
|
1008
|
-
assertStableId(evidence.expectedGenerationId);
|
|
1009
|
-
}
|
|
1010
|
-
const state = assertCatalog(evidence.observedCurrentState, [
|
|
1011
|
-
'absent',
|
|
1012
|
-
'valid',
|
|
1013
|
-
'malformed',
|
|
1014
|
-
'unsafe',
|
|
1015
|
-
]);
|
|
1016
|
-
if (state === 'valid') {
|
|
1017
|
-
assertAllPresent(evidence, LOCAL_OBSERVATION_STATE_KEYS);
|
|
1018
|
-
assertStableId(evidence.observedGenerationId);
|
|
1019
|
-
assertDigest(evidence.observedArtifactDigest);
|
|
1020
|
-
assertDigest(evidence.observedMarkerDigest);
|
|
1021
|
-
assertNonnegativeInt64(evidence.observedFileCount);
|
|
1022
|
-
assertNonnegativeInt64(evidence.observedByteCount);
|
|
1023
|
-
} else {
|
|
1024
|
-
assertAllAbsent(evidence, LOCAL_OBSERVATION_STATE_KEYS);
|
|
1025
|
-
}
|
|
1026
|
-
assertDigest(evidence.controlHeadDigest);
|
|
1027
|
-
assertTimestamp(evidence.observedAt);
|
|
1028
|
-
assertEqual(
|
|
1029
|
-
assertDigest(evidence.evidenceDigest),
|
|
1030
|
-
computeLocalFilesystemObservationEvidenceDigest(evidence),
|
|
1031
|
-
);
|
|
1032
|
-
} catch {
|
|
1033
|
-
invalid('LOCAL_FILESYSTEM_OBSERVATION_EVIDENCE_INVALID');
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
/**
|
|
1038
|
-
* Compute the exact credential-free deployment-stage input digest.
|
|
1039
|
-
*
|
|
1040
|
-
* @param {unknown} input complete stage input
|
|
1041
|
-
* @returns {string} tagged digest
|
|
1042
|
-
*/
|
|
1043
|
-
export function computeDeploymentStageInputDigest(input) {
|
|
1044
|
-
return digestNamedProfile('deploymentStageInput', input);
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
/**
|
|
1048
|
-
* Validate one closed deployment-stage input.
|
|
1049
|
-
*
|
|
1050
|
-
* @param {unknown} input candidate stage input
|
|
1051
|
-
* @returns {void}
|
|
1052
|
-
*/
|
|
1053
|
-
export function validateDeploymentStageInput(input) {
|
|
1054
|
-
try {
|
|
1055
|
-
validateStageInputInternal(input);
|
|
1056
|
-
} catch {
|
|
1057
|
-
invalid('DEPLOYMENT_STAGE_INPUT_INVALID');
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
/**
|
|
1062
|
-
* Compute the exact normalized deployment-stage result digest.
|
|
1063
|
-
*
|
|
1064
|
-
* @param {unknown} result complete stage result
|
|
1065
|
-
* @returns {string} tagged digest
|
|
1066
|
-
*/
|
|
1067
|
-
export function computeDeploymentStageResultDigest(result) {
|
|
1068
|
-
return digestNamedProfile('deploymentStageResult', result);
|
|
1069
|
-
}
|
|
1070
|
-
|
|
1071
|
-
/**
|
|
1072
|
-
* Validate one closed terminal deployment-stage result.
|
|
1073
|
-
*
|
|
1074
|
-
* @param {unknown} result candidate result
|
|
1075
|
-
* @returns {void}
|
|
1076
|
-
*/
|
|
1077
|
-
export function validateDeploymentStageResult(result) {
|
|
1078
|
-
try {
|
|
1079
|
-
validateStageResultInternal(result);
|
|
1080
|
-
} catch {
|
|
1081
|
-
invalid('DEPLOYMENT_STAGE_RESULT_INVALID');
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
1084
|
-
|
|
1085
|
-
/**
|
|
1086
|
-
* Compute the complete deployment-stage evidence self-exclusion digest.
|
|
1087
|
-
*
|
|
1088
|
-
* @param {unknown} evidence complete stage evidence
|
|
1089
|
-
* @returns {string} tagged digest
|
|
1090
|
-
*/
|
|
1091
|
-
export function computeDeploymentStageEvidenceDigest(evidence) {
|
|
1092
|
-
return digestNamedProfile('deploymentStageEvidence', evidence);
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
/**
|
|
1096
|
-
* Validate one closed deployment-stage evidence owner.
|
|
1097
|
-
*
|
|
1098
|
-
* Cross-record intent, attempt, and journal-prefix equalities are validated by
|
|
1099
|
-
* `validateDeploymentStageRecords`.
|
|
1100
|
-
*
|
|
1101
|
-
* @param {unknown} evidence candidate evidence
|
|
1102
|
-
* @returns {void}
|
|
1103
|
-
*/
|
|
1104
|
-
export function validateDeploymentStageEvidence(evidence) {
|
|
1105
|
-
try {
|
|
1106
|
-
validateStageEvidenceInternal(evidence);
|
|
1107
|
-
} catch {
|
|
1108
|
-
invalid('DEPLOYMENT_STAGE_EVIDENCE_INVALID');
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
/**
|
|
1113
|
-
* Validate all DEC-098 equalities for one stage and its already committed
|
|
1114
|
-
* observation prefix.
|
|
1115
|
-
*
|
|
1116
|
-
* `retainedObservations` is the retained joint-evidence-journal order, not a
|
|
1117
|
-
* caller-selected or observation-sequence order. This function only consumes
|
|
1118
|
-
* committed observations and never constructs a current observation wrapper,
|
|
1119
|
-
* which preserves DEC-098's stage digest dependency order.
|
|
1120
|
-
*
|
|
1121
|
-
* @param {unknown} records related retained records
|
|
1122
|
-
* @returns {void}
|
|
1123
|
-
*/
|
|
1124
|
-
export function validateDeploymentStageRecords(records) {
|
|
1125
|
-
try {
|
|
1126
|
-
const context = assertLedger(asObject(records), [
|
|
1127
|
-
'deploymentIntent',
|
|
1128
|
-
'deploymentAttempt',
|
|
1129
|
-
'deploymentStageEvidence',
|
|
1130
|
-
'retainedObservations',
|
|
1131
|
-
]);
|
|
1132
|
-
const evidence = validateStageEvidenceInternal(
|
|
1133
|
-
context.deploymentStageEvidence,
|
|
1134
|
-
);
|
|
1135
|
-
const input = validateStageInputInternal(evidence.stageInput);
|
|
1136
|
-
const authority = asObject(input.destinationMutationAuthority);
|
|
1137
|
-
const intent = asObject(context.deploymentIntent);
|
|
1138
|
-
const attempt = validateAttemptInternal(context.deploymentAttempt);
|
|
1139
|
-
|
|
1140
|
-
const operationId = assertStableId(intent.operationId);
|
|
1141
|
-
const attemptId = assertStableId(intent.attemptId);
|
|
1142
|
-
assertEqual(input.intentDigest, assertDigest(intent.intentDigest));
|
|
1143
|
-
assertJcsEqual(
|
|
1144
|
-
input.destinationMutationAuthority,
|
|
1145
|
-
intent.destinationMutationAuthority,
|
|
1146
|
-
);
|
|
1147
|
-
assertEqual(authority.operationId, operationId);
|
|
1148
|
-
assertEqual(authority.attemptId, attemptId);
|
|
1149
|
-
assertEqual(attempt.attemptId, attemptId);
|
|
1150
|
-
assertEqual(attempt.stageAttemptId, input.stageAttemptId);
|
|
1151
|
-
assertEqual(attempt.causationId, input.causationId);
|
|
1152
|
-
assertEqual(attempt.stage, input.stage);
|
|
1153
|
-
assertEqual(attempt.inputDigest, evidence.inputDigest);
|
|
1154
|
-
assertEqual(attempt.evidenceDigest, evidence.evidenceDigest);
|
|
1155
|
-
assertCopiedFields(attempt, evidence, COPIED_RESULT_FIELDS);
|
|
1156
|
-
|
|
1157
|
-
const outcome = assertCatalog(evidence.outcome, ALL_OUTCOMES);
|
|
1158
|
-
if (TERMINAL_OUTCOMES.includes(outcome)) {
|
|
1159
|
-
assertEqual(attempt.resultDigest, evidence.resultDigest);
|
|
1160
|
-
} else {
|
|
1161
|
-
assertAbsent(attempt, 'resultDigest');
|
|
1162
|
-
}
|
|
1163
|
-
|
|
1164
|
-
if (!Array.isArray(context.retainedObservations)) fail();
|
|
1165
|
-
const observations = context.retainedObservations.map((candidate) => {
|
|
1166
|
-
const observation = asObject(candidate);
|
|
1167
|
-
assertStableId(observation.observationId);
|
|
1168
|
-
assertStableId(observation.stageAttemptId);
|
|
1169
|
-
assertDigest(observation.evidenceDigest);
|
|
1170
|
-
return observation;
|
|
1171
|
-
});
|
|
1172
|
-
const retainedIds = new Set();
|
|
1173
|
-
for (const observation of observations) {
|
|
1174
|
-
if (retainedIds.has(observation.observationId)) fail();
|
|
1175
|
-
retainedIds.add(observation.observationId);
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
let prefix = observations;
|
|
1179
|
-
if (TERMINAL_OUTCOMES.includes(outcome)) {
|
|
1180
|
-
const result = asObject(evidence.stageResult);
|
|
1181
|
-
const finalization = asObject(result.finalizationObservation);
|
|
1182
|
-
const finalizationIndex = observations.findIndex(
|
|
1183
|
-
(observation) =>
|
|
1184
|
-
observation.observationId === finalization.observationId &&
|
|
1185
|
-
observation.evidenceDigest === finalization.evidenceDigest,
|
|
1186
|
-
);
|
|
1187
|
-
if (finalizationIndex < 0) fail();
|
|
1188
|
-
const finalObservation = observations[finalizationIndex];
|
|
1189
|
-
if (finalObservation?.stageAttemptId !== input.stageAttemptId) fail();
|
|
1190
|
-
prefix = observations.slice(0, finalizationIndex + 1);
|
|
1191
|
-
}
|
|
1192
|
-
|
|
1193
|
-
const expectedReferences = sortReferences(
|
|
1194
|
-
prefix
|
|
1195
|
-
.filter(
|
|
1196
|
-
(observation) => observation.stageAttemptId === input.stageAttemptId,
|
|
1197
|
-
)
|
|
1198
|
-
.map((observation) => ({
|
|
1199
|
-
observationId: observation.observationId,
|
|
1200
|
-
evidenceDigest: observation.evidenceDigest,
|
|
1201
|
-
})),
|
|
1202
|
-
);
|
|
1203
|
-
assertJcsEqual(evidence.observationEvidence, expectedReferences);
|
|
1204
|
-
} catch {
|
|
1205
|
-
invalid('DEPLOYMENT_STAGE_RECORDS_INVALID');
|
|
1206
|
-
}
|
|
1207
|
-
}
|