@mohasinac/appkit 4.58.0 → 4.59.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 (556) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/server/jobs/handlers/messages.d.ts +1 -1
  3. package/dist/_internal/server/jobs/handlers/messages.js +1 -1
  4. package/dist/_internal/shared/types/base-document.d.ts +1 -1
  5. package/dist/constants/seed-meta.d.ts +113 -0
  6. package/dist/constants/seed-meta.js +91 -0
  7. package/dist/index.d.ts +0 -131
  8. package/dist/index.js +50 -294
  9. package/dist/server.d.ts +0 -69
  10. package/dist/server.js +0 -69
  11. package/package.json +4 -2
  12. package/scripts/seed-cli.mjs +69 -1
  13. package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
  14. package/dist/features/tester/seed-data/_happy-path.js +0 -710
  15. package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
  16. package/dist/features/tester/seed-data/_money-flows.js +0 -610
  17. package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
  18. package/dist/features/tester/seed-data/authored/_types.js +0 -35
  19. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
  20. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
  21. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
  22. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
  23. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
  24. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
  25. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
  26. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
  27. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
  28. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
  29. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
  30. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
  31. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
  32. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
  33. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
  34. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
  35. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
  36. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
  37. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
  38. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
  39. package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
  40. package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
  41. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
  42. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
  43. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
  44. package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
  45. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
  46. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
  47. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
  48. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
  49. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
  50. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
  51. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
  52. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
  53. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
  54. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
  55. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
  56. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
  57. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
  58. package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
  59. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
  60. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
  61. package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
  62. package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
  63. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
  64. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
  65. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
  66. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
  67. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
  68. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
  69. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
  70. package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
  71. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
  72. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
  73. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
  74. package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
  75. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
  76. package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
  77. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
  78. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
  79. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
  80. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
  81. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
  82. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
  83. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
  84. package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
  85. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
  86. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
  87. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
  88. package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
  89. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
  90. package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
  91. package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
  92. package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
  93. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
  94. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
  95. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
  96. package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
  97. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
  98. package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
  99. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
  100. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
  101. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
  102. package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
  103. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
  104. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
  105. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
  106. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
  107. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
  108. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
  109. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
  110. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
  111. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
  112. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
  113. package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
  114. package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
  115. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
  116. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
  117. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
  118. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
  119. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
  120. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
  121. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
  122. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
  123. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
  124. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
  125. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
  126. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
  127. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
  128. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
  129. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
  130. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
  131. package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
  132. package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
  133. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
  134. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
  135. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
  136. package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
  137. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
  138. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
  139. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
  140. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
  141. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
  142. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
  143. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
  144. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
  145. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
  146. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
  147. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
  148. package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
  149. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
  150. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
  151. package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
  152. package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
  153. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
  154. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
  155. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
  156. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
  157. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
  158. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
  159. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
  160. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
  161. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
  162. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
  163. package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
  164. package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
  165. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
  166. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
  167. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
  168. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
  169. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
  170. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
  171. package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
  172. package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
  173. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
  174. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
  175. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
  176. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
  177. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
  178. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
  179. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
  180. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
  181. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
  182. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
  183. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
  184. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
  185. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
  186. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
  187. package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
  188. package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
  189. package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
  190. package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
  191. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
  192. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
  193. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
  194. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
  195. package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
  196. package/dist/features/tester/seed-data/authored/index.js +0 -301
  197. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
  198. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
  199. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
  200. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
  201. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
  202. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
  203. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
  204. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
  205. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
  206. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
  207. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
  208. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
  209. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
  210. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
  211. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
  212. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
  213. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
  214. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
  215. package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
  216. package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
  217. package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
  218. package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
  219. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
  220. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
  221. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
  222. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
  223. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
  224. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
  225. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
  226. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
  227. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
  228. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
  229. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
  230. package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
  231. package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
  232. package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
  233. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
  234. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
  235. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
  236. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
  237. package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
  238. package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
  239. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
  240. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
  241. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
  242. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
  243. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
  244. package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
  245. package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
  246. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
  247. package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
  248. package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
  249. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
  250. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
  251. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
  252. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
  253. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
  254. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
  255. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
  256. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
  257. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
  258. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
  259. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
  260. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
  261. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
  262. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
  263. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
  264. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
  265. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
  266. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
  267. package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
  268. package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
  269. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
  270. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
  271. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
  272. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
  273. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
  274. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
  275. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
  276. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
  277. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
  278. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
  279. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
  280. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
  281. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
  282. package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
  283. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
  284. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
  285. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
  286. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
  287. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
  288. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
  289. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
  290. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
  291. package/dist/features/tester/seed-data/index.d.ts +0 -2
  292. package/dist/features/tester/seed-data/index.js +0 -2
  293. package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
  294. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
  295. package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
  296. package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
  297. package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
  298. package/dist/features/tester/seed-data/tester-window.js +0 -66
  299. package/dist/seed/_helpers/brand-rows.d.ts +0 -35
  300. package/dist/seed/_helpers/brand-rows.js +0 -600
  301. package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
  302. package/dist/seed/_helpers/category-content-generated.js +0 -1853
  303. package/dist/seed/_helpers/category-content.d.ts +0 -68
  304. package/dist/seed/_helpers/category-content.js +0 -731
  305. package/dist/seed/_helpers/category-forest.d.ts +0 -4
  306. package/dist/seed/_helpers/category-forest.js +0 -824
  307. package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
  308. package/dist/seed/_helpers/category-images-generated.js +0 -618
  309. package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
  310. package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
  311. package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
  312. package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
  313. package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
  314. package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
  315. package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
  316. package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
  317. package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
  318. package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
  319. package/dist/seed/_helpers/category-models.d.ts +0 -12
  320. package/dist/seed/_helpers/category-models.js +0 -45
  321. package/dist/seed/_helpers/category-names.d.ts +0 -54
  322. package/dist/seed/_helpers/category-names.js +0 -118
  323. package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
  324. package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
  325. package/dist/seed/_helpers/category-parts.d.ts +0 -9
  326. package/dist/seed/_helpers/category-parts.js +0 -15022
  327. package/dist/seed/_helpers/category-tree.d.ts +0 -27
  328. package/dist/seed/_helpers/category-tree.js +0 -119
  329. package/dist/seed/_helpers/character-features.d.ts +0 -10
  330. package/dist/seed/_helpers/character-features.js +0 -120
  331. package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
  332. package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
  333. package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
  334. package/dist/seed/_helpers/franchise-rows.js +0 -189
  335. package/dist/seed/_helpers/media.d.ts +0 -67
  336. package/dist/seed/_helpers/media.js +0 -172
  337. package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
  338. package/dist/seed/_helpers/part-colours-generated.js +0 -273
  339. package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
  340. package/dist/seed/_helpers/product-search-txt.js +0 -23
  341. package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
  342. package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
  343. package/dist/seed/addresses-seed-data.d.ts +0 -2
  344. package/dist/seed/addresses-seed-data.js +0 -78
  345. package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
  346. package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
  347. package/dist/seed/bey-products-seed-data.d.ts +0 -18
  348. package/dist/seed/bey-products-seed-data.js +0 -18011
  349. package/dist/seed/beys/chunk0.d.ts +0 -17
  350. package/dist/seed/beys/chunk0.js +0 -36733
  351. package/dist/seed/beys/chunk1.d.ts +0 -17
  352. package/dist/seed/beys/chunk1.js +0 -35728
  353. package/dist/seed/beys/chunk2.d.ts +0 -17
  354. package/dist/seed/beys/chunk2.js +0 -35857
  355. package/dist/seed/beys/chunk3.d.ts +0 -17
  356. package/dist/seed/beys/chunk3.js +0 -34476
  357. package/dist/seed/beys-seed-data.d.ts +0 -18
  358. package/dist/seed/beys-seed-data.js +0 -11
  359. package/dist/seed/bids-seed-data.d.ts +0 -2
  360. package/dist/seed/bids-seed-data.js +0 -206
  361. package/dist/seed/blog-posts-seed-data.d.ts +0 -6
  362. package/dist/seed/blog-posts-seed-data.js +0 -442
  363. package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
  364. package/dist/seed/carousel-slides-seed-data.js +0 -411
  365. package/dist/seed/carousels-seed-data.d.ts +0 -2
  366. package/dist/seed/carousels-seed-data.js +0 -36
  367. package/dist/seed/cart-seed-data.d.ts +0 -2
  368. package/dist/seed/cart-seed-data.js +0 -241
  369. package/dist/seed/catalogue-seed-data.d.ts +0 -2
  370. package/dist/seed/catalogue-seed-data.js +0 -112
  371. package/dist/seed/categories-seed-data.d.ts +0 -3
  372. package/dist/seed/categories-seed-data.js +0 -816
  373. package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
  374. package/dist/seed/claimed-coupons-seed-data.js +0 -85
  375. package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
  376. package/dist/seed/coupon-usage-seed-data.js +0 -55
  377. package/dist/seed/coupons-seed-data.d.ts +0 -2
  378. package/dist/seed/coupons-seed-data.js +0 -226
  379. package/dist/seed/defaults/categories.d.ts +0 -2
  380. package/dist/seed/defaults/categories.js +0 -12
  381. package/dist/seed/defaults/faqs.d.ts +0 -2
  382. package/dist/seed/defaults/faqs.js +0 -40
  383. package/dist/seed/events-seed-data.d.ts +0 -7
  384. package/dist/seed/events-seed-data.js +0 -482
  385. package/dist/seed/factories/address.factory.d.ts +0 -21
  386. package/dist/seed/factories/address.factory.js +0 -44
  387. package/dist/seed/factories/bid.factory.d.ts +0 -15
  388. package/dist/seed/factories/bid.factory.js +0 -33
  389. package/dist/seed/factories/blog-post.factory.d.ts +0 -15
  390. package/dist/seed/factories/blog-post.factory.js +0 -22
  391. package/dist/seed/factories/carousel.factory.d.ts +0 -11
  392. package/dist/seed/factories/carousel.factory.js +0 -17
  393. package/dist/seed/factories/cart.factory.d.ts +0 -25
  394. package/dist/seed/factories/cart.factory.js +0 -35
  395. package/dist/seed/factories/category.factory.d.ts +0 -11
  396. package/dist/seed/factories/category.factory.js +0 -16
  397. package/dist/seed/factories/coupon.factory.d.ts +0 -21
  398. package/dist/seed/factories/coupon.factory.js +0 -43
  399. package/dist/seed/factories/faq.factory.d.ts +0 -10
  400. package/dist/seed/factories/faq.factory.js +0 -15
  401. package/dist/seed/factories/notification.factory.d.ts +0 -18
  402. package/dist/seed/factories/notification.factory.js +0 -39
  403. package/dist/seed/factories/order.factory.d.ts +0 -20
  404. package/dist/seed/factories/order.factory.js +0 -20
  405. package/dist/seed/factories/payout.factory.d.ts +0 -21
  406. package/dist/seed/factories/payout.factory.js +0 -38
  407. package/dist/seed/factories/product.factory.d.ts +0 -27
  408. package/dist/seed/factories/product.factory.js +0 -80
  409. package/dist/seed/factories/review.factory.d.ts +0 -14
  410. package/dist/seed/factories/review.factory.js +0 -52
  411. package/dist/seed/factories/session.factory.d.ts +0 -15
  412. package/dist/seed/factories/session.factory.js +0 -31
  413. package/dist/seed/factories/store.factory.d.ts +0 -23
  414. package/dist/seed/factories/store.factory.js +0 -47
  415. package/dist/seed/factories/user.factory.d.ts +0 -19
  416. package/dist/seed/factories/user.factory.js +0 -56
  417. package/dist/seed/faq-seed-data.d.ts +0 -18
  418. package/dist/seed/faq-seed-data.js +0 -1956
  419. package/dist/seed/firestore-indexes.d.ts +0 -12
  420. package/dist/seed/firestore-indexes.js +0 -31
  421. package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
  422. package/dist/seed/grouped-listings-seed-data.js +0 -283
  423. package/dist/seed/history-seed-data.d.ts +0 -12
  424. package/dist/seed/history-seed-data.js +0 -70
  425. package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
  426. package/dist/seed/homepage-sections-seed-data.js +0 -1034
  427. package/dist/seed/index.d.ts +0 -100
  428. package/dist/seed/index.js +0 -115
  429. package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
  430. package/dist/seed/lottery-entries-seed-data.js +0 -108
  431. package/dist/seed/manifest.d.ts +0 -16
  432. package/dist/seed/manifest.js +0 -235
  433. package/dist/seed/media-assets-seed-data.d.ts +0 -22
  434. package/dist/seed/media-assets-seed-data.js +0 -5593
  435. package/dist/seed/model-composition-seed-data.d.ts +0 -15
  436. package/dist/seed/model-composition-seed-data.js +0 -9032
  437. package/dist/seed/notifications-seed-data.d.ts +0 -2
  438. package/dist/seed/notifications-seed-data.js +0 -606
  439. package/dist/seed/offers-seed-data.d.ts +0 -2
  440. package/dist/seed/offers-seed-data.js +0 -398
  441. package/dist/seed/orders-seed-data.d.ts +0 -2
  442. package/dist/seed/orders-seed-data.js +0 -845
  443. package/dist/seed/part-glossary/chunk0.d.ts +0 -9
  444. package/dist/seed/part-glossary/chunk0.js +0 -35448
  445. package/dist/seed/part-glossary/chunk1.d.ts +0 -9
  446. package/dist/seed/part-glossary/chunk1.js +0 -40494
  447. package/dist/seed/part-glossary/chunk2.d.ts +0 -9
  448. package/dist/seed/part-glossary/chunk2.js +0 -51242
  449. package/dist/seed/part-glossary/chunk3.d.ts +0 -9
  450. package/dist/seed/part-glossary/chunk3.js +0 -53337
  451. package/dist/seed/part-glossary/chunk4.d.ts +0 -9
  452. package/dist/seed/part-glossary/chunk4.js +0 -51454
  453. package/dist/seed/part-glossary-seed-data.d.ts +0 -15
  454. package/dist/seed/part-glossary-seed-data.js +0 -25
  455. package/dist/seed/payouts-seed-data.d.ts +0 -2
  456. package/dist/seed/payouts-seed-data.js +0 -302
  457. package/dist/seed/product-features-seed-data.d.ts +0 -3
  458. package/dist/seed/product-features-seed-data.js +0 -366
  459. package/dist/seed/products-art-seed-data.d.ts +0 -2
  460. package/dist/seed/products-art-seed-data.js +0 -289
  461. package/dist/seed/products-auctions-seed-data.d.ts +0 -2
  462. package/dist/seed/products-auctions-seed-data.js +0 -475
  463. package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
  464. package/dist/seed/products-beyblade-x-seed-data.js +0 -476
  465. package/dist/seed/products-catalogue/chunk0.d.ts +0 -12
  466. package/dist/seed/products-catalogue/chunk0.js +0 -7262
  467. package/dist/seed/products-catalogue/chunk1.d.ts +0 -12
  468. package/dist/seed/products-catalogue/chunk1.js +0 -7290
  469. package/dist/seed/products-catalogue/chunk10.d.ts +0 -12
  470. package/dist/seed/products-catalogue/chunk10.js +0 -7290
  471. package/dist/seed/products-catalogue/chunk11.d.ts +0 -12
  472. package/dist/seed/products-catalogue/chunk11.js +0 -7005
  473. package/dist/seed/products-catalogue/chunk12.d.ts +0 -12
  474. package/dist/seed/products-catalogue/chunk12.js +0 -7002
  475. package/dist/seed/products-catalogue/chunk13.d.ts +0 -12
  476. package/dist/seed/products-catalogue/chunk13.js +0 -7002
  477. package/dist/seed/products-catalogue/chunk14.d.ts +0 -12
  478. package/dist/seed/products-catalogue/chunk14.js +0 -7002
  479. package/dist/seed/products-catalogue/chunk15.d.ts +0 -12
  480. package/dist/seed/products-catalogue/chunk15.js +0 -7002
  481. package/dist/seed/products-catalogue/chunk16.d.ts +0 -12
  482. package/dist/seed/products-catalogue/chunk16.js +0 -7002
  483. package/dist/seed/products-catalogue/chunk17.d.ts +0 -12
  484. package/dist/seed/products-catalogue/chunk17.js +0 -7002
  485. package/dist/seed/products-catalogue/chunk18.d.ts +0 -12
  486. package/dist/seed/products-catalogue/chunk18.js +0 -4398
  487. package/dist/seed/products-catalogue/chunk2.d.ts +0 -12
  488. package/dist/seed/products-catalogue/chunk2.js +0 -7268
  489. package/dist/seed/products-catalogue/chunk3.d.ts +0 -12
  490. package/dist/seed/products-catalogue/chunk3.js +0 -7264
  491. package/dist/seed/products-catalogue/chunk4.d.ts +0 -12
  492. package/dist/seed/products-catalogue/chunk4.js +0 -7268
  493. package/dist/seed/products-catalogue/chunk5.d.ts +0 -12
  494. package/dist/seed/products-catalogue/chunk5.js +0 -7258
  495. package/dist/seed/products-catalogue/chunk6.d.ts +0 -12
  496. package/dist/seed/products-catalogue/chunk6.js +0 -7268
  497. package/dist/seed/products-catalogue/chunk7.d.ts +0 -12
  498. package/dist/seed/products-catalogue/chunk7.js +0 -7311
  499. package/dist/seed/products-catalogue/chunk8.d.ts +0 -12
  500. package/dist/seed/products-catalogue/chunk8.js +0 -7304
  501. package/dist/seed/products-catalogue/chunk9.d.ts +0 -12
  502. package/dist/seed/products-catalogue/chunk9.js +0 -7309
  503. package/dist/seed/products-catalogue-seed-data.d.ts +0 -2
  504. package/dist/seed/products-catalogue-seed-data.js +0 -60
  505. package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
  506. package/dist/seed/products-classifieds-seed-data.js +0 -435
  507. package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
  508. package/dist/seed/products-digital-codes-seed-data.js +0 -395
  509. package/dist/seed/products-live-items-seed-data.d.ts +0 -7
  510. package/dist/seed/products-live-items-seed-data.js +0 -269
  511. package/dist/seed/products-preorders-seed-data.d.ts +0 -2
  512. package/dist/seed/products-preorders-seed-data.js +0 -360
  513. package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
  514. package/dist/seed/products-prize-draws-seed-data.js +0 -427
  515. package/dist/seed/products-spares-seed-data.d.ts +0 -2
  516. package/dist/seed/products-spares-seed-data.js +0 -368
  517. package/dist/seed/products-standard-seed-data.d.ts +0 -2
  518. package/dist/seed/products-standard-seed-data.js +0 -632
  519. package/dist/seed/products-stickers-seed-data.d.ts +0 -2
  520. package/dist/seed/products-stickers-seed-data.js +0 -319
  521. package/dist/seed/reviews-seed-data.d.ts +0 -1
  522. package/dist/seed/reviews-seed-data.js +0 -185
  523. package/dist/seed/runner.d.ts +0 -2
  524. package/dist/seed/runner.js +0 -125
  525. package/dist/seed/scammers-seed-data.d.ts +0 -2
  526. package/dist/seed/scammers-seed-data.js +0 -235
  527. package/dist/seed/seed-market-config.d.ts +0 -48
  528. package/dist/seed/seed-market-config.js +0 -199
  529. package/dist/seed/seed-purpose.d.ts +0 -299
  530. package/dist/seed/seed-purpose.js +0 -440
  531. package/dist/seed/sessions-seed-data.d.ts +0 -3
  532. package/dist/seed/sessions-seed-data.js +0 -116
  533. package/dist/seed/shipments-seed-data.d.ts +0 -5
  534. package/dist/seed/shipments-seed-data.js +0 -185
  535. package/dist/seed/site-settings-seed-data.d.ts +0 -2
  536. package/dist/seed/site-settings-seed-data.js +0 -1069
  537. package/dist/seed/store-addresses-seed-data.d.ts +0 -18
  538. package/dist/seed/store-addresses-seed-data.js +0 -71
  539. package/dist/seed/store-extensions-seed-data.d.ts +0 -11
  540. package/dist/seed/store-extensions-seed-data.js +0 -292
  541. package/dist/seed/stores-seed-data.d.ts +0 -6
  542. package/dist/seed/stores-seed-data.js +0 -242
  543. package/dist/seed/support-tickets-seed-data.d.ts +0 -16
  544. package/dist/seed/support-tickets-seed-data.js +0 -239
  545. package/dist/seed/tax-codes-seed-data.d.ts +0 -34
  546. package/dist/seed/tax-codes-seed-data.js +0 -100
  547. package/dist/seed/test-data-ttl.d.ts +0 -29
  548. package/dist/seed/test-data-ttl.js +0 -31
  549. package/dist/seed/test-utils.d.ts +0 -49
  550. package/dist/seed/test-utils.js +0 -110
  551. package/dist/seed/types.d.ts +0 -89
  552. package/dist/seed/types.js +0 -15
  553. package/dist/seed/users-seed-data.d.ts +0 -2
  554. package/dist/seed/users-seed-data.js +0 -597
  555. package/dist/seed/wishlists-seed-data.d.ts +0 -12
  556. package/dist/seed/wishlists-seed-data.js +0 -54
