@giveitsmaller/contracts 0.58.0 → 0.60.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 (506) hide show
  1. package/accepted-options/accepted-options.json +14 -1
  2. package/accepted-options/image-output-routes.json +1 -1
  3. package/asyncapi/events.yaml +36 -9
  4. package/availability/availability.json +136 -27
  5. package/code-builder/code-builder-metadata.json +136 -27
  6. package/dist/asyncapi/ErrorCode.d.ts +2 -0
  7. package/dist/asyncapi/ErrorCode.js +2 -0
  8. package/dist/openapi/models/AccountLimitEntry.d.ts +1 -1
  9. package/dist/openapi/models/AccountLimitEntry.js +1 -1
  10. package/dist/openapi/models/AccountLimits.d.ts +1 -1
  11. package/dist/openapi/models/AccountLimits.js +1 -1
  12. package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
  13. package/dist/openapi/models/AccountLimitsLimits.js +1 -1
  14. package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
  15. package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
  16. package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
  17. package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
  18. package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
  19. package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
  20. package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
  21. package/dist/openapi/models/AuthErrorResponse.js +1 -1
  22. package/dist/openapi/models/AuthErrorType.d.ts +1 -1
  23. package/dist/openapi/models/AuthErrorType.js +1 -1
  24. package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
  25. package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
  26. package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
  27. package/dist/openapi/models/AvailabilityValue.js +1 -1
  28. package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
  29. package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
  30. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
  31. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
  32. package/dist/openapi/models/BillingCheckoutRequest.d.ts +1 -1
  33. package/dist/openapi/models/BillingCheckoutRequest.js +1 -1
  34. package/dist/openapi/models/BillingCheckoutSession.d.ts +1 -1
  35. package/dist/openapi/models/BillingCheckoutSession.js +1 -1
  36. package/dist/openapi/models/BillingCheckoutSuccessEnvelope.d.ts +1 -1
  37. package/dist/openapi/models/BillingCheckoutSuccessEnvelope.js +1 -1
  38. package/dist/openapi/models/CallbackEventType.d.ts +1 -1
  39. package/dist/openapi/models/CallbackEventType.js +1 -1
  40. package/dist/openapi/models/CapabilityCondition.d.ts +1 -1
  41. package/dist/openapi/models/CapabilityCondition.js +1 -1
  42. package/dist/openapi/models/CapabilityConditionOneOf.d.ts +1 -1
  43. package/dist/openapi/models/CapabilityConditionOneOf.js +1 -1
  44. package/dist/openapi/models/CapabilityConditionOneOf1.d.ts +1 -1
  45. package/dist/openapi/models/CapabilityConditionOneOf1.js +1 -1
  46. package/dist/openapi/models/CapabilityConditionOneOf2.d.ts +1 -1
  47. package/dist/openapi/models/CapabilityConditionOneOf2.js +1 -1
  48. package/dist/openapi/models/CapabilityConditionOneOf3.d.ts +1 -1
  49. package/dist/openapi/models/CapabilityConditionOneOf3.js +1 -1
  50. package/dist/openapi/models/CapabilityConditionOneOf4.d.ts +1 -1
  51. package/dist/openapi/models/CapabilityConditionOneOf4.js +1 -1
  52. package/dist/openapi/models/CapabilityConditionOneOf5.d.ts +1 -1
  53. package/dist/openapi/models/CapabilityConditionOneOf5.js +1 -1
  54. package/dist/openapi/models/CapabilityConditionOneOf6.d.ts +1 -1
  55. package/dist/openapi/models/CapabilityConditionOneOf6.js +1 -1
  56. package/dist/openapi/models/CapabilityConstraint.d.ts +1 -1
  57. package/dist/openapi/models/CapabilityConstraint.js +1 -1
  58. package/dist/openapi/models/CapabilityInputSpec.d.ts +1 -1
  59. package/dist/openapi/models/CapabilityInputSpec.js +1 -1
  60. package/dist/openapi/models/CapabilityProduces.d.ts +1 -1
  61. package/dist/openapi/models/CapabilityProduces.js +1 -1
  62. package/dist/openapi/models/CapabilityProducesOneOf.d.ts +1 -1
  63. package/dist/openapi/models/CapabilityProducesOneOf.js +1 -1
  64. package/dist/openapi/models/CapabilityProducesOneOf1.d.ts +1 -1
  65. package/dist/openapi/models/CapabilityProducesOneOf1.js +1 -1
  66. package/dist/openapi/models/CapabilityProducesOneOf2.d.ts +1 -1
  67. package/dist/openapi/models/CapabilityProducesOneOf2.js +1 -1
  68. package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
  69. package/dist/openapi/models/ChangePasswordRequest.js +1 -1
  70. package/dist/openapi/models/CodegenSource.d.ts +1 -1
  71. package/dist/openapi/models/CodegenSource.js +1 -1
  72. package/dist/openapi/models/CodegenSourceInput.d.ts +1 -1
  73. package/dist/openapi/models/CodegenSourceInput.js +1 -1
  74. package/dist/openapi/models/CodegenSourceJob.d.ts +1 -1
  75. package/dist/openapi/models/CodegenSourceJob.js +1 -1
  76. package/dist/openapi/models/CodegenSourceJobSource.d.ts +1 -1
  77. package/dist/openapi/models/CodegenSourceJobSource.js +1 -1
  78. package/dist/openapi/models/CodegenSourceOperation.d.ts +1 -1
  79. package/dist/openapi/models/CodegenSourceOperation.js +1 -1
  80. package/dist/openapi/models/CodegenUploadPlaceholder.d.ts +1 -1
  81. package/dist/openapi/models/CodegenUploadPlaceholder.js +1 -1
  82. package/dist/openapi/models/CompositionPlan.d.ts +1 -1
  83. package/dist/openapi/models/CompositionPlan.js +1 -1
  84. package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
  85. package/dist/openapi/models/CompositionPlanJob.js +1 -1
  86. package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
  87. package/dist/openapi/models/CompositionPlanOperation.js +1 -1
  88. package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
  89. package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
  90. package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
  91. package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
  92. package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
  93. package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
  94. package/dist/openapi/models/ConnectionSource.d.ts +1 -1
  95. package/dist/openapi/models/ConnectionSource.js +1 -1
  96. package/dist/openapi/models/ContactRequest.d.ts +1 -1
  97. package/dist/openapi/models/ContactRequest.js +1 -1
  98. package/dist/openapi/models/ContactSubject.d.ts +1 -1
  99. package/dist/openapi/models/ContactSubject.js +1 -1
  100. package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
  101. package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
  102. package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
  103. package/dist/openapi/models/CreateApiKey201Response.js +1 -1
  104. package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
  105. package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
  106. package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
  107. package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
  108. package/dist/openapi/models/CreateBillingCheckoutSession422Response.d.ts +1 -1
  109. package/dist/openapi/models/CreateBillingCheckoutSession422Response.js +1 -1
  110. package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
  111. package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
  112. package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
  113. package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
  114. package/dist/openapi/models/CreateWorkflow401Response.d.ts +1 -1
  115. package/dist/openapi/models/CreateWorkflow401Response.js +1 -1
  116. package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
  117. package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
  118. package/dist/openapi/models/CreditTransaction.d.ts +1 -1
  119. package/dist/openapi/models/CreditTransaction.js +1 -1
  120. package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
  121. package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
  122. package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
  123. package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
  124. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
  125. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
  126. package/dist/openapi/models/CreditsUsageResponse.d.ts +43 -1
  127. package/dist/openapi/models/CreditsUsageResponse.js +5 -1
  128. package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
  129. package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
  130. package/dist/openapi/models/Delivery.d.ts +1 -1
  131. package/dist/openapi/models/Delivery.js +1 -1
  132. package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
  133. package/dist/openapi/models/DeliveryOutputRef.js +1 -1
  134. package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
  135. package/dist/openapi/models/DeliveryPlan.js +1 -1
  136. package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
  137. package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
  138. package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
  139. package/dist/openapi/models/DeliveryPlanReason.js +1 -1
  140. package/dist/openapi/models/DeliverySelection.d.ts +1 -1
  141. package/dist/openapi/models/DeliverySelection.js +1 -1
  142. package/dist/openapi/models/DownloadBundle.d.ts +1 -1
  143. package/dist/openapi/models/DownloadBundle.js +1 -1
  144. package/dist/openapi/models/DroppedOption.d.ts +88 -0
  145. package/dist/openapi/models/DroppedOption.js +54 -0
  146. package/dist/openapi/models/EmailNotify.d.ts +1 -1
  147. package/dist/openapi/models/EmailNotify.js +1 -1
  148. package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
  149. package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
  150. package/dist/openapi/models/EndpointProjection.d.ts +1 -1
  151. package/dist/openapi/models/EndpointProjection.js +1 -1
  152. package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
  153. package/dist/openapi/models/ErrorEnvelope.js +1 -1
  154. package/dist/openapi/models/EstimateQuality.d.ts +1 -1
  155. package/dist/openapi/models/EstimateQuality.js +1 -1
  156. package/dist/openapi/models/EstimateRange.d.ts +1 -1
  157. package/dist/openapi/models/EstimateRange.js +1 -1
  158. package/dist/openapi/models/ExternalDestination.d.ts +1 -1
  159. package/dist/openapi/models/ExternalDestination.js +1 -1
  160. package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
  161. package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
  162. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
  163. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
  164. package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
  165. package/dist/openapi/models/ExternalImportRequest.js +1 -1
  166. package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
  167. package/dist/openapi/models/ExternalImportToken.js +1 -1
  168. package/dist/openapi/models/ExternalSource.d.ts +1 -1
  169. package/dist/openapi/models/ExternalSource.js +1 -1
  170. package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
  171. package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
  172. package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
  173. package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
  174. package/dist/openapi/models/FeatureViolation.d.ts +1 -1
  175. package/dist/openapi/models/FeatureViolation.js +1 -1
  176. package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
  177. package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
  178. package/dist/openapi/models/JobDefinition.d.ts +1 -1
  179. package/dist/openapi/models/JobDefinition.js +1 -1
  180. package/dist/openapi/models/JobDownload.d.ts +1 -1
  181. package/dist/openapi/models/JobDownload.js +1 -1
  182. package/dist/openapi/models/JobInputV2.d.ts +1 -1
  183. package/dist/openapi/models/JobInputV2.js +1 -1
  184. package/dist/openapi/models/JobMediaClass.d.ts +1 -1
  185. package/dist/openapi/models/JobMediaClass.js +1 -1
  186. package/dist/openapi/models/JobOutputSource.d.ts +1 -1
  187. package/dist/openapi/models/JobOutputSource.js +1 -1
  188. package/dist/openapi/models/JobResponse.d.ts +23 -1
  189. package/dist/openapi/models/JobResponse.js +3 -1
  190. package/dist/openapi/models/JobStatus.d.ts +1 -1
  191. package/dist/openapi/models/JobStatus.js +1 -1
  192. package/dist/openapi/models/JobType.d.ts +1 -1
  193. package/dist/openapi/models/JobType.js +1 -1
  194. package/dist/openapi/models/LivenessResponse.d.ts +1 -1
  195. package/dist/openapi/models/LivenessResponse.js +1 -1
  196. package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
  197. package/dist/openapi/models/LoginUser200Response.js +1 -1
  198. package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
  199. package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
  200. package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
  201. package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
  202. package/dist/openapi/models/LoginUser401Response.d.ts +1 -1
  203. package/dist/openapi/models/LoginUser401Response.js +1 -1
  204. package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
  205. package/dist/openapi/models/LoginUserRequest.js +1 -1
  206. package/dist/openapi/models/LongFormConcurrencyLimitResponse.d.ts +5 -2
  207. package/dist/openapi/models/LongFormConcurrencyLimitResponse.js +1 -1
  208. package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.d.ts +1 -1
  209. package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.js +1 -1
  210. package/dist/openapi/models/MetadataResponse.d.ts +1 -1
  211. package/dist/openapi/models/MetadataResponse.js +1 -1
  212. package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
  213. package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
  214. package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
  215. package/dist/openapi/models/MetadataResponseExif.js +1 -1
  216. package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
  217. package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
  218. package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
  219. package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
  220. package/dist/openapi/models/MimeGroupSchema.d.ts +38 -1
  221. package/dist/openapi/models/MimeGroupSchema.js +5 -1
  222. package/dist/openapi/models/MultiInputSource.d.ts +1 -1
  223. package/dist/openapi/models/MultiInputSource.js +1 -1
  224. package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
  225. package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
  226. package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
  227. package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
  228. package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
  229. package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
  230. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
  231. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
  232. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
  233. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
  234. package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
  235. package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
  236. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
  237. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
  238. package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
  239. package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
  240. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
  241. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
  242. package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
  243. package/dist/openapi/models/MultipartPartListing.js +1 -1
  244. package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
  245. package/dist/openapi/models/MultipartPresignRequest.js +1 -1
  246. package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
  247. package/dist/openapi/models/MultipartPresignResponse.js +1 -1
  248. package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
  249. package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
  250. package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
  251. package/dist/openapi/models/MultipartStatusResponse.js +1 -1
  252. package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
  253. package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
  254. package/dist/openapi/models/NotifyConfig.d.ts +1 -1
  255. package/dist/openapi/models/NotifyConfig.js +1 -1
  256. package/dist/openapi/models/OperationCapability.d.ts +1 -1
  257. package/dist/openapi/models/OperationCapability.js +1 -1
  258. package/dist/openapi/models/OperationDefinition.d.ts +1 -1
  259. package/dist/openapi/models/OperationDefinition.js +1 -1
  260. package/dist/openapi/models/OperationDownload.d.ts +103 -5
  261. package/dist/openapi/models/OperationDownload.js +1 -1
  262. package/dist/openapi/models/OperationInputModel.d.ts +1 -1
  263. package/dist/openapi/models/OperationInputModel.js +1 -1
  264. package/dist/openapi/models/OperationResponse.d.ts +30 -6
  265. package/dist/openapi/models/OperationResponse.js +1 -1
  266. package/dist/openapi/models/OperationResult.d.ts +1 -1
  267. package/dist/openapi/models/OperationResult.js +1 -1
  268. package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
  269. package/dist/openapi/models/OperationResultMetadata.js +1 -1
  270. package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
  271. package/dist/openapi/models/OperationResultMetrics.js +1 -1
  272. package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
  273. package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
  274. package/dist/openapi/models/OperationStatus.d.ts +1 -1
  275. package/dist/openapi/models/OperationStatus.js +1 -1
  276. package/dist/openapi/models/OperationType.d.ts +1 -1
  277. package/dist/openapi/models/OperationType.js +1 -1
  278. package/dist/openapi/models/OperationsSchemaResponse.d.ts +1 -1
  279. package/dist/openapi/models/OperationsSchemaResponse.js +1 -1
  280. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +10 -1
  281. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +4 -1
  282. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
  283. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
  284. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
  285. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
  286. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
  287. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
  288. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.d.ts +33 -0
  289. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.js +42 -0
  290. package/dist/openapi/models/OptionSchema.d.ts +30 -1
  291. package/dist/openapi/models/OptionSchema.js +4 -1
  292. package/dist/openapi/models/OutputProperties.d.ts +1 -1
  293. package/dist/openapi/models/OutputProperties.js +1 -1
  294. package/dist/openapi/models/OutputPropertiesIsAnimated.d.ts +1 -1
  295. package/dist/openapi/models/OutputPropertiesIsAnimated.js +1 -1
  296. package/dist/openapi/models/PerClassAvailabilityEntry.d.ts +58 -0
  297. package/dist/openapi/models/PerClassAvailabilityEntry.js +48 -0
  298. package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
  299. package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
  300. package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +44 -1
  301. package/dist/openapi/models/PerValueAvailabilityEntry.js +5 -1
  302. package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
  303. package/dist/openapi/models/PresignedUrlPart.js +1 -1
  304. package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
  305. package/dist/openapi/models/ProbePendingResponse.js +1 -1
  306. package/dist/openapi/models/ProcessingClass.d.ts +1 -1
  307. package/dist/openapi/models/ProcessingClass.js +1 -1
  308. package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
  309. package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
  310. package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
  311. package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
  312. package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
  313. package/dist/openapi/models/ProcessingClassEntry.js +1 -1
  314. package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
  315. package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
  316. package/dist/openapi/models/ProcessingClassHint.d.ts +23 -6
  317. package/dist/openapi/models/ProcessingClassHint.js +23 -6
  318. package/dist/openapi/models/ProcessingClassReason.d.ts +78 -1
  319. package/dist/openapi/models/ProcessingClassReason.js +79 -2
  320. package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
  321. package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
  322. package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
  323. package/dist/openapi/models/ProcessingPlan.js +1 -1
  324. package/dist/openapi/models/ProcessingPlanJob.d.ts +30 -1
  325. package/dist/openapi/models/ProcessingPlanJob.js +4 -1
  326. package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
  327. package/dist/openapi/models/ReEncodeDecision.js +1 -1
  328. package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
  329. package/dist/openapi/models/ReadinessResponse.js +1 -1
  330. package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
  331. package/dist/openapi/models/RegisterUser422Response.js +1 -1
  332. package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
  333. package/dist/openapi/models/RegisterUserRequest.js +1 -1
  334. package/dist/openapi/models/ResendVerificationEmailRequest.d.ts +1 -1
  335. package/dist/openapi/models/ResendVerificationEmailRequest.js +1 -1
  336. package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
  337. package/dist/openapi/models/ResetPasswordRequest.js +1 -1
  338. package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
  339. package/dist/openapi/models/ResponseEnvelope.js +1 -1
  340. package/dist/openapi/models/RetryResponse.d.ts +1 -1
  341. package/dist/openapi/models/RetryResponse.js +1 -1
  342. package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
  343. package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
  344. package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
  345. package/dist/openapi/models/SseCompletionBase.js +1 -1
  346. package/dist/openapi/models/SseEventType.d.ts +1 -1
  347. package/dist/openapi/models/SseEventType.js +1 -1
  348. package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
  349. package/dist/openapi/models/SseJobCompletedData.js +1 -1
  350. package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
  351. package/dist/openapi/models/SseJobFailedData.js +1 -1
  352. package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
  353. package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
  354. package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
  355. package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
  356. package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
  357. package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
  358. package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +9 -4
  359. package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
  360. package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
  361. package/dist/openapi/models/SseOperationCompletedData.js +1 -1
  362. package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
  363. package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
  364. package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
  365. package/dist/openapi/models/SseOperationFailedData.js +1 -1
  366. package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
  367. package/dist/openapi/models/SseOperationProgressData.js +1 -1
  368. package/dist/openapi/models/SseSingleOutputCompletion.d.ts +1 -1
  369. package/dist/openapi/models/SseSingleOutputCompletion.js +1 -1
  370. package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
  371. package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
  372. package/dist/openapi/models/TierRestrictionKind.d.ts +1 -1
  373. package/dist/openapi/models/TierRestrictionKind.js +1 -1
  374. package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
  375. package/dist/openapi/models/TierRestrictionResponse.js +1 -1
  376. package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
  377. package/dist/openapi/models/UpdateProfile200Response.js +1 -1
  378. package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
  379. package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
  380. package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
  381. package/dist/openapi/models/UpdateProfile422Response.js +1 -1
  382. package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
  383. package/dist/openapi/models/UpdateProfileRequest.js +1 -1
  384. package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
  385. package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
  386. package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
  387. package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
  388. package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
  389. package/dist/openapi/models/UploadFile403Response.js +1 -1
  390. package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
  391. package/dist/openapi/models/UploadFile422Response.js +1 -1
  392. package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
  393. package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
  394. package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
  395. package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
  396. package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
  397. package/dist/openapi/models/UploadProbeResponse.js +1 -1
  398. package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
  399. package/dist/openapi/models/UploadProbeStatus.js +1 -1
  400. package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
  401. package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
  402. package/dist/openapi/models/UploadResponse.d.ts +1 -1
  403. package/dist/openapi/models/UploadResponse.js +1 -1
  404. package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
  405. package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
  406. package/dist/openapi/models/UploadSource.d.ts +1 -19
  407. package/dist/openapi/models/UploadSource.js +1 -3
  408. package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
  409. package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
  410. package/dist/openapi/models/UploadThresholds.d.ts +1 -1
  411. package/dist/openapi/models/UploadThresholds.js +1 -1
  412. package/dist/openapi/models/UserTier.d.ts +1 -1
  413. package/dist/openapi/models/UserTier.js +1 -1
  414. package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
  415. package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
  416. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
  417. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
  418. package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
  419. package/dist/openapi/models/VerifyEmailRequest.js +1 -1
  420. package/dist/openapi/models/WarningType.d.ts +1 -1
  421. package/dist/openapi/models/WarningType.js +1 -1
  422. package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
  423. package/dist/openapi/models/WebhookOperationContext.js +1 -1
  424. package/dist/openapi/models/WebhookPayload.d.ts +1 -1
  425. package/dist/openapi/models/WebhookPayload.js +1 -1
  426. package/dist/openapi/models/WorkflowArchiveResponse.d.ts +81 -0
  427. package/dist/openapi/models/WorkflowArchiveResponse.js +71 -0
  428. package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.d.ts +46 -0
  429. package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.js +54 -0
  430. package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
  431. package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
  432. package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
  433. package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
  434. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
  435. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
  436. package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
  437. package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
  438. package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
  439. package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
  440. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
  441. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
  442. package/dist/openapi/models/WorkflowCreditSummary.d.ts +1 -1
  443. package/dist/openapi/models/WorkflowCreditSummary.js +1 -1
  444. package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
  445. package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
  446. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
  447. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
  448. package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
  449. package/dist/openapi/models/WorkflowEdge.js +1 -1
  450. package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
  451. package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
  452. package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
  453. package/dist/openapi/models/WorkflowListResponse.js +1 -1
  454. package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
  455. package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
  456. package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
  457. package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
  458. package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
  459. package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
  460. package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
  461. package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
  462. package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
  463. package/dist/openapi/models/WorkflowProcessing.js +1 -1
  464. package/dist/openapi/models/WorkflowRestoreResponse.d.ts +60 -0
  465. package/dist/openapi/models/WorkflowRestoreResponse.js +58 -0
  466. package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.d.ts +46 -0
  467. package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.js +54 -0
  468. package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
  469. package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
  470. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
  471. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
  472. package/dist/openapi/models/WorkflowSource.d.ts +12 -1
  473. package/dist/openapi/models/WorkflowSource.js +1 -1
  474. package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
  475. package/dist/openapi/models/WorkflowStatus.js +1 -1
  476. package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
  477. package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
  478. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
  479. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
  480. package/dist/openapi/models/WorkflowSummary.d.ts +24 -1
  481. package/dist/openapi/models/WorkflowSummary.js +5 -1
  482. package/dist/openapi/models/WorkflowSummaryJob.d.ts +11 -5
  483. package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
  484. package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
  485. package/dist/openapi/models/WorkflowWarning.js +1 -1
  486. package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
  487. package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
  488. package/dist/openapi/models/index.d.ts +7 -0
  489. package/dist/openapi/models/index.js +7 -0
  490. package/dist/openapi/runtime.d.ts +1 -1
  491. package/dist/openapi/runtime.js +1 -1
  492. package/dist/operations/merge.metadata.js +6 -1
  493. package/dist/operations/thumbnail.d.ts +21 -0
  494. package/dist/operations/thumbnail.js +16 -0
  495. package/dist/operations/thumbnail.metadata.js +25 -0
  496. package/openapi/api.yaml +895 -45
  497. package/operation-capabilities/operation-capabilities.json +1 -1
  498. package/operations/schemas/audio_overlay.yaml +0 -4
  499. package/operations/schemas/audio_to_video.yaml +1 -0
  500. package/operations/schemas/compress.yaml +113 -22
  501. package/operations/schemas/convert.yaml +10 -4
  502. package/operations/schemas/merge.yaml +90 -3
  503. package/operations/schemas/render_variants.yaml +30 -7
  504. package/operations/schemas/split.yaml +13 -3
  505. package/operations/schemas/thumbnail.yaml +190 -3
  506. package/package.json +1 -1
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.171.0
92
+ version: 2.188.0
93
93
  contact:
