@almadar/std 15.15.0 → 15.15.1

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 (273) hide show
  1. package/behaviors/registry/app/atoms/std-ap-bill.orb +423 -171
  2. package/behaviors/registry/app/atoms/std-applicant.orb +207 -165
  3. package/behaviors/registry/app/atoms/std-application.orb +300 -188
  4. package/behaviors/registry/app/atoms/std-approval-request.orb +370 -215
  5. package/behaviors/registry/app/atoms/std-campaign-goal.orb +382 -167
  6. package/behaviors/registry/app/atoms/std-change-order.orb +458 -194
  7. package/behaviors/registry/app/atoms/std-chart-of-accounts.orb +201 -130
  8. package/behaviors/registry/app/atoms/std-checkin.orb +215 -151
  9. package/behaviors/registry/app/atoms/std-checkout-terminal.orb +322 -133
  10. package/behaviors/registry/app/atoms/std-class-roster.orb +343 -170
  11. package/behaviors/registry/app/atoms/std-class-session.orb +321 -190
  12. package/behaviors/registry/app/atoms/std-court-deadline.orb +353 -182
  13. package/behaviors/registry/app/atoms/std-customer-account.orb +376 -157
  14. package/behaviors/registry/app/atoms/std-donation-receipt.orb +214 -143
  15. package/behaviors/registry/app/atoms/std-donor.orb +191 -156
  16. package/behaviors/registry/app/atoms/std-drip-sequence.orb +409 -170
  17. package/behaviors/registry/app/atoms/std-driver.orb +440 -202
  18. package/behaviors/registry/app/atoms/std-dunning.orb +431 -167
  19. package/behaviors/registry/app/atoms/std-email-broadcast.orb +386 -143
  20. package/behaviors/registry/app/atoms/std-event.orb +309 -178
  21. package/behaviors/registry/app/atoms/std-form-builder.orb +353 -220
  22. package/behaviors/registry/app/atoms/std-health-score.orb +218 -183
  23. package/behaviors/registry/app/atoms/std-help-article.orb +425 -162
  24. package/behaviors/registry/app/atoms/std-help-category.orb +409 -166
  25. package/behaviors/registry/app/atoms/std-interview-slot.orb +311 -138
  26. package/behaviors/registry/app/atoms/std-invoice.orb +349 -211
  27. package/behaviors/registry/app/atoms/std-kitchen-display.orb +308 -184
  28. package/behaviors/registry/app/atoms/std-lease.orb +411 -178
  29. package/behaviors/registry/app/atoms/std-ledger-entry.orb +266 -195
  30. package/behaviors/registry/app/atoms/std-maintenance-request.orb +396 -177
  31. package/behaviors/registry/app/atoms/std-matter.orb +415 -189
  32. package/behaviors/registry/app/atoms/std-membership.orb +387 -167
  33. package/behaviors/registry/app/atoms/std-menu.orb +232 -175
  34. package/behaviors/registry/app/atoms/std-modifier-group.orb +224 -167
  35. package/behaviors/registry/app/atoms/std-nps-survey.orb +390 -138
  36. package/behaviors/registry/app/atoms/std-offer-letter.orb +242 -133
  37. package/behaviors/registry/app/atoms/std-payout-ledger.orb +428 -176
  38. package/behaviors/registry/app/atoms/std-question-bank.orb +211 -145
  39. package/behaviors/registry/app/atoms/std-receipt.orb +248 -177
  40. package/behaviors/registry/app/atoms/std-recurring-charge.orb +421 -149
  41. package/behaviors/registry/app/atoms/std-renewal-risk.orb +382 -153
  42. package/behaviors/registry/app/atoms/std-rent-charge.orb +476 -176
  43. package/behaviors/registry/app/atoms/std-reorder-rule.orb +246 -176
  44. package/behaviors/registry/app/atoms/std-response-collector.orb +213 -150
  45. package/behaviors/registry/app/atoms/std-rfi.orb +365 -210
  46. package/behaviors/registry/app/atoms/std-route-optimize.orb +195 -146
  47. package/behaviors/registry/app/atoms/std-segment.orb +173 -139
  48. package/behaviors/registry/app/atoms/std-stock-level.orb +205 -135
  49. package/behaviors/registry/app/atoms/std-submittal.orb +323 -166
  50. package/behaviors/registry/app/atoms/std-table-map.orb +187 -63
  51. package/behaviors/registry/app/atoms/std-technician-dispatch.orb +290 -202
  52. package/behaviors/registry/app/atoms/std-telematics-event.orb +156 -128
  53. package/behaviors/registry/app/atoms/std-template-editor.orb +255 -189
  54. package/behaviors/registry/app/atoms/std-tenant.orb +375 -147
  55. package/behaviors/registry/app/atoms/std-ticket-tier.orb +463 -150
  56. package/behaviors/registry/app/atoms/std-time-entry.orb +259 -150
  57. package/behaviors/registry/app/atoms/std-timesheet.orb +292 -183
  58. package/behaviors/registry/app/atoms/std-trial.orb +401 -183
  59. package/behaviors/registry/app/atoms/std-vehicle.orb +447 -205
  60. package/behaviors/registry/app/atoms/std-vendor-onboarding.orb +289 -245
  61. package/behaviors/registry/app/atoms/std-waitlist.orb +308 -177
  62. package/behaviors/registry/app/atoms/std-warehouse.orb +211 -141
  63. package/behaviors/registry/app/atoms/std-work-order.orb +374 -219
  64. package/behaviors/registry/app/organisms/std-subscription-billing.orb +282 -195
  65. package/behaviors/registry/core/atoms/std-approval-gate.orb +703 -0
  66. package/behaviors/registry/core/atoms/std-audit-capture.orb +150 -64
  67. package/behaviors/registry/core/atoms/std-data-erasure.orb +546 -0
  68. package/behaviors/registry/core/atoms/std-lifecycle.orb +343 -0
  69. package/behaviors/registry/core/atoms/std-notify-on-event.orb +132 -46
  70. package/behaviors/registry/core/atoms/std-reminder-scheduler.orb +330 -0
  71. package/behaviors/registry/marketing/atoms/std-marketing-article.orb +96 -0
  72. package/behaviors/registry/marketing/atoms/std-marketing-case-studies.orb +243 -0
  73. package/behaviors/registry/marketing/atoms/std-marketing-community.orb +134 -0
  74. package/behaviors/registry/marketing/atoms/std-marketing-cta.orb +206 -0
  75. package/behaviors/registry/marketing/atoms/std-marketing-features.orb +193 -0
  76. package/behaviors/registry/marketing/atoms/std-marketing-footer.orb +192 -0
  77. package/behaviors/registry/marketing/atoms/std-marketing-hero.orb +262 -0
  78. package/behaviors/registry/marketing/atoms/std-marketing-nav.orb +190 -0
  79. package/behaviors/registry/marketing/atoms/std-marketing-pricing.orb +232 -0
  80. package/behaviors/registry/marketing/atoms/std-marketing-showcase.orb +276 -0
  81. package/behaviors/registry/marketing/atoms/std-marketing-split.orb +135 -0
  82. package/behaviors/registry/marketing/atoms/std-marketing-stats.orb +120 -0
  83. package/behaviors/registry/marketing/atoms/std-marketing-steps.orb +179 -0
  84. package/behaviors/registry/marketing/atoms/std-marketing-team.orb +192 -0
  85. package/behaviors/registry/marketing/atoms/std-marketing-testimonials.orb +124 -0
  86. package/behaviors/registry/marketing/molecules/std-about-page.orb +440 -0
  87. package/behaviors/registry/marketing/molecules/std-feature-detail-page.orb +371 -0
  88. package/behaviors/registry/marketing/molecules/std-landing-page.orb +521 -0
  89. package/behaviors/registry/marketing/molecules/std-pricing-page.orb +406 -0
  90. package/behaviors/registry/marketing/organisms/std-marketing-site.orb +1654 -0
  91. package/dist/behaviors/behaviors-registry.json +2913 -156
  92. package/dist/behaviors/registry/app/atoms/std-ap-bill.orb +423 -171
  93. package/dist/behaviors/registry/app/atoms/std-applicant.orb +207 -165
  94. package/dist/behaviors/registry/app/atoms/std-application.orb +300 -188
  95. package/dist/behaviors/registry/app/atoms/std-approval-request.orb +370 -215
  96. package/dist/behaviors/registry/app/atoms/std-campaign-goal.orb +382 -167
  97. package/dist/behaviors/registry/app/atoms/std-change-order.orb +458 -194
  98. package/dist/behaviors/registry/app/atoms/std-chart-of-accounts.orb +201 -130
  99. package/dist/behaviors/registry/app/atoms/std-checkin.orb +215 -151
  100. package/dist/behaviors/registry/app/atoms/std-checkout-terminal.orb +322 -133
  101. package/dist/behaviors/registry/app/atoms/std-class-roster.orb +343 -170
  102. package/dist/behaviors/registry/app/atoms/std-class-session.orb +321 -190
  103. package/dist/behaviors/registry/app/atoms/std-court-deadline.orb +353 -182
  104. package/dist/behaviors/registry/app/atoms/std-customer-account.orb +376 -157
  105. package/dist/behaviors/registry/app/atoms/std-donation-receipt.orb +214 -143
  106. package/dist/behaviors/registry/app/atoms/std-donor.orb +191 -156
  107. package/dist/behaviors/registry/app/atoms/std-drip-sequence.orb +409 -170
  108. package/dist/behaviors/registry/app/atoms/std-driver.orb +440 -202
  109. package/dist/behaviors/registry/app/atoms/std-dunning.orb +431 -167
  110. package/dist/behaviors/registry/app/atoms/std-email-broadcast.orb +386 -143
  111. package/dist/behaviors/registry/app/atoms/std-event.orb +309 -178
  112. package/dist/behaviors/registry/app/atoms/std-form-builder.orb +353 -220
  113. package/dist/behaviors/registry/app/atoms/std-health-score.orb +218 -183
  114. package/dist/behaviors/registry/app/atoms/std-help-article.orb +425 -162
  115. package/dist/behaviors/registry/app/atoms/std-help-category.orb +409 -166
  116. package/dist/behaviors/registry/app/atoms/std-interview-slot.orb +311 -138
  117. package/dist/behaviors/registry/app/atoms/std-invoice.orb +349 -211
  118. package/dist/behaviors/registry/app/atoms/std-kitchen-display.orb +308 -184
  119. package/dist/behaviors/registry/app/atoms/std-lease.orb +411 -178
  120. package/dist/behaviors/registry/app/atoms/std-ledger-entry.orb +266 -195
  121. package/dist/behaviors/registry/app/atoms/std-maintenance-request.orb +396 -177
  122. package/dist/behaviors/registry/app/atoms/std-matter.orb +415 -189
  123. package/dist/behaviors/registry/app/atoms/std-membership.orb +387 -167
  124. package/dist/behaviors/registry/app/atoms/std-menu.orb +232 -175
  125. package/dist/behaviors/registry/app/atoms/std-modifier-group.orb +224 -167
  126. package/dist/behaviors/registry/app/atoms/std-nps-survey.orb +390 -138
  127. package/dist/behaviors/registry/app/atoms/std-offer-letter.orb +242 -133
  128. package/dist/behaviors/registry/app/atoms/std-payout-ledger.orb +428 -176
  129. package/dist/behaviors/registry/app/atoms/std-question-bank.orb +211 -145
  130. package/dist/behaviors/registry/app/atoms/std-receipt.orb +248 -177
  131. package/dist/behaviors/registry/app/atoms/std-recurring-charge.orb +421 -149
  132. package/dist/behaviors/registry/app/atoms/std-renewal-risk.orb +382 -153
  133. package/dist/behaviors/registry/app/atoms/std-rent-charge.orb +476 -176
  134. package/dist/behaviors/registry/app/atoms/std-reorder-rule.orb +246 -176
  135. package/dist/behaviors/registry/app/atoms/std-response-collector.orb +213 -150
  136. package/dist/behaviors/registry/app/atoms/std-rfi.orb +365 -210
  137. package/dist/behaviors/registry/app/atoms/std-route-optimize.orb +195 -146
  138. package/dist/behaviors/registry/app/atoms/std-segment.orb +173 -139
  139. package/dist/behaviors/registry/app/atoms/std-stock-level.orb +205 -135
  140. package/dist/behaviors/registry/app/atoms/std-submittal.orb +323 -166
  141. package/dist/behaviors/registry/app/atoms/std-table-map.orb +187 -63
  142. package/dist/behaviors/registry/app/atoms/std-technician-dispatch.orb +290 -202
  143. package/dist/behaviors/registry/app/atoms/std-telematics-event.orb +156 -128
  144. package/dist/behaviors/registry/app/atoms/std-template-editor.orb +255 -189
  145. package/dist/behaviors/registry/app/atoms/std-tenant.orb +375 -147
  146. package/dist/behaviors/registry/app/atoms/std-ticket-tier.orb +463 -150
  147. package/dist/behaviors/registry/app/atoms/std-time-entry.orb +259 -150
  148. package/dist/behaviors/registry/app/atoms/std-timesheet.orb +292 -183
  149. package/dist/behaviors/registry/app/atoms/std-trial.orb +401 -183
  150. package/dist/behaviors/registry/app/atoms/std-vehicle.orb +447 -205
  151. package/dist/behaviors/registry/app/atoms/std-vendor-onboarding.orb +289 -245
  152. package/dist/behaviors/registry/app/atoms/std-waitlist.orb +308 -177
  153. package/dist/behaviors/registry/app/atoms/std-warehouse.orb +211 -141
  154. package/dist/behaviors/registry/app/atoms/std-work-order.orb +374 -219
  155. package/dist/behaviors/registry/app/organisms/std-subscription-billing.orb +282 -195
  156. package/dist/behaviors/registry/core/atoms/std-approval-gate.orb +703 -0
  157. package/dist/behaviors/registry/core/atoms/std-audit-capture.orb +150 -64
  158. package/dist/behaviors/registry/core/atoms/std-data-erasure.orb +546 -0
  159. package/dist/behaviors/registry/core/atoms/std-lifecycle.orb +343 -0
  160. package/dist/behaviors/registry/core/atoms/std-notify-on-event.orb +132 -46
  161. package/dist/behaviors/registry/core/atoms/std-reminder-scheduler.orb +330 -0
  162. package/dist/behaviors/registry/marketing/atoms/std-marketing-article.orb +96 -0
  163. package/dist/behaviors/registry/marketing/atoms/std-marketing-case-studies.orb +243 -0
  164. package/dist/behaviors/registry/marketing/atoms/std-marketing-community.orb +134 -0
  165. package/dist/behaviors/registry/marketing/atoms/std-marketing-cta.orb +206 -0
  166. package/dist/behaviors/registry/marketing/atoms/std-marketing-features.orb +193 -0
  167. package/dist/behaviors/registry/marketing/atoms/std-marketing-footer.orb +192 -0
  168. package/dist/behaviors/registry/marketing/atoms/std-marketing-hero.orb +262 -0
  169. package/dist/behaviors/registry/marketing/atoms/std-marketing-nav.orb +190 -0
  170. package/dist/behaviors/registry/marketing/atoms/std-marketing-pricing.orb +232 -0
  171. package/dist/behaviors/registry/marketing/atoms/std-marketing-showcase.orb +276 -0
  172. package/dist/behaviors/registry/marketing/atoms/std-marketing-split.orb +135 -0
  173. package/dist/behaviors/registry/marketing/atoms/std-marketing-stats.orb +120 -0
  174. package/dist/behaviors/registry/marketing/atoms/std-marketing-steps.orb +179 -0
  175. package/dist/behaviors/registry/marketing/atoms/std-marketing-team.orb +192 -0
  176. package/dist/behaviors/registry/marketing/atoms/std-marketing-testimonials.orb +124 -0
  177. package/dist/behaviors/registry/marketing/molecules/std-about-page.orb +440 -0
  178. package/dist/behaviors/registry/marketing/molecules/std-feature-detail-page.orb +371 -0
  179. package/dist/behaviors/registry/marketing/molecules/std-landing-page.orb +521 -0
  180. package/dist/behaviors/registry/marketing/molecules/std-pricing-page.orb +406 -0
  181. package/dist/behaviors/registry/marketing/organisms/std-marketing-site.orb +1654 -0
  182. package/dist/behaviors-registry.json +2913 -156
  183. package/dist/registry/app/atoms/std-ap-bill.orb +423 -171
  184. package/dist/registry/app/atoms/std-applicant.orb +207 -165
  185. package/dist/registry/app/atoms/std-application.orb +300 -188
  186. package/dist/registry/app/atoms/std-approval-request.orb +370 -215
  187. package/dist/registry/app/atoms/std-campaign-goal.orb +382 -167
  188. package/dist/registry/app/atoms/std-change-order.orb +458 -194
  189. package/dist/registry/app/atoms/std-chart-of-accounts.orb +201 -130
  190. package/dist/registry/app/atoms/std-checkin.orb +215 -151
  191. package/dist/registry/app/atoms/std-checkout-terminal.orb +322 -133
  192. package/dist/registry/app/atoms/std-class-roster.orb +343 -170
  193. package/dist/registry/app/atoms/std-class-session.orb +321 -190
  194. package/dist/registry/app/atoms/std-court-deadline.orb +353 -182
  195. package/dist/registry/app/atoms/std-customer-account.orb +376 -157
  196. package/dist/registry/app/atoms/std-donation-receipt.orb +214 -143
  197. package/dist/registry/app/atoms/std-donor.orb +191 -156
  198. package/dist/registry/app/atoms/std-drip-sequence.orb +409 -170
  199. package/dist/registry/app/atoms/std-driver.orb +440 -202
  200. package/dist/registry/app/atoms/std-dunning.orb +431 -167
  201. package/dist/registry/app/atoms/std-email-broadcast.orb +386 -143
  202. package/dist/registry/app/atoms/std-event.orb +309 -178
  203. package/dist/registry/app/atoms/std-form-builder.orb +353 -220
  204. package/dist/registry/app/atoms/std-health-score.orb +218 -183
  205. package/dist/registry/app/atoms/std-help-article.orb +425 -162
  206. package/dist/registry/app/atoms/std-help-category.orb +409 -166
  207. package/dist/registry/app/atoms/std-interview-slot.orb +311 -138
  208. package/dist/registry/app/atoms/std-invoice.orb +349 -211
  209. package/dist/registry/app/atoms/std-kitchen-display.orb +308 -184
  210. package/dist/registry/app/atoms/std-lease.orb +411 -178
  211. package/dist/registry/app/atoms/std-ledger-entry.orb +266 -195
  212. package/dist/registry/app/atoms/std-maintenance-request.orb +396 -177
  213. package/dist/registry/app/atoms/std-matter.orb +415 -189
  214. package/dist/registry/app/atoms/std-membership.orb +387 -167
  215. package/dist/registry/app/atoms/std-menu.orb +232 -175
  216. package/dist/registry/app/atoms/std-modifier-group.orb +224 -167
  217. package/dist/registry/app/atoms/std-nps-survey.orb +390 -138
  218. package/dist/registry/app/atoms/std-offer-letter.orb +242 -133
  219. package/dist/registry/app/atoms/std-payout-ledger.orb +428 -176
  220. package/dist/registry/app/atoms/std-question-bank.orb +211 -145
  221. package/dist/registry/app/atoms/std-receipt.orb +248 -177
  222. package/dist/registry/app/atoms/std-recurring-charge.orb +421 -149
  223. package/dist/registry/app/atoms/std-renewal-risk.orb +382 -153
  224. package/dist/registry/app/atoms/std-rent-charge.orb +476 -176
  225. package/dist/registry/app/atoms/std-reorder-rule.orb +246 -176
  226. package/dist/registry/app/atoms/std-response-collector.orb +213 -150
  227. package/dist/registry/app/atoms/std-rfi.orb +365 -210
  228. package/dist/registry/app/atoms/std-route-optimize.orb +195 -146
  229. package/dist/registry/app/atoms/std-segment.orb +173 -139
  230. package/dist/registry/app/atoms/std-stock-level.orb +205 -135
  231. package/dist/registry/app/atoms/std-submittal.orb +323 -166
  232. package/dist/registry/app/atoms/std-table-map.orb +187 -63
  233. package/dist/registry/app/atoms/std-technician-dispatch.orb +290 -202
  234. package/dist/registry/app/atoms/std-telematics-event.orb +156 -128
  235. package/dist/registry/app/atoms/std-template-editor.orb +255 -189
  236. package/dist/registry/app/atoms/std-tenant.orb +375 -147
  237. package/dist/registry/app/atoms/std-ticket-tier.orb +463 -150
  238. package/dist/registry/app/atoms/std-time-entry.orb +259 -150
  239. package/dist/registry/app/atoms/std-timesheet.orb +292 -183
  240. package/dist/registry/app/atoms/std-trial.orb +401 -183
  241. package/dist/registry/app/atoms/std-vehicle.orb +447 -205
  242. package/dist/registry/app/atoms/std-vendor-onboarding.orb +289 -245
  243. package/dist/registry/app/atoms/std-waitlist.orb +308 -177
  244. package/dist/registry/app/atoms/std-warehouse.orb +211 -141
  245. package/dist/registry/app/atoms/std-work-order.orb +374 -219
  246. package/dist/registry/app/organisms/std-subscription-billing.orb +282 -195
  247. package/dist/registry/core/atoms/std-approval-gate.orb +703 -0
  248. package/dist/registry/core/atoms/std-audit-capture.orb +150 -64
  249. package/dist/registry/core/atoms/std-data-erasure.orb +546 -0
  250. package/dist/registry/core/atoms/std-lifecycle.orb +343 -0
  251. package/dist/registry/core/atoms/std-notify-on-event.orb +132 -46
  252. package/dist/registry/core/atoms/std-reminder-scheduler.orb +330 -0
  253. package/dist/registry/marketing/atoms/std-marketing-article.orb +96 -0
  254. package/dist/registry/marketing/atoms/std-marketing-case-studies.orb +243 -0
  255. package/dist/registry/marketing/atoms/std-marketing-community.orb +134 -0
  256. package/dist/registry/marketing/atoms/std-marketing-cta.orb +206 -0
  257. package/dist/registry/marketing/atoms/std-marketing-features.orb +193 -0
  258. package/dist/registry/marketing/atoms/std-marketing-footer.orb +192 -0
  259. package/dist/registry/marketing/atoms/std-marketing-hero.orb +262 -0
  260. package/dist/registry/marketing/atoms/std-marketing-nav.orb +190 -0
  261. package/dist/registry/marketing/atoms/std-marketing-pricing.orb +232 -0
  262. package/dist/registry/marketing/atoms/std-marketing-showcase.orb +276 -0
  263. package/dist/registry/marketing/atoms/std-marketing-split.orb +135 -0
  264. package/dist/registry/marketing/atoms/std-marketing-stats.orb +120 -0
  265. package/dist/registry/marketing/atoms/std-marketing-steps.orb +179 -0
  266. package/dist/registry/marketing/atoms/std-marketing-team.orb +192 -0
  267. package/dist/registry/marketing/atoms/std-marketing-testimonials.orb +124 -0
  268. package/dist/registry/marketing/molecules/std-about-page.orb +440 -0
  269. package/dist/registry/marketing/molecules/std-feature-detail-page.orb +371 -0
  270. package/dist/registry/marketing/molecules/std-landing-page.orb +521 -0
  271. package/dist/registry/marketing/molecules/std-pricing-page.orb +406 -0
  272. package/dist/registry/marketing/organisms/std-marketing-site.orb +1654 -0
  273. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "std-recurring-charge",