@@ -1,202 +0,0 @@
1
- /*
2
- * WHY: Authored six-part procedures for the admin/events-raffles-spin page.
3
- * WHAT: 8 case(s), keyed by full checklist id.
4
- *
5
- * Written by hand, case by case, against the label each one states. There is no
6
- * generator: the authoring scripts were deleted once it was clear they were
7
- * scaffolding around work that is simply writing.
8
- *
9
- * 🛑 THE ADMIN EVENT TYPE PICKER HAS BEEN WRONG BEFORE in a way no query error
10
- * surfaced: it offered three types the event union has never had, so each matched
11
- * zero rows forever, while omitting five real ones. Two cases here read the picker
12
- * and the filter chips against the real union rather than trusting either.
13
- *
14
- * The two "view before deciding" cases are the same defect as the moderation
15
- * pages: a row that offers Confirm and Waitlist without showing the entry lets an
16
- * admin act on a record they were never able to read.
17
- *
18
- * @tag domain:tester
19
- * @tag layer:seed
20
- * @tag pattern:none
21
- * @tag access:server-only
22
- * @tag consumers:seed-data/authored/index.ts
23
- * @tag sideEffects:none
24
- */
25
- export const authored = {
26
- "checklist-admin-events-raffles-spin-raffle-create-open": {
27
- roles: ["admin", "buyer"],
28
- startPage: "/admin/events/new",
29
- steps: [
30
- "Sign in as admin@letitrip.in / TempPass123!.",
31
- "Open /admin/events/new and read every option in the event type picker.",
32
- "Write the list down and compare it against the real event types the catalogue supports.",
33
- "Create an event titled 'QA Event raffle-open' with a raffle of type 'Open raffle (all confirmed entries)' — the full dropdown label, a prize, a start date of today and an end date a week out.",
34
- "Save, RELOAD, and read the raffle type, the prize and the dates.",
35
- "Sign out, sign in as rehan.sheikh@gmail.com / TempPass123!, and enter the raffle from its public page.",
36
- "Sign back in as admin and read the entry count on the event.",
37
- ],
38
- inputs: { title: "QA Event raffle-open", raffleType: "open" },
39
- expectedBehaviour: "The type picker offers every real event type and no invented ones. An option whose value is not a stored type matches nothing forever with no error — the picker once offered three such and omitted five real ones, under a comment deferring the fix.",
40
- expectedUiState: "The picker's options match the real type list, with no contest, giveaway or flash-sale style values that the union does not carry, and with lottery present. After the reload the raffle settings hold, and the buyer's entry raises the count.",
41
- endResult: "Leave the event in place — the draw case reads it.",
42
- },
43
- "checklist-admin-events-raffles-spin-raffle-create-top-n-scorers": {
44
- roles: ["admin", "buyer"],
45
- startPage: "/admin/events/new",
46
- steps: [
47
- "Sign in as admin@letitrip.in / TempPass123!.",
48
- "Create an event titled 'QA Event raffle-scorers' with the raffle type 'Top N scorers' — that exact dropdown label — N set to 3, and a prize.",
49
- "Save, RELOAD, and read the raffle type and the N value.",
50
- "Open the event's public page at /events/{its id} and read how the Overview tab describes who can win.",
51
- "Swap identity before this step: this case lists admin among its roles, so the harness resolves the whole batch to the ADMIN session. Copy tester/.tester-runs/session-buyer.json over session.json and CLOSE THE BROWSER — the MCP reads it only at context creation. Then sign in as rehan.sheikh@gmail.com / TempPass123!, enter the event, and read the Leaderboard tab. Entering as the ADMIN would still populate a leaderboard, so this would pass while measuring the wrong account.",
52
- "Read whether the leaderboard is ordered by score and whether the qualifying cut-off is stated.",
53
- ],
54
- inputs: { title: "QA Event raffle-scorers", raffleType: "top_n_scorers", topN: 3 },
55
- expectedBehaviour: "A top-N-scorers raffle draws from the highest-scoring entries, so the leaderboard must rank by score and the public page must state how many qualify. Ranking by entry time instead silently changes who can win, and nothing errors.",
56
- expectedUiState: "After the reload the type and N hold. The public Overview states the rule, and the Leaderboard is ordered by score with the cut-off named. A leaderboard ordered by entry time is the failure.",
57
- endResult: "Delete the event after reading it.",
58
- },
59
- "checklist-admin-events-raffles-spin-raffle-create-top-n-participants": {
60
- roles: ["admin", "buyer"],
61
- startPage: "/admin/events/new",
62
- steps: [
63
- "Sign in as admin@letitrip.in / TempPass123!.",
64
- "Create an event titled 'QA Event raffle-participants' with the raffle type 'Top N earliest participants' — note the word 'earliest', which a tester scanning for 'Top N participants' would not match, N set to 3, and a prize.",
65
- "Save, RELOAD, and read the raffle type and N.",
66
- "Open the event's public page at /events/{its id} and read how the Overview tab describes who can win.",
67
- "Compare that description against the scorers event's.",
68
- "Enter as rehan.sheikh@gmail.com / TempPass123! and compare the two leaderboards' ordering.",
69
- ],
70
- inputs: { title: "QA Event raffle-participants", raffleType: "top_n_participants", topN: 3 },
71
- expectedBehaviour: "This variant draws by participation rather than by score — a genuinely different rule from the scorers one. The two exist side by side precisely so the difference is checkable: identical leaderboards on both means the raffle type is not reaching the ranking.",
72
- expectedUiState: "The type and N hold after the reload, and the Overview describes a different rule from the scorers event. The two leaderboards order differently. Identical ordering on both is the failure.",
73
- endResult: "Delete the event after reading it.",
74
- },
75
- "checklist-admin-events-raffles-spin-raffle-draw-winner": {
76
- roles: ["admin", "buyer"],
77
- startPage: "/admin/events",
78
- steps: [
79
- "Sign in as admin@letitrip.in / TempPass123!.",
80
- "Open 'QA Event raffle-open' in the admin editor and read the entry list and the 'Pool size' readout in the raffle panel.",
81
- "Press 'Trigger Raffle Now'. A CONFIRMATION DIALOG must appear first — read it, then confirm.",
82
- "Read the winner named and the pool size reported.",
83
- "RELOAD and read the winner again.",
84
- "Read whether the winner's name and entry are both recorded on the event.",
85
- "Sign in as the winning buyer and open the notification bell; read the notification and follow its link.",
86
- "Sign back in as admin, reopen the event, and read the button's label and enabled state. Then attempt a second draw.",
87
- ],
88
- expectedBehaviour: "The draw picks once with real randomness, records the winner on the event, and notifies them. A second draw must be refused — redrawing replaces a winner who has already been told they won, and the notification cannot be recalled. A pool size of 0 on an event that visibly has entries is itself the failure: it means the eligibility query and the entry writer disagree about which field marks an entry eligible.",
89
- expectedUiState: "A confirmation dialog gates the draw. The winner is named and survives the reload. The event records both the winner and their entry. The buyer has one notification that deep-links to the event's winner page. On reopening, the button reads 'Already triggered' and is disabled; forcing a second draw is refused naming the existing winner, never with a generic failure.",
90
- /*
91
- * `drawsPermitted: 1` was already here and had never been exercised. The
92
- * other three are the preconditions that made it unexercisable:
93
- * poolSizeNotZero — the draw queried `status == "CONFIRMED"`, which
94
- * nothing writes at entry time, so EVERY draw
95
- * returned "no eligible entries"
96
- * winnerNotifications — the winner was recorded and never told
97
- * confirmationDialogs — an irreversible action with no confirmation
98
- */
99
- expectedData: {
100
- drawsPermitted: 1,
101
- poolSizeNotZero: true,
102
- winnerNotifications: 1,
103
- confirmationDialogs: 1,
104
- },
105
- endResult: "BEFORE: there was no confirmation dialog, the draw answered 'no eligible entries' on an event with entries (so no winner could ever be drawn), and on the rare path it did write a winner that person was never notified. AFTER: the dialog gates it, one winner is drawn and notified, and the second attempt is refused naming the existing winner. Delete the event afterwards. A second draw succeeding is the most serious failure on this page.",
106
- },
107
- "checklist-admin-events-raffles-spin-spin-wheel-create": {
108
- roles: ["admin", "buyer"],
109
- startPage: "/admin/events/new",
110
- steps: [
111
- "Sign in as admin@letitrip.in / TempPass123!.",
112
- "Create an event titled 'QA Event spin-create' of the spin-wheel type.",
113
- "Define three prizes with labels and weights, set a maximum of 2 spins per user, and set a spin window covering today.",
114
- "Save, RELOAD, and read every prize, weight, the maximum and the window.",
115
- "Open the event's public page at /events/{its id} and read the wheel and its segments.",
116
- "View SOURCE (or the network payload) for /events/{its id}/participate and search the response text for the string 'weight'. Then search it for 'couponId'.",
117
- ],
118
- inputs: { title: "QA Event spin-create", prizeCount: 3, maxPerUser: 2 },
119
- expectedBehaviour: "Prizes, weights, the per-user maximum and the window all round-trip. Weights are the odds and belong server-side — a public wheel that renders them tells every visitor which segment is worthless.",
120
- expectedUiState: "After the reload all four groups of settings hold. The public wheel shows three labelled segments.",
121
- /*
122
- * 🛑 The last step searches the PAYLOAD, not the rendered wheel, and that
123
- * is the whole case.
124
- *
125
- * It previously read "check the wheel does NOT disclose their weights" —
126
- * and the rendered wheel has never shown a weight, so a tester looked at
127
- * three labelled segments and passed. Meanwhile the participate page cast
128
- * the stored prize array straight into a client prop, so every weight AND
129
- * every internal coupon document id was sitting in the RSC payload of a
130
- * public page. The case asserted `weightsInPublicSource: 0` and could not
131
- * see the thing it was counting.
132
- */
133
- expectedData: { weightsInPublicSource: 0, couponIdsInPublicSource: 0 },
134
- endResult: "BEFORE: the payload contained 'weight: 15', 'weight: 25', 'weight: 10' and a 'couponId' for any prize carrying a coupon. AFTER: neither string appears anywhere in it, while the three labels still render. Leave the event in place — the limits case reads it.",
135
- },
136
- "checklist-admin-events-raffles-spin-spin-wheel-limits-enforced": {
137
- roles: ["admin", "buyer"],
138
- startPage: "/admin/events",
139
- steps: [
140
- "Sign in as rehan.sheikh@gmail.com / TempPass123! and open 'QA Event spin-create'.",
141
- "Spin once and read the prize and the remaining count.",
142
- "Spin a second time and read the remaining count.",
143
- "Attempt a third spin and read the refusal WORD FOR WORD.",
144
- "RELOAD the page and read the Spin button's state before clicking anything.",
145
- "An event is reachable by two URL spellings — its SLUG and its DOCUMENT ID. Note which one you have been using, then open the OTHER one as the same account and attempt a spin.",
146
- "Sign out and sign in as admin@letitrip.in / TempPass123!, then narrow the spin window so it is closed.",
147
- "Sign back in as the buyer and attempt a spin, reading that refusal word for word too.",
148
- ],
149
- inputs: { maxPerUser: 2 },
150
- expectedBehaviour: "The per-user cap and the window are both enforced server-side, the cap is scoped to the PERSON rather than to the URL spelling, and the two refusals read differently — 'no spins left' and 'the window is closed' are different facts and a single generic message tells the buyer neither.",
151
- expectedUiState: "The third attempt is refused naming the limit. After the reload the button is already disabled with the spent state shown, without a round trip. The other URL spelling is refused identically. With the window closed the refusal names the window instead.",
152
- /*
153
- * Three invariants, each of which was broken in a different way:
154
- * spinsAfterReload — the cap itself
155
- * spinsViaOtherUrlForm — the guest/identity hash was scoped to the
156
- * SLUG while enterEvent scoped it to the doc id,
157
- * so the two URL spellings were two identities
158
- * and the other one handed out a fresh allowance
159
- * distinctRefusalMessages — both refusals were the same sentence
160
- */
161
- expectedData: {
162
- maxPerUser: 2,
163
- spinsAfterReload: 0,
164
- spinsViaOtherUrlForm: 0,
165
- distinctRefusalMessages: 2,
166
- },
167
- endResult: "BEFORE: every refusal on this page read 'Spin failed. Please try again.', the button stayed enabled after a reload so the cap cost a round trip to discover, and the other URL spelling granted a fresh set of spins. AFTER: 'You've already used your spins for this event.' and 'The spin window isn't open right now.' are distinct, the button is pre-disabled, and both URL spellings share one allowance. Delete the event afterwards.",
168
- },
169
- "checklist-admin-events-raffles-spin-event-entries-admin-view": {
170
- roles: ["admin"],
171
- startPage: "/admin/events",
172
- steps: [
173
- "Sign in as admin@letitrip.in / TempPass123!.",
174
- "Open /admin/events/event-favourite-blader-poll/entries — an ACTIVE poll carrying 3 seeded entries, so the table is not empty — and read every column.",
175
- "Read every status filter offered and select each, noting any that returns nothing.",
176
- "For each empty filter, check the unfiltered list for rows of that status.",
177
- "Read the row actions offered and check at least one lets you VIEW an entry.",
178
- "Use the search if one is offered, then search zzzznope and read the count.",
179
- "Check whether buyer email addresses are shown in full.",
180
- ],
181
- inputs: { nonsenseQuery: "zzzznope" },
182
- expectedBehaviour: "Entries are readable and filterable, and every status chip names a value entries actually hold. The entry document carries the participant's email, which is PII — how much of it this list exposes is worth recording rather than assuming.",
183
- expectedUiState: "Every filter returns its own rows or is empty with none unfiltered either. A view affordance exists alongside the actions. 'zzzznope' returns none. Record exactly how buyer emails are displayed.",
184
- expectedData: { nonsenseResultCount: 0 },
185
- endResult: "Read-only; nothing persists beyond the URL.",
186
- },
187
- "checklist-admin-events-raffles-spin-event-entries-view-before-deciding": {
188
- roles: ["admin"],
189
- startPage: "/admin/events",
190
- steps: [
191
- "Sign in as admin@letitrip.in / TempPass123!.",
192
- "Open /admin/events/event-favourite-blader-poll/entries. That is the poll, and it has 3 seeded entries; picking an event with none would leave nothing to read and is indistinguishable from a broken table.",
193
- "Find a row offering Confirm, Waitlist or Cancel.",
194
- "WITHOUT using any of those, look for a way to read the entry's actual content first.",
195
- "Open the entry and read the participant's response in full.",
196
- "Return to the list and check the same content is reachable from the row itself.",
197
- ],
198
- expectedBehaviour: "An admin can read an entry before deciding on it. A row offering Confirm, Waitlist and Cancel without showing what was submitted is a decision made blind — the same shape as approving a catalogue submission whose photos were never rendered, or confirming a bug report whose comment and screenshot are not on screen.",
199
- expectedUiState: "The entry's response is readable from the list or from a detail view reachable from the row, before any action is taken. A row with only mutations is the failure, and it looks complete because the buttons work.",
200
- endResult: "Read-only; take no action on any entry. Report whether the content was reachable WITHOUT deciding.",
201
- },
202
- };
@@ -1,2 +0,0 @@
1
- import type { AuthoredCase } from "./_types";
2
- export declare const authored: Record<string, AuthoredCase>;
@@ -1,249 +0,0 @@
1
- /*
2
- * WHY: Authored six-part procedures for the admin/firebase-function-effects page.
3
- * WHAT: 14 cases, keyed by full checklist id.
4
- *
5
- * 🛑 EVERY CASE HERE TESTS AN EFFECT, NEVER A FUNCTION.
6
- *
7
- * 53 Firebase functions are defined — 27 scheduled, 20 Firestore triggers, 6
8
- * HTTPS — and none had a checklist case. The reason is that the obvious way to
9
- * write one is untestable: "trigger the cron and confirm it ran" cannot be done
10
- * from a browser in a session, so every such case would be answered null
11
- * forever, which reads as coverage while providing none.
12
- *
13
- * 🛑 THOSE FOUR NUMBERS WERE 55 / 28 / 20 / 7 UNTIL 2026-09-29, and three of them
14
- * were wrong. Recounted from the registry itself:
15
- *
16
- * grep -c "defineFunction(" appkit/src/_internal/server/functions/scheduled.ts
17
- * firestore.ts
18
- * https.ts
19
- *
20
- * CLAUDE.md warns that the scheduled figure has drifted four separate times and
21
- * says to recount rather than quote it; this file quoted it and drifted a fifth.
22
- * Recount before trusting any of them — including these.
23
- *
24
- * So each case instead reads the thing the function is RESPONSIBLE FOR. A nightly
25
- * reconciler is tested by recounting what it reconciles; a settlement job by
26
- * whether the winner can pay; a self-triggering write-back by whether its
27
- * timestamp moves when nothing changed. All answerable in seconds, all able to
28
- * fail.
29
- *
30
- * Three of these are written against real, recorded incidents and would have
31
- * caught them: #92 (a trigger that self-triggered 1,017,548 times in 24h),
32
- * #60 (a settlement that produced an order nobody could pay), #102 (a reconciler
33
- * that could not express what it reconciled).
34
- *
35
- * @tag domain:tester
36
- * @tag layer:seed
37
- * @tag pattern:none
38
- * @tag access:server-only
39
- * @tag consumers:seed-data/authored/index.ts
40
- * @tag sideEffects:none
41
- */
42
- const ADMIN = "Sign in as admin@letitrip.in / TempPass123!.";
43
- export const authored = {
44
- "checklist-admin-firebase-function-effects-function-invocation-health-per-function": {
45
- roles: ["admin"],
46
- startPage: "/admin/maintenance",
47
- steps: [
48
- ADMIN,
49
- "Open the Firebase console for this project and go to Functions.",
50
- "Sort the function list by invocation count over the last 24 hours, highest first.",
51
- "Write down the top entry's count and the count of the tenth entry.",
52
- "Divide the first by the second.",
53
- ],
54
- expectedBehaviour: "No single function is running away from the rest. This is the case that would have caught Root Cause #92, where onShipmentHeaderWrite self-triggered 1,017,548 times in 24 hours against a 2,000,000/month free quota while every other function in the project sat between 0 and 95 — and the overage then blocked deploys and degraded production through the sibling Firestore read quota.",
55
- expectedUiState: "The per-function breakdown is on screen, sorted. The top function's count is of the same order as the rest of the active ones. A ratio in the thousands is the finding, and the function's name is quoted.",
56
- expectedData: { runawayFunctions: 0 },
57
- endResult: "Read-only; nothing persists. 🛑 Read the PER-FUNCTION breakdown, never the aggregate — the aggregate never names the culprit, which is exactly why #92 was found from a billing page rather than from monitoring.",
58
- requiresHumanChannel: true,
59
- humanChannelReason: "The per-function invocation breakdown lives in the Firebase console, which needs an interactive Google sign-in the automated browser does not have. There is no in-product surface for it — /admin/maintenance/cloud-logs shows raw log lines, not per-function counts. A human runs this one; the automated answer is null, naming the console as the missing channel.",
60
- },
61
- "checklist-admin-firebase-function-effects-function-errors-page-has-no-producer": {
62
- roles: ["admin"],
63
- startPage: "/admin/maintenance/function-errors",
64
- steps: [
65
- ADMIN,
66
- "Open /admin/maintenance/function-errors and read what it shows.",
67
- "Open /admin/maintenance/server-errors in another tab and read what it shows.",
68
- "Compare the two: note whether server-errors has rows while function-errors does not.",
69
- ],
70
- expectedBehaviour: "BEFORE: the page is expected to list Cloud Function failures. AFTER: it is empty, and it will remain empty no matter what breaks, because NOTHING IN PRODUCTION WRITES a serverErrors row with source \"function\". `wrapJobHandler` is the only thing that would, and as of 2026-09-29 it has NO CALL SITES AT ALL — it is defined, re-exported from the server barrel, and invoked nowhere. (This case used to say \"referenced solely by its own test\", which stopped being true when both test suites were deleted; the claim is now stronger, not weaker.) The sibling server-errors page has a real producer and should show rows, which is what makes the contrast legible.",
71
- expectedUiState: "function-errors renders an empty list or empty state. server-errors renders actual rows. Screenshot both, side by side if possible.",
72
- expectedData: { functionErrorRows: 0 },
73
- endResult: "🛑 ANSWER NO. This case is authored to FAIL against today's product, and that is deliberate: a case reading \"check that errors appear here\" would pass vacuously against a surface that can never populate. A red case with a screenshot is a tracked defect; a note in a document is not.",
74
- },
75
- "checklist-admin-firebase-function-effects-https-function-401-is-healthy-500-is-not": {
76
- roles: ["admin"],
77
- startPage: "/admin/maintenance",
78
- steps: [
79
- ADMIN,
80
- "Open the Firebase console's Functions list and copy the trigger URL of adminAnalytics.",
81
- "Open that URL in a new tab with no auth header and read the status and body.",
82
- "Repeat for storeAnalytics, promotionsApi, listingProcessor, triggerEventRaffle, assignSpinPrize and gateway.",
83
- "Write down the status code each one returned.",
84
- ],
85
- expectedBehaviour: "Every one of the seven answers 401. A 401 means the module LOADED and the auth gate ran — that is healthy, and it is the expected answer, not a failure. A 500 means the module failed at cold start, which is how Root Cause #69 served 500 on every route while the build reported READY.",
86
- expectedUiState: "Seven status codes are recorded. All are 401 (or 403). Any 500 is quoted with the function's name and whatever body it returned.",
87
- expectedData: { httpsFunctions: 7, fiveHundreds: 0 },
88
- endResult: "Read-only; nothing persists. 🛑 Do not record a 401 as a failure — that inversion is the single most likely way this case is answered wrongly.",
89
- },
90
- "checklist-admin-firebase-function-effects-counters-reconcile-effect-category-counts": {
91
- roles: ["admin"],
92
- startPage: "/categories",
93
- steps: [
94
- ADMIN,
95
- "Open /categories and write down the product count shown for the root category Spinning Tops.",
96
- "Open that category's own page and count the listings it actually shows, paging through if there is more than one page.",
97
- "Do the same for one leaf category further down the tree.",
98
- "Compare each displayed count against your recount.",
99
- ],
100
- expectedBehaviour: "The displayed count equals the recount, for both the root and the leaf. countersReconcile runs nightly and maintains two DIFFERENT numbers — metrics.productCount, the items filed directly under a row, and metrics.totalProductCount, that row plus every descendant. Root Cause 102: setMetrics took one pair of numbers and wrote it to both fields, so on any ancestor the row's own items were lost from its own rollup. 19 of 65 rows disagreed with a recount and every one was LOW.",
101
- expectedUiState: "Two categories are recounted and both match. Any mismatch is reported with three numbers: the displayed count, the recount, and which category.",
102
- endResult: "Read-only; nothing persists. A wrong number here never errors — it is simply a number — so the recount is the only thing that can detect it.",
103
- },
104
- "checklist-admin-firebase-function-effects-revenue-rollup-effect-dashboard-reads-one-doc": {
105
- roles: ["admin"],
106
- startPage: "/admin",
107
- steps: [
108
- ADMIN,
109
- "Open /admin and read the revenue figures on the dashboard.",
110
- "Open /admin/orders, filter to delivered orders, and note roughly how many there are and their rough total.",
111
- "Compare the dashboard's figure against that rough total.",
112
- "Reload /admin once and confirm the figure is the same and appears without a long delay.",
113
- ],
114
- expectedBehaviour: "The dashboard shows a plausible revenue figure derived from a pre-computed rollup rather than a live scan of every order. revenueRollup exists specifically so this page is a single-document read — that is the pattern protecting the 50,000/day Firestore read quota, and a dashboard that scans instead is how that quota gets spent.",
115
- expectedUiState: "A revenue figure is present and is of the same order as the delivered orders suggest. Zero revenue while real delivered orders exist means the rollup did not run or wrote a shape the page cannot read.",
116
- endResult: "Read-only; nothing persists.",
117
- },
118
- "checklist-admin-firebase-function-effects-auction-settlement-effect-winner-gets-payable-line": {
119
- roles: ["admin"],
120
- startPage: "/admin/products",
121
- steps: [
122
- ADMIN,
123
- "Open /admin/products and filter to auctions, then find one that has already ended with bids on it.",
124
- "Open it and note the winning bidder.",
125
- "Open that winner's account view from /admin/users and look for what the win produced.",
126
- "Establish whether the win left something the winner could actually pay for — a locked cart line reachable from checkout — or only a record that renders nowhere.",
127
- ],
128
- expectedBehaviour: "A settled auction leaves the winner a LOCKED cart line that reaches checkout through the auction lane. Root Cause #60: auctionSettlement used to write a document into the orders collection that was not an OrderDocument — flat productId/unitPrice fields instead of buyerId and items[], no paymentMethod, a Firestore auto-id instead of a semantic one. It rendered correctly in no orders list, no checkout accepted it, and the sweep that cleans up unpaid orders never saw it. There was no way, anywhere in the product, for a winner to pay.",
129
- expectedUiState: "The win is visible to the winner as something actionable. If it appears only as a row that cannot be opened or paid, that is the finding, and the auction id is quoted.",
130
- endResult: "Read-only — do not pay or cancel anything. The point is whether a payable path EXISTS, not whether it completes.",
131
- },
132
- "checklist-admin-firebase-function-effects-offer-expiry-effect-lapsed-offer-frees-the-cart": {
133
- roles: ["admin"],
134
- startPage: "/admin/offers",
135
- steps: [
136
- ADMIN,
137
- "Open /admin/offers and find an offer whose status is expired, or one whose deadline has clearly passed.",
138
- "Open it and note the buyer.",
139
- "Open that buyer's cart from the admin user view, or sign in as them if the fixture allows.",
140
- "Check whether a locked line for that offer is still sitting in their cart.",
141
- ],
142
- expectedBehaviour: "A lapsed offer is no longer actionable AND has left no locked line behind. runOfferExpiry sweeps three things in one pass — pending offers past expiresAt, ACCEPTED offers past checkoutDeadline, and unpaid auction wins. The third and second were added later than the first, and the function deliberately has no early return when the first query is empty, because the other two sweeps must still run.",
143
- expectedUiState: "The offer reads as expired and the buyer's cart has no leftover locked line for it.",
144
- expectedData: { leftoverLockedLines: 0 },
145
- endResult: "Read-only; nothing persists. 🛑 A leftover locked line is worse than it looks: the offer lane OUTRANKS the standard lane, so it blocks the buyer's entire cart, not merely that one offer.",
146
- },
147
- "checklist-admin-firebase-function-effects-payment-window-timeout-effect-expired-proof-window": {
148
- roles: ["admin"],
149
- startPage: "/admin/orders",
150
- steps: [
151
- ADMIN,
152
- "Open /admin/orders and filter to manual-payment orders awaiting payment.",
153
- "Find one whose payment deadline has already passed.",
154
- "Open it and read its status and its payment panel.",
155
- "Note whether it has been resolved by a sweep or is still sitting pending with an expired deadline.",
156
- ],
157
- expectedBehaviour: "An order past its 15-minute payment window has been resolved rather than left pending indefinitely. paymentWindowTimeout and paymentReviewAutoApprove are the two sweeps that stop a manual payment stalling forever — one cancels an unpaid window, the other auto-approves an unreviewed proof after two hours.",
158
- expectedUiState: "The order shows a resolved state consistent with its deadline having passed. An order still pending with a deadline hours in the past is the finding, with its id and its deadline quoted.",
159
- endResult: "Read-only — do not verify or reject the payment yourself; that would destroy the evidence.",
160
- },
161
- "checklist-admin-firebase-function-effects-rtdb-event-channels-are-pruned": {
162
- roles: ["admin"],
163
- startPage: "/admin/maintenance",
164
- steps: [
165
- ADMIN,
166
- "Open the Firebase console's Realtime Database for this project.",
167
- "Look at the auth_events, payment_events and bulk_events nodes and note roughly how many children each holds.",
168
- "Note the oldest timestamp you can see under each.",
169
- "Compare that age against the prune interval each is supposed to have.",
170
- ],
171
- expectedBehaviour: "The signal channels are being pruned rather than accumulating. cleanupRtdbEvents prunes auth_events at 3 minutes and payment_events and bulk_events at 15, and email_events at 1 hour. The email channel is deliberately the longest: a batch can take ten minutes between triggering a send and asserting on it, and a ping deleted mid-batch reads as \"no email was sent\" — a false negative in exactly the mechanism meant to prevent one.",
172
- expectedUiState: "Each channel holds only recent children. A node holding entries hours or days old means the prune is not running for it, and that node's name is quoted.",
173
- endResult: "Read-only — do not delete anything by hand. Note that auction-bids is deliberately NOT pruned and is not part of this case.",
174
- },
175
- "checklist-admin-firebase-function-effects-media-tmp-cleanup-effect-aborted-uploads-removed": {
176
- roles: ["admin"],
177
- startPage: "/admin/media",
178
- steps: [
179
- ADMIN,
180
- "Open /admin/media and begin uploading an image.",
181
- "Abandon the upload before it finalises — close the dialog or navigate away mid-upload.",
182
- "Return to /admin/media and look for the abandoned file.",
183
- "Reload once and look again.",
184
- ],
185
- expectedBehaviour: "An abandoned upload does not appear as a real, usable asset. Bytes land under a tmp/ prefix and are moved to a permanent path only by finalize; mediaTmpCleanup removes whatever never finalised. An un-finalised object showing up in the media library is the finding, because it can then be attached to a listing and will later vanish.",
186
- expectedUiState: "The media library shows no entry for the abandoned upload, either immediately or after the reload.",
187
- endResult: "If a stray entry was created, note its name so it can be cleaned up; do not leave it attached to any listing.",
188
- },
189
- "checklist-admin-firebase-function-effects-product-write-trigger-effect-stock-and-groups": {
190
- roles: ["admin"],
191
- startPage: "/admin/products",
192
- steps: [
193
- ADMIN,
194
- "Open /admin/grouped-listings and pick a group, noting its member count and how many members it says are active.",
195
- "Note one member product's id.",
196
- "Open that product in /admin/products and set its stock quantity to 0, then save.",
197
- "Return to /admin/grouped-listings and reload, then read the same group's active member count.",
198
- "Set the product's stock back to its original value and confirm the count returns.",
199
- ],
200
- expectedBehaviour: "Changing one product's stock updates the derived state on the OTHER records that depend on it, without anyone editing them. onProductWrite / onProductStockChange recompute a grouped listing's activeMemberCount and visibilityStatus and keep bundles in sync. The effect is visible on the group, never on the product you edited — which is why a case that only re-reads the product would pass against a broken trigger.",
201
- expectedUiState: "The group's active member count drops by one after the stock change and returns after it is restored. A count that never moves is the finding.",
202
- endResult: "🛑 RESTORE THE STOCK. Leaving a seeded product at zero silently removes it from every public listing for every later case.",
203
- },
204
- "checklist-admin-firebase-function-effects-order-create-trigger-effect-staff-signal": {
205
- roles: ["admin"],
206
- startPage: "/admin/orders",
207
- steps: [
208
- ADMIN,
209
- "Open /admin/orders and note the most recent order's id and the time it was created.",
210
- "Open /admin/admin-notifications — the staff inbox, which is a different page from /admin/notifications, the per-user notification list — and look for a signal corresponding to that order.",
211
- "Note whether the signal exists, and whether there is exactly one rather than one per employee.",
212
- ],
213
- expectedBehaviour: "A new order leaves something an operator can notice, as ONE durable staff-visible record rather than a personal notification fanned out to every employee. The fan-out shape is what nearly exhausted a 100/day email allowance from a single event, so one row read by the admin inbox and counted by the daily digest is the correct shape.",
214
- expectedUiState: "A staff-visible signal exists for the recent order. If several identical signals exist, one per employee, that is a finding in its own right.",
215
- endResult: "Read-only; nothing persists.",
216
- },
217
- "checklist-admin-firebase-function-effects-shipment-trigger-no-op-guard-holds": {
218
- roles: ["admin"],
219
- startPage: "/admin/shipments",
220
- steps: [
221
- ADMIN,
222
- "Open /admin/shipments and open one shipment.",
223
- "Note its computed totals and the timestamp showing when those totals were last computed.",
224
- "Press Save without changing any field.",
225
- "Reload the shipment and read that timestamp again.",
226
- "Press Save unchanged a second time, reload, and read it once more.",
227
- ],
228
- expectedBehaviour: "Saving an unchanged shipment does NOT recompute its totals — the timestamp is identical all three times. This is Root Cause #92's exact mechanism: onShipmentHeaderWrite watches the collection it writes back to, and its only brake is a no-op guard. That guard compared with JSON.stringify, which is key-order sensitive, while Firestore returns map fields alphabetically and the code built them in construction order. The two strings could never match, so every write re-triggered — 1,017,548 invocations in 24 hours, which then blocked deploys and degraded production.",
229
- expectedUiState: "The totals-computed timestamp is byte-identical across all three readings. Any movement on an unchanged save means the guard is not holding, and that is a billing incident, not a cosmetic one.",
230
- expectedData: { timestampMovementsOnUnchangedSave: 0 },
231
- endResult: "No field is changed. 🛑 If the timestamp DOES move, stop and report immediately rather than saving again — each save is another round of the loop.",
232
- },
233
- "checklist-admin-firebase-function-effects-scheduled-job-count-matches-registry": {
234
- roles: ["admin"],
235
- startPage: "/admin/maintenance",
236
- steps: [
237
- ADMIN,
238
- "Open the Google Cloud console's Cloud Scheduler page for this project.",
239
- "Count the jobs listed and write the number down.",
240
- "Open the Firebase console's Functions list and count the entries with a scheduled trigger.",
241
- "Compare the two numbers.",
242
- ],
243
- expectedBehaviour: "The two counts match. Scheduler bills per REGISTERED job rather than per invocation, so a job with no matching function is paid for and dead, and a scheduled function with no job simply never runs — and nothing in the product reports either.",
244
- expectedUiState: "Two counts are written down and are equal. If they differ, name the jobs or functions that appear on only one side.",
245
- endResult: "Read-only; nothing persists. 🛑 RECOUNT rather than quoting a remembered number — this figure has drifted five separate times now, including once inside this very file, which is exactly why the case asks for a count instead of stating one. As of 2026-09-29 the registry defines 27 scheduled functions; if Scheduler shows a different number, the difference is the finding.",
246
- requiresHumanChannel: true,
247
- humanChannelReason: "Both counts are read from Google consoles — Cloud Scheduler and the Firebase Functions list — which need an interactive Google sign-in the automated browser does not have. The registry side can be counted from source, but the billed side cannot, and the whole case is the comparison. A human runs this one.",
248
- },
249
- };
@@ -1,2 +0,0 @@
1
- import type { AuthoredCase } from "./_types";
2
- export declare const authored: Record<string, AuthoredCase>;
@@ -1,148 +0,0 @@
1
- /*
2
- * WHY: Authored six-part procedures for the admin/media-watermark page.
3
- * WHAT: 5 case(s), keyed by full checklist id.
4
- *
5
- * Written by hand, case by case, against the label each one states. There is no
6
- * generator: the authoring scripts were deleted once it was clear they were
7
- * scaffolding around work that is simply writing.
8
- *
9
- * 🛑 THE WATERMARK HAS A FOUR-TIER FALLBACK and never simply skips: an admin image
10
- * override, then the bundled brand mark, then the wordmark, then plain text. So an
11
- * image with NO mark at all does not mean the watermark is off — it means that
12
- * image was not served through the proxy, which is a different and larger finding.
13
- *
14
- * Video is the exception, and deliberately so: it cannot be composited server-side
15
- * within the platform's compute budget, so the mark is a client overlay and its
16
- * settings have to reach a second consumer.
17
- *
18
- * 🛑 …AND THAT SECOND CONSUMER IS NOT ON THE PRODUCT PAGE (found 2026-09-29).
19
- * `<MediaVideo>`, which owns the overlay, is mounted in exactly three places:
20
- * `HeroCarousel` and the two admin upload previews. A product video plays in
21
- * `ImageLightbox`, which renders a bare `<video controls>` — no overlay layer at
22
- * all. So the poster frame is watermarked (it is a still, proxied like any
23
- * image) and the playing video is not. The parity case now expects that and
24
- * names the homepage hero as the surface where the overlay does apply.
25
- *
26
- * The watermark tab is on /admin/site → 'Watermark'. Its real controls:
27
- * a 'Watermark type' select (Text | Image), 'Watermark text' or a
28
- * 'Watermark image' upload, a `Size — N% of image width` slider (5-100 step 5),
29
- * an `Opacity — N%` slider (5-100 step 5), a 'Position' select, and a
30
- * 'Use a custom X/Y offset instead' toggle revealing two labelled offset
31
- * inputs measured in percent FROM CENTER (+right/+down).
32
- *
33
- * 🛑 THEME RECOLOUR READS `defaultLightThemeId` AND NOTHING ELSE.
34
- * `resolveThemeGradientStops` looks up the theme record named by
35
- * `theme.defaultLightThemeId` (falling back to "default-light") and takes its
36
- * `--appkit-gradient-logo` stops. Changing the DARK default, or a viewer's own
37
- * mode, does not move the composited mark's colour — so the case must change
38
- * the default LIGHT theme or it will report a failure that is really a
39
- * mis-aimed step.
40
- *
41
- * @tag domain:tester
42
- * @tag layer:seed
43
- * @tag pattern:none
44
- * @tag access:server-only
45
- * @tag consumers:seed-data/authored/index.ts
46
- * @tag sideEffects:none
47
- */
48
- export const authored = {
49
- "checklist-admin-media-watermark-watermark-size-opacity-controls": {
50
- roles: ["admin", "guest"],
51
- startPage: "/admin/site",
52
- steps: [
53
- "Sign in as admin@letitrip.in / TempPass123!.",
54
- "Open /admin/site, go to its 'Watermark' tab, and write down the current values of the `Size — N% of image width` and `Opacity — N%` sliders.",
55
- "Sign out and open /products/product-beyblade-burst-valkyrie, then open its main image and note how the mark looks.",
56
- "Sign back in and set Size to 100 and Opacity to 100, then save.",
57
- "Sign out, reload that product image with a HARD reload, and compare.",
58
- "Sign back in, restore both sliders to the values written down in step 2, save, and reload the image again.",
59
- ],
60
- inputs: {
61
- product: "product-beyblade-burst-valkyrie",
62
- sizeAfter: 100,
63
- opacityAfter: 100,
64
- sliderStep: 5,
65
- },
66
- expectedBehaviour: "Size and opacity reach the served image. The mark is composited server-side as the image is proxied, so a setting that saves without changing the output means the render path is not reading it — and because images are cached aggressively, a hard reload may be needed before concluding either way.",
67
- expectedUiState: "The mark is visibly larger and more opaque after the change, and back to its original appearance after the restore. Both sliders move in steps of 5 between 5 and 100, so a value typed outside that range is not reachable and is not a finding. A settings page that saves with no visible effect on the served image IS the failure.",
68
- endResult: "Both settings are restored. Note whether a hard reload was required — that is cache behaviour rather than a defect, but it changes how the next tester reads this page.",
69
- },
70
- "checklist-admin-media-watermark-watermark-position-presets": {
71
- roles: ["admin", "guest"],
72
- startPage: "/admin/site",
73
- steps: [
74
- "Sign in as admin@letitrip.in / TempPass123!.",
75
- "Open /admin/site → 'Watermark' and read every option in the 'Position' select, writing down which is currently set.",
76
- "Select each preset in turn — the four corners and center — saving after each. Leave 'custom' to the offset case.",
77
- "After each save, sign out and open /products/product-beyblade-burst-valkyrie's main image, noting where the mark sits.",
78
- "Repeat one corner preset against a portrait image and a landscape one.",
79
- "Restore the preset written down in step 2.",
80
- ],
81
- inputs: { product: "product-beyblade-burst-valkyrie" },
82
- expectedBehaviour: "Every preset places the mark somewhere different and every one keeps it inside the frame. A corner preset that pushes part of the mark off the edge is the likely failure, since the offset is computed from the image's dimensions and a portrait image behaves differently from a landscape one.",
83
- expectedUiState: "Each preset moves the mark to its named position and the whole mark remains visible within the image at all of them. Test at least one portrait and one landscape image — a preset correct on one aspect and clipped on the other is the finding.",
84
- endResult: "The original preset is restored.",
85
- },
86
- "checklist-admin-media-watermark-watermark-custom-offset": {
87
- roles: ["admin", "guest"],
88
- startPage: "/admin/site",
89
- steps: [
90
- "Sign in as admin@letitrip.in / TempPass123!.",
91
- "Open /admin/site → 'Watermark' and write down the current Position and any offsets.",
92
- "Turn on 'Use a custom X/Y offset instead' and read the two inputs it reveals — 'X offset (%) — + right / − left of center' and 'Y offset (%) — + down / − up from center'.",
93
- "Set X to 10 and Y to 10, save, sign out, and read /products/product-beyblade-burst-valkyrie's main image.",
94
- "Sign back in, set X to 100 and Y to 100 — far enough to push the mark past the edge — save, sign out, and read the image again.",
95
- "Read whether the mark is clipped, gone entirely, or clamped so it stays fully inside the frame.",
96
- "Sign back in and restore the Position and offsets written down in step 2.",
97
- ],
98
- inputs: {
99
- product: "product-beyblade-burst-valkyrie",
100
- modestOffset: 10,
101
- extremeOffset: 100,
102
- },
103
- expectedBehaviour: "A custom offset moves the mark, and an offset that would push it out of frame is clamped rather than obeyed. Obeying it produces images with no visible watermark at all — which is indistinguishable from the proxy being bypassed and would mask a much larger problem.",
104
- expectedUiState: "The modest offset moves the mark by the amount set. The extreme offset leaves the mark still visible, clamped flush to the frame, rather than pushing it off the image. A silently unwatermarked image is the failure. This is expected to PASS — the offset is clamped twice, once when the setting is read and again when the overlay is placed — so a clipped mark here would mean one of those clamps stopped running.",
105
- endResult: "The original offset is restored.",
106
- },
107
- "checklist-admin-media-watermark-watermark-theme-recolor": {
108
- roles: ["admin", "guest"],
109
- startPage: "/admin/site",
110
- steps: [
111
- "Sign in as admin@letitrip.in / TempPass123!.",
112
- "Open /admin/site → 'Watermark' and confirm 'Watermark type' has no uploaded 'Watermark image' override — with none set the mark falls through to the bundled brand glyph, which is the only tier the theme can recolour.",
113
- "Sign out, open /products/product-beyblade-burst-valkyrie's main image, and note the mark's colour.",
114
- "Sign back in, open the 'Themes' tab, and write down which theme is set as the DEFAULT LIGHT theme.",
115
- "Change the default LIGHT theme to one with different brand colours and save. Changing the dark default will not move the mark — the resolver reads the light one only.",
116
- "Sign out, hard-reload the product image, and compare the mark's colour.",
117
- "Compare a dark product photo and a light one and check the mark is legible on both.",
118
- "Sign back in and restore the default light theme written down in step 4.",
119
- ],
120
- inputs: { product: "product-beyblade-burst-valkyrie", themeSetting: "defaultLightThemeId" },
121
- expectedBehaviour: "With no image override the mark falls through to the bundled brand glyph, whose gradient stops come from theme colour tokens — so changing the theme recolours it without a second asset. It must stay legible over both dark and light photographs, which is the part a colour change can quietly break.",
122
- expectedUiState: "The mark's colour follows the DEFAULT LIGHT theme's logo gradient. It remains legible on both a dark and a light product photo after the change. A mark that vanishes into one of the two is the finding. A mark that does not change at all is only a finding if the default LIGHT theme was the one changed — say which you changed.",
123
- endResult: "The original theme is restored.",
124
- },
125
- "checklist-admin-media-watermark-watermark-video-overlay-parity": {
126
- roles: ["admin", "guest"],
127
- startPage: "/admin/site",
128
- steps: [
129
- "Sign in as admin@letitrip.in / TempPass123!.",
130
- "Open /admin/site → 'Watermark' and write down the size, opacity and position.",
131
- "Sign out and open /products/product-beyblade-burst-spryzen-video-demo.",
132
- "Look at the video's POSTER frame in the gallery strip and note whether it carries the mark.",
133
- "Click it to open the lightbox, play the video, and look for the mark while it is playing.",
134
- "Compare that against a still image on the same page.",
135
- "Now open / and find the 'Live auctions' hero slide, whose background is a video, and look for the mark on it while it plays.",
136
- "Sign back in, change the watermark position, save, sign out, and check which of the three — the poster, the product video, the hero video — followed.",
137
- "Restore the position.",
138
- ],
139
- inputs: {
140
- product: "product-beyblade-burst-spryzen-video-demo",
141
- heroSlide: "Live auctions",
142
- },
143
- expectedBehaviour: "A still goes through the proxy and is composited server-side. A video cannot be, within the platform's compute budget, so its mark has to be a client overlay reading the same settings — two consumers, one configuration. The case is whether every surface that plays a video has that second consumer.",
144
- expectedUiState: "The poster frame carries the mark, and follows a position change.\n\n🛑 EXPECT THE PRODUCT VIDEO TO CARRY NO MARK, AND RECORD IT AS A FAILURE. The overlay lives in `<MediaVideo>`, which is mounted only by the homepage hero carousel and the two admin upload previews; a product video plays in the lightbox, which renders a bare `<video controls>` with no overlay layer. So expect: poster marked, product video unmarked, hero video marked. Report which of the three followed the position change — that comparison is the finding, and a bare 'the video has no watermark' does not distinguish a missing overlay from a broken one.",
145
- expectedData: { posterMarked: true, productVideoMarked: false, heroVideoMarked: true },
146
- endResult: "The position is restored. Parity between the paths is the case — a mark on the poster alone proves nothing about the frames a buyer actually watches.",
147
- },
148
- };
@@ -1,2 +0,0 @@
1
- import type { AuthoredCase } from "./_types";
2
- export declare const authored: Record<string, AuthoredCase>;