@giveitsmaller/contracts 0.67.0 → 0.69.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 +2 -2
- package/accepted-options/accepted-options.json +17 -3
- package/accepted-options/image-output-routes.json +1 -1
- package/asyncapi/events.yaml +32 -1
- package/availability/availability.json +91 -10
- package/code-builder/code-builder-metadata.json +120 -11
- package/dist/openapi/models/AccountLimitEntry.d.ts +18 -3
- package/dist/openapi/models/AccountLimitEntry.js +1 -1
- package/dist/openapi/models/AccountLimits.d.ts +1 -1
- package/dist/openapi/models/AccountLimits.js +1 -1
- package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
- package/dist/openapi/models/AccountLimitsLimits.js +1 -1
- package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
- package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
- package/dist/openapi/models/AuthErrorResponse.js +1 -1
- package/dist/openapi/models/AuthErrorType.d.ts +1 -1
- package/dist/openapi/models/AuthErrorType.js +1 -1
- package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
- package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
- package/dist/openapi/models/AuthenticatedIdentity.d.ts +89 -0
- package/dist/openapi/models/AuthenticatedIdentity.js +66 -0
- package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
- package/dist/openapi/models/AvailabilityValue.js +1 -1
- package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
- package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
- package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
- package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
- package/dist/openapi/models/BillingCheckoutRequest.d.ts +1 -1
- package/dist/openapi/models/BillingCheckoutRequest.js +1 -1
- package/dist/openapi/models/BillingCheckoutSession.d.ts +1 -1
- package/dist/openapi/models/BillingCheckoutSession.js +1 -1
- package/dist/openapi/models/BillingCheckoutSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/BillingCheckoutSuccessEnvelope.js +1 -1
- package/dist/openapi/models/CallbackEventType.d.ts +1 -1
- package/dist/openapi/models/CallbackEventType.js +1 -1
- package/dist/openapi/models/CancelAccountDeletion200Response.d.ts +1 -1
- package/dist/openapi/models/CancelAccountDeletion200Response.js +1 -1
- package/dist/openapi/models/CancelAccountDeletion200ResponseData.d.ts +1 -1
- package/dist/openapi/models/CancelAccountDeletion200ResponseData.js +1 -1
- package/dist/openapi/models/CapabilityCondition.d.ts +1 -1
- package/dist/openapi/models/CapabilityCondition.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf1.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf1.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf2.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf2.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf3.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf3.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf4.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf4.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf5.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf5.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf6.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf6.js +1 -1
- package/dist/openapi/models/CapabilityConstraint.d.ts +1 -1
- package/dist/openapi/models/CapabilityConstraint.js +1 -1
- package/dist/openapi/models/CapabilityInputSpec.d.ts +1 -1
- package/dist/openapi/models/CapabilityInputSpec.js +1 -1
- package/dist/openapi/models/CapabilityProduces.d.ts +1 -1
- package/dist/openapi/models/CapabilityProduces.js +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf.d.ts +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf.js +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf1.d.ts +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf1.js +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf2.d.ts +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf2.js +1 -1
- package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
- package/dist/openapi/models/ChangePasswordRequest.js +1 -1
- package/dist/openapi/models/CodegenSource.d.ts +1 -1
- package/dist/openapi/models/CodegenSource.js +1 -1
- package/dist/openapi/models/CodegenSourceInput.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceInput.js +1 -1
- package/dist/openapi/models/CodegenSourceJob.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceJob.js +1 -1
- package/dist/openapi/models/CodegenSourceJobSource.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceJobSource.js +1 -1
- package/dist/openapi/models/CodegenSourceOperation.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceOperation.js +1 -1
- package/dist/openapi/models/CodegenUploadPlaceholder.d.ts +1 -1
- package/dist/openapi/models/CodegenUploadPlaceholder.js +1 -1
- package/dist/openapi/models/CompositionPlan.d.ts +1 -1
- package/dist/openapi/models/CompositionPlan.js +1 -1
- package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
- package/dist/openapi/models/CompositionPlanJob.js +1 -1
- package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
- package/dist/openapi/models/CompositionPlanOperation.js +1 -1
- package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
- package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
- package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
- package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
- package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
- package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
- package/dist/openapi/models/ConnectionSource.d.ts +1 -1
- package/dist/openapi/models/ConnectionSource.js +1 -1
- package/dist/openapi/models/ContactRequest.d.ts +1 -1
- package/dist/openapi/models/ContactRequest.js +1 -1
- package/dist/openapi/models/ContactSubject.d.ts +1 -1
- package/dist/openapi/models/ContactSubject.js +1 -1
- package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
- package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
- package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
- package/dist/openapi/models/CreateApiKey201Response.js +1 -1
- package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
- package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
- package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
- package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
- package/dist/openapi/models/CreateBillingCheckoutSession422Response.d.ts +1 -1
- package/dist/openapi/models/CreateBillingCheckoutSession422Response.js +1 -1
- package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
- package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
- package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
- package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
- package/dist/openapi/models/CreateWorkflow401Response.d.ts +1 -1
- package/dist/openapi/models/CreateWorkflow401Response.js +1 -1
- package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
- package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
- package/dist/openapi/models/CreditTransaction.d.ts +26 -5
- package/dist/openapi/models/CreditTransaction.js +1 -1
- package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
- package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
- package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
- package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
- package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
- package/dist/openapi/models/CreditsUsageResponse.d.ts +1 -1
- package/dist/openapi/models/CreditsUsageResponse.js +1 -1
- package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
- package/dist/openapi/models/Delivery.d.ts +1 -1
- package/dist/openapi/models/Delivery.js +1 -1
- package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
- package/dist/openapi/models/DeliveryOutputRef.js +1 -1
- package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
- package/dist/openapi/models/DeliveryPlan.js +1 -1
- package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
- package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
- package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
- package/dist/openapi/models/DeliveryPlanReason.js +1 -1
- package/dist/openapi/models/DeliverySelection.d.ts +1 -1
- package/dist/openapi/models/DeliverySelection.js +1 -1
- package/dist/openapi/models/DownloadBundle.d.ts +1 -1
- package/dist/openapi/models/DownloadBundle.js +1 -1
- package/dist/openapi/models/DroppedOption.d.ts +1 -1
- package/dist/openapi/models/DroppedOption.js +1 -1
- package/dist/openapi/models/EmailNotify.d.ts +1 -1
- package/dist/openapi/models/EmailNotify.js +1 -1
- package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
- package/dist/openapi/models/EndpointProjection.d.ts +1 -1
- package/dist/openapi/models/EndpointProjection.js +1 -1
- package/dist/openapi/models/EndpointProjectionServersInner.d.ts +1 -1
- package/dist/openapi/models/EndpointProjectionServersInner.js +1 -1
- package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
- package/dist/openapi/models/ErrorEnvelope.js +1 -1
- package/dist/openapi/models/EstimateQuality.d.ts +1 -1
- package/dist/openapi/models/EstimateQuality.js +1 -1
- package/dist/openapi/models/EstimateRange.d.ts +1 -1
- package/dist/openapi/models/EstimateRange.js +1 -1
- package/dist/openapi/models/ExportAccountData200Response.d.ts +1 -1
- package/dist/openapi/models/ExportAccountData200Response.js +1 -1
- package/dist/openapi/models/ExportAccountData200ResponseData.d.ts +1 -1
- package/dist/openapi/models/ExportAccountData200ResponseData.js +1 -1
- package/dist/openapi/models/ExternalDestination.d.ts +1 -1
- package/dist/openapi/models/ExternalDestination.js +1 -1
- package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
- package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
- package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
- package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
- package/dist/openapi/models/ExternalImportRequest.js +1 -1
- package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
- package/dist/openapi/models/ExternalImportToken.js +1 -1
- package/dist/openapi/models/ExternalSource.d.ts +1 -1
- package/dist/openapi/models/ExternalSource.js +1 -1
- package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
- package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
- package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
- package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
- package/dist/openapi/models/FeatureViolation.d.ts +1 -1
- package/dist/openapi/models/FeatureViolation.js +1 -1
- package/dist/openapi/models/GetProfile200Response.d.ts +46 -0
- package/dist/openapi/models/GetProfile200Response.js +54 -0
- package/dist/openapi/models/GetProfile200ResponseData.d.ts +33 -0
- package/dist/openapi/models/GetProfile200ResponseData.js +44 -0
- package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
- package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
- package/dist/openapi/models/JobDefinition.d.ts +1 -1
- package/dist/openapi/models/JobDefinition.js +1 -1
- package/dist/openapi/models/JobDownload.d.ts +1 -1
- package/dist/openapi/models/JobDownload.js +1 -1
- package/dist/openapi/models/JobInputV2.d.ts +1 -1
- package/dist/openapi/models/JobInputV2.js +1 -1
- package/dist/openapi/models/JobMediaClass.d.ts +1 -1
- package/dist/openapi/models/JobMediaClass.js +1 -1
- package/dist/openapi/models/JobOutputSource.d.ts +1 -1
- package/dist/openapi/models/JobOutputSource.js +1 -1
- package/dist/openapi/models/JobResponse.d.ts +1 -1
- package/dist/openapi/models/JobResponse.js +1 -1
- package/dist/openapi/models/JobStatus.d.ts +1 -1
- package/dist/openapi/models/JobStatus.js +1 -1
- package/dist/openapi/models/JobType.d.ts +1 -1
- package/dist/openapi/models/JobType.js +1 -1
- package/dist/openapi/models/LivenessResponse.d.ts +1 -1
- package/dist/openapi/models/LivenessResponse.js +1 -1
- package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
- package/dist/openapi/models/LoginUser200Response.js +1 -1
- package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
- package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
- package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
- package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
- package/dist/openapi/models/LoginUser401Response.d.ts +1 -1
- package/dist/openapi/models/LoginUser401Response.js +1 -1
- package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
- package/dist/openapi/models/LoginUserRequest.js +1 -1
- package/dist/openapi/models/LongFormConcurrencyLimitResponse.d.ts +1 -1
- package/dist/openapi/models/LongFormConcurrencyLimitResponse.js +1 -1
- package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.d.ts +1 -1
- package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.js +1 -1
- package/dist/openapi/models/MetadataResponse.d.ts +1 -1
- package/dist/openapi/models/MetadataResponse.js +1 -1
- package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
- package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
- package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
- package/dist/openapi/models/MetadataResponseExif.js +1 -1
- package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
- package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
- package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MimeGroupSchema.d.ts +17 -8
- package/dist/openapi/models/MimeGroupSchema.js +1 -1
- package/dist/openapi/models/MultiInputSource.d.ts +1 -1
- package/dist/openapi/models/MultiInputSource.js +1 -1
- package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
- package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
- package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
- package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
- package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
- package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
- package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
- package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
- package/dist/openapi/models/MultipartPartListing.js +1 -1
- package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
- package/dist/openapi/models/MultipartPresignRequest.js +1 -1
- package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartPresignResponse.js +1 -1
- package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartStatusResponse.js +1 -1
- package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
- package/dist/openapi/models/NotifyConfig.d.ts +1 -1
- package/dist/openapi/models/NotifyConfig.js +1 -1
- package/dist/openapi/models/OperationCapability.d.ts +1 -1
- package/dist/openapi/models/OperationCapability.js +1 -1
- package/dist/openapi/models/OperationDefinition.d.ts +1 -1
- package/dist/openapi/models/OperationDefinition.js +1 -1
- package/dist/openapi/models/OperationDownload.d.ts +1 -1
- package/dist/openapi/models/OperationDownload.js +1 -1
- package/dist/openapi/models/OperationInputModel.d.ts +1 -1
- package/dist/openapi/models/OperationInputModel.js +1 -1
- package/dist/openapi/models/OperationResponse.d.ts +1 -1
- package/dist/openapi/models/OperationResponse.js +1 -1
- package/dist/openapi/models/OperationResult.d.ts +1 -1
- package/dist/openapi/models/OperationResult.js +1 -1
- package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
- package/dist/openapi/models/OperationResultMetadata.js +1 -1
- package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
- package/dist/openapi/models/OperationResultMetrics.js +1 -1
- package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
- package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
- package/dist/openapi/models/OperationStatus.d.ts +1 -1
- package/dist/openapi/models/OperationStatus.js +1 -1
- package/dist/openapi/models/OperationType.d.ts +1 -1
- package/dist/openapi/models/OperationType.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponse.d.ts +7 -1
- package/dist/openapi/models/OperationsSchemaResponse.js +3 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.js +1 -1
- package/dist/openapi/models/OptionSchema.d.ts +1 -1
- package/dist/openapi/models/OptionSchema.js +1 -1
- package/dist/openapi/models/OutputProperties.d.ts +1 -1
- package/dist/openapi/models/OutputProperties.js +1 -1
- package/dist/openapi/models/OutputPropertiesIsAnimated.d.ts +1 -1
- package/dist/openapi/models/OutputPropertiesIsAnimated.js +1 -1
- package/dist/openapi/models/PerClassAvailabilityEntry.d.ts +1 -1
- package/dist/openapi/models/PerClassAvailabilityEntry.js +1 -1
- package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
- package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
- package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +1 -1
- package/dist/openapi/models/PerValueAvailabilityEntry.js +1 -1
- package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
- package/dist/openapi/models/PresignedUrlPart.js +1 -1
- package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
- package/dist/openapi/models/ProbePendingResponse.js +1 -1
- package/dist/openapi/models/ProcessingClass.d.ts +1 -1
- package/dist/openapi/models/ProcessingClass.js +1 -1
- package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
- package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
- package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassEntry.js +1 -1
- package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
- package/dist/openapi/models/ProcessingClassHint.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassHint.js +1 -1
- package/dist/openapi/models/ProcessingClassReason.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassReason.js +1 -1
- package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
- package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
- package/dist/openapi/models/ProcessingPlan.js +1 -1
- package/dist/openapi/models/ProcessingPlanJob.d.ts +1 -1
- package/dist/openapi/models/ProcessingPlanJob.js +1 -1
- package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
- package/dist/openapi/models/ReEncodeDecision.js +1 -1
- package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
- package/dist/openapi/models/ReadinessResponse.js +1 -1
- package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
- package/dist/openapi/models/RegisterUser422Response.js +1 -1
- package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
- package/dist/openapi/models/RegisterUserRequest.js +1 -1
- package/dist/openapi/models/RequestAccountDeletion200Response.d.ts +1 -1
- package/dist/openapi/models/RequestAccountDeletion200Response.js +1 -1
- package/dist/openapi/models/RequestAccountDeletion200ResponseData.d.ts +1 -1
- package/dist/openapi/models/RequestAccountDeletion200ResponseData.js +1 -1
- package/dist/openapi/models/RequestAccountDeletionRequest.d.ts +1 -1
- package/dist/openapi/models/RequestAccountDeletionRequest.js +1 -1
- package/dist/openapi/models/ResendVerificationEmailRequest.d.ts +1 -1
- package/dist/openapi/models/ResendVerificationEmailRequest.js +1 -1
- package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
- package/dist/openapi/models/ResetPasswordRequest.js +1 -1
- package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
- package/dist/openapi/models/ResponseEnvelope.js +1 -1
- package/dist/openapi/models/RetryResponse.d.ts +1 -1
- package/dist/openapi/models/RetryResponse.js +1 -1
- package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
- package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
- package/dist/openapi/models/SseCompletionBase.js +1 -1
- package/dist/openapi/models/SseEventType.d.ts +1 -1
- package/dist/openapi/models/SseEventType.js +1 -1
- package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
- package/dist/openapi/models/SseJobCompletedData.js +1 -1
- package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
- package/dist/openapi/models/SseJobFailedData.js +1 -1
- package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
- package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
- package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +1 -1
- package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
- package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
- package/dist/openapi/models/SseOperationCompletedData.js +1 -1
- package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
- package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
- package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
- package/dist/openapi/models/SseOperationFailedData.js +1 -1
- package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
- package/dist/openapi/models/SseOperationProgressData.js +1 -1
- package/dist/openapi/models/SseSingleOutputCompletion.d.ts +1 -1
- package/dist/openapi/models/SseSingleOutputCompletion.js +1 -1
- package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
- package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
- package/dist/openapi/models/TierRestrictionKind.d.ts +1 -1
- package/dist/openapi/models/TierRestrictionKind.js +1 -1
- package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
- package/dist/openapi/models/TierRestrictionResponse.js +1 -1
- package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
- package/dist/openapi/models/UpdateProfile200Response.js +1 -1
- package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
- package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
- package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
- package/dist/openapi/models/UpdateProfile422Response.js +1 -1
- package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
- package/dist/openapi/models/UpdateProfileRequest.js +1 -1
- package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
- package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
- package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
- package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
- package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
- package/dist/openapi/models/UploadFile403Response.js +1 -1
- package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
- package/dist/openapi/models/UploadFile422Response.js +1 -1
- package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
- package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
- package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
- package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
- package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
- package/dist/openapi/models/UploadProbeResponse.js +1 -1
- package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
- package/dist/openapi/models/UploadProbeStatus.js +1 -1
- package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
- package/dist/openapi/models/UploadResponse.d.ts +1 -1
- package/dist/openapi/models/UploadResponse.js +1 -1
- package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
- package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
- package/dist/openapi/models/UploadSource.d.ts +1 -1
- package/dist/openapi/models/UploadSource.js +1 -1
- package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
- package/dist/openapi/models/UploadThresholds.d.ts +26 -5
- package/dist/openapi/models/UploadThresholds.js +1 -1
- package/dist/openapi/models/UserTier.d.ts +18 -58
- package/dist/openapi/models/UserTier.js +18 -58
- package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
- package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
- package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
- package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
- package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
- package/dist/openapi/models/VerifyEmailRequest.js +1 -1
- package/dist/openapi/models/WarningType.d.ts +1 -1
- package/dist/openapi/models/WarningType.js +1 -1
- package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
- package/dist/openapi/models/WebhookOperationContext.js +1 -1
- package/dist/openapi/models/WebhookPayload.d.ts +1 -1
- package/dist/openapi/models/WebhookPayload.js +1 -1
- package/dist/openapi/models/WorkflowArchiveResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowArchiveResponse.js +1 -1
- package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
- package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
- package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
- package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
- package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
- package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowCreditSummary.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreditSummary.js +1 -1
- package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
- package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
- package/dist/openapi/models/WorkflowEdge.js +1 -1
- package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
- package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowListResponse.js +1 -1
- package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
- package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
- package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
- package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
- package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
- package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
- package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
- package/dist/openapi/models/WorkflowProcessing.js +1 -1
- package/dist/openapi/models/WorkflowRestoreResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowRestoreResponse.js +1 -1
- package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
- package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowSource.d.ts +1 -1
- package/dist/openapi/models/WorkflowSource.js +1 -1
- package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
- package/dist/openapi/models/WorkflowStatus.js +1 -1
- package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
- package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowSummary.d.ts +1 -1
- package/dist/openapi/models/WorkflowSummary.js +1 -1
- package/dist/openapi/models/WorkflowSummaryJob.d.ts +1 -1
- package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
- package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
- package/dist/openapi/models/WorkflowWarning.js +1 -1
- package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
- package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
- package/dist/openapi/models/index.d.ts +3 -0
- package/dist/openapi/models/index.js +3 -0
- package/dist/openapi/runtime.d.ts +1 -1
- package/dist/openapi/runtime.js +1 -1
- package/dist/operations/thumbnail.d.ts +30 -7
- package/dist/operations/thumbnail.js +34 -17
- package/dist/operations/thumbnail.metadata.js +29 -1
- package/openapi/README.md +1 -1
- package/openapi/api.yaml +659 -100
- package/operation-capabilities/operation-capabilities.json +1 -1
- package/operations/schemas/compress.yaml +67 -10
- package/operations/schemas/thumbnail.yaml +100 -1
- package/package.json +3 -3
package/openapi/api.yaml
CHANGED
|
@@ -89,7 +89,7 @@ info:
|
|
|
89
89
|
of truth instead of hardcoding magic numbers. A runtime
|
|
90
90
|
`GET /api/uploads/limits` endpoint for dynamic discovery
|
|
91
91
|
(per-tier / per-environment overrides) is a deferred follow-up.
|
|
92
|
-
version: 2.
|
|
92
|
+
version: 2.199.0
|
|
93
93
|
contact:
|
|
94
94
|
name: API Support
|
|
95
95
|
|
|
@@ -454,10 +454,26 @@ paths:
|
|
|
454
454
|
feature_tier_restricted: '#/components/schemas/FeatureTierRestrictedResponse'
|
|
455
455
|
'413':
|
|
456
456
|
description: |
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
457
|
+
Two rejection cases, discriminated by the `ErrorEnvelope.error`
|
|
458
|
+
code — the same pair as `POST /api/uploads`.
|
|
459
|
+
|
|
460
|
+
- **Byte size** — the file exceeds the absolute maximum upload size
|
|
461
|
+
(across all tiers). For tier-specific size caps below this
|
|
462
|
+
absolute limit, the server returns 403 with
|
|
463
|
+
`error_type: tier_restriction, restriction_kind: file_size`.
|
|
464
|
+
- **Pixel dimensions** (`error: IMAGE_DIMENSIONS_TOO_LARGE`) — as
|
|
465
|
+
declared on `POST /api/uploads`: a decodable raster image whose
|
|
466
|
+
`width x height` exceeds the configured pixel ceiling
|
|
467
|
+
(`UPLOAD_MAX_IMAGE_PIXELS`, default 16 MP), read from the file
|
|
468
|
+
**header** and rejected **before** decoding.
|
|
469
|
+
|
|
470
|
+
🔴 **THIS CASE WAS UNDECLARED HERE UNTIL 2026-08-28, AND THIS IS
|
|
471
|
+
THE PATH IT MATTERS MOST ON.** Multipart exists for LARGE uploads,
|
|
472
|
+
so a high-pixel image is *more* likely to arrive here than on the
|
|
473
|
+
single-shot endpoint where the ceiling was documented. A ceiling
|
|
474
|
+
declared on the small-file path and omitted from the large-file
|
|
475
|
+
path is worse than one declared nowhere: a consumer who reads the
|
|
476
|
+
contract concludes the rule does not apply here.
|
|
461
477
|
content:
|
|
462
478
|
application/json:
|
|
463
479
|
schema:
|
|
@@ -1244,20 +1260,29 @@ paths:
|
|
|
1244
1260
|
- name: archived
|
|
1245
1261
|
in: query
|
|
1246
1262
|
required: false
|
|
1247
|
-
x-availability:
|
|
1248
|
-
description: |
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1263
|
+
x-availability: stable
|
|
1264
|
+
description: |
|
|
1265
|
+
⚠️ **A SERVER THAT DOES NOT SUPPORT THIS PARAMETER SILENTLY
|
|
1266
|
+
IGNORES IT and returns the DEFAULT (non-archived) list** — it
|
|
1267
|
+
does not error. That asymmetry is why this is called out on the
|
|
1268
|
+
parameter and not only on the endpoints: `POST .../archive`
|
|
1269
|
+
would 404, which is loud and teaches the caller immediately,
|
|
1270
|
+
whereas **`archived=true` returns a 200 carrying the wrong
|
|
1271
|
+
rows** — a consumer asking for their archive receives their
|
|
1272
|
+
NON-archived workflows and is told nothing. **Silent wrong data
|
|
1273
|
+
beats a 404 every time for damage.**
|
|
1274
|
+
|
|
1275
|
+
✅ **IMPLEMENTED. This was `planned` and carried a "clients MUST
|
|
1276
|
+
NOT present an archived view" prohibition; both are struck.**
|
|
1277
|
+
Verified on `compression_api` `origin/main` before the flip
|
|
1278
|
+
rather than on report: the `ArchiveWorkflow` and
|
|
1279
|
+
`RestoreWorkflow` command handlers exist, and
|
|
1280
|
+
`WorkflowListReadPort` takes the `bool $archived` filter.
|
|
1281
|
+
⚠️ **What that establishes is that the code is MERGED, not that
|
|
1282
|
+
a given environment is running it** — availability in this
|
|
1283
|
+
contract has no environment axis, so read this as the shape
|
|
1284
|
+
being committed, and confirm deployment from the environment
|
|
1285
|
+
rather than from here.
|
|
1261
1286
|
|
|
1262
1287
|
Archived-row filter (ticket
|
|
1263
1288
|
[`j2s6T2qf`](https://trello.com/c/j2s6T2qf)). **Default `false`**:
|
|
@@ -2851,6 +2876,161 @@ paths:
|
|
|
2851
2876
|
Server-Sent Events stream. Each event has an `event` field (type)
|
|
2852
2877
|
and a `data` field (JSON payload). See endpoint description for
|
|
2853
2878
|
event types and payload shapes.
|
|
2879
|
+
'429':
|
|
2880
|
+
description: |
|
|
2881
|
+
**The CALLER's own concurrent-stream allowance is exhausted.**
|
|
2882
|
+
|
|
2883
|
+
Consistent with `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED`, which this
|
|
2884
|
+
contract already returns `429` for and describes as *"the caller's
|
|
2885
|
+
tier concurrency allowance is exhausted"*. **Same semantics, same
|
|
2886
|
+
code** — this caller is holding too many streams open.
|
|
2887
|
+
|
|
2888
|
+
⚠️ **NOT for a global-capacity refusal.** `429` tells a caller they
|
|
2889
|
+
went too fast; a caller who has opened nothing and is refused
|
|
2890
|
+
because the pool is full has not, and sending them to a slow-down
|
|
2891
|
+
remedy is a lie. That case is `503`.
|
|
2892
|
+
headers:
|
|
2893
|
+
Retry-After:
|
|
2894
|
+
description: Seconds to wait. Delta-seconds, not an HTTP-date.
|
|
2895
|
+
schema:
|
|
2896
|
+
type: integer
|
|
2897
|
+
content:
|
|
2898
|
+
application/json:
|
|
2899
|
+
schema:
|
|
2900
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2901
|
+
example:
|
|
2902
|
+
success: false
|
|
2903
|
+
error: SSE_CONNECTION_LIMIT_EXCEEDED
|
|
2904
|
+
message: Too many open event streams for this caller.
|
|
2905
|
+
'503':
|
|
2906
|
+
description: |
|
|
2907
|
+
**Global stream capacity is exhausted — nothing about this caller.**
|
|
2908
|
+
|
|
2909
|
+
🔴 **The cap this exists for is not a rate.** `events_stream` limits
|
|
2910
|
+
how fast streams START, not how many are OPEN, and a stream holds
|
|
2911
|
+
one PHP-FPM worker for its entire life. At 10 starts/min against a
|
|
2912
|
+
570s deadline a single caller sustains roughly 95 concurrent streams
|
|
2913
|
+
on a 50-worker pool **without exceeding any documented limit** —
|
|
2914
|
+
uploads, `/status`, auth and the health probes queue behind it.
|
|
2915
|
+
⇒ **An ordinary client can exhaust the pool using a documented
|
|
2916
|
+
feature within its documented limits.** No malice required.
|
|
2917
|
+
|
|
2918
|
+
🔴 **RECONNECT BEHAVIOUR DEPENDS ON THE CLIENT KIND, AND SAYING
|
|
2919
|
+
SO IS THE WHOLE POINT OF THIS BLOCK.** A `text/event-stream`
|
|
2920
|
+
endpoint is not necessarily consumed by an `EventSource`. The
|
|
2921
|
+
WHATWG rules below are **user-agent behaviour of `EventSource`**
|
|
2922
|
+
and hold for **nothing else** — a `fetch`-based reader supplies its
|
|
2923
|
+
own policy, and the two behave oppositely under refusal.
|
|
2924
|
+
|
|
2925
|
+
**(a) A NATIVE `EventSource`.** From the WHATWG HTML spec,
|
|
2926
|
+
Server-sent events (read 2026-08-22, api searched it and this repo
|
|
2927
|
+
verified it independently rather than relaying):
|
|
2928
|
+
|
|
2929
|
+
- *"if res's status is not 200, or if res's `Content-Type` is not
|
|
2930
|
+
`text/event-stream`, then fail the connection."*
|
|
2931
|
+
- *"Once the user agent has failed the connection, it does not
|
|
2932
|
+
attempt to reconnect."*
|
|
2933
|
+
- *"…if res is not a network error, then reestablish the
|
|
2934
|
+
connection."* — this is `processEventSourceEndOfBody`, i.e. a
|
|
2935
|
+
**clean EOF on an already-established 200 stream.**
|
|
2936
|
+
|
|
2937
|
+
⇒ For this client kind, refusing with a status does not storm, and
|
|
2938
|
+
**accept-then-close-with-an-in-band-error IS the reconnect path** —
|
|
2939
|
+
a clean EOF on an established stream is precisely what the spec
|
|
2940
|
+
reestablishes. ⭐ **The shape that reads as the gentler option is
|
|
2941
|
+
the one that amplifies**, and the intuition is backwards.
|
|
2942
|
+
|
|
2943
|
+
⚠️ Its cost, which must not be sold as graceful degradation: a
|
|
2944
|
+
refused stream **dead-ends**, permanently, with no retry of its
|
|
2945
|
+
own. ⇒ **Such a UI must treat refusal as TERMINAL and offer an
|
|
2946
|
+
explicit user-visible retry — never a spinner**, which would wait
|
|
2947
|
+
forever on a connection that is never coming back. It also **cannot
|
|
2948
|
+
read this status** (`EventSource` does not expose it to page
|
|
2949
|
+
script), so it cannot tell `503` from `500`.
|
|
2950
|
+
|
|
2951
|
+
**(b) A `fetch`-BASED READER — WHICH IS WHAT OUR FRONTEND IS.**
|
|
2952
|
+
Measured at `compression_frontend` `origin/main` on 2026-08-25 by
|
|
2953
|
+
two independent parties: **zero `EventSource` references** across
|
|
2954
|
+
its source tree (positive control on the same enumeration: several
|
|
2955
|
+
files reference this endpoint), a plain `fetch()` whose own comment
|
|
2956
|
+
says *"a direct fetch, not an SDK call"*. It reads
|
|
2957
|
+
`response.status` fine.
|
|
2958
|
+
|
|
2959
|
+
Its refusal behaviour, **as a SHAPE — the counts and intervals are
|
|
2960
|
+
configurable defaults in that repo and are deliberately not
|
|
2961
|
+
restated here, because a number copied across a repo boundary rots
|
|
2962
|
+
silently**: a non-200 is raised as a *transport error*, retried a
|
|
2963
|
+
bounded number of times on a delay, and then falls through to
|
|
2964
|
+
`/status` polling with **adaptive backoff** — the interval GROWS
|
|
2965
|
+
while the server reports no movement.
|
|
2966
|
+
|
|
2967
|
+
⚠️ **And the `/status` poll is NOT started by the fallback.** It
|
|
2968
|
+
runs **in parallel from the outset**, as resilience against a
|
|
2969
|
+
gateway that cannot proxy SSE, and **self-cancels on the stream's
|
|
2970
|
+
first event.** A refused stream never delivers one — so **refusal
|
|
2971
|
+
does not start a poll, it prevents an already-running poll from
|
|
2972
|
+
being cancelled.**
|
|
2973
|
+
|
|
2974
|
+
🔴 **SO REFUSAL TRADES CONTINUOUS WORKER OCCUPANCY FOR A HIGHER
|
|
2975
|
+
REQUEST RATE.** Both halves matter: a held stream pins one PHP-FPM
|
|
2976
|
+
worker for its whole life and refusal genuinely sheds that — a
|
|
2977
|
+
short poll is not a held connection — while that client's
|
|
2978
|
+
connection attempts and polls go **up**.
|
|
2979
|
+
⚠️ **Do not read either half alone.** "Refusal sheds load" invites
|
|
2980
|
+
a cap whose success metric moves the wrong way; "refusal increases
|
|
2981
|
+
load" argues against having a cap at all, and the occupancy it
|
|
2982
|
+
sheds is the resource this limit exists for.
|
|
2983
|
+
|
|
2984
|
+
⚠️ **THAT IS PER-CLIENT AND MEASURED. THE AGGREGATE IS NEITHER.**
|
|
2985
|
+
Whether refusing many clients at once produces a synchronised burst
|
|
2986
|
+
is **UNMEASURED** — the retry delay is a fixed configured interval
|
|
2987
|
+
with no jitter, so refusals issued together are retried together,
|
|
2988
|
+
and nothing here has observed what that does in aggregate. **Do not
|
|
2989
|
+
read "not a storm" out of this section; it says the per-client cost
|
|
2990
|
+
is bounded and says nothing about the fleet.**
|
|
2991
|
+
|
|
2992
|
+
📌 **WHAT A REFUSED `fetch` CLIENT SHOULD DO INSTEAD IS NOT YET
|
|
2993
|
+
SPECIFIED** — including whether `Retry-After` governs a fallback
|
|
2994
|
+
poll interval and not only a reconnect. Falling back to polling
|
|
2995
|
+
is also load, merely cheaper. Open on
|
|
2996
|
+
[`rLCBjojv`](https://trello.com/c/rLCBjojv); **this block states the
|
|
2997
|
+
measured behaviour and deliberately does not invent the
|
|
2998
|
+
obligation.**
|
|
2999
|
+
|
|
3000
|
+
📌 **THE POPULATIONS SPLIT BY READER KIND, NOT BY
|
|
3001
|
+
BROWSER-VERSUS-NOT.** The WHATWG rule covers **native
|
|
3002
|
+
`EventSource` consumers** and nothing else. **A custom reader is
|
|
3003
|
+
safe only by its own code, inside a browser or outside one** — and
|
|
3004
|
+
a retry loop treating `429`/`503` as retryable on a fixed interval
|
|
3005
|
+
is where a storm is reachable. ⚠️ **Our own frontend is in that
|
|
3006
|
+
population, not exempt from it.**
|
|
3007
|
+
|
|
3008
|
+
✅ **For OUR SDKs that is measured, not assumed** (sdks,
|
|
3009
|
+
2026-08-22, driven through the BUILT client with a stubbed
|
|
3010
|
+
transport and a positive control): `429`, `503` and a `429` with no
|
|
3011
|
+
`Retry-After` each produce **exactly one request**; the control
|
|
3012
|
+
`200` also produces one, proving the stub was reached.
|
|
3013
|
+
`GislClient.request()` has no retry layer, `streamEvents` reaches
|
|
3014
|
+
none of the upload/probe retry predicates, and there is no
|
|
3015
|
+
Last-Event-ID reconnection in either language.
|
|
3016
|
+
⚠️ **That is a property of the current SDK, not of the contract** —
|
|
3017
|
+
it can be undone by an ordinary change to a retry policy, and this
|
|
3018
|
+
endpoint would not notice.
|
|
3019
|
+
headers:
|
|
3020
|
+
Retry-After:
|
|
3021
|
+
description: |
|
|
3022
|
+
Seconds to wait before retrying. Delta-seconds, not an
|
|
3023
|
+
HTTP-date. **Also unreadable by `EventSource`** — see above.
|
|
3024
|
+
schema:
|
|
3025
|
+
type: integer
|
|
3026
|
+
content:
|
|
3027
|
+
application/json:
|
|
3028
|
+
schema:
|
|
3029
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
3030
|
+
example:
|
|
3031
|
+
success: false
|
|
3032
|
+
error: SSE_CAPACITY_EXHAUSTED
|
|
3033
|
+
message: Event stream capacity is temporarily exhausted.
|
|
2854
3034
|
'404':
|
|
2855
3035
|
description: Workflow not found
|
|
2856
3036
|
content:
|
|
@@ -5189,6 +5369,70 @@ paths:
|
|
|
5189
5369
|
$ref: '#/components/schemas/ErrorEnvelope'
|
|
5190
5370
|
|
|
5191
5371
|
/api/auth/profile:
|
|
5372
|
+
get:
|
|
5373
|
+
summary: Get the authenticated identity (whoami)
|
|
5374
|
+
description: |
|
|
5375
|
+
Returns the caller's own identity. **This endpoint SHIPS and was
|
|
5376
|
+
undocumented until 2026-08-22** — the contract described only `PATCH`
|
|
5377
|
+
on this path, and three sessions independently concluded that no
|
|
5378
|
+
whoami capability existed because they read the contract rather than
|
|
5379
|
+
the API. **A contract that omits a shipped endpoint is exactly as
|
|
5380
|
+
dangerous as one that documents a missing one.**
|
|
5381
|
+
|
|
5382
|
+
⚠️ **Documented from the producer, not from a test.** The response
|
|
5383
|
+
shape below is taken from `ProfileController::profile()` in
|
|
5384
|
+
`compression_api`. An e2e test asserts only `data.user.id` and
|
|
5385
|
+
`data.user.email`; writing the schema from it would have documented
|
|
5386
|
+
two of eight fields and called the rest absent.
|
|
5387
|
+
|
|
5388
|
+
🔴 **`tier` is emitted through `UserTier::canonicalValue()`**, which
|
|
5389
|
+
returns the WIRE spelling of the base tier — see `UserTier` for the
|
|
5390
|
+
`basic`/`free` transition and why the two spellings are one tier.
|
|
5391
|
+
operationId: getProfile
|
|
5392
|
+
security:
|
|
5393
|
+
- bearerAuth: []
|
|
5394
|
+
- sessionAuth: []
|
|
5395
|
+
x-identity-scoped: true
|
|
5396
|
+
tags:
|
|
5397
|
+
- Auth
|
|
5398
|
+
responses:
|
|
5399
|
+
'200':
|
|
5400
|
+
description: The authenticated identity.
|
|
5401
|
+
content:
|
|
5402
|
+
application/json:
|
|
5403
|
+
schema:
|
|
5404
|
+
type: object
|
|
5405
|
+
required: [success, data]
|
|
5406
|
+
properties:
|
|
5407
|
+
success:
|
|
5408
|
+
type: boolean
|
|
5409
|
+
enum: [true]
|
|
5410
|
+
data:
|
|
5411
|
+
type: object
|
|
5412
|
+
required: [user]
|
|
5413
|
+
properties:
|
|
5414
|
+
user:
|
|
5415
|
+
$ref: '#/components/schemas/AuthenticatedIdentity'
|
|
5416
|
+
'401':
|
|
5417
|
+
description: No authenticated principal.
|
|
5418
|
+
content:
|
|
5419
|
+
application/json:
|
|
5420
|
+
schema:
|
|
5421
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
5422
|
+
'404':
|
|
5423
|
+
description: |
|
|
5424
|
+
The authenticated principal no longer resolves to a stored user
|
|
5425
|
+
(`error: USER_NOT_FOUND`).
|
|
5426
|
+
content:
|
|
5427
|
+
application/json:
|
|
5428
|
+
schema:
|
|
5429
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
5430
|
+
'500':
|
|
5431
|
+
description: Internal server error.
|
|
5432
|
+
content:
|
|
5433
|
+
application/json:
|
|
5434
|
+
schema:
|
|
5435
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
5192
5436
|
patch:
|
|
5193
5437
|
summary: Update the authenticated user's profile
|
|
5194
5438
|
description: |
|
|
@@ -5608,7 +5852,29 @@ paths:
|
|
|
5608
5852
|
summary: Get current credit balance
|
|
5609
5853
|
description: |
|
|
5610
5854
|
Returns a snapshot of the caller's credit position at request
|
|
5611
|
-
time.
|
|
5855
|
+
time.
|
|
5856
|
+
|
|
5857
|
+
🔴 **EVENTUALLY CONSISTENT WITH A COMPLETED CHECKOUT, AND THIS
|
|
5858
|
+
RESPONSE CARRIES NO FRESHNESS SIGNAL.** A credit-pack purchase is
|
|
5859
|
+
granted on an asynchronous server-to-server callback, so a
|
|
5860
|
+
snapshot taken just after the Stripe redirect **may legitimately
|
|
5861
|
+
predate the grant**. There is **no timestamp, no version, no
|
|
5862
|
+
pending state and no session correlation** here — the fields
|
|
5863
|
+
below are the whole of it — so **this endpoint cannot
|
|
5864
|
+
distinguish "the grant has not landed yet" from "the payment did
|
|
5865
|
+
not credit you".**
|
|
5866
|
+
|
|
5867
|
+
⇒ **Do not treat an unchanged balance after checkout as a
|
|
5868
|
+
failure.** Those two states need opposite handling — *wait*
|
|
5869
|
+
versus *contact support* — and the way to tell them apart is
|
|
5870
|
+
`GET /api/v2/credits/usage`, correlating on the checkout
|
|
5871
|
+
`session_id`, not this endpoint. See
|
|
5872
|
+
`POST /api/billing/checkout` for the full model, **including
|
|
5873
|
+
that nothing detects a callback which never arrives.**
|
|
5874
|
+
|
|
5875
|
+
⛔ **No interval is stated anywhere in this contract**, because
|
|
5876
|
+
none has been measured end to end. Any client timeout is the
|
|
5877
|
+
client's own choice and is not sanctioned here. Per ticket [I23 `DffjC3zm`](https://trello.com/c/DffjC3zm)
|
|
5612
5878
|
+ plan v5 §F9 round-13 narrowing — this endpoint is the
|
|
5613
5879
|
canonical user-visible billing-state surface.
|
|
5614
5880
|
|
|
@@ -6013,6 +6279,43 @@ paths:
|
|
|
6013
6279
|
frontend can hide/disable the upgrade affordance without
|
|
6014
6280
|
hard-coding the rollout state.
|
|
6015
6281
|
|
|
6282
|
+
🔴 **THE CREDIT GRANT IS ASYNCHRONOUS. THE BALANCE WILL NOT
|
|
6283
|
+
REFLECT IT WHEN STRIPE REDIRECTS THE USER BACK.** Credits are
|
|
6284
|
+
granted on the server-to-server callback, which arrives
|
|
6285
|
+
independently of the browser redirect. A client reading
|
|
6286
|
+
`GET /api/v2/credits/balance` immediately on return **may
|
|
6287
|
+
legitimately see the pre-purchase value, and that is not an
|
|
6288
|
+
error.**
|
|
6289
|
+
|
|
6290
|
+
**How to observe the grant:** poll `GET /api/v2/credits/usage`
|
|
6291
|
+
for a transaction whose `reference_id` equals the `session_id`
|
|
6292
|
+
returned here. That is the only client-observable correlation
|
|
6293
|
+
between a checkout and its credits. ⚠️ See
|
|
6294
|
+
`CreditTransaction.reference_id` — **the pack-purchase path does
|
|
6295
|
+
not populate it yet**, so today there is nothing to match on.
|
|
6296
|
+
|
|
6297
|
+
⛔ **NO TIMING IS STATED, DELIBERATELY.** The interval is
|
|
6298
|
+
dominated by the provider's callback delivery latency, which
|
|
6299
|
+
**this system does not measure**. Production has processed
|
|
6300
|
+
**zero** such events; staging exactly one, a synthetic rehearsal
|
|
6301
|
+
purchase — n=1, idle box, caller not a browser. **No bound is
|
|
6302
|
+
derivable from that**, and a client MUST NOT build a timeout
|
|
6303
|
+
from any figure in this contract, because there is none.
|
|
6304
|
+
|
|
6305
|
+
⇒ **Show a pending state rather than a failure.** Absence of
|
|
6306
|
+
credits after checkout is **indeterminate, not negative**.
|
|
6307
|
+
|
|
6308
|
+
🔴 **AND THE BRANCH A CLIENT MUST NOT BE PROMISED AWAY FROM:
|
|
6309
|
+
NOTHING DETECTS A CALLBACK THAT NEVER ARRIVES.** Recovery relies
|
|
6310
|
+
on the provider's own retries. There is **no server-side
|
|
6311
|
+
reconciliation** comparing completed checkouts against granted
|
|
6312
|
+
credits, and an event already marked terminal **cannot be
|
|
6313
|
+
reopened**. **No customer-visible recovery route exists and no
|
|
6314
|
+
automated one** — the manual path is an operator action. ⇒ A
|
|
6315
|
+
client that has waited past any interval it considers reasonable
|
|
6316
|
+
should **direct the user to support with the `session_id`**,
|
|
6317
|
+
which is the only handle both sides share.
|
|
6318
|
+
|
|
6016
6319
|
The Stripe **webhook** (`POST /api/webhooks/stripe`) is a
|
|
6017
6320
|
server-to-server, signature-authenticated callback and is
|
|
6018
6321
|
deliberately **not** part of this client contract.
|
|
@@ -6726,6 +7029,10 @@ components:
|
|
|
6726
7029
|
customer path carries the same signal as the SSE/message
|
|
6727
7030
|
surface. Cross-spec enum parity is verified by
|
|
6728
7031
|
`tests/test_asyncapi_named_schemas.py`.
|
|
7032
|
+
# OPEN. Purely diagnostic — it reports which path `auto` took so a caller can
|
|
7033
|
+
# see why. An unrecognised path does not change any decision a consumer makes,
|
|
7034
|
+
# so a new one is safely ignorable and additive.
|
|
7035
|
+
x-enum-openness: open
|
|
6729
7036
|
enum:
|
|
6730
7037
|
- stream_copy
|
|
6731
7038
|
- re_encode
|
|
@@ -6752,6 +7059,12 @@ components:
|
|
|
6752
7059
|
See `schemas/FORMAT.md` §Availability Taxonomy and
|
|
6753
7060
|
`docs/decisions/0001-contract-first-availability.md` for the full
|
|
6754
7061
|
rules, vocabulary rationale, and parser obligations.
|
|
7062
|
+
# CLOSED. A consumer uses this to decide whether to EXPOSE a feature, so an
|
|
7063
|
+
# unrecognised level cannot be handled safely in either direction — hiding a
|
|
7064
|
+
# live capability or surfacing one that is not. ADR-0001 §1.3 defines exactly
|
|
7065
|
+
# these five; a sixth is a contract event that consumers must be updated for,
|
|
7066
|
+
# and failing loudly is the correct way to require that.
|
|
7067
|
+
x-enum-openness: closed
|
|
6755
7068
|
enum:
|
|
6756
7069
|
- stable
|
|
6757
7070
|
- beta
|
|
@@ -7654,8 +7967,23 @@ components:
|
|
|
7654
7967
|
overridden:
|
|
7655
7968
|
type: boolean
|
|
7656
7969
|
description: |
|
|
7657
|
-
|
|
7658
|
-
|
|
7970
|
+
Whether `effective` came from a per-account override rather than
|
|
7971
|
+
the tier default.
|
|
7972
|
+
|
|
7973
|
+
🔴 **RESERVED, AND STRUCTURALLY `false` TODAY — DO NOT BRANCH ON
|
|
7974
|
+
IT.** No per-account override store exists, and the API's resolver
|
|
7975
|
+
is called with no override for either limit, so **every response
|
|
7976
|
+
carries `false`, and will until an override store ships.**
|
|
7977
|
+
Measured by `compression_api` on 2026-08-28.
|
|
7978
|
+
|
|
7979
|
+
⚠️ It is declared **required**, so a consumer must handle a field
|
|
7980
|
+
that currently takes exactly one value. It is kept rather than
|
|
7981
|
+
removed because this is the shape an environment-overridable limit
|
|
7982
|
+
needs, and removing it would be a breaking change to re-make later.
|
|
7983
|
+
|
|
7984
|
+
📌 **A test asserting `overridden === false` would be a decoration
|
|
7985
|
+
— no input makes it fail.** When an override store exists, assert
|
|
7986
|
+
against that, not against this field now.
|
|
7659
7987
|
|
|
7660
7988
|
CreditTransaction:
|
|
7661
7989
|
type: object
|
|
@@ -7782,10 +8110,31 @@ components:
|
|
|
7782
8110
|
type: string
|
|
7783
8111
|
description: |
|
|
7784
8112
|
Identifier of the referenced entity. Typically a UUID v7
|
|
7785
|
-
for `workflow` references
|
|
7786
|
-
|
|
7787
|
-
`
|
|
7788
|
-
|
|
8113
|
+
for `workflow` references; other reference types may use
|
|
8114
|
+
non-UUID identifiers and this is NOT constrained to
|
|
8115
|
+
`UuidV7`.
|
|
8116
|
+
|
|
8117
|
+
🔴 **FOR A `top_up` FROM CHECKOUT THIS IS THE CHECKOUT
|
|
8118
|
+
SESSION ID (`cs_...`) — THE IDENTIFIER THE CLIENT ACTUALLY
|
|
8119
|
+
HOLDS.** It is returned as
|
|
8120
|
+
`BillingCheckoutSession.session_id` when the session is
|
|
8121
|
+
created, and it is the handle that makes the asynchronous
|
|
8122
|
+
credit grant observable. See `POST /api/billing/checkout`.
|
|
8123
|
+
|
|
8124
|
+
⚠️ **This description previously named a Stripe PAYMENT
|
|
8125
|
+
INTENT id.** A client never receives one — checkout returns
|
|
8126
|
+
`checkout_url` and `session_id` and nothing else — so the
|
|
8127
|
+
only correlator this contract named was one the caller
|
|
8128
|
+
could not obtain.
|
|
8129
|
+
|
|
8130
|
+
🔴 **NOT YET POPULATED ON THE PACK-PURCHASE PATH.**
|
|
8131
|
+
`compression_api` measured 2026-08-28: the pack grant writes
|
|
8132
|
+
a free-text description naming the SKU and leaves
|
|
8133
|
+
`reference_type` / `reference_id` empty, so **two purchases
|
|
8134
|
+
of the same pack are indistinguishable**. Reservations do
|
|
8135
|
+
populate them. Until the session id is wired through, a
|
|
8136
|
+
`top_up` row carries no correlator and the polling strategy
|
|
8137
|
+
described on checkout has nothing to match on.
|
|
7789
8138
|
created_at:
|
|
7790
8139
|
type: string
|
|
7791
8140
|
format: date-time
|
|
@@ -8309,6 +8658,9 @@ components:
|
|
|
8309
8658
|
rule when product/Lambda confirms detection logic.)
|
|
8310
8659
|
|
|
8311
8660
|
Per ticket [I25 `i5yCuSZc`](https://trello.com/c/i5yCuSZc).
|
|
8661
|
+
# `WarningType` carries the NORMATIVE statement of the additive convention
|
|
8662
|
+
# ("SDKs MUST treat the enum as additive"), so it is open by its own declaration.
|
|
8663
|
+
x-enum-openness: open
|
|
8312
8664
|
enum:
|
|
8313
8665
|
- redundant_pre_encode_before_reencode_merge
|
|
8314
8666
|
|
|
@@ -8490,52 +8842,72 @@ components:
|
|
|
8490
8842
|
# USER TIER + TIER RESTRICTION ENVELOPES
|
|
8491
8843
|
# ============================================
|
|
8492
8844
|
|
|
8845
|
+
AuthenticatedIdentity:
|
|
8846
|
+
type: object
|
|
8847
|
+
description: |
|
|
8848
|
+
The caller's own identity, as returned by `GET /api/auth/profile`.
|
|
8849
|
+
|
|
8850
|
+
**Documented from `ProfileController::profile()` in `compression_api`,
|
|
8851
|
+
2026-08-22, after the endpoint was found to ship undocumented.**
|
|
8852
|
+
Nullability is taken from `UserRecord`'s constructor promotion, not
|
|
8853
|
+
inferred from a sample response — a field that happens to be populated
|
|
8854
|
+
in one response says nothing about whether it can be null.
|
|
8855
|
+
required:
|
|
8856
|
+
- id
|
|
8857
|
+
- email
|
|
8858
|
+
- tier
|
|
8859
|
+
- email_verified
|
|
8860
|
+
- created_at
|
|
8861
|
+
properties:
|
|
8862
|
+
id:
|
|
8863
|
+
type: string
|
|
8864
|
+
description: Stable identifier for the user.
|
|
8865
|
+
email:
|
|
8866
|
+
type: string
|
|
8867
|
+
format: email
|
|
8868
|
+
name:
|
|
8869
|
+
type: string
|
|
8870
|
+
nullable: true
|
|
8871
|
+
description: Display name. Nullable — `UserRecord::$name` defaults to null.
|
|
8872
|
+
tier:
|
|
8873
|
+
allOf:
|
|
8874
|
+
- $ref: '#/components/schemas/UserTier'
|
|
8875
|
+
description: |
|
|
8876
|
+
🔴 **Emitted through `UserTier::canonicalValue()`**, which returns the
|
|
8877
|
+
WIRE spelling of the base tier. See `UserTier` for why `basic` and
|
|
8878
|
+
`free` are one tier under two names and must rank identically.
|
|
8879
|
+
email_verified:
|
|
8880
|
+
type: boolean
|
|
8881
|
+
description: |
|
|
8882
|
+
Derived — true iff `UserRecord::$emailVerifiedAt` is set. The
|
|
8883
|
+
timestamp itself is NOT exposed on this endpoint.
|
|
8884
|
+
pending_email:
|
|
8885
|
+
type: string
|
|
8886
|
+
format: email
|
|
8887
|
+
nullable: true
|
|
8888
|
+
description: A requested email change awaiting confirmation, if any.
|
|
8889
|
+
created_at:
|
|
8890
|
+
type: string
|
|
8891
|
+
format: date-time
|
|
8892
|
+
delete_requested_at:
|
|
8893
|
+
type: string
|
|
8894
|
+
format: date-time
|
|
8895
|
+
nullable: true
|
|
8896
|
+
description: |
|
|
8897
|
+
Set when the user has requested account deletion and not cancelled
|
|
8898
|
+
it. Nullable in the normal case.
|
|
8493
8899
|
UserTier:
|
|
8494
8900
|
type: string
|
|
8495
8901
|
description: |
|
|
8496
8902
|
Subscription tier. Mirrors the API-side
|
|
8497
8903
|
`App\Identity\Domain\Enums\UserTier` PHP enum.
|
|
8498
8904
|
|
|
8499
|
-
|
|
8500
|
-
|
|
8501
|
-
|
|
8502
|
-
|
|
8503
|
-
|
|
8504
|
-
|
|
8505
|
-
|
|
8506
|
-
⚠️ **A CONSUMER MUST TREAT THEM AS EQUAL.** Anything that compares,
|
|
8507
|
-
sorts or gates on tier must accept either and rank them identically;
|
|
8508
|
-
a `match`/`switch` that handles `free` and not `basic` will silently
|
|
8509
|
-
take a different branch the day the producer switches.
|
|
8510
|
-
|
|
8511
|
-
🔴 **PRODUCERS: DO NOT EMIT `basic` YET. THE FIRST WRITE IS AN
|
|
8512
|
-
OUTAGE, NOT A COMPILE ERROR.** This change makes the value *legal*, not
|
|
8513
|
-
*live*. **Schema-additive and safe-to-send are different claims**, and
|
|
8514
|
-
the gap between them is measured rather than theoretical:
|
|
8515
|
-
|
|
8516
|
-
- **api (2026-08-20, from its own mapping):** `UserRecord` declares the
|
|
8517
|
-
column `enumType: UserTier::class`. Doctrine hydrates such a column
|
|
8518
|
-
through `EnumPropertyAccessor::setValue()`, which calls
|
|
8519
|
-
`$enumType::from($value)` — **and that THROWS on a value it does not
|
|
8520
|
-
know**, with no extension point. **A row persisted as `basic` makes
|
|
8521
|
-
every running api task 500 while hydrating that user.**
|
|
8522
|
-
- **And the rollout overlaps by design:** ECS runs
|
|
8523
|
-
`minimumHealthyPercent: 100` / `maximumPercent: 200`, so the NEW task
|
|
8524
|
-
starts before the OLD one drains. **The moment a new task writes a
|
|
8525
|
-
value the old one has never heard of, the old task 500s on that row
|
|
8526
|
-
for the rest of the rollout.**
|
|
8527
|
-
- **SDKs fail earlier and more kindly:** a generated Rust or PHP enum
|
|
8528
|
-
gains a variant and an exhaustive match stops compiling.
|
|
8529
|
-
|
|
8530
|
-
⭐ **AN ADDED ENUM VALUE IS A CONTRACT CHANGE WEARING A SCHEMA CHANGE'S
|
|
8531
|
-
CLOTHES.** A new COLUMN is invisible to old code's `SELECT` list; a new
|
|
8532
|
-
enum VALUE is **not** invisible to old code's hydration. *That asymmetry
|
|
8533
|
-
is why expand → migrate → contract fails to get applied to enums — the
|
|
8534
|
-
trigger does not look like the category.* (api's own note, written
|
|
8535
|
-
during an earlier enum sweep and reached independently of this one.)
|
|
8536
|
-
Emission is gated on the tolerance evidence table
|
|
8537
|
-
([`tkRA9Bim`](https://trello.com/c/tkRA9Bim)), which requires an
|
|
8538
|
-
artefact from each of api, both SDK packages, frontend and e2e.
|
|
8905
|
+
`basic` is the base tier. **`free` is DEPRECATED and will be removed**
|
|
8906
|
+
([`nD8fCPDy`](https://trello.com/c/nD8fCPDy)) — the two are one tier
|
|
8907
|
+
under two names, never two tiers, and a consumer must rank them
|
|
8908
|
+
identically. The dated record of the rename and of the rollout that
|
|
8909
|
+
carried it is
|
|
8910
|
+
[ADR-0028](../docs/decisions/0028-base-tier-rename-free-to-basic.md).
|
|
8539
8911
|
|
|
8540
8912
|
🔴 **`guest` IS NOT AND MUST NOT BECOME A MEMBER OF THIS ENUM.** It is
|
|
8541
8913
|
the *absence* of a subscription, not a tier. Putting it here places a
|
|
@@ -8545,7 +8917,7 @@ components:
|
|
|
8545
8917
|
the audience axis, which is NOT a `UserTier` value. Asserted by a
|
|
8546
8918
|
test, not left to prose.
|
|
8547
8919
|
|
|
8548
|
-
Ordering is `basic
|
|
8920
|
+
Ordering is `basic` < `pro` < `max` < `enterprise` (the
|
|
8549
8921
|
upgrade-resolver / `isHigherThan` ordinal in `UserTier.php`).
|
|
8550
8922
|
**The ordering is the part this contract owns** — it is what
|
|
8551
8923
|
`TierRestrictionResponse.current_tier` / `.required_tier` and
|
|
@@ -8556,28 +8928,22 @@ components:
|
|
|
8556
8928
|
summary — upload caps, permitted MIME families, monthly credits,
|
|
8557
8929
|
overdraft, rate-limit multiples, concurrent long-form jobs. **That was a
|
|
8558
8930
|
restated SNAPSHOT of another repository's code, and it drifted, twice:**
|
|
8559
|
-
|
|
8560
|
-
|
|
8561
|
-
|
|
8562
|
-
own and cannot keep true;
|
|
8563
|
-
- and the parallel table on `AccountLimits` listed tier byte defaults
|
|
8564
|
-
for `free` / `pro` / `enterprise` and **silently omitted `max`**, a
|
|
8565
|
-
tier this very enum declares. **That one was already wrong before any
|
|
8566
|
-
of it was reviewed.**
|
|
8931
|
+
once asserting a per-tier media restriction this contract does not own
|
|
8932
|
+
and cannot keep true, and once listing tier byte defaults while
|
|
8933
|
+
**silently omitting `max`**, a tier this very enum declares.
|
|
8567
8934
|
|
|
8568
8935
|
**A description ships to every SDK consumer as generated documentation**,
|
|
8569
8936
|
so a stale sentence here is not an internal note — it is an assertion
|
|
8570
8937
|
delivered to callers, and it outlives the code it describes. *Point at
|
|
8571
8938
|
the gate, not at a snapshot of it.*
|
|
8572
8939
|
|
|
8573
|
-
⚠️ **No claim is made HERE about which media categories a tier permits
|
|
8574
|
-
|
|
8575
|
-
|
|
8576
|
-
|
|
8577
|
-
|
|
8578
|
-
|
|
8579
|
-
|
|
8580
|
-
generated declaration is the fix**, and the two must not both exist.
|
|
8940
|
+
⚠️ **No claim is made HERE about which media categories a tier permits.**
|
|
8941
|
+
That is a scoping statement about this description, **not a claim that
|
|
8942
|
+
the contract is silent on the subject**: hub decision 25 made audio
|
|
8943
|
+
universal, so there is no tier boundary at which the category axis
|
|
8944
|
+
changes. **Prose that restates another repository's enforcement is the
|
|
8945
|
+
defect; a single generated declaration is the fix**, and the two must
|
|
8946
|
+
not both exist.
|
|
8581
8947
|
|
|
8582
8948
|
**Where the answers actually live — and they are DIFFERENT SURFACES,
|
|
8583
8949
|
which is why naming just one was wrong:**
|
|
@@ -8606,6 +8972,14 @@ components:
|
|
|
8606
8972
|
429 response). **The per-tier numbers are deliberately not restated
|
|
8607
8973
|
here** — read them from the source above.
|
|
8608
8974
|
|
|
8975
|
+
# CLOSED, AND DELIBERATELY SO. The values are an ORDERED ladder driving upgrade
|
|
8976
|
+
# prompts and tier comparisons — an unknown tier cannot be RANKED, so a consumer
|
|
8977
|
+
# that silently accepted one would place it arbitrarily in that ordering.
|
|
8978
|
+
# Failing on an unknown tier is the correct behaviour.
|
|
8979
|
+
# SURVEY TRAP: this schema's description mentions "typed-open", but that
|
|
8980
|
+
# sentence is about `AccountLimits.limits`, NOT about this enum. A keyword
|
|
8981
|
+
# sweep reads it as open. It is not.
|
|
8982
|
+
x-enum-openness: closed
|
|
8609
8983
|
enum:
|
|
8610
8984
|
- basic
|
|
8611
8985
|
- free
|
|
@@ -8627,7 +9001,14 @@ components:
|
|
|
8627
9001
|
# ⚠️ NOT A DATE. Removal is gated on every consumer having stopped
|
|
8628
9002
|
# EMITTING and REQUIRING the value, which is evidence rather than a
|
|
8629
9003
|
# calendar. A date here would be overtaken and then cited.
|
|
8630
|
-
|
|
9004
|
+
# ⚠️ NOT A DATE, and now TWO conditions. `compression_api` measured
|
|
9005
|
+
# production on 2026-08-27: `users.tier` `column_default` is still
|
|
9006
|
+
# `'free'::character varying`. The persisted-value constant governs
|
|
9007
|
+
# what the application WRITES; the default is SCHEMA, baked into a
|
|
9008
|
+
# migration, so moving the constant never touched it. ⇒ "there are no
|
|
9009
|
+
# `free` rows" is a fact about today's CONTENTS, not a property of the
|
|
9010
|
+
# system — an INSERT omitting the column still manufactures one.
|
|
9011
|
+
removal_gate: "consumer evidence table on nD8fCPDy AND the users.tier column default migrated and drained"
|
|
8631
9012
|
|
|
8632
9013
|
TierRestrictionKind:
|
|
8633
9014
|
type: string
|
|
@@ -9219,6 +9600,9 @@ components:
|
|
|
9219
9600
|
server. Equivalent to `cancelled` for downstream
|
|
9220
9601
|
accounting; distinct status so dashboards can surface the
|
|
9221
9602
|
natural-expiry vs caller-initiated distinction.
|
|
9603
|
+
# Declared "additive widening; V1 clients ignoring unknown enum values
|
|
9604
|
+
# continue to function".
|
|
9605
|
+
x-enum-openness: open
|
|
9222
9606
|
enum:
|
|
9223
9607
|
- pending
|
|
9224
9608
|
- in_progress
|
|
@@ -9246,6 +9630,8 @@ components:
|
|
|
9246
9630
|
- `in_progress`: At least one operation is running.
|
|
9247
9631
|
- `completed`: All operations completed successfully.
|
|
9248
9632
|
- `failed`: Job failed (at least one operation failed).
|
|
9633
|
+
# Declared "additive widening".
|
|
9634
|
+
x-enum-openness: open
|
|
9249
9635
|
enum:
|
|
9250
9636
|
- pending
|
|
9251
9637
|
- waiting
|
|
@@ -9319,6 +9705,13 @@ components:
|
|
|
9319
9705
|
V1 `watermark` operation removed at V2 cutover (I4-CONS) —
|
|
9320
9706
|
replaced by `image_watermark` + `text_watermark` per ADR-0004
|
|
9321
9707
|
§"Greenfield V2.0 cutover".
|
|
9708
|
+
# CLOSED on BOTH sides, and the two sides declare DIFFERENT VALUE SETS on
|
|
9709
|
+
# purpose — see schemas/cross-document-enums.yaml. openapi types the CREATE
|
|
9710
|
+
# SURFACE; asyncapi types the PAYLOAD FIELD, which stays coarse because the
|
|
9711
|
+
# thumbnail sub-types travel on the SNS message ATTRIBUTE, not in the payload.
|
|
9712
|
+
# Closed because an unrecognised operation type cannot be dispatched or
|
|
9713
|
+
# rendered; guessing is never right.
|
|
9714
|
+
x-enum-openness: closed
|
|
9322
9715
|
enum:
|
|
9323
9716
|
- compress
|
|
9324
9717
|
- thumbnail
|
|
@@ -9428,10 +9821,31 @@ components:
|
|
|
9428
9821
|
use the multipart flow
|
|
9429
9822
|
(`POST /api/uploads/multipart/initiate` → chunk PUTs →
|
|
9430
9823
|
`POST /api/uploads/multipart/complete`). 10 MB /
|
|
9431
|
-
10,000,000 bytes —
|
|
9432
|
-
|
|
9433
|
-
|
|
9434
|
-
|
|
9824
|
+
10,000,000 bytes — matching the **API Gateway HTTP API
|
|
9825
|
+
payload quota** that fronts `api.<domain>`.
|
|
9826
|
+
|
|
9827
|
+
🔴 **THIS CANNOT BE INCREASED.** AWS documents the HTTP API
|
|
9828
|
+
payload limit as 10 MB, "Can be increased: No". It is a
|
|
9829
|
+
platform quota, not a tunable setting, so there is no
|
|
9830
|
+
configuration change or support request that raises it —
|
|
9831
|
+
only a different ingress would.
|
|
9832
|
+
|
|
9833
|
+
⚠️ **This line previously said the cap matched an
|
|
9834
|
+
"ALB-fronted single-request body cap" and that raising it
|
|
9835
|
+
required an "ALB swap".** There is no ALB in front of
|
|
9836
|
+
`/api/uploads`; the ALB module is instantiated only for
|
|
9837
|
+
`stream.<domain>`. `compression_api` measured this on
|
|
9838
|
+
2026-08-28.
|
|
9839
|
+
|
|
9840
|
+
⇒ **The NUMBER was right and the RECORDED REASON was wrong,
|
|
9841
|
+
which is the more dangerous way round**: a correct value
|
|
9842
|
+
never triggers a review, and the rationale is what the next
|
|
9843
|
+
person acts on. **And the error pointed the permissive
|
|
9844
|
+
way** — it named a load-balancer setting somebody could
|
|
9845
|
+
raise, where the real constraint is a non-adjustable quota.
|
|
9846
|
+
Anyone revisiting this would have gone looking for a load
|
|
9847
|
+
balancer that is not there, concluded the cap was tunable,
|
|
9848
|
+
and planned work that cannot succeed.
|
|
9435
9849
|
multipart_chunk_size:
|
|
9436
9850
|
type: integer
|
|
9437
9851
|
format: int64
|
|
@@ -11092,6 +11506,10 @@ components:
|
|
|
11092
11506
|
value is that sentence. Emit it in preference to a
|
|
11093
11507
|
measurement-asserting value whenever the metrics were absent,
|
|
11094
11508
|
even if the class ultimately chosen happens to be correct.
|
|
11509
|
+
# OPEN BY CITED CONVENTION, AND IT SAID SO NOWHERE. `WarningType` names it in
|
|
11510
|
+
# the precedent set and this declaration was silent — so a generator reading
|
|
11511
|
+
# only this schema could not learn it. That is the gap this marker closes.
|
|
11512
|
+
x-enum-openness: open
|
|
11095
11513
|
enum:
|
|
11096
11514
|
- within_short_form_limits
|
|
11097
11515
|
- input_size_exceeds_short_form
|
|
@@ -11517,6 +11935,11 @@ components:
|
|
|
11517
11935
|
could not extract enough metadata to make a routing
|
|
11518
11936
|
decision. Caller may proceed at their own risk; the
|
|
11519
11937
|
workflow-create routing fallback applies.
|
|
11938
|
+
# OPEN. `ok` is the only proceed value and everything else is a reason not to,
|
|
11939
|
+
# so a consumer branches on `ok` rather than enumerating failures. A new
|
|
11940
|
+
# failure reason is additive and an old consumer treats it correctly as
|
|
11941
|
+
# not-ok.
|
|
11942
|
+
x-enum-openness: open
|
|
11520
11943
|
enum:
|
|
11521
11944
|
- ok
|
|
11522
11945
|
- corrupt
|
|
@@ -11533,6 +11956,11 @@ components:
|
|
|
11533
11956
|
the file (e.g. free-tier caller probing a long-form clip,
|
|
11534
11957
|
or any caller probing a `corrupt` / `unsupported_codec`
|
|
11535
11958
|
file).
|
|
11959
|
+
# CLOSED. It GATES AN AFFORDANCE: `blocked` is a hard stop and the others
|
|
11960
|
+
# predict routing. An unrecognised class cannot be safely treated as routable —
|
|
11961
|
+
# a consumer guessing would offer an upload the server will refuse. A new
|
|
11962
|
+
# class must reach consumers deliberately.
|
|
11963
|
+
x-enum-openness: closed
|
|
11536
11964
|
enum:
|
|
11537
11965
|
- short_form
|
|
11538
11966
|
- long_form
|
|
@@ -13874,14 +14302,136 @@ components:
|
|
|
13874
14302
|
example: "c4d80fb"
|
|
13875
14303
|
environment:
|
|
13876
14304
|
description: |
|
|
13877
|
-
|
|
13878
|
-
|
|
13879
|
-
|
|
13880
|
-
|
|
14305
|
+
🔴 **THIS FIELD IDENTIFIES NEITHER ENVIRONMENT TODAY, AND MUST NOT
|
|
14306
|
+
BE USED TO DETERMINE WHICH HOST YOU REACHED.**
|
|
14307
|
+
|
|
14308
|
+
Measured by `compression_e2e` on 2026-08-22, both read in the same
|
|
14309
|
+
moment, anonymously: **prod and staging BOTH return `baseline`.**
|
|
14310
|
+
The per-environment overlay that would substitute a real value is
|
|
14311
|
+
an unshipped ticket ([`befVmKN2`](https://trello.com/c/befVmKN2)),
|
|
14312
|
+
so every host serves the committed sidecar's literal.
|
|
14313
|
+
|
|
14314
|
+
⚠️ **A VALUE THAT IS CONSTANT ACROSS ENVIRONMENTS LOOKS EXACTLY
|
|
14315
|
+
LIKE A VALUE THAT CONFIRMS ONE.** This field previously carried
|
|
14316
|
+
`example: production` — an example of a value it has never
|
|
14317
|
+
returned — which taught precisely the misreading it invites.
|
|
14318
|
+
|
|
14319
|
+
🔑 **`fetch` follows redirects by default and does not report where
|
|
14320
|
+
it ended up**, so a production host redirecting to staging returns
|
|
14321
|
+
staging's schema and **nothing in this body reveals it**. The
|
|
14322
|
+
catastrophic outcome is not a failure; it is a green measured
|
|
14323
|
+
against staging and reported as prod. ⇒ **Assert the FINAL HOST at
|
|
14324
|
+
the transport layer** (`redirect: 'error'` plus an origin check).
|
|
14325
|
+
**A payload cannot corroborate which origin you reached.**
|
|
14326
|
+
|
|
14327
|
+
🔑 **AND IT CANNOT BE FIXED IN PLACE, WHICH IS WHY IT IS BEING
|
|
14328
|
+
RENAMED RATHER THAN CORRECTED.** api traced the value:
|
|
14329
|
+
`OperationSchemaController` reads it from
|
|
14330
|
+
`CapabilitiesSidecar`, which reads
|
|
14331
|
+
`vendor/antoniocs/compression-contracts/availability/availability.json`
|
|
14332
|
+
— **a file in a VENDORED PACKAGE.** The same package is vendored
|
|
14333
|
+
everywhere, so the field is **constant BY CONSTRUCTION, not
|
|
14334
|
+
because somebody forgot to set it per environment.**
|
|
14335
|
+
|
|
14336
|
+
⚠️ **That also corrects an earlier reading of `befVmKN2` — mine.**
|
|
14337
|
+
"Substituted at deploy time" describes a mechanism that does not
|
|
14338
|
+
exist for this source: a per-environment value would require
|
|
14339
|
+
shipping a DIFFERENT PACKAGE per environment, which is a far
|
|
14340
|
+
larger thing than an overlay. ⭐ **A label that is an INPUT to the
|
|
14341
|
+
build can never be evidence about the build's runtime behaviour**
|
|
14342
|
+
(frontend's line, one layer up).
|
|
14343
|
+
|
|
14344
|
+
⇒ **Superseded by `capabilities_profile`**, which names what the
|
|
14345
|
+
value actually is. `environment` is **DEPRECATED and retained for
|
|
14346
|
+
the transition**; both carry the same value. A server-supplied
|
|
14347
|
+
ORIGIN field does not exist and is not what this becomes — if one
|
|
14348
|
+
is ever added it must come from the deployment (task metadata or an
|
|
14349
|
+
env var), never from a vendored file.
|
|
14350
|
+
oneOf:
|
|
14351
|
+
- type: string
|
|
14352
|
+
- type: 'null'
|
|
14353
|
+
# ⚠️ `baseline`, NOT `production`. An example is documentation, and an
|
|
14354
|
+
# example of a value the field has never returned is a false one.
|
|
14355
|
+
example: "baseline"
|
|
14356
|
+
deprecated: true
|
|
14357
|
+
# 🔴 MACHINE-READABLE SUCCESSOR, so the transition is checkable
|
|
14358
|
+
# rather than described. `tests/test_deprecated_fields_have_a_
|
|
14359
|
+
# reachable_successor.py` reads THIS, not the prose above: if the
|
|
14360
|
+
# deprecated key is in the sidecar, the successor must be there too
|
|
14361
|
+
# and carry the same value. Without it the successor was declared and
|
|
14362
|
+
# emitted NOWHERE, and nothing on either side could see that — it is
|
|
14363
|
+
# not `required` and the response sets no `additionalProperties`,
|
|
14364
|
+
# so omitting it validates clean.
|
|
14365
|
+
x-superseded-by: capabilities_profile
|
|
14366
|
+
capabilities_profile:
|
|
14367
|
+
description: |
|
|
14368
|
+
**Which capability profile the vendored contracts package carries**
|
|
14369
|
+
— the honest name for the value `environment` has always held.
|
|
14370
|
+
|
|
14371
|
+
Sourced from the committed sidecar, so it is a property of the
|
|
14372
|
+
PACKAGE, not of the host. ⚠️ **It does not identify an environment
|
|
14373
|
+
and never could**: the same package is vendored everywhere. To
|
|
14374
|
+
establish which host you reached, assert the FINAL HOST at the
|
|
14375
|
+
transport layer.
|
|
14376
|
+
|
|
14377
|
+
Carries the same value as the deprecated `environment` throughout
|
|
14378
|
+
the transition; consumers should move and `environment` is removed
|
|
14379
|
+
once no consumer reads it.
|
|
14380
|
+
|
|
14381
|
+
🔴 **KNOWN READER OF `environment`, RECORDED SO THE REMOVAL
|
|
14382
|
+
CONDITION IS CHECKABLE RATHER THAN ASSUMED:** `compression_api`
|
|
14383
|
+
reads it.
|
|
14384
|
+
|
|
14385
|
+
**AS MERGED ON THEIR `main` — api #662, merge commit `25801c8d`,
|
|
14386
|
+
verified by ref 2026-08-28, not taken on report:**
|
|
14387
|
+
|
|
14388
|
+
- the read is **successor-preferred**: `capabilities_profile`
|
|
14389
|
+
when provided, `environment` only as a fallback for a sidecar
|
|
14390
|
+
predating the rename. `null` and `''` count as *not provided*
|
|
14391
|
+
and fall back; a **present-but-wrong-type successor does NOT
|
|
14392
|
+
fall back**, so a corrupt successor is never masked by the
|
|
14393
|
+
predecessor's value.
|
|
14394
|
+
- `DeprecatedEnvironmentKeyRemovalTriggerTest` fires on **four**
|
|
14395
|
+
conditions — this contract **stops declaring** `environment`,
|
|
14396
|
+
**loses `deprecated: true`**, **stops naming its successor**
|
|
14397
|
+
via `x-superseded-by`, or **`availability.json` stops carrying
|
|
14398
|
+
`environment`**. ⇒ **api goes red on the removal by itself**,
|
|
14399
|
+
whichever artefact moves first.
|
|
14400
|
+
|
|
14401
|
+
🔴 **THE SIDECAR IS STILL A LEVER — ON THEIR BUILD, NOT ON THEIR
|
|
14402
|
+
WIRE, AND THE TWO NOW POINT OPPOSITE WAYS.** api emits
|
|
14403
|
+
`environment` as a **MIRROR of the resolved profile** rather than
|
|
14404
|
+
as an independent read of the sidecar, so dropping it from
|
|
14405
|
+
`availability.json` **no longer changes their wire output** — it
|
|
14406
|
+
used to. It does now turn their **CI test suite** red, via
|
|
14407
|
+
`testTheSidecarStillCarriesTheDeprecatedKeyItIsMirroredFrom`,
|
|
14408
|
+
proved by mutation rather than by reading.
|
|
14409
|
+
⛔ **That is a PHPUnit alarm, NOT a build or deploy gate.** Their
|
|
14410
|
+
production image installs without dev dependencies and neither
|
|
14411
|
+
`ci-deploy.yml` nor `deploy-prod.yml` runs PHPUnit — `phpunit`
|
|
14412
|
+
appears in `ci.yml` alone (verified against their `origin/main`).
|
|
14413
|
+
⇒ **An affected revision can BUILD AND DEPLOY, with the alarm
|
|
14414
|
+
arriving separately.** The control gives detection, not
|
|
14415
|
+
prevention, and the two must not be read as one.
|
|
14416
|
+
⚠️ **Under expand → migrate → contract the sidecar half fires
|
|
14417
|
+
FIRST**, because the normal ordering drops the key there before
|
|
14418
|
+
retiring the declaration here. ⇒ **Retiring the key quietly via
|
|
14419
|
+
the sidecar ahead of this schema no longer half-works silently;
|
|
14420
|
+
it fails loudly**, which is the outcome to want.
|
|
14421
|
+
⚠️ **That decoupling is the deliberate price of mirroring**, which
|
|
14422
|
+
is what stops the successor drifting from the field it
|
|
14423
|
+
supersedes; the four-condition control is what pays for it.
|
|
14424
|
+
Recorded here rather than discovered later.
|
|
14425
|
+
|
|
14426
|
+
⇒ **REMOVAL IS A CO-LAND, NOT A CUT.** Tell every reader listed
|
|
14427
|
+
here BEFORE the removal ships, and remove a name from this list
|
|
14428
|
+
only when that session confirms it has stopped reading — never
|
|
14429
|
+
because the field looks unused. *"No consumer reads it"* is a claim
|
|
14430
|
+
about other repositories, and this contract cannot see them.
|
|
13881
14431
|
oneOf:
|
|
13882
14432
|
- type: string
|
|
13883
14433
|
- type: 'null'
|
|
13884
|
-
example: "
|
|
14434
|
+
example: "baseline"
|
|
13885
14435
|
user_tier:
|
|
13886
14436
|
description: |
|
|
13887
14437
|
Tier of the calling user. Anonymous (unauthenticated) callers
|
|
@@ -14632,13 +15182,22 @@ components:
|
|
|
14632
15182
|
description: |
|
|
14633
15183
|
Optional mime-group-level INPUT-file size ceiling in BYTES
|
|
14634
15184
|
(ticket [`uKsFzORi`](https://trello.com/c/uKsFzORi)). Sibling of
|
|
14635
|
-
`max_output_pixels`. **Applies to the enclosing operation's input
|
|
14636
|
-
|
|
14637
|
-
|
|
14638
|
-
|
|
14639
|
-
|
|
14640
|
-
|
|
14641
|
-
|
|
15185
|
+
`max_output_pixels`. **Applies to the enclosing operation's input**, and
|
|
15186
|
+
a consumer MUST scope it to the operation whose schema carries it —
|
|
15187
|
+
**the same MIME can carry different ceilings under different
|
|
15188
|
+
operations, because different workers process it.** ⚠️ This line
|
|
15189
|
+
previously said the ceilings were authored on `compress` only; they
|
|
15190
|
+
are not, and reading a `compress` number as the binding one for a
|
|
15191
|
+
`[compress, thumbnail]` chain is what let a 128 MB EPUB upload
|
|
15192
|
+
succeed and then be refused (`jLxWpQEZ`). **Do not enumerate the
|
|
15193
|
+
values here** — a restated table is one nothing re-measures; read
|
|
15194
|
+
them from the operation's own schema.
|
|
15195
|
+
|
|
15196
|
+
🔴 **A GROUP WITH NO `max_input_size_bytes` HAS NOT SAID THERE IS NO
|
|
15197
|
+
LIMIT.** It has said nothing. A group whose worker imposes no byte
|
|
15198
|
+
ceiling declares `input_size_bound: processing_time` instead, and
|
|
15199
|
+
exactly one of the two keys is present when either is. An oversize
|
|
15200
|
+
input is rejected at create-time (ADR-0012 band-ceiling 422 family).
|
|
14642
15201
|
|
|
14643
15202
|
**XOR with `processing_class` caps (ADR-0011):** a group carries this
|
|
14644
15203
|
group-level cap ONLY when it has NO `processing_class` band. Banded
|