3
- "version": "1.1.0",
4
- "description": "std-recurring-charge — subscription cycle clock. Lists subscriptions in `browsing`; opens detail in `viewing_single` with Charge / Cancel actions. Agents tune the list shape via `config.fields` + `config.itemActions`.",
3
+ "version": "1.2.0",
4
+ "description": "std-recurring-charge — subscription cycle clock with Charge / Cancel actions. Listens for SET_STATUS so std-lifecycle can drive automated transitions. Exposes Financial-pattern knobs.",
5
5
  "orbitals": [
6
6
  {
7
7
  "name": "SubscriptionOrbital",
@@ -205,6 +205,83 @@
205
205
  "type": "string"
206
206
  }
207
207
  ]
208
+ },
209
+ {
210
+ "event": "SubscriptionUpdated",
211
+ "payloadSchema": [
212
+ {
213
+ "name": "row.id",
214
+ "type": "string",
215
+ "required": true
216
+ },
217
+ {
218
+ "name": "row.customerId",
219
+ "type": "string",
220
+ "required": true
221
+ },
222
+ {
223
+ "name": "row.planId",
224
+ "type": "string",
225
+ "required": true
226
+ },
227
+ {
228
+ "name": "row.status",
229
+ "type": "string"
230
+ },
231
+ {
232
+ "name": "row.amount",
233
+ "type": "number"
234
+ },
235
+ {
236
+ "name": "row.currency",
237
+ "type": "string"
238
+ },
239
+ {
240
+ "name": "row.interval",
241
+ "type": "string"
242
+ },
243
+ {
244
+ "name": "row.currentPeriodStart",
245
+ "type": "string"
246
+ },
247
+ {
248
+ "name": "row.currentPeriodEnd",
249
+ "type": "string"
250
+ },
251
+ {
252
+ "name": "row.nextBillingAt",
253
+ "type": "string"
254
+ },
255
+ {
256
+ "name": "row.attemptCount",
257
+ "type": "number"
258
+ },
259
+ {
260
+ "name": "row.lastChargeAt",
261
+ "type": "string"
262
+ },
263
+ {
264
+ "name": "row.cancelledAt",
265
+ "type": "string"
266
+ },
267
+ {
268
+ "name": "row.createdAt",
269
+ "type": "string"
270
+ }
271
+ ]
272
+ },
273
+ {
274
+ "event": "SubscriptionUpdateFailed",
275
+ "payloadSchema": [
276
+ {
277
+ "name": "error",
278
+ "type": "string"
279
+ },
280
+ {
281
+ "name": "code",
282
+ "type": "string"
283
+ }
284
+ ]
208
285
  }
