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,35 @@
1
+ {
2
+ "usId": "application-dashboard-US-19101",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-dashboard-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The dashboard shell renders the five required regions on every shipped surface",
8
+ "asA": "product owner responsible for the shipped dashboard surface",
9
+ "iWant": "the shell to render a tile row, a chart region, filter chrome, a timeframe picker and an export handle on every dashboard surface",
10
+ "soThat": "every REQ, TAC and pack check on this blueprint anchors onto a stable, inspectable shell structure rather than a floating layout convention",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-19101-1",
14
+ "description": "Given a rendered dashboard surface, the DOM carries five labelled `role=\"region\"` elements naming (via `aria-label` or an in-region `<h2>` header) the tile row, the chart region, the filter chrome, the timeframe picker and the export handle. A surface that omits one of the five regions either renders the region as an empty labelled `role=\"region\"` element the pack can inspect or supersedes REQ-001 with a project-authored REQ documenting the omission.",
15
+ "given": "a rendered dashboard surface",
16
+ "when": "the accessibility tree is read",
17
+ "then": "five labelled regions cover the tile row, the chart region, the filter chrome, the timeframe picker and the export handle",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-19101-2",
23
+ "description": "Given the shell's chart region, the rendered chart mounts through the application-charts render shell (TAC-1901): the chart region contains at least one `section.chartRegion[role=\"region\"]` element carrying the shape the application-charts pack asserts on (an `svg.chartSvg` and a paired `<table>` element in the same landmark). A chart region that renders a chart outside the render shell fails project-side review.",
24
+ "given": "the rendered chart region",
25
+ "when": "the mount seam is inspected",
26
+ "then": "the chart mounts through the application-charts render shell",
27
+ "testable": true,
28
+ "scope": "library"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2001-application-dashboard-tile-grid"],
32
+ "tags": ["blueprint:application-dashboard"],
33
+ "createdAt": "2026-09-04T22:10:00Z",
34
+ "updatedAt": "2026-09-04T22:10:00Z"
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "usId": "application-dashboard-US-19102",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-dashboard-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The primary KPI tile sits top-left in DOM order and in CSS Grid position across the ratified breakpoints",
8
+ "asA": "reader glancing at the shipped dashboard on a laptop, a tablet and a phone",
9
+ "iWant": "the primary KPI to land at the top-left first-fixation position on every ratified breakpoint",
10
+ "soThat": "the F-scan reading pattern lands on the primary KPI first, without a per-surface layout negotiation",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-19102-1",
14
+ "description": "Given a rendered dashboard surface at each of the three ratified viewports (1440, 1024, 360), the primary KPI tile (`data-tile-role=\"primary-kpi\"`) is the first tile in DOM order within the tile row region; at 1440 and 1024 the tile's computed CSS Grid `grid-column-start` is 1 and `grid-row-start` is 1; at 360 the tile row reflows to one column and the primary KPI's `grid-row-start` is 1 (the top row). The tile carries a `data-kpi-kind` attribute whose value is one of the ADR-2001 enum (revenue, active-users, error-rate, throughput, custom). Probed by the application-dashboard pack check AC-19102-1 (Playwright drives the browser to the dashboard route, resizes the viewport to each of the three widths, reads the DOM order and the computed CSS Grid position, and asserts every breakpoint places the primary KPI top-left).",
15
+ "given": "a rendered dashboard surface at 1440, 1024 and 360",
16
+ "when": "the DOM order and the computed CSS Grid position are read",
17
+ "then": "the primary KPI tile is first in DOM order and top-left in CSS Grid at each of the three widths",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-19102-2",
23
+ "description": "Given a rendered dashboard surface with no primary KPI tile, the surface either supersedes REQ-002 with a project-authored REQ documenting the omission or fails project-side review. This case is a documentation-and-review contract; the pack asserts the primary KPI tile exists (AC-19102-1) but does not itself enforce the fallback path.",
24
+ "given": "a rendered dashboard with no primary KPI tile",
25
+ "when": "the surface is reviewed",
26
+ "then": "the surface supersedes REQ-002 with a project-authored REQ or fails review",
27
+ "testable": true,
28
+ "scope": "library"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2001-application-dashboard-tile-grid"],
32
+ "tags": ["blueprint:application-dashboard"],
33
+ "createdAt": "2026-09-04T22:10:00Z",
34
+ "updatedAt": "2026-09-04T22:10:00Z"
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "usId": "application-dashboard-US-19103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-dashboard-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Every tile honours the four-state contract with distinct visuals, role region, aria-live polite and non-colour distinction",
8
+ "asA": "screen-reader user and colour-blind reader on the shipped dashboard",
9
+ "iWant": "every tile state (loading, empty, error, populated) to carry a distinct visual, a labelled region, an aria-live polite announcer and a non-colour distinction",
10
+ "soThat": "the tile's current state is reachable regardless of assistive tech and legible regardless of colour perception",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-19103-1",
14
+ "description": "Given a rendered tile in each of the four states (loading, empty, error, populated), the tile wraps its content in a `role=\"region\"` element carrying `aria-live=\"polite\"` and a labelled state descriptor (`data-tile-state=\"<state>\"`). The state's visual cue is not colour-only: loading carries a skeleton stripe or spinner element, empty carries a labelled empty-state block, error carries a labelled error block with the recorded reason, populated carries the metric value. Every state exposes its accessible name as `<tile title>, <state>` on the wrapping region. Probed by the application-dashboard pack check AC-19103-1 (Playwright drives to `?tile=<id>&state=<state>` for each of the four states on each of two tiles, reads the accessibility tree and the DOM, and asserts every state carries the role region, the aria-live polite, the data-tile-state attribute, and a non-colour visual cue).",
15
+ "given": "a tile switched into each of the four states",
16
+ "when": "the DOM and the accessibility tree are read",
17
+ "then": "each state carries role region, aria-live polite, data-tile-state, a non-colour visual cue and the announced name",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-19103-2",
23
+ "description": "Given a tile transitioning between states (loading to populated, populated to error) at runtime, the tile's `aria-live=\"polite\"` region announces the new state's accessible name to the assistive tech; the announcement text reads `<tile title>, <new state>` and the visual cue changes in the same paint. This AC is a runtime-observable behaviour on state transition; the pack does not simulate the transition today (the runner has no synthetic-event seam beyond click/type/press), so the AC is proven at project-side review and the README names the transition-observation gap under known mechanism-reach gaps.",
24
+ "given": "a tile transitioning between states",
25
+ "when": "the transition renders",
26
+ "then": "the aria-live polite region announces the new state's accessible name and the visual cue changes",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2001-application-dashboard-tile-grid"],
32
+ "tags": ["blueprint:application-dashboard"],
33
+ "createdAt": "2026-09-04T22:10:00Z",
34
+ "updatedAt": "2026-09-04T22:10:00Z"
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "usId": "application-dashboard-US-19104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-dashboard-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "A timeframe preset change refetches every tile and chart with the same boundary and updates the as-of stamp",
8
+ "asA": "operator changing the dashboard timeframe from last-7-days to last-30-days",
9
+ "iWant": "every tile and chart to refetch with the same from and to boundary and the same preset name",
10
+ "soThat": "the shell renders a coherent snapshot at one boundary and the as-of stamp reads the same on every tile",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-19104-1",
14
+ "description": "Given a rendered dashboard surface and an operator-driven timeframe preset change (click a preset control, or select a value from a timeframe menu), one refetch fires per tile and one per rendered chart; every fetch carries the same `from` boundary, the same `to` boundary and the same `preset` name in its query string; once every fetch has returned (or the timeout has elapsed) the shell updates one `data-as-of` attribute on the shell root and every tile carries the same `data-as-of` value in ISO-8601 form. Probed by the application-dashboard pack check AC-19104-1 (Playwright drives to the dashboard route, waits for the initial fetch batch, clicks the second preset control, waits for the new batch, reads the request log from `window.__dashboardFetches` and from `GET /__requests`, and asserts every fetch in the new batch carries the same from/to/preset trio and every tile carries the same `data-as-of` matching the shell root).",
15
+ "given": "a rendered dashboard surface and a timeframe preset change",
16
+ "when": "the request log and the DOM are read",
17
+ "then": "every refetch carries the same from/to/preset and every tile's data-as-of matches the shell root",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-19104-2",
23
+ "description": "Given a rendered dashboard with an operator-elicited auto-refresh interval (ADR-2002), the shell refetches on the same fan-out contract at the interval: every tile refetches with the same from/to/preset, the as-of stamp updates on the shell root and every tile. When no auto-refresh interval is elicited, the shell does not refresh unattended (a dashboard that refreshes every ten seconds without an operator opt-in is a defect). The pack asserts the initial default is auto-refresh off through a `data-auto-refresh` attribute on the shell root; a fixture whose default is on fails project-side review.",
24
+ "given": "a rendered dashboard with or without an elicited auto-refresh interval",
25
+ "when": "the shell renders",
26
+ "then": "auto-refresh is off unless the interval is elicited; refreshes follow the same fan-out contract",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2002-application-dashboard-filter-chrome"],
32
+ "tags": ["blueprint:application-dashboard"],
33
+ "createdAt": "2026-09-04T22:10:00Z",
34
+ "updatedAt": "2026-09-04T22:10:00Z"
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "usId": "application-dashboard-US-19105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-dashboard-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The filter chrome exposes accessible controls and refetches every tile with the same boundary",
8
+ "asA": "operator narrowing the dashboard with a filter chip or a filter input",
9
+ "iWant": "the filter chrome to expose accessible controls that carry the operator's choice to every fetch and refetch every tile with the same boundary",
10
+ "soThat": "the shell renders a filtered view at one boundary without drifting between tiles",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-19105-1",
14
+ "description": "Given a rendered dashboard surface with filter chrome, every filter control (chip, dropdown, search input) is a labelled interactive element (a `<button>`, a `<select>` or an `<input>`) with an accessible name; the controls are keyboard-reachable in reading order before the tile row; the operator's active filter selection is reflected on the shell as a `data-active-filters` attribute the pack can read. A filter chrome that ships hover-only controls (a hover-reveal menu on a mouseover element) fails project-side review.",
15
+ "given": "a rendered dashboard with filter chrome",
16
+ "when": "the accessibility tree is read",
17
+ "then": "every filter control is a labelled interactive element keyboard-reachable in reading order",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-19105-2",
23
+ "description": "Given an operator-driven filter change (activate a filter chip, type into a filter input), the shell issues one refetch per tile and one per rendered chart with the same `filter` query parameter set applied to every fetch; the shell's `data-active-filters` attribute updates on the same paint as the refetch batch. This AC is a runtime-observable fan-out clause; the pack asserts the fetch fan-out on the timeframe seam (AC-19104-1) which the fixture drives; the filter fan-out is a mechanism-reach gap the README names for a v1.1 minor bump.",
24
+ "given": "a rendered dashboard and a filter change",
25
+ "when": "the request log is read",
26
+ "then": "every refetch carries the same active-filters set and the shell attribute updates",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2002-application-dashboard-filter-chrome"],
32
+ "tags": ["blueprint:application-dashboard"],
33
+ "createdAt": "2026-09-04T22:10:00Z",
34
+ "updatedAt": "2026-09-04T22:10:00Z"
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "usId": "application-dashboard-US-19106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-dashboard-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The export handle exposes an accessible format list and delegates PNG-of-chart to the application-charts render shell",
8
+ "asA": "operator downloading the current dashboard slice",
9
+ "iWant": "an accessible export handle listing the available formats and delegating PNG-of-chart to the charts render shell",
10
+ "soThat": "export is keyboard-reachable, the format choice is explicit and the PNG output stays consistent with the rendered chart",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-19106-1",
14
+ "description": "Given a rendered dashboard surface, the export handle region contains one labelled `<button>` (accessible name reads `Export` or an operator-configured equivalent) that on activation exposes a keyboard-reachable list of formats (a menu, a listbox or a set of `<button>` elements). The rendered format list carries at least the three shipped formats (CSV, PDF, PNG-of-chart) unless ADR-2003's elicited override replaces the set; every format entry carries a `data-export-format` attribute whose value is one of `csv`, `pdf`, `png-chart` or the elicited value. Escape closes the list and returns focus to the export button. Hover-only export dropdowns fail project-side review.",
15
+ "given": "a rendered dashboard with an export handle",
16
+ "when": "the operator activates the export button",
17
+ "then": "an accessible format list opens with the shipped formats, keyboard-reachable, closable on Escape",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-19106-2",
23
+ "description": "Given a PNG-of-chart export selection, the export handle delegates the PNG generation to the application-charts render shell (TAC-1901): the handle names the chart the operator picked from the chart region (a `data-chart-id` reference on the format entry, or a runtime prompt asking which chart) and the charts shell owns the PNG output. A dashboard shell that ships its own PNG generator inside the dashboard code fails project-side review. This AC is a project-side contract; the pack does not exercise the PNG generation today (no download-capture seam on the pack browser), and the README names the delegation-observation gap under known mechanism-reach gaps.",
24
+ "given": "a PNG-of-chart export selection",
25
+ "when": "the export handle activates",
26
+ "then": "PNG generation delegates to the application-charts render shell",
27
+ "testable": true,
28
+ "scope": "library"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2003-application-dashboard-export-handle"],
32
+ "tags": ["blueprint:application-dashboard"],
33
+ "createdAt": "2026-09-04T22:10:00Z",
34
+ "updatedAt": "2026-09-04T22:10:00Z"
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "usId": "application-dashboard-US-19107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-dashboard-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The applying agent reads the packaged design-guidance asset and honours its ratified surface rules",
8
+ "asA": "agent applying the application-dashboard blueprint on a shipped surface",
9
+ "iWant": "a packaged design-guidance asset shipped with the blueprint that names what a good dashboard looks like",
10
+ "soThat": "the operator-facing design choices (primary KPI kind, tile count, when a table beats a chart, refresh cadence, anti-patterns) are documented in one place I read at apply time",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-19107-1",
14
+ "description": "The blueprint ships an operator-and-agent-readable design-guidance file at `assets/guidance/dashboard-design.md` covering the eight sections named in spec 5.3.1 (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns). Each section names whether the rule hardens into an AC on this blueprint (the section names the AC id) or stays operator guidance the applying agent honours at project-side review. The file cites at least five https:// sources from the five named source families (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs).",
15
+ "given": "the shipped blueprint",
16
+ "when": "the applying agent reads assets/guidance/dashboard-design.md",
17
+ "then": "the eight sections and the five https citations are present and each section names AC or guidance",
18
+ "testable": true,
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "AC-19107-2",
23
+ "description": "The dashboard shell's runtime shape reflects the rules the guidance hardens into ACs: the primary-KPI kind is one of the ADR-2001 enum values (asserted through `data-kpi-kind` on the primary tile; guidance section 1 hardens into AC-19102-1); the shell renders an `as of <ISO-8601>` stamp (guidance section 7 hardens into AC-19104-1); auto-refresh is off unless the elicited interval is set (guidance section 7 hardens into AC-19104-2). A shipped surface that violates any of these rules fails the corresponding pack check or project-side review.",
24
+ "given": "a rendered dashboard shell",
25
+ "when": "the shell is inspected against the guidance's hardened rules",
26
+ "then": "the shape honours the primary-KPI kind, the as-of stamp and the auto-refresh default",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2001-application-dashboard-tile-grid"],
32
+ "tags": ["blueprint:application-dashboard"],
33
+ "createdAt": "2026-09-04T22:10:00Z",
34
+ "updatedAt": "2026-09-04T22:10:00Z"
35
+ }
@@ -0,0 +1,50 @@
1
+ # application-dashboard: coordination vocabulary
2
+
3
+ ## Global topics
4
+
5
+ The blueprint claims no new global topics at v1.0.0. The dashboard-shell contract is a composed application shape; every ADR (primary-KPI kinds, timeframe presets, export formats) is non-global.
6
+
7
+ ## Deliberately unclaimed topics
8
+
9
+ - `dashboardShell` (the shell composition itself). Not a global topic; a second dashboard-shaped blueprint would either share TAC-2001 or supersede this blueprint.
10
+ - `kpiKind` (the primary-KPI kind enum). Reserved for the applying project as an elicited choice, not a global topic; a second dashboard-shaped blueprint that composes with a different enum would either supersede this blueprint or share the ADR.
11
+ - `refreshCadence` (the timeframe fan-out contract). The application-charts blueprint's ADR-1903 owns the reduced-motion posture; the dashboard's ADR-2002 owns the auto-refresh default. Neither is a global topic; a future observability-adjacent blueprint that composes on refresh cadence would claim its own.
12
+
13
+ ## Shelf id band and suffix block
14
+
15
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
16
+ |---|---|---|---|---|
17
+ | application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
18
+ | application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
19
+ | application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
20
+ | application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
21
+ | application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
22
+ | application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
23
+ | application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
24
+ | application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
25
+ | application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
26
+ | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
27
+ | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
28
+ | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
29
+
30
+ The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
31
+
32
+ ## Probe pack
33
+
34
+ `probe-packs/application-dashboard.pack.mjs` ships three checks anchored to blueprint AC ids:
35
+
36
+ - `AC-19102-1` primary-KPI position by DOM order and CSS Grid position at 1440, 1024 and 360
37
+ - `AC-19104-1` timeframe refetch fan-out with matching boundary and as-of stamp
38
+ - `AC-19103-1` per-tile four-state contract with role region, aria-live polite and non-colour distinction
39
+
40
+ Every check carries a `description` field per spec section 9. `appliesTo` binds `TAC-2001-application-dashboard-tile-grid` OR any FBS route matching an operator-configured dashboard-route glob. See `probe-packs/application-dashboard.pack.mjs` for the source; see `packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/README.md` for the sample-app fixture and the negative-run break switches.
41
+
42
+ ## Packaged design guidance
43
+
44
+ `assets/guidance/dashboard-design.md` is a shipped operator-and-agent-readable asset covering eight sections (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns) with five https-cited sources (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs). Each section names whether the rule hardens into an AC on this blueprint or stays operator guidance.
45
+
46
+ ## Consumers and dependencies
47
+
48
+ - Consumes `application-charts` (visual round T-2): the chart region on every dashboard surface mounts through the application-charts render shell (TAC-1901). The dashboard pack does not duplicate the chart-accessibility ACs; the charts pack fires on the dashboard's chart route through its own applicability predicate.
49
+ - References `application-datatable` (visual round T-1) in the packaged design guidance's section 6 ("when a table beats a chart"). A dashboard whose data really wants a records table applies the datatable blueprint instead of overloading the tile row.
50
+ - Extends the T-0 pack-browser seam with a `resize(width, height)` method; every blueprint after this one that ships a breakpoint-scoped visual AC reuses the seam.
@@ -0,0 +1,48 @@
1
+ # Guide: application-dashboard (v1.0.0)
2
+
3
+ ## What it is
4
+
5
+ A shipped, vendor-neutral analytics-dashboard contract for a rcf-lite application. One tile grid with primary-KPI hierarchy at the ratified breakpoints (TAC-2001), one timeframe picker and filter chrome with a refetch fan-out contract (TAC-2002), one export handle with format delegation to charts (TAC-2003), a packaged design-guidance asset the applying agent reads at apply, and a shipped Playwright probe pack that gates ship on the three runtime-observable surfaces the shelf assures: the primary KPI sits top-left at every ratified breakpoint, a timeframe change refetches every tile with the same boundary and one as-of stamp, and every tile honours the four-state contract with role region, aria-live polite and non-colour distinction.
6
+
7
+ ## What it deliberately is not
8
+
9
+ - Not a dashboard framework. The shell is a contract; the applying project picks React, Vue, Svelte or hand-authored DOM and writes the mount function against the same DOM contract.
10
+ - Not a chart library. The chart region delegates rendering to the application-charts render shell (TAC-1901); the shell contract and the accessibility ACs on that blueprint apply.
11
+ - Not a records table. When the reader wants to sort, filter, page, select or export a list of records, ship the application-datatable blueprint's table; the tile row is not a replacement.
12
+ - Not a data-source contract. The applying application-api-rest blueprint owns the wire endpoint; the dashboard shell reads the data it is given.
13
+
14
+ ## When to reach for it
15
+
16
+ - Any shipped surface that renders a mix of stat tiles and one or more charts with a shared timeframe control. Analytics dashboards, admin overview surfaces, per-organisation summary views, ops screens.
17
+ - Projects that want the primary-KPI-hierarchy discipline enforced at ship without hand-authoring per surface.
18
+ - Any project that already applies application-charts and needs the composed dashboard shape on top.
19
+
20
+ ## When it does not fit
21
+
22
+ - Print-only or export-only dashboard output where the runtime accessibility contract does not apply. A weekly PDF report pipeline is a separate concern.
23
+ - Highly bespoke dashboards outside the tile-row-plus-chart-region shape (a network-topology dashboard, a physical-space dashboard). Those supersede the blueprint with a project-authored shell contract naming the residuals.
24
+ - A dashboard that is really a records table with a header row. Apply application-datatable instead.
25
+
26
+ ## What a good outcome looks like
27
+
28
+ Every dashboard surface renders the five labelled regions. The primary KPI tile sits top-left in DOM order and top-left in CSS Grid at 1440, 1024 and 360. Every tile carries the four-state contract with a role region wrapper, an aria-live polite announcer and a non-colour visual cue distinct per state. A timeframe preset change fans out one refetch per tile with the same boundary, and the shell renders one shared as-of stamp every tile inherits. The export handle is a labelled button opening a keyboard-reachable format list; PNG-of-chart delegates to the application-charts render shell. Auto-refresh is off unless the operator elicited an interval. The shipped probe pack runs green on the delivery-ci-workflows gate.
29
+
30
+ ## The operator decisions that remain open
31
+
32
+ - **Primary-KPI kind** (ADR-2001). One of revenue, active-users, error-rate, throughput, custom. A `custom` value carries a short operator name.
33
+ - **Timeframe presets and auto-refresh** (ADR-2002). Three presets by recommendedDefault; operator elicits an override. Auto-refresh off unless the operator elicits an interval.
34
+ - **Export formats** (ADR-2003). Three formats by recommendedDefault (CSV, PDF, PNG-of-chart); operator elicits an override.
35
+ - **Tile inventory and slots**. The full tile list and each tile's CSS Grid slot.
36
+ - **Boundary scope**. Per-user, per-organisation or global; carried on every fetch record.
37
+
38
+ ## Common gotchas
39
+
40
+ - The primary KPI is a fixed enum (five values plus `custom` with a name). A free-form `data-kpi-kind` is refused at project-side review.
41
+ - The as-of stamp lives on the shell root and every tile carries the same value. A tile whose stamp drifts is a defect.
42
+ - Auto-refresh is off unless the operator opted in with an interval. A dashboard that refreshes every 30 seconds without an opt-in is a common accessibility and cost defect.
43
+ - The export handle carries no PNG generator of its own. PNG-of-chart delegates to the application-charts render shell; a project that ships a chart engine outside the render shell either supersedes the delegation or loses the PNG affordance.
44
+ - The pack fires on any FBS whose surface matches the `appliesTo` predicate. A page with no dashboard shape declares no dashboard route and no tile-grid TAC binding; the pack records `applicable: false`.
45
+
46
+ ## Cost honesty
47
+
48
+ Shipping this blueprint costs the project a design pass on the tile inventory (which tile is the primary KPI, how many supporting tiles) and an operator conversation on the timeframe and export sets. It buys the accessibility contract on every tile, the fan-out contract on every timeframe change, the packaged design guidance the applying agent reads at apply, and the probe pack that refuses ship on a broken tile grid or a drifted fan-out. The gate reviewer verifies the pack runs green against the sample-app fixture and reviews the applying project's own dashboard surface against the packaged guidance's eight sections.
@@ -0,0 +1,231 @@
1
+ // application-dashboard probe pack (v1.0.0).
2
+ //
3
+ // Three runtime-observable checks anchored to the blueprint's ACs:
4
+ // AC-19102-1 primary-KPI position (DOM order and CSS Grid position at 1440, 1024 and 360)
5
+ // AC-19104-1 timeframe refetch fan-out (every fetch same from/to/preset, matching as-of stamp)
6
+ // AC-19103-1 per-tile four-state contract (role region, aria-live polite, non-colour distinction)
7
+ //
8
+ // Every check drives the real Playwright browser the T-0 runner
9
+ // injects (packages/rcf-lite/src/browser-verify/pack-browser.js) and
10
+ // asserts on the DOM the applying project renders under the tile
11
+ // grid TAC (TAC-2001), the fan-out contract TAC (TAC-2002) and the
12
+ // four-state contract on every tile.
13
+ //
14
+ // The runner has no network-interception seam today, so fan-out
15
+ // evidence is captured through a request log the sample app exposes
16
+ // on `window.__dashboardFetches` and at `GET /__requests`; the pack
17
+ // reads both to reconcile the timeframe-preset refetch batch.
18
+ //
19
+ // The runner exposes viewport resize through pack-browser's
20
+ // `resize(width, height)` seam (T-3 extension): the primary-KPI
21
+ // position check drives 1440, 1024 and 360 through the same handle.
22
+
23
+ export default {
24
+ packName: 'application-dashboard',
25
+ version: '1.0.0',
26
+ blueprintSlug: 'application-dashboard',
27
+ // Applies to any FBS that realises the dashboard tile-grid TAC or
28
+ // whose navModel routes match an operator-configured dashboard
29
+ // route glob. The source references BOTH `tacIds` and `route` so
30
+ // the T-0 loader's applicability source-scan sees the two legal
31
+ // seams (route is one of the three legal predicates).
32
+ appliesTo: ({ fbs }) => {
33
+ const routes = fbs?.designStage?.navModel?.routes ?? [];
34
+ const tacIds = fbs?.contextRequirements?.tacIds ?? [];
35
+ if (tacIds.includes('TAC-2001-application-dashboard-tile-grid')) return true;
36
+ return routes.some((r) => typeof r?.path === 'string' && /dashboard/.test(r.path));
37
+ },
38
+ boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
39
+ checks: [
40
+ {
41
+ id: 'AC-19102-1',
42
+ severity: 'block',
43
+ description: 'Primary-KPI position: at 1440, 1024 and 360 the primary tile is first in DOM order within the tile row and lives at grid-column-start 1, grid-row-start 1 (at 360 the row-start is 1 after the one-column reflow)',
44
+ run: async ({ browser, runtimeUrl }) => {
45
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
46
+ if (typeof browser.resize !== 'function') {
47
+ return { verdict: 'fail', detail: 'packBrowser has no resize seam; the T-3 extension has not landed' };
48
+ }
49
+ const url = new URL('', runtimeUrl).toString();
50
+ const widths = [1440, 1024, 360];
51
+ const perWidth = [];
52
+ for (const width of widths) {
53
+ await browser.resize(width, 900);
54
+ await browser.goto(url);
55
+ const measurement = await browser.evaluate(() => {
56
+ const tileRow = document.querySelector('[data-region="tile-row"]');
57
+ if (!tileRow) return { error: 'no tile-row region' };
58
+ const tiles = Array.from(tileRow.querySelectorAll('[data-tile-id]'));
59
+ if (tiles.length === 0) return { error: 'tile row has no tiles' };
60
+ const primary = tiles.find((el) => el.getAttribute('data-tile-role') === 'primary-kpi');
61
+ if (!primary) return { error: 'no primary-kpi tile' };
62
+ const domIndex = tiles.indexOf(primary);
63
+ const style = window.getComputedStyle(primary);
64
+ const kpiKind = primary.getAttribute('data-kpi-kind');
65
+ const kpiName = primary.getAttribute('data-kpi-name');
66
+ return {
67
+ domIndex,
68
+ gridColumnStart: style.gridColumnStart,
69
+ gridRowStart: style.gridRowStart,
70
+ kpiKind,
71
+ kpiName,
72
+ tileCount: tiles.length,
73
+ tileIds: tiles.map((el) => el.getAttribute('data-tile-id')),
74
+ viewportWidth: window.innerWidth,
75
+ };
76
+ });
77
+ perWidth.push({ width, measurement });
78
+ }
79
+ const failures = perWidth.filter((r) => {
80
+ if (r.measurement.error) return true;
81
+ if (r.measurement.domIndex !== 0) return true;
82
+ if (r.measurement.gridRowStart !== '1') return true;
83
+ if (r.width === 1440 || r.width === 1024) {
84
+ if (r.measurement.gridColumnStart !== '1') return true;
85
+ }
86
+ return false;
87
+ });
88
+ if (failures.length > 0) {
89
+ return { verdict: 'fail', detail: 'primary-KPI position broke at: ' + JSON.stringify(failures) };
90
+ }
91
+ const enumValues = ['revenue', 'active-users', 'error-rate', 'throughput', 'custom'];
92
+ const kpiKind = perWidth[0].measurement.kpiKind;
93
+ if (!enumValues.includes(kpiKind)) {
94
+ return { verdict: 'fail', detail: 'primary-KPI data-kpi-kind not in ADR-2001 enum: ' + JSON.stringify(kpiKind) };
95
+ }
96
+ if (kpiKind === 'custom' && !perWidth[0].measurement.kpiName) {
97
+ return { verdict: 'fail', detail: 'primary-KPI kind is custom but data-kpi-name is missing' };
98
+ }
99
+ return { verdict: 'pass', detail: 'primary-KPI top-left at every breakpoint (tiles: ' + perWidth[0].measurement.tileCount + '): ' + JSON.stringify(perWidth.map((r) => ({ width: r.width, kind: r.measurement.kpiKind, domIndex: r.measurement.domIndex, gcs: r.measurement.gridColumnStart, grs: r.measurement.gridRowStart, tiles: r.measurement.tileCount }))) };
100
+ },
101
+ },
102
+ {
103
+ id: 'AC-19104-1',
104
+ severity: 'block',
105
+ description: 'Timeframe refetch fan-out: a preset change issues one refetch per tile and per chart with the same from/to/preset trio, and every tile updates data-as-of matching the shell root',
106
+ run: async ({ browser, runtimeUrl }) => {
107
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
108
+ const url = new URL('', runtimeUrl).toString();
109
+ await browser.resize(1440, 900);
110
+ await browser.goto(url);
111
+ const initial = await browser.evaluate(() => {
112
+ const preset = document.querySelector('[data-region="timeframe-picker"]');
113
+ const buttons = preset ? Array.from(preset.querySelectorAll('[data-preset]')) : [];
114
+ const initialPresets = buttons.map((b) => b.getAttribute('data-preset'));
115
+ return {
116
+ initialPresets,
117
+ initialFetches: (window.__dashboardFetches || []).slice(),
118
+ initialAsOf: document.querySelector('[data-region="shell-root"]')?.getAttribute('data-as-of') || null,
119
+ };
120
+ });
121
+ if (!initial.initialPresets || initial.initialPresets.length < 2) {
122
+ return { verdict: 'fail', detail: 'timeframe picker missing or has fewer than two presets: ' + JSON.stringify(initial.initialPresets) };
123
+ }
124
+ const target = initial.initialPresets.find((p) => p !== 'last-7-days') || initial.initialPresets[1];
125
+ await browser.click('[data-region="timeframe-picker"] [data-preset="' + target + '"]');
126
+ await browser.evaluate((preset) => new Promise((resolve) => {
127
+ const start = Date.now();
128
+ const check = () => {
129
+ const root = document.querySelector('[data-region="shell-root"]');
130
+ const currentPreset = root && root.getAttribute('data-current-preset');
131
+ const fetches = window.__dashboardFetches || [];
132
+ const last = fetches[fetches.length - 1];
133
+ if (currentPreset === preset && last && last.preset === preset) return resolve(true);
134
+ if (Date.now() - start > 5000) return resolve(false);
135
+ setTimeout(check, 40);
136
+ };
137
+ check();
138
+ }), target);
139
+ const evidence = await browser.evaluate((initialCount) => {
140
+ const root = document.querySelector('[data-region="shell-root"]');
141
+ const fetches = (window.__dashboardFetches || []).slice(initialCount);
142
+ const tileRow = document.querySelector('[data-region="tile-row"]');
143
+ const tiles = tileRow ? Array.from(tileRow.querySelectorAll('[data-tile-id]')) : [];
144
+ return {
145
+ fetches,
146
+ tileAsOfs: tiles.map((el) => ({ tileId: el.getAttribute('data-tile-id'), asOf: el.getAttribute('data-as-of') })),
147
+ shellAsOf: root ? root.getAttribute('data-as-of') : null,
148
+ shellPreset: root ? root.getAttribute('data-current-preset') : null,
149
+ targetPreset: root ? root.getAttribute('data-current-preset') : null,
150
+ };
151
+ }, initial.initialFetches.length);
152
+ try {
153
+ const requestsRes = await fetch(new URL('/__requests', runtimeUrl).toString());
154
+ if (requestsRes.status !== 200) {
155
+ return { verdict: 'fail', detail: '/__requests endpoint returned ' + requestsRes.status };
156
+ }
157
+ await requestsRes.json();
158
+ } catch (err) {
159
+ return { verdict: 'fail', detail: '/__requests endpoint unreachable: ' + err.message };
160
+ }
161
+ const newBatch = evidence.fetches;
162
+ if (newBatch.length === 0) {
163
+ return { verdict: 'fail', detail: 'no fetches recorded after timeframe change' };
164
+ }
165
+ const first = newBatch[0];
166
+ const drift = newBatch.filter((f) => f.from !== first.from || f.to !== first.to || f.preset !== first.preset);
167
+ if (drift.length > 0) {
168
+ return { verdict: 'fail', detail: 'fan-out drifted boundary or preset: ' + JSON.stringify({ first, drift }) };
169
+ }
170
+ if (!evidence.shellAsOf) {
171
+ return { verdict: 'fail', detail: 'shell root missing data-as-of after fan-out' };
172
+ }
173
+ const stampDrift = evidence.tileAsOfs.filter((t) => t.asOf !== evidence.shellAsOf);
174
+ if (stampDrift.length > 0) {
175
+ return { verdict: 'fail', detail: 'tile data-as-of drifted from shell: ' + JSON.stringify(stampDrift) };
176
+ }
177
+ const isoRe = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/;
178
+ if (!isoRe.test(evidence.shellAsOf)) {
179
+ return { verdict: 'fail', detail: 'shell data-as-of not ISO-8601: ' + JSON.stringify(evidence.shellAsOf) };
180
+ }
181
+ return { verdict: 'pass', detail: 'timeframe fan-out coherent: ' + JSON.stringify({ preset: first.preset, from: first.from, to: first.to, fetches: newBatch.length, shellAsOf: evidence.shellAsOf, tiles: evidence.tileAsOfs.length }) };
182
+ },
183
+ },
184
+ {
185
+ id: 'AC-19103-1',
186
+ severity: 'block',
187
+ description: 'Per-tile four-state contract: every tile renders each of loading, empty, error and populated inside role region with aria-live polite, a data-tile-state attribute, and a non-colour visual cue distinct per state',
188
+ run: async ({ browser, runtimeUrl }) => {
189
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
190
+ const states = ['loading', 'empty', 'error', 'populated'];
191
+ const perState = [];
192
+ const url = new URL('', runtimeUrl).toString();
193
+ await browser.resize(1440, 900);
194
+ for (const state of states) {
195
+ const target = new URL('', runtimeUrl);
196
+ target.searchParams.set('tile', 'primary');
197
+ target.searchParams.set('state', state);
198
+ await browser.goto(target.toString());
199
+ const measurement = await browser.evaluate((expectedState) => {
200
+ const tile = document.querySelector('[data-tile-id="primary"]');
201
+ if (!tile) return { error: 'no primary tile' };
202
+ const region = tile.matches('[role="region"]') ? tile : tile.querySelector('[role="region"]');
203
+ if (!region) return { error: 'primary tile missing role=region wrapper' };
204
+ const ariaLive = region.getAttribute('aria-live');
205
+ const actualState = region.getAttribute('data-tile-state') || tile.getAttribute('data-tile-state');
206
+ const visualCue = tile.querySelector('[data-state-cue]');
207
+ const cueKind = visualCue ? visualCue.getAttribute('data-state-cue') : null;
208
+ const accessibleName = region.getAttribute('aria-label') || region.textContent.trim().slice(0, 120);
209
+ return { expectedState, actualState, ariaLive, cueKind, accessibleName, cueHasContent: Boolean(visualCue && visualCue.textContent.trim().length > 0) };
210
+ }, state);
211
+ perState.push({ state, measurement });
212
+ }
213
+ const failures = perState.filter((r) => {
214
+ if (r.measurement.error) return true;
215
+ if (r.measurement.ariaLive !== 'polite') return true;
216
+ if (r.measurement.actualState !== r.state) return true;
217
+ if (!r.measurement.cueKind || r.measurement.cueKind !== r.state) return true;
218
+ return false;
219
+ });
220
+ if (failures.length > 0) {
221
+ return { verdict: 'fail', detail: 'four-state contract broke on: ' + JSON.stringify(failures) };
222
+ }
223
+ const cueKinds = new Set(perState.map((r) => r.measurement.cueKind));
224
+ if (cueKinds.size !== states.length) {
225
+ return { verdict: 'fail', detail: 'state visual cues not distinct across states: ' + JSON.stringify(perState.map((r) => ({ state: r.state, cue: r.measurement.cueKind }))) };
226
+ }
227
+ return { verdict: 'pass', detail: 'four-state contract honoured across: ' + JSON.stringify(perState.map((r) => ({ state: r.state, cue: r.measurement.cueKind, ariaLive: r.measurement.ariaLive }))) };
228
+ },
229
+ },
230
+ ],
231
+ };
@@ -0,0 +1,8 @@
1
+ # application-datatable CHANGELOG
2
+
3
+ ## 1.0.0 (visual round T-1, spec 2026-09-04)
4
+
5
+ - First ratified version of the shelf's datatable blueprint. Six REQs (table shell, sort semantics, filter chrome, selection and bulk actions, empty / loading / error / no-results states, column visibility / reorder / resize), nine USs binding 27 runtime-observable ACs, three TACs (shell, query adapter, selection model), four ADRs (pattern choice, URL state, page size, selection persistence). No new global topics.
6
+ - Ships `probe-packs/application-datatable.pack.mjs`: six browser-verify checks anchored to AC-17101-1, AC-17102-1, AC-17103-2, AC-17104-3, AC-17105-1, AC-17106-1. First blueprint on the shelf that ships a Playwright probe pack under the T-0 runner extension.
7
+ - Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-datatable/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the gate reviewer drives.
8
+ - Suggests the `logging` and `errorHandling` companions with the ratified spec's reasons.