{"apiVersion": "openeyes.nails.web.v1", "boundary": "go_live_external_release_receipt_completion_local_only", "collectionExecutionEnabled": false, "completionBoundary": {"acceptsExternalReleaseReceiptUri": true, "acceptsInlineExternalReleaseReceipt": true, "advancesLocalGoLiveTracker": true, "collectionExecutionEnabled": false, "deployEnabled": false, "externalReleaseAction": false, "finalizesAllStagesReady": true, "liveCollectionEnabled": false, "localStateMutations": false, "mode": "external_release_action_receipt_completion_local_files_only", "network": false, "productionMutations": false, "readsLocalFiles": true, "registersExternalReleaseActionReceipt": true, "requiresExplicitStateRoot": false, "requiresExternalReleaseActionCompletedBeforeCall": true, "requiresReleaseCockpitReviewCompletion": true, "secretMaterialReturned": false, "submitEnabled": false, "uploadEnabled": false, "validatesExternalReleaseReceipt": true, "validatesReleaseCockpitDigest": true, "writesLocalAuditState": false, "writesLocalFiles": true}, "completionContractPath": "/api/web/v1/plugins/nails/production-cutover:external-release-action-receipt-contract", "completionPath": "/api/web/v1/plugins/nails/production-cutover:external-release-action-receipt", "contract": {"additionalProperties": false, "contractVersion": 1, "externalReleaseReceiptInputModes": ["local_path", "inline_json", "uri"], "inputModes": ["local_path", "inline_json", "uri"], "methods": ["POST"], "name": "nails-production-cutover-external-release-action-receipt", "objectUriReader": {"acceptedSchemes": ["gs", "oss"], "bucketAllowlistEnv": ["MALIANG_NAILS_RESOURCE_BUCKETS", "NAILS_AUDIT_EVIDENCE_BUCKET", "NAILS_SOURCE_ASSETS_BUCKET", "NAILS_DESIGN_PACKAGES_BUCKET", "NAILS_PUBLIC_ASSETS_BUCKET"], "defaultMode": "local_object_uri_mirror", "gcsModeEnv": "NAILS_WEB_GCS_URI_READ_ENABLED=1", "mirrorRootField": "objectUriMirrorRoot", "payloadKind": "json"}, "optionalFields": ["externalReleaseReceipt", "externalReleaseReceiptInline", "externalReleaseReceiptUri", "objectUriMirrorRoot", "outputDir", "replace", "compactOutputFiles"], "requiredFields": ["startBundle"], "schemaDigest": "0f5e37200f6c5b93e5ac4ead6e83c35cceba0023d1bbaf96179b29c68dc544a0", "schemaId": "https://openeyes.local/plugins/nails/web/v1/external-release-action-receipt-completion-request.schema.json"}, "deployEnabled": false, "externalReleaseAction": false, "links": {"expectedReceipt": {"artifact": "<startBundle>/external-release-receipt.json", "boundary": "external_release_action_receipt_non_secret_no_local_side_effects", "externalReleaseActionCompletedMustBeTrue": true, "kind": "nails.external_release_action_receipt", "releaseCockpitDigestRequired": true, "secretMaterialReturnedMustBeFalse": true}, "releaseCockpitReview": {"contractPath": "/api/web/v1/plugins/nails/production-cutover:release-cockpit-review-contract", "localStateMutations": false, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/production-cutover:release-cockpit-review"}}, "liveCollectionEnabled": false, "localStateMutations": false, "localWrapper": {"collectionExecutionEnabled": false, "commandTemplate": "rtk python scripts/nails_complete_go_live_external_release_receipt.py --start-bundle <startBundle> --external-release-receipt <external-release-receipt.json> --output-dir <outputDir>", "defaultReceiptPath": "<startBundle>/external-release-receipt.json", "deployEnabled": false, "externalReleaseAction": false, "liveCollectionEnabled": false, "localStateMutations": false, "network": false, "productionMutations": false, "requiresExternalReleaseActionCompletedBeforeCall": true, "script": "scripts/nails_complete_go_live_external_release_receipt.py", "steps": ["load latest release cockpit review completion", "validate non-secret external release action receipt", "bind receipt to releaseCockpitDigest", "register external_release_action_receipt", "advance local go-live tracker to all-stages-ready"], "submitEnabled": false, "uploadEnabled": false}, "method": "GET", "network": false, "ok": true, "pluginId": "nails", "productionMutations": false, "requiresExternalReleaseActionCompletedBeforeCall": true, "route": "/api/web/v1/plugins/nails/production-cutover:external-release-action-receipt-contract", "schema": {"$id": "https://openeyes.local/plugins/nails/web/v1/external-release-action-receipt-completion-request.schema.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "oneOf": [{"not": {"anyOf": [{"required": ["externalReleaseReceiptInline"]}, {"required": ["externalReleaseReceiptUri"]}]}, "required": ["externalReleaseReceipt"]}, {"not": {"anyOf": [{"required": ["externalReleaseReceipt"]}, {"required": ["externalReleaseReceiptUri"]}]}, "required": ["externalReleaseReceiptInline"]}, {"not": {"anyOf": [{"required": ["externalReleaseReceipt"]}, {"required": ["externalReleaseReceiptInline"]}]}, "required": ["externalReleaseReceiptUri"]}], "properties": {"compactOutputFiles": {"default": false, "description": "Write compact JSON artifacts when true.", "type": "boolean"}, "externalReleaseReceipt": {"description": "Path to the non-secret receipt JSON returned after the operator completed the approved external release action.", "minLength": 1, "type": "string"}, "externalReleaseReceiptInline": {"description": "Inline non-secret receipt JSON returned after the operator completed the approved external release action. The API materializes it under the start bundle before running the local external release receipt wrapper.", "type": "object"}, "externalReleaseReceiptUri": {"description": "Stable gs:// or oss:// URI for the non-secret receipt JSON returned after the operator completed the approved external release action. The API reads JSON from an authorized object URI and materializes it under the start bundle before running the local wrapper.", "minLength": 1, "type": "string"}, "objectUriMirrorRoot": {"description": "Optional local object URI mirror root used when object URI reads are not using Cloud Run GCS JSON API mode. Defaults to <startBundle>/object-uri-readback.", "minLength": 1, "type": "string"}, "outputDir": {"description": "Optional empty local output directory for external release receipt completion artifacts. When supplied it must resolve inside the start bundle.", "minLength": 1, "type": "string"}, "replace": {"default": false, "description": "Allow replacing the external_release_action_receipt stage entry when advancing the local go-live tracker.", "type": "boolean"}, "startBundle": {"description": "Local go-live start bundle whose release cockpit review has prepared the external release receipt template.", "minLength": 1, "type": "string"}}, "required": ["startBundle"], "title": "Nails External Release Action Receipt Completion Request v1", "type": "object"}, "sideEffects": "local_sanitized_external_release_receipt_registration", "submitEnabled": false, "uploadEnabled": false}