209
286
  ],
210
287
  "stateMachine": {
@@ -289,6 +366,46 @@
289
366
  }
290
367
  ]
291
368
  },
369
+ {
370
+ "key": "SET_STATUS",
371
+ "name": "Set Status",
372
+ "payloadSchema": [
373
+ {
374
+ "name": "entityId",
375
+ "type": "string",
376
+ "required": true
377
+ },
378
+ {
379
+ "name": "newStatus",
380
+ "type": "string",
381
+ "required": true
382
+ }
383
+ ]
384
+ },
385
+ {
386
+ "key": "SubscriptionUpdated",
387
+ "name": "Subscription updated",
388
+ "payloadSchema": [
389
+ {
390
+ "name": "row",
391
+ "type": "Subscription"
392
+ }
393
+ ]
394
+ },
395
+ {
396
+ "key": "SubscriptionUpdateFailed",
397
+ "name": "Subscription update failed",
398
+ "payloadSchema": [
399
+ {
400
+ "name": "error",
401
+ "type": "string"
402
+ },
403
+ {
404
+ "name": "code",
405
+ "type": "string"
406
+ }
407
+ ]
408
+ },
292
409
  {
293
410
  "key": "CLOSE_VIEW",
294
411
  "name": "Close View"
@@ -305,8 +422,8 @@
305
422
  "Subscription",
306
423
  {
307
424
  "emit": {
308
- "success": "SubscriptionLoaded",
309
- "failure": "SubscriptionLoadFailed"
425
+ "failure": "SubscriptionLoadFailed",
426
+ "success": "SubscriptionLoaded"
310
427
  }
311
428
  }
312
429
  ],