94
94
  name: API Support
95
95
 
@@ -1192,6 +1192,28 @@ paths:
1192
1192
  minimum: 1
1193
1193
  maximum: 100
1194
1194
  default: 20
1195
+ - name: archived
1196
+ in: query
1197
+ required: false
1198
+ description: |
1199
+ Archived-row filter (ticket
1200
+ [`j2s6T2qf`](https://trello.com/c/j2s6T2qf)). **Default `false`**:
1201
+ archived workflows are EXCLUDED, so archiving declutters the
1202
+ default view. **`true`**: list ONLY archived workflows (the
1203
+ "archive" view, for review or recovery via
1204
+ `POST /api/workflows/{id}/restore`).
1205
+
1206
+ Archiving is a **recoverable declutter, NOT a delete** — an
1207
+ archived workflow keeps every record and stays fully readable via
1208
+ `GET /api/workflows/{id}/status` and its downloads; only this list
1209
+ hides it by default. Archive an individual workflow via
1210
+ `POST /api/workflows/{id}/archive`, restore it via
1211
+ `POST /api/workflows/{id}/restore`. (A future "show both" view, if
1212
+ needed, would be a separate additive parameter — this boolean
1213
+ stays exclude-vs-archived-only.)
1214
+ schema:
1215
+ type: boolean
1216
+ default: false
1195
1217
  responses:
1196
1218
  '200':
1197
1219
  description: Cursor-paginated summary list of the caller's workflows.
@@ -1963,7 +1985,7 @@ paths:
1963
1985
  message: "Inputs use different frame rates (29.97 vs 30); set re_encode_mode to auto or always."
1964
1986
  '429':
1965
1987
  description: |
1966
- Rate limited. Two distinct triggers share this status — branch
1988
+ Rate limited. Three distinct triggers share this status — branch
1967
1989
  on the `error` code, NOT on the status:
1968
1990
 
1969
1991
  1. **Long-form concurrency cap** — the caller already holds the
@@ -1977,13 +1999,31 @@ paths:
1977
1999
  2. **Infrastructure rate-limit** — too many requests in the
1978
2000
  current window. The links-absent subset of the same shape: a
1979
2001
  plain `ErrorEnvelope` with a `Retry-After` header.
2002
+ 3. **Duplicate in progress** — the caller resubmitted an
2003
+ identical workflow whose idempotency claim is already held by
2004
+ an in-flight create (deduplication that prevents a
2005
+ double-charge; ticket
2006
+ [`DSxwCetg`](https://trello.com/c/DSxwCetg)). Body is a plain
2007
+ `ErrorEnvelope`: `error: DUPLICATE_IN_PROGRESS`, `message_key:
2008
+ job.duplicate_in_progress`, **no `Retry-After`** and **no
2009
+ `links`**. **Transient — the caller SHOULD retry:** the retry
2010
+ folds onto the now-attached winning workflow and returns
2011
+ `201` with that existing workflow (the normal create shape),
2012
+ so the winning `workflow_id` is delivered on the retry, not
2013
+ here. There is no id to return at this point — the winner is
2014
+ still mid-create (its `workflow_id` is not yet assigned), which
2015
+ is exactly what "in progress" means. This is why the status is
2016
+ `429` (retry-with-backoff resolves it) rather than `409`.
1980
2017
  headers:
1981
2018
  Retry-After:
1982
2019
  description: |
1983
2020
  Seconds to wait before retrying. Delta-seconds (RFC 9110).
1984
2021
  Present ONLY for the infrastructure rate-limit trigger —
1985
- ABSENT for `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED` (that
1986
- limit clears on workflow completion, not on a timer).
2022
+ ABSENT for `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED` (clears on
2023
+ workflow completion, not a timer) and for
2024
+ `DUPLICATE_IN_PROGRESS` (resolves when the caller retries and
2025
+ folds onto the winning workflow — retry promptly, no fixed
2026
+ back-off window).
1987
2027
  schema:
1988
2028
  type: integer
1989
2029
  minimum: 0
@@ -2008,6 +2048,14 @@ paths:
2008
2048
  value:
2009
2049
  success: false
2010
2050
  error: "Too many requests. Please try again later."
2051
+ duplicate_in_progress:
2052
+ summary: Identical workflow already mid-create (idempotency fold — retry to get the 201-with-existing-workflow)
2053
+ value:
2054
+ success: false
2055
+ error: "DUPLICATE_IN_PROGRESS"
2056
+ message: "An identical workflow is already being created. Retry in a moment to attach to it."
2057
+ message_key: "job.duplicate_in_progress"
2058
+ locale: "en-GB"
2011
2059
  '500':
2012
2060
  description: Internal server error
2013
2061
  content:
@@ -2513,6 +2561,186 @@ paths:
2513
2561
  schema:
2514
2562
  $ref: '#/components/schemas/ErrorEnvelope'
2515
2563
 
2564
+ /api/workflows/{id}/archive:
2565
+ post:
2566
+ summary: Archive a workflow
2567
+ description: |
2568
+ Archive a terminal workflow so it drops out of the caller's default
2569
+ workflow list. **Recoverable declutter, NOT a delete** — the workflow,
2570
+ its jobs, its operations, and its outputs are all retained and stay
2571
+ fully readable: `GET /api/workflows/{id}/status` and every download
2572
+ link keep working unchanged. Archiving only hides the row from the
2573
+ default `GET /api/workflows` view; `?archived=true` lists archived
2574
+ rows, and `POST /api/workflows/{id}/restore` brings one back.
2575
+
2576
+ Archive sets a dedicated `archived` flag that is **distinct from
2577
+ deletion** — it is the Gmail-style "archive" (reversible, user-owned),
2578
+ not the admin-only hard delete, and it does NOT set any soft-delete /
2579
+ `deleted_at` state. Hard deletion is not exposed to callers.
2580
+
2581
+ Owner-scoped. Idempotent — archiving an already-archived workflow
2582
+ returns 200 with the same shape (`archived_at` reflects the FIRST
2583
+ archive instant, unchanged by a re-archive).
2584
+
2585
+ **Terminal workflows only.** Archive is allowed only once the workflow
2586
+ has reached a terminal status (`completed`, `failed`,
2587
+ `partially_failed`, `cancelled`, `expired`). Archiving an active
2588
+ workflow (`pending`, `in_progress`, `paused_insufficient_credits`) is
2589
+ a **409** — cancel it first (`POST /api/workflows/{id}/cancel`) or wait
2590
+ for it to finish. Archiving does NOT change the workflow's status; it
2591
+ stays terminal and the response echoes it unchanged.
2592
+ operationId: archiveWorkflow
2593
+ security: [{bearerAuth: []}, {sessionAuth: []}] # required (explicit 401 in response set)
2594
+ x-identity-scoped: true # workflow-ownership-scoped per ADR-0016 D3
2595
+ tags:
2596
+ - Workflow
2597
+ parameters:
2598
+ - name: id
2599
+ in: path
2600
+ required: true
2601
+ description: Workflow ID (UUID v7)
2602
+ schema:
2603
+ $ref: '#/components/schemas/UuidV7'
2604
+ responses:
2605
+ '200':
2606
+ description: Workflow archived (or already archived — idempotent).
2607
+ content:
2608
+ application/json:
2609
+ schema:
2610
+ $ref: '#/components/schemas/WorkflowArchiveSuccessEnvelope'
2611
+ examples:
2612
+ archived:
2613
+ summary: Archive a completed workflow
2614
+ value:
2615
+ success: true
2616
+ data:
2617
+ workflow_id: "019539ac-2222-7000-8000-000000000001"
2618
+ status: "completed"
2619
+ archived: true
2620
+ archived_at: "2026-07-17T20:15:00Z"
2621
+ idempotent_rearchive:
2622
+ summary: Archiving an already-archived workflow
2623
+ value:
2624
+ success: true
2625
+ data:
2626
+ workflow_id: "019539ac-2222-7000-8000-000000000002"
2627
+ status: "failed"
2628
+ archived: true
2629
+ archived_at: "2026-07-17T19:55:00Z"
2630
+ '401':
2631
+ description: Authentication required.
2632
+ content:
2633
+ application/json:
2634
+ schema:
2635
+ $ref: '#/components/schemas/ErrorEnvelope'
2636
+ '404':
2637
+ description: Workflow not found OR not owned by the caller (same shape — no ownership leak).
2638
+ content:
2639
+ application/json:
2640
+ schema:
2641
+ $ref: '#/components/schemas/ErrorEnvelope'
2642
+ '409':
2643
+ description: |
2644
+ Workflow is in a non-terminal state (`pending`, `in_progress`,
2645
+ `paused_insufficient_credits`) and cannot be archived yet — only
2646
+ terminal workflows are archivable. Cancel it first
2647
+ (`POST /api/workflows/{id}/cancel`) or wait for it to finish, then
2648
+ retry. Check status via `GET /api/workflows/{id}/status`.
2649
+ content:
2650
+ application/json:
2651
+ schema:
2652
+ $ref: '#/components/schemas/ErrorEnvelope'
2653
+ '429':
2654
+ description: Rate limit exceeded
2655
+ content:
2656
+ application/json:
2657
+ schema:
2658
+ $ref: '#/components/schemas/ErrorEnvelope'
2659
+ '500':
2660
+ description: Internal server error
2661
+ content:
2662
+ application/json:
2663
+ schema:
2664
+ $ref: '#/components/schemas/ErrorEnvelope'
2665
+
2666
+ /api/workflows/{id}/restore:
2667
+ post:
2668
+ summary: Restore (un-archive) a workflow
2669
+ description: |
2670
+ Restore a previously-archived workflow so it reappears in the caller's
2671
+ default `GET /api/workflows` list. The exact inverse of
2672
+ `POST /api/workflows/{id}/archive` — it clears the `archived` flag and
2673
+ nothing else. Status, jobs, operations, outputs, and download links are
2674
+ untouched (archiving never hid or changed any of those; it only hid the
2675
+ list row).
2676
+
2677
+ Owner-scoped. Idempotent — restoring a workflow that is not archived
2678
+ is a harmless no-op that returns 200 with `archived: false`. Because a
2679
+ non-archived workflow can be in any lifecycle state, the echoed
2680
+ `status` is the workflow's unchanged status (any `WorkflowStatus`
2681
+ value), not a fixed terminal subset. There is no 409: un-archiving is
2682
+ always safe.
2683
+ operationId: restoreWorkflow
2684
+ security: [{bearerAuth: []}, {sessionAuth: []}] # required (explicit 401 in response set)
2685
+ x-identity-scoped: true # workflow-ownership-scoped per ADR-0016 D3
2686
+ tags:
2687
+ - Workflow
2688
+ parameters:
2689
+ - name: id
2690
+ in: path
2691
+ required: true
2692
+ description: Workflow ID (UUID v7)
2693
+ schema:
2694
+ $ref: '#/components/schemas/UuidV7'
2695
+ responses:
2696
+ '200':
2697
+ description: Workflow restored (or was already not archived — idempotent).
2698
+ content:
2699
+ application/json:
2700
+ schema:
2701
+ $ref: '#/components/schemas/WorkflowRestoreSuccessEnvelope'
2702
+ examples:
2703
+ restored:
2704
+ summary: Restore an archived workflow
2705
+ value:
2706
+ success: true
2707
+ data:
2708
+ workflow_id: "019539ac-2222-7000-8000-000000000001"
2709
+ status: "completed"
2710
+ archived: false
2711
+ idempotent_restore:
2712
+ summary: Restoring a workflow that was not archived
2713
+ value:
2714
+ success: true
2715
+ data:
2716
+ workflow_id: "019539ac-2222-7000-8000-000000000002"
2717
+ status: "in_progress"
2718
+ archived: false
2719
+ '401':
2720
+ description: Authentication required.
2721
+ content:
2722
+ application/json:
2723
+ schema:
2724
+ $ref: '#/components/schemas/ErrorEnvelope'
2725
+ '404':
2726
+ description: Workflow not found OR not owned by the caller (same shape — no ownership leak).
2727
+ content:
2728
+ application/json:
2729
+ schema:
2730
+ $ref: '#/components/schemas/ErrorEnvelope'
2731
+ '429':
2732
+ description: Rate limit exceeded
2733
+ content:
2734
+ application/json:
2735
+ schema:
2736
+ $ref: '#/components/schemas/ErrorEnvelope'
2737
+ '500':
2738
+ description: Internal server error
2739
+ content:
2740
+ application/json:
2741
+ schema:
2742
+ $ref: '#/components/schemas/ErrorEnvelope'
2743
+
2516
2744
  # ============================================
2517
2745
  # OPERATIONS ENDPOINTS
2518
2746
  # ============================================
@@ -5552,6 +5780,34 @@ components:
5552
5780
  - planned
5553
5781
  - deprecated
5554
5782
 
5783
+ PerClassAvailabilityEntry:
5784
+ type: object
5785
+ description: |
5786
+ Availability of an option (or one of its values) on ONE execution
5787
+ class. Attached as a value within a `per_class_availability` map,
5788
+ keyed by a `processing_class` name the parent mime_group
5789
+ declares.
5790
+
5791
+ Exists because `processing_class:` is a SIBLING of `options:`,
5792
+ not a parent, so without this overlay "honoured on short-form,
5793
+ unavailable on long-form" is inexpressible and the only
5794
+ instrument is an operation-wide `planned` — which withdraws a
5795
+ working capability from every caller to describe one path's gap.
5796
+
5797
+ **May only RESTRICT** relative to the scope it overlays, never
5798
+ re-open it (`schemas/FORMAT.md` §Precedence; machine-enforced).
5799
+ required:
5800
+ - availability
5801
+ properties:
5802
+ availability:
5803
+ $ref: '#/components/schemas/AvailabilityValue'
5804
+ eta:
5805
+ type: string
5806
+ description: ISO-8601 date or quarter when this class is expected to support it.
5807
+ documentation_url:
5808
+ type: string
5809
+ format: uri
5810
+
5555
5811
  PerValueAvailabilityEntry:
5556
5812
  type: object
5557
5813
  description: |
@@ -5570,11 +5826,50 @@ components:
5570
5826
  present in this map MUST be a subset of the option's `values[]`
5571
5827
  array — verified by `make check-per-value-availability`
5572
5828
  (`scripts/check-per-value-availability.py`).
5829
+
5830
+ **`availability` is ALWAYS required, including when
5831
+ `per_class_availability` is present.** An entry carrying a
5832
+ per-class overlay MUST also state the blanket truth:
5833
+
5834
+ target_size:
5835
+ availability: stable # true on every other path
5836
+ per_class_availability:
5837
+ long_form_re_encode: { availability: planned }
5838
+
5839
+ **Ruled 2026-07-29, reversing an earlier reading of mine that
5840
+ the absence of a blanket tag was itself the statement.** Three
5841
+ reasons, and the third is the one that decided it:
5842
+
5843
+ 1. It keeps the restrict-only check **LOCAL** — the value an
5844
+ overlay is compared against sits in the same entry, instead
5845
+ of requiring a walk up to option/group/operation scope that
5846
+ must be got right at every nesting depth.
5847
+ 2. It keeps consumers' parsers correct as written: requiring the
5848
+ blanket value IS the rule they already enforce.
5849
+ 3. **It stops the absence of a key carrying meaning.** A reader
5850
+ seeing only `per_class_availability` would have to INFER the
5851
+ general level from a key that is not there — the failure
5852
+ shape this contract spent 2026-07-28 removing everywhere
5853
+ else, and it should not be reintroduced here.
5854
+
5855
+ Nothing is lost by requiring it: the blanket value is `stable`,
5856
+ which is TRUE, and most-cautious inheritance then yields the
5857
+ intended behaviour from the per-class restriction on top.
5573
5858
  required:
5574
5859
  - availability
5575
5860
  properties:
5576
5861
  availability:
5577
5862
  $ref: '#/components/schemas/AvailabilityValue'
5863
+ per_class_availability:
5864
+ type: object
5865
+ description: |
5866
+ Per-execution-class overlay for this enum value: restricts it
5867
+ on named `processing_class` entries of the parent mime_group
5868
+ while leaving the others at the inherited level. Keys MUST be
5869
+ classes the group declares. See `schemas/FORMAT.md`
5870
+ §`per_class_availability`.
5871
+ additionalProperties:
5872
+ $ref: '#/components/schemas/PerClassAvailabilityEntry'
5578
5873
  required_tier:
5579
5874
  description: |
5580
5875
  Tier required to use this enum value. Optional — omit when
@@ -5713,6 +6008,7 @@ components:
5713
6008
 
5714
6009
  UploadSource:
5715
6010
  type: object
6011
+ additionalProperties: false # closed to the API allowlist {type, file_id} — fZXM5VZd
5716
6012
  description: |
5717
6013
  References an upload created via `POST /api/uploads` (single)
5718
6014
  or completed via `POST /api/uploads/multipart/complete`
@@ -5726,28 +6022,10 @@ components:
5726
6022
  const: upload
5727
6023
  file_id:
5728
6024
  $ref: '#/components/schemas/UuidV7'
5729
- declared_duration_seconds:
5730
- type:
5731
- - number
5732
- - "null"
5733
- minimum: 0
5734
- description: |
5735
- OPTIONAL client-declared media duration in seconds, measured on the
5736
- client **before** upload (e.g. the browser's
5737
- `HTMLVideoElement.duration`). A **routing hint** for long-form
5738
- classification only ([`frlwBuQ5`](https://trello.com/c/frlwBuQ5)):
5739
- the server prefers its own authoritative media probe and falls back
5740
- to this value **only when the async probe duration is null** (e.g.
5741
- the probe has not completed at classification time). It never
5742
- overrides a successful probe, and is not billed against — duration
5743
- billing uses the probed value. Omit (or `null`) when unknown —
5744
- **absent behaves exactly as today** (probe-only). Ignored for
5745
- non-timed media. Only meaningful on an `upload` source (the one the
5746
- client measured locally); other source leaves do not carry it.
5747
- example: 187.5
5748
6025
 
5749
6026
  JobOutputSource:
5750
6027
  type: object
6028
+ additionalProperties: false # closed to the API allowlist {type, from, operation} — fZXM5VZd
5751
6029
  description: |
5752
6030
  References the output of an upstream job in the same workflow.
5753
6031
  Used to chain operations: workflow runs job A first, then job B
@@ -5771,6 +6049,7 @@ components:
5771
6049
 
5772
6050
  ExternalImportToken:
5773
6051
  type: object
6052
+ additionalProperties: false # closed to the API allowlist {type, external_source_id} — fZXM5VZd
5774
6053
  description: |
5775
6054
  Opaque handle returned by `POST /api/external-imports` for a
5776
6055
  one-shot bearer URL (S3 presigned, GCS signed, Azure SAS,
@@ -5790,6 +6069,7 @@ components:
5790
6069
 
5791
6070
  ConnectionSource:
5792
6071
  type: object
6072
+ additionalProperties: false # closed to the API allowlist {type, connection_id, path} — fZXM5VZd
5793
6073
  description: |
5794
6074
  Reference to a vaulted connection (pre-registered via
5795
6075
  `POST /api/connections` — owned by cross-repo `compression_api`
@@ -5830,6 +6110,17 @@ components:
5830
6110
 
5831
6111
  Wiring into `JobDefinition` lands via ticket
5832
6112
  [I12 (`Gr0VKFya`)](https://trello.com/c/Gr0VKFya).
6113
+
6114
+ **All four leaves are CLOSED** (`additionalProperties: false`) to
6115
+ exactly the API's per-leaf allowlist (`WorkflowSourceV2Constraint`,
6116
+ which hard-rejects any extra key). This is a deliberate forward-compat
6117
+ stance (ticket [`fZXM5VZd`](https://trello.com/c/fZXM5VZd)): a client
6118
+ sending a *future* additive field fails contract-validation the same way
6119
+ the API already rejects it — so contract and runtime agree. Adding a new
6120
+ field to a leaf therefore requires a paired API-allowlist change in the
6121
+ same co-land. The union aliases themselves (`WorkflowSource`,
6122
+ `MultiInputSource`, `ExternalSource`) stay open — they are `oneOf`
6123
+ dispatchers, not property-bearing objects.
5833
6124
  oneOf:
5834
6125
  - $ref: '#/components/schemas/UploadSource'
5835
6126
  - $ref: '#/components/schemas/JobOutputSource'
@@ -6561,6 +6852,44 @@ components:
6561
6852
  offset:
6562
6853
  type: integer
6563
6854
  minimum: 0
6855
+ current_cycle_net_spent:
6856
+ type: integer
6857
+ minimum: 0
6858
+ description: |
6859
+ OPTIONAL/additive. Net credits the caller has spent in the CURRENT
6860
+ billing cycle — the monthly-grant period (ledger rows with
6861
+ `created_at` >= the current cycle start). Integer credit units, same
6862
+ as `CreditTransaction.amount` and the balance fields.
6863
+
6864
+ **"Net" = credits actually consumed**, i.e. reservation debits minus
6865
+ the credit-returns that give credits back:
6866
+
6867
+ net = Σ |workflow-reservation debits|
6868
+ − Σ |credit-return rows|
6869
+
6870
+ Rows are identified by **`reference_type`, NOT `type`** — there is
6871
+ no `type: refund` row. The debit is
6872
+ `reference_type: workflow_reservation` (a negative `amount`); the
6873
+ credit-return family is `reference_type` ∈ {`workflow_settle_refund`,
6874
+ `workflow_reservation_release`, `workflow_pause_release`,
6875
+ `workflow_expiry_release`} (positive amounts). This nets a fully
6876
+ released / cancelled / expired reservation to ~0 and a settled one to
6877
+ its non-refundable consumed portion — so it reflects credits ACTUALLY
6878
+ consumed, not gross reservations (a raw settled-sum would overstate
6879
+ spend, since the returns are separate positive rows). Mirrors the
6880
+ reserved-minus-refunded semantics of the API's authoritative
6881
+ `WorkflowCreditSummary` reads. **Absent** for legacy/unsupported
6882
+ reads — treat as unknown, not `0`. Per ticket
6883
+ [`5aXGShPy`](https://trello.com/c/5aXGShPy).
6884
+ lifetime_net_spent:
6885
+ type: integer
6886
+ minimum: 0
6887
+ description: |
6888
+ OPTIONAL/additive. Same net-of-credit-returns formula as
6889
+ `current_cycle_net_spent`, but ALL-TIME (no cycle window) — the
6890
+ caller's total credits ever consumed. Integer credit units.
6891
+ **Absent** for legacy/unsupported reads — treat as unknown, not `0`.
6892
+ Per ticket [`5aXGShPy`](https://trello.com/c/5aXGShPy).
6564
6893
 
6565
6894
  CreditsUsageSuccessEnvelope:
6566
6895
  type: object
@@ -6693,7 +7022,10 @@ components:
6693
7022
  documented string (not a strict enum) so the rate-limit subset
6694
7023
  validates against the same schema and consumers tolerate unknown
6695
7024
  codes; SDKs branch on the `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED`
6696
- value to distinguish the two.
7025
+ value to distinguish it. A third links-absent branch shares this
7026
+ `429`: `DUPLICATE_IN_PROGRESS` (idempotency fold, ticket
7027
+ [`DSxwCetg`](https://trello.com/c/DSxwCetg)) — see the endpoint's
7028
+ `429` response description for the full trigger list.
6697
7029
 
6698
7030
  Mirrors the runtime shape produced by `compression_api`'s
6699
7031
  `WorkflowController` +
@@ -6817,6 +7149,99 @@ components:
6817
7149
  data:
6818
7150
  $ref: '#/components/schemas/WorkflowResumeResponse'
6819
7151
 
7152
+ WorkflowArchiveResponse:
7153
+ type: object
7154
+ description: |
7155
+ Response body for `POST /api/workflows/{id}/archive` (ticket
7156
+ [`j2s6T2qf`](https://trello.com/c/j2s6T2qf)). Archiving sets the
7157
+ `archived` flag so the row drops from the default workflow list; it
7158
+ does NOT change the workflow's status, delete anything, or hide it from
7159
+ `GET /api/workflows/{id}/status` or its downloads. Reversible via
7160
+ `POST /api/workflows/{id}/restore`.
7161
+ required:
7162
+ - workflow_id
7163
+ - status
7164
+ - archived
7165
+ - archived_at
7166
+ properties:
7167
+ workflow_id:
7168
+ $ref: '#/components/schemas/UuidV7'
7169
+ status:
7170
+ type: string
7171
+ enum:
7172
+ - completed
7173
+ - failed
7174
+ - partially_failed
7175
+ - cancelled
7176
+ - expired
7177
+ description: |
7178
+ The workflow's UNCHANGED terminal status — archive never mutates
7179
+ status, only sets the archived flag. Constrained to the terminal
7180
+ subset of `WorkflowStatus` (the only archivable states); an active
7181
+ workflow is a 409, never a 200.
7182
+ archived:
7183
+ type: boolean
7184
+ enum: [true]
7185
+ description: Always `true` on a 200 — the workflow is archived.
7186
+ archived_at:
7187
+ type: string
7188
+ format: date-time
7189
+ description: |
7190
+ ISO-8601 timestamp the workflow was FIRST archived. Idempotent —
7191
+ a re-archive of an already-archived workflow returns the original
7192
+ `archived_at`, unchanged.
7193
+
7194
+ WorkflowArchiveSuccessEnvelope:
7195
+ type: object
7196
+ additionalProperties: false
7197
+ required:
7198
+ - success
7199
+ - data
7200
+ properties:
7201
+ success:
7202
+ type: boolean
7203
+ enum: [true]
7204
+ data:
7205
+ $ref: '#/components/schemas/WorkflowArchiveResponse'
7206
+
7207
+ WorkflowRestoreResponse:
7208
+ type: object
7209
+ description: |
7210
+ Response body for `POST /api/workflows/{id}/restore` (ticket
7211
+ [`j2s6T2qf`](https://trello.com/c/j2s6T2qf)). Restoring clears the
7212
+ `archived` flag so the workflow reappears in the default list. The
7213
+ inverse of archive — status, jobs, outputs, and downloads are
7214
+ untouched.
7215
+ required:
7216
+ - workflow_id
7217
+ - status
7218
+ - archived
7219
+ properties:
7220
+ workflow_id:
7221
+ $ref: '#/components/schemas/UuidV7'
7222
+ status:
7223
+ $ref: '#/components/schemas/WorkflowStatus'
7224
+ archived:
7225
+ type: boolean
7226
+ enum: [false]
7227
+ description: |
7228
+ Always `false` on a 200 — the workflow is no longer archived
7229
+ (or was never archived; restore is an idempotent no-op there).
7230
+ No `archived_at` is returned once restored.
7231
+
7232
+ WorkflowRestoreSuccessEnvelope:
7233
+ type: object
7234
+ additionalProperties: false
7235
+ required:
7236
+ - success
7237
+ - data
7238
+ properties:
7239
+ success:
7240
+ type: boolean
7241
+ enum: [true]
7242
+ data:
7243
+ $ref: '#/components/schemas/WorkflowRestoreResponse'
7244
+
6820
7245
  WorkflowExpiredResponse:
6821
7246
  allOf:
6822
7247
  - $ref: '#/components/schemas/ErrorEnvelope'
@@ -9393,12 +9818,29 @@ components:
9393
9818
  description: |
9394
9819
  Caller-supplied logical-policy hint on `WorkflowCreateRequest`.
9395
9820
  NOT a backend selector — server is final authority on routing.
9821
+
9822
+ `auto` is the only committed value; the other three are
9823
+ `planned` — the API runtime returns `422 feature_not_available`
9824
+ for any non-`auto` value until they ship. Value availability is
9825
+ carried by `per_value_availability` below and promoted to the
9826
+ authoritative sidecar as
9827
+ `workflow_features.processing.class_hint` (keyed by request-shape
9828
+ path, mirroring `workflow_features.delivery.mode`; the decorative
9829
+ `x-availability`/openapi is not authoritative — consumers read the
9830
+ runtime endpoint / sidecar).
9831
+
9396
9832
  - `auto` (default): server routes safely.
9397
- - `short_form_only`: fail fast (422 with `reason:
9398
- tier_policy`) if any job would require `long_form`.
9399
- - `long_form_allowed`: caller accepts slower queue/runtime
9400
- semantics.
9401
- - `long_form_preferred`: prefer `long_form` pool when
9833
+ - `short_form_only` (planned): once shipped, fails fast when any
9834
+ job would require `long_form`. The dedicated fail-fast reject
9835
+ envelope is defined at graduation (co-design with the API
9836
+ handler); while planned the reject is the standard
9837
+ `feature_not_available`. NOTE: `tier_policy` is a success-path
9838
+ advisory reason on `ProcessingClassReason` (why an honored
9839
+ hint drove classification), NOT a 422 reject reason —
9840
+ `ProcessingClassRejectReason` stays ceiling-reasons only.
9841
+ - `long_form_allowed` (planned): caller accepts slower
9842
+ queue/runtime semantics.
9843
+ - `long_form_preferred` (planned): prefer `long_form` pool when
9402
9844
  eligible (test/isolation use cases).
9403
9845
  enum:
9404
9846
  - auto
@@ -9406,6 +9848,11 @@ components:
9406
9848
  - long_form_allowed
9407
9849
  - long_form_preferred
9408
9850
  default: auto
9851
+ per_value_availability:
9852
+ auto: { availability: stable }
9853
+ short_form_only: { availability: planned }
9854
+ long_form_allowed: { availability: planned }
9855
+ long_form_preferred: { availability: planned }
9409
9856
 
9410
9857
  EstimateQuality:
9411
9858
  type: string
@@ -9462,6 +9909,82 @@ components:
9462
9909
  - `tier_policy`: emitted when the caller's
9463
9910
  `processing.class_hint` (e.g. `short_form_only`) forced
9464
9911
  the decision rather than input characteristics.
9912
+ - `input_metrics_unavailable`: **the classifier did not have
9913
+ every metric the decision required.** One or more of the
9914
+ duration / size figures it needed was unavailable at
9915
+ create-plan time (e.g. an upload probe had not landed), so a
9916
+ class was DEFAULTED rather than chosen. Note this covers the
9917
+ PARTIAL case as well as the none-at-all case — see below;
9918
+ having *some* metrics is not having the metric the decision
9919
+ required. **This is the only
9920
+ value that does not assert a measurement.** Every other value
9921
+ states a fact about the input; this one states that no such
9922
+ fact was obtained.
9923
+
9924
+ **It is a reason a class was DEFAULTED, not a reason a class
9925
+ was CHOSEN** — despite sitting in `ProcessingClassReason`.
9926
+ Read it as *no routing claim was made*. Consumers MUST NOT
9927
+ read the assigned `processing_class` as evidence the input
9928
+ fits that class's constraints when this reason is present,
9929
+ and MUST NOT surface it as a positive statement about the
9930
+ file.
9931
+
9932
+ **Partial measurement usually counts as unmeasured.** On a
9933
+ multi-input operation, emit this whenever a contributing
9934
+ input lacked the metric the decision needed — a sum over the
9935
+ inputs that happened to be probed is not a measurement of the
9936
+ request, even though it is not empty either. The honest
9937
+ predicate is "did I have every metric this decision required",
9938
+ not "did I have some".
9939
+
9940
+ **The exception, and it is a principle rather than a special
9941
+ case: partial evidence that is DECISIVE is still evidence.**
9942
+ Ask whether the missing data could FALSIFY the claim the
9943
+ reason makes:
9944
+
9945
+ - `within_short_form_limits` claims the input **fits**. An
9946
+ unmeasured input can only ADD to the sum, so it could push
9947
+ the request over the cap — the missing data can falsify the
9948
+ claim. This reason therefore requires COMPLETE measurement,
9949
+ and a partial sum must report `input_metrics_unavailable`.
9950
+ - `input_duration_exceeds_short_form` /
9951
+ `input_size_exceeds_short_form` claim the input **exceeds**
9952
+ a cap. The sums are MONOTONE — they only grow — so once the
9953
+ measured subset alone crosses the cap, the missing data
9954
+ cannot falsify the claim. The escalation is positively
9955
+ evidenced, and the decision did not *need* the missing
9956
+ metric. **Report the real reason, NOT
9957
+ `input_metrics_unavailable`.**
9958
+
9959
+ Reporting "I could not measure" for a decision that WAS
9960
+ positively evidenced is a lie in the opposite direction, and
9961
+ it costs twice: it understates what the server knew, and —
9962
+ because this field carries one value — it MASKS a more
9963
+ specific true reason such as `merge_re_encode_long_form`.
9964
+
9965
+ **Generalise by the falsifiability test, not by the list
9966
+ above.** If a future cap is a band rather than a ceiling, or
9967
+ a metric can reduce a total, the monotonicity no longer holds
9968
+ and the exception does not apply.
9969
+
9970
+ **Known limit, stated so it is not later read as a gap in a
9971
+ completed fix:** an input whose probe landed with a duration
9972
+ of **zero** counts as MEASURED and contributes 0 to the sum.
9973
+ That is indistinguishable from a genuine zero-length input
9974
+ from outside the classifier, so this value does not and
9975
+ cannot cover it.
9976
+
9977
+ **Why this value exists (2026-07-28).** A deduplicated upload
9978
+ (and, independently, a fresh upload racing an async probe)
9979
+ reaches create-plan with no duration, and a 62-minute merge was
9980
+ assigned `short_form` with reason `within_short_form_limits` —
9981
+ an affirmative claim that a 62-minute input fits inside a
9982
+ `PT5M` cap. The fallback was indistinguishable from a genuine
9983
+ measurement, so the mis-route was invisible. A classifier that
9984
+ cannot say *"I did not know"* has no way to be honest; this
9985
+ value is that sentence. Emit it in preference to a
9986
+ measurement-asserting value whenever the metrics were absent,
9987
+ even if the class ultimately chosen happens to be correct.
9465
9988
  enum:
9466
9989
  - within_short_form_limits
9467
9990
  - input_size_exceeds_short_form
@@ -9469,6 +9992,7 @@ components:
9469
9992
  - merge_re_encode_long_form
9470
9993
  - requires_reencode
9471
9994
  - tier_policy
9995
+ - input_metrics_unavailable
9472
9996
 
9473
9997
  ProcessingPlanJob:
9474
9998
  type: object
@@ -9509,6 +10033,90 @@ components:
9509
10033
  $ref: '#/components/schemas/EstimateQuality'
9510
10034
  reason:
9511
10035
  $ref: '#/components/schemas/ProcessingClassReason'
10036
+ dropped_options:
10037
+ type: array
10038
+ description: |
10039
+ Options the SERVER supplied on the caller's behalf and then
10040
+ REMOVED, because the resolved execution path cannot honour
10041
+ them. **Never contains a value the caller sent explicitly** —
10042
+ an explicit option the path cannot honour is refused with
10043
+ `422 feature_not_available`, not silently dropped. That
10044
+ split is the whole rule: a caller who asked for nothing is
10045
+ not punished for our default; a caller who asked for
10046
+ something is told.
10047
+
10048
+ **Why this field exists at all.** Dropping a defaulted
10049
+ option is better than refusing the request, and it is still
10050
+ a silent no-op unless we say so — the caller asked for
10051
+ (say) audio normalisation, we did not do it, and nobody
10052
+ told them. This field is the "we did not do that" sentence,
10053
+ the same honesty requirement as
10054
+ `ProcessingClassReason.input_metrics_unavailable`.
10055
+
10056
+ **🔴 ABSENCE CARRIES NO INFORMATION until every server
10057
+ emits it.** An empty array means "nothing was dropped". An
10058
+ ABSENT array means "this server does not report drops" —
10059
+ consumers MUST NOT read absence as "nothing was dropped".
10060
+ Once the emitting side ships, the array is always present.
10061
+ items:
10062
+ $ref: '#/components/schemas/DroppedOption'
10063
+
10064
+ DroppedOption:
10065
+ type: object
10066
+ description: |
10067
+ One server-supplied option removed from a job before dispatch.
10068
+ **Names the THING, the WHY and the PATH** — the three parts a
10069
+ caller needs to act, and the three a single interpolated string
10070
+ would fuse into something unparseable.
10071
+ required:
10072
+ - option
10073
+ - reason
10074
+ properties:
10075
+ option:
10076
+ type: string
10077
+ description: The option key that was removed, as it appears in the operation schema.
10078
+ example: normalize_audio
10079
+ operation_type:
10080
+ type: string
10081
+ description: |
10082
+ The operation the option belonged to. Present because a job
10083
+ may carry several operations, so the option key alone does
10084
+ not identify where the drop happened.
10085
+ example: merge
10086
+ operation_id:
10087
+ type: string
10088
+ format: uuid
10089
+ description: The specific operation, when the server can attribute the drop to one.
10090
+ processing_class:
10091
+ $ref: '#/components/schemas/ProcessingClass'
10092
+ reason:
10093
+ type: string
10094
+ description: |
10095
+ Why the option was dropped. **A documented vocabulary, NOT a
10096
+ strict enum** — deliberately, following `error_code`: a
10097
+ consumer MUST map known values to a friendly reason and
10098
+ MUST degrade an unknown one, so the vocabulary can grow
10099
+ without breaking clients.
10100
+
10101
+ **Known values:**
10102
+
10103
+ - `unavailable_on_processing_class` — the option is tagged
10104
+ unavailable for the class this job resolved to (see
10105
+ `per_class_availability` in `schemas/FORMAT.md`). The
10106
+ `processing_class` field names which.
10107
+ - `processing_class_unmeasured` — the class could NOT be
10108
+ measured (see
10109
+ `ProcessingClassReason.input_metrics_unavailable`), so the
10110
+ option was dropped rather than refused. **Refusing a
10111
+ caller on a guessed class is the same error as asserting
10112
+ a measurement never taken**, so an unmeasured basis
10113
+ degrades to a drop and never to a 422.
10114
+
10115
+ The class token is deliberately NOT interpolated into this
10116
+ string: the reason and the path are separate fields because
10117
+ a fused `not_available_on_<class>` is unparseable and
10118
+ duplicates `processing_class`.
10119
+ example: unavailable_on_processing_class
9512
10120
 
9513
10121
  ProcessingPlan:
9514
10122
  type: object
@@ -10438,10 +11046,16 @@ components:
10438
11046
  minimum: 0
10439
11047
  description: |
10440
11048
  OPTIONAL. Final job output size in bytes — the right side of the
10441
- savings readout. The aggregate deliverable size for the job (the
10442
- authoritative per-output sizes remain on
10443
- `GET /{id}/downloads`). Absent until the job completes / when not
10444
- applicable.
11049
+ before→after savings readout. The **main/terminal deliverable's**
11050
+ size: the **highest-position completed non-thumbnail** operation's
11051
+ output — **NOT a sum across the job's operations** (a thumbnail's
11052
+ size is excluded; for a compress+thumbnail job this is the compressed
11053
+ output). Authoritative per-output sizes remain on
11054
+ `GET /{id}/downloads`. Populated from the highest-position COMPLETED
11055
+ op, so it is **PROVISIONAL while the job is still running** (a
11056
+ later-completing op can become the main deliverable and change this
11057
+ value) and final only once the job reaches a **terminal** status.
11058
+ Absent until a non-thumbnail op has completed with a recorded size.
10445
11059
  example: 491520
10446
11060
  operation_types:
10447
11061
  type: array
@@ -10506,6 +11120,24 @@ components:
10506
11120
  oneOf:
10507
11121
  - $ref: '#/components/schemas/WorkflowCreditSummary'
10508
11122
  - type: 'null'
11123
+ archived:
11124
+ type: boolean
11125
+ description: |
11126
+ Whether this workflow is archived (hidden from the default list;
11127
+ surfaced only via `?archived=true`). Set by
11128
+ `POST /api/workflows/{id}/archive`, cleared by
11129
+ `POST /api/workflows/{id}/restore`. Archiving is a recoverable
11130
+ declutter — it does NOT delete the workflow or hide it from
11131
+ `GET /api/workflows/{id}/status` or its downloads. **OPTIONAL
11132
+ (additive)** — absent is treated as `false` (not archived),
11133
+ covering legacy rows written before this field existed. Per ticket
11134
+ [`j2s6T2qf`](https://trello.com/c/j2s6T2qf).
11135
+ archived_at:
11136
+ type: string
11137
+ format: date-time
11138
+ description: |
11139
+ ISO-8601 timestamp the workflow was archived. Present only when
11140
+ `archived: true`; absent otherwise. Additive/optional.
10509
11141
 
10510
11142
  WorkflowCreditSummary:
10511
11143
  type: object
@@ -10787,6 +11419,28 @@ components:
10787
11419
  per-operation `OperationResult.size_bytes` / `GET /{id}/downloads`).
10788
11420
  OPTIONAL for the same webhook-payload reason as `input_filename`.
10789
11421
  example: 1258291
11422
+ output_size_bytes:
11423
+ type: integer
11424
+ format: int64
11425
+ minimum: 0
11426
+ description: |
11427
+ OPTIONAL. Final job output size in bytes — the **right** side of the
11428
+ before→after savings readout. The **main/terminal deliverable's**
11429
+ size: the **highest-position completed non-thumbnail** operation's
11430
+ output — **NOT a sum across the job's operations** (a thumbnail's
11431
+ size is excluded; for a compress+thumbnail job this is the compressed
11432
+ output). Authoritative per-output sizes remain on
11433
+ `GET /{id}/downloads`. The drill-in mirror of
11434
+ `WorkflowSummaryJob.output_size_bytes` (same semantics); pairs with
11435
+ `input_size_bytes` above. Populated from the highest-position
11436
+ COMPLETED op, so it is **PROVISIONAL while the job is still running**
11437
+ (a later-completing op can become the main deliverable and change
11438
+ this value) and final only once the job reaches a **terminal**
11439
+ status. Absent until a non-thumbnail op has completed with a recorded
11440
+ size, and OPTIONAL for the same webhook-payload reason as
11441
+ `input_filename`. Ticket [`j2s6T2qf`](https://trello.com/c/j2s6T2qf)
11442
+ (FE before→after size, workflow-view launch ask).
11443
+ example: 491520
10790
11444
  processing_class:
10791
11445
  $ref: '#/components/schemas/ProcessingClass'
10792
11446
  description: |
@@ -10866,11 +11520,29 @@ components:
10866
11520
  Distinct from the workflow/API create-time `ErrorEnvelope.error`
10867
11521
  vocabulary — this is the per-operation processing failure.
10868
11522
 
10869
- **Retry semantics:** the sibling `is_retryable` marks the transient
10870
- codes (`out_of_memory`, `timeout`, `s3_download_failed`,
10871
- `s3_upload_failed`); those are auto-redriven (SQS) and exhausted
10872
- before a failure surfaces, so a reported failure is always terminal —
10873
- `is_retryable` only tells the user whether re-submitting is worthwhile.
11523
+ **Retry semantics — DERIVE THEM FROM THIS FIELD.** Retryability is a
11524
+ property OF THE ERROR CODE, not an independent fact about an
11525
+ occurrence: the same code is always equally retryable, so there is
11526
+ no per-response boolean on this surface to read. The transient codes
11527
+ are `out_of_memory`, `timeout`, `s3_download_failed` and
11528
+ `s3_upload_failed`; the AsyncAPI `ErrorCode` enum groups every value
11529
+ under **Retryable** / **Non-retryable** headings and is the source of
11530
+ truth for that mapping.
11531
+
11532
+ Note a reported failure is **always terminal** regardless: transient
11533
+ codes are auto-redriven (SQS) and exhausted before a failure ever
11534
+ surfaces here, so retryability only tells the caller whether
11535
+ **re-submitting** is worthwhile.
11536
+
11537
+ **This docstring previously referred to "the sibling `is_retryable`".
11538
+ There is no such field on the OpenAPI surface** — it exists only on
11539
+ the AsyncAPI worker→API channel, so no generated REST client could
11540
+ ever carry it, and the contract was describing to consumers something
11541
+ it does not deliver (ticket `wdOF3ol4`). Deliberately corrected by
11542
+ REMOVING the promise rather than by adding the field: a per-response
11543
+ boolean would be a second source of truth for a fact the code already
11544
+ determines, free to drift from it, and it would break again when the
11545
+ `retryable` boolean→enum change lands.
10874
11546
 
10875
11547
  **Codes** (closed set; meaning):
10876
11548
  `invalid_options` (options invalid for this op — most common),
@@ -10883,6 +11555,12 @@ components:
10883
11555
  `invalid_key` (storage key invalid),
10884
11556
  `processing_failed` (non-specific processing failure),
10885
11557
  `s3_access_denied` (storage access denied — fail-fast, non-retryable),
11558
+ `input_too_large` (input exceeds our PROCESSING limits — deterministic,
11559
+ user-actionable via downscaling or a higher tier; distinct from the
11560
+ byte caps, which are refused at create and never reach a worker),
11561
+ `never_started` (the operation was terminated without ever running
11562
+ because its job reached a terminal state first — an upstream failure
11563
+ OR a cancellation; API-derived, never worker-emitted),
10886
11564
  `unknown` (unclassified),
10887
11565
  `out_of_memory` (retryable), `timeout` (retryable),
10888
11566
  `s3_download_failed` (retryable), `s3_upload_failed` (retryable).
@@ -11190,7 +11868,100 @@ components:
11190
11868
  $ref: '#/components/schemas/UuidV7'
11191
11869
  filename:
11192
11870
  type: string
11193
- description: Output filename
11871
+ description: |
11872
+ The **download filename** the API synthesises for this output — a
11873
+ human-friendly, extension-bearing name. This is a DIFFERENT surface
11874
+ from the S3 object key (an opaque UUID/`output-NNN` leaf governed by
11875
+ ADR-0014 §D9); the two are independent by design. Composed as
11876
+ `<stem><marker><suffix><.ext>`:
11877
+
11878
+ - **stem** — derived from the originating upload's `original_name`
11879
+ (a chained job resolves through its upstream to the original
11880
+ upload; path separators, control characters and quotes stripped);
11881
+ collapses to `download` if the sanitised stem is empty. When there
11882
+ is **no** original name at all (a `job_output`-sourced job with no
11883
+ upstream upload, or an unrecorded/purged name — rare), the whole
11884
+ field falls back to the S3-key basename **as-is, unmarked**; the
11885
+ per-op marker below applies only to the `original_name`-derived
11886
+ stem, so that fallback path is the one unlabelled case and is
11887
+ outside this map's scope.
11888
+ - **marker** — a per-operation label so **every** processed output
11889
+ is self-describing: it names what the output IS and disambiguates
11890
+ the different operations of a job from each other and from the
11891
+ original (ticket [`50obWMbm`](https://trello.com/c/50obWMbm), user
11892
+ launch feedback — the user hit a watermarked-main + thumbnail
11893
+ collision within one job). **Scope:** the marker resolves
11894
+ within-job and vs-original ambiguity, NOT workflow-wide uniqueness
11895
+ — two SEPARATE jobs running the same op on the same-named upload
11896
+ still produce the same name (a rarer case a job/node identifier
11897
+ would address; out of scope for this label map). **Invariant, with
11898
+ two explicit exceptions:** every op below **except `passthrough`**
11899
+ carries a non-empty marker, so a terminal deliverable **derived
11900
+ from an `original_name`** never falls back to a bare, op-less stem
11901
+ (the bug this fixes). The two exceptions are inline: `passthrough`
11902
+ (the identity op — its output IS the original) and the
11903
+ no-`original_name` S3-key fallback described under **stem** above. The
11904
+ canonical marker is keyed on the **public (masked) operation
11905
+ type** — a long-form concat surfaces as `compress` and carries its
11906
+ marker:
11907
+ - `compress` → `-compressed`
11908
+ - `thumbnail` (and the `thumbnail_image` / `thumbnail_video` /
11909
+ `thumbnail_document` / `thumbnail_office` sub-types, which all
11910
+ surface publicly as `thumbnail`) → `-thumbnail`
11911
+ - `image_watermark` / `text_watermark` / `video_watermark` /
11912
+ `video_text_watermark` / `audio_watermark` → `-watermarked`
11913
+ - `convert` → `-converted` (the extension changes too, but the
11914
+ marker keeps naming consistent — no operation is a special case)
11915
+ - `merge` → `-merged`
11916
+ - `transform` → `-transformed`
11917
+ - `custom_luma` → `-graded`
11918
+ - `audio_overlay` → `-overlay`
11919
+ - `audio_to_video` → `-video`
11920
+ - `render_variants` → `-variant`
11921
+ - `split` → `-part`, plus the `-<n>` piece suffix (below) when
11922
+ the run yields more than one piece. The word-marker is required
11923
+ because a split can legally produce a SINGLE output (e.g.
11924
+ `frame_range: "5-5"`, a one-page PDF range, or an interval that
11925
+ exceeds the media duration) — without it a single-piece split
11926
+ would fall back to the bare original stem.
11927
+ - `archive` → `-archive` (the archive OPERATION's output). Note:
11928
+ the workflow `delivery.bundle` path names its zip from
11929
+ `delivery.bundle_filename` instead — that is a separate surface
11930
+ and takes precedence when a bundle is requested.
11931
+ - `passthrough` → **none, by design** — it emits the input
11932
+ UNCHANGED (it is the identity/plumbing op), so its output IS the
11933
+ original file and carries the original name. It is normally
11934
+ consumed by a downstream job (not a terminal deliverable); when
11935
+ it is a leaf, returning the original name is correct, not a
11936
+ mislabel.
11937
+ **This whole map is co-owned with `compression_api`'s
11938
+ `DownloadFilenameComputer`** (as the `MIME_EXTENSION` table is) —
11939
+ api implements it; contracts is the normative source.
11940
+ - **suffix** — `-<n>` **only** when the operation produced more than
11941
+ one output. `<n>` is the output's **0-based position in the
11942
+ producer's `outputs[]` array** — a uniqueness key. It is
11943
+ **INDEPENDENT of `page_index` and must NOT be read as a page
11944
+ number**: a `pages: '5-7'` PDF fan-out emits
11945
+ `{ filename: "report-converted-0.png", page_index: 5 }` (PDF→PNG is a
11946
+ `convert`, hence `-converted`) — the `-0` is the
11947
+ array position, `5` is the source page. Reconciling them is a bug.
11948
+ - **.ext** — the extension of the **actual produced format**, never
11949
+ the input's and never guessed. Resolved from the worker-reported
11950
+ `output_file_type` (AsyncAPI `OperationResult.output_file_type`,
11951
+ ADR-0022) when present — authoritative for formats the API cannot
11952
+ infer (e.g. `compress.output_format` ∈ `{auto, smallest}`) — else
11953
+ derived from the operation chain. The chain additionally
11954
+ disambiguates a MIME→extension collision even when the MIME is
11955
+ known (`audio/ogg` → `.ogg` for Vorbis vs `.opus` for Opus). When
11956
+ the produced format is
11957
+ genuinely unknown at download time the name is emitted with **no
11958
+ extension** rather than a wrong one. `split` and `audio_to_video`
11959
+ derive to no format, so their extension comes **only** from
11960
+ `output_file_type`.
11961
+
11962
+ Sanitised for JSON (Unicode-safe); the `Content-Disposition` header
11963
+ on the presigned `download_url` is ASCII-sanitised separately, so
11964
+ the two user-visible names may legitimately differ.
11194
11965
  example: "photo.jpg"
11195
11966
  size_bytes:
11196
11967
  type: integer
@@ -11243,9 +12014,14 @@ components:
11243
12014
  type: integer
11244
12015
  minimum: 1
11245
12016
  description: |
11246
- 1-based page number for PDF-page fan-out outputs (convert
11247
- PDF->image). Gapless within an operation (an N-page conversion
11248
- emits `page_index` 1..N). Mutually exclusive with `position`.
12017
+ 1-based **literal source page number** for PDF-page fan-out
12018
+ outputs (convert PDF->image) — the actual page from the input PDF.
12019
+ A full conversion emits `1..N`; a sparse `pages` selection (e.g.
12020
+ `'1-5,8'`) emits exactly the selected pages (`1,2,3,4,5,8`), so it
12021
+ is gapless ONLY for a full conversion, not for a sparse selection.
12022
+ NOT the download `filename` suffix (that is a 0-based array
12023
+ position — see `OperationDownload.filename`). Mutually exclusive with `position`.
12024
+ Normative semantics: ADR-0009 §D2.
11249
12025
  Absent on non-indexed (single-output) downloads. Mirrors
11250
12026
  `OperationResultOutputEntry.page_index`. Per ADR-0009 §D2.
11251
12027
  example: 1
@@ -11681,9 +12457,14 @@ components:
11681
12457
  type: integer
11682
12458
  minimum: 1
11683
12459
  description: |
11684
- 1-based page number for PDF-page fan-out outputs (convert
11685
- PDF->image). Gapless within an operation (an N-page conversion
11686
- emits `page_index` 1..N). Mutually exclusive with `position`.
12460
+ 1-based **literal source page number** for PDF-page fan-out
12461
+ outputs (convert PDF->image) — the actual page from the input PDF.
12462
+ A full conversion emits `1..N`; a sparse `pages` selection (e.g.
12463
+ `'1-5,8'`) emits exactly the selected pages (`1,2,3,4,5,8`), so it
12464
+ is gapless ONLY for a full conversion, not for a sparse selection.
12465
+ NOT the download `filename` suffix (that is a 0-based array
12466
+ position — see `OperationDownload.filename`). Mutually exclusive with `position`.
12467
+ Normative semantics: ADR-0009 §D2.
11687
12468
  Absent on non-indexed outputs. Mirrors
11688
12469
  `OperationResultOutputEntry.page_index`. Per ADR-0009 §D2.
11689
12470
  example: 1
@@ -11942,6 +12723,8 @@ components:
11942
12723
  schema)
11943
12724
  - `delivery.selection.type.per_value_availability` (from the
11944
12725
  `DeliverySelection.type` schema)
12726
+ - `processing.class_hint.per_value_availability` (from the
12727
+ `ProcessingClassHint` enum — ticket `tK81wZKJ`)
11945
12728
 
11946
12729
  Closes the co0CERtJ (v2.19.0) authority-hierarchy gap: those
11947
12730
  `planned` downgrades lived only in the (decorative per ADR-0001
@@ -11971,6 +12754,14 @@ components:
11971
12754
  properties:
11972
12755
  per_value_availability:
11973
12756
  $ref: '#/components/schemas/PerValueAvailability'
12757
+ processing:
12758
+ type: object
12759
+ properties:
12760
+ class_hint:
12761
+ type: object
12762
+ properties:
12763
+ per_value_availability:
12764
+ $ref: '#/components/schemas/PerValueAvailability'
11974
12765
  image_encode_capabilities:
11975
12766
  description: |
11976
12767
  Pre-flight image-encode capability matrix
@@ -12546,6 +13337,40 @@ components:
12546
13337
  [I3](https://trello.com/c/eCWIpug8); until then the
12547
13338
  contract advertises the field shape but the endpoint
12548
13339
  does not yet surface the field.
13340
+ max_input_size_bytes:
13341
+ type: integer
13342
+ format: int64
13343
+ minimum: 1
13344
+ description: |
13345
+ Optional mime-group-level INPUT-file size ceiling in BYTES
13346
+ (ticket [`uKsFzORi`](https://trello.com/c/uKsFzORi)). Sibling of
13347
+ `max_output_pixels`. **Applies to the enclosing operation's input** —
13348
+ currently authored on `compress` image/document groups (the API
13349
+ enforces it on compress input only: AVIF 20 MiB, other images 500 MiB,
13350
+ office/ODF/EPUB 100 MiB). A consumer MUST scope it to the operation
13351
+ whose schema carries it and MUST NOT assume it applies to other
13352
+ operations. An oversize input is rejected at create-time (ADR-0012
13353
+ band-ceiling 422 family).
13354
+
13355
+ **XOR with `processing_class` caps (ADR-0011):** a group carries this
13356
+ group-level cap ONLY when it has NO `processing_class` band. Banded
13357
+ media (e.g. `video`) put input caps in
13358
+ `processing_class.<class>.constraints.max_input_size_bytes` instead —
13359
+ never both, so the input ceiling lives in exactly one place per group.
13360
+ CI-enforced by `scripts/check-per-tier-constraints.py`.
13361
+ max_input_duration:
13362
+ type: string
13363
+ description: |
13364
+ Optional mime-group-level INPUT duration ceiling as an ISO-8601
13365
+ duration string (ticket [`KzrquIX7`](https://trello.com/c/KzrquIX7)) —
13366
+ e.g. `"PT2H"`. Sibling of `max_output_pixels`; same
13367
+ XOR-with-`processing_class` rule as `max_input_size_bytes`
13368
+ (group-level ONLY where no `processing_class` band; banded media use
13369
+ `processing_class.<class>.constraints.max_input_duration`). Currently
13370
+ authored on `audio_to_video.audio` (2h input cap, mirroring the
13371
+ worker's audio-duration limit). Over-cap inputs are rejected at
13372
+ create-time.
13373
+ example: "PT2H"
12549
13374
  processing_class:
12550
13375
  type: object
12551
13376
  description: |
@@ -12639,6 +13464,31 @@ components:
12639
13464
  scoped to a single option (e.g. an operation may have a
12640
13465
  free-tier base option set with one or two `pro`-tier
12641
13466
  advanced options gated this way).
13467
+ per_class_availability:
13468
+ type: object
13469
+ description: |
13470
+ Per-EXECUTION-CLASS overlay for this option: restricts it on named
13471
+ `processing_class` entries of the parent mime_group while leaving
13472
+ the others at the inherited level. Keys MUST be classes the group
13473
+ declares.
13474
+
13475
+ Use this — NOT an operation-wide `availability` — when a worker
13476
+ honours an option on one execution path and refuses it on another.
13477
+ Marking the whole option `planned` would withdraw a working
13478
+ capability from every caller in order to describe one path's gap.
13479
+
13480
+ May only RESTRICT relative to the scope it overlays, never re-open
13481
+ it. See `schemas/FORMAT.md` §`per_class_availability` and
13482
+ §Precedence (machine-enforced by
13483
+ `scripts/check-per-class-availability.py`).
13484
+
13485
+ Note the option-level overlay and the per-VALUE one
13486
+ (`per_value_availability.<value>.per_class_availability`) can
13487
+ coexist: the option-level says the worker refuses the KEY on that
13488
+ path, the value-level says it refuses one VALUE. Most-cautious
13489
+ inheritance applies.
13490
+ additionalProperties:
13491
+ $ref: '#/components/schemas/PerClassAvailabilityEntry'
12642
13492
  per_value_availability:
12643
13493
  $ref: '#/components/schemas/PerValueAvailability'
12644
13494
  description: |