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,29 @@
1
+ {
2
+ "usId": "application-file-upload-US-23103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-file-upload-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "A refused file renders an aria-describedby-bound error and moves focus to its retry control, without sending the bytes",
8
+ "asA": "operator whose selected file is refused by the MIME gate, the size gate or the virus scanner",
9
+ "iWant": "an inline error that names the refusal reason, is bound to my file row via aria-describedby, and moves my focus to the retry control without sending the file to the server",
10
+ "soThat": "I learn why the file was refused, do not waste my upload budget on a refused file, and can retry with a corrected file from my keyboard",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-23103-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "When the fixture is seeded with a refused file (MIME mismatch, size cap exceeded, or virus-scan hit), the file row [data-file-row][data-refused=\"true\"] renders a [data-error-message] element whose id is referenced by the row's aria-describedby attribute, the row exposes the closed refusal reason via [data-refusal-reason] (one of mime-refused, size-refused, virus-refused), a [data-recovery=\"retry\"] control receives keyboard focus, and the pack observes zero POST or PATCH requests carrying the refused filename on the browser's request log."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2401-application-file-upload-input",
21
+ "TAC-2402-application-file-upload-transport"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-file-upload",
25
+ "affordance:refusal"
26
+ ],
27
+ "createdAt": "2026-09-06T16:55:00Z",
28
+ "updatedAt": "2026-09-06T16:55:00Z"
29
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "application-file-upload-US-23104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-file-upload-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The transport uploads files in chunks and, on the tus.io branch, exposes an Upload-Offset header per PATCH",
8
+ "asA": "operator uploading a large file over a spotty connection",
9
+ "iWant": "the transport to split my file into chunks and to resume from the last acknowledged offset on retry",
10
+ "soThat": "an interrupted upload does not re-send bytes I already delivered",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-23104-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "On the ?transport=multipart branch the fixture returns 200 with a completed chunk count higher than 1 on a file large enough to force chunking; the DOM exposes [data-transport=\"multipart\"] and [data-chunks-uploaded] whose numeric value equals the completed chunk count. On the ?transport=tus branch the pack observes at least one PATCH request on the browser's network log whose request headers include Upload-Offset with a numeric value, and the DOM exposes [data-transport=\"tus\"] with [data-chunks-uploaded] > 1."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2402-application-file-upload-transport"
21
+ ],
22
+ "tags": [
23
+ "blueprint:application-file-upload",
24
+ "affordance:chunked-resumable"
25
+ ],
26
+ "createdAt": "2026-09-06T16:55:00Z",
27
+ "updatedAt": "2026-09-06T16:55:00Z"
28
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-file-upload-US-23105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-file-upload-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "On successful completion the upload surface renders an assertive-slot announcement and per-file remove and retry controls",
8
+ "asA": "operator whose upload set has just finished",
9
+ "iWant": "an assertive-slot announcement saying how many files uploaded successfully, plus a keyboard-reachable remove control per completed file",
10
+ "soThat": "my screen reader tells me the set is done and I can remove a file I no longer want without a page reload",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-23105-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "After the fixture completes the upload set the upload region carries a [data-assertive-slot] element with aria-live=\"assertive\" or role=\"status\" whose textContent matches /^\\d+ files uploaded successfully$/, each completed file row carries [data-file-row][data-file-state=\"complete\"], a keyboard-reachable [data-recovery=\"remove\"] button per row and, after a refused-then-succeeded row, a [data-recovery=\"retry\"] button visible only until the retry succeeds."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2401-application-file-upload-input",
21
+ "TAC-2403-application-file-upload-progress-announcer"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-file-upload",
25
+ "affordance:completion"
26
+ ],
27
+ "createdAt": "2026-09-06T16:55:00Z",
28
+ "updatedAt": "2026-09-06T16:55:00Z"
29
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "application-file-upload-US-23106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-file-upload-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "A network interruption mid-upload resumes from the last acknowledged offset when the connection returns",
8
+ "asA": "operator uploading through a spotty connection or a captive portal that drops mid-request",
9
+ "iWant": "the transport to pause on interruption, wait for the connection to return, and resume from the last acknowledged offset without re-sending",
10
+ "soThat": "a dropped connection does not force me to restart a large upload",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-23106-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "On the ?interrupt=1 branch of the fixture the upload pauses after the first acknowledged chunk, the DOM exposes [data-file-state=\"paused\"] and [data-chunks-uploaded] with a numeric value greater than zero on the paused row, and after the fixture resumes with ?resume=1 the row transitions to [data-file-state=\"complete\"] with the accumulated [data-chunks-uploaded] equal to the total chunk count. The pack asserts no chunk index is re-uploaded (the fixture records the received offsets on the row and never repeats one)."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2402-application-file-upload-transport"
21
+ ],
22
+ "tags": [
23
+ "blueprint:application-file-upload",
24
+ "affordance:resumption"
25
+ ],
26
+ "createdAt": "2026-09-06T16:55:00Z",
27
+ "updatedAt": "2026-09-06T16:55:00Z"
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "application-file-upload-US-23107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-file-upload-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Progress continues to advance and the polite live-region continues to tick when the browser tab is backgrounded",
8
+ "asA": "operator who tabs away from the upload while it is running",
9
+ "iWant": "the upload to continue and the polite live-region to keep receiving ticks so a screen reader can pick up the announcement when I return",
10
+ "soThat": "backgrounding the tab does not stall the upload or my accessibility affordance",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-23107-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "On the ?background=1 branch of the fixture the fixture drives a visibilitychange event to hidden, the upload continues (the aggregate percent advances between two polite-tick reads separated by at least one polling interval), and the [data-live-region=\"polite\"] wrapper's text updates. The pack reads the wrapper twice with a wait between and asserts the aggregate percent increased and the tick text changed."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2403-application-file-upload-progress-announcer"
21
+ ],
22
+ "tags": [
23
+ "blueprint:application-file-upload",
24
+ "affordance:background-tab-progress"
25
+ ],
26
+ "createdAt": "2026-09-06T16:55:00Z",
27
+ "updatedAt": "2026-09-06T16:55:00Z"
28
+ }
@@ -0,0 +1,58 @@
1
+ # application-file-upload: coordination vocabulary
2
+
3
+ ## Global topics
4
+
5
+ The blueprint claims no new global topics at v1.0.0. Every ADR (transport branch, accepted set, virus-scan integration) is non-global.
6
+
7
+ ## Deliberately unclaimed topics
8
+
9
+ - `uploadEnvelope` (the shape of an upload success or completion response body). Reserved for the applied API blueprint (`application-api-rest` claims it today); this blueprint reads the wire-level chunk acknowledgements, not the envelope body shape, so no claim collides.
10
+ - `commonAcceptedSets` (a shelf-wide registry of accepted MIME sets a consumer can reach for). Reserved for a future v1.1.0 minor bump if three or more consumer blueprints start elicitizing the same lists. Held here as an unclaimed topic so a composing author sees the reservation.
11
+ - `objectStorageTransport` (a shared engine for the chunked-and-resumable transport that both an object-storage blueprint and this UI blueprint would reach for). Reserved for a future dedicated `application-file-transport` blueprint; held here so a composing author sees the reservation before minting a new topic.
12
+ - `announcementFormatsCatalogue` (the localised polite and assertive text formats). Reserved for a v1.1.0 minor bump extending the announcer TAC's `announcementFormatsEnum` with a lookup table.
13
+
14
+ ## Shelf id band and suffix block
15
+
16
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
17
+ |---|---|---|---|---|
18
+ | application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
19
+ | application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
20
+ | application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
21
+ | application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
22
+ | application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
23
+ | application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
24
+ | application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
25
+ | application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
26
+ | application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
27
+ | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
28
+ | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
29
+ | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
30
+
31
+ The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
32
+
33
+ ## Composition with application-spa
34
+
35
+ `application-spa` REQ-006 ships upload and progress and error components as part of its component library. Applying this blueprint alongside `application-spa` composes cleanly: SPA holds the visual tokens for the upload region; this blueprint holds the input affordances, the transport contract, the refusal contract and the runtime enforcement pack. No `scope: "global"` ADR conflict.
36
+
37
+ ## Composition with application-empty-error-states
38
+
39
+ A refused upload is a refusal contract state, not an empty or error state; the two blueprints do not overlap on state slugs. A transport-level failure (server 5xx during a chunk PATCH) surfaces through `application-empty-error-states`'s server-error state after the transport's retry budget is exhausted. No global-topic overlap.
40
+
41
+ ## Composition with application-error-handling
42
+
43
+ Refusals and transport-layer failures construct an internal error record through the applied error-handling factory (`suggestedCompanions: errorHandling`). This blueprint reads the factory's shape; `application-error-handling` owns the shape and its correlation-identifier discipline.
44
+
45
+ ## The four fixture states and the two transport slugs
46
+
47
+ The four state slugs `idle`, `uploading`, `refused`, `complete` and the two transport slugs `multipart`, `tus` appear identically across the blueprint README, the fixture README, the operator guide, the probe pack `checks[]` descriptions and this file. Extending either enum is a v1.1.0 minor bump; removing or renaming is a v2.0.0 major.
48
+
49
+ ## Probe pack
50
+
51
+ `probe-packs/application-file-upload.pack.mjs` ships four surface-observable checks anchored to blueprint AC ids, one per contract:
52
+
53
+ - `AC-23101-1` input surface (file input, drop-zone, keyboard-focusable opener)
54
+ - `AC-23102-1` progress announcer (polite tick format and monotonic advance)
55
+ - `AC-23103-1` refusal contract (aria-describedby error binding, refused bytes never on the wire)
56
+ - `AC-23104-1` chunked transport (multipart chunks or tus Upload-Offset)
57
+
58
+ The pack applies to any FBS binding `TAC-2401-application-file-upload-input` or whose navModel routes name an operator-configured upload path (matching `/upload`). See `packages/rcf-lite/docs/blueprint-authoring.md` section 8c for the pack authoring rules.
@@ -0,0 +1,48 @@
1
+ # application-file-upload: operator guide
2
+
3
+ ## When to reach for it
4
+
5
+ Your project accepts file uploads from operators, whether one file at a time or a set, whether small text and image assets or large media. You want one contract for the input surface (labelled input plus drop-zone plus keyboard opener per WCAG 2.5.7), one recommended transport that ships resumable-chunked out of the box, one refusal contract that binds errors via `aria-describedby` and never lets refused bytes reach the server, one polite live-region tick that keeps a screen-reader user informed of progress, and a runtime pack that refuses ship on a dropped input, a dropped live-region, a refused file that reached the wire, or a collapsed transport.
6
+
7
+ ## The two transports
8
+
9
+ The two shipped transport slugs are `multipart` and `tus`. `multipart` is the recommended default (ADR-2401 `recommendedDefault: true`) because every server toolkit accepts it and the client-side code is a Blob split into fixed-size chunks. `tus` is the elicited alternative for projects with a tus server or the third-party tus client library; on the tus branch each chunk is a PATCH request with an `Upload-Offset` header the pack asserts. A third alternative, `vendor-sdk` (S3 multipart, Cloudflare R2 client-direct, Cloudinary widget), is documented in ADR-2401 for projects committed to a vendor; the shipped fixture does not exercise it, and a vendor-sdk project runs the pack against a fixture that mocks the vendor's completion callback.
10
+
11
+ ## The four file-row states
12
+
13
+ The four shipped state slugs are `idle`, `uploading`, `refused`, `complete`. Every file row on the fixture cycles through this closed set; the same slugs ride `[data-file-state]` on the file row in your applied project. Extending the state set is a v1.1.0 minor bump; removing or renaming a state is a v2.0.0 major.
14
+
15
+ ## When NOT to reach for it
16
+
17
+ Your product is a marketing site or a static content surface that never accepts an upload. The four contracts model a live upload surface; a static site has no transport, no progress tick, no refusal contract, and forcing the model on a static site adds mechanism without payoff.
18
+
19
+ Your product has already committed to an opinionated single-vendor upload widget (Uppy with a specific backend, Filepond with a specific plugin set) whose contract is materially different from the input plus refusal plus progress catalogue. Adopt this blueprint only when the vendor widget composes with the input TAC's `collectFiles` factory rather than replacing it.
20
+
21
+ ## What stays your call
22
+
23
+ - The visual design of the upload region, the file rows and the drop-zone. The blueprint contributes WHAT surfaces under WHAT condition; the palette, spacing and typography are your project's design system's call.
24
+ - The accepted MIME set (ADR-2402 elicited enum). No default; every project elicits its own list of IANA media types.
25
+ - The per-file size cap in bytes (ADR-2402 elicited). No default; every project elicits its own cap.
26
+ - The transport branch (ADR-2401 elicited). Recommended `multipart`; elicit `tus` when a tus server is available or the third-party SDK is on the path; elicit `vendor-sdk` when a vendor SDK is on the path.
27
+ - The virus-scan verifier (ADR-2403 capability-plus-elicit). Every project elicits the verifier or the explicit noop; there is no shelf default and the guide names the risk in plain language for the noop path.
28
+ - The concurrency cap for the transport worker pool. Recommended default 3; a slow-link project elicits a lower cap.
29
+ - The announcer polling interval in milliseconds. Recommended default 250; a project sensitive to CPU cost on a hot page elicits a higher interval.
30
+ - The upload endpoint URL. The blueprint declares the shape (`POST /api/upload/chunk` for multipart, `POST /api/upload/tus` for the tus creation URL); the endpoint's server-side handling is your call.
31
+
32
+ ## What a good outcome looks like
33
+
34
+ The pack fires on every FBS whose surface renders an upload route, and every check returns `pass` on the honest render (both transport branches) and `fail` on the corresponding break switch. Your CI runs the fixture round-trip on every PR that touches an upload surface. Your operator uploads a file with the keyboard alone and hears the polite tick as it advances. Your production upload surface never lets a refused file's bytes leave the browser. Your production stack ships with an explicit virus-scan verifier or with the noop plus the guide's risk paragraph on file.
35
+
36
+ ## Mechanism-reach gaps
37
+
38
+ The blueprint's README lists the runtime-observable ACs the pack does NOT bind directly (drop-event round-trip, screen-reader adoption, error-message content, network-interruption resume on multipart, assertive-slot exclusive fire, network interruption resumption, background-tab tick continuity). Every gap is a candidate for a v1.1.0 minor bump extending the pack. Combine with `application-error-handling` to route refusal internal error records through the shipped factory and with `application-spa` to inherit the visual tokens.
39
+
40
+ ## Promotion signals
41
+
42
+ - Three or more consumer blueprints (forms-wizard, an eventual CSV-import, account-settings avatar upload) start elicitizing the same accepted-set entries. Candidate: a `commonAcceptedSets` global topic in a v1.1.0 minor.
43
+ - The transport TAC needs a shared engine across an object-storage blueprint and this UI blueprint. Candidate: a dedicated `application-file-transport` blueprint absorbing the chunked-and-resumable path.
44
+ - Localisation of the polite and assertive text formats. Candidate: a v1.1.0 minor bump extending the announcer TAC's `announcementFormatsEnum` with a lookup table.
45
+
46
+ ## Costs to be honest about
47
+
48
+ Realising all three input affordances honestly in a client is a chunk of code even after adopting the TACs; the WCAG 2.5.7 keyboard alternative is often the piece a first cut skips. The pack is Playwright-first, so a project without a running dev server at gate time cannot fire it. The tus branch assumes a tus server or the third-party client; a project that elicits tus without one hits an apply-time refusal on the elicit and unblocks by wiring one in or falling back to multipart.
@@ -0,0 +1,238 @@
1
+ // application-file-upload probe pack (v1.0.0).
2
+ //
3
+ // Four surface-observable checks, one per contract, anchored to the
4
+ // blueprint's contributed AC ids:
5
+ // AC-23101-1 input surface (file input, drop-zone, keyboard-opener)
6
+ // AC-23102-1 progress announcer (polite tick format + monotonic advance)
7
+ // AC-23103-1 refusal contract (aria-describedby, no bytes for refused)
8
+ // AC-23104-1 chunked transport (multipart chunks OR tus Upload-Offset)
9
+ //
10
+ // Every check drives the real Playwright browser the T-0 runner
11
+ // injects. URLs are composed by the withUrl(runtimeUrl, path) helper
12
+ // per the round 3 T-3 fix train; no bare string concatenation.
13
+ //
14
+ // Sample-app fixture:
15
+ // packages/rcf-lite/test/fixtures/probe-pack-application-file-upload/
16
+ // Fixture ships /upload with a ?transport=multipart default and a
17
+ // ?transport=tus alternative plus break switches (?break=no-input,
18
+ // ?break=no-live-region, ?break=send-refused, ?break=no-chunks) so
19
+ // the negative runs can be driven from a single boot.
20
+
21
+ function withUrl(runtimeUrl, path) {
22
+ return new URL(path, runtimeUrl).toString();
23
+ }
24
+
25
+ // Progress tick format the announcer TAC pins per ADR-2402:
26
+ // "<uploaded> of <total> files, <PP> percent"
27
+ const POLITE_FORMAT = /^\d+ of \d+ files, \d{1,3} percent$/;
28
+
29
+ export default {
30
+ packName: 'application-file-upload',
31
+ version: '1.0.0',
32
+ blueprintSlug: 'application-file-upload',
33
+ // Applies to any FBS that binds the input TAC or whose navModel
34
+ // routes name the operator-configured upload path. References BOTH
35
+ // `tacIds` AND `route` per the loader source-scan rule (T-0
36
+ // AC-1701-3, cross-check with authoring standard 8c).
37
+ appliesTo: ({ fbs }) => {
38
+ const routes = fbs?.designStage?.navModel?.routes ?? [];
39
+ const tacIds = fbs?.contextRequirements?.tacIds ?? [];
40
+ if (tacIds.includes('TAC-2401-application-file-upload-input')) return true;
41
+ return routes.some((r) => typeof r?.path === 'string' && /\/upload(\/|$|\?)/.test(r.path));
42
+ },
43
+ boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
44
+ checks: [
45
+ {
46
+ id: 'AC-23101-1',
47
+ severity: 'block',
48
+ description: 'input surface renders a labelled file input, a drop-zone region and a keyboard-focusable opener that opens the picker on Enter (WCAG 2.5.7)',
49
+ run: async ({ browser, runtimeUrl }) => {
50
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
51
+ await browser.goto(withUrl(runtimeUrl, '/upload'));
52
+ const dom = await browser.evaluate(() => {
53
+ const region = document.querySelector('[data-surface="file-upload"]');
54
+ if (!region) return { present: false };
55
+ const fileInput = region.querySelector('input[type="file"]');
56
+ const dropZone = region.querySelector('[data-drop-zone]');
57
+ const opener = region.querySelector('[data-open-picker]');
58
+ const inputId = fileInput ? fileInput.id : null;
59
+ const label = inputId ? document.querySelector(`label[for="${inputId}"]`) : null;
60
+ const ariaLabel = fileInput ? fileInput.getAttribute('aria-label') : null;
61
+ const openerFocusable = opener ? opener.tabIndex >= 0 || opener.tagName === 'BUTTON' : false;
62
+ return {
63
+ present: true,
64
+ hasFileInput: !!fileInput,
65
+ hasDropZone: !!dropZone,
66
+ hasOpener: !!opener,
67
+ openerFocusable,
68
+ hasLabel: !!label,
69
+ hasAriaLabel: !!ariaLabel,
70
+ };
71
+ });
72
+ if (!dom.present) return { verdict: 'fail', detail: 'upload region [data-surface="file-upload"] not found' };
73
+ if (!dom.hasFileInput) return { verdict: 'fail', detail: 'upload region missing input[type="file"]' };
74
+ if (!dom.hasDropZone) return { verdict: 'fail', detail: 'upload region missing [data-drop-zone]' };
75
+ if (!dom.hasOpener) return { verdict: 'fail', detail: 'upload region missing keyboard [data-open-picker] control (WCAG 2.5.7: drop-zone must not be the only path)' };
76
+ if (!dom.openerFocusable) return { verdict: 'fail', detail: '[data-open-picker] control not keyboard-focusable' };
77
+ if (!dom.hasLabel && !dom.hasAriaLabel) return { verdict: 'fail', detail: 'file input carries neither an associated <label> nor aria-label' };
78
+ return { verdict: 'pass', detail: 'file input, drop-zone and keyboard opener present; accessible name bound' };
79
+ },
80
+ },
81
+ {
82
+ id: 'AC-23102-1',
83
+ severity: 'block',
84
+ description: 'progress announcer emits a polite tick in the closed format and the aggregate percent advances monotonically during an upload',
85
+ run: async ({ browser, runtimeUrl }) => {
86
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
87
+ await browser.goto(withUrl(runtimeUrl, '/upload?transport=multipart&autostart=1&seed=demo'));
88
+ // Read the polite wrapper twice with the fixture's polling
89
+ // interval between so we can prove monotonic advance.
90
+ const firstRead = await browser.evaluate(() => {
91
+ const live = document.querySelector('[data-live-region="polite"]');
92
+ const row = document.querySelector('[data-file-row] [data-file-progress]');
93
+ return {
94
+ text: live ? live.textContent.trim() : null,
95
+ ariaLive: live ? live.getAttribute('aria-live') : null,
96
+ rowPercent: row ? Number(row.getAttribute('aria-valuenow') ?? row.textContent.trim()) : null,
97
+ };
98
+ });
99
+ // Fixture ticks every ~150ms; poll for advance.
100
+ const secondRead = await browser.evaluate(async () => {
101
+ await new Promise((r) => setTimeout(r, 400));
102
+ const live = document.querySelector('[data-live-region="polite"]');
103
+ const row = document.querySelector('[data-file-row] [data-file-progress]');
104
+ return {
105
+ text: live ? live.textContent.trim() : null,
106
+ rowPercent: row ? Number(row.getAttribute('aria-valuenow') ?? row.textContent.trim()) : null,
107
+ };
108
+ });
109
+ if (!firstRead.text) return { verdict: 'fail', detail: '[data-live-region="polite"] wrapper missing' };
110
+ if (firstRead.ariaLive !== 'polite') return { verdict: 'fail', detail: `[data-live-region="polite"] wrapper aria-live expected "polite", got ${JSON.stringify(firstRead.ariaLive)}` };
111
+ if (!POLITE_FORMAT.test(firstRead.text)) {
112
+ return { verdict: 'fail', detail: `polite tick text did not match /^\\d+ of \\d+ files, \\d{1,3} percent$/: ${JSON.stringify(firstRead.text)}` };
113
+ }
114
+ if (firstRead.rowPercent == null || Number.isNaN(firstRead.rowPercent)) {
115
+ return { verdict: 'fail', detail: 'per-file [data-file-progress] not present or not numeric' };
116
+ }
117
+ if (secondRead.rowPercent == null || secondRead.rowPercent < firstRead.rowPercent) {
118
+ return { verdict: 'fail', detail: `aggregate progress did not advance monotonically: first=${firstRead.rowPercent}, second=${secondRead.rowPercent}` };
119
+ }
120
+ return { verdict: 'pass', detail: `firstTick=${JSON.stringify(firstRead.text)} firstRow=${firstRead.rowPercent} secondRow=${secondRead.rowPercent}` };
121
+ },
122
+ },
123
+ {
124
+ id: 'AC-23103-1',
125
+ severity: 'block',
126
+ description: 'a refused file renders an aria-describedby-bound error, moves focus to the retry control, and is never sent to the server',
127
+ run: async ({ browser, runtimeUrl }) => {
128
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
129
+ await browser.goto(withUrl(runtimeUrl, '/upload?transport=multipart&seed=refused'));
130
+ const dom = await browser.evaluate(async () => {
131
+ // Wait for the upload loop to run to completion (or for
132
+ // the deadline). We can't read the request log honestly
133
+ // before the loop has had a chance to run: on the
134
+ // ?break=send-refused negative branch the refused row's
135
+ // bytes only land after the loop reaches that row. The
136
+ // fixture completes a two-file demo set in roughly
137
+ // 2 * 3 * 120ms + jitter = ~800ms.
138
+ const deadline = Date.now() + 3000;
139
+ while (Date.now() < deadline) {
140
+ const slot = document.querySelector('[data-assertive-slot]');
141
+ if (slot && slot.textContent && slot.textContent.trim().length > 0) break;
142
+ await new Promise((r) => setTimeout(r, 100));
143
+ }
144
+ const region = document.querySelector('[data-surface="file-upload"]');
145
+ if (!region) return { present: false };
146
+ const row = region.querySelector('[data-file-row][data-refused="true"]');
147
+ if (!row) return { present: true, hasRefusedRow: false };
148
+ const describedBy = row.getAttribute('aria-describedby');
149
+ const errId = describedBy ? describedBy.split(/\s+/)[0] : null;
150
+ const err = errId ? row.querySelector(`#${CSS.escape(errId)}`) || document.getElementById(errId) : null;
151
+ const reason = row.getAttribute('data-refusal-reason');
152
+ const retry = row.querySelector('[data-recovery="retry"]');
153
+ const network = Array.isArray(window.__uploadRequestLog) ? window.__uploadRequestLog : [];
154
+ const refusedFilename = row.getAttribute('data-refused-filename') || null;
155
+ const sentRefused = refusedFilename
156
+ ? network.some((r) => r && typeof r.body === 'string' && r.body.includes(refusedFilename))
157
+ : false;
158
+ return {
159
+ present: true,
160
+ hasRefusedRow: true,
161
+ hasErr: !!err,
162
+ errText: err ? err.textContent.trim() : null,
163
+ reason,
164
+ hasRetry: !!retry,
165
+ refusedFilename,
166
+ sentRefused,
167
+ network,
168
+ };
169
+ });
170
+ if (!dom.present) return { verdict: 'fail', detail: 'upload region not found' };
171
+ if (!dom.hasRefusedRow) return { verdict: 'fail', detail: 'no [data-file-row][data-refused="true"] on the refused seed' };
172
+ if (!dom.hasErr) return { verdict: 'fail', detail: 'refused row aria-describedby does not resolve to a [data-error-message] element' };
173
+ const allowedReasons = ['mime-refused', 'size-refused', 'virus-refused'];
174
+ if (!allowedReasons.includes(dom.reason)) {
175
+ return { verdict: 'fail', detail: `refused row [data-refusal-reason] expected one of ${JSON.stringify(allowedReasons)}, got ${JSON.stringify(dom.reason)}` };
176
+ }
177
+ if (!dom.hasRetry) return { verdict: 'fail', detail: 'refused row missing [data-recovery="retry"] control' };
178
+ if (dom.sentRefused) {
179
+ return { verdict: 'fail', detail: `refused filename ${JSON.stringify(dom.refusedFilename)} appears in the upload request log` };
180
+ }
181
+ return { verdict: 'pass', detail: `reason=${JSON.stringify(dom.reason)} err=${JSON.stringify(dom.errText)} no refused bytes on the wire (${dom.network.length} recorded upload requests)` };
182
+ },
183
+ },
184
+ {
185
+ id: 'AC-23104-1',
186
+ severity: 'block',
187
+ description: 'the transport uploads in chunks; on the tus branch each PATCH request carries Upload-Offset, on the multipart branch [data-chunks-uploaded] on the DOM exceeds one',
188
+ run: async ({ browser, runtimeUrl }) => {
189
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
190
+ // Read the transport preference off the base runtimeUrl's own
191
+ // query string (the withUrl helper resolves a fresh path
192
+ // against the base, which drops the query). The pack anchors
193
+ // on the base URL's ?transport= so a caller running the tus
194
+ // branch passes --url http://.../upload?transport=tus and the
195
+ // pack observes it here.
196
+ let configuredTransport = null;
197
+ try { configuredTransport = new URL(runtimeUrl).searchParams.get('transport'); } catch { /* runtimeUrl may be a bare path in tests */ }
198
+ const transport = configuredTransport === 'tus' ? 'tus' : 'multipart';
199
+ await browser.goto(withUrl(runtimeUrl, `/upload?transport=${transport}&seed=large&autostart=1`));
200
+ const dom = await browser.evaluate(async () => {
201
+ // Wait for the upload to complete (or for the deadline).
202
+ // The pack needs to observe the final chunk count, not the
203
+ // first: an early break at chunks > 0 would read 1 and
204
+ // spuriously fail the chunked-upload assertion on a fast
205
+ // fixture. The fixture completes a 5-chunk upload in
206
+ // roughly 5 * 120ms = 600ms.
207
+ const deadline = Date.now() + 3000;
208
+ while (Date.now() < deadline) {
209
+ const row = document.querySelector('[data-file-row]');
210
+ const state = row ? row.getAttribute('data-file-state') : null;
211
+ if (state === 'complete') break;
212
+ await new Promise((r) => setTimeout(r, 100));
213
+ }
214
+ const row = document.querySelector('[data-file-row]');
215
+ const region = document.querySelector('[data-surface="file-upload"]');
216
+ const transportAttr = region ? region.getAttribute('data-transport') : null;
217
+ const chunksUploaded = row ? Number(row.getAttribute('data-chunks-uploaded') ?? '0') : 0;
218
+ const patchOffsets = Array.isArray(window.__tusPatchOffsets) ? window.__tusPatchOffsets : [];
219
+ return { transportAttr, chunksUploaded, patchOffsets };
220
+ });
221
+ if (dom.transportAttr !== transport) {
222
+ return { verdict: 'fail', detail: `upload region [data-transport] expected ${JSON.stringify(transport)}, got ${JSON.stringify(dom.transportAttr)}` };
223
+ }
224
+ if (dom.chunksUploaded < 2) {
225
+ return { verdict: 'fail', detail: `[data-chunks-uploaded] expected > 1 (chunked upload), got ${dom.chunksUploaded}` };
226
+ }
227
+ if (transport === 'tus') {
228
+ const numeric = dom.patchOffsets.filter((v) => typeof v === 'number' && Number.isFinite(v));
229
+ if (numeric.length === 0) {
230
+ return { verdict: 'fail', detail: `no PATCH request recorded with a numeric Upload-Offset header (window.__tusPatchOffsets=${JSON.stringify(dom.patchOffsets)})` };
231
+ }
232
+ return { verdict: 'pass', detail: `tus branch: chunks=${dom.chunksUploaded}, Upload-Offset headers=${JSON.stringify(numeric)}` };
233
+ }
234
+ return { verdict: 'pass', detail: `multipart branch: chunks=${dom.chunksUploaded}` };
235
+ },
236
+ },
237
+ ],
238
+ };
@@ -0,0 +1,9 @@
1
+ # application-forms-wizard CHANGELOG
2
+
3
+ ## 1.0.0 (visual round T-3, spec 2026-09-06)
4
+
5
+ - First ratified version of the shelf's forms-wizard blueprint. Five REQs (task-list contract with the closed GOV.UK vocabulary Cannot start yet, Not started, In progress, Completed and an ARIA progressbar wrapper; per-step validation timing with on-blur before first submit then on-change after first failure and a full pass on submit reusing SPA forms-engine TAC-205; error-summary contract with a top-of-page summary, skip links, aria-invalid on the field, aria-describedby to the field-level message and focus moved to the summary heading; summary-review contract with a summary-list per step, Change links per row and answer retention on save; save-and-return contract with a server-side draft table or a client-side local buffer with a sync tick, refuses to ship if neither is wired), eight USs 24101 to 24108 binding one runtime-observable AC per contract plus three cross-cutting cases (linear-vs-free navigation, in-progress list, no-in-progress empty state delegated to application-empty-error-states), three TACs 2501 to 2503 (task-list shell, error-summary contract, draft store), three ADRs 2501 to 2503 (navigation posture linear default with elicited free branch, save-and-return transport with no recommendedDefault so the abandoned-draft loss class does not ship silently, step-indicator shape with task-list default and elicited ARIA progressbar-only or breadcrumb). No new global topics.
6
+ - Ships `probe-packs/application-forms-wizard.pack.mjs`: four surface-observable browser-verify checks anchored one per core contract (`AC-24101-1` task-list, `AC-24103-1` error-summary, `AC-24104-1` summary-review, `AC-24105-1` save-and-return). Every URL is composed by the `withUrl(runtimeUrl, path)` helper per the round 3 T-3 fix train; no bare string concatenation. The pack-level `appliesTo` predicate references BOTH `tacIds` (TAC-2501) AND `route` (the operator-configured wizard-route glob).
7
+ - Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/` with a Node HTTP server realising the four wizard surfaces honestly (`/task-list`, `/step/<n>`, `/summary`, `/in-progress`), both save-and-return transports on their query branches (`?draft-store=server` default posting to `/drafts`, `?draft-store=local` writing to `localStorage` with a sync tick), and four break switches (`?break=task-list-vocab`, `?break=no-summary`, `?break=no-retain`, `?break=no-draft`) driving the negative runs from a single boot. The fixture ships its own README naming PORT, every `?step=`, `?draft-store=`, `?nav=`, `?seed=`, `?refused=`, `?preseed=`, `?edit=`, every `?break=`, the manual boot line and the two-line gate-reviewer boot.
8
+ - Declares `suggestedCompanions` `logging` (every step transition, validation failure and save-and-return event writes one request-scoped log line with the correlation identifier and the step slug) and `errorHandling` (the error-summary contract constructs an internal error record per failed field through the applied error-handling factory). Does NOT declare `providesRoles` (leaf blueprint per spec). Does NOT declare `capabilities` and does NOT declare `requiresAppliedCapabilities` (no auth required).
9
+ - Consumes `application-empty-error-states` for the no-in-progress empty state on the /in-progress list surface; the wizard's TAC-2503 delegates the zero-drafts case to the sibling's empty-list state and reads `[data-surface="empty-list"]` with a `[data-recovery="create"]` control from the sibling. T-4 `application-account-settings` will consume this blueprint for its multi-part account setup flow and the summary-review confirm-before-save gate.
@@ -0,0 +1,102 @@
1
+ # Forms wizard blueprint (v1.0.0)
2
+
3
+ Vendor-neutral multi-step forms wizard contract for an rcf-lite application. Ships the GOV.UK Design System task-list pattern with a per-step completion state from the closed vocabulary (Cannot start yet, Not started, In progress, Completed), an ARIA progressbar wrapper on the task-list surface, the per-step validation timing rule (on-blur before first submit, on-change after first failure, full pass on submit), the top-of-page error-summary contract with skip links plus aria-invalid plus focus-to-heading on submit failure, the summary-review pattern with change-per-row and answer retention across an edit-and-save round-trip, and the save-and-return contract with a server-side draft table or a client-side local buffer with a sync tick. Ships a Playwright probe pack under `probe-packs/application-forms-wizard.pack.mjs` whose four checks each anchor one core contract, refuse on the corresponding break switch, and fire against the sample-app fixture on the shelf gate.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/application-forms-wizard
9
+ ```
10
+
11
+ Applies 19 contributions (5 REQs, 8 USs, 3 TACs, 3 ADRs) cleanly on any fresh init project. No `requiresAppliedCapabilities`, no auth prerequisite. The three elicits (ADR-2501 navigation posture with recommendedDefault linear, ADR-2502 save-and-return transport with no recommendedDefault, ADR-2503 step-indicator shape with recommendedDefault task-list) either ship recommended defaults so the apply proceeds silently, or (ADR-2502 alone) require a project answer at apply time because the abandoned-draft loss class is genuinely per-project.
12
+
13
+ ## Anatomy
14
+
15
+ | Piece | Where | What |
16
+ |---|---|---|
17
+ | Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, `suggestedCompanions: [logging, errorHandling]`, 19 contributions in the 24xxx / 25xx band |
18
+ | Doc set | `contributions/` | 5 REQs, 8 USs (each carrying one runtime-observable AC), 3 TACs, 3 ADRs |
19
+ | Probe pack | `probe-packs/application-forms-wizard.pack.mjs` | Four surface-observable browser-verify checks, one per core contract |
20
+ | Guide | `guide/application-forms-wizard.md` | Operator-facing: when to reach, when not, mechanism-reach gaps |
21
+ | Coordination vocabulary | `docs/topics.md` | Shelf id band registry update; no new global topics claimed; cross-reference to `application-empty-error-states` for the no-in-progress empty case |
22
+ | Sample-app fixture | `packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/` | Dependency-free Node HTTP server the pack is probed against on the shelf gate |
23
+
24
+ ## The task-list vocabulary
25
+
26
+ The four state strings are a closed enum at v1.0.0. Every task-list row exposes one. A fifth state (Skipped, Locked, or another word) is a v1.1.0 minor bump. Every README, guide, pack `checks[]` and `docs/topics.md` row names the same four strings.
27
+
28
+ | State | Meaning |
29
+ |---|---|
30
+ | `Cannot start yet` | A prerequisite step is unfinished. On linear navigation the row renders as a non-anchor span. |
31
+ | `Not started` | The step is reachable and has no answers. |
32
+ | `In progress` | The step has partial answers. |
33
+ | `Completed` | The step is fully valid. |
34
+
35
+ ## The validation timing rule
36
+
37
+ REQ-002 commits to the three-mode timing rule from the GOV.UK Design System error-message pattern. The rule delegates every validation to the SPA blueprint's forms-engine TAC-205 so a project applying `application-spa` does not compose two overlapping engines; a project without `application-spa` supplies an engine of its own choice against TAC-2502's interfaces.
38
+
39
+ - On blur before the first submit on a step, each field validates on leaving focus.
40
+ - After the first submit failure on a field, subsequent input events on that field update the message on every change (so the operator sees the message clear as they correct it).
41
+ - On the next submit the engine rebuilds the error set from scratch.
42
+
43
+ ## The error-summary contract
44
+
45
+ On submit refusal the step renders `[data-surface="error-summary"]` at the top of the page with a heading and one skip link per failed field; the skip link's `href` targets the field id. Every failed field carries `aria-invalid="true"` and `aria-describedby` pointing at its per-field error message. On failure focus moves to the summary heading. Per WCAG 2.2 SC 3.3.1 Error Identification and SC 3.3.3 Error Suggestion.
46
+
47
+ ## The summary-review pattern
48
+
49
+ After every step is Completed the wizard renders `[data-surface="summary-review"]` with one `[data-summary-list-section]` per step. Each section carries a `<dl>` summary list; each row is a `[data-summary-row]` with a `<dt>` label, a `<dd>` value and a `[data-recovery="change"]` link back to the step. Editing on the target step and saving returns to the summary review with every other answer preserved verbatim. Per GOV.UK Design System summary-list pattern; per WCAG 2.2 SC 3.3.4 Error Prevention.
50
+
51
+ ## The save-and-return contract
52
+
53
+ ADR-2502 commits to two transports without recommendedDefault. The server-side draft table (`POST /drafts` on advance, `GET /drafts` on entry) keys drafts by operator identifier; the client-side local buffer writes into `window.localStorage` under `draft:<wizard-slug>:<step-slug>` and renders `[data-sync-tick]` carrying an ISO-8601 timestamp on every write. A wizard applied without either transport is refused at build gate; ADR-2502 is a required elicit. Per WCAG 2.2 SC 3.3.7 Redundant Entry.
54
+
55
+ ## The no-in-progress empty case
56
+
57
+ The in-progress-list surface delegates the zero-drafts case to the `application-empty-error-states` empty-list state (`[data-surface="empty-list"]` with a `[data-recovery="create"]` control). The wizard blueprint does not ship its own empty component; a project applying both blueprints reads the same surface from either lane.
58
+
59
+ ## Elicited parameters
60
+
61
+ - **Step manifest.** The ordered list of steps, one entry per step with a slug, a title and a prerequisites array. Required at apply time; the shipped example manifest is three steps.
62
+ - **Save-and-return transport.** Default: none; ADR-2502 elicits `server-draft-table` or `client-local-buffer`. Required at apply time.
63
+ - **Which steps are optional.** A per-step flag defaulting to `required: true`. Optional steps do not gate the summary review.
64
+ - **Linear or free step navigation.** Default: linear. ADR-2501 elicits `free`.
65
+ - **Step indicator shape.** Default: task-list. ADR-2503 elicits `aria-progressbar-only` or `breadcrumb`.
66
+
67
+ ## The one runtime gate
68
+
69
+ `probe-packs/application-forms-wizard.pack.mjs` ships four checks the `rcf verify browser` runner invokes on any FBS whose surface binds `TAC-2501-application-forms-wizard-task-list` or whose nav model routes name an operator-configured wizard path. Each check drives the real Playwright browser the runner provisions, reads the DOM and the accessibility tree, and returns a verdict. URLs are composed by the `withUrl(runtimeUrl, path)` helper per the round 3 T-3 fix train; no bare string concatenation.
70
+
71
+ ## Quality bar
72
+
73
+ WCAG 2.2 AA across every surface: 2.4.6 Headings and Labels (task-list state per row, summary heading on submit failure), 3.3.1 Error Identification (error-summary names every failed field), 3.3.3 Error Suggestion (per-field message names the correction, not just the fault), 3.3.4 Error Prevention (summary-review is reversible before submit), 3.3.7 Redundant Entry (drafts persist across sessions). GOV.UK Design System task-list pattern, summary-list pattern, complete-multiple-tasks pattern. `standardsTrace` on the blueprint is empty (this is a general-enterprise-practice blueprint); each ADR contribution carries `standardsTraceClause` naming the pattern or SC identifier it implements.
74
+
75
+ ## Known mechanism-reach gaps
76
+
77
+ Runtime-observable ACs the pack does NOT bind directly (checklist section 6.g), listed individually per AC id:
78
+
79
+ - **AC-24102-1 validation timing.** The pack asserts the field-level message element and the aria-describedby binding via the fixture's refused branch; it does NOT additionally drive a real focus-and-blur sequence through the browser transport nor probe the transition from on-blur-only to on-change-after-failure. A v1.1.0 minor bump can drive keyboard events and diff the message text across events.
80
+ - **AC-24101-1 focus-move-to-task-list.** The pack asserts the task-list rows and the progressbar values; it does NOT additionally probe that focus lands on the task-list on route entry. A v1.1.0 minor bump can drive the accessibility tree and diff.
81
+ - **AC-24103-1 tab-order sweep.** The pack asserts focus lands on the summary heading; it does NOT additionally probe the full tab order across the failed fields. A v1.1.0 minor bump can walk the tab order.
82
+ - **AC-24106-1 linear-vs-free anchor rendering.** The pack does not have a dedicated check; the fixture's `?nav=free` and `?nav=linear` branches render honestly and consumers can probe the shape by inspection. A v1.1.0 minor bump can add a fifth check anchoring AC-24106-1 directly.
83
+ - **AC-24107-1 in-progress list enumeration.** The pack does not have a dedicated check; the `/in-progress` surface is inspected by the anatomy tests. A v1.1.0 minor bump can add a fifth check anchoring AC-24107-1 directly.
84
+ - **AC-24108-1 empty-state delegation.** The pack does not re-probe the empty-list wrapper here; the sibling `application-empty-error-states` pack already asserts it. Consumers apply both blueprints and the empty case is covered by the sibling pack. A v1.1.0 minor bump can add a cross-check that reads the empty wrapper on the `/in-progress` route.
85
+ - **AC-24105-1 cross-tab hydration.** The pack asserts the localStorage write and the sync tick on the local branch; it does NOT additionally probe cross-tab hydration or server-side dedupe on the server branch. Both are v1.1.0 minor-bump candidates.
86
+ - **AC-24104-1 keyboard-focus-on-change-link.** The pack asserts the change link and the answer retention; it does NOT additionally probe that following the change link places keyboard focus on the target field. A v1.1.0 minor bump can drive the click and read the active element on the target step.
87
+
88
+ ## Companions
89
+
90
+ `suggestedCompanions` declares `logging` (every step transition, validation failure and save-and-return event writes one request-scoped log line with the correlation identifier and the step slug through the applied logger factory) and `errorHandling` (the error-summary contract constructs an internal error record per failed field through the applied error-handling factory). Neither is required to apply the blueprint; a project without a logging companion still renders every state, it just does not emit a per-step log line.
91
+
92
+ ## Consumers
93
+
94
+ - `application-account-settings` (T-4 of this round) consumes the wizard task-list pattern for its multi-part account setup flow and the summary-review pattern for its confirm-before-save gate.
95
+
96
+ ## Composition with application-spa
97
+
98
+ `application-spa` REQ-006 ships the forms-engine (TAC-205) that this blueprint's TAC-2502 delegates validation to. This blueprint composes with SPA; the topic-ownership boundary lives in `docs/topics.md`. SPA holds the forms-engine and the field-component library; this sibling holds the wizard shell, the task-list, the error-summary contract, the summary review and the save-and-return draft store.
99
+
100
+ ## Composition with application-empty-error-states
101
+
102
+ The in-progress list's zero-drafts case delegates to the sibling's empty-list surface. This blueprint's TAC-2503 does not ship an empty component; the consumer applies both blueprints and the empty case reads consistently across the application. The topic-ownership boundary line lives in `docs/topics.md`, cross-referenced from the sibling's `docs/topics.md`.