@@ -314,22 +431,22 @@
314
431
  "render-ui",
315
432
  "main",
316
433
  {
317
- "direction": "vertical",
318
434
  "gap": "md",
319
- "type": "stack",
320
- "align": "center",
321
- "className": "py-12",
435
+ "direction": "vertical",
322
436
  "children": [
323
437
  {
324
438
  "type": "spinner"
325
439
  },
326
440
  {
327
- "content": "Loading subscriptions…",
328
- "color": "muted",
329
441
  "variant": "caption",
330
- "type": "typography"
442
+ "type": "typography",
443
+ "content": "Loading subscriptions…",
444
+ "color": "muted"
331
445
  }
332
- ]
446
+ ],
447
+ "align": "center",
448
+ "className": "py-12",
449
+ "type": "stack"
333
450
  }
334
451
  ]
335
452
  ]
@@ -343,69 +460,69 @@
343
460
  "render-ui",
344
461
  "main",
345
462
  {
346
- "type": "stack",
347
- "direction": "vertical",
348
- "gap": "md",
349
463
  "children": [
350
464
  {
351
- "align": "center",
465
+ "type": "stack",
352
466
  "direction": "horizontal",
467
+ "align": "center",
353
468
  "gap": "sm",
354
469
  "children": [
355
470
  {
356
- "name": "repeat",
357
- "type": "icon"
471
+ "type": "icon",
472
+ "name": "repeat"
358
473
  },
359
474
  {
360
- "content": "@config.title",
361
475
  "variant": "h3",
362
- "type": "typography"
476
+ "type": "typography",
477
+ "content": "@config.title"
363
478
  }
364
- ],
365
- "type": "stack"
479
+ ]
366
480
  },
367
481
  {
368
- "type": "simple-grid",
369
482
  "children": [
370
483
  {
371
- "icon": "repeat",
484
+ "type": "stat-display",
372
485
  "label": "Total subscriptions",
373
- "value": "@payload.data.length",
374
- "type": "stat-display"
486
+ "icon": "repeat",
487
+ "value": "@payload.data.length"
375
488
  },
376
489
  {
377
- "type": "stat-display",
490
+ "icon": "check-circle",
378
491
  "value": "248",
379
- "label": "Active",
380
- "icon": "check-circle"
492
+ "type": "stat-display",
493
+ "label": "Active"
381
494
  },
382
495
  {
383
496
  "type": "stat-display",
384
- "value": "$18,400",
385
497
  "label": "MRR",
498
+ "value": "$18,400",
386
499
  "icon": "dollar-sign"
387
500
  },
388
501
  {
389
- "label": "Past due",
390
502
  "type": "stat-display",
391
- "value": "7",
392
- "icon": "alert-triangle"
503
+ "icon": "alert-triangle",
504
+ "label": "Past due",
505
+ "value": "7"
393
506
  }
394
507
  ],
395
- "cols": 4.0
508
+ "cols": 4.0,
509
+ "type": "simple-grid"
396
510
  },
397
511
  {
398
512
  "type": "divider"
399
513
  },
400
514
  {
515
+ "gap": "sm",
401
516
  "entity": "@payload.data",
402
- "fields": "@config.fields",
517
+ "itemActions": "@config.itemActions",
403
518
  "cols": 1.0,
404
- "type": "data-grid",
405
- "gap": "sm",
406
- "itemActions": "@config.itemActions"
519
+ "fields": "@config.fields",
520
+ "type": "data-grid"
407
521
  }
408
- ]
522
+ ],
523
+ "gap": "md",
524
+ "direction": "vertical",
525
+ "type": "stack"
409
526
  }
