@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.
Files changed (521) hide show
  1. package/README.md +2 -2
  2. package/accepted-options/accepted-options.json +17 -3
  3. package/accepted-options/image-output-routes.json +1 -1
  4. package/asyncapi/events.yaml +32 -1
  5. package/availability/availability.json +91 -10
  6. package/code-builder/code-builder-metadata.json +120 -11
  7. package/dist/openapi/models/AccountLimitEntry.d.ts +18 -3
  8. package/dist/openapi/models/AccountLimitEntry.js +1 -1
  9. package/dist/openapi/models/AccountLimits.d.ts +1 -1
  10. package/dist/openapi/models/AccountLimits.js +1 -1
  11. package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
  12. package/dist/openapi/models/AccountLimitsLimits.js +1 -1
  13. package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
  14. package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
  15. package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
  16. package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
  17. package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
  18. package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
  19. package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
  20. package/dist/openapi/models/AuthErrorResponse.js +1 -1
  21. package/dist/openapi/models/AuthErrorType.d.ts +1 -1
  22. package/dist/openapi/models/AuthErrorType.js +1 -1
  23. package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
  24. package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
  25. package/dist/openapi/models/AuthenticatedIdentity.d.ts +89 -0
  26. package/dist/openapi/models/AuthenticatedIdentity.js +66 -0
  27. package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
  28. package/dist/openapi/models/AvailabilityValue.js +1 -1
  29. package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
  30. package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
  31. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
  32. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
  33. package/dist/openapi/models/BillingCheckoutRequest.d.ts +1 -1
  34. package/dist/openapi/models/BillingCheckoutRequest.js +1 -1
  35. package/dist/openapi/models/BillingCheckoutSession.d.ts +1 -1
  36. package/dist/openapi/models/BillingCheckoutSession.js +1 -1
  37. package/dist/openapi/models/BillingCheckoutSuccessEnvelope.d.ts +1 -1
  38. package/dist/openapi/models/BillingCheckoutSuccessEnvelope.js +1 -1
  39. package/dist/openapi/models/CallbackEventType.d.ts +1 -1
  40. package/dist/openapi/models/CallbackEventType.js +1 -1
  41. package/dist/openapi/models/CancelAccountDeletion200Response.d.ts +1 -1
  42. package/dist/openapi/models/CancelAccountDeletion200Response.js +1 -1
  43. package/dist/openapi/models/CancelAccountDeletion200ResponseData.d.ts +1 -1
  44. package/dist/openapi/models/CancelAccountDeletion200ResponseData.js +1 -1
  45. package/dist/openapi/models/CapabilityCondition.d.ts +1 -1
  46. package/dist/openapi/models/CapabilityCondition.js +1 -1
  47. package/dist/openapi/models/CapabilityConditionOneOf.d.ts +1 -1
  48. package/dist/openapi/models/CapabilityConditionOneOf.js +1 -1
  49. package/dist/openapi/models/CapabilityConditionOneOf1.d.ts +1 -1
  50. package/dist/openapi/models/CapabilityConditionOneOf1.js +1 -1
  51. package/dist/openapi/models/CapabilityConditionOneOf2.d.ts +1 -1
  52. package/dist/openapi/models/CapabilityConditionOneOf2.js +1 -1
  53. package/dist/openapi/models/CapabilityConditionOneOf3.d.ts +1 -1
  54. package/dist/openapi/models/CapabilityConditionOneOf3.js +1 -1
  55. package/dist/openapi/models/CapabilityConditionOneOf4.d.ts +1 -1
  56. package/dist/openapi/models/CapabilityConditionOneOf4.js +1 -1
  57. package/dist/openapi/models/CapabilityConditionOneOf5.d.ts +1 -1
  58. package/dist/openapi/models/CapabilityConditionOneOf5.js +1 -1
  59. package/dist/openapi/models/CapabilityConditionOneOf6.d.ts +1 -1
  60. package/dist/openapi/models/CapabilityConditionOneOf6.js +1 -1
  61. package/dist/openapi/models/CapabilityConstraint.d.ts +1 -1
  62. package/dist/openapi/models/CapabilityConstraint.js +1 -1
  63. package/dist/openapi/models/CapabilityInputSpec.d.ts +1 -1
  64. package/dist/openapi/models/CapabilityInputSpec.js +1 -1
  65. package/dist/openapi/models/CapabilityProduces.d.ts +1 -1
  66. package/dist/openapi/models/CapabilityProduces.js +1 -1
  67. package/dist/openapi/models/CapabilityProducesOneOf.d.ts +1 -1
  68. package/dist/openapi/models/CapabilityProducesOneOf.js +1 -1
  69. package/dist/openapi/models/CapabilityProducesOneOf1.d.ts +1 -1
  70. package/dist/openapi/models/CapabilityProducesOneOf1.js +1 -1
  71. package/dist/openapi/models/CapabilityProducesOneOf2.d.ts +1 -1
  72. package/dist/openapi/models/CapabilityProducesOneOf2.js +1 -1
  73. package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
  74. package/dist/openapi/models/ChangePasswordRequest.js +1 -1
  75. package/dist/openapi/models/CodegenSource.d.ts +1 -1
  76. package/dist/openapi/models/CodegenSource.js +1 -1
  77. package/dist/openapi/models/CodegenSourceInput.d.ts +1 -1
  78. package/dist/openapi/models/CodegenSourceInput.js +1 -1
  79. package/dist/openapi/models/CodegenSourceJob.d.ts +1 -1
  80. package/dist/openapi/models/CodegenSourceJob.js +1 -1
  81. package/dist/openapi/models/CodegenSourceJobSource.d.ts +1 -1
  82. package/dist/openapi/models/CodegenSourceJobSource.js +1 -1
  83. package/dist/openapi/models/CodegenSourceOperation.d.ts +1 -1
  84. package/dist/openapi/models/CodegenSourceOperation.js +1 -1
  85. package/dist/openapi/models/CodegenUploadPlaceholder.d.ts +1 -1
  86. package/dist/openapi/models/CodegenUploadPlaceholder.js +1 -1
  87. package/dist/openapi/models/CompositionPlan.d.ts +1 -1
  88. package/dist/openapi/models/CompositionPlan.js +1 -1
  89. package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
  90. package/dist/openapi/models/CompositionPlanJob.js +1 -1
  91. package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
  92. package/dist/openapi/models/CompositionPlanOperation.js +1 -1
  93. package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
  94. package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
  95. package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
  96. package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
  97. package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
  98. package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
  99. package/dist/openapi/models/ConnectionSource.d.ts +1 -1
  100. package/dist/openapi/models/ConnectionSource.js +1 -1
  101. package/dist/openapi/models/ContactRequest.d.ts +1 -1
  102. package/dist/openapi/models/ContactRequest.js +1 -1
  103. package/dist/openapi/models/ContactSubject.d.ts +1 -1
  104. package/dist/openapi/models/ContactSubject.js +1 -1
  105. package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
  106. package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
  107. package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
  108. package/dist/openapi/models/CreateApiKey201Response.js +1 -1
  109. package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
  110. package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
  111. package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
  112. package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
  113. package/dist/openapi/models/CreateBillingCheckoutSession422Response.d.ts +1 -1
  114. package/dist/openapi/models/CreateBillingCheckoutSession422Response.js +1 -1
  115. package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
  116. package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
  117. package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
  118. package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
  119. package/dist/openapi/models/CreateWorkflow401Response.d.ts +1 -1
  120. package/dist/openapi/models/CreateWorkflow401Response.js +1 -1
  121. package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
  122. package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
  123. package/dist/openapi/models/CreditTransaction.d.ts +26 -5
  124. package/dist/openapi/models/CreditTransaction.js +1 -1
  125. package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
  126. package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
  127. package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
  128. package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
  129. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
  130. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
  131. package/dist/openapi/models/CreditsUsageResponse.d.ts +1 -1
  132. package/dist/openapi/models/CreditsUsageResponse.js +1 -1
  133. package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
  134. package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
  135. package/dist/openapi/models/Delivery.d.ts +1 -1
  136. package/dist/openapi/models/Delivery.js +1 -1
  137. package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
  138. package/dist/openapi/models/DeliveryOutputRef.js +1 -1
  139. package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
  140. package/dist/openapi/models/DeliveryPlan.js +1 -1
  141. package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
  142. package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
  143. package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
  144. package/dist/openapi/models/DeliveryPlanReason.js +1 -1
  145. package/dist/openapi/models/DeliverySelection.d.ts +1 -1
  146. package/dist/openapi/models/DeliverySelection.js +1 -1
  147. package/dist/openapi/models/DownloadBundle.d.ts +1 -1
  148. package/dist/openapi/models/DownloadBundle.js +1 -1
  149. package/dist/openapi/models/DroppedOption.d.ts +1 -1
  150. package/dist/openapi/models/DroppedOption.js +1 -1
  151. package/dist/openapi/models/EmailNotify.d.ts +1 -1
  152. package/dist/openapi/models/EmailNotify.js +1 -1
  153. package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
  154. package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
  155. package/dist/openapi/models/EndpointProjection.d.ts +1 -1
  156. package/dist/openapi/models/EndpointProjection.js +1 -1
  157. package/dist/openapi/models/EndpointProjectionServersInner.d.ts +1 -1
  158. package/dist/openapi/models/EndpointProjectionServersInner.js +1 -1
  159. package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
  160. package/dist/openapi/models/ErrorEnvelope.js +1 -1
  161. package/dist/openapi/models/EstimateQuality.d.ts +1 -1
  162. package/dist/openapi/models/EstimateQuality.js +1 -1
  163. package/dist/openapi/models/EstimateRange.d.ts +1 -1
  164. package/dist/openapi/models/EstimateRange.js +1 -1
  165. package/dist/openapi/models/ExportAccountData200Response.d.ts +1 -1
  166. package/dist/openapi/models/ExportAccountData200Response.js +1 -1
  167. package/dist/openapi/models/ExportAccountData200ResponseData.d.ts +1 -1
  168. package/dist/openapi/models/ExportAccountData200ResponseData.js +1 -1
  169. package/dist/openapi/models/ExternalDestination.d.ts +1 -1
  170. package/dist/openapi/models/ExternalDestination.js +1 -1
  171. package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
  172. package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
  173. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
  174. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
  175. package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
  176. package/dist/openapi/models/ExternalImportRequest.js +1 -1
  177. package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
  178. package/dist/openapi/models/ExternalImportToken.js +1 -1
  179. package/dist/openapi/models/ExternalSource.d.ts +1 -1
  180. package/dist/openapi/models/ExternalSource.js +1 -1
  181. package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
  182. package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
  183. package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
  184. package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
  185. package/dist/openapi/models/FeatureViolation.d.ts +1 -1
  186. package/dist/openapi/models/FeatureViolation.js +1 -1
  187. package/dist/openapi/models/GetProfile200Response.d.ts +46 -0
  188. package/dist/openapi/models/GetProfile200Response.js +54 -0
  189. package/dist/openapi/models/GetProfile200ResponseData.d.ts +33 -0
  190. package/dist/openapi/models/GetProfile200ResponseData.js +44 -0
  191. package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
  192. package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
  193. package/dist/openapi/models/JobDefinition.d.ts +1 -1
  194. package/dist/openapi/models/JobDefinition.js +1 -1
  195. package/dist/openapi/models/JobDownload.d.ts +1 -1
  196. package/dist/openapi/models/JobDownload.js +1 -1
  197. package/dist/openapi/models/JobInputV2.d.ts +1 -1
  198. package/dist/openapi/models/JobInputV2.js +1 -1
  199. package/dist/openapi/models/JobMediaClass.d.ts +1 -1
  200. package/dist/openapi/models/JobMediaClass.js +1 -1
  201. package/dist/openapi/models/JobOutputSource.d.ts +1 -1
  202. package/dist/openapi/models/JobOutputSource.js +1 -1
  203. package/dist/openapi/models/JobResponse.d.ts +1 -1
  204. package/dist/openapi/models/JobResponse.js +1 -1
  205. package/dist/openapi/models/JobStatus.d.ts +1 -1
  206. package/dist/openapi/models/JobStatus.js +1 -1
  207. package/dist/openapi/models/JobType.d.ts +1 -1
  208. package/dist/openapi/models/JobType.js +1 -1
  209. package/dist/openapi/models/LivenessResponse.d.ts +1 -1
  210. package/dist/openapi/models/LivenessResponse.js +1 -1
  211. package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
  212. package/dist/openapi/models/LoginUser200Response.js +1 -1
  213. package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
  214. package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
  215. package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
  216. package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
  217. package/dist/openapi/models/LoginUser401Response.d.ts +1 -1
  218. package/dist/openapi/models/LoginUser401Response.js +1 -1
  219. package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
  220. package/dist/openapi/models/LoginUserRequest.js +1 -1
  221. package/dist/openapi/models/LongFormConcurrencyLimitResponse.d.ts +1 -1
  222. package/dist/openapi/models/LongFormConcurrencyLimitResponse.js +1 -1
  223. package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.d.ts +1 -1
  224. package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.js +1 -1
  225. package/dist/openapi/models/MetadataResponse.d.ts +1 -1
  226. package/dist/openapi/models/MetadataResponse.js +1 -1
  227. package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
  228. package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
  229. package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
  230. package/dist/openapi/models/MetadataResponseExif.js +1 -1
  231. package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
  232. package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
  233. package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
  234. package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
  235. package/dist/openapi/models/MimeGroupSchema.d.ts +17 -8
  236. package/dist/openapi/models/MimeGroupSchema.js +1 -1
  237. package/dist/openapi/models/MultiInputSource.d.ts +1 -1
  238. package/dist/openapi/models/MultiInputSource.js +1 -1
  239. package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
  240. package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
  241. package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
  242. package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
  243. package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
  244. package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
  245. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
  246. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
  247. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
  248. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
  249. package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
  250. package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
  251. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
  252. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
  253. package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
  254. package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
  255. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
  256. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
  257. package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
  258. package/dist/openapi/models/MultipartPartListing.js +1 -1
  259. package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
  260. package/dist/openapi/models/MultipartPresignRequest.js +1 -1
  261. package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
  262. package/dist/openapi/models/MultipartPresignResponse.js +1 -1
  263. package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
  264. package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
  265. package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
  266. package/dist/openapi/models/MultipartStatusResponse.js +1 -1
  267. package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
  268. package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
  269. package/dist/openapi/models/NotifyConfig.d.ts +1 -1
  270. package/dist/openapi/models/NotifyConfig.js +1 -1
  271. package/dist/openapi/models/OperationCapability.d.ts +1 -1
  272. package/dist/openapi/models/OperationCapability.js +1 -1
  273. package/dist/openapi/models/OperationDefinition.d.ts +1 -1
  274. package/dist/openapi/models/OperationDefinition.js +1 -1
  275. package/dist/openapi/models/OperationDownload.d.ts +1 -1
  276. package/dist/openapi/models/OperationDownload.js +1 -1
  277. package/dist/openapi/models/OperationInputModel.d.ts +1 -1
  278. package/dist/openapi/models/OperationInputModel.js +1 -1
  279. package/dist/openapi/models/OperationResponse.d.ts +1 -1
  280. package/dist/openapi/models/OperationResponse.js +1 -1
  281. package/dist/openapi/models/OperationResult.d.ts +1 -1
  282. package/dist/openapi/models/OperationResult.js +1 -1
  283. package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
  284. package/dist/openapi/models/OperationResultMetadata.js +1 -1
  285. package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
  286. package/dist/openapi/models/OperationResultMetrics.js +1 -1
  287. package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
  288. package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
  289. package/dist/openapi/models/OperationStatus.d.ts +1 -1
  290. package/dist/openapi/models/OperationStatus.js +1 -1
  291. package/dist/openapi/models/OperationType.d.ts +1 -1
  292. package/dist/openapi/models/OperationType.js +1 -1
  293. package/dist/openapi/models/OperationsSchemaResponse.d.ts +7 -1
  294. package/dist/openapi/models/OperationsSchemaResponse.js +3 -1
  295. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +1 -1
  296. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +1 -1
  297. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
  298. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
  299. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
  300. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
  301. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
  302. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
  303. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.d.ts +1 -1
  304. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.js +1 -1
  305. package/dist/openapi/models/OptionSchema.d.ts +1 -1
  306. package/dist/openapi/models/OptionSchema.js +1 -1
  307. package/dist/openapi/models/OutputProperties.d.ts +1 -1
  308. package/dist/openapi/models/OutputProperties.js +1 -1
  309. package/dist/openapi/models/OutputPropertiesIsAnimated.d.ts +1 -1
  310. package/dist/openapi/models/OutputPropertiesIsAnimated.js +1 -1
  311. package/dist/openapi/models/PerClassAvailabilityEntry.d.ts +1 -1
  312. package/dist/openapi/models/PerClassAvailabilityEntry.js +1 -1
  313. package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
  314. package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
  315. package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +1 -1
  316. package/dist/openapi/models/PerValueAvailabilityEntry.js +1 -1
  317. package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
  318. package/dist/openapi/models/PresignedUrlPart.js +1 -1
  319. package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
  320. package/dist/openapi/models/ProbePendingResponse.js +1 -1
  321. package/dist/openapi/models/ProcessingClass.d.ts +1 -1
  322. package/dist/openapi/models/ProcessingClass.js +1 -1
  323. package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
  324. package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
  325. package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
  326. package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
  327. package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
  328. package/dist/openapi/models/ProcessingClassEntry.js +1 -1
  329. package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
  330. package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
  331. package/dist/openapi/models/ProcessingClassHint.d.ts +1 -1
  332. package/dist/openapi/models/ProcessingClassHint.js +1 -1
  333. package/dist/openapi/models/ProcessingClassReason.d.ts +1 -1
  334. package/dist/openapi/models/ProcessingClassReason.js +1 -1
  335. package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
  336. package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
  337. package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
  338. package/dist/openapi/models/ProcessingPlan.js +1 -1
  339. package/dist/openapi/models/ProcessingPlanJob.d.ts +1 -1
  340. package/dist/openapi/models/ProcessingPlanJob.js +1 -1
  341. package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
  342. package/dist/openapi/models/ReEncodeDecision.js +1 -1
  343. package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
  344. package/dist/openapi/models/ReadinessResponse.js +1 -1
  345. package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
  346. package/dist/openapi/models/RegisterUser422Response.js +1 -1
  347. package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
  348. package/dist/openapi/models/RegisterUserRequest.js +1 -1
  349. package/dist/openapi/models/RequestAccountDeletion200Response.d.ts +1 -1
  350. package/dist/openapi/models/RequestAccountDeletion200Response.js +1 -1
  351. package/dist/openapi/models/RequestAccountDeletion200ResponseData.d.ts +1 -1
  352. package/dist/openapi/models/RequestAccountDeletion200ResponseData.js +1 -1
  353. package/dist/openapi/models/RequestAccountDeletionRequest.d.ts +1 -1
  354. package/dist/openapi/models/RequestAccountDeletionRequest.js +1 -1
  355. package/dist/openapi/models/ResendVerificationEmailRequest.d.ts +1 -1
  356. package/dist/openapi/models/ResendVerificationEmailRequest.js +1 -1
  357. package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
  358. package/dist/openapi/models/ResetPasswordRequest.js +1 -1
  359. package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
  360. package/dist/openapi/models/ResponseEnvelope.js +1 -1
  361. package/dist/openapi/models/RetryResponse.d.ts +1 -1
  362. package/dist/openapi/models/RetryResponse.js +1 -1
  363. package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
  364. package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
  365. package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
  366. package/dist/openapi/models/SseCompletionBase.js +1 -1
  367. package/dist/openapi/models/SseEventType.d.ts +1 -1
  368. package/dist/openapi/models/SseEventType.js +1 -1
  369. package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
  370. package/dist/openapi/models/SseJobCompletedData.js +1 -1
  371. package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
  372. package/dist/openapi/models/SseJobFailedData.js +1 -1
  373. package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
  374. package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
  375. package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
  376. package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
  377. package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
  378. package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
  379. package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +1 -1
  380. package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
  381. package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
  382. package/dist/openapi/models/SseOperationCompletedData.js +1 -1
  383. package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
  384. package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
  385. package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
  386. package/dist/openapi/models/SseOperationFailedData.js +1 -1
  387. package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
  388. package/dist/openapi/models/SseOperationProgressData.js +1 -1
  389. package/dist/openapi/models/SseSingleOutputCompletion.d.ts +1 -1
  390. package/dist/openapi/models/SseSingleOutputCompletion.js +1 -1
  391. package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
  392. package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
  393. package/dist/openapi/models/TierRestrictionKind.d.ts +1 -1
  394. package/dist/openapi/models/TierRestrictionKind.js +1 -1
  395. package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
  396. package/dist/openapi/models/TierRestrictionResponse.js +1 -1
  397. package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
  398. package/dist/openapi/models/UpdateProfile200Response.js +1 -1
  399. package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
  400. package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
  401. package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
  402. package/dist/openapi/models/UpdateProfile422Response.js +1 -1
  403. package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
  404. package/dist/openapi/models/UpdateProfileRequest.js +1 -1
  405. package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
  406. package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
  407. package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
  408. package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
  409. package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
  410. package/dist/openapi/models/UploadFile403Response.js +1 -1
  411. package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
  412. package/dist/openapi/models/UploadFile422Response.js +1 -1
  413. package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
  414. package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
  415. package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
  416. package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
  417. package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
  418. package/dist/openapi/models/UploadProbeResponse.js +1 -1
  419. package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
  420. package/dist/openapi/models/UploadProbeStatus.js +1 -1
  421. package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
  422. package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
  423. package/dist/openapi/models/UploadResponse.d.ts +1 -1
  424. package/dist/openapi/models/UploadResponse.js +1 -1
  425. package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
  426. package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
  427. package/dist/openapi/models/UploadSource.d.ts +1 -1
  428. package/dist/openapi/models/UploadSource.js +1 -1
  429. package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
  430. package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
  431. package/dist/openapi/models/UploadThresholds.d.ts +26 -5
  432. package/dist/openapi/models/UploadThresholds.js +1 -1
  433. package/dist/openapi/models/UserTier.d.ts +18 -58
  434. package/dist/openapi/models/UserTier.js +18 -58
  435. package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
  436. package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
  437. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
  438. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
  439. package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
  440. package/dist/openapi/models/VerifyEmailRequest.js +1 -1
  441. package/dist/openapi/models/WarningType.d.ts +1 -1
  442. package/dist/openapi/models/WarningType.js +1 -1
  443. package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
  444. package/dist/openapi/models/WebhookOperationContext.js +1 -1
  445. package/dist/openapi/models/WebhookPayload.d.ts +1 -1
  446. package/dist/openapi/models/WebhookPayload.js +1 -1
  447. package/dist/openapi/models/WorkflowArchiveResponse.d.ts +1 -1
  448. package/dist/openapi/models/WorkflowArchiveResponse.js +1 -1
  449. package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.d.ts +1 -1
  450. package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.js +1 -1
  451. package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
  452. package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
  453. package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
  454. package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
  455. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
  456. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
  457. package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
  458. package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
  459. package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
  460. package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
  461. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
  462. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
  463. package/dist/openapi/models/WorkflowCreditSummary.d.ts +1 -1
  464. package/dist/openapi/models/WorkflowCreditSummary.js +1 -1
  465. package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
  466. package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
  467. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
  468. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
  469. package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
  470. package/dist/openapi/models/WorkflowEdge.js +1 -1
  471. package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
  472. package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
  473. package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
  474. package/dist/openapi/models/WorkflowListResponse.js +1 -1
  475. package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
  476. package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
  477. package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
  478. package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
  479. package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
  480. package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
  481. package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
  482. package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
  483. package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
  484. package/dist/openapi/models/WorkflowProcessing.js +1 -1
  485. package/dist/openapi/models/WorkflowRestoreResponse.d.ts +1 -1
  486. package/dist/openapi/models/WorkflowRestoreResponse.js +1 -1
  487. package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.d.ts +1 -1
  488. package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.js +1 -1
  489. package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
  490. package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
  491. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
  492. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
  493. package/dist/openapi/models/WorkflowSource.d.ts +1 -1
  494. package/dist/openapi/models/WorkflowSource.js +1 -1
  495. package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
  496. package/dist/openapi/models/WorkflowStatus.js +1 -1
  497. package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
  498. package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
  499. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
  500. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
  501. package/dist/openapi/models/WorkflowSummary.d.ts +1 -1
  502. package/dist/openapi/models/WorkflowSummary.js +1 -1
  503. package/dist/openapi/models/WorkflowSummaryJob.d.ts +1 -1
  504. package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
  505. package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
  506. package/dist/openapi/models/WorkflowWarning.js +1 -1
  507. package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
  508. package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
  509. package/dist/openapi/models/index.d.ts +3 -0
  510. package/dist/openapi/models/index.js +3 -0
  511. package/dist/openapi/runtime.d.ts +1 -1
  512. package/dist/openapi/runtime.js +1 -1
  513. package/dist/operations/thumbnail.d.ts +30 -7
  514. package/dist/operations/thumbnail.js +34 -17
  515. package/dist/operations/thumbnail.metadata.js +29 -1
  516. package/openapi/README.md +1 -1
  517. package/openapi/api.yaml +659 -100
  518. package/operation-capabilities/operation-capabilities.json +1 -1
  519. package/operations/schemas/compress.yaml +67 -10
  520. package/operations/schemas/thumbnail.yaml +100 -1
  521. 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.196.0
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
- File exceeds the absolute maximum upload size (across all
458
- tiers). For tier-specific size caps below this absolute
459
- limit, the server returns 403 with
460
- `error_type: tier_restriction, restriction_kind: file_size`.
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: planned
1248
- description: |
1249
- 🔴 **NOT IMPLEMENTED — see the `planned` note below. A server
1250
- that does not support this parameter SILENTLY IGNORES IT and
1251
- returns the DEFAULT (non-archived) list.** That is the dangerous
1252
- half of this feature and the reason it is called out here rather
1253
- than only on the endpoints: `POST .../archive` would 404, which is
1254
- loud and teaches the caller immediately, whereas
1255
- **`archived=true` returns a 200 carrying the wrong rows.** A
1256
- consumer asking for their archive receives their NON-archived
1257
- workflows and is told nothing. **Silent wrong data beats a 404
1258
- every time for damage.**
1259
- Until the server implements it, a client MUST NOT present an
1260
- "archived" view built on this parameter.
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. Per ticket [I23 `DffjC3zm`](https://trello.com/c/DffjC3zm)
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
- True iff a per-account override is active (i.e. `effective`
7658
- comes from an override rather than the tier default).
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, but other reference types
7786
- (`top_up` carrying a Stripe payment intent ID,
7787
- `cycle_grant` carrying a cycle date, etc.) may use
7788
- non-UUID identifiers. NOT constrained to `UuidV7`.
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
- 🔴 **`basic` IS THE BASE TIER. `free` IS DEPRECATED IN PLACE AND
8500
- WILL BE REMOVED** (ticket [`nD8fCPDy`](https://trello.com/c/nD8fCPDy)).
8501
- Owner decision 2026-08-19: **you can buy credits into the base tier, so
8502
- calling it "free" is false.** Both values are accepted through the
8503
- transition and **occupy the same ordinal position** — they are one tier
8504
- under two names, never two tiers.
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`/`free` < `pro` < `max` < `enterprise` (the
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
- - it asserted *"`free`: image MIMEs only … video/audio are MIME-gated
8561
- away from Free"* — a per-tier media restriction this contract does not
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
- not the old restriction, and not its replacement.** That is a scoping
8575
- statement about this description, **not a claim that the contract is
8576
- silent on the subject**: hub decision 25 made audio universal, so
8577
- there is no tier boundary at which the category axis changes. The
8578
- category axis as DATA, once, uniform across audiences. **Prose that
8579
- restates another repository's enforcement is the defect; a single
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
- removal_gate: "consumer evidence table on nD8fCPDy"
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 — chosen to match the ALB-fronted
9432
- single-request body cap. Raising this requires
9433
- infrastructure work (ALB swap or rearchitect; out of
9434
- scope for this ticket).
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
- Deployment environment identifier (`baseline` for the
13878
- committed sidecar; `staging` / `production` etc. when
13879
- substituted at deploy time per per-environment overlays —
13880
- future ticket).
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: "production"
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
- currently authored on `compress` image/document groups (the API
14637
- enforces it on compress input only: AVIF 20 MiB, other images 500 MiB,
14638
- office/ODF/EPUB 100 MiB). A consumer MUST scope it to the operation
14639
- whose schema carries it and MUST NOT assume it applies to other
14640
- operations. An oversize input is rejected at create-time (ADR-0012
14641
- band-ceiling 422 family).
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