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,85 @@
1
+ # File upload blueprint (v1.0.0)
2
+
3
+ Vendor-neutral file-upload contract for an rcf-lite application. Ships one upload surface with three input affordances (a labelled `<input type="file">`, a `[data-drop-zone]` region and a keyboard-focusable `[data-open-picker]` button per WCAG 2.5.7), a chunked-and-resumable transport with a multipart POST default and a tus.io elicited alternative, a refusal contract (MIME, size cap, virus-scan) that binds errors via `aria-describedby` and refuses to send refused bytes to the server, a progress announcer that emits a polite live-region tick in the closed format `"<uploaded> of <total> files, <PP> percent"` and an assertive-slot completion announcement per WCAG 4.1.3, and per-file remove and retry controls. Ships a Playwright probe pack under `probe-packs/application-file-upload.pack.mjs` whose four checks each anchor one contract and refuse on the corresponding break switch on the shipped sample-app fixture.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/application-file-upload
9
+ ```
10
+
11
+ Applies 18 contributions (5 REQs, 7 USs, 3 TACs, 3 ADRs) cleanly on any fresh init project. No `requiresAppliedCapabilities`, no auth prerequisite. The three ADR elicits (`ADR-2401` transport branch, `ADR-2402` accepted MIME set and per-file size cap, `ADR-2403` virus-scan verifier) carry the multipart default with `recommendedDefault: true` on the transport branch; the other two elicits (accepted set and virus-scan) have no shelf default (see the elicits below).
12
+
13
+ ## Anatomy
14
+
15
+ | Piece | Where | What |
16
+ |---|---|---|
17
+ | Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, `suggestedCompanions: [logging, errorHandling]`, 18 contributions in the 24xx / 23xxx band |
18
+ | Doc set | `contributions/` | 5 REQs, 7 USs (7 runtime-observable ACs), 3 TACs, 3 ADRs |
19
+ | Probe pack | `probe-packs/application-file-upload.pack.mjs` | Four surface-observable browser-verify checks, one per contract |
20
+ | Guide | `guide/application-file-upload.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 |
22
+ | Sample-app fixture | `packages/rcf-lite/test/fixtures/probe-pack-application-file-upload/` | Dependency-free Node HTTP server the pack is probed against on the shelf gate |
23
+
24
+ ## The four contracts
25
+
26
+ | Contract | REQ | AC on the pack | Region wrapper | Announcement |
27
+ |---|---|---|---|---|
28
+ | Input surface | REQ-001 | `AC-23101-1` | `[data-surface="file-upload"]` | (n/a; keyboard reach + accessible name) |
29
+ | Progress announcer | REQ-002 | `AC-23102-1` | `[data-live-region="polite"]` inside the region | polite `aria-live="polite"` |
30
+ | Refusal contract | REQ-003 | `AC-23103-1` | `[data-file-row][data-refused="true"]` | `aria-describedby` error binding |
31
+ | Chunked transport | REQ-004 | `AC-23104-1` | `[data-transport]` on the region; `[data-chunks-uploaded]` on each row | (n/a; observed on the wire) |
32
+ | Completion | REQ-005 | asserted by AC-23105-1 (see below) | `[data-assertive-slot]` | `aria-live="assertive"` |
33
+
34
+ The pack ships four checks (`AC-23101-1`, `AC-23102-1`, `AC-23103-1`, `AC-23104-1`) which is the minimum honest set per spec section 5.2; the completion contract (`AC-23105-1`) and the cross-cutting cases (`AC-23106-1` network interruption resumption, `AC-23107-1` background-tab progress) are runtime-observable ACs bound only through the fixture and the anatomy test. Every gap is enumerated below and is a candidate for a v1.1.0 minor bump extending the pack.
35
+
36
+ ## The four fixture states
37
+
38
+ Every file row on the fixture cycles through the closed state set `idle` -> `uploading` -> `complete` (honest branch) or `idle` -> `refused` (refusal branch). The state slug rides `[data-file-state]` on the row. The four slugs appear identically across the fixture README, this README, the guide, the pack `checks[]` descriptions and `docs/topics.md`.
39
+
40
+ ## The two transport slugs
41
+
42
+ `multipart` is the recommended default per ADR-2401; `tus` is the elicited alternative (tus.io 1.0.0). The two slugs appear identically across the fixture README, this README, the guide, the pack `checks[]` descriptions and `docs/topics.md`. The third elicited alternative (`vendor-sdk` for S3, R2, Cloudinary) is documented in ADR-2401 but is not exercised by the shipped fixture; a project on a vendor SDK adapts the pack to run against a fixture that mocks the vendor's completion callback.
43
+
44
+ ## Elicited parameters
45
+
46
+ - **Transport branch (ADR-2401).** Default: `multipart` (recommendedDefault true). Elicited alternatives: `tus`, `vendor-sdk`.
47
+ - **Accepted MIME set (ADR-2402).** No default. Every project elicits its own list of IANA media types. The input TAC refuses every file until this is elicited (the safe floor).
48
+ - **Per-file size cap in bytes (ADR-2402).** No default. Every project elicits its own cap. The input TAC refuses every file until this is elicited.
49
+ - **Concurrency cap** for the transport worker pool. Recommended default: 3. Projects with a slow-link posture elicit a lower cap.
50
+ - **Announcer polling interval in milliseconds.** Recommended default: 250. Backgrounded tabs continue to tick at the same interval per REQ-002 and AC-23107-1.
51
+ - **Virus-scan verifier (ADR-2403).** Capability-plus-elicit. Every project elicits the verifier or the explicit noop; there is no shelf default.
52
+
53
+ ## The one runtime gate
54
+
55
+ `probe-packs/application-file-upload.pack.mjs` ships four checks the `rcf verify browser` runner invokes on any FBS whose surface binds `TAC-2401-application-file-upload-input` or whose nav model routes name an operator-configured upload path. Each check drives the real Playwright browser the runner provisions, reads the accessibility tree and the DOM (and the request log for the refusal check and the tus branch), 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.
56
+
57
+ ## Quality bar
58
+
59
+ WCAG 2.2 AA on every upload surface: 2.5.7 Dragging Movements (the drop-zone is never the only input path; the keyboard opener satisfies the alternative), 4.1.3 Status Messages (the polite live-region tick and the assertive-slot completion announcement fire through preseeded wrappers), 3.3.1 Error Identification (every refusal names the closed reason from `mime-refused`, `size-refused`, `virus-refused`), 1.3.1 Info and Relationships (every refusal binds the error message to its file row via `aria-describedby`), 3.3.3 Error Suggestion (every refused row exposes a keyboard-reachable retry control and the guide names the correction). ARIA APG button pattern on the retry control; ARIA APG status pattern on the polite tick. `standardsTrace` on the blueprint is empty (this is a general-enterprise-practice blueprint); each ADR contribution carries `standardsTraceClause` naming the clause or vendor spec it implements.
60
+
61
+ The refusal contract is a real refusal: the pack asserts the refused filename never appears on `window.__uploadRequestLog`, and the `?break=send-refused` fixture switch is the only path that lets refused bytes reach the server.
62
+
63
+ ## Known mechanism-reach gaps
64
+
65
+ Runtime-observable ACs the pack does NOT bind directly (checklist section 6.g), listed individually per AC id:
66
+
67
+ - **AC-23101-1 drop-zone drop event round-trip.** The pack asserts the `[data-drop-zone]` region exists and that the keyboard opener focuses the file input on Enter; it does NOT additionally synthesise a drag event and drop a File onto the drop-zone (Playwright's DataTransfer synthesis is fragile across browsers). A v1.1.0 minor bump can drive a drop via `page.evaluate` and read that the file-list picked up the drop.
68
+ - **AC-23102-1 screen-reader adoption of the polite region.** The pack asserts the polite wrapper's textContent matches the closed format and advances monotonically; it does NOT additionally probe screen-reader adoption (that requires a real assistive tech in the loop). A v1.1.0 minor bump can attach an accessibility-tree observer via the browser's a11y snapshot.
69
+ - **AC-23103-1 aria-describedby resolves to a non-empty error message.** The pack asserts `aria-describedby` resolves and that the refused row exposes the closed `data-refusal-reason`; the error-text content check is a substring assertion (present and non-empty), not a full-message copy check. A v1.1.0 minor bump can pin the error message content per refusal reason.
70
+ - **AC-23104-1 network-interruption resume on the multipart branch.** The pack asserts `[data-chunks-uploaded]` exceeds one on both branches and that the tus branch records numeric `Upload-Offset` values on `window.__tusPatchOffsets`; it does NOT additionally probe a mid-upload interruption on the multipart branch (that requires a request-blocking driver). A v1.1.0 minor bump can drive the `?interrupt=1` + `?resume=1` seams the fixture already exposes via AC-23106-1.
71
+ - **AC-23105-1 assertive-slot exclusive fire.** The pack does NOT bind this AC directly; the anatomy test drives the fixture and reads the assertive slot's textContent. A v1.1.0 minor bump can promote the check into the pack, driving an upload set to completion and reading the assertive wrapper.
72
+ - **AC-23106-1 network interruption resumption.** The pack does NOT bind this AC directly. The fixture exposes `?interrupt=1` and `?resume=1` and the anatomy test walks the resume path; a v1.1.0 minor bump promotes the check.
73
+ - **AC-23107-1 background-tab tick continuity.** The pack does NOT bind this AC directly. The fixture exposes `?background=1` and the anatomy test synthesises a `visibilitychange` event; a v1.1.0 minor bump promotes the check.
74
+
75
+ ## Companions
76
+
77
+ `suggestedCompanions` declares `logging` (every refused upload writes one request-scoped log line with the closed refusal reason and the correlation identifier the applied logger factory returns) and `errorHandling` (refusals and transport-layer failures construct an internal error record through the applied error-handling factory so the aria-describedby error message renders a consistent internal representation). Neither is required to apply the blueprint; a project without a logging companion still ships the refusal contract, it just does not emit a per-refusal log line.
78
+
79
+ ## Consumers
80
+
81
+ The round-4 spec's CSV-import candidate would consume this blueprint's transport and refusal contracts; that candidate is not in this round. A downstream `application-forms-wizard` may wire a per-step file-upload field to this blueprint's input TAC.
82
+
83
+ ## Composition with application-spa
84
+
85
+ `application-spa` REQ-006 ships upload, progress and error components as part of its component library. This blueprint composes with SPA; the topic-ownership boundary lives in `docs/topics.md`. SPA owns the visual tokens for the upload region; this sibling owns the input affordances, the transport contract, the refusal contract and the runtime enforcement pack.
@@ -0,0 +1,114 @@
1
+ {
2
+ "slug": "application-file-upload",
3
+ "version": "1.0.0",
4
+ "category": "application",
5
+ "suggestedCompanions": [
6
+ {
7
+ "role": "logging",
8
+ "reason": "Every refused upload writes one request-scoped log line with the refusal reason (mime, size, virus-scan) and the correlation identifier the applied logger factory returns."
9
+ },
10
+ {
11
+ "role": "errorHandling",
12
+ "reason": "Refusals and transport-layer failures construct an internal error record through the applied error-handling factory so the aria-describedby error binding renders a consistent message."
13
+ }
14
+ ],
15
+ "contributions": [
16
+ {
17
+ "id": "application-file-upload-REQ-001",
18
+ "kind": "req",
19
+ "path": "requirements/application-file-upload-req-001.json"
20
+ },
21
+ {
22
+ "id": "application-file-upload-REQ-002",
23
+ "kind": "req",
24
+ "path": "requirements/application-file-upload-req-002.json"
25
+ },
26
+ {
27
+ "id": "application-file-upload-REQ-003",
28
+ "kind": "req",
29
+ "path": "requirements/application-file-upload-req-003.json"
30
+ },
31
+ {
32
+ "id": "application-file-upload-REQ-004",
33
+ "kind": "req",
34
+ "path": "requirements/application-file-upload-req-004.json"
35
+ },
36
+ {
37
+ "id": "application-file-upload-REQ-005",
38
+ "kind": "req",
39
+ "path": "requirements/application-file-upload-req-005.json"
40
+ },
41
+ {
42
+ "id": "application-file-upload-US-23101",
43
+ "kind": "us",
44
+ "path": "user-stories/application-file-upload-us-23101.json"
45
+ },
46
+ {
47
+ "id": "application-file-upload-US-23102",
48
+ "kind": "us",
49
+ "path": "user-stories/application-file-upload-us-23102.json"
50
+ },
51
+ {
52
+ "id": "application-file-upload-US-23103",
53
+ "kind": "us",
54
+ "path": "user-stories/application-file-upload-us-23103.json"
55
+ },
56
+ {
57
+ "id": "application-file-upload-US-23104",
58
+ "kind": "us",
59
+ "path": "user-stories/application-file-upload-us-23104.json"
60
+ },
61
+ {
62
+ "id": "application-file-upload-US-23105",
63
+ "kind": "us",
64
+ "path": "user-stories/application-file-upload-us-23105.json"
65
+ },
66
+ {
67
+ "id": "application-file-upload-US-23106",
68
+ "kind": "us",
69
+ "path": "user-stories/application-file-upload-us-23106.json"
70
+ },
71
+ {
72
+ "id": "application-file-upload-US-23107",
73
+ "kind": "us",
74
+ "path": "user-stories/application-file-upload-us-23107.json"
75
+ },
76
+ {
77
+ "id": "TAC-2401-application-file-upload-input",
78
+ "kind": "tac",
79
+ "path": "tacs/tac-2401-application-file-upload-input.json"
80
+ },
81
+ {
82
+ "id": "TAC-2402-application-file-upload-transport",
83
+ "kind": "tac",
84
+ "path": "tacs/tac-2402-application-file-upload-transport.json"
85
+ },
86
+ {
87
+ "id": "TAC-2403-application-file-upload-progress-announcer",
88
+ "kind": "tac",
89
+ "path": "tacs/tac-2403-application-file-upload-progress-announcer.json"
90
+ },
91
+ {
92
+ "id": "ADR-2401-application-file-upload-transport",
93
+ "kind": "adr",
94
+ "path": "adrs/adr-2401-application-file-upload-transport.json",
95
+ "recommendedDefault": true,
96
+ "elicited": true,
97
+ "standardsTraceClause": "WHATWG Fetch multipart/form-data; tus.io resumable upload protocol 1.0.0"
98
+ },
99
+ {
100
+ "id": "ADR-2402-application-file-upload-accepted-set",
101
+ "kind": "adr",
102
+ "path": "adrs/adr-2402-application-file-upload-accepted-set.json",
103
+ "elicited": true,
104
+ "standardsTraceClause": "IANA media types; generic enterprise practice"
105
+ },
106
+ {
107
+ "id": "ADR-2403-application-file-upload-virus-scan",
108
+ "kind": "adr",
109
+ "path": "adrs/adr-2403-application-file-upload-virus-scan.json",
110
+ "elicited": true,
111
+ "standardsTraceClause": "OWASP ASVS V12 file uploads"
112
+ }
113
+ ]
114
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-2401-application-file-upload-transport",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Transport branch: multipart POST is the recommended default; tus.io 1.0.0 and per-vendor SDK are the elicited alternatives",
8
+ "context": "There are three plausible upload transports for a shelf blueprint whose consumers range from a hobby SPA hitting a Node server to an enterprise SPA hitting Cloudflare R2. Native multipart POST is the least-surprising choice: every server toolkit and every fetch client can send it, the client side of the code is a Blob split into fixed-size chunks, and the server assembles the chunks server-side. The tus.io resumable upload protocol 1.0.0 (RFC-shaped spec) is the strongest choice for large files over spotty connections because it standardises Upload-Offset and Upload-Length headers and a PATCH-per-chunk shape that lets the client resume by re-reading the offset from the server; it needs a tus-server or the third-party tus client library. A per-vendor SDK (S3 multipart, Cloudflare R2 client-direct upload, Cloudinary widget, Uppy with a specific backend) buys the vendor's operational benefits (signed URLs, resumable multipart, CDN write-through) at the price of pinning the client to the vendor and the vendor's SDK release cycle.",
9
+ "decision": "Adopt multipart POST as the recommended default. Every applied blueprint gets multipart out of the box with no configuration. Projects with tus servers or the tus client library elicit the tus branch through this ADR and the transport TAC instantiates the tus adapter. Projects committed to a vendor (S3, R2, Cloudinary) elicit the vendor-sdk branch and supply the SDK client through the applied endpoint config; the transport TAC delegates chunking to the SDK. recommendedDefault is true; elicited is true because the branch is a per-project answer.",
10
+ "consequences": "Projects on the default get a working chunked-and-resumable upload against a plain server with no extra dependency. Projects that need tus wire it in via a small adapter and gain the protocol's cross-vendor portability. Projects on vendor SDKs delegate the wire-level details to the vendor and accept the vendor lock-in as an explicit choice. The pack fires on both the multipart branch and the tus branch of the sample fixture; a vendor-sdk project runs the pack against a fixture that mocks the vendor's completion callback.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "tus-only as the shelf default",
14
+ "summary": "Ship tus.io as the sole transport, on the theory that resumable-by-default is the correct posture.",
15
+ "reasonNotChosen": "Every applied blueprint would need a tus server, which is a hard prerequisite for a shelf blueprint; a hobby SPA hitting a Node server would refuse to apply without stand-up work. The default has to be reachable by every consumer."
16
+ },
17
+ {
18
+ "name": "Vendor-SDK-only",
19
+ "summary": "Ship an SDK-agnostic vendor adapter as the only transport, on the theory that most enterprise uploads eventually pin a vendor.",
20
+ "reasonNotChosen": "A vendor-first shelf pins the shelf to a vendor's SDK release cycle and breaks the vendor-neutral posture of every other application blueprint on the shelf."
21
+ }
22
+ ],
23
+ "createdAt": "2026-09-06T16:55:00Z",
24
+ "updatedAt": "2026-09-06T16:55:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-2402-application-file-upload-accepted-set",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Accepted MIME set and per-file size cap are elicited per project; no shelf default beyond \"nothing accepted\"",
8
+ "context": "A shelf blueprint cannot know what a downstream project's upload endpoint accepts. A photo-gallery product accepts a narrow image set (jpeg, png, webp) with a 20 MB per-file cap; a document workspace accepts pdf, docx, txt with a 100 MB cap; a code-review product accepts a broad set with a 5 MB cap. Picking a default that fits all projects picks one that fits none. Shipping without any elicited values leaves the input TAC in a state where every file is refused (the safe default), which is the correct floor: a project that forgets to elicit the accepted set discovers this immediately on the first upload.",
9
+ "decision": "The accepted MIME set and the per-file size cap are elicited per project through this ADR. The blueprint contributes the two parameters as elicits on apply; the input TAC's MIME gate refuses every file until both are elicited. The elicited MIME set is a list of IANA media types; wildcards (image/*, application/*) are permitted for projects that want them but discouraged in the guide. The per-file size cap is a positive integer in bytes. A concurrency cap and the polling interval for the announcer are secondary elicits with recommended defaults (concurrency 3, interval 250 ms).",
10
+ "consequences": "Projects that apply the blueprint without elicitizing discover the refusal on the first upload attempt and go through the elicit flow to unblock it; the refusal is legible (\"MIME gate has no accepted set\") rather than silently accepting everything. Projects with a mature accepted-set list paste it in once and never revisit. The pack asserts the input TAC refuses an obvious wrong-MIME file (a text/plain payload with a jpeg extension) and refuses a payload exceeding the size cap.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Ship a broad default set (image/*, application/pdf, text/plain)",
14
+ "summary": "Adopt a shelf default that covers the most common cases so most projects can apply without elicitizing.",
15
+ "reasonNotChosen": "Any default that is broad enough to be useful is broad enough to be wrong for a project whose backend cannot accept the same set; the discovery cost of a mismatched accepted set at the server is higher than the discovery cost of the refuse-all floor at the client."
16
+ },
17
+ {
18
+ "name": "Ship no accepted-set gate at all",
19
+ "summary": "Rely on the server to refuse a wrong-MIME upload and skip the client-side gate.",
20
+ "reasonNotChosen": "The server refusal happens after the bytes are on the wire; a client that never gates wastes the operator's upload budget on payloads the server will refuse and loses the aria-describedby error binding the input TAC ships."
21
+ }
22
+ ],
23
+ "createdAt": "2026-09-06T16:55:00Z",
24
+ "updatedAt": "2026-09-06T16:55:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-2403-application-file-upload-virus-scan",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Virus scan integration is a capability-plus-elicit; the operator supplies a verifier or the transport refuses the branch",
8
+ "context": "A file-upload surface that skips virus scanning ships a well-known attack path: a workspace with unmoderated attachments hands a payload from one user to any other user that opens the file. The right answer is server-side scanning against a vendor (ClamAV, VirusTotal, S3 GuardDuty malware protection) plus a client-side hook that refuses to hand a scan-hit file to the user for retry. But the vendor and the wire shape are project decisions: a healthcare product with a HIPAA data path uses a different scanner than a games product with an S3 bucket. The shelf cannot choose one.",
9
+ "decision": "Virus scan integration is a capability-plus-elicit: the blueprint contributes a virusScan capability the input TAC calls (an async predicate over a File that resolves to {clean: true} or {clean: false, reason: <string>}), and the applied capability is elicited per project. Projects with a virus scanner supply the verifier. Projects that explicitly opt out of virus scanning elicit the noop verifier and accept the risk (the guide names the risk in plain language). The pack asserts the input TAC's refusal path fires on a virus-scan hit and that the refused file never leaves the browser.",
10
+ "consequences": "Projects with a scanner apply the blueprint and paste in the verifier. Projects without one see the elicit and either wire in ClamAV/VirusTotal or accept the noop with the guide's warning in hand. The shelf posture is opinionated on the mechanism (a virus-scan hook exists and is called) but neutral on the vendor. A project that ignores the elicit and never supplies a verifier hits an apply-time refusal.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Skip virus scanning at the shelf layer entirely",
14
+ "summary": "Leave scanning to the server and ship no client-side hook.",
15
+ "reasonNotChosen": "The server-side scanner cannot refuse the client's retry loop on a hit without an aria-describedby error binding; the client-side hook is what surfaces the refusal legibly."
16
+ },
17
+ {
18
+ "name": "Bundle ClamAV as the shelf default",
19
+ "summary": "Ship the ClamAV client bindings as the sole verifier.",
20
+ "reasonNotChosen": "Adds a vendor dependency to every applied project and pins the shelf to a scanner that many projects will not use; capability-plus-elicit keeps the shelf vendor-neutral."
21
+ }
22
+ ],
23
+ "createdAt": "2026-09-06T16:55:00Z",
24
+ "updatedAt": "2026-09-06T16:55:00Z"
25
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-file-upload-REQ-001",
3
+ "prdId": "PRD-001",
4
+ "title": "Input contract: a labelled file input plus a drop-zone plus a keyboard alternative per WCAG 2.5.7",
5
+ "description": "The upload surface renders a labelled native file input, a labelled drop-zone region for pointer users, and a keyboard-focusable alternative control that opens the picker on Enter or Space. Every input carries an accessible name via label association or aria-label. The three affordances share the same underlying file collector so a keyboard-only user, a pointer user with drag-drop and a screen-reader user reach the same state. Per WCAG 2.5.7 Dragging Movements, the drop-zone is never the only way to add a file; a click and keyboard path both satisfy the same acceptance criterion.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.2, REQ 1.",
10
+ "tags": [
11
+ "blueprint:application-file-upload",
12
+ "category:01-input-contract"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T16:55:00Z",
17
+ "updatedAt": "2026-09-06T16:55:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-file-upload-REQ-002",
3
+ "prdId": "PRD-001",
4
+ "title": "Progress contract: per-file percent, aggregate percent, and a polite live-region tick",
5
+ "description": "Every file in the upload set carries a per-file percent that advances monotonically from 0 to 100. The surface also carries an aggregate percent that reflects the mean weighted by byte size. A polite live-region wrapper (aria-live polite) receives a text tick at least every 10 percent of aggregate progress with the string format \"<uploaded> of <total> files, <PP> percent\". The polite wrapper is preseeded at render time so a screen reader adopts it before the first tick fires.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.2, REQ 2.",
10
+ "tags": [
11
+ "blueprint:application-file-upload",
12
+ "category:02-progress-contract"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T16:55:00Z",
17
+ "updatedAt": "2026-09-06T16:55:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-file-upload-REQ-003",
3
+ "prdId": "PRD-001",
4
+ "title": "Refusal contract: MIME-type, size-limit and virus-scan refusals with an aria-describedby error binding and focus-to-retry",
5
+ "description": "The upload surface refuses a file that fails the MIME-type gate, exceeds the per-file size cap, or matches the virus-scan hit. Every refusal renders a per-file error message inside a region bound to the file row via aria-describedby, moves keyboard focus to the row's retry control, and refuses to send the file to the server. The refusal reason is one of the closed strings mime-refused, size-refused, virus-refused so a project's log pipeline can classify without prose parsing.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.2, REQ 3.",
10
+ "tags": [
11
+ "blueprint:application-file-upload",
12
+ "category:03-refusal-contract"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T16:55:00Z",
17
+ "updatedAt": "2026-09-06T16:55:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-file-upload-REQ-004",
3
+ "prdId": "PRD-001",
4
+ "title": "Transport contract: chunked-and-resumable, multipart POST default, tus.io elicited alternative",
5
+ "description": "The upload transport is chunked-and-resumable: an interrupted upload resumes from the last acknowledged offset on retry, and the client retries on transient failures without re-sending acknowledged bytes. The recommended default is a multipart POST with the file split into fixed-size chunks the server assembles server-side. The tus.io resumable upload protocol 1.0.0 is the elicited alternative for projects with a tus server or the third-party SDK; when applied it exposes an Upload-Offset header per PATCH request and supports server-side pause and resume. A per-vendor SDK (S3 multipart, Cloudflare R2 client-direct) is the second elicited alternative when the project has committed to a vendor library.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.2, REQ 4.",
10
+ "tags": [
11
+ "blueprint:application-file-upload",
12
+ "category:04-transport-contract"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T16:55:00Z",
17
+ "updatedAt": "2026-09-06T16:55:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-file-upload-REQ-005",
3
+ "prdId": "PRD-001",
4
+ "title": "Completion contract: assertive-slot success announcement per WCAG 4.1.3 plus per-file remove and retry",
5
+ "description": "On successful completion of the upload set, the surface renders an assertive-slot announcement in a wrapper carrying role=status or aria-live=assertive with the string \"<N> files uploaded successfully\", per WCAG 4.1.3 Status Messages. Every completed file row carries a keyboard-reachable remove control (returns the row to the pre-upload state and issues a DELETE against the transport where the transport supports removal) and a retry control (visible only after a refusal or a transport error). The completion announcement fires exactly once per set; a retried refusal that then succeeds increments the completed count but does not re-announce.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.2, REQ 5.",
10
+ "tags": [
11
+ "blueprint:application-file-upload",
12
+ "category:05-completion-contract"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T16:55:00Z",
17
+ "updatedAt": "2026-09-06T16:55:00Z"
18
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "tacId": "TAC-2401-application-file-upload-input",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Upload input surface",
8
+ "purpose": "Owns the input-side surface of the file-upload contract: the labelled file input, the drop-zone region, the keyboard-focusable picker-opener, the accessible-name binding, the file-collector aggregating the three input paths into one selection set, and the refusal-render seam. Every AC on REQ-001 and REQ-003 that reads the surface anchors on this TAC.",
9
+ "responsibilities": [
10
+ "Render a labelled <input type=\"file\"> with a keyboard-reachable label and an accessible name (AC-23101-1).",
11
+ "Render a [data-drop-zone] region that accepts dropped files but is never the only input path (WCAG 2.5.7).",
12
+ "Render a [data-open-picker] button that opens the same picker on Enter or Space (AC-23101-1).",
13
+ "Aggregate the three input paths into one file-selection set the transport TAC drains (AC-23101-1).",
14
+ "Render a per-file error region with an aria-describedby binding and a [data-recovery=\"retry\"] control on refusal, and hand refused files to the transport TAC's refusal-render seam so no bytes leave the browser (AC-23103-1)."
15
+ ],
16
+ "internalStructure": "One input-surface module the shell mounts on route entry. On file addition the module normalises the three input paths (input change, drop event, picker-opener button) into a File[] selection set, tags each entry with a stable [data-file-row] id, runs the accepted-set gates (MIME per ADR-2402, size per ADR-2402) and the virus-scan hook per ADR-2403 before handing the set to the transport TAC. Refusal renders inside the file row with a [data-error-message] element whose id is referenced by the row's aria-describedby attribute; the closed refusal-reason enum {mime-refused, size-refused, virus-refused} rides [data-refusal-reason].",
17
+ "interfaces": [
18
+ {
19
+ "name": "collectFiles",
20
+ "kind": "factory",
21
+ "description": "collectFiles({ inputEvent | dropEvent | pickerClick }) -> FileSelection. Every input path routes through this factory."
22
+ },
23
+ {
24
+ "name": "renderRefusal",
25
+ "kind": "factory",
26
+ "description": "renderRefusal({ fileRow, reason }) -> void. Binds the error region to the row via aria-describedby, sets [data-refusal-reason], focuses the [data-recovery=\"retry\"] control."
27
+ },
28
+ {
29
+ "name": "affordancesEnum",
30
+ "kind": "shape",
31
+ "description": "The three input affordances (input, drop-zone, keyboard-opener) are the closed enum {file-input, drop-zone, keyboard-opener}. Removing one is a v2.0.0 major bump."
32
+ }
33
+ ],
34
+ "dependencies": [
35
+ {
36
+ "name": "Transport contract",
37
+ "kind": "tac",
38
+ "tacId": "TAC-2402-application-file-upload-transport",
39
+ "description": "The input surface hands accepted files to the transport TAC and honours its refusal-render seam on virus-scan hits."
40
+ }
41
+ ],
42
+ "tradeoffs": "One input-surface module keeps the WCAG 2.5.7 discipline lint-checkable but ties every framework to the collectFiles factory. Projects using a vendor upload widget (Filepond, Uppy) satisfy the surface by adapting the vendor's mount seam to the TAC's factories rather than rewriting the collector. Known mechanism-reach gap: the pack cannot exhaustively probe every drop-target inside a nested drop-zone; the primary drop-zone attribute is asserted.",
43
+ "notes": "See README Known mechanism-reach gaps for the full list.",
44
+ "createdAt": "2026-09-06T16:55:00Z",
45
+ "updatedAt": "2026-09-06T16:55:00Z"
46
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "tacId": "TAC-2402-application-file-upload-transport",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Upload transport contract",
8
+ "purpose": "Owns the wire-level side of the file-upload contract: chunking, resumption, the multipart POST default, the tus.io elicited alternative, the refusal-render seam, and the completion callback. Every AC on REQ-004 that reads the request log anchors on this TAC.",
9
+ "responsibilities": [
10
+ "Split each accepted file into fixed-size chunks and upload chunks in bounded parallelism (default 3) (AC-23104-1).",
11
+ "On the multipart branch, POST the chunk set to the applied endpoint and assemble server-side; expose [data-transport=\"multipart\"] and [data-chunks-uploaded] on the file row (AC-23104-1).",
12
+ "On the tus branch, PATCH chunks to the tus creation URL with an Upload-Offset header per request; expose [data-transport=\"tus\"] (AC-23104-1).",
13
+ "On interruption, pause the upload and resume from the last acknowledged offset on reconnect, without re-sending acknowledged bytes (AC-23106-1).",
14
+ "Refuse to enqueue a refused file (mime, size, virus-scan) and hand control back to TAC-2401's refusal-render seam (AC-23103-1).",
15
+ "Call the progress-announcer TAC with per-chunk acknowledgements so the per-file and aggregate percent advance (AC-23102-1)."
16
+ ],
17
+ "internalStructure": "One transport module the input TAC drains. The module reads the applied ADR-2401 branch (multipart, tus, per-vendor SDK) and instantiates one of three adapter shapes. Each adapter drains the file-selection set through a bounded worker pool (concurrency default 3, elicited cap), tracks per-file [data-chunks-uploaded], and posts an acknowledgement event on every server acknowledgement the progress-announcer TAC reads. Interruption is detected via fetch reject (multipart) or the tus client's onError seam (tus); resumption re-fetches the Upload-Offset (tus) or resumes from the last completed chunk index (multipart). The refusal-render seam is a thin wrapper the input TAC calls, not a separate class, so the input surface stays authoritative.",
18
+ "interfaces": [
19
+ {
20
+ "name": "uploadFile",
21
+ "kind": "factory",
22
+ "description": "uploadFile({ file, endpoint, transport }) -> UploadSession. Returns a session the caller reads for per-chunk progress and completion."
23
+ },
24
+ {
25
+ "name": "resumeSession",
26
+ "kind": "factory",
27
+ "description": "resumeSession(session) -> UploadSession. Resumes from the last acknowledged offset."
28
+ },
29
+ {
30
+ "name": "transportsEnum",
31
+ "kind": "shape",
32
+ "description": "The transport branches are the closed enum {multipart, tus, vendor-sdk}. multipart is the recommended default per ADR-2401."
33
+ }
34
+ ],
35
+ "dependencies": [
36
+ {
37
+ "name": "Progress announcer",
38
+ "kind": "tac",
39
+ "tacId": "TAC-2403-application-file-upload-progress-announcer",
40
+ "description": "The transport calls the announcer's tick on every acknowledged chunk."
41
+ }
42
+ ],
43
+ "tradeoffs": "Three transport branches keep the shelf usable for teams already committed to a vendor SDK, but the per-branch adapter code is real work; a project that never elicits tus or a vendor SDK ships with the multipart adapter only. Bounded parallelism (default 3) is a heuristic; a slow-link project can lower it via the applied endpoint config. Known mechanism-reach gap: the pack cannot probe a network-interruption resume path on the multipart branch without a request-blocking driver; the fixture simulates the pause via a ?interrupt=1 branch and the pack reads the resulting DOM state.",
44
+ "notes": "See README Known mechanism-reach gaps for the full list.",
45
+ "createdAt": "2026-09-06T16:55:00Z",
46
+ "updatedAt": "2026-09-06T16:55:00Z"
47
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "tacId": "TAC-2403-application-file-upload-progress-announcer",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Upload progress announcer",
8
+ "purpose": "Owns the announcement side of the file-upload contract: the polite live-region wrapper the transport ticks, the aggregate-percent calculator, the assertive-slot completion announcement, and the background-tab tick continuity. Every AC on REQ-002 and REQ-005 that reads the aria-live regions anchors on this TAC.",
9
+ "responsibilities": [
10
+ "Mount the polite live-region wrapper at render time so a screen reader adopts it before the first tick (AC-23102-1).",
11
+ "Emit a polite text tick every 10 percent of aggregate progress in the closed format \"<uploaded> of <total> files, <PP> percent\" (AC-23102-1).",
12
+ "Compute the aggregate percent as the mean weighted by byte size across the active file set (AC-23102-1).",
13
+ "On completion of the set, mount an assertive-slot announcement (aria-live=\"assertive\" or role=\"status\") with the closed text \"<N> files uploaded successfully\", exactly once per set (AC-23105-1).",
14
+ "Continue ticking under document visibilitychange to hidden so a backgrounded tab does not stall the announcement (AC-23107-1)."
15
+ ],
16
+ "internalStructure": "One announcer module the transport hooks. The module preseeds the polite wrapper (aria-live polite) on mount, reads per-chunk acknowledgements from the transport, updates a per-file percent + aggregate percent record, and pushes a text tick every time the floor(aggregate/10) integer changes. Completion detection is a single flag; the assertive slot is mounted on mount as an empty wrapper and its textContent is set exactly once per set. Background-tab continuity is achieved by using setInterval on the ack polling loop rather than requestAnimationFrame; the interval keeps firing when the tab is hidden. A project that wants to pause on hidden explicitly elicits the alternative.",
17
+ "interfaces": [
18
+ {
19
+ "name": "tick",
20
+ "kind": "factory",
21
+ "description": "tick({ fileRowId, bytesAcknowledged, totalBytes }) -> void. Transport calls this on every acknowledgement."
22
+ },
23
+ {
24
+ "name": "complete",
25
+ "kind": "factory",
26
+ "description": "complete({ successCount }) -> void. Transport calls this exactly once per set."
27
+ },
28
+ {
29
+ "name": "announcementFormatsEnum",
30
+ "kind": "shape",
31
+ "description": "The polite format is fixed: /^\\d+ of \\d+ files, \\d{1,3} percent$/; the assertive format is fixed: /^\\d+ files uploaded successfully$/. Localisation is a v1.1.0 minor bump extending the enum with a lookup table."
32
+ }
33
+ ],
34
+ "dependencies": [
35
+ {
36
+ "name": "Transport contract",
37
+ "kind": "tac",
38
+ "tacId": "TAC-2402-application-file-upload-transport",
39
+ "description": "The announcer reads per-chunk acknowledgements from the transport."
40
+ }
41
+ ],
42
+ "tradeoffs": "One announcer module keeps the aria-live discipline testable but pins the wire format in English at v1.0.0; a localised project elicits the format table in a v1.1.0 minor. Known mechanism-reach gap: the pack asserts the polite wrapper's textContent format but does not additionally probe screen-reader adoption (that requires a real assistive tech in the loop).",
43
+ "notes": "See README Known mechanism-reach gaps for the full list.",
44
+ "createdAt": "2026-09-06T16:55:00Z",
45
+ "updatedAt": "2026-09-06T16:55:00Z"
46
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "application-file-upload-US-23101",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-file-upload-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The upload surface renders a labelled file input, a drop-zone region and a keyboard-focusable alternative that opens the picker on Enter",
8
+ "asA": "operator selecting files to upload, whether by pointer, drag-drop or keyboard alone",
9
+ "iWant": "a labelled native file input, a drop-zone region and a keyboard-focusable button that opens the picker so I can add files from whichever input mode I use",
10
+ "soThat": "I never have to drag to add a file and my screen reader announces the picker rather than a silent drop-zone",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-23101-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "The upload region carries [data-surface=\"file-upload\"] and inside it: a labelled <input type=\"file\"> with a keyboard-reachable label (an id-referenced <label> or an aria-label), a [data-drop-zone] region, and a keyboard-focusable [data-open-picker] button that opens the same picker on Enter or Space. The pack drives the real browser to /upload, asserts the three affordances are present, focuses the [data-open-picker] control and presses Enter, then reads that the file input received focus."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2401-application-file-upload-input"
21
+ ],
22
+ "tags": [
23
+ "blueprint:application-file-upload",
24
+ "affordance:input-plus-drop-plus-keyboard"
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-23102",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-file-upload-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The progress announcer emits per-file and aggregate progress through a polite live-region wrapper",
8
+ "asA": "operator watching an upload progress on a screen reader or a low-vision magnifier",
9
+ "iWant": "a polite live-region tick every 10 percent of aggregate progress that names how many files have completed out of how many",
10
+ "soThat": "I know the upload is still working without watching the screen and I can tell when it stalls",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-23102-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "The upload region ships a [data-live-region=\"polite\"] wrapper with aria-live=\"polite\" preseeded at render time. During an upload the wrapper's textContent matches /^\\d+ of \\d+ files, \\d{1,3} percent$/ and the numeric aggregate percent advances monotonically. Per-file rows carry [data-file-row] with a [data-file-progress] element whose text or aria-valuenow reflects the per-file percent. The pack drives /upload?transport=multipart, starts the upload, and reads the wrapper text plus one per-file progress value before completion."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2403-application-file-upload-progress-announcer"
21
+ ],
22
+ "tags": [
23
+ "blueprint:application-file-upload",
24
+ "affordance:polite-progress"
25
+ ],
26
+ "createdAt": "2026-09-06T16:55:00Z",
27
+ "updatedAt": "2026-09-06T16:55:00Z"
28
+ }