410
527
  ]
411
528
  ]
@@ -419,9 +536,9 @@
419
536
  "render-ui",
420
537
  "main",
421
538
  {
422
- "type": "alert",
539
+ "message": "@payload.error",
423
540
  "variant": "error",
424
- "message": "@payload.error"
541
+ "type": "alert"
425
542
  }
426
543
  ]
427
544
  ]
@@ -505,46 +622,49 @@
505
622
  "render-ui",
506
623
  "main",
507
624
  {
508
- "gap": "md",
625
+ "direction": "vertical",
509
626
  "type": "stack",
627
+ "gap": "md",
510
628
  "children": [
511
629
  {
512
- "gap": "sm",
513
- "direction": "horizontal",
514
630
  "align": "center",
631
+ "direction": "horizontal",
515
632
  "children": [
516
633
  {
517
- "variant": "ghost",
518
- "action": "CLOSE_VIEW",
519
634
  "type": "button",
520
- "label": "Back"
635
+ "label": "Back",
636
+ "action": "CLOSE_VIEW",
637
+ "variant": "ghost"
521
638
  },
522
639
  {
523
640
  "type": "icon",
524
641
  "name": "repeat"
525
642
  },
526
643
  {
527
- "type": "typography",
528
644
  "content": "@entity.customerId",
529
- "variant": "h3"
645
+ "variant": "h3",
646
+ "type": "typography"
530
647
  },
531
648
  {
532
- "label": "@entity.status",
533
649
  "type": "badge",
650
+ "label": "@entity.status",
534
651
  "variant": "default"
535
652
  },
536
653
  {
537
- "variant": "primary",
538
654
  "type": "badge",
539
- "label": "@entity.interval"
655
+ "label": "@entity.interval",
656
+ "variant": "primary"
540
657
  }
541
658
  ],
542
- "type": "stack"
659
+ "type": "stack",
660
+ "gap": "sm"
543
661
  },
544
662
  {
545
663
  "type": "divider"
546
664
  },
547
665
  {
666
+ "type": "stack",
667
+ "direction": "vertical",
548
668
  "gap": "sm",
549
669
  "children": [
550
670
  {
@@ -561,93 +681,90 @@
561
681
  "type": "typography"
562
682
  }
563
683
  ],
684
+ "direction": "horizontal",
564
685
  "type": "stack",
565
- "gap": "md",
566
- "direction": "horizontal"
686
+ "gap": "md"
567
687
  },
568
688
  {
569
- "gap": "md",
570
689
  "direction": "horizontal",
571
- "type": "stack",
690
+ "gap": "md",
572
691
  "children": [
573
692
  {
574
693
  "type": "typography",
575
- "variant": "caption",
576
694
  "color": "muted",
695
+ "variant": "caption",
577
696
  "content": "Currency"
578
697
  },
579
698
  {
580
- "type": "typography",
699
+ "variant": "body",
581
700
  "content": "@entity.currency",
582
- "variant": "body"
701
+ "type": "typography"
583
702
  }
584
- ]
703
+ ],
704
+ "type": "stack"
585
705
  }
586
- ],
587
- "direction": "vertical",
588
- "type": "stack"
706
+ ]
589
707
  },
