@mohasinac/appkit 4.34.1 → 4.35.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 (232) hide show
  1. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
  2. package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
  3. package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
  4. package/dist/features/tester/components/TesterHubView.js +8 -0
  5. package/dist/features/tester/schemas/firestore.d.ts +109 -0
  6. package/dist/features/tester/schemas/firestore.js +14 -0
  7. package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
  8. package/dist/features/tester/seed-data/_money-flows.js +430 -0
  9. package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
  10. package/dist/features/tester/seed-data/authored/_types.js +35 -0
  11. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
  12. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
  13. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
  14. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
  15. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
  16. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
  17. package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
  18. package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
  19. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
  20. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
  21. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
  22. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
  23. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
  24. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
  25. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
  26. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
  27. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
  28. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
  29. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
  30. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
  31. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
  32. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
  33. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
  34. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
  35. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
  36. package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
  37. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
  38. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
  39. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
  40. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
  41. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
  42. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
  43. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
  44. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
  45. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
  46. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
  47. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
  48. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
  49. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
  50. package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
  51. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
  52. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
  53. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
  54. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
  55. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
  56. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
  57. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
  58. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
  59. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
  60. package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
  61. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
  62. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
  63. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
  64. package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
  65. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
  66. package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
  67. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
  68. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
  69. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
  70. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
  71. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
  72. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
  73. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
  74. package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
  75. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
  76. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
  77. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
  78. package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
  79. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
  80. package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
  81. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
  82. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
  83. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
  84. package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
  85. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
  86. package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
  87. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
  88. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
  89. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
  90. package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
  91. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
  92. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
  93. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
  94. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
  95. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
  96. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
  97. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
  98. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
  99. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
  100. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
  101. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
  102. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
  103. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
  104. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
  105. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
  106. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
  107. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
  108. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
  109. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
  110. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
  111. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
  112. package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
  113. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
  114. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
  115. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
  116. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
  117. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
  118. package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
  119. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
  120. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
  121. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
  122. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
  123. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
  124. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
  125. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
  126. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
  127. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
  128. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
  129. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
  130. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
  131. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
  132. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
  133. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
  134. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
  135. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
  136. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
  137. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
  138. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
  139. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
  140. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
  141. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
  142. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
  143. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
  144. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
  145. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
  146. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
  147. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
  148. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
  149. package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
  150. package/dist/features/tester/seed-data/authored/index.js +237 -0
  151. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
  152. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
  153. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
  154. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
  155. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
  156. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
  157. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
  158. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
  159. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
  160. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
  161. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
  162. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
  163. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
  164. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
  165. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
  166. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
  167. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
  168. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
  169. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
  170. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
  171. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
  172. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
  173. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
  174. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
  175. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
  176. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
  177. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
  178. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
  179. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
  180. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
  181. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
  182. package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
  183. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
  184. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
  185. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
  186. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
  187. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
  188. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
  189. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
  190. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
  191. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
  192. package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
  193. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
  194. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
  195. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
  196. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
  197. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
  198. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
  199. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
  200. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
  201. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
  202. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
  203. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
  204. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
  205. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
  206. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
  207. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
  208. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
  209. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
  210. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
  211. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
  212. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
  213. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
  214. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
  215. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
  216. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
  217. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
  218. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
  219. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
  220. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
  221. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
  222. package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
  223. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
  224. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
  225. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
  226. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
  227. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
  228. package/dist/seed/carousel-slides-seed-data.js +1 -1
  229. package/dist/seed/products-standard-seed-data.js +2 -2
  230. package/dist/seed/reviews-seed-data.js +6 -1
  231. package/package.json +1 -1
  232. package/scripts/seed-cli.mjs +6 -0
