rcf-lite 0.20.0 → 0.22.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 (532) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/blueprints/application-account-settings/CHANGELOG.md +12 -0
  3. package/blueprints/application-account-settings/README.md +114 -0
  4. package/blueprints/application-account-settings/blueprint.json +234 -0
  5. package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +20 -0
  6. package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +20 -0
  7. package/blueprints/application-account-settings/contributions/adrs/adr-2603-application-account-settings-theme-persistence.json +20 -0
  8. package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +20 -0
  9. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +18 -0
  10. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +18 -0
  11. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +18 -0
  12. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +18 -0
  13. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +18 -0
  14. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +18 -0
  15. package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +41 -0
  16. package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +28 -0
  17. package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +35 -0
  18. package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +40 -0
  19. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +34 -0
  20. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -0
  21. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +27 -0
  22. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +27 -0
  23. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +33 -0
  24. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +27 -0
  25. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +27 -0
  26. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -0
  27. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +33 -0
  28. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +27 -0
  29. package/blueprints/application-account-settings/docs/topics.md +48 -0
  30. package/blueprints/application-account-settings/guide/application-account-settings.md +30 -0
  31. package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +246 -0
  32. package/blueprints/application-admin-console/CHANGELOG.md +11 -0
  33. package/blueprints/application-admin-console/README.md +98 -0
  34. package/blueprints/application-admin-console/blueprint.json +226 -0
  35. package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +25 -0
  36. package/blueprints/application-admin-console/contributions/adrs/adr-2202-application-admin-console-baseline-roles.json +25 -0
  37. package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +20 -0
  38. package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +20 -0
  39. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +18 -0
  40. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +18 -0
  41. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +18 -0
  42. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +18 -0
  43. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +18 -0
  44. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +18 -0
  45. package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +40 -0
  46. package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +44 -0
  47. package/blueprints/application-admin-console/contributions/tacs/tac-2203-application-admin-console-permission-matrix.json +34 -0
  48. package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +40 -0
  49. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +34 -0
  50. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +34 -0
  51. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +34 -0
  52. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +28 -0
  53. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +34 -0
  54. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +27 -0
  55. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +27 -0
  56. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +27 -0
  57. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +33 -0
  58. package/blueprints/application-admin-console/docs/topics.md +42 -0
  59. package/blueprints/application-admin-console/guide/application-admin-console.md +29 -0
  60. package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +182 -0
  61. package/blueprints/application-api-rest/docs/topics.md +13 -1
  62. package/blueprints/application-charts/CHANGELOG.md +12 -0
  63. package/blueprints/application-charts/README.md +73 -0
  64. package/blueprints/application-charts/blueprint.json +26 -0
  65. package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +25 -0
  66. package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +25 -0
  67. package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.json +25 -0
  68. package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +15 -0
  69. package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +15 -0
  70. package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +15 -0
  71. package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +15 -0
  72. package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +42 -0
  73. package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +40 -0
  74. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +35 -0
  75. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +35 -0
  76. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +35 -0
  77. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +35 -0
  78. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +35 -0
  79. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +35 -0
  80. package/blueprints/application-charts/docs/topics.md +44 -0
  81. package/blueprints/application-charts/guide/application-charts.md +44 -0
  82. package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +191 -0
  83. package/blueprints/application-dashboard/CHANGELOG.md +10 -0
  84. package/blueprints/application-dashboard/README.md +102 -0
  85. package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +124 -0
  86. package/blueprints/application-dashboard/blueprint.json +29 -0
  87. package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +25 -0
  88. package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +25 -0
  89. package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.json +25 -0
  90. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-001.json +15 -0
  91. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +15 -0
  92. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +15 -0
  93. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +15 -0
  94. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +15 -0
  95. package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +47 -0
  96. package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +41 -0
  97. package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +35 -0
  98. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +35 -0
  99. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +35 -0
  100. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +35 -0
  101. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +35 -0
  102. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +35 -0
  103. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +35 -0
  104. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +35 -0
  105. package/blueprints/application-dashboard/docs/topics.md +50 -0
  106. package/blueprints/application-dashboard/guide/application-dashboard.md +48 -0
  107. package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +231 -0
  108. package/blueprints/application-datatable/CHANGELOG.md +8 -0
  109. package/blueprints/application-datatable/README.md +43 -0
  110. package/blueprints/application-datatable/blueprint.json +33 -0
  111. package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +25 -0
  112. package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +20 -0
  113. package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +20 -0
  114. package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +20 -0
  115. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-001.json +15 -0
  116. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +15 -0
  117. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +15 -0
  118. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +15 -0
  119. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +15 -0
  120. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +15 -0
  121. package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +50 -0
  122. package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +39 -0
  123. package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +28 -0
  124. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +44 -0
  125. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +44 -0
  126. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +44 -0
  127. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +44 -0
  128. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +44 -0
  129. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +44 -0
  130. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +44 -0
  131. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +44 -0
  132. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +44 -0
  133. package/blueprints/application-datatable/docs/topics.md +42 -0
  134. package/blueprints/application-datatable/guide/application-datatable.md +38 -0
  135. package/blueprints/application-datatable/probe-packs/application-datatable.pack.mjs +240 -0
  136. package/blueprints/application-empty-error-states/CHANGELOG.md +9 -0
  137. package/blueprints/application-empty-error-states/README.md +88 -0
  138. package/blueprints/application-empty-error-states/blueprint.json +119 -0
  139. package/blueprints/application-empty-error-states/contributions/adrs/adr-2301-application-empty-error-states-status-contract.json +25 -0
  140. package/blueprints/application-empty-error-states/contributions/adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json +25 -0
  141. package/blueprints/application-empty-error-states/contributions/adrs/adr-2303-application-empty-error-states-offline-strategy.json +25 -0
  142. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +18 -0
  143. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +18 -0
  144. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +18 -0
  145. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +18 -0
  146. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +18 -0
  147. package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +46 -0
  148. package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +36 -0
  149. package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +40 -0
  150. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +29 -0
  151. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +29 -0
  152. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +29 -0
  153. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +29 -0
  154. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +29 -0
  155. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +29 -0
  156. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +29 -0
  157. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +29 -0
  158. package/blueprints/application-empty-error-states/docs/topics.md +53 -0
  159. package/blueprints/application-empty-error-states/guide/application-empty-error-states.md +50 -0
  160. package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +284 -0
  161. package/blueprints/application-error-handling/docs/topics.md +12 -0
  162. package/blueprints/application-file-upload/CHANGELOG.md +9 -0
  163. package/blueprints/application-file-upload/README.md +85 -0
  164. package/blueprints/application-file-upload/blueprint.json +114 -0
  165. package/blueprints/application-file-upload/contributions/adrs/adr-2401-application-file-upload-transport.json +25 -0
  166. package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +25 -0
  167. package/blueprints/application-file-upload/contributions/adrs/adr-2403-application-file-upload-virus-scan.json +25 -0
  168. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +18 -0
  169. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +18 -0
  170. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +18 -0
  171. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +18 -0
  172. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +18 -0
  173. package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +46 -0
  174. package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +47 -0
  175. package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +46 -0
  176. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +28 -0
  177. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +28 -0
  178. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +29 -0
  179. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +28 -0
  180. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +29 -0
  181. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +28 -0
  182. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +28 -0
  183. package/blueprints/application-file-upload/docs/topics.md +58 -0
  184. package/blueprints/application-file-upload/guide/application-file-upload.md +48 -0
  185. package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +238 -0
  186. package/blueprints/application-forms-wizard/CHANGELOG.md +9 -0
  187. package/blueprints/application-forms-wizard/README.md +102 -0
  188. package/blueprints/application-forms-wizard/blueprint.json +120 -0
  189. package/blueprints/application-forms-wizard/contributions/adrs/adr-2501-application-forms-wizard-navigation.json +25 -0
  190. package/blueprints/application-forms-wizard/contributions/adrs/adr-2502-application-forms-wizard-save-and-return.json +25 -0
  191. package/blueprints/application-forms-wizard/contributions/adrs/adr-2503-application-forms-wizard-step-indicator.json +25 -0
  192. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +18 -0
  193. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +18 -0
  194. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +18 -0
  195. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +18 -0
  196. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +18 -0
  197. package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +46 -0
  198. package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +40 -0
  199. package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +40 -0
  200. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +28 -0
  201. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +29 -0
  202. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +28 -0
  203. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +29 -0
  204. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +28 -0
  205. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +28 -0
  206. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +28 -0
  207. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +29 -0
  208. package/blueprints/application-forms-wizard/docs/topics.md +49 -0
  209. package/blueprints/application-forms-wizard/guide/application-forms-wizard.md +48 -0
  210. package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +233 -0
  211. package/blueprints/application-notifications-in-app/CHANGELOG.md +9 -0
  212. package/blueprints/application-notifications-in-app/README.md +80 -0
  213. package/blueprints/application-notifications-in-app/blueprint.json +30 -0
  214. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +25 -0
  215. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2102-application-notifications-in-app-toast-timeout-floor.json +25 -0
  216. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2103-application-notifications-in-app-retention-window.json +25 -0
  217. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +15 -0
  218. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +15 -0
  219. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +15 -0
  220. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +15 -0
  221. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +15 -0
  222. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +46 -0
  223. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +52 -0
  224. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +40 -0
  225. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +35 -0
  226. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +35 -0
  227. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +35 -0
  228. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +35 -0
  229. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +35 -0
  230. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +26 -0
  231. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +26 -0
  232. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +26 -0
  233. package/blueprints/application-notifications-in-app/docs/topics.md +46 -0
  234. package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +47 -0
  235. package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +328 -0
  236. package/blueprints/application-onboarding-tour/CHANGELOG.md +12 -0
  237. package/blueprints/application-onboarding-tour/README.md +77 -0
  238. package/blueprints/application-onboarding-tour/blueprint.json +164 -0
  239. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2701-application-onboarding-tour-dismissal-policy.json +20 -0
  240. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +20 -0
  241. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2703-application-onboarding-tour-checklist-anchor.json +20 -0
  242. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +18 -0
  243. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +18 -0
  244. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +18 -0
  245. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +18 -0
  246. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +41 -0
  247. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +35 -0
  248. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +34 -0
  249. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +27 -0
  250. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +27 -0
  251. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +27 -0
  252. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +27 -0
  253. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +27 -0
  254. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +27 -0
  255. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +27 -0
  256. package/blueprints/application-onboarding-tour/docs/topics.md +48 -0
  257. package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +59 -0
  258. package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +231 -0
  259. package/blueprints/application-spa/docs/topics.md +13 -1
  260. package/blueprints/delivery-ci-workflows/docs/topics.md +13 -1
  261. package/blueprints/deploy-cloudflare-workers/docs/topics.md +13 -1
  262. package/blueprints/email-smtp-resend/docs/topics.md +13 -1
  263. package/blueprints/object-storage-s3/CHANGELOG.md +13 -0
  264. package/blueprints/object-storage-s3/README.md +108 -0
  265. package/blueprints/object-storage-s3/blueprint.json +72 -0
  266. package/blueprints/object-storage-s3/contributions/adrs/adr-2901-object-storage-s3-adapter.json +30 -0
  267. package/blueprints/object-storage-s3/contributions/adrs/adr-2902-object-storage-s3-presigned-ttl-floor.json +25 -0
  268. package/blueprints/object-storage-s3/contributions/adrs/adr-2903-object-storage-s3-multipart-threshold.json +25 -0
  269. package/blueprints/object-storage-s3/contributions/adrs/adr-2904-object-storage-s3-contract.json +25 -0
  270. package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +103 -0
  271. package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +43 -0
  272. package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +84 -0
  273. package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +101 -0
  274. package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +85 -0
  275. package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +84 -0
  276. package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +64 -0
  277. package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +4 -0
  278. package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +10 -0
  279. package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +4 -0
  280. package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +4 -0
  281. package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +7 -0
  282. package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +4 -0
  283. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +18 -0
  284. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +18 -0
  285. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +18 -0
  286. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +18 -0
  287. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +18 -0
  288. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +18 -0
  289. package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +57 -0
  290. package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +36 -0
  291. package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +36 -0
  292. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +34 -0
  293. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +43 -0
  294. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +25 -0
  295. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +34 -0
  296. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -0
  297. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +34 -0
  298. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +34 -0
  299. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +34 -0
  300. package/blueprints/object-storage-s3/docs/topics.md +62 -0
  301. package/blueprints/object-storage-s3/guide/object-storage-s3.md +207 -0
  302. package/blueprints/observability-essentials/docs/topics.md +13 -1
  303. package/blueprints/observability-logging/CHANGELOG.md +9 -0
  304. package/blueprints/observability-logging/README.md +4 -1
  305. package/blueprints/observability-logging/blueprint.json +114 -21
  306. package/blueprints/observability-logging/docs/topics.md +12 -0
  307. package/blueprints/observability-probe-endpoints/docs/topics.md +13 -1
  308. package/blueprints/persistence-data-d1/docs/topics.md +13 -1
  309. package/blueprints/persistence-data-postgres/CHANGELOG.md +12 -0
  310. package/blueprints/persistence-data-postgres/README.md +101 -0
  311. package/blueprints/persistence-data-postgres/blueprint.json +80 -0
  312. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +30 -0
  313. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2802-persistence-data-postgres-migration-shape.json +25 -0
  314. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2803-persistence-data-postgres-runner-mode.json +25 -0
  315. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2804-persistence-data-postgres-recovery.json +25 -0
  316. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +25 -0
  317. package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +56 -0
  318. package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +75 -0
  319. package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +56 -0
  320. package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +186 -0
  321. package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +76 -0
  322. package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +173 -0
  323. package/blueprints/persistence-data-postgres/contributions/probes/run-facade-round-trip.mjs +10 -0
  324. package/blueprints/persistence-data-postgres/contributions/probes/run-migration-apply.mjs +10 -0
  325. package/blueprints/persistence-data-postgres/contributions/probes/run-pool-posture-smoke.mjs +9 -0
  326. package/blueprints/persistence-data-postgres/contributions/probes/run-prepared-statement-scan.mjs +10 -0
  327. package/blueprints/persistence-data-postgres/contributions/probes/run-recovery-restore-round-trip.mjs +9 -0
  328. package/blueprints/persistence-data-postgres/contributions/probes/run-transaction-atomicity.mjs +10 -0
  329. package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +79 -0
  330. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +18 -0
  331. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +18 -0
  332. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +18 -0
  333. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +18 -0
  334. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +18 -0
  335. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +18 -0
  336. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +18 -0
  337. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +58 -0
  338. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +40 -0
  339. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +35 -0
  340. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +40 -0
  341. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +34 -0
  342. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +25 -0
  343. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +25 -0
  344. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +25 -0
  345. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +25 -0
  346. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +25 -0
  347. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +25 -0
  348. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +25 -0
  349. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +25 -0
  350. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +25 -0
  351. package/blueprints/persistence-data-postgres/docs/topics.md +64 -0
  352. package/blueprints/persistence-data-postgres/guide/persistence-data-postgres.md +172 -0
  353. package/blueprints/persistence-data-sqlite/docs/topics.md +13 -1
  354. package/blueprints/security-auth-clerk/CHANGELOG.md +9 -0
  355. package/blueprints/security-auth-clerk/README.md +3 -0
  356. package/blueprints/security-auth-clerk/blueprint.json +147 -29
  357. package/blueprints/security-auth-clerk/docs/topics.md +13 -1
  358. package/blueprints/security-auth-keycloak/CHANGELOG.md +9 -0
  359. package/blueprints/security-auth-keycloak/README.md +3 -0
  360. package/blueprints/security-auth-keycloak/blueprint.json +182 -36
  361. package/blueprints/security-auth-keycloak/docs/topics.md +13 -1
  362. package/blueprints/security-auth-magic-link/CHANGELOG.md +9 -0
  363. package/blueprints/security-auth-magic-link/README.md +3 -0
  364. package/blueprints/security-auth-magic-link/blueprint.json +159 -32
  365. package/blueprints/security-auth-magic-link/docs/topics.md +13 -1
  366. package/blueprints/security-auth-oauth2/CHANGELOG.md +9 -0
  367. package/blueprints/security-auth-oauth2/README.md +3 -0
  368. package/blueprints/security-auth-oauth2/blueprint.json +158 -31
  369. package/blueprints/security-auth-oauth2/docs/topics.md +13 -1
  370. package/blueprints/security-secrets-management/CHANGELOG.md +11 -0
  371. package/blueprints/security-secrets-management/blueprint.json +2 -1
  372. package/blueprints/security-secrets-management/docs/topics.md +13 -1
  373. package/fixtures/canary-manifest.json +9 -9
  374. package/package.json +2 -2
  375. package/rcf/code-nodes/cn-106.json +13 -0
  376. package/rcf/code-nodes/cn-107.json +14 -0
  377. package/rcf/code-nodes/cn-108.json +13 -0
  378. package/rcf/code-nodes/cn-109.json +12 -0
  379. package/rcf/code-nodes/cn-110.json +12 -0
  380. package/rcf/code-nodes/cn-111.json +14 -0
  381. package/rcf/code-nodes/cn-112.json +14 -0
  382. package/rcf/code-nodes/cn-113.json +12 -0
  383. package/rcf/code-nodes/cn-114.json +13 -0
  384. package/rcf/code-nodes/cn-115.json +13 -0
  385. package/rcf/code-nodes/cn-116.json +12 -0
  386. package/rcf/code-nodes/cn-117.json +13 -0
  387. package/rcf/code-nodes/cn-118.json +13 -0
  388. package/rcf/code-nodes/cn-119.json +13 -0
  389. package/rcf/code-nodes/cn-120.json +13 -0
  390. package/rcf/code-nodes/cn-121.json +12 -0
  391. package/rcf/code-nodes/cn-122.json +12 -0
  392. package/rcf/code-nodes/cn-123.json +13 -0
  393. package/rcf/code-nodes/cn-124.json +13 -0
  394. package/rcf/code-nodes/cn-125.json +13 -0
  395. package/rcf/code-nodes/cn-126.json +13 -0
  396. package/rcf/code-nodes/cn-127.json +12 -0
  397. package/rcf/code-nodes/cn-128.json +14 -0
  398. package/rcf/code-nodes/cn-129.json +14 -0
  399. package/rcf/code-nodes/cn-130.json +14 -0
  400. package/rcf/code-nodes/cn-131.json +15 -0
  401. package/rcf/code-nodes/cn-132.json +12 -0
  402. package/rcf/code-nodes/cn-133.json +13 -0
  403. package/rcf/code-nodes/cn-134.json +13 -0
  404. package/rcf/code-nodes/cn-135.json +12 -0
  405. package/rcf/code-nodes/cn-136.json +13 -0
  406. package/rcf/code-nodes/cn-137.json +13 -0
  407. package/rcf/code-nodes/cn-138.json +12 -0
  408. package/rcf/code-nodes/cn-139.json +12 -0
  409. package/rcf/code-nodes/cn-140.json +13 -0
  410. package/rcf/code-nodes/cn-141.json +13 -0
  411. package/rcf/code-nodes/cn-142.json +12 -0
  412. package/rcf/code-nodes/cn-143.json +13 -0
  413. package/rcf/code-nodes/cn-144.json +13 -0
  414. package/rcf/code-nodes/cn-145.json +12 -0
  415. package/rcf/code-nodes/cn-146.json +12 -0
  416. package/rcf/code-nodes/cn-147.json +13 -0
  417. package/rcf/code-nodes/cn-148.json +13 -0
  418. package/rcf/code-nodes/cn-149.json +12 -0
  419. package/rcf/code-nodes/cn-150.json +13 -0
  420. package/rcf/code-nodes/cn-151.json +13 -0
  421. package/rcf/code-nodes/cn-152.json +12 -0
  422. package/rcf/code-nodes/cn-153.json +12 -0
  423. package/rcf/code-nodes/cn-154.json +13 -0
  424. package/rcf/code-nodes/cn-155.json +14 -0
  425. package/rcf/code-nodes/cn-156.json +13 -0
  426. package/rcf/code-nodes/cn-157.json +13 -0
  427. package/rcf/code-nodes/cn-158.json +12 -0
  428. package/rcf/code-nodes/cn-159.json +13 -0
  429. package/rcf/code-nodes/cn-160.json +12 -0
  430. package/rcf/code-nodes/cn-161.json +12 -0
  431. package/rcf/code-nodes/cn-162.json +13 -0
  432. package/rcf/code-nodes/cn-163.json +12 -0
  433. package/rcf/code-nodes/cn-164.json +13 -0
  434. package/rcf/code-nodes/cn-165.json +12 -0
  435. package/rcf/code-nodes/cn-166.json +12 -0
  436. package/rcf/code-nodes/cn-167.json +12 -0
  437. package/rcf/code-nodes/cn-168.json +12 -0
  438. package/rcf/code-nodes/cn-169.json +12 -0
  439. package/rcf/code-nodes/cn-170.json +12 -0
  440. package/rcf/code-nodes/cn-171.json +12 -0
  441. package/rcf/code-nodes/cn-172.json +12 -0
  442. package/rcf/code-nodes/cn-173.json +12 -0
  443. package/rcf/code-nodes/cn-174.json +12 -0
  444. package/rcf/code-nodes/cn-175.json +13 -0
  445. package/rcf/code-nodes/cn-176.json +12 -0
  446. package/rcf/code-nodes/cn-177.json +12 -0
  447. package/rcf/code-nodes/cn-178.json +12 -0
  448. package/rcf/code-nodes/cn-179.json +12 -0
  449. package/rcf/code-nodes/cn-180.json +13 -0
  450. package/rcf/code-nodes/cn-181.json +12 -0
  451. package/rcf/code-nodes/cn-182.json +13 -0
  452. package/rcf/code-nodes/cn-183.json +12 -0
  453. package/rcf/code-nodes/cn-184.json +13 -0
  454. package/rcf/code-nodes/cn-185.json +12 -0
  455. package/rcf/code-nodes/cn-186.json +12 -0
  456. package/rcf/code-nodes/cn-200.json +14 -0
  457. package/rcf/code-nodes/cn-201.json +13 -0
  458. package/rcf/code-nodes/cn-202.json +14 -0
  459. package/rcf/code-nodes/cn-203.json +14 -0
  460. package/rcf/code-nodes/cn-204.json +13 -0
  461. package/rcf/code-nodes/cn-205.json +14 -0
  462. package/rcf/fbs/fbs-036.json +22 -0
  463. package/rcf/fbs/fbs-037.json +19 -0
  464. package/rcf/fbs/fbs-038.json +19 -0
  465. package/rcf/fbs/fbs-039.json +21 -0
  466. package/rcf/fbs/fbs-040.json +20 -0
  467. package/rcf/fbs/fbs-041.json +13 -0
  468. package/rcf/fbs/fbs-042.json +13 -0
  469. package/rcf/fbs/fbs-043.json +23 -0
  470. package/rcf/fbs/fbs-044.json +23 -0
  471. package/rcf/fbs/fbs-045.json +23 -0
  472. package/rcf/fbs/fbs-046.json +24 -0
  473. package/rcf/fbs/fbs-047.json +24 -0
  474. package/rcf/fbs/fbs-060.json +22 -0
  475. package/rcf/fbs/fbs-061.json +20 -0
  476. package/rcf/requirements/req-017.json +18 -0
  477. package/rcf/requirements/req-018.json +18 -0
  478. package/rcf/requirements/req-019.json +38 -0
  479. package/rcf/requirements/req-020.json +13 -0
  480. package/rcf/requirements/req-021.json +13 -0
  481. package/rcf/requirements/req-022.json +13 -0
  482. package/rcf/requirements/req-023.json +14 -0
  483. package/rcf/requirements/req-024.json +69 -0
  484. package/rcf/requirements/req-025.json +59 -0
  485. package/rcf/requirements/req-026.json +154 -0
  486. package/rcf/requirements/req-027.json +33 -0
  487. package/rcf/requirements/req-028.json +13 -0
  488. package/rcf/requirements/req-040.json +13 -0
  489. package/rcf/requirements/req-041.json +125 -0
  490. package/rcf/test-suites/ts-046.json +78 -0
  491. package/rcf/test-suites/ts-047.json +54 -0
  492. package/rcf/test-suites/ts-048.json +54 -0
  493. package/rcf/test-suites/ts-049.json +70 -0
  494. package/rcf/test-suites/ts-050.json +69 -0
  495. package/rcf/test-suites/ts-051.json +22 -0
  496. package/rcf/test-suites/ts-052.json +20 -0
  497. package/rcf/test-suites/ts-053.json +70 -0
  498. package/rcf/test-suites/ts-054.json +70 -0
  499. package/rcf/test-suites/ts-055.json +77 -0
  500. package/rcf/test-suites/ts-056.json +78 -0
  501. package/rcf/test-suites/ts-057.json +78 -0
  502. package/rcf/test-suites/ts-070.json +62 -0
  503. package/rcf/test-suites/ts-071.json +62 -0
  504. package/rcf/user-stories/us-1701.json +56 -0
  505. package/rcf/user-stories/us-1801.json +40 -0
  506. package/rcf/user-stories/us-1901.json +40 -0
  507. package/rcf/user-stories/us-2001.json +50 -0
  508. package/rcf/user-stories/us-2101.json +45 -0
  509. package/rcf/user-stories/us-2201.json +60 -0
  510. package/rcf/user-stories/us-2301.json +51 -0
  511. package/rcf/user-stories/us-2401.json +62 -0
  512. package/rcf/user-stories/us-2501.json +58 -0
  513. package/rcf/user-stories/us-2601.json +51 -0
  514. package/rcf/user-stories/us-2701.json +55 -0
  515. package/rcf/user-stories/us-2801.json +55 -0
  516. package/rcf/user-stories/us-4001.json +69 -0
  517. package/rcf/user-stories/us-4101.json +69 -0
  518. package/releases/releases.yaml +21 -1
  519. package/src/blueprint/apply.js +107 -1
  520. package/src/blueprint/capabilities.js +357 -0
  521. package/src/blueprint/loader.js +247 -0
  522. package/src/browser-verify/boot.js +180 -0
  523. package/src/browser-verify/index.js +13 -0
  524. package/src/browser-verify/manifest-writer.js +31 -6
  525. package/src/browser-verify/pack-browser.js +294 -0
  526. package/src/browser-verify/pack-loader.js +176 -0
  527. package/src/browser-verify/pack-runner.js +193 -0
  528. package/src/browser-verify/pack-schema.js +155 -0
  529. package/src/browser-verify/runner.js +24 -1
  530. package/src/cli/blueprint.js +99 -0
  531. package/src/cli/browser-verify.js +147 -7
  532. package/src/core/errors/index.js +7 -0
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Empty, loading, error and no-results states each render a distinct region with a polite live announcement",
8
+ "asA": "screen-reader user or keyboard-only user navigating a datatable that has no rows to show",
9
+ "iWant": "each of the four states to render inside its own `role=\"region\"` element with `aria-live=\"polite\"` and a distinct visual so the reason no rows show is announced and readable",
10
+ "soThat": "the state is unambiguous and not confused with stale content",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17105-1",
14
+ "description": "Given a datatable route in each of the four states (empty, loading, error, no-results), the rendered DOM carries a `role=\"region\"` element with `aria-live=\"polite\"` per state; the no-results state is distinguished from empty by the presence of a non-empty active filter (`q`). The check drives the shell to each state via query parameter, reads the accessibility tree, and asserts the region and live values. Probed by pack check AC-17105-1.",
15
+ "given": "the datatable route driven to each of the four states",
16
+ "when": "the state region renders",
17
+ "then": "each state carries a `role=\"region\"` element with `aria-live=\"polite\"` and a distinct heading",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17105-2",
23
+ "description": "Given a datatable route in each of the four states, no state relies on colour alone to convey its meaning (WCAG 1.4.1): each state includes text content that names the state (empty, loading, error, or no results).",
24
+ "given": "the datatable route driven to each of the four states",
25
+ "when": "the state region renders",
26
+ "then": "each state region includes text content that names the state without relying on colour",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17105-3",
32
+ "description": "Given a rendered datatable in the loading state, when the fetch resolves and rows arrive, the loading region is removed from the accessibility tree and the populated data region replaces it (never overlaid). The check drives the surface into loading, waits for resolution, and asserts the loading region is gone.",
33
+ "given": "a datatable in the loading state",
34
+ "when": "the fetch resolves and rows arrive",
35
+ "then": "the loading region is removed and the populated data region renders without the loading region present",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-006",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Column visibility, reorder and resize each expose a keyboard-reachable alternative to any drag pointer path",
8
+ "asA": "operator who cannot drag with a pointer",
9
+ "iWant": "column visibility, reorder and resize to expose a non-drag path so the column layout is fully operable from the keyboard",
10
+ "soThat": "WCAG 2.5.7 Dragging Movements is met and the surface stays operable on assistive input devices",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17106-1",
14
+ "description": "Given a rendered datatable, the surface exposes a non-drag path to reorder columns: a paired move-left / move-right button per column, or a menu ordering. The check reads the initial header order, activates a move-left control on a middle column, and asserts the header order changed. Probed by pack check AC-17106-1.",
15
+ "given": "a rendered datatable with more than one column",
16
+ "when": "the operator activates a keyboard-reachable move control on a column",
17
+ "then": "the header order changes to reflect the move",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17106-2",
23
+ "description": "Given a rendered datatable, the column visibility toggle exposes a keyboard-reachable control (a checkbox or menu item) per toggleable column; activating the control hides or shows that column and its header cell without a page reload.",
24
+ "given": "a rendered datatable with toggleable columns",
25
+ "when": "the operator activates a column visibility control",
26
+ "then": "the target column's header and body cells hide or show accordingly",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17106-3",
32
+ "description": "Given a rendered datatable that supports column resize, the surface exposes a keyboard-reachable resize path (an increment or decrement control per column, or an equivalent menu option) so the width is operable without a pointer drag.",
33
+ "given": "a rendered datatable that supports column resize",
34
+ "when": "the operator activates the keyboard resize path on a column",
35
+ "then": "the column width changes by the declared increment without a pointer drag",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The rendered table shell uses the ARIA APG pattern that matches the surface's interactivity",
8
+ "asA": "assistive-tech user reading the datatable",
9
+ "iWant": "the shell to render as an ARIA APG table for read-only rows and as an ARIA APG grid once cells contain interactive controls",
10
+ "soThat": "the assistive-tech pattern matches the interactivity of the surface (ADR-1801)",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17107-1",
14
+ "description": "Given a datatable shell that renders interactive per-row controls (sort buttons, selection checkboxes, inline actions), the rendered element is a `<table role=\"grid\">` with `<th>` cells scoped to `col`; a read-only variant that renders no per-row interactive controls stays on the plain `<table>` pattern. The check reads the accessibility tree at the shell route and asserts the presence of the grid role when the shell ships interactive controls.",
15
+ "given": "a datatable route that ships interactive per-row controls",
16
+ "when": "the shell renders",
17
+ "then": "the rendered table has `role=\"grid\"` and header cells scoped to `col`",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17107-2",
23
+ "description": "Given a rendered datatable, every per-row inline action (edit, delete, resend) has an accessible name that includes the acted-on row's identifier or a semantically equivalent noun (not `Edit` alone); the accessible name is readable by assistive tech per WCAG 4.1.2.",
24
+ "given": "a rendered datatable with per-row inline actions",
25
+ "when": "assistive tech reads the action controls",
26
+ "then": "each action's accessible name identifies the acted-on row",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17107-3",
32
+ "description": "Given a rendered datatable, the header row exposes each column's role (`<th scope=\"col\">` or `role=\"columnheader\"`) and every data cell resolves to a column header for row-and-column readouts on assistive tech (WCAG 1.3.1).",
33
+ "given": "a rendered datatable",
34
+ "when": "assistive tech traverses a data cell",
35
+ "then": "the announced context includes the column header the cell resolves to",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17108",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "URL state serialisation preserves sort, filter and page across reload and share",
8
+ "asA": "operator sharing a specific datatable view with a colleague",
9
+ "iWant": "the sort, filter and page state to serialise into the URL so a reload or a shared link lands on the same view",
10
+ "soThat": "the surface is deep-linkable and reload-stable (ADR-1802's recommended default)",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17108-1",
14
+ "description": "Given a rendered datatable where the operator applied a sort, a filter and advanced past page 1, the current URL carries the state as query parameters (`sort`, `q`, `page`) per ADR-1802's recommended default; reloading the URL rerenders the same view.",
15
+ "given": "a rendered datatable with an applied sort, filter and non-first page",
16
+ "when": "the operator reloads the URL",
17
+ "then": "the reloaded surface renders the same sort, filter and page",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17108-2",
23
+ "description": "Given the elicited client-side sort alternative (ADR-1802 elicited variant) applied to a small in-memory collection, the sort direction still writes to the URL so reload stability is preserved; the client-side branch never invents a URL state divergent from the server-side default.",
24
+ "given": "a rendered datatable applying the client-side sort alternative",
25
+ "when": "the operator activates a sort control",
26
+ "then": "the URL query parameters update with `sort=<column>:<direction>` in the same shape as the server-side default",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17108-3",
32
+ "description": "Given a rendered datatable, the default page size on the recommended default (ADR-1803) applies when no `pageSize` is present in the URL; the operator's elicited page-size override at apply time changes the default without changing the URL contract.",
33
+ "given": "a rendered datatable landed at the shell route without a `pageSize` query parameter",
34
+ "when": "the initial render fetches the first page",
35
+ "then": "the fetch carries `pageSize=<applied-default>` and the URL is left untouched",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1801-application-datatable-shell", "TAC-1802-application-datatable-query-adapter"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "usId": "application-datatable-US-17109",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-datatable-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Selection persistence across pages holds the elicited contract and announces the running count",
8
+ "asA": "operator selecting rows across several pages before running a bulk action",
9
+ "iWant": "the selection model to persist my row selections across pagination and announce the running count",
10
+ "soThat": "cross-page bulk operations are visible and reversible",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-17109-1",
14
+ "description": "Given an operator elicited `selectionPersistence=cross-page` (ADR-1804), when the operator selects rows on page 1 and advances to page 2, the previously selected row ids remain in the selection model; a return to page 1 re-renders the checkboxes as checked. The check clicks a row checkbox, advances the page, returns, and asserts the checkbox is still checked.",
15
+ "given": "a rendered datatable with elicited cross-page selection persistence",
16
+ "when": "the operator selects rows on page 1 and paginates away and back",
17
+ "then": "the row checkboxes on page 1 remain in the selected state on return",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-17109-2",
23
+ "description": "Given a running row selection, the surface renders the current count in an accessible location adjacent to the bulk action controls; the count updates when a row is toggled without a full re-render of the surface.",
24
+ "given": "a rendered datatable with at least one row selected",
25
+ "when": "the operator toggles a second row",
26
+ "then": "the accessible selection count updates by one without a full page re-render",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-17109-3",
32
+ "description": "Given the operator did not elicit cross-page persistence (ADR-1804's non-elicited default), the selection resets on pagination; the surface names this behaviour in the accessible copy near the bulk action control so operators are not surprised on advance.",
33
+ "given": "a rendered datatable without cross-page persistence elicited",
34
+ "when": "the operator selects rows and paginates away",
35
+ "then": "the selection clears on advance and the accessible copy on the bulk-action region names the per-page-only behaviour",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": ["TAC-1803-application-datatable-selection-model"],
41
+ "tags": ["blueprint:application-datatable"],
42
+ "createdAt": "2026-09-04T19:45:00Z",
43
+ "updatedAt": "2026-09-04T19:45:00Z"
44
+ }
@@ -0,0 +1,42 @@
1
+ # application-datatable: coordination vocabulary
2
+
3
+ ## Global topics
4
+
5
+ The blueprint claims no new global topics at v1.0.0. The datatable shell is a general enterprise practice contract; every ADR (pattern choice, URL state, page size, selection persistence) is non-global.
6
+
7
+ ## Deliberately unclaimed topics
8
+
9
+ - `dataGridEngine` (the chosen data-table library). Reserved for the applying project as an elicited choice, not a global topic; a second datatable-shaped blueprint that composes with a specific engine would either supersede this blueprint or share the shell TAC.
10
+ - `columnRegistry` (a shared column vocabulary across surfaces). No blueprint claims it today; a future admin-console blueprint (visual round T-5) may elicit column reuse without minting a global topic.
11
+
12
+ ## Shelf id band and suffix block
13
+
14
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
15
+ |---|---|---|---|---|
16
+ | application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
17
+ | application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
18
+ | application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
19
+ | application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
20
+ | application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
21
+ | application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
22
+ | application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
23
+ | application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
24
+ | application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
25
+ | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
26
+ | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
27
+ | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
28
+
29
+ The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
30
+
31
+ ## Probe pack
32
+
33
+ `probe-packs/application-datatable.pack.mjs` ships six checks anchored to blueprint AC ids:
34
+
35
+ - `AC-17101-1` sort click reorders rows
36
+ - `AC-17102-1` filter text search issues q request
37
+ - `AC-17103-2` pagination announcement in aria-live region
38
+ - `AC-17104-3` bulk-action confirmation dialog returns focus to originating row
39
+ - `AC-17105-1` state distinctness (empty / loading / error / no-results)
40
+ - `AC-17106-1` column reorder keyboard alternative
41
+
42
+ The pack applies to any FBS binding `TAC-1801-application-datatable-shell` or whose navModel routes name a datatable path. See `packages/rcf-lite/docs/blueprint-authoring.md` section 8c for the pack authoring rules.
@@ -0,0 +1,38 @@
1
+ # Guide: application-datatable (v1.0.0)
2
+
3
+ ## What it is
4
+
5
+ A shipped, vendor-neutral datatable contract for a rcf-lite application. One shell (TAC-1801), one query adapter (TAC-1802), one selection model (TAC-1803), plus a shipped Playwright probe pack that gates ship on the six runtime-observable surfaces the shelf assures: sort activation reorders rendered rows, filter text search issues a `q` request, pagination announces `Page N of M` through an aria-live region, bulk actions open an APG dialog and return focus to the originating row, four states each render in their own region, and columns reorder without a drag.
6
+
7
+ ## What it deliberately is not
8
+
9
+ - Not a data-table library. The shell is a contract; the applying project chooses TanStack Table, MUI DataGrid, AG Grid, a hand-rolled `<table>`, or any other realisation. The ACs are what ship must meet; the HOW is the project's decision.
10
+ - Not a data-source contract. The query adapter (TAC-1802) targets a REST endpoint on the applied `application-api-rest`, a GraphQL query, or an in-memory adapter for small collections; the adapter shape is one project decision above the data source.
11
+ - Not a row-level authorisation contract. The applied auth blueprint owns row-level visibility; the datatable reads the rows it is given.
12
+
13
+ ## When to reach for it
14
+
15
+ - Any surface with tabular data the operator sorts, filters, paginates, or bulk-operates on. Users tables, orders, notifications, records, audit views. The dashboard blueprint (visual round T-3) consumes this shell for its `application-datatable` recent-items strip.
16
+ - Projects that want the ARIA APG discipline (table vs grid per interactivity) enforced at ship without hand-authoring the rule per surface.
17
+
18
+ ## When it does not fit
19
+
20
+ - Read-only presentation of static data where sort, filter or pagination are not needed. A plain `<table>` inside a marketing surface does not need this shell.
21
+ - Highly bespoke tabular surfaces that render two-dimensional keyboard navigation over a non-table structure (a spreadsheet-shaped editor). Those supersede TAC-1801 with a project-authored shell.
22
+
23
+ ## What a good outcome looks like
24
+
25
+ The rendered surface is a `<table role="grid">` when the shell ships interactive controls; sort activation reorders rows against the query adapter's response and announces the direction via `aria-sort`; the filter input carries `q` into the adapter; the pagination status region reads `Page N of M` and updates on advance; the bulk-action confirmation dialog opens as `role="dialog"` `aria-modal="true"` with `aria-labelledby` and `aria-describedby` set, initial focus lands on confirm, and cancel returns focus to the row control that opened the dialog; the four states each render inside their own `role="region"` with `aria-live="polite"`; column reorder has a paired left / right keyboard control per column; the shipped probe pack runs green on the delivery-ci-workflows gate.
26
+
27
+ ## The operator decisions that remain open
28
+
29
+ - **The data-table realisation** (framework choice). TanStack Table, MUI DataGrid, AG Grid, hand-rolled `<table>`, or another. The ACs shape the outcome; the HOW is elicited at build time.
30
+ - **Server-side or client-side query adapter** (ADR-1802). Server-side default; client-side elicited alternative for small in-memory collections.
31
+ - **URL-state serialisation** (ADR-1802). Recommended default writes sort, filter and page into the URL; the session-scoped alternative is elicited for surfaces where deep-linking is undesirable.
32
+ - **Default page size** (ADR-1803). Default 25; elicit an override at apply.
33
+ - **Selection persistence across pages** (ADR-1804). Default `perPage`; `crossPage` elicited for high-cardinality bulk workflows.
34
+ - **Per-column filter dropdowns** (REQ-003). Which columns expose them, and what the value set is per column. Elicited at build.
35
+
36
+ ## Cost-honesty
37
+
38
+ Adds six REQs, nine USs (with 27 runtime-observable ACs), three TACs, four ADRs, one shipped probe pack, and one sample-app fixture to the shipped shelf. The runtime cost is one probe-pack run per shell FBS on the delivery-ci-workflows gate (approximately 5 to 15 seconds per pack invocation against a live server). No runtime dependency added to the applying project's `package.json`; the probe pack drives the browser the runner provisions through the pinned Playwright MCP or the project's own `playwright` when installed. The elicited parameters (data source shape, page size, URL-state, selection persistence) shape the applying project's surface without expanding the shipped shelf.
@@ -0,0 +1,240 @@
1
+ // application-datatable probe pack (v1.0.0).
2
+ //
3
+ // Six runtime-observable checks anchored to the blueprint's ACs:
4
+ // AC-17101-1 sort click reorders rows (server-side sort)
5
+ // AC-17102-1 filter chrome text-search issues q=<value> request
6
+ // AC-17103-2 pagination announcement via aria-live "Page N of M"
7
+ // AC-17104-3 bulk-action confirmation focus return
8
+ // AC-17105-1 state region distinctness (empty / loading / error / no-results)
9
+ // AC-17106-1 column reorder keyboard alternative
10
+ //
11
+ // Every check drives the real Playwright browser the runner injects
12
+ // (see rcf-lite src/browser-verify/pack-browser.js). Runs against a
13
+ // server-side implementation of the shell: a keyboard-reachable sort
14
+ // control, a text filter that issues fetch('/api/rows?q=...'),
15
+ // pagination with an aria-live status region, row selection with a
16
+ // bulk action that opens an aria-modal dialog and returns focus on
17
+ // close, four distinct query-driven states, and a non-drag column
18
+ // reorder path.
19
+
20
+ export default {
21
+ packName: 'application-datatable',
22
+ version: '1.0.0',
23
+ blueprintSlug: 'application-datatable',
24
+ // Applies to any FBS that realises the datatable shell TAC or whose
25
+ // navModel routes name a datatable path. The source references both
26
+ // `tacIds` and `route` so the loader's applicability source-scan
27
+ // (route / tacIds / blueprint: tag) sees the two legal seams.
28
+ appliesTo: ({ fbs }) => {
29
+ const routes = fbs?.designStage?.navModel?.routes ?? [];
30
+ const tacIds = fbs?.contextRequirements?.tacIds ?? [];
31
+ if (tacIds.includes('TAC-1801-application-datatable-shell')) return true;
32
+ return routes.some((r) => typeof r?.path === 'string' && /datatable-shell|\/dt(\/|$)/.test(r.path));
33
+ },
34
+ boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
35
+ checks: [
36
+ {
37
+ id: 'AC-17101-1',
38
+ severity: 'block',
39
+ description: 'Sort click reorders rendered rows to match server sort order',
40
+ run: async ({ browser, fetch, runtimeUrl }) => {
41
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
42
+ await browser.goto(runtimeUrl + '/');
43
+ const initialIds = await browser.evaluate(() =>
44
+ Array.from(document.querySelectorAll('table[role="grid"] tbody tr'))
45
+ .map((tr) => Number(tr.getAttribute('data-id'))));
46
+ if (!Array.isArray(initialIds) || initialIds.length === 0) {
47
+ return { verdict: 'fail', detail: 'no rows rendered: ' + JSON.stringify(initialIds) };
48
+ }
49
+ await browser.click('button.sortControl[data-column="score"]', 'score sort control');
50
+ // Give the client a beat to fetch and re-render.
51
+ await new Promise((resolve) => setTimeout(resolve, 500));
52
+ const sortedIds = await browser.evaluate(() =>
53
+ Array.from(document.querySelectorAll('table[role="grid"] tbody tr'))
54
+ .map((tr) => Number(tr.getAttribute('data-id'))));
55
+ const apiRes = await fetch(runtimeUrl + '/api/rows?sort=score:asc&page=1&pageSize=3');
56
+ const apiPayload = await apiRes.json();
57
+ const apiIds = apiPayload.rows.map((r) => r.id);
58
+ if (JSON.stringify(sortedIds) === JSON.stringify(initialIds)) {
59
+ return { verdict: 'fail', detail: 'sort click did not change row order: initial=' + JSON.stringify(initialIds) };
60
+ }
61
+ if (JSON.stringify(sortedIds) !== JSON.stringify(apiIds)) {
62
+ return { verdict: 'fail', detail: 'rendered order ' + JSON.stringify(sortedIds) + ' does not match server sort ' + JSON.stringify(apiIds) };
63
+ }
64
+ return { verdict: 'pass', detail: 'initial=' + JSON.stringify(initialIds) + ' sorted=' + JSON.stringify(sortedIds) };
65
+ },
66
+ },
67
+ {
68
+ id: 'AC-17102-1',
69
+ severity: 'block',
70
+ description: 'Filter chrome text search issues q=<value> request and narrows rendered rows',
71
+ run: async ({ browser, fetch, runtimeUrl }) => {
72
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
73
+ await browser.goto(runtimeUrl + '/');
74
+ await browser.type('input#filterInput', 'Alpha', 'filter input');
75
+ await new Promise((resolve) => setTimeout(resolve, 500));
76
+ const names = await browser.evaluate(() =>
77
+ Array.from(document.querySelectorAll('table[role="grid"] tbody tr td:nth-child(3)'))
78
+ .map((td) => td.textContent.trim()));
79
+ const apiRes = await fetch(runtimeUrl + '/api/rows?q=Alpha&page=1&pageSize=3');
80
+ const apiPayload = await apiRes.json();
81
+ if (apiPayload.q !== 'Alpha') {
82
+ return { verdict: 'fail', detail: 'server did not read q parameter; payload.q=' + JSON.stringify(apiPayload.q) };
83
+ }
84
+ const expected = apiPayload.rows.map((r) => r.name);
85
+ if (JSON.stringify(names) !== JSON.stringify(expected)) {
86
+ return { verdict: 'fail', detail: 'filter did not narrow rows: rendered=' + JSON.stringify(names) + ' expected=' + JSON.stringify(expected) };
87
+ }
88
+ return { verdict: 'pass', detail: 'filter q=Alpha rendered ' + JSON.stringify(names) };
89
+ },
90
+ },
91
+ {
92
+ id: 'AC-17103-2',
93
+ severity: 'block',
94
+ description: 'Pagination announcement uses an aria-live region reading Page N of M',
95
+ run: async ({ browser, runtimeUrl }) => {
96
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
97
+ await browser.goto(runtimeUrl + '/');
98
+ const initial = await browser.evaluate(() => {
99
+ const live = document.getElementById('paginationLive');
100
+ return { text: live?.textContent ?? '', ariaLive: live?.getAttribute('aria-live') ?? null };
101
+ });
102
+ if (initial.ariaLive !== 'polite') {
103
+ return { verdict: 'fail', detail: 'pagination status region missing aria-live=polite: ' + JSON.stringify(initial) };
104
+ }
105
+ if (!/^Page \d+ of \d+$/.test(initial.text)) {
106
+ return { verdict: 'fail', detail: 'initial pagination text does not match "Page N of M": ' + JSON.stringify(initial.text) };
107
+ }
108
+ await browser.click('button#pageNext', 'next page button');
109
+ await new Promise((resolve) => setTimeout(resolve, 500));
110
+ const next = await browser.evaluate(() => document.getElementById('paginationLive')?.textContent ?? '');
111
+ if (!/^Page 2 of \d+$/.test(next)) {
112
+ return { verdict: 'fail', detail: 'next-page announcement did not update: ' + JSON.stringify(next) };
113
+ }
114
+ return { verdict: 'pass', detail: 'initial=' + JSON.stringify(initial.text) + ' next=' + JSON.stringify(next) };
115
+ },
116
+ },
117
+ {
118
+ id: 'AC-17104-3',
119
+ severity: 'block',
120
+ description: 'Bulk-action confirmation dialog opens as aria-modal and returns focus to the originating row on close',
121
+ run: async ({ browser, runtimeUrl }) => {
122
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
123
+ await browser.goto(runtimeUrl + '/');
124
+ await browser.click('input.rowSelect[data-id="1"]', 'select row 1');
125
+ await browser.click('button#bulkAction', 'bulk action button');
126
+ await new Promise((resolve) => setTimeout(resolve, 300));
127
+ const opened = await browser.evaluate(() => {
128
+ const dialog = document.getElementById('bulkDialog');
129
+ return {
130
+ hidden: dialog?.hidden ?? true,
131
+ role: dialog?.getAttribute('role') ?? null,
132
+ ariaModal: dialog?.getAttribute('aria-modal') ?? null,
133
+ ariaLabelledBy: dialog?.getAttribute('aria-labelledby') ?? null,
134
+ ariaDescribedBy: dialog?.getAttribute('aria-describedby') ?? null,
135
+ focused: document.activeElement?.id ?? null,
136
+ };
137
+ });
138
+ if (opened.hidden || opened.role !== 'dialog' || opened.ariaModal !== 'true') {
139
+ return { verdict: 'fail', detail: 'dialog did not open with role=dialog and aria-modal=true: ' + JSON.stringify(opened) };
140
+ }
141
+ if (!opened.ariaLabelledBy || !opened.ariaDescribedBy) {
142
+ return { verdict: 'fail', detail: 'dialog missing aria-labelledby / aria-describedby: ' + JSON.stringify(opened) };
143
+ }
144
+ if (opened.focused !== 'bulkConfirm') {
145
+ return { verdict: 'fail', detail: 'confirm control did not receive focus on open: ' + JSON.stringify(opened) };
146
+ }
147
+ await browser.click('button#bulkCancel', 'cancel bulk');
148
+ await new Promise((resolve) => setTimeout(resolve, 300));
149
+ const closed = await browser.evaluate(() => ({
150
+ hidden: document.getElementById('bulkDialog')?.hidden ?? false,
151
+ focused: document.activeElement?.getAttribute?.('data-id') ?? document.activeElement?.id ?? null,
152
+ focusedTag: document.activeElement?.tagName ?? null,
153
+ focusedType: document.activeElement?.getAttribute?.('type') ?? null,
154
+ }));
155
+ if (!closed.hidden) {
156
+ return { verdict: 'fail', detail: 'dialog did not close: ' + JSON.stringify(closed) };
157
+ }
158
+ if (closed.focused !== '1' || closed.focusedType !== 'checkbox') {
159
+ return { verdict: 'fail', detail: 'focus did not return to row 1 checkbox: ' + JSON.stringify(closed) };
160
+ }
161
+ return { verdict: 'pass', detail: 'dialog open+close: opened=' + JSON.stringify(opened) + ' closed=' + JSON.stringify(closed) };
162
+ },
163
+ },
164
+ {
165
+ id: 'AC-17105-1',
166
+ severity: 'block',
167
+ description: 'Empty, loading, error and no-results states each render a distinct role=region with aria-live=polite',
168
+ run: async ({ browser, runtimeUrl }) => {
169
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
170
+ const states = [
171
+ { name: 'empty', url: runtimeUrl + '/?state=empty', expectId: 'emptyRegion' },
172
+ { name: 'loading', url: runtimeUrl + '/?state=loading', expectId: 'loadingRegion' },
173
+ { name: 'error', url: runtimeUrl + '/?state=error', expectId: 'errorRegion' },
174
+ ];
175
+ const observed = [];
176
+ for (const state of states) {
177
+ await browser.goto(state.url);
178
+ const info = await browser.evaluate((id) => {
179
+ const el = document.getElementById(id);
180
+ if (!el) return { present: false };
181
+ return {
182
+ present: true,
183
+ role: el.getAttribute('role'),
184
+ ariaLive: el.getAttribute('aria-live'),
185
+ };
186
+ }, state.expectId);
187
+ if (!info.present || info.role !== 'region' || info.ariaLive !== 'polite') {
188
+ return { verdict: 'fail', detail: 'state ' + state.name + ' missing region+aria-live: ' + JSON.stringify(info) };
189
+ }
190
+ observed.push({ state: state.name, info });
191
+ }
192
+ await browser.goto(runtimeUrl + '/?q=ZZZ');
193
+ await new Promise((resolve) => setTimeout(resolve, 400));
194
+ const noResults = await browser.evaluate(() => {
195
+ const el = document.getElementById('noResultsRegion');
196
+ if (!el) return { present: false };
197
+ return {
198
+ present: true,
199
+ hidden: el.hidden,
200
+ role: el.getAttribute('role'),
201
+ ariaLive: el.getAttribute('aria-live'),
202
+ };
203
+ });
204
+ if (!noResults.present || noResults.role !== 'region' || noResults.ariaLive !== 'polite') {
205
+ return { verdict: 'fail', detail: 'no-results region shape wrong: ' + JSON.stringify(noResults) };
206
+ }
207
+ return { verdict: 'pass', detail: 'observed=' + JSON.stringify(observed) + ' noResults=' + JSON.stringify(noResults) };
208
+ },
209
+ },
210
+ {
211
+ id: 'AC-17106-1',
212
+ severity: 'block',
213
+ description: 'Column reorder has a non-drag keyboard-reachable path (WCAG 2.5.7)',
214
+ run: async ({ browser, runtimeUrl }) => {
215
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
216
+ await browser.goto(runtimeUrl + '/');
217
+ const buttons = await browser.evaluate(() =>
218
+ Array.from(document.querySelectorAll('button.columnMove')).map((b) => ({
219
+ column: b.getAttribute('data-column'),
220
+ direction: b.getAttribute('data-direction'),
221
+ ariaLabel: b.getAttribute('aria-label'),
222
+ tag: b.tagName,
223
+ })));
224
+ if (buttons.length === 0) {
225
+ return { verdict: 'fail', detail: 'no keyboard column-move buttons found' };
226
+ }
227
+ const initialOrder = await browser.evaluate(() =>
228
+ Array.from(document.querySelectorAll('table[role="grid"] thead th[data-column]')).map((th) => th.getAttribute('data-column')));
229
+ await browser.click('button.columnMove[data-column="score"][data-direction="left"]', 'move score left');
230
+ await new Promise((resolve) => setTimeout(resolve, 300));
231
+ const afterOrder = await browser.evaluate(() =>
232
+ Array.from(document.querySelectorAll('table[role="grid"] thead th[data-column]')).map((th) => th.getAttribute('data-column')));
233
+ if (JSON.stringify(initialOrder) === JSON.stringify(afterOrder)) {
234
+ return { verdict: 'fail', detail: 'column reorder button did not change header order: ' + JSON.stringify(initialOrder) };
235
+ }
236
+ return { verdict: 'pass', detail: 'initial=' + JSON.stringify(initialOrder) + ' after=' + JSON.stringify(afterOrder) + ' buttons=' + JSON.stringify(buttons.length) };
237
+ },
238
+ },
239
+ ],
240
+ };
@@ -0,0 +1,9 @@
1
+ # application-empty-error-states CHANGELOG
2
+
3
+ ## 1.0.0 (visual round T-1, spec 2026-09-06)
4
+
5
+ - First ratified version of the shelf's empty-and-error-states blueprint. Five REQs (state catalogue with eight named states, recovery-action contract, announcement contract with role region and aria-live polite, least-privilege 5xx and 403 posture, offline state with write-buffer and reconnection semantics), eight USs 22101-22108 binding one runtime-observable AC per named state, three TACs 2301-2303 (state-machine, recovery-action router, offline write-buffer), three ADRs 2301-2303 (HTTP status contract per RFC 9110 as recommendedDefault, stack-trace visibility elicited with recommendedDefault true, offline strategy across write-buffer read-only-banner and refuse-writes elicited). No new global topics.
6
+ - Ships `probe-packs/application-empty-error-states.pack.mjs`: eight surface-observable browser-verify checks anchored one per named state (`AC-22101-1` not-found, `AC-22102-1` forbidden, `AC-22103-1` server-error, `AC-22104-1` permission-denied, `AC-22105-1` offline, `AC-22106-1` empty-list, `AC-22107-1` no-search-results, `AC-22108-1` error-boundary). Every URL is composed by the `withUrl(runtimeUrl, path)` helper per the round 3 T-3 fix train; no bare string concatenation. The pack-level `appliesTo` predicate references BOTH `tacIds` (TAC-2301) AND `route` (the operator-configured error-shell path glob).
7
+ - Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-empty-error-states/` with a Node HTTP server realising all eight states honestly under `/probe/<name>` and break switches (`?break=stack-trace`, `?break=leak-id`, `?break=no-recovery`, `?break=no-live-region`) driving the negative runs from a single boot. The fixture ships its own README naming PORT, every `?state=`, every `?break=`, the manual boot line and the two-line gate-reviewer boot.
8
+ - Declares `suggestedCompanions` `logging` (every rendered error state writes one request-scoped log line with the correlation identifier) and `errorHandling` (the error-boundary state constructs an internal error record from the caught exception). Does NOT declare `providesRoles` (leaf blueprint per spec; loader refuses an empty `providesRoles` array when set, so the leaf-blueprint intent is expressed by omitting the field). Does NOT declare `capabilities` and does NOT declare `requiresAppliedCapabilities` (no auth required).
9
+ - Sixth shipped consumer of T-0's probe-pack runner extension. T-3 `application-forms-wizard` consumes this blueprint for its "no in-progress forms" empty state; T-4 `application-account-settings` consumes this blueprint for its access-denied and empty-history states.