590
708
  {
591
709
  "type": "divider"
592
710
  },
593
711
  {
712
+ "type": "simple-grid",
594
713
  "children": [
595
714
  {
596
- "label": "Amount",
597
715
  "icon": "dollar-sign",
716
+ "value": "@entity.amount",
598
717
  "type": "stat-display",
599
- "value": "@entity.amount"
718
+ "label": "Amount"
600
719
  },
601
720
  {
602
- "value": "@entity.attemptCount",
603
721
  "type": "stat-display",
722
+ "value": "@entity.attemptCount",
604
723
  "label": "Retries",
605
724
  "icon": "rotate-cw"
606
725
  },
607
726
  {
727
+ "label": "Next bill",
608
728
  "type": "stat-display",
609
- "value": "@entity.nextBillingAt",
610
729
  "icon": "calendar",
611
- "label": "Next bill"
730
+ "value": "@entity.nextBillingAt"
612
731
  },
613
732
  {
614
733
  "icon": "credit-card",
734
+ "value": "@entity.lastChargeAt",
615
735
  "label": "Last charge",
616
- "type": "stat-display",
617
- "value": "@entity.lastChargeAt"
736
+ "type": "stat-display"
618
737
  }
619
738
  ],
620
- "cols": 4.0,
621
- "type": "simple-grid"
739
+ "cols": 4.0
622
740
  },
623
741
  {
624
- "type": "stack",
625
742
  "gap": "sm",
626
- "direction": "horizontal",
627
743
  "children": [
628
744
  {
745
+ "variant": "primary",
629
746
  "actionPayload": {
630
747
  "id": "@entity.id"
631
748
  },
632
- "action": "CHARGE",
633
- "variant": "primary",
634
749
  "label": "Charge",
635
- "type": "button"
750
+ "type": "button",
751
+ "action": "CHARGE"
636
752
  },
637
753
  {
638
754
  "type": "button",
639
755
  "label": "Cancel",
640
- "action": "CANCEL",
641
756
  "variant": "danger",
757
+ "action": "CANCEL",
642
758
  "actionPayload": {
643
759
  "id": "@entity.id"
644
760
  }
645
761
  }
646
762
  ],
647
- "align": "center"
763
+ "direction": "horizontal",
764
+ "align": "center",
765
+ "type": "stack"
648
766
  }
649
- ],
650
- "direction": "vertical"
767
+ ]
651
768
  }
652
769
  ]
653
770
  ]
@@ -676,22 +793,22 @@
676
793
  "render-ui",
677
794
  "main",
678
795
  {
679
- "align": "center",
680
- "gap": "md",
796
+ "type": "stack",
681
797
  "direction": "vertical",
682
- "className": "py-12",
798
+ "gap": "md",
799
+ "align": "center",
683
800
  "children": [
684
801
  {
685
802
  "type": "spinner"
686
803
  },
687
804
  {
688
805
  "variant": "caption",
806
+ "type": "typography",
689
807
  "color": "muted",
690
- "content": "Charging subscription…",
691
- "type": "typography"
808
+ "content": "Charging subscription…"
692
809
  }
693
810
  ],
694
- "type": "stack"
811
+ "className": "py-12"
695
812
  }
696
813
  ]
697
814
  ]
@@ -720,22 +837,106 @@
720
837
  "render-ui",
721
838
  "main",
