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,47 @@
1
+ # Guide: application-notifications-in-app (v1.0.0)
2
+
3
+ ## What it is
4
+
5
+ A shipped, vendor-neutral in-app-notifications contract for a rcf-lite application. Ships the live-region preseeding discipline (TAC-2101), the transient-toast contract with the priority-to-role mapping (ADR-2101) and the WCAG 2.2.1 six-second timeout floor (ADR-2102), the notification-centre inbox with the ADR-2103 retention window and the per-item acknowledge round-trip (TAC-2102), the per-user preferences UI with category silence and sibling-channel delegation (TAC-2103), and the delivery-attempt log write path (REQ-005, TAC-2102). Ships a Playwright probe pack that gates ship on the three runtime-observable surfaces the shelf assures: both live-region wrappers are preseeded on every declared route before any notification fires, every toast maps priority to the correct wrapper and role with an announcement measured against the six-second floor, and every centre acknowledge control round-trips to the server with the DOM updating on the response.
6
+
7
+ ## What it deliberately is not
8
+
9
+ - Not a notifications transport. The in-app slug is the discriminator; sibling channel blueprints under the reserved `application-notifications-` family prefix ship their own transports. This blueprint ships no email, no Web Push, no webhook.
10
+ - Not a notifications store. The delivery-attempt log's persistence layer is the applied `logging` companion's; this blueprint owns the row shape and delegates the write path.
11
+ - Not a preferences store. The preferences UI records intent on the surface (category silence, digest opt-in); the store where those preferences persist is the applying project's, and each sibling channel blueprint reads its own share of the intent.
12
+
13
+ ## When to reach for it
14
+
15
+ - Any shipped rcf-lite application whose operators need transient toasts, a durable notification centre and per-user category silence. Web SaaS applications, admin consoles, dashboards with alerting.
16
+ - Projects that want the WCAG 4.1.3 status-message discipline and the WCAG 2.2.1 timeout floor enforced at ship without hand-authoring the live-region contract.
17
+ - Projects that expect to add sibling channels (email digest, Web Push, webhooks) later: the family-prefix reservation and the preferences UI's sibling-delegation shape land the discipline early.
18
+
19
+ ## When it does not fit
20
+
21
+ - Server-to-server notifications with no operator surface. If nobody reads the notification on a screen, this blueprint's contract is expensive noise; use a logging blueprint alone.
22
+ - A project whose notifications are single-channel and channel-first (an SMS-only alert product) where the in-app slot is not the primary surface. The sibling channel blueprint is the fit; the in-app blueprint composes later if the surface grows.
23
+ - Highly bespoke chat-like surfaces (a support-inbox blueprint, a workflow-review inbox) where the accessibility contract differs from the WCAG 4.1.3 status-message discipline. Supersede this blueprint with a project-authored REQ naming the residual, or apply a different chat-oriented blueprint.
24
+
25
+ ## What a good outcome looks like
26
+
27
+ Every route the applying project ships preseeds both live-region wrappers in the DOM at page load; no announcement race is possible. Every toast writes into exactly one wrapper based on its priority (info to polite as `role="status"`, error to assertive as `role="alert"`) and stays visible for six seconds unless dismissed; the reader hears an interruption exactly when the application asserts one. The notification centre lists notifications within the retention window with every item Tab-reachable and every acknowledge round-tripping to the server. The preferences UI carries per-category silence toggles and clearly labels any sibling channel that is not yet applied. The shipped probe pack runs green on the delivery-ci-workflows gate.
28
+
29
+ ## The operator decisions that remain open
30
+
31
+ - **Toast timeout floor** (ADR-2102). Six seconds by default; operator elicits a longer dwell time if the surface has a very high notification volume.
32
+ - **Notification categories** (REQ-004). Payment, security and product are the shipped default categories on the fixture; the operator elicits their own category list at apply.
33
+ - **Centre retention window** (ADR-2103). Thirty days by default; operator elicits a longer or shorter window at apply.
34
+ - **Notification centre route path** (REQ-003 note). `/notifications-centre` by default; operator elicits an override for a bespoke route.
35
+ - **Sibling channels applied** (REQ-004 note). Which of `-email`, `-push`, `-webhook` (or a project-authored sibling) is applied on the project; discovered, not elicited, from the manifest.
36
+
37
+ ## Common gotchas
38
+
39
+ - The two live-region wrappers must be preseeded before the first notification. A lazy-mount defect is silent at the DOM (the wrapper appears "eventually") but loses the first announcement at the assistive-technology layer. The pack refuses ship on this shape.
40
+ - The priority-to-role mapping is fixed at v1.0.0 (info to polite/status, error to assertive/alert). A third priority (`warning`) is a v1.1 minor bump because it changes the role vocabulary; free-form priorities are refused at project-side review.
41
+ - The toast timeout floor is a floor, not a ceiling. Six seconds is the default; an operator-elicited value above the floor is honoured (thirty seconds), a value below the floor is refused at apply. The pack measures the actual elapsed time against the shell root's declared floor and against the six-second baseline; both must clear.
42
+ - The centre enumerates items by `data-notification-id`, per the T-3 gate discipline. A centre implementation that uses only `role="listitem"` on the children (without a per-element id attribute) passes the accessibility contract but does not let the pack enumerate individual items reliably; ship both.
43
+ - The family-prefix reservation is documented; naming a future notifications blueprint outside the family (`application-alerts-email`) reads against the reservation and stops at author-side review.
44
+
45
+ ## Cost honesty
46
+
47
+ Shipping this blueprint costs the project a design pass on the notification categories and retention window, and a build pass on the live-region factory and the centre inbox surface. It buys the WCAG 4.1.3 and WCAG 2.2.1 disciplines enforced at ship, the ARIA APG alert pattern on the assertive slot, the centre inbox with the acknowledge round-trip, the preferences UI with sibling delegation, and the family-prefix reservation that survives when the shelf grows a second notifications channel. The gate reviewer verifies the pack runs green against the sample-app fixture and reviews the applying project's own notifications surfaces against the ADR set.
@@ -0,0 +1,328 @@
1
+ // application-notifications-in-app probe pack (v1.0.0).
2
+ //
3
+ // Three runtime-observable checks anchored to the blueprint's ACs:
4
+ // AC-20101-1 live-region preseeding (both wrappers present AND empty
5
+ // at load on every declared route)
6
+ // AC-20102-1 transient toast contract (priority-to-role mapping,
7
+ // one-shot announcement, timeout measured against the
8
+ // ADR-2102 six-second floor via data-shown-at /
9
+ // data-dismissed-at timestamps rather than a sleep in
10
+ // the pack)
11
+ // AC-20103-1 centre acknowledge round-trip (Tab-reachable acknowledge
12
+ // control POSTs to the server, the server responds, the
13
+ // DOM updates in response; enumerated by data-notification-id
14
+ // per the T-3 gate discipline, never by role alone)
15
+ //
16
+ // Every check drives the real Playwright browser the T-0 runner
17
+ // injects (packages/rcf-lite/src/browser-verify/pack-browser.js) and
18
+ // asserts on the DOM the applying project renders under TAC-2101
19
+ // (live-region wrappers and toast factory), TAC-2102 (centre inbox
20
+ // and acknowledge round-trip) and the priority-to-role mapping per
21
+ // ADR-2101.
22
+ //
23
+ // The pack has no network-interception seam (T-0 shipped none); the
24
+ // acknowledge round-trip is captured through the request log the
25
+ // sample app exposes on window.__notificationFetches and at
26
+ // GET /__requests. The toast timeout is measured with browser.evaluate
27
+ // reading timestamps the sample app records on the toast element
28
+ // (data-shown-at and data-dismissed-at), polled with a bounded loop
29
+ // so the pack does not sleep for six seconds on the happy path.
30
+
31
+ export default {
32
+ packName: 'application-notifications-in-app',
33
+ version: '1.0.0',
34
+ blueprintSlug: 'application-notifications-in-app',
35
+ // Applies to any FBS that realises the live-region TAC or whose
36
+ // navModel routes include a notifications-centre path. The source
37
+ // references BOTH `tacIds` and `route` so the T-0 loader's
38
+ // applicability source-scan sees the two legal seams (route is one
39
+ // of the three legal predicates).
40
+ appliesTo: ({ fbs }) => {
41
+ const routes = fbs?.designStage?.navModel?.routes ?? [];
42
+ const tacIds = fbs?.contextRequirements?.tacIds ?? [];
43
+ if (tacIds.includes('TAC-2101-application-notifications-in-app-live-region')) return true;
44
+ return routes.some((r) => typeof r?.path === 'string' && /notifications-centre/.test(r.path));
45
+ },
46
+ boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
47
+ checks: [
48
+ {
49
+ id: 'AC-20101-1',
50
+ severity: 'block',
51
+ description: 'Live-region preseeded on every declared route: both the polite wrapper ([aria-live="polite"] [data-live-region="polite"]) and the assertive wrapper ([role="alert"] [data-live-region="assertive"]) are preseeded and empty in the DOM at page load, before any notification fires. Enumerated by the per-element [data-live-region] attribute (never by aria-live or role alone).',
52
+ run: async ({ browser, runtimeUrl }) => {
53
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
54
+ const routes = ['/', '/notifications-centre', '/notifications-preferences'];
55
+ const perRoute = [];
56
+ for (const path of routes) {
57
+ // Preserve the reviewer's --url query verbatim across every
58
+ // route navigation: swap the pathname, keep the search.
59
+ const target = new URL(runtimeUrl);
60
+ target.pathname = path;
61
+ await browser.goto(target.toString());
62
+ const measurement = await browser.evaluate(() => {
63
+ const polite = document.querySelector('[data-live-region="polite"]');
64
+ const assertive = document.querySelector('[data-live-region="assertive"]');
65
+ function inspect(el) {
66
+ if (!el) return null;
67
+ return {
68
+ tag: el.tagName,
69
+ ariaLive: el.getAttribute('aria-live'),
70
+ role: el.getAttribute('role'),
71
+ dataLiveRegion: el.getAttribute('data-live-region'),
72
+ childCount: el.childElementCount,
73
+ textLength: (el.textContent || '').trim().length,
74
+ };
75
+ }
76
+ return { polite: inspect(polite), assertive: inspect(assertive) };
77
+ });
78
+ perRoute.push({ path, measurement });
79
+ }
80
+ const failures = [];
81
+ for (const entry of perRoute) {
82
+ if (!entry.measurement.polite) {
83
+ failures.push({ path: entry.path, reason: 'polite wrapper missing at page load (preseeded wrappers are required per Sara Soueidan normative guidance)' });
84
+ continue;
85
+ }
86
+ if (!entry.measurement.assertive) {
87
+ failures.push({ path: entry.path, reason: 'assertive wrapper missing at page load' });
88
+ continue;
89
+ }
90
+ if (entry.measurement.polite.ariaLive !== 'polite') {
91
+ failures.push({ path: entry.path, reason: 'polite wrapper missing aria-live="polite"' });
92
+ }
93
+ if (entry.measurement.assertive.role !== 'alert') {
94
+ failures.push({ path: entry.path, reason: 'assertive wrapper missing role="alert"' });
95
+ }
96
+ if (entry.measurement.polite.textLength > 0 || entry.measurement.polite.childCount > 0) {
97
+ failures.push({ path: entry.path, reason: 'polite wrapper carries content at page load (must be empty until a notification fires)' });
98
+ }
99
+ if (entry.measurement.assertive.textLength > 0 || entry.measurement.assertive.childCount > 0) {
100
+ failures.push({ path: entry.path, reason: 'assertive wrapper carries content at page load (must be empty until a notification fires)' });
101
+ }
102
+ }
103
+ if (failures.length > 0) {
104
+ return { verdict: 'fail', detail: 'live-region preseeded contract broken: ' + JSON.stringify(failures) };
105
+ }
106
+ return { verdict: 'pass', detail: 'live-region wrappers preseeded and empty on every declared route: ' + JSON.stringify(perRoute.map((r) => ({ path: r.path, polite: r.measurement.polite, assertive: r.measurement.assertive }))) };
107
+ },
108
+ },
109
+ {
110
+ id: 'AC-20102-1',
111
+ severity: 'block',
112
+ description: 'Transient toast contract: an info-priority toast renders inside the polite wrapper with role="status", an error-priority toast renders inside the assertive wrapper with role="alert" (per ADR-2101 priority-to-role mapping); every toast body appears in exactly one wrapper (never both); every toast records data-shown-at and data-dismissed-at, and a timeout-dismissed toast carries an elapsed time at or above the ADR-2102 six-second floor per WCAG 2.2.1.',
113
+ run: async ({ browser, runtimeUrl }) => {
114
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
115
+ const target = new URL('', runtimeUrl).toString();
116
+ await browser.goto(target);
117
+ // Read the shell's declared timeout floor (defaults to six
118
+ // seconds per ADR-2102; may be overridden above the floor).
119
+ const shellFloorSeconds = await browser.evaluate(() => {
120
+ const root = document.querySelector('[data-region="shell-root"]');
121
+ const value = root && root.getAttribute('data-toast-timeout-floor-seconds');
122
+ return value ? Number(value) : 6;
123
+ });
124
+ // Fire one info toast and one error toast through the triggers
125
+ // the fixture ships; a real applying project may drive the
126
+ // same shape via a click on its own trigger, an evaluate hook,
127
+ // or a background-event dispatch.
128
+ await browser.click('[data-toast-trigger="info"]');
129
+ await browser.click('[data-toast-trigger="error"]');
130
+ // Poll for both toasts to dismiss (bounded loop; cap slightly
131
+ // above the shell's floor so a six-second floor passes and a
132
+ // two-second break-timeout run still finishes in time).
133
+ const capMs = Math.max(shellFloorSeconds * 1000, 6000) + 3500;
134
+ const outcome = await browser.evaluate(async (capMs) => {
135
+ const start = Date.now();
136
+ function toastState() {
137
+ const infoToast = document.querySelector('[data-toast-priority="info"]');
138
+ const errorToast = document.querySelector('[data-toast-priority="error"]');
139
+ return { infoToast, errorToast };
140
+ }
141
+ return await new Promise((resolve) => {
142
+ function tick() {
143
+ const { infoToast, errorToast } = toastState();
144
+ const infoDismissedAt = infoToast && infoToast.getAttribute('data-dismissed-at');
145
+ const errorDismissedAt = errorToast && errorToast.getAttribute('data-dismissed-at');
146
+ if (infoDismissedAt && errorDismissedAt) {
147
+ resolve({ done: true });
148
+ return;
149
+ }
150
+ if (Date.now() - start > capMs) {
151
+ resolve({ done: false });
152
+ return;
153
+ }
154
+ setTimeout(tick, 60);
155
+ }
156
+ tick();
157
+ });
158
+ }, capMs);
159
+ if (!outcome || !outcome.done) {
160
+ return { verdict: 'fail', detail: 'toasts did not dismiss within the polling cap (' + capMs + 'ms); the shell may have failed to fire the toast timer' };
161
+ }
162
+ const evidence = await browser.evaluate(() => {
163
+ const politeWrapper = document.querySelector('[data-live-region="polite"]');
164
+ const assertiveWrapper = document.querySelector('[data-live-region="assertive"]');
165
+ function inspect(el) {
166
+ if (!el) return null;
167
+ return {
168
+ id: el.getAttribute('data-toast-id'),
169
+ priority: el.getAttribute('data-toast-priority'),
170
+ role: el.getAttribute('role'),
171
+ parentDataLiveRegion: el.parentElement && el.parentElement.getAttribute('data-live-region'),
172
+ shownAt: el.getAttribute('data-shown-at'),
173
+ dismissedAt: el.getAttribute('data-dismissed-at'),
174
+ body: (el.textContent || '').trim(),
175
+ };
176
+ }
177
+ function texts(wrapper) {
178
+ if (!wrapper) return [];
179
+ return Array.from(wrapper.querySelectorAll('[data-toast-id]')).map((t) => (t.textContent || '').trim());
180
+ }
181
+ const infoToast = document.querySelector('[data-toast-priority="info"]');
182
+ const errorToast = document.querySelector('[data-toast-priority="error"]');
183
+ return {
184
+ info: inspect(infoToast),
185
+ error: inspect(errorToast),
186
+ politeBodies: texts(politeWrapper),
187
+ assertiveBodies: texts(assertiveWrapper),
188
+ };
189
+ });
190
+ if (!evidence.info) return { verdict: 'fail', detail: 'no info-priority toast rendered after trigger' };
191
+ if (!evidence.error) return { verdict: 'fail', detail: 'no error-priority toast rendered after trigger' };
192
+ if (evidence.info.parentDataLiveRegion !== 'polite') {
193
+ return { verdict: 'fail', detail: 'info toast rendered in wrapper ' + JSON.stringify(evidence.info.parentDataLiveRegion) + ' instead of polite (ADR-2101 mapping broken)' };
194
+ }
195
+ if (evidence.info.role !== 'status') {
196
+ return { verdict: 'fail', detail: 'info toast role is ' + JSON.stringify(evidence.info.role) + ' instead of status (ADR-2101 mapping broken)' };
197
+ }
198
+ if (evidence.error.parentDataLiveRegion !== 'assertive') {
199
+ return { verdict: 'fail', detail: 'error toast rendered in wrapper ' + JSON.stringify(evidence.error.parentDataLiveRegion) + ' instead of assertive (ADR-2101 mapping broken)' };
200
+ }
201
+ if (evidence.error.role !== 'alert') {
202
+ return { verdict: 'fail', detail: 'error toast role is ' + JSON.stringify(evidence.error.role) + ' instead of alert (ADR-2101 mapping broken)' };
203
+ }
204
+ // Disjoint-content check (AC-20108-1 support): the info body
205
+ // does not appear in the assertive wrapper and vice versa.
206
+ if (evidence.assertiveBodies.some((body) => body === evidence.info.body)) {
207
+ return { verdict: 'fail', detail: 'info toast body appears in the assertive wrapper (double-post defect)' };
208
+ }
209
+ if (evidence.politeBodies.some((body) => body === evidence.error.body)) {
210
+ return { verdict: 'fail', detail: 'error toast body appears in the polite wrapper (double-post defect)' };
211
+ }
212
+ // Timeout floor check (WCAG 2.2.1): elapsed time between
213
+ // data-shown-at and data-dismissed-at at or above the ADR-2102
214
+ // floor. Six seconds baseline; an operator-elicited override
215
+ // raises the floor (never lowers it).
216
+ const infoElapsed = new Date(evidence.info.dismissedAt).getTime() - new Date(evidence.info.shownAt).getTime();
217
+ const errorElapsed = new Date(evidence.error.dismissedAt).getTime() - new Date(evidence.error.shownAt).getTime();
218
+ const floorMs = shellFloorSeconds * 1000;
219
+ if (infoElapsed < 6000) {
220
+ return { verdict: 'fail', detail: 'info toast dismissed after ' + infoElapsed + 'ms, below the WCAG 2.2.1 six-second floor (shell declared floor: ' + shellFloorSeconds + 's)' };
221
+ }
222
+ if (errorElapsed < 6000) {
223
+ return { verdict: 'fail', detail: 'error toast dismissed after ' + errorElapsed + 'ms, below the WCAG 2.2.1 six-second floor (shell declared floor: ' + shellFloorSeconds + 's)' };
224
+ }
225
+ if (shellFloorSeconds < 6) {
226
+ return { verdict: 'fail', detail: 'shell root declared a toast timeout floor of ' + shellFloorSeconds + 's, below the ADR-2102 six-second floor' };
227
+ }
228
+ return { verdict: 'pass', detail: 'toast contract honoured: info in polite/status (elapsed ' + infoElapsed + 'ms), error in assertive/alert (elapsed ' + errorElapsed + 'ms), floor ' + shellFloorSeconds + 's, ' + evidence.politeBodies.length + ' polite bodies + ' + evidence.assertiveBodies.length + ' assertive bodies, disjoint' };
229
+ },
230
+ },
231
+ {
232
+ id: 'AC-20103-1',
233
+ severity: 'block',
234
+ description: 'Notification centre acknowledge round-trip: the centre lists notifications within the ADR-2103 retention window (default thirty days), each item carries a stable data-notification-id (enumerated per-element, never by role alone), and a Tab-reachable [data-action="acknowledge"] control activates a POST /api/notifications/acknowledge round-trip whose 2xx response flips the item data-acknowledged to true. Reconciled against window.__notificationFetches and /__requests.',
235
+ run: async ({ browser, runtimeUrl }) => {
236
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
237
+ // Preserve the reviewer's --url query across the route swap.
238
+ const target = new URL(runtimeUrl);
239
+ target.pathname = '/notifications-centre';
240
+ await browser.goto(target.toString());
241
+ const initial = await browser.evaluate(() => {
242
+ // Enumerate only the notification wrappers (articles carrying
243
+ // data-notification-id AND data-acknowledged; the acknowledge
244
+ // and mark-read controls also carry data-notification-id so
245
+ // scope the query to article elements).
246
+ const items = Array.from(document.querySelectorAll('article[data-notification-id]'));
247
+ return {
248
+ itemCount: items.length,
249
+ itemIds: items.map((el) => el.getAttribute('data-notification-id')),
250
+ itemAcknowledged: items.map((el) => el.getAttribute('data-acknowledged')),
251
+ centreRegion: Boolean(document.querySelector('[data-region="notifications-centre"]')),
252
+ markAllRead: Boolean(document.querySelector('[data-action="mark-all-read"]')),
253
+ initialFetchCount: (window.__notificationFetches || []).length,
254
+ };
255
+ });
256
+ if (!initial.centreRegion) {
257
+ return { verdict: 'fail', detail: 'centre region not found (missing [data-region="notifications-centre"])' };
258
+ }
259
+ if (initial.itemCount === 0) {
260
+ return { verdict: 'fail', detail: 'centre inbox has zero items; the seeded backlog should render within the retention window' };
261
+ }
262
+ if (!initial.markAllRead) {
263
+ return { verdict: 'fail', detail: 'mark-all-read control missing ([data-action="mark-all-read"])' };
264
+ }
265
+ // Pick the first not-yet-acknowledged item and activate its
266
+ // acknowledge control by clicking. A Tab-driven activation
267
+ // would exercise the same handler; the runner has no keyboard
268
+ // seam beyond click / type / press but the fixture places the
269
+ // acknowledge control inside a <button> so the click is the
270
+ // same click a keyboard activation would trigger.
271
+ const firstUnackIndex = initial.itemAcknowledged.findIndex((v) => v !== 'true');
272
+ if (firstUnackIndex === -1) {
273
+ return { verdict: 'fail', detail: 'every seeded notification is already acknowledged; cannot exercise the round-trip on an unacknowledged item' };
274
+ }
275
+ const targetId = initial.itemIds[firstUnackIndex];
276
+ await browser.click('[data-action="acknowledge"][data-notification-id="' + targetId + '"]');
277
+ // Poll for the DOM update (bounded loop; the acknowledge
278
+ // round-trip should complete in well under a second).
279
+ const outcome = await browser.evaluate(async (targetId) => {
280
+ const start = Date.now();
281
+ return await new Promise((resolve) => {
282
+ function tick() {
283
+ const item = document.querySelector('[data-notification-id="' + targetId + '"]');
284
+ if (item && item.getAttribute('data-acknowledged') === 'true') {
285
+ resolve({ done: true });
286
+ return;
287
+ }
288
+ if (Date.now() - start > 3000) {
289
+ resolve({ done: false });
290
+ return;
291
+ }
292
+ setTimeout(tick, 50);
293
+ }
294
+ tick();
295
+ });
296
+ }, targetId);
297
+ if (!outcome || !outcome.done) {
298
+ return { verdict: 'fail', detail: 'acknowledge on notification ' + JSON.stringify(targetId) + ' did not flip data-acknowledged to true within 3s; the POST or the DOM update path is broken' };
299
+ }
300
+ // Reconcile the round-trip via window.__notificationFetches
301
+ // and /__requests: an `acknowledge` client record and an
302
+ // `acknowledge-server` server record should both exist for
303
+ // this notificationId.
304
+ const clientRecords = await browser.evaluate((targetId) => {
305
+ const fetches = window.__notificationFetches || [];
306
+ return fetches.filter((f) => f.type === 'acknowledge' && f.notificationId === targetId);
307
+ }, targetId);
308
+ if (!clientRecords || clientRecords.length === 0) {
309
+ return { verdict: 'fail', detail: 'no client-side acknowledge fetch recorded for ' + JSON.stringify(targetId) };
310
+ }
311
+ try {
312
+ const requestsRes = await fetch(new URL('/__requests', runtimeUrl).toString());
313
+ if (requestsRes.status !== 200) {
314
+ return { verdict: 'fail', detail: '/__requests endpoint returned ' + requestsRes.status };
315
+ }
316
+ const requestsBody = await requestsRes.json();
317
+ const serverAcks = (Array.isArray(requestsBody) ? requestsBody : []).filter((r) => r.kind === 'acknowledge-server' && r.notificationId === targetId);
318
+ if (serverAcks.length === 0) {
319
+ return { verdict: 'fail', detail: 'no server-side acknowledge record for ' + JSON.stringify(targetId) + ' at /__requests' };
320
+ }
321
+ } catch (err) {
322
+ return { verdict: 'fail', detail: '/__requests endpoint unreachable: ' + err.message };
323
+ }
324
+ return { verdict: 'pass', detail: 'acknowledge round-trip on ' + JSON.stringify(targetId) + ' completed: ' + initial.itemCount + ' items seeded, client + server records reconciled, data-acknowledged flipped to true' };
325
+ },
326
+ },
327
+ ],
328
+ };
@@ -0,0 +1,12 @@
1
+ # application-onboarding-tour CHANGELOG
2
+
3
+ ## 1.0.0 (visual round T-5, spec 2026-09-06 section 5.5)
4
+
5
+ - First shipped version. Introduces the tour step runner (ARIA APG dialog-modal per step, focus lifecycle, `role="dialog"`, `aria-labelledby`, `aria-describedby`, keyboard trap inside the tooltip with Escape as the exit, focus-not-obscured at 1440 and 360 breakpoints via `browser.resize`), the checklist slot (dashboard-top open collapse on `application-dashboard` applied; settings-page closed collapse when not; `<details>` browser-native for keyboard-native keyboard behaviour and screen-reader-native semantics), and the completion-state store contract (three backend shapes selected at apply time from the elicited answer or the Q4 fallback `spa-local-storage` when no persistence blueprint is applied).
6
+ - Ships six elicits: `tour-step-manifest`, `anchor-selectors`, `per-step-content-voice` (all project-owned strings the blueprint contributes the WHAT for), `dismissal-policy` (default `dismiss-permanently`), `completion-state-store` (default `spa-local-storage` per Q4), `checklist-anchor` (default derived at apply time from the applied-blueprint set).
7
+ - Ships a Playwright probe pack under `probe-packs/application-onboarding-tour.pack.mjs` with four surface-observable checks anchored to `AC-26101-1` (step-container focus and Escape), `AC-26102-1` (tooltip-as-dialog contract at two breakpoints), `AC-26103-1` (checklist-slot on both dashboard-top and settings-page anchors), and `AC-26104-1` (completion-state persistence and restart-tour re-open).
8
+ - Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-onboarding-tour/` realising the tour surface honestly across both checklist branches and multiple completion-store shapes, plus four break switches (`?break=no-role`, `?break=focus-escape`, `?break=no-collapse`, `?break=no-persist`) driving the negative runs.
9
+ - Composes on `application-spa` (routing and iconography), `application-dashboard` (dashboard-top anchor slot; settings-page fallback), `application-notifications-in-app` (polite `aria-live` completion announce), `application-account-settings` (restart-tour control home; any settings-shaped surface as fallback), and any `security-auth-*` blueprint (per-principal completion state; per-browser under a bare namespace as fallback).
10
+ - Q4 default: when no persistence blueprint is applied AND the operator does not answer `completion-state-store`, the store defaults to `spa-local-storage`. Rationale in ADR-2702 and the README's Q4 fallback section.
11
+ - Two documented mechanism-reach gaps: `AC-26105-1` first-run detection is fixture-verified via the manual boot line; `AC-26107-1` screen-reader traversal is asserted at the DOM contract level and verified manually via the fixture READMEs VoiceOver smoke. Runner cleanup rides `w-2026-09-04-dave-020`.
12
+ - No new global topics claimed. Extends the section 5 shelf id band registry with `application-onboarding-tour` at 26101 to 26899 (US) and 27xx (ADR/TAC).
@@ -0,0 +1,77 @@
1
+ # Onboarding-tour blueprint (v1.0.0)
2
+
3
+ Vendor-neutral onboarding-tour surface for an rcf-lite application. Composes on the SPA, dashboard, notifications-in-app, account-settings and any auth blueprint the project has applied, without a hard dependency on any of them: where a compose target is present the tour uses it, where it is not the tour uses the documented fallback per Q4. Ships a tour step runner mounted as an ARIA APG dialog-modal per step, a first-run checklist that renders on the dashboard shell when `application-dashboard` is applied and collapses to the settings page when not, a completion-state store with three backend shapes, and a restart-tour affordance on the settings surface. Ships a Playwright probe pack under `probe-packs/application-onboarding-tour.pack.mjs` whose four checks drive the real browser against a dependency-free sample-app fixture.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/application-onboarding-tour
9
+ ```
10
+
11
+ No `requiresAppliedCapabilities`: T-5 has no hard dependency, and the compose targets (SPA, dashboard, notifications-in-app, account-settings, any auth) are all optional. Prompts the elicitation phase for six parameters: the step manifest (3 to 5 steps with per-step anchor and content), the anchor selectors, the per-step content voice, the dismissal policy (default `dismiss-permanently`), the completion-state store shape (default `spa-local-storage`, the Q4 fallback), and the checklist anchor slot (default derived at apply time from what is applied). Writes a sidecar `rcf/blueprints/application-onboarding-tour.applied.json` capturing the answered elicits and the discovered `appliedBlueprints[]` (dashboard, notifications-in-app, account-settings, spa presence). Consumes the `logging` and `errorHandling` companions when they resolve to an applied provider or a registered library.
12
+
13
+ ## Anatomy
14
+
15
+ | Piece | Where | What |
16
+ |---|---|---|
17
+ | Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, no `requiresAppliedCapabilities`, six elicits, `suggestedCompanions: [logging, errorHandling]`, 17 contributions in the 26xxx / 27xx bands |
18
+ | Doc set | `contributions/` | 4 REQs, 7 USs (7 runtime-observable ACs; two documented mechanism-reach gaps on AC-26105-1 and AC-26107-1), 3 TACs, 3 ADRs |
19
+ | Probe pack | `probe-packs/application-onboarding-tour.pack.mjs` | Four surface-observable browser-verify checks anchored to AC-26101-1 step-container focus, AC-26102-1 tooltip-as-dialog, AC-26103-1 checklist-slot, AC-26104-1 completion-state persistence |
20
+ | Guide | `guide/application-onboarding-tour.md` | Operator-facing: when to reach, when not, mechanism-reach gaps, ARIA APG dialog-modal pattern and WCAG SCs the tour honours |
21
+ | Coordination vocabulary | `docs/topics.md` | Shelf id band registry update; no new global topics claimed; cross-references to `application-dashboard`, `application-notifications-in-app`, `application-account-settings`, `application-spa` |
22
+ | Sample-app fixture | `packages/rcf-lite/test/fixtures/probe-pack-application-onboarding-tour/` | Dependency-free Node HTTP server the pack is probed against on the shelf gate |
23
+
24
+ ## Composition: what the tour reaches when
25
+
26
+ | Applied blueprint | Effect on the tour |
27
+ |---|---|
28
+ | `application-spa` applied | Routing (`/tour`, `/dashboard`, `/settings`), iconography, theming carry through. Absent: the tour still renders but the project supplies the routing shell. |
29
+ | `application-dashboard` applied | Checklist anchor defaults to `dashboard-top` inside a `<details open>` element on the dashboard shell. Absent: checklist anchor defaults to `settings-page` inside a `<details>` (closed) element on the settings surface, per ADR-2703 and AC-26103-1. |
30
+ | `application-notifications-in-app` applied | Tour completion emits a polite `aria-live` announcement through the notifications-in-app live region. Absent: the completion is silent at the announce layer (the step runner still logs one line if a `logging` companion resolves). |
31
+ | `application-account-settings` applied | Restart-tour control lives inside the account settings surface. Absent: the restart-tour control renders on any settings-shaped surface the project supplies (`/settings`, `/account`, `/account/settings`). |
32
+ | Any `security-auth-*` applied | Completion state persists per principal identifier (the sidecar carries the principal namespace at apply). Absent: completion state persists per browser under a bare namespace; the tour behaves as a single-principal experience. |
33
+
34
+ ## Q4 fallback: completion-state store shape
35
+
36
+ Q4 of the ratified spec (section 10) settles the completion-state fallback. When no persistence blueprint is applied AND the operator does not answer `completion-state-store` explicitly, the store defaults to `spa-local-storage`: a per-browser record so a returning principal on the same browser is not re-onboarded, and a different browser is re-onboarded. Rationale: a per-session tour that re-plays on every new session is worse than a one-time tour that persists across sessions on that browser; per the elicit surface, the operator can override to `spa-session-storage` (per-session refresh) or `server-side-per-principal` (cross-device; requires an applied persistence blueprint).
37
+
38
+ ## Standards trace
39
+
40
+ - ARIA APG dialog-modal pattern: `role="dialog"`, `aria-labelledby` on the step heading, `aria-describedby` on the step body, focus moves to the tooltip on open, focus returns to the anchor on close. `AC-26102-1`, `AC-26107-1`.
41
+ - WCAG 2.2 AA 2.1.1 Keyboard: every tour control activatable with the keyboard. `AC-26101-1`.
42
+ - WCAG 2.2 AA 2.1.2 No Keyboard Trap: Escape always exits, focus never permanently trapped. `AC-26101-1`.
43
+ - WCAG 2.2 AA 2.4.3 Focus Order: Tab reaches every tour control in DOM order inside the tooltip. `AC-26101-1`.
44
+ - WCAG 2.2 AA 2.4.11 Focus Not Obscured Minimum: tooltip visible at the 1440 wide and 360 narrow breakpoints (probed via `browser.resize`). `AC-26102-1`.
45
+
46
+ Spec `standardsTrace` empty at the blueprint level; each ADR contribution carries a non-null `standardsTraceClause` per authoring section 8a.4 (the sentinel `generic enterprise practice` used where no SC applies).
47
+
48
+ ## Known mechanism-reach gaps
49
+
50
+ - `AC-26105-1` (first-run detection): the runner cannot fully prove the first-run vs returning-principal branch in one browser session without a persisted state seed; the pack drives the first-run branch via `?first-run=1` and the returning branch is verified by the fixture READMEs manual boot line (walk `/tour` twice, confirm the tour auto-opens on run 1 and does not on run 2).
51
+ - `AC-26107-1` (screen-reader traversal): the pack asserts the DOM contract (`aria-labelledby`, `aria-describedby`) but does not drive a real screen reader in CI. The fixture README names the manual VoiceOver smoke. Runner cleanup rides `w-2026-09-04-dave-020`.
52
+ - `AC-26106-1` (restart-tour clears state and re-opens): fully exercised inside the AC-26104-1 pack check end-to-end (the check clicks restart, then navigates to `/tour` and asserts the tooltip re-appears).
53
+
54
+ ## Elicited parameters
55
+
56
+ - `tour-step-manifest` (string; project-owned): the ordered list of 3 to 5 steps with per-step anchor, heading and body slot.
57
+ - `anchor-selectors` (string; project-owned): the CSS selectors the runner resolves at step-open time.
58
+ - `per-step-content-voice` (string; project-owned): the copy for each step.
59
+ - `dismissal-policy` (enum: `dismiss-permanently` | `dismiss-until-next-major` | `dismiss-until-next-minor`; default `dismiss-permanently`).
60
+ - `completion-state-store` (enum: `spa-local-storage` | `spa-session-storage` | `server-side-per-principal`; default `spa-local-storage` per Q4).
61
+ - `checklist-anchor` (enum: `dashboard-top` | `settings-page` | `custom-anchor`; default derived at apply time from what is applied).
62
+
63
+ ## Suggested companions
64
+
65
+ - `logging`: every step transition and tour completion writes one request-scoped log line with the correlation identifier.
66
+ - `errorHandling`: a completion-state persistence failure constructs an internal error record.
67
+
68
+ ## Probe pack
69
+
70
+ `probe-packs/application-onboarding-tour.pack.mjs` ships four surface-observable checks anchored to blueprint AC ids:
71
+
72
+ - `AC-26101-1` step-container focus lifecycle and Escape.
73
+ - `AC-26102-1` tooltip-as-dialog contract at 1440 and 360 breakpoints (via `browser.resize`).
74
+ - `AC-26103-1` checklist slot on both dashboard-top (open) and settings-page (closed) branches.
75
+ - `AC-26104-1` completion-state persistence and restart-tour re-open.
76
+
77
+ The pack applies to any FBS binding `TAC-2701-application-onboarding-tour-step-runner` or whose `navModel` routes match the operator-configured tour-anchor path glob (`/tour`, `/welcome`, `/getting-started`, `/onboarding`). Every URL string is composed through the `withUrl(runtimeUrl, path)` helper (no bare string concatenation).
@@ -0,0 +1,164 @@
1
+ {
2
+ "slug": "application-onboarding-tour",
3
+ "version": "1.0.0",
4
+ "category": "application",
5
+ "elicits": [
6
+ {
7
+ "id": "tour-step-manifest",
8
+ "prompt": "Tour step manifest: an ordered list of 3 to 5 steps, each with an anchor selector (CSS) and a content voice slot the project fills. Names each step id, anchor, heading and body.",
9
+ "kind": "string",
10
+ "default": ""
11
+ },
12
+ {
13
+ "id": "anchor-selectors",
14
+ "prompt": "Anchor selectors: CSS selectors the runtime resolves at step-open time to place the tooltip. One per manifest step.",
15
+ "kind": "string",
16
+ "default": ""
17
+ },
18
+ {
19
+ "id": "per-step-content-voice",
20
+ "prompt": "Per-step content voice: the project-owned copy for each step (heading and body). The blueprint contributes the WHAT, not the words.",
21
+ "kind": "string",
22
+ "default": ""
23
+ },
24
+ {
25
+ "id": "dismissal-policy",
26
+ "prompt": "Dismissal policy: dismiss-permanently (the tour never re-opens for a returning principal), dismiss-until-next-major (re-opens on a major version bump of the applied blueprint set), or dismiss-until-next-minor (re-opens on a minor bump). Recommended default: dismiss-permanently.",
27
+ "kind": "enum",
28
+ "options": [
29
+ "dismiss-permanently",
30
+ "dismiss-until-next-major",
31
+ "dismiss-until-next-minor"
32
+ ],
33
+ "default": "dismiss-permanently"
34
+ },
35
+ {
36
+ "id": "completion-state-store",
37
+ "prompt": "Completion-state store shape: spa-local-storage (per-browser, the Q4 fallback when no persistence blueprint is applied), spa-session-storage (per-session, re-plays on every new session), or server-side-per-principal (follows the principal across devices; requires an applied persistence blueprint). Recommended default: spa-local-storage.",
38
+ "kind": "enum",
39
+ "options": [
40
+ "spa-local-storage",
41
+ "spa-session-storage",
42
+ "server-side-per-principal"
43
+ ],
44
+ "default": "spa-local-storage"
45
+ },
46
+ {
47
+ "id": "checklist-anchor",
48
+ "prompt": "Checklist anchor slot: dashboard-top (renders on the dashboard shell when application-dashboard is applied), settings-page (renders on the settings surface when application-account-settings is applied or on any settings surface as a fallback), or custom-anchor (the project supplies a CSS selector). Default derived at apply time from what is applied.",
49
+ "kind": "enum",
50
+ "options": [
51
+ "dashboard-top",
52
+ "settings-page",
53
+ "custom-anchor"
54
+ ],
55
+ "default": "dashboard-top"
56
+ }
57
+ ],
58
+ "suggestedCompanions": [
59
+ {
60
+ "role": "logging",
61
+ "reason": "Every step transition and tour completion writes one request-scoped log line with the correlation identifier; a logging companion supplies the factory."
62
+ },
63
+ {
64
+ "role": "errorHandling",
65
+ "reason": "A completion-state persistence failure constructs an internal error record; an error-handling companion supplies the record factory and the boundary."
66
+ }
67
+ ],
68
+ "contributions": [
69
+ {
70
+ "id": "application-onboarding-tour-REQ-001",
71
+ "kind": "req",
72
+ "path": "requirements/application-onboarding-tour-req-001.json"
73
+ },
74
+ {
75
+ "id": "application-onboarding-tour-REQ-002",
76
+ "kind": "req",
77
+ "path": "requirements/application-onboarding-tour-req-002.json"
78
+ },
79
+ {
80
+ "id": "application-onboarding-tour-REQ-003",
81
+ "kind": "req",
82
+ "path": "requirements/application-onboarding-tour-req-003.json"
83
+ },
84
+ {
85
+ "id": "application-onboarding-tour-REQ-004",
86
+ "kind": "req",
87
+ "path": "requirements/application-onboarding-tour-req-004.json"
88
+ },
89
+ {
90
+ "id": "application-onboarding-tour-US-26101",
91
+ "kind": "us",
92
+ "path": "user-stories/application-onboarding-tour-us-26101.json"
93
+ },
94
+ {
95
+ "id": "application-onboarding-tour-US-26102",
96
+ "kind": "us",
97
+ "path": "user-stories/application-onboarding-tour-us-26102.json"
98
+ },
99
+ {
100
+ "id": "application-onboarding-tour-US-26103",
101
+ "kind": "us",
102
+ "path": "user-stories/application-onboarding-tour-us-26103.json"
103
+ },
104
+ {
105
+ "id": "application-onboarding-tour-US-26104",
106
+ "kind": "us",
107
+ "path": "user-stories/application-onboarding-tour-us-26104.json"
108
+ },
109
+ {
110
+ "id": "application-onboarding-tour-US-26105",
111
+ "kind": "us",
112
+ "path": "user-stories/application-onboarding-tour-us-26105.json"
113
+ },
114
+ {
115
+ "id": "application-onboarding-tour-US-26106",
116
+ "kind": "us",
117
+ "path": "user-stories/application-onboarding-tour-us-26106.json"
118
+ },
119
+ {
120
+ "id": "application-onboarding-tour-US-26107",
121
+ "kind": "us",
122
+ "path": "user-stories/application-onboarding-tour-us-26107.json"
123
+ },
124
+ {
125
+ "id": "TAC-2701-application-onboarding-tour-step-runner",
126
+ "kind": "tac",
127
+ "path": "tacs/tac-2701-application-onboarding-tour-step-runner.json"
128
+ },
129
+ {
130
+ "id": "TAC-2702-application-onboarding-tour-checklist-slot",
131
+ "kind": "tac",
132
+ "path": "tacs/tac-2702-application-onboarding-tour-checklist-slot.json"
133
+ },
134
+ {
135
+ "id": "TAC-2703-application-onboarding-tour-completion-store",
136
+ "kind": "tac",
137
+ "path": "tacs/tac-2703-application-onboarding-tour-completion-store.json"
138
+ },
139
+ {
140
+ "id": "ADR-2701-application-onboarding-tour-dismissal-policy",
141
+ "kind": "adr",
142
+ "path": "adrs/adr-2701-application-onboarding-tour-dismissal-policy.json",
143
+ "recommendedDefault": true,
144
+ "elicited": true,
145
+ "standardsTraceClause": "generic enterprise practice"
146
+ },
147
+ {
148
+ "id": "ADR-2702-application-onboarding-tour-completion-store-shape",
149
+ "kind": "adr",
150
+ "path": "adrs/adr-2702-application-onboarding-tour-completion-store-shape.json",
151
+ "recommendedDefault": true,
152
+ "elicited": true,
153
+ "standardsTraceClause": "generic enterprise practice"
154
+ },
155
+ {
156
+ "id": "ADR-2703-application-onboarding-tour-checklist-anchor",
157
+ "kind": "adr",
158
+ "path": "adrs/adr-2703-application-onboarding-tour-checklist-anchor.json",
159
+ "recommendedDefault": true,
160
+ "elicited": true,
161
+ "standardsTraceClause": "generic enterprise practice"
162
+ }
163
+ ]
164
+ }