@@ -0,0 +1,263 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the public-pages/core-listing-pages page.
3
+ * WHAT: 16 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
+ * These are the pages a crawler and a first-time visitor hit, so several cases
10
+ * end by reading the page SOURCE rather than the rendered view — a canonical tag,
11
+ * an embedded data payload and a leaked field are all invisible on screen.
12
+ *
13
+ * @tag domain:tester
14
+ * @tag layer:seed
15
+ * @tag pattern:none
16
+ * @tag access:server-only
17
+ * @tag consumers:seed-data/authored/index.ts
18
+ * @tag sideEffects:none
19
+ */
20
+ export const authored = {
21
+ "checklist-public-pages-core-listing-pages-homepage-loads": {
22
+ roles: ["guest"],
23
+ startPage: "/",
24
+ steps: [
25
+ "Open / in a private window at a desktop width of 1280 pixels.",
26
+ "Scroll to the bottom, reading every section heading and checking each has content beneath it.",
27
+ "Write down any heading whose section is empty.",
28
+ "Resize the window to 390 pixels wide and reload /.",
29
+ "Scroll to the bottom again, reading the same sections.",
30
+ "Try to scroll the page sideways.",
31
+ ],
32
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
33
+ expectedBehaviour: "The homepage composes around 26 independently-fetched sections, each wrapped in its own boundary. A section that throws renders as nothing and is reported server-side rather than replacing the whole page — so the page surviving is not by itself proof that every section worked.",
34
+ expectedUiState: "At both widths the page renders end to end with no 'Something went wrong'. Every heading has content under it — a heading followed by an empty rail means that section's data fetch returned nothing, which is a different failure from the section being absent. Nothing scrolls sideways at 390px.",
35
+ expectedData: { emptySectionCount: 0 },
36
+ endResult: "Read-only; nothing persists. Note each empty section by name in the comment — 'the homepage loads' is true even when four sections are silently blank.",
37
+ },
38
+ "checklist-public-pages-core-listing-pages-whatsapp-community-link-real": {
39
+ roles: ["guest"],
40
+ startPage: "/",
41
+ steps: [
42
+ "Open / on a device or emulator with WhatsApp installed.",
43
+ "Find the 'Join the Community' button and read the URL it points at.",
44
+ "Tap it and read what WhatsApp shows.",
45
+ "Open /contact and find its WhatsApp link.",
46
+ "Read that URL and compare it with the first.",
47
+ ],
48
+ expectedBehaviour: "The invite code resolves to a real group. A placeholder that is not a valid invite code still produces a link-shaped URL and a button that responds — WhatsApp simply reports that the group cannot be found, which reads as WhatsApp's problem rather than the site's.",
49
+ expectedUiState: "WhatsApp offers to join an actual named group rather than showing 'invalid link' or 'group not found'. The Contact page's link carries the same invite code as the homepage button — two different codes means one of them is stale.",
50
+ endResult: "Do not actually join the group. Read-only; nothing persists.",
51
+ },
52
+ "checklist-public-pages-core-listing-pages-about-us-in-main-nav": {
53
+ roles: ["guest"],
54
+ startPage: "/",
55
+ steps: [
56
+ "Open / in a private window at a desktop width.",
57
+ "Read every item in the main top navigation.",
58
+ "Click 'About Us' in that navigation and read where it lands.",
59
+ "Resize to 390 pixels wide, open the mobile navigation, and read its items.",
60
+ ],
61
+ expectedBehaviour: "About Us is a top-level navigation item, not footer-only. A page reachable only from the footer is a page most visitors never find.",
62
+ expectedUiState: "'About Us' appears in the main top navigation and lands on /about with content. It is present in the mobile navigation too — a desktop-only nav item is missing for most of the traffic.",
63
+ expectedData: { aboutHref: "/about" },
64
+ endResult: "Read-only; nothing persists.",
65
+ },
66
+ "checklist-public-pages-core-listing-pages-about-team-real-founder": {
67
+ roles: ["guest"],
68
+ startPage: "/about",
69
+ steps: [
70
+ "Open /about in a private window with no session.",
71
+ "Scroll to the \"Who's Behind LetItRip\" section.",
72
+ "Read the founder card's name and role.",
73
+ "Click the 'GitHub ↗' link on that card.",
74
+ "Read the profile it opens.",
75
+ ],
76
+ expectedBehaviour: "The team section is admin-editable content, and the founder card holds a real person with a working profile link. A fictional placeholder name renders identically to a real one, so only reading it catches this.",
77
+ expectedUiState: "The founder card shows a real name — not a seeded persona like 'Mock User' or a franchise character — and its 'GitHub ↗' link opens that person's actual GitHub profile rather than a 404 or the GitHub homepage.",
78
+ endResult: "Read-only; nothing persists.",
79
+ },
80
+ "checklist-public-pages-core-listing-pages-about-values-expanded": {
81
+ roles: ["guest"],
82
+ startPage: "/about",
83
+ steps: [
84
+ "Open /about in a private window with no session.",
85
+ "Scroll to the 'Our Values' section.",
86
+ "Count the values listed.",
87
+ "Read each one for a second, smaller paragraph beneath its heading.",
88
+ "Find the 'How we hold ourselves to this →' link and click it.",
89
+ "Read the address bar.",
90
+ ],
91
+ inputs: { expectedValueCount: 6 },
92
+ expectedBehaviour: "The section carries six values, each with a subtitle paragraph, and links onward to the Ethics page — where the commitments are actually detailed. Values with no onward link are a statement with nothing behind it.",
93
+ expectedUiState: "Six values are shown, not three. Each has a second smaller paragraph under its heading rather than a heading alone. The link is present and lands on /ethics.",
94
+ expectedData: { valueCount: 6, ethicsHref: "/ethics" },
95
+ endResult: "Read-only; nothing persists.",
96
+ },
97
+ "checklist-public-pages-core-listing-pages-developer-page-loads": {
98
+ roles: ["guest"],
99
+ startPage: "/developer",
100
+ steps: [
101
+ "Open / in a private window and scroll to the footer's Support column.",
102
+ "Find the Developer link, positioned next to About Us.",
103
+ "Click it and read the address bar.",
104
+ "Read the developer's name on the page.",
105
+ "Click the 'GitHub ↗' link and read the profile it opens.",
106
+ ],
107
+ expectedBehaviour: "The page exists, is reachable from the footer beside About Us, and names a real person with a working profile link — the same three requirements as the founder card, on a page of its own.",
108
+ expectedUiState: "The footer's Support column holds a Developer link next to About Us. It lands on /developer with real content. The name is a real developer's, and 'GitHub ↗' opens their actual profile.",
109
+ expectedData: { developerHref: "/developer" },
110
+ endResult: "Read-only; nothing persists.",
111
+ },
112
+ "checklist-public-pages-core-listing-pages-products-listing-page": {
113
+ roles: ["guest"],
114
+ startPage: "/products",
115
+ steps: [
116
+ "Open /products in a private window with no session.",
117
+ "Read the total result count and the availability tab bar.",
118
+ "Read every listing-type chip offered above the grid.",
119
+ "Read every card title on the first page, looking for anything containing 'Tester' or 'Test'.",
120
+ "Tick the Auctions chip and read the result count and the sort dropdown.",
121
+ "Tick Pre-Orders as well and read the sort dropdown again.",
122
+ ],
123
+ expectedBehaviour: "/products spans every listing type, so its type chips are a multi-select covering all nine — auctions, pre-orders, prize draws, art and stickers were unreachable from the main catalogue while only four chips were offered. The sort dropdown narrows to the options valid for every selected type, because a sort valid for one type alone would either no-op or fail the query for the others.",
124
+ expectedUiState: "Nine type chips are offered, ticking more than one is possible, and the Available / Sold & Ended / All tabs are present with Available selected. No card title contains 'Tester' or 'Test' for a signed-out visitor. With Auctions and Pre-Orders both ticked the sort dropdown offers only sorts that apply to both.",
125
+ expectedData: { listingTypeChipCount: 9 },
126
+ endResult: "Read-only; nothing persists. Four chips instead of nine is the specific regression this case exists for.",
127
+ },
128
+ "checklist-public-pages-core-listing-pages-auctions-listing-page": {
129
+ roles: ["guest"],
130
+ startPage: "/auctions",
131
+ steps: [
132
+ "Open /auctions in a private window with no session.",
133
+ "Read the availability tab bar and note which tab is selected and what the middle one is called.",
134
+ "Read every card and check whether any shows an ended countdown.",
135
+ "Read the sort dropdown's default selection.",
136
+ "Click the middle availability tab and read the cards.",
137
+ ],
138
+ expectedBehaviour: "The default view shows auctions that are still live, and the middle tab is labelled for auctions specifically. An auction's end date is an inequality, which is why it is the one availability clause that carries its own sort field — pairing an inequality with an unrelated sort demands a composite index nobody declares, and the query then fails silently into an empty page.",
139
+ expectedUiState: "The tabs read Available / Ended / All, not 'Sold & Ended' — the label is derived per type. Available is selected and no card on it shows an ended countdown. The Ended tab shows the closed auctions, including the reserve-not-met one.",
140
+ expectedData: { middleTabLabel: "Ended" },
141
+ endResult: "Read-only; nothing persists. An empty Available tab with rows under All means the date filter failed rather than that nothing is live.",
142
+ },
143
+ "checklist-public-pages-core-listing-pages-preorders-listing-page": {
144
+ roles: ["guest"],
145
+ startPage: "/pre-orders",
146
+ steps: [
147
+ "Open /pre-orders in a private window with no session.",
148
+ "Read the sort dropdown's default selection.",
149
+ "Read the delivery dates on the cards from the top down.",
150
+ "Read the availability tabs and note the middle tab's label.",
151
+ "Click the middle tab and read the cards.",
152
+ ],
153
+ expectedBehaviour: "Pre-orders open sorted by earliest delivery first, which is the ordering a buyer waiting on stock cares about. Store tabs for the same type once carried a drifted local copy of this sort array and opened newest-first instead, for the same data.",
154
+ expectedUiState: "The sort dropdown shows earliest-delivery-first as the selection, and the dates on the cards ascend down the page. The middle availability tab reads 'Sold' rather than 'Ended'. The sold-out fixture appears under it, not under Available.",
155
+ endResult: "Read-only; nothing persists.",
156
+ },
157
+ "checklist-public-pages-core-listing-pages-bundles-listing-page": {
158
+ roles: ["guest"],
159
+ startPage: "/bundles",
160
+ steps: [
161
+ "Open /bundles in a private window with no session.",
162
+ "Read each bundle card's price and its discount badge.",
163
+ "Open bundle-tester-sandbox and read its price and its members.",
164
+ "Add up the members' individual prices and compare with the bundle price.",
165
+ "Read the page for anything containing 'Tester' or 'Test' while signed out.",
166
+ ],
167
+ inputs: { bundlePrice: 199, memberTotal: 348 },
168
+ expectedBehaviour: "A bundle is a category row with a locked price, deliberately below the sum of its members, and the discount badge is computed from the two. Its members are mirrored onto the bundle for index-friendly reads, and a reader that trusts only the mirror shows an empty bundle whenever a write path forgot to update it.",
169
+ expectedUiState: "Each card shows a price and a discount percentage. The sandbox bundle shows ₹199 against a members' total of ₹348. Its detail page lists both members with titles and images rather than reading '0 items'. No sandbox bundle is visible to a signed-out visitor.",
170
+ expectedData: { sandboxBundleVisibleToGuest: false },
171
+ endResult: "Read-only; nothing persists. A bundle rendering as empty is the mirror-drift failure, not a missing bundle.",
172
+ },
173
+ "checklist-public-pages-core-listing-pages-categories-index": {
174
+ roles: ["guest"],
175
+ startPage: "/categories",
176
+ steps: [
177
+ "Open /categories in a private window with no session.",
178
+ "Read every category card — its name, image and item count.",
179
+ "Note whether both root categories are present.",
180
+ "Click into one root category and read its page.",
181
+ "Go back and click a tier-3 category and read its page.",
182
+ ],
183
+ expectedBehaviour: "The index renders the category forest — two roots across four tiers — and every card links to a page that resolves. Products carry their full ancestor chain, so a category page matches on its own id alone and needs no descendant expansion.",
184
+ expectedUiState: "Both roots, Spinning Tops and Living Collectibles, are present. Every card shows a name and a count rather than a bare name. Both the root and the tier-3 page render with products rather than an empty grid.",
185
+ expectedData: { rootCategoryCount: 2 },
186
+ endResult: "Read-only; nothing persists. A root category page rendering blank with no error is the specific failure worth watching for — the query that produces it is wrapped in a catch that returns nothing.",
187
+ },
188
+ "checklist-public-pages-core-listing-pages-brands-index-detail": {
189
+ roles: ["guest"],
190
+ startPage: "/brands",
191
+ steps: [
192
+ "Open /brands in a private window with no session and read every brand card.",
193
+ "Open /brands/brand-beyblade.",
194
+ "Read the hero banner, the brand name and the 'About this brand' panel.",
195
+ "Read the panel for a website, a country and a founding year.",
196
+ "Read the product grid beneath and check the products belong to that brand.",
197
+ ],
198
+ inputs: { brandId: "brand-beyblade" },
199
+ expectedBehaviour: "Brands are category rows discriminated by type, not a separate collection. A brand page matches its products by DISPLAY NAME rather than by slug, so the brand's name and the brand string on every product must agree exactly — renaming a brand silently orphans its whole catalogue.",
200
+ expectedUiState: "The hero banner renders — it is driven by the cover image, which the admin editor labels 'Cover Image'. The 'About this brand' panel shows website, country and founding year rather than being absent. The grid holds Beyblade products rather than being empty.",
201
+ endResult: "Read-only; nothing persists. An empty grid on a brand with seeded products means the name and the product brand strings have drifted apart.",
202
+ },
203
+ "checklist-public-pages-core-listing-pages-category-item-counts-accurate": {
204
+ roles: ["guest"],
205
+ startPage: "/categories",
206
+ steps: [
207
+ "Open /categories in a private window with no session.",
208
+ "Write down the item count shown on three different category cards.",
209
+ "Open the first of those categories and count the products actually listed, paging to the end.",
210
+ "Repeat for the second and third.",
211
+ "Note any card whose count is zero.",
212
+ ],
213
+ expectedBehaviour: "A card's count is what the category page actually contains. A count that fails to compute must read as unknown, never as zero — a count map that returns undefined for an option is treated as 'unknown' and shown, while a zero hides the tab or card entirely, so a transient error would hide a category holding real stock.",
214
+ expectedUiState: "All three counts match the number of products on their pages. No card shows zero while its page holds products. A card showing a count and an empty page is the inverse failure and equally wrong.",
215
+ expectedData: { mismatchCount: 0 },
216
+ endResult: "Read-only; nothing persists.",
217
+ },
218
+ "checklist-public-pages-core-listing-pages-parent-category-includes-children": {
219
+ roles: ["guest"],
220
+ startPage: "/categories/category-beyblade-burst",
221
+ steps: [
222
+ "Open /categories/category-beyblade-burst in a private window and read its product count.",
223
+ "Write down the titles on the first page.",
224
+ "Open a child category of Burst — category-burst-tops — and write down its titles.",
225
+ "Go back to the parent and check whether the child's titles appear there too.",
226
+ "Open the root, /categories/category-spinning-tops, and read its count and titles.",
227
+ ],
228
+ inputs: { parentCategory: "category-beyblade-burst", childCategory: "category-burst-tops" },
229
+ expectedBehaviour: "Every product carries its full ancestor chain, so a parent page matches on its own id and picks up everything filed beneath it. This is why descendant expansion must NOT be reintroduced: the expansion list for a root exceeds the 30-value cap on the query it feeds, the query throws, and the caller's catch turns that into a blank page with no error anywhere.",
230
+ expectedUiState: "The parent page includes the child category's products, and its count reflects them. The root page includes products from every tier below it and is not empty.",
231
+ expectedData: { rootPageEmpty: false },
232
+ endResult: "Read-only; nothing persists. A blank root category page with populated children is exactly the cap-exceeded failure.",
233
+ },
234
+ "checklist-public-pages-core-listing-pages-category-brand-related-sections": {
235
+ roles: ["guest"],
236
+ startPage: "/categories/category-beyblade-burst",
237
+ steps: [
238
+ "Open /categories/category-beyblade-burst in a private window with no session.",
239
+ "Scroll to the 'Related Categories' section and read the cards.",
240
+ "Check whether Beyblade Burst itself is among them.",
241
+ "Open /brands/brand-beyblade and scroll to 'Related Brands'.",
242
+ "Read those cards and check whether Beyblade itself is among them.",
243
+ ],
244
+ expectedBehaviour: "Each page offers siblings sharing its root, with the current page filtered out. A self-link reads as a working suggestion and goes nowhere new, which is the same defect the policy pages' related-links list has.",
245
+ expectedUiState: "'Related Categories' lists other categories under the same root and does not include Beyblade Burst. 'Related Brands' lists other brands and does not include Beyblade. Each card carries a name and an image rather than an empty tile.",
246
+ expectedData: { selfLinkCount: 0 },
247
+ endResult: "Read-only; nothing persists.",
248
+ },
249
+ "checklist-public-pages-core-listing-pages-category-brand-highlights-faq-grouped-listings": {
250
+ roles: ["guest"],
251
+ startPage: "/categories/category-beyblade-burst",
252
+ steps: [
253
+ "Open /categories/category-beyblade-burst in a private window with no session.",
254
+ "Read the area immediately below the hero for a highlights list and an FAQ accordion.",
255
+ "Expand one FAQ entry and read its answer.",
256
+ "Scroll further and look for a grouped-listings carousel.",
257
+ "Open /brands/brand-beyblade and read the same three areas, plus the 'About this brand' panel.",
258
+ ],
259
+ expectedBehaviour: "Highlights and FAQs are editorial fields on the category row, rendered by one shared section on both category and brand pages. The section renders nothing at all when both arrays are empty, which is why a row with no editorial content shows no empty heading. The grouped-listings carousel is fed by its own collection scoped to the category or brand.",
260
+ expectedUiState: "Highlights appear as short bullets and the FAQ accordion expands to real answers. The grouped-listings carousel shows cards with titles and images. The brand page shows all of that plus website, country and founding year. An empty heading with nothing under it is a fail; the section absent entirely is correct when there is no content.",
261
+ endResult: "Read-only; nothing persists.",
262
+ },
263
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,102 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the public-pages/help-how-it-works page.
3
+ * WHAT: 4 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
+ * "Loads correctly" is one honest step and one honest observation — but a page
10
+ * that returns 200 while rendering an empty shell is the failure mode this
11
+ * codebase actually has, so each case names something that must be ON the page
12
+ * rather than asking whether it loaded.
13
+ *
14
+ * @tag domain:tester
15
+ * @tag layer:seed
16
+ * @tag pattern:none
17
+ * @tag access:server-only
18
+ * @tag consumers:seed-data/authored/index.ts
19
+ * @tag sideEffects:none
20
+ */
21
+ export const authored = {
22
+ "checklist-public-pages-help-how-it-works-contact-page": {
23
+ roles: ["guest"],
24
+ startPage: "/contact",
25
+ steps: [
26
+ "Open /contact in a private window with no session.",
27
+ "Read the page for a form, contact details and any social or WhatsApp links.",
28
+ "Click Send with every field empty.",
29
+ "Read where the errors appear.",
30
+ "Type 'QA Contact contact-page' as the name, 'qa-contact@mailnull.com' as the email, 'Checklist submission' as the subject and 'Submitted by the tester checklist.' as the message.",
31
+ "Click Send.",
32
+ ],
33
+ inputs: {
34
+ name: "QA Contact contact-page",
35
+ email: "qa-contact@mailnull.com",
36
+ subject: "Checklist submission",
37
+ message: "Submitted by the tester checklist.",
38
+ },
39
+ expectedBehaviour: "The form validates in the browser against its schema and reports each problem on the field that caused it, then submits and is delivered. A contact form that 200s and delivers nothing is indistinguishable from a working one on screen, which is why the empty submit is checked first.",
40
+ expectedUiState: "The empty submit puts inline errors under the specific fields — not one banner and not a browser-native tooltip. The filled submit produces a visible confirmation, and the form clears or becomes read-only rather than sitting there inviting a second send.",
41
+ endResult: "A confirmation is shown. If a mailbox for the site's contact address is reachable, the message should arrive there; if it is not reachable, note that in the comment rather than assuming delivery.",
42
+ },
43
+ "checklist-public-pages-help-how-it-works-help-page": {
44
+ roles: ["guest"],
45
+ startPage: "/help",
46
+ steps: [
47
+ "Open /help in a private window with no session.",
48
+ "Read the page headings and the body content.",
49
+ "Click each link on the page in turn and read where it lands, going back each time.",
50
+ ],
51
+ expectedBehaviour: "The help page renders real content and every link on it resolves. It is one of the destinations the footer and sidebar support links point at, so a broken link here is reached from every page on the site.",
52
+ expectedUiState: "Headings and body text are present — not a bare chrome-and-spinner shell and not an empty container. Every link lands on a real page rather than a 404 or a silent redirect back to /.",
53
+ endResult: "Read-only; nothing persists.",
54
+ },
55
+ "checklist-public-pages-help-how-it-works-how-it-works-pages": {
56
+ roles: ["guest"],
57
+ startPage: "/help",
58
+ steps: [
59
+ "Open /how-it-works/auctions in a private window and read its content.",
60
+ "Open /how-it-works/checkout and read its content.",
61
+ "Open /how-it-works/offers and read its content.",
62
+ "Open /how-it-works/orders and read its content.",
63
+ "Open /how-it-works/payouts and read its content.",
64
+ "Open /how-it-works/pre-orders and read its content.",
65
+ "Open /how-it-works/reviews and read its content.",
66
+ "Write down any of the seven that renders empty, 404s, or repeats another page's copy.",
67
+ ],
68
+ expectedBehaviour: "All seven guides render their own distinct copy. Sharing one renderer is correct; sharing one body of text is not — two guides with identical content means the page key is not reaching the content lookup.",
69
+ expectedUiState: "Each of the seven shows a heading and body specific to its topic. None is blank, none 404s, and no two are word-for-word the same.",
70
+ expectedData: { guidePageCount: 7 },
71
+ endResult: "Read-only; nothing persists. Name every failing page in the comment, not just the first.",
72
+ },
73
+ "checklist-public-pages-help-how-it-works-fees-page": {
74
+ roles: ["guest"],
75
+ startPage: "/fees",
76
+ steps: [
77
+ "Open /fees in a private window with no session.",
78
+ "Read every fee and percentage stated on the page.",
79
+ "Look specifically for a payout hold period, a minimum payout amount, a gateway fee percentage and any seller commission split.",
80
+ ],
81
+ expectedBehaviour: "The page explains what a BUYER pays. Seller-side and platform-internal figures — payout hold days, minimum payout, gateway fee, the seller share of an EMI surcharge — are not buyer-facing and have no reason to be on a public page. Those fields were being published by an unauthenticated settings endpoint for a long time, so this page is worth reading with that specifically in mind.",
82
+ expectedUiState: "Buyer-facing fees are stated: platform fee and its cap, COD handling, the add-on fees, GST. No payout hold period, minimum payout amount, gateway fee percentage or seller surcharge share appears anywhere on the page or in its source.",
83
+ expectedData: { sellerInternalFiguresShown: 0 },
84
+ endResult: "Read-only; nothing persists. Any seller-side figure found here is a projection leak, not a copy problem.",
85
+ },
86
+ "checklist-public-pages-help-how-it-works-how-emi-works-page": {
87
+ roles: ["guest"],
88
+ startPage: "/how-emi-works",
89
+ steps: [
90
+ "Open /how-emi-works signed out and read the whole page.",
91
+ "Write down the eligibility threshold it states and the worked example it gives.",
92
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and put live-golden-retriever-puppy in the cart.",
93
+ "Reach the payment step and read the instalment figures offered.",
94
+ "Compare them against the page's worked example.",
95
+ "Empty the cart, add product-beyblade-burst-valkyrie instead, and check EMI is NOT offered below the threshold.",
96
+ ],
97
+ inputs: { eligibleProduct: "live-golden-retriever-puppy", ineligibleProduct: "product-beyblade-burst-valkyrie" },
98
+ expectedBehaviour: "The page's threshold and worked example match what checkout does. This is the eighth how-it-works page and the only one describing money, so a stale figure here is a misstated charge rather than stale prose — and the aggregate case covering the family enumerates seven, which is why it needed its own.",
99
+ expectedUiState: "The stated threshold matches the price at which checkout starts offering EMI, and the worked example's instalment figures match the real ones. Either mismatch is a finding, with both numbers.",
100
+ endResult: "Empty the cart; place no order.",
101
+ },
102
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,234 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the public-pages/help-scams-guides-subpages page.
3
+ * WHAT: 14 case(s), keyed by full checklist id.
4
+ *
5
+ * Eleven public routes the second sweep found with no case naming them anywhere.
6
+ * They were missed the first time because the first sweep only walked the
7
+ * dashboard trees — which is the reason to record the method here: the gap was in
8
+ * the MEASUREMENT, not in the writing, and a narrower sweep than the rule it feeds
9
+ * reports a smaller backlog than exists.
10
+ *
11
+ * 🛑 `/seller-guide` AND `/store/guide` ARE DIFFERENT ROUTE FAMILIES. The first is
12
+ * public marketing a prospective seller reads before signing up; the second is the
13
+ * signed-in seller's manual. An existing case covering the dashboard guides looked
14
+ * like coverage of both and is coverage of neither.
15
+ *
16
+ * @tag domain:tester
17
+ * @tag layer:seed
18
+ * @tag pattern:none
19
+ * @tag access:server-only
20
+ * @tag consumers:seed-data/authored/index.ts
21
+ * @tag sideEffects:none
22
+ */
23
+ export const authored = {
24
+ "checklist-public-pages-help-scams-guides-subpages-help-subpages-load": {
25
+ roles: ["guest"],
26
+ startPage: "/help",
27
+ steps: [
28
+ "Open /help signed out.",
29
+ "Open /help/account, /help/auctions, /help/orders and /help/shopping in turn.",
30
+ "Read each one's status in the network panel and the content it renders.",
31
+ "Record any that 404s or renders an empty shell.",
32
+ "Return to /help and check each of the four is linked from it.",
33
+ ],
34
+ expectedBehaviour: "All four load with real content and are reachable from the parent. A sub-page that exists but is linked from nowhere is unreachable to anyone who did not type the URL — which is every visitor.",
35
+ expectedUiState: "Four pages returning 200 with readable content, all four linked from /help. A 404, an empty shell, or a page with no inbound link is a finding, named.",
36
+ expectedData: { helpSubpagesNotFound: 0 },
37
+ endResult: "Read-only.",
38
+ },
39
+ "checklist-public-pages-help-scams-guides-subpages-help-subpages-linked-both-ways": {
40
+ roles: ["guest"],
41
+ startPage: "/help",
42
+ steps: [
43
+ "Open /help and note every link into a help sub-page.",
44
+ "Follow one and look for a way back to /help from it.",
45
+ "Use it and check the browser lands on /help.",
46
+ "Repeat on the other three sub-pages.",
47
+ "Check the site's own navigation or footer also offers a route into help.",
48
+ ],
49
+ expectedBehaviour: "Help navigates in both directions. A visitor who arrives on a sub-page from a search result has no context and no route onward unless the page carries one — and help is precisely where somebody arrives already stuck.",
50
+ expectedUiState: "Every sub-page offers a working route back to /help, and /help links forward to all four. A dead-end sub-page is the finding.",
51
+ endResult: "Read-only.",
52
+ },
53
+ "checklist-public-pages-help-scams-guides-subpages-help-subpage-content-matches-title": {
54
+ roles: ["guest"],
55
+ startPage: "/help",
56
+ steps: [
57
+ "Open /help/auctions and read its content.",
58
+ "Open /help/orders and read its content.",
59
+ "Compare the two.",
60
+ "Open /help/account and /help/shopping and read those.",
61
+ "Check none of the four repeats the parent page's text verbatim.",
62
+ "Check each answers questions about its own topic.",
63
+ ],
64
+ expectedBehaviour: "Each sub-page is about its own subject. Four routes rendering one shared body is a page family that was scaffolded and never filled — it loads, it links, and it answers nothing.",
65
+ expectedUiState: "Four distinct bodies, each on its own topic. Two or more sharing text is the finding, named by which pages.",
66
+ endResult: "Read-only.",
67
+ },
68
+ "checklist-public-pages-help-scams-guides-subpages-scams-types-page-loads": {
69
+ roles: ["guest"],
70
+ startPage: "/scams/types",
71
+ steps: [
72
+ "Open /scams/types and list every scam category it names.",
73
+ "Count them.",
74
+ "Open /scams/report and read the categories its own type field offers.",
75
+ "Compare the two lists.",
76
+ "Record any category on one and not the other.",
77
+ ],
78
+ expectedBehaviour: "The types page and the report form name the same categories. A page listing fewer teaches a reporter a vocabulary the form will not accept; a form offering more means categories nobody has explained. Either way the reporter picks the wrong one, and the registry's own filters then never surface their report.",
79
+ expectedUiState: "The two lists match. Any category present on one side only is the finding, named with which side it was missing from.",
80
+ expectedData: { categoriesOnlyOnOneSide: 0 },
81
+ endResult: "Read-only.",
82
+ },
83
+ "checklist-public-pages-help-scams-guides-subpages-scams-faqs-page-loads": {
84
+ roles: ["guest"],
85
+ startPage: "/scams/faqs",
86
+ steps: [
87
+ "Open /scams/faqs and count the questions listed.",
88
+ "Expand three of them and read the answers.",
89
+ "Check each answer is real prose rather than placeholder text.",
90
+ "Check the page states how to report a scam and links to the report form.",
91
+ "Read the console for errors.",
92
+ ],
93
+ expectedBehaviour: "The page carries real questions with real answers and routes onward to reporting. Somebody reading a scams FAQ is usually mid-incident, so the route to the report form is the most load-bearing link on the page.",
94
+ expectedUiState: "Several questions with substantive answers, a working link to /scams/report, and a clean console. An empty accordion is the finding.",
95
+ endResult: "Read-only.",
96
+ },
97
+ "checklist-public-pages-help-scams-guides-subpages-scams-report-form-submits": {
98
+ roles: ["guest", "buyer"],
99
+ startPage: "/scams/report",
100
+ steps: [
101
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
102
+ "Open /scams/report and fill every required field, using the description 'QA scam report probe — checklist case, please ignore.'",
103
+ "Pick a scam type from the list offered.",
104
+ "Submit the form.",
105
+ "Read what is shown afterwards.",
106
+ "Check the reporter is told what happens next rather than only that it was sent.",
107
+ ],
108
+ inputs: { description: "QA scam report probe — checklist case, please ignore." },
109
+ expectedBehaviour: "The form submits and tells the reporter what follows. A bare confirmation leaves somebody who has just been defrauded with no idea whether anyone will look, how long it takes, or what they should do meanwhile.",
110
+ expectedUiState: "A confirmation naming what happens next — review, timescale, or a reference. A bare 'Submitted' is a finding worth recording even though the submission worked.",
111
+ endResult: "One QA scam report exists; remove it if the admin surface allows.",
112
+ },
113
+ "checklist-public-pages-help-scams-guides-subpages-scams-report-errors-inline": {
114
+ roles: ["buyer"],
115
+ startPage: "/scams/report",
116
+ steps: [
117
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
118
+ "Open /scams/report and submit it completely empty.",
119
+ "Read where the errors appear.",
120
+ "Check each error is on its own field rather than in a single banner.",
121
+ "Fill one field and submit again, checking that field's error clears.",
122
+ "Check no server-side message leaks internal detail such as a file path or a stack.",
123
+ ],
124
+ expectedBehaviour: "Errors land on the fields they belong to, and a server-side failure is translated into a human message rather than passed through. A raw server message reaching a form is how a module-load failure with a full stack trace once rendered inside a bidding dialog.",
125
+ expectedUiState: "One inline error per empty required field, clearing as each is filled. A single banner is a finding; any file path, stack frame or internal identifier in a message is a more serious one.",
126
+ endResult: "Nothing is submitted.",
127
+ },
128
+ "checklist-public-pages-help-scams-guides-subpages-scams-report-reaches-admin": {
129
+ roles: ["buyer", "admin"],
130
+ startPage: "/scams/report",
131
+ steps: [
132
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! and submit a report with the description 'QA scam report routing probe — checklist case.'",
133
+ "Sign in as admin@letitrip.in / TempPass123!.",
134
+ "Find that report in an admin surface.",
135
+ "Open it and read the description and the reporter.",
136
+ "Check it can be actioned — accepted, rejected or turned into a registry entry.",
137
+ "Remove the QA report if the interface allows.",
138
+ ],
139
+ inputs: { description: "QA scam report routing probe — checklist case." },
140
+ expectedBehaviour: "A submitted report reaches an admin who can act on it. A public form with no admin surface behind it is the worst half-built shape available — the reporter is told their report was received, and it goes nowhere.",
141
+ expectedUiState: "The report is visible to the admin with its description and reporter, and offers an action. A form with nothing behind it is the finding.",
142
+ endResult: "The QA report is removed if possible.",
143
+ },
144
+ "checklist-public-pages-help-scams-guides-subpages-scams-subpages-linked-from-registry": {
145
+ roles: ["guest"],
146
+ startPage: "/scams",
147
+ steps: [
148
+ "Open /scams signed out.",
149
+ "Look for links to the types page, the FAQ page and the report form.",
150
+ "Follow each and check it lands on the right page.",
151
+ "Return each time.",
152
+ "Record any of the three that is not linked from /scams.",
153
+ ],
154
+ expectedBehaviour: "The registry links to its own sub-pages. A visitor lands on /scams to check a name; if they recognise their own situation there, the report form has to be one click away rather than a URL they would have to guess.",
155
+ expectedUiState: "All three linked and all three resolving. An unlinked sub-page is a finding, named.",
156
+ expectedData: { unlinkedScamSubpages: 0 },
157
+ endResult: "Read-only.",
158
+ },
159
+ "checklist-public-pages-help-scams-guides-subpages-public-seller-guide-loads": {
160
+ roles: ["guest"],
161
+ startPage: "/seller-guide",
162
+ steps: [
163
+ "Open /seller-guide signed out and read its content.",
164
+ "Note whether it reads as marketing for prospective sellers or as a dashboard manual.",
165
+ "Sign in as tyson@beybladearena.in / TempPass123! and open /store/guide.",
166
+ "Read that content.",
167
+ "Compare the two.",
168
+ "Check neither is a copy of the other.",
169
+ ],
170
+ expectedBehaviour: "These are two different route families with two different audiences — a prospective seller who has not signed up, and a signed-in seller managing a store. An existing case covering the dashboard guides looked like coverage of both and was coverage of neither.",
171
+ expectedUiState: "Two distinct bodies aimed at two audiences. The public one being a copy of the dashboard manual, or requiring a sign-in, are both findings.",
172
+ endResult: "Read-only.",
173
+ },
174
+ "checklist-public-pages-help-scams-guides-subpages-public-seller-guide-subpages-load": {
175
+ roles: ["guest"],
176
+ startPage: "/seller-guide",
177
+ steps: [
178
+ "Open /seller-guide and look for links to its bundles and prize-draws pages.",
179
+ "Open /seller-guide/bundles and read its content and status.",
180
+ "Open /seller-guide/prize-draws and read the same.",
181
+ "Check both are linked from the parent.",
182
+ "Check each has a route back to /seller-guide.",
183
+ ],
184
+ expectedBehaviour: "Both sub-pages load and are reachable from the parent in both directions. They explain the two listing types a prospective seller is least likely to already understand, so an unlinked page is a page nobody reads.",
185
+ expectedUiState: "Both return 200 with real content, are linked from /seller-guide, and link back. A 404 or an unlinked page is a finding.",
186
+ endResult: "Read-only.",
187
+ },
188
+ "checklist-public-pages-help-scams-guides-subpages-public-seller-guide-matches-product": {
189
+ roles: ["guest", "seller"],
190
+ startPage: "/seller-guide",
191
+ steps: [
192
+ "Open /seller-guide/bundles and write down every claim it makes about how bundles work — pricing, membership, whether a buyer can pick.",
193
+ "Sign in as tyson@beybladearena.in / TempPass123! and create a bundle, reading what the editor actually offers.",
194
+ "Compare each claim against what the editor does.",
195
+ "Open /seller-guide/prize-draws and write down its claims.",
196
+ "Create a prize draw and compare in the same way.",
197
+ "Record every claim the product does not keep.",
198
+ ],
199
+ expectedBehaviour: "The guide describes the product as it is. A bundle is all-or-nothing and a buyer cannot pick its members — a guide implying otherwise is describing a grouped listing, which is a different feature with a different page. A prospective seller signs up for whichever one the guide described.",
200
+ expectedUiState: "Every claim on both pages is reproducible in the editor. Each unmet claim is a finding, quoted and paired with what actually happens.",
201
+ endResult: "Any bundle or prize draw created for this case is deleted.",
202
+ },
203
+ "checklist-public-pages-help-scams-guides-subpages-seller-guide-reachable-signed-out": {
204
+ roles: ["guest"],
205
+ startPage: "/",
206
+ steps: [
207
+ "Open the homepage in a private window with no session.",
208
+ "Find a route to the public seller guide without typing its URL — a navigation entry, a footer link, or a sell-with-us call to action.",
209
+ "Follow it and check it lands on /seller-guide.",
210
+ "Check no sign-in was demanded along the way.",
211
+ "Check the guide's own call to action leads to the become-a-seller flow.",
212
+ ],
213
+ expectedBehaviour: "A signed-out visitor can find and read the guide, then act on it. Gating the pitch behind a sign-in inverts the funnel — the page exists to persuade somebody who has not signed up yet.",
214
+ expectedUiState: "A discoverable route from the homepage, no sign-in demanded, and a call to action leading to the seller onboarding flow.",
215
+ endResult: "Read-only.",
216
+ },
217
+ "checklist-public-pages-help-scams-guides-subpages-item-requests-new-form-opens": {
218
+ roles: ["buyer"],
219
+ startPage: "/item-requests/new",
220
+ steps: [
221
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
222
+ "Open /item-requests/new directly by URL.",
223
+ "Check the form is already open rather than the page being blank.",
224
+ "Fill it with the title 'QA Item Request Probe' and a description naming this checklist case.",
225
+ "Submit it.",
226
+ "Read where the browser lands and check the request appears in /item-requests.",
227
+ "Reload and check it is still there, then remove it.",
228
+ ],
229
+ inputs: { title: "QA Item Request Probe" },
230
+ expectedBehaviour: "An editor that is also a page opens with its form showing, and a submitted request appears in the list. Reloading is the check that separates a stored request from one that only ever existed in the browser.",
231
+ expectedUiState: "The form is open on arrival, the request appears in /item-requests, and is still there after a reload. A blank page on arrival is the finding.",
232
+ endResult: "The QA item request is removed.",
233
+ },
234
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;