722
839
  {
723
- "className": "py-12",
840
+ "align": "center",
841
+ "type": "stack",
724
842
  "children": [
725
843
  {
726
844
  "type": "spinner"
727
845
  },
728
846
  {
729
847
  "content": "Cancelling subscription…",
730
- "variant": "caption",
731
848
  "color": "muted",
732
- "type": "typography"
849
+ "type": "typography",
850
+ "variant": "caption"
733
851
  }
734
852
  ],
853
+ "gap": "md",
854
+ "direction": "vertical",
855
+ "className": "py-12"
856
+ }
857
+ ]
858
+ ]
859
+ },
860
+ {
861
+ "from": "browsing",
862
+ "to": "loading",
863
+ "event": "SET_STATUS",
864
+ "effects": [
865
+ [
866
+ "set",
867
+ "@entity.id",
868
+ "@payload.entityId"
869
+ ],
870
+ [
871
+ "set",
872
+ "@entity.status",
873
+ "@payload.newStatus"
874
+ ],
875
+ [
876
+ "persist",
877
+ "update",
878
+ "Subscription",
879
+ "@entity",
880
+ {
881
+ "emit": {
882
+ "success": "SubscriptionUpdated",
883
+ "failure": "SubscriptionUpdateFailed"
884
+ }
885
+ }
886
+ ],
887
+ [
888
+ "render-ui",
889
+ "main",
890
+ {
891
+ "type": "stack",
735
892
  "direction": "vertical",
736
893
  "gap": "md",
737
- "align": "center",
738
- "type": "stack"
894
+ "className": "py-12",
895
+ "children": [
896
+ {
897
+ "type": "spinner"
898
+ },
899
+ {
900
+ "variant": "caption",
901
+ "content": "Updating subscription status…",
902
+ "color": "muted",
903
+ "type": "typography"
904
+ }
905
+ ],
906
+ "align": "center"
907
+ }
908
+ ]
909
+ ]
910
+ },
911
+ {
912
+ "from": "browsing",
913
+ "to": "loading",
914
+ "event": "SubscriptionUpdated",
915
+ "effects": [
916
+ [
917
+ "fetch",
918
+ "Subscription",
919
+ {
920
+ "emit": {
921
+ "failure": "SubscriptionLoadFailed",
922
+ "success": "SubscriptionLoaded"
923
+ }
924
+ }
925
+ ]
926
+ ]
927
+ },
928
+ {
929
+ "from": "browsing",
930
+ "to": "browsing",
931
+ "event": "SubscriptionUpdateFailed",
932
+ "effects": [
933
+ [
934
+ "render-ui",
935
+ "main",
936
+ {
937
+ "variant": "error",
938
+ "message": "@payload.error",
939
+ "type": "alert"
739
940
  }
740
941
  ]
741
942
  ]
@@ -760,7 +961,8 @@
760
961
  "main",
761
962
  {
762
963
  "direction": "vertical",
763
- "className": "py-12",
964
+ "gap": "md",
965
+ "align": "center",
764
966
  "children": [
765
967
  {
766
968
  "type": "spinner"
@@ -772,9 +974,8 @@
772
974
  "content": "Loading subscriptions…"
773
975
  }
774
976
  ],
775
- "align": "center",
776
- "gap": "md",
777
- "type": "stack"
977
+ "type": "stack",
978
+ "className": "py-12"
778
979
  }
779
980
  ]
780
981
  ]
@@ -803,22 +1004,22 @@
803
1004
  "render-ui",
804
1005
  "main",
805
1006
  {
1007
+ "gap": "md",
806
1008
  "align": "center",
1009
+ "className": "py-12",
1010
+ "type": "stack",
1011
+ "direction": "vertical",
807
1012
  "children": [
808
1013
  {
809
1014
  "type": "spinner"
810
1015
  },
811
1016
  {
812
- "color": "muted",
813
1017
  "type": "typography",
1018
+ "content": "Charging subscription…",
814
1019
  "variant": "caption",
815
- "content": "Charging subscription…"
1020
+ "color": "muted"
816
1021
  }
817
- ],
818
- "direction": "vertical",
819
- "className": "py-12",
820
- "type": "stack",
821
- "gap": "md"
1022
+ ]
822
1023
  }
823
1024
  ]
824
1025
  ]
@@ -847,21 +1048,21 @@
847
1048
  "render-ui",
848
1049
  "main",
849
1050
  {
850
- "align": "center",
851
- "direction": "vertical",
852
- "className": "py-12",
1051
+ "type": "stack",
853
1052
  "children": [
854
1053
  {
855
1054
  "type": "spinner"
856
1055
  },
857
1056
  {
858
- "content": "Cancelling subscription…",
859
- "color": "muted",
860
1057
  "variant": "caption",
1058
+ "color": "muted",
1059
+ "content": "Cancelling subscription…",
861
1060
  "type": "typography"
862
1061
  }
863
1062
  ],
864
- "type": "stack",
1063
+ "align": "center",
1064
+ "className": "py-12",
1065
+ "direction": "vertical",
865
1066
  "gap": "md"
866
1067
  }
867
1068
  ]
@@ -895,6 +1096,20 @@
895
1096
  ]
896
1097
  },
897
1098
  "config": {
1099
+ "complianceJurisdiction": {
1100
+ "type": "string",
1101
+ "default": "",
1102
+ "label": "Compliance jurisdiction",
1103
+ "description": "Drives subscription regulations per locale: 'US-CA', 'EU-DE', 'UK', etc. Declarative.",
1104
+ "tier": "advanced"
1105
+ },
1106
+ "retentionYears": {
1107
+ "type": "number",
1108
+ "default": 7.0,
1109
+ "label": "Retention (years)",
1110
+ "description": "Years to keep subscription records for compliance.",
1111
+ "tier": "advanced"
1112
+ },
898
1113
  "maxRetries": {
899
1114
  "type": "number",
900
1115
  "default": 4.0,
@@ -902,18 +1117,25 @@
902
1117
  "description": "How many times a failed charge retries before going past-due",
903
1118
  "tier": "advanced"
904
1119
  },
1120
+ "lateFeeAmount": {
1121
+ "type": "number",
1122
+ "default": 0.0,
1123
+ "label": "Late fee amount",
1124
+ "description": "Flat cash amount or percentage (per lateFeePolicy).",
1125
+ "tier": "customization"
1126
+ },
905
1127
  "itemActions": {
906
1128
  "type": "[ItemAction]",
907
1129
  "default": [
908
1130
  {
909
- "event": "OPEN_SUBSCRIPTION",
1131
+ "icon": "arrow-right",
910
1132
  "label": "Open",
911
- "variant": "primary",
912
- "icon": "arrow-right"
1133
+ "event": "OPEN_SUBSCRIPTION",
1134
+ "variant": "primary"
913
1135
  },
914
1136
  {
915
- "label": "Cancel",
916
1137
  "event": "CANCEL",
1138
+ "label": "Cancel",
917
1139
  "variant": "danger"
918
1140
  }
919
1141
  ],
@@ -923,16 +1145,16 @@
923
1145
  "items": {
924
1146
  "type": "object",
925
1147
  "properties": {
926
- "icon": {
927
- "name": "icon",
928
- "type": "string",
929
- "required": false
930
- },
931
1148
  "event": {
932
1149
  "name": "event",
933
1150
  "type": "string",
934
1151
  "required": true
935
1152
  },
1153
+ "icon": {
1154
+ "name": "icon",
1155
+ "type": "string",
1156
+ "required": false
1157
+ },
936
1158
  "variant": {
937
1159
  "name": "variant",
938
1160
  "type": "string",
@@ -946,20 +1168,13 @@
946
1168
  }
947
1169
  }
948
1170
  },
949
- "title": {
950
- "type": "string",
951
- "default": "Subscriptions",
952
- "label": "Section title",
953
- "description": "Heading shown above the subscription list",
954
- "tier": "customization"
955
- },
956
1171
  "fields": {
957
1172
  "type": "[FieldSpec]",
958
1173
  "default": [
959
1174
  {
960
- "label": "Customer",
961
1175
  "variant": "caption",
962
- "name": "customerId"
1176
+ "name": "customerId",
1177
+ "label": "Customer"
963
1178
  },
964
1179
  {
965
1180
  "label": "Plan",
@@ -967,29 +1182,29 @@
967
1182
  "name": "planId"
968
1183
  },
969
1184
  {
1185
+ "name": "status",
970
1186
  "label": "Status",
971
- "variant": "badge",
972
- "name": "status"
1187
+ "variant": "badge"
973
1188
  },
974
1189
  {
1190
+ "variant": "caption",
975
1191
  "name": "amount",
976
- "label": "Amount",
977
- "variant": "caption"
1192
+ "label": "Amount"
978
1193
  },
979
1194
  {
1195
+ "name": "interval",
980
1196
  "label": "Interval",
981
- "variant": "badge",
982
- "name": "interval"
1197
+ "variant": "badge"
983
1198
  },
984
1199
  {
985
- "label": "Next Bill",
1200
+ "variant": "caption",
986
1201
  "name": "nextBillingAt",
987
- "variant": "caption"
1202
+ "label": "Next Bill"
988
1203
  },
989
1204
  {
990
- "variant": "caption",
1205
+ "label": "Retries",
991
1206
  "name": "attemptCount",
992
- "label": "Retries"
1207
+ "variant": "caption"
993
1208
  }
994
1209
  ],
995
1210
  "label": "Columns to show",
@@ -998,18 +1213,13 @@
998
1213
  "items": {
999
1214
  "type": "object",
1000
1215
  "properties": {
1001
- "name": {
1002
- "name": "name",
1003
- "type": "string",
1004
- "required": true
1005
- },
1006
1216
  "icon": {
1007
1217
  "name": "icon",
1008
1218
  "type": "string",
1009
1219
  "required": false
1010
1220
  },
1011
- "format": {
1012
- "name": "format",
1221
+ "header": {
1222
+ "name": "header",
1013
1223
  "type": "string",
1014
1224
  "required": false
1015
1225
  },
@@ -1018,16 +1228,21 @@
1018
1228
  "type": "string",
1019
1229
  "required": false
1020
1230
  },
1021
- "header": {
1022
- "name": "header",
1231
+ "name": {
1232
+ "name": "name",
1023
1233
  "type": "string",
1024
- "required": false
1234
+ "required": true
1025
1235
  },
1026
1236
  "variant": {
1027
1237
  "name": "variant",
1028
1238
  "type": "string",
1029
1239
  "required": false
1030
1240
  },
1241
+ "format": {
1242
+ "name": "format",
1243
+ "type": "string",
1244
+ "required": false
1245
+ },
1031
1246
  "label": {
1032
1247
  "name": "label",
1033
1248
  "type": "string",
@@ -1035,6 +1250,63 @@
1035
1250
  }
1036
1251
  }
1037
1252
  }
1253
+ },
1254
+ "title": {
1255
+ "type": "string",
1256
+ "default": "Subscriptions",
1257
+ "label": "Section title",
1258
+ "description": "Heading shown above the subscription list",
1259
+ "tier": "customization"
1260
+ },
1261
+ "currency": {
1262
+ "type": "string",
1263
+ "default": "USD",
1264
+ "label": "Default currency",
1265
+ "description": "ISO 4217 currency code (USD, EUR, GBP, …) for new subscriptions.",
1266
+ "tier": "essential"
1267
+ },
1268
+ "taxStrategy": {
1269
+ "type": "string",
1270
+ "default": "exclusive",
1271
+ "label": "Tax strategy",
1272
+ "description": "inclusive = tax baked into the amount; exclusive = tax added on top; none = no tax.",
1273
+ "tier": "customization",
1274
+ "values": [
1275
+ "inclusive",
1276
+ "exclusive",
1277
+ "none"
1278
+ ]
1279
+ },
1280
+ "roundingMode": {
1281
+ "type": "string",
1282
+ "default": "half-up",
1283
+ "label": "Rounding mode",
1284
+ "description": "Sub-cent rounding behavior for subscription amounts.",
1285
+ "tier": "advanced",
1286
+ "values": [
1287
+ "bankers",
1288
+ "half-up",
1289
+ "down"
1290
+ ]
1291
+ },
1292
+ "gracePeriodDays": {
1293
+ "type": "number",
1294
+ "default": 3.0,
1295
+ "label": "Grace period (days)",
1296
+ "description": "Days after a failed charge before the subscription is marked past-due. Wire via sibling std-lifecycle rule.",
1297
+ "tier": "customization"
1298
+ },
1299
+ "lateFeePolicy": {
1300
+ "type": "string",
1301
+ "default": "none",
1302
+ "label": "Late fee policy",
1303
+ "description": "How late fees compute on overdue subscriptions. Declarative; wiring deferred.",
1304
+ "tier": "customization",
1305
+ "values": [
1306
+ "none",
1307
+ "flat",
1308
+ "percent"
1309
+ ]
1038
1310
  }
1039
1311
  },
1040
1312
  "scope": "collection"
@@ -1053,4 +1325,4 @@
1053
1325
  ]
1054
1326
  }
1055
1327
  ]
1056
- }
1328
+ }