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,246 @@
1
+ // application-account-settings probe pack (v1.0.0).
2
+ //
3
+ // Five capability-gated checks anchored to the blueprint AC ids:
4
+ // AC-25101-1 shell tabs mirror the applied capability set (always fires; guard-checked)
5
+ // AC-25102-1 profile surface renders with WCAG 1.3.5 autocomplete tokens (always fires)
6
+ // AC-25105-1 security surface renders the branch matching the applied capability +
7
+ // the elicited security-surface-shape (fires when credentialSelfService or
8
+ // hostedIdentityUi is applied)
9
+ // AC-25106-1 sessions surface lists rows and renders the ARIA APG dialog-modal on
10
+ // terminate (fires when sessionInventory is applied)
11
+ // AC-25108-1 theme surface renders the radiogroup and persists per the elicited
12
+ // theme-persistence (fires when application-spa is applied via caps)
13
+ //
14
+ // Every check drives the real Playwright browser the T-0 runner injects and reads
15
+ // its per-check applicability from the blueprint applied sidecar
16
+ // (rcf/blueprints/application-account-settings.applied.json) written by the apply
17
+ // verb: an absent capability records verdict: skipped and the aggregate treats the
18
+ // check as neither pass nor fail (spec section 3.3, rcf-schemas 0.6.1 has no
19
+ // applicable: false field, per round-3 T-5 precedent).
20
+ //
21
+ // Sample-app fixture: packages/rcf-lite/test/fixtures/probe-pack-application-account-settings/.
22
+ // The fixture ships CAPS and APPS env / ?caps= / ?apps= switches mirroring the
23
+ // applied capability set so the pack can be probed for every fixture combination
24
+ // on the shelf gate.
25
+
26
+ import { readFile } from 'node:fs/promises';
27
+ import { join } from 'node:path';
28
+
29
+ async function readAppliedCapabilities(projectRoot) {
30
+ if (!projectRoot) return [];
31
+ try {
32
+ const raw = await readFile(join(projectRoot, 'rcf', 'blueprints', 'application-account-settings.applied.json'), 'utf8');
33
+ const doc = JSON.parse(raw);
34
+ return Array.isArray(doc.appliedCapabilities) ? doc.appliedCapabilities.slice() : [];
35
+ } catch {
36
+ return [];
37
+ }
38
+ }
39
+
40
+ async function readAppliedElicitations(projectRoot) {
41
+ if (!projectRoot) return {};
42
+ try {
43
+ const raw = await readFile(join(projectRoot, 'rcf', 'blueprints', 'application-account-settings.applied.json'), 'utf8');
44
+ const doc = JSON.parse(raw);
45
+ return typeof doc.appliedElicitations === 'object' && doc.appliedElicitations ? doc.appliedElicitations : {};
46
+ } catch {
47
+ return {};
48
+ }
49
+ }
50
+
51
+ function withUrl(runtimeUrl, path) {
52
+ return new URL(path, runtimeUrl).toString();
53
+ }
54
+
55
+ export default {
56
+ packName: 'application-account-settings',
57
+ version: '1.0.0',
58
+ blueprintSlug: 'application-account-settings',
59
+ appliesTo: ({ fbs }) => {
60
+ const routes = fbs?.designStage?.navModel?.routes ?? [];
61
+ const tacIds = fbs?.contextRequirements?.tacIds ?? [];
62
+ if (tacIds.includes('TAC-2601-application-account-settings-shell')) return true;
63
+ return routes.some((r) => typeof r?.path === 'string' && /\/(account|settings|profile)(\/|$)/.test(r.path));
64
+ },
65
+ boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
66
+ checks: [
67
+ {
68
+ id: 'AC-25101-1',
69
+ severity: 'block',
70
+ description: 'Shell renders as an ARIA APG tabs region and its tabs mirror the union of applied capabilities plus the always-on profile tab; a tab whose capability is not applied does not render',
71
+ appliesTo: async () => true,
72
+ run: async ({ browser, runtimeUrl, projectRoot }) => {
73
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
74
+ const caps = await readAppliedCapabilities(projectRoot);
75
+ await browser.goto(withUrl(runtimeUrl, '/account'));
76
+ const dom = await browser.evaluate(() => {
77
+ const nav = document.querySelector('nav[data-role="account-settings-nav"]');
78
+ if (!nav) return { present: false };
79
+ const tabs = Array.from(nav.querySelectorAll('[role="tab"]')).map((t) => t.getAttribute('data-tab-id'));
80
+ const role = nav.getAttribute('role');
81
+ const ariaLabel = nav.getAttribute('aria-label');
82
+ return { present: true, tabs, role, ariaLabel };
83
+ });
84
+ if (!dom.present) return { verdict: 'fail', detail: 'nav[data-role="account-settings-nav"] not found' };
85
+ if (dom.role !== 'tablist') return { verdict: 'fail', detail: `nav role expected tablist, got ${dom.role}` };
86
+ if (!dom.ariaLabel) return { verdict: 'fail', detail: 'nav missing aria-label (accessible name)' };
87
+ if (!dom.tabs.includes('profile')) return { verdict: 'fail', detail: `profile tab missing from ${JSON.stringify(dom.tabs)}` };
88
+ const securityExpected = caps.includes('credentialSelfService') || caps.includes('hostedIdentityUi');
89
+ const securityRendered = dom.tabs.includes('security');
90
+ if (securityExpected && !securityRendered) return { verdict: 'fail', detail: `security tab expected (caps=${JSON.stringify(caps)}) but not rendered` };
91
+ if (!securityExpected && securityRendered) return { verdict: 'fail', detail: `security tab rendered but caps=${JSON.stringify(caps)} declare neither credentialSelfService nor hostedIdentityUi (leak)` };
92
+ const sessionsExpected = caps.includes('sessionInventory');
93
+ const sessionsRendered = dom.tabs.includes('sessions');
94
+ if (sessionsExpected && !sessionsRendered) return { verdict: 'fail', detail: `sessions tab expected but not rendered` };
95
+ if (!sessionsExpected && sessionsRendered) return { verdict: 'fail', detail: `sessions tab rendered but sessionInventory not applied (leak)` };
96
+ return { verdict: 'pass', detail: `tabs=${JSON.stringify(dom.tabs)} caps=${JSON.stringify(caps)}` };
97
+ },
98
+ },
99
+ {
100
+ id: 'AC-25102-1',
101
+ severity: 'block',
102
+ description: 'Profile surface renders a form with WCAG 1.3.5 autocomplete tokens (name, email, bday, country) and a polite aria-live save-status region',
103
+ appliesTo: async () => true,
104
+ run: async ({ browser, runtimeUrl }) => {
105
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
106
+ await browser.goto(withUrl(runtimeUrl, '/account/profile'));
107
+ const dom = await browser.evaluate(() => {
108
+ const form = document.querySelector('form[data-surface="profile"]');
109
+ if (!form) return { present: false };
110
+ const nameAuto = form.querySelector('input[name="name"]')?.getAttribute('autocomplete');
111
+ const emailAuto = form.querySelector('input[name="email"]')?.getAttribute('autocomplete');
112
+ const bdayAuto = form.querySelector('input[name="bday"]')?.getAttribute('autocomplete');
113
+ const countryAuto = form.querySelector('input[name="country"]')?.getAttribute('autocomplete');
114
+ const status = form.querySelector('[role="status"][aria-live="polite"]');
115
+ return { present: true, nameAuto, emailAuto, bdayAuto, countryAuto, statusPresent: !!status };
116
+ });
117
+ if (!dom.present) return { verdict: 'fail', detail: 'form[data-surface="profile"] not found' };
118
+ if (dom.nameAuto !== 'name') return { verdict: 'fail', detail: `name autocomplete token expected "name", got "${dom.nameAuto}"` };
119
+ if (dom.emailAuto !== 'email') return { verdict: 'fail', detail: `email autocomplete token expected "email", got "${dom.emailAuto}"` };
120
+ if (dom.bdayAuto !== 'bday') return { verdict: 'fail', detail: `bday autocomplete token expected "bday", got "${dom.bdayAuto}"` };
121
+ if (dom.countryAuto !== 'country') return { verdict: 'fail', detail: `country autocomplete token expected "country", got "${dom.countryAuto}"` };
122
+ if (!dom.statusPresent) return { verdict: 'fail', detail: 'save-status region [role="status"][aria-live="polite"] not found' };
123
+ return { verdict: 'pass', detail: `autocomplete tokens name+email+bday+country present; save-status present` };
124
+ },
125
+ },
126
+ {
127
+ id: 'AC-25105-1',
128
+ severity: 'block',
129
+ description: 'Security surface renders the self-service branch when credentialSelfService is applied and security-surface-shape=self-service; renders the hosted-link-out or hosted-embed branch when hostedIdentityUi is applied and security-surface-shape matches',
130
+ appliesTo: async ({ projectRoot }) => {
131
+ const caps = await readAppliedCapabilities(projectRoot);
132
+ return caps.includes('credentialSelfService') || caps.includes('hostedIdentityUi');
133
+ },
134
+ run: async ({ browser, runtimeUrl, projectRoot }) => {
135
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
136
+ const caps = await readAppliedCapabilities(projectRoot);
137
+ const elicits = await readAppliedElicitations(projectRoot);
138
+ const shape = elicits['security-surface-shape'] ?? 'self-service';
139
+ await browser.goto(withUrl(runtimeUrl, `/account/security?security-surface-shape=${encodeURIComponent(shape)}`));
140
+ const dom = await browser.evaluate(() => {
141
+ const region = document.querySelector('[data-surface="security"]');
142
+ if (!region) return { present: false };
143
+ return {
144
+ present: true,
145
+ branch: region.getAttribute('data-branch'),
146
+ hasPassword: !!region.querySelector('[data-role="change-password"]'),
147
+ hasMfa: !!region.querySelector('[data-role="mfa-management"]'),
148
+ hasLinkOut: !!region.querySelector('[data-role="hosted-link-out"]'),
149
+ hasEmbed: !!region.querySelector('[data-role="hosted-embed"]'),
150
+ linkRel: region.querySelector('[data-role="hosted-link-out"]')?.getAttribute('rel'),
151
+ embedSandbox: region.querySelector('[data-role="hosted-embed"]')?.getAttribute('sandbox'),
152
+ };
153
+ });
154
+ if (!dom.present) return { verdict: 'fail', detail: '[data-surface="security"] not found' };
155
+ if (caps.includes('credentialSelfService') && shape === 'self-service') {
156
+ if (!dom.hasPassword) return { verdict: 'fail', detail: 'self-service branch missing [data-role="change-password"]' };
157
+ if (!dom.hasMfa) return { verdict: 'fail', detail: 'self-service branch missing [data-role="mfa-management"]' };
158
+ } else if (caps.includes('hostedIdentityUi') && shape === 'hosted-link-out') {
159
+ if (!dom.hasLinkOut) return { verdict: 'fail', detail: 'hosted-link-out branch missing [data-role="hosted-link-out"]' };
160
+ if (!/noopener/.test(dom.linkRel || '')) return { verdict: 'fail', detail: `hosted-link-out missing rel=noopener (rel="${dom.linkRel}")` };
161
+ } else if (caps.includes('hostedIdentityUi') && shape === 'hosted-embed') {
162
+ if (!dom.hasEmbed) return { verdict: 'fail', detail: 'hosted-embed branch missing [data-role="hosted-embed"]' };
163
+ if (!/allow-scripts/.test(dom.embedSandbox || '')) return { verdict: 'fail', detail: `hosted-embed sandbox missing allow-scripts (got "${dom.embedSandbox}")` };
164
+ } else {
165
+ return { verdict: 'fail', detail: `no branch matches caps=${JSON.stringify(caps)} shape="${shape}"` };
166
+ }
167
+ return { verdict: 'pass', detail: `branch=${dom.branch} caps=${JSON.stringify(caps)} shape="${shape}"` };
168
+ },
169
+ },
170
+ {
171
+ id: 'AC-25106-1',
172
+ severity: 'block',
173
+ description: 'Sessions surface renders one row per active session enumerated by data-session-id with device and last-active columns plus a terminate action; opens an ARIA APG dialog-modal on terminate',
174
+ appliesTo: async ({ projectRoot }) => {
175
+ const caps = await readAppliedCapabilities(projectRoot);
176
+ return caps.includes('sessionInventory');
177
+ },
178
+ run: async ({ browser, runtimeUrl }) => {
179
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
180
+ await browser.goto(withUrl(runtimeUrl, '/account/sessions'));
181
+ const dom = await browser.evaluate(() => {
182
+ const region = document.querySelector('[data-surface="sessions"]');
183
+ if (!region) return { present: false };
184
+ const rows = Array.from(region.querySelectorAll('[data-session-id]'));
185
+ const ids = rows.map((r) => r.getAttribute('data-session-id'));
186
+ const firstRowColumns = rows[0] ? Array.from(rows[0].querySelectorAll('[data-column]')).map((c) => c.getAttribute('data-column')) : [];
187
+ const nonCurrentTerminates = rows.filter((r) => r.getAttribute('data-current-session') !== 'true').every((r) => !!r.querySelector('[data-action="terminate"]'));
188
+ const currentRow = rows.find((r) => r.getAttribute('data-current-session') === 'true');
189
+ const currentHasTerminate = currentRow ? !!currentRow.querySelector('[data-action="terminate"]') : false;
190
+ const dialog = region.querySelector('[role="dialog"][aria-modal="true"][data-role="terminate-confirm"]');
191
+ const dialogLabel = dialog ? dialog.getAttribute('aria-labelledby') : null;
192
+ const announce = region.querySelector('[role="status"][aria-live="polite"][data-role="session-terminated-announce"]');
193
+ return { present: true, ids, firstRowColumns, nonCurrentTerminates, currentHasTerminate, dialogPresent: !!dialog, dialogLabel, announcePresent: !!announce };
194
+ });
195
+ if (!dom.present) return { verdict: 'fail', detail: '[data-surface="sessions"] not found' };
196
+ if (dom.ids.length === 0) return { verdict: 'fail', detail: 'sessions surface rendered no rows with data-session-id' };
197
+ const required = ['device', 'lastActive'];
198
+ const missing = required.filter((c) => !dom.firstRowColumns.includes(c));
199
+ if (missing.length > 0) return { verdict: 'fail', detail: `sessions rows missing columns: ${JSON.stringify(missing)} present=${JSON.stringify(dom.firstRowColumns)}` };
200
+ if (!dom.nonCurrentTerminates) return { verdict: 'fail', detail: 'at least one non-current session row missing [data-action="terminate"]' };
201
+ if (dom.currentHasTerminate) return { verdict: 'fail', detail: 'the current-session row must not carry [data-action="terminate"]' };
202
+ if (!dom.dialogPresent) return { verdict: 'fail', detail: 'terminate confirmation dialog [role="dialog"][aria-modal="true"] not rendered' };
203
+ if (!dom.dialogLabel) return { verdict: 'fail', detail: 'dialog missing aria-labelledby' };
204
+ if (!dom.announcePresent) return { verdict: 'fail', detail: 'session-terminated announce region not rendered' };
205
+ return { verdict: 'pass', detail: `rows=${JSON.stringify(dom.ids)} columns=${JSON.stringify(dom.firstRowColumns)} dialog=${dom.dialogPresent}` };
206
+ },
207
+ },
208
+ {
209
+ id: 'AC-25108-1',
210
+ severity: 'block',
211
+ description: 'Theme surface renders as an ARIA APG radiogroup with light/dark/system options and persists per the elicited theme-persistence',
212
+ appliesTo: async ({ projectRoot }) => {
213
+ // The theme surface gates on application-spa being applied. On the
214
+ // fixture side we mirror this via the ?apps=application-spa switch.
215
+ // A future minor bump reads the manifest.blueprints[] set directly;
216
+ // for v1 the applied-blueprint set is inferred from the caps sidecar
217
+ // and the appliedElicitations map (theme-persistence answered => spa applied).
218
+ const elicits = await readAppliedElicitations(projectRoot);
219
+ return typeof elicits['theme-persistence'] === 'string';
220
+ },
221
+ run: async ({ browser, runtimeUrl, projectRoot }) => {
222
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
223
+ const elicits = await readAppliedElicitations(projectRoot);
224
+ const persist = elicits['theme-persistence'] ?? 'spa-local-storage';
225
+ await browser.goto(withUrl(runtimeUrl, `/account/theme?apps=application-spa&theme-persistence=${encodeURIComponent(persist)}`));
226
+ const dom = await browser.evaluate(() => {
227
+ const region = document.querySelector('[data-surface="theme"]');
228
+ if (!region) return { present: false };
229
+ const role = region.getAttribute('role');
230
+ const ariaLabel = region.getAttribute('aria-label');
231
+ const persistAttr = region.getAttribute('data-persist');
232
+ const options = Array.from(region.querySelectorAll('input[type="radio"][name="theme"]')).map((el) => el.getAttribute('value'));
233
+ return { present: true, role, ariaLabel, persistAttr, options };
234
+ });
235
+ if (!dom.present) return { verdict: 'fail', detail: '[data-surface="theme"] not found' };
236
+ if (dom.role !== 'radiogroup') return { verdict: 'fail', detail: `role expected radiogroup, got ${dom.role}` };
237
+ if (!dom.ariaLabel) return { verdict: 'fail', detail: 'radiogroup missing aria-label' };
238
+ const required = ['light', 'dark', 'system'];
239
+ const missing = required.filter((v) => !dom.options.includes(v));
240
+ if (missing.length > 0) return { verdict: 'fail', detail: `radiogroup missing options: ${JSON.stringify(missing)} present=${JSON.stringify(dom.options)}` };
241
+ if (dom.persistAttr !== persist) return { verdict: 'fail', detail: `data-persist expected "${persist}", got "${dom.persistAttr}"` };
242
+ return { verdict: 'pass', detail: `role=${dom.role} options=${JSON.stringify(dom.options)} persist=${dom.persistAttr}` };
243
+ },
244
+ },
245
+ ],
246
+ };
@@ -0,0 +1,11 @@
1
+ # application-admin-console CHANGELOG
2
+
3
+ ## 1.0.0 (visual round T-5, spec 2026-09-04)
4
+
5
+ - First ratified version of the shelf's admin-console blueprint. Six REQs (console shell with no dead links, conditional users, conditional roles with Owner + Admin + Member + Viewer baseline, conditional orgs, conditional audit-log, access-denied plus request-access), nine USs 21101-21109 binding 16 runtime-observable ACs, four TACs 2201-2204 (shell, capability discovery, permission matrix, audit view consuming datatable), four ADRs 2201-2204 (capability vocabulary, baseline roles, invite transport, audit retention). No new global topics.
6
+ - Introduces the capability-declaration mechanism: `capabilities[]` on identity blueprints (v1.1.0 minor bumps on magic-link, clerk, oauth2, keycloak land in the same PR per spec Q2 default), `requiresAppliedCapabilities` and `elicits[]` on consumer blueprints, apply-time discovery via source read-back on `manifest.blueprints[]`, exit-3 refusal with the spec 5.5.1 verbatim message on bare-SPA applies, and a `--allow-no-auth-yet` operator override.
7
+ - Persists per-project apply-time state in a sidecar `rcf/blueprints/application-admin-console.applied.json` (the applied-blueprint-record schema in rcf-schemas 0.6.0 is closed under additionalProperties:false; the source-manifest read-back precedent from the T-2 core-companions train applies here). The sidecar carries `appliedCapabilities`, `appliedElicitations`, `allowNoAuthYet?` and `notes?`.
8
+ - Ships `probe-packs/application-admin-console.pack.mjs`: four capability-gated browser-verify checks anchored to AC-21102-1 (users), AC-21103-1 (permission matrix), AC-21104-1 (org switcher), AC-21105-1 (audit-log surface). Each check reads the applied capability sidecar and records `applicable: false` where its required capability is absent (T-5 residual cure). Fifth shipped consumer of T-0's probe-pack runner extension.
9
+ - Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-admin-console/` with `CAPS` env or `?caps=` query switch selecting which surfaces exist, break switches for the negative runs (matrix-grid, denied, audit-fields), and the mandatory README for the gate reviewer.
10
+ - Consumes `application-datatable` (T-1) for the users and audit surfaces; declares `suggestedCompanions` logging and errorHandling.
11
+ - Does NOT declare `providesRoles` per spec 5.5.3 (the console is a consumer of `principalDirectory`, never a provider).
@@ -0,0 +1,98 @@
1
+ # Admin console blueprint (v1.0.0)
2
+
3
+ Vendor-neutral admin-console shell for an rcf-lite application. Surfaces are CONDITIONAL on what the applied identity blueprint declares. Ships the console shell with navigation across the applied surfaces (no dead links to unapplied capabilities), a users directory with invite and deactivate controls, a permission matrix rendered as an ARIA APG grid with the Owner + Admin + Member + Viewer baseline, an org switcher for multi-tenant projects, an audit-log surface reading a delivered event stream, and an access-denied and request-access state per WCAG. Introduces the capability-declaration mechanism (`capabilities[]` on identity blueprints) and the apply-time discovery, refusal and custom-auth elicitation the spec section 5.5 ratifies. Ships a Playwright probe pack under `probe-packs/application-admin-console.pack.mjs` whose four checks are capability-gated: an absent capability records `applicable: false` and the aggregate verdict treats it as neither pass nor fail (spec section 3.3).
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/application-admin-console
9
+ ```
10
+
11
+ Refuses with exit 3 and the spec 5.5.1 verbatim message on a project with no applied blueprint declaring `principalDirectory` unless `--allow-no-auth-yet` is passed for a scaffolding pass. Prompts the elicitation phase for parameters whose `when` predicate resolves true against the discovered applied-capability set. Writes a sidecar `rcf/blueprints/application-admin-console.applied.json` capturing the discovered `appliedCapabilities`, the elicit answers, and (when overridden) the scaffolding-note. Consumes the `logging` and `errorHandling` companions when they resolve to an applied provider or a registered library; falls back to the shelf providers otherwise.
12
+
13
+ ## Anatomy
14
+
15
+ | Piece | Where | What |
16
+ |---|---|---|
17
+ | Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, `requiresAppliedCapabilities: [principalDirectory]`, `elicits[]` (baseline-roles, tenancy-shape, invite-transport, audit-retention-days), `suggestedCompanions: [logging, errorHandling]`, 23 contributions in the 22xx / 21xxx band |
18
+ | Doc set | `contributions/` | 6 REQs, 9 USs (16 runtime-observable ACs), 4 TACs, 4 ADRs |
19
+ | Probe pack | `probe-packs/application-admin-console.pack.mjs` | Four capability-gated browser-verify checks anchored to AC-21102-1, AC-21103-1, AC-21104-1, AC-21105-1 |
20
+ | Guide | `guide/application-admin-console.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-admin-console/` | Dependency-free Node HTTP server the pack is probed against on the shelf gate |
23
+
24
+ ## Conditionality: what surfaces render when
25
+
26
+ | Applied capability | Surface | Rendered by |
27
+ |---|---|---|
28
+ | `principalDirectory` | Users directory (`/admin/users`) | Any applied auth blueprint (magic-link, clerk, oauth2, keycloak). |
29
+ | `roleModel` | Permission matrix (`/admin/roles`) | Clerk, OAuth2, Keycloak. Magic-link does NOT declare it, so a bare-magic-link project gets NO roles surface (Baz's example, spec section 5.5). |
30
+ | `tenancy` | Org switcher (`/admin/orgs`), org-scoped invites | Reserved for a future `application-tenancy-orgs` blueprint (spec section 11). No shelf provider today. |
31
+ | `auditLog` | Audit-log surface (`/admin/audit`) | Via the applied `observability-logging` companion (implicit), or a future dedicated audit-log blueprint. |
32
+ | (none) | Access-denied + request-access | Always renders for a non-admin principal reaching `/admin/*`. |
33
+
34
+ ## Bare-SPA refusal
35
+
36
+ On a project with only `application-spa` applied (no auth), the apply exits 3 with:
37
+
38
+ ```
39
+ application-admin-console requires at least one applied security-auth-* blueprint,
40
+ or an operator override with --allow-no-auth-yet.
41
+
42
+ Applied blueprints on this project:
43
+ application-spa v1.5.0
44
+
45
+ Suggested next steps:
46
+ 1. Apply an auth blueprint first:
47
+ rcf define blueprint add security-auth-magic-link
48
+ (or security-auth-clerk, security-auth-oauth2, security-auth-keycloak)
49
+ 2. Override for a scaffolding pass (surfaces will refuse at apply until an
50
+ auth blueprint is applied):
51
+ rcf define blueprint add application-admin-console --allow-no-auth-yet
52
+ ```
53
+
54
+ The override records a note on the sidecar's `notes` field so `rcf define validate` reads back and flags surfaces that never activated.
55
+
56
+ ## Custom-auth projects (auth outside the shelf)
57
+
58
+ A project that ships its own auth surface (no shelf `security-auth-*` blueprint applied) supplies capability answers via the elicitation phase:
59
+
60
+ ```
61
+ rcf define blueprint add ./blueprints/application-admin-console \
62
+ --answer baseline-roles="Owner, Admin, Member, Viewer, SupportAgent" \
63
+ --answer tenancy-shape=per-user \
64
+ --answer invite-transport=email
65
+ ```
66
+
67
+ Answers land on `rcf/blueprints/application-admin-console.applied.json`'s `appliedElicitations{}` map. The `when` predicate on each elicit gates whether the prompt fires: `baseline-roles` only fires when `roleModel` is applied, `tenancy-shape` only when `tenancy` is applied, and so on.
68
+
69
+ ## The one runtime gate
70
+
71
+ `probe-packs/application-admin-console.pack.mjs` ships four checks the `rcf verify browser` runner invokes on any FBS whose surface matches the pack's `appliesTo` predicate (an FBS that binds `TAC-2201-application-admin-console-shell` or whose nav model routes name an admin path). Each check ALSO carries its own `appliesTo` predicate that reads the applied capability sidecar and returns false when the required capability is absent; the check records `applicable: false` and the aggregate verdict treats it as neither pass nor fail (spec section 3.3, T-5 residual cure). This is exactly the residual pattern the spec named: the surface does not exist, so the pack does not fire.
72
+
73
+ Each check drives the real Playwright browser the runner provisions (through the pinned Playwright MCP or the consuming project's own `playwright` installation), reads the accessibility tree and the DOM, and returns a verdict.
74
+
75
+ ## Quality bar
76
+
77
+ ARIA APG grid pattern on the permission matrix (ADR-2201, TAC-2203); role="row", role="rowheader", role="columnheader", role="gridcell" and per-cell aria-label announcing the permission string on focus (WCAG 4.1.3). Every access-denied state renders under WCAG 2.4.6 Headings and Labels and 3.3.4 Error Prevention with a keyboard-reachable request-access control and a polite live region announcing state changes. Every table surface enumerates rows by `data-<entity>-id` (users by `data-user-id`, audit entries by `data-audit-id`) inside the `data-surface` region. The Owner + Admin + Member + Viewer baseline is drawn from SaaS UI research 2026 (ADR-2202); the retention window on the audit view is elicited per project (ADR-2204).
78
+
79
+ ## Known mechanism-reach gaps
80
+
81
+ Runtime-observable ACs the pack does NOT bind directly (checklist section 6.g), listed individually:
82
+
83
+ - **AC-21101-2 (single primary nav landmark with accessible name).** Present on the fixture as `<nav data-role="primary-nav" aria-label="Admin console">`; the pack asserts the fixture renders the four surfaces but does not additionally probe the landmark's accessible name. A v1.1.0 minor bump can add a landmark-shape check driven by the accessibility tree.
84
+ - **AC-21102-2 (per-row invite / deactivate control shape).** Present on the fixture as `[data-action="invite"]` and `[data-action="deactivate"]` buttons; the pack's AC-21102-1 check confirms the users directory renders row ids but does not additionally exercise the invite / deactivate click paths. A v1.1.0 minor bump can extend AC-21102-1 with a click-round-trip.
85
+ - **AC-21103-2 (elicited additional roles rendered after the baseline four).** Present on the fixture as the Owner + Admin + Member + Viewer rank order; the pack's AC-21103-1 confirms the grid roles and per-cell announcements but does not additionally probe elicited-role position. A v1.1.0 minor bump can read the sidecar's `appliedElicitations.baseline-roles` and compare rank order.
86
+ - **AC-21105-2 (audit view consumes the datatable shell TAC).** Realised on the fixture by rendering the audit table with the same column contract; the pack's AC-21105-1 confirms the correlation-id column but does not additionally probe the datatable shell's four state regions on the audit view. Datatable's own pack (T-1) still covers those on projects that render the audit view through the datatable factory.
87
+ - **AC-21106-1 (access-denied region accessibility structure beyond the request-access control).** The pack's AC-21102-1 check probes the request-access control on the denied branch; the wider WCAG structure (heading, explanation, polite live region wiring) is present on the fixture but not additionally asserted. A v1.1.0 minor bump can add an axe-core sweep on the denied region.
88
+ - **AC-21107-1 (sidecar file served under a stable path).** The pack reads the sidecar from `projectRoot`; the CLIENT-side read (over the network at load time) is a runtime-observable surface the pack does not additionally probe. A v1.1.0 minor bump can add a probe that reads `/admin/caps.json` on the fixture and diffs against the applied sidecar.
89
+ - **AC-21108-1 (providesRoles absent on the blueprint).** A chain-scope AC probed by the anatomy tests, not by the browser pack.
90
+ - **AC-21109-1 and AC-21109-2 (apply-time refusal and override).** Probed by the mechanism unit tests, not by the browser pack. The gate reviewer runs the CLI directly.
91
+
92
+ ## Companions
93
+
94
+ `suggestedCompanions` declares `logging` (the audit-log surface reads the event stream the applied logger emits) and `errorHandling` (invite failures and role-change refusals construct internal error records). Neither is required to apply the blueprint; the audit surface simply suppresses when `logging` is not applied.
95
+
96
+ ## Consumers
97
+
98
+ The audit view consumes `application-datatable` (T-1) for its table shell contract. Every project applying `application-admin-console` should also apply `application-datatable` if they want the ARIA APG table pattern, filter chrome, four state regions and pagination on the audit view.
@@ -0,0 +1,226 @@
1
+ {
2
+ "slug": "application-admin-console",
3
+ "version": "1.0.0",
4
+ "category": "application",
5
+ "requiresAppliedCapabilities": {
6
+ "capabilities": [
7
+ "principalDirectory"
8
+ ],
9
+ "allowSkipFlag": "allow-no-auth-yet",
10
+ "refusalMessageId": "application-admin-console-bare-spa"
11
+ },
12
+ "elicits": [
13
+ {
14
+ "id": "custom-auth-provides-principal-directory",
15
+ "prompt": "Custom auth: does your project's own auth blueprint expose a principal directory (identity records the users surface can list)?",
16
+ "kind": "boolean",
17
+ "default": false,
18
+ "providesCapability": "principalDirectory"
19
+ },
20
+ {
21
+ "id": "custom-auth-provides-role-model",
22
+ "prompt": "Custom auth: does your project's own auth declare operator-visible role labels a permission matrix can render?",
23
+ "kind": "boolean",
24
+ "default": false,
25
+ "providesCapability": "roleModel"
26
+ },
27
+ {
28
+ "id": "custom-auth-provides-tenancy",
29
+ "prompt": "Custom auth: does your project's own auth (or a paired tenancy blueprint) declare an organisation abstraction the console can switch across?",
30
+ "kind": "boolean",
31
+ "default": false,
32
+ "providesCapability": "tenancy"
33
+ },
34
+ {
35
+ "id": "custom-auth-provides-audit-log",
36
+ "prompt": "Custom auth: does your project emit an audit event stream the console's audit view can read?",
37
+ "kind": "boolean",
38
+ "default": false,
39
+ "providesCapability": "auditLog"
40
+ },
41
+ {
42
+ "id": "baseline-roles",
43
+ "prompt": "Baseline role labels for the permission matrix (comma-separated). Owner, Admin, Member, Viewer is the ratified default; extend with per-project labels here.",
44
+ "kind": "string",
45
+ "default": "Owner, Admin, Member, Viewer",
46
+ "when": {
47
+ "requiresCapability": [
48
+ "roleModel"
49
+ ]
50
+ }
51
+ },
52
+ {
53
+ "id": "tenancy-shape",
54
+ "prompt": "Tenancy shape for the org switcher: per-user (users belong to one org), per-org (all users belong to every org they can see) or both.",
55
+ "kind": "enum",
56
+ "options": [
57
+ "per-user",
58
+ "per-org",
59
+ "both"
60
+ ],
61
+ "default": "per-user",
62
+ "when": {
63
+ "requiresCapability": [
64
+ "tenancy"
65
+ ]
66
+ }
67
+ },
68
+ {
69
+ "id": "invite-transport",
70
+ "prompt": "Invite transport: email delegates to the email sibling when present; in-app-only records the invite as a notification; custom hands the delivery to your own transport at surface time.",
71
+ "kind": "enum",
72
+ "options": [
73
+ "email",
74
+ "in-app-only",
75
+ "custom"
76
+ ],
77
+ "default": "email"
78
+ },
79
+ {
80
+ "id": "audit-retention-days",
81
+ "prompt": "Audit-log retention window in days. The applied logger enforces retention at the write layer; the console reads the same window.",
82
+ "kind": "string",
83
+ "default": "90",
84
+ "when": {
85
+ "requiresCapability": [
86
+ "auditLog"
87
+ ]
88
+ }
89
+ }
90
+ ],
91
+ "suggestedCompanions": [
92
+ {
93
+ "role": "logging",
94
+ "reason": "The audit-log surface reads the event stream the applied logger emits; without a logging companion, the audit surface has no source and is suppressed at apply."
95
+ },
96
+ {
97
+ "role": "errorHandling",
98
+ "reason": "Invite failures and role-change refusals construct internal error records; an error-handling companion supplies the record factory and the boundary."
99
+ }
100
+ ],
101
+ "contributions": [
102
+ {
103
+ "id": "application-admin-console-REQ-001",
104
+ "kind": "req",
105
+ "path": "requirements/application-admin-console-req-001.json"
106
+ },
107
+ {
108
+ "id": "application-admin-console-REQ-002",
109
+ "kind": "req",
110
+ "path": "requirements/application-admin-console-req-002.json"
111
+ },
112
+ {
113
+ "id": "application-admin-console-REQ-003",
114
+ "kind": "req",
115
+ "path": "requirements/application-admin-console-req-003.json"
116
+ },
117
+ {
118
+ "id": "application-admin-console-REQ-004",
119
+ "kind": "req",
120
+ "path": "requirements/application-admin-console-req-004.json"
121
+ },
122
+ {
123
+ "id": "application-admin-console-REQ-005",
124
+ "kind": "req",
125
+ "path": "requirements/application-admin-console-req-005.json"
126
+ },
127
+ {
128
+ "id": "application-admin-console-REQ-006",
129
+ "kind": "req",
130
+ "path": "requirements/application-admin-console-req-006.json"
131
+ },
132
+ {
133
+ "id": "application-admin-console-US-21101",
134
+ "kind": "us",
135
+ "path": "user-stories/application-admin-console-us-21101.json"
136
+ },
137
+ {
138
+ "id": "application-admin-console-US-21102",
139
+ "kind": "us",
140
+ "path": "user-stories/application-admin-console-us-21102.json"
141
+ },
142
+ {
143
+ "id": "application-admin-console-US-21103",
144
+ "kind": "us",
145
+ "path": "user-stories/application-admin-console-us-21103.json"
146
+ },
147
+ {
148
+ "id": "application-admin-console-US-21104",
149
+ "kind": "us",
150
+ "path": "user-stories/application-admin-console-us-21104.json"
151
+ },
152
+ {
153
+ "id": "application-admin-console-US-21105",
154
+ "kind": "us",
155
+ "path": "user-stories/application-admin-console-us-21105.json"
156
+ },
157
+ {
158
+ "id": "application-admin-console-US-21106",
159
+ "kind": "us",
160
+ "path": "user-stories/application-admin-console-us-21106.json"
161
+ },
162
+ {
163
+ "id": "application-admin-console-US-21107",
164
+ "kind": "us",
165
+ "path": "user-stories/application-admin-console-us-21107.json"
166
+ },
167
+ {
168
+ "id": "application-admin-console-US-21108",
169
+ "kind": "us",
170
+ "path": "user-stories/application-admin-console-us-21108.json"
171
+ },
172
+ {
173
+ "id": "application-admin-console-US-21109",
174
+ "kind": "us",
175
+ "path": "user-stories/application-admin-console-us-21109.json"
176
+ },
177
+ {
178
+ "id": "TAC-2201-application-admin-console-shell",
179
+ "kind": "tac",
180
+ "path": "tacs/tac-2201-application-admin-console-shell.json"
181
+ },
182
+ {
183
+ "id": "TAC-2202-application-admin-console-capability-discovery",
184
+ "kind": "tac",
185
+ "path": "tacs/tac-2202-application-admin-console-capability-discovery.json"
186
+ },
187
+ {
188
+ "id": "TAC-2203-application-admin-console-permission-matrix",
189
+ "kind": "tac",
190
+ "path": "tacs/tac-2203-application-admin-console-permission-matrix.json"
191
+ },
192
+ {
193
+ "id": "TAC-2204-application-admin-console-audit-view",
194
+ "kind": "tac",
195
+ "path": "tacs/tac-2204-application-admin-console-audit-view.json"
196
+ },
197
+ {
198
+ "id": "ADR-2201-application-admin-console-capability-vocabulary",
199
+ "kind": "adr",
200
+ "path": "adrs/adr-2201-application-admin-console-capability-vocabulary.json",
201
+ "standardsTraceClause": "generic enterprise practice"
202
+ },
203
+ {
204
+ "id": "ADR-2202-application-admin-console-baseline-roles",
205
+ "kind": "adr",
206
+ "path": "adrs/adr-2202-application-admin-console-baseline-roles.json",
207
+ "elicited": true,
208
+ "standardsTraceClause": "SaaS UI research 2026"
209
+ },
210
+ {
211
+ "id": "ADR-2203-application-admin-console-invite-transport",
212
+ "kind": "adr",
213
+ "path": "adrs/adr-2203-application-admin-console-invite-transport.json",
214
+ "recommendedDefault": true,
215
+ "elicited": true,
216
+ "standardsTraceClause": "generic enterprise practice"
217
+ },
218
+ {
219
+ "id": "ADR-2204-application-admin-console-audit-retention",
220
+ "kind": "adr",
221
+ "path": "adrs/adr-2204-application-admin-console-audit-retention.json",
222
+ "elicited": true,
223
+ "standardsTraceClause": "generic enterprise practice"
224
+ }
225
+ ]
226
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-2201-application-admin-console-capability-vocabulary",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Capability vocabulary: principalDirectory, roleModel, tenancy, auditLog as the v1 capability set",
8
+ "context": "Admin-console surfaces are conditional on what the applied identity blueprint provides. The vocabulary must be small (four strings today), extensible (the section 6a table is chunk-zero, so a future capability lands with a docs edit and no code change), and grounded in industry practice (SaaS UI research, IAM literature). Baz decision 5 (2026-09-04) is that the initial four capabilities are principalDirectory, roleModel, tenancy and auditLog.",
9
+ "decision": "v1.0.0 declares four capability strings the applied identity blueprints can declare in their capabilities[] field: principalDirectory (identifies principals for a users surface); roleModel (declares operator-visible role labels for a permission matrix); tenancy (declares an organisation abstraction the console can switch across); auditLog (emits an event stream the audit view can read). The vocabulary lives in packages/rcf-lite/docs/blueprint-authoring.md section 6a as a table extending the roles registry; the loader validates capability SHAPE (lower camelCase on ^[a-z][a-zA-Z0-9]*$), not the vocabulary. A future capability lands by adding a table row and adopting it on an identity blueprints minor bump.",
10
+ "consequences": "The console renders only surfaces the applied capabilities enable, so a bare magic-link project gets a users surface but no roles surface (per Bazs verbatim example). A future dedicated audit-log blueprint declaring auditLog directly (rather than through observability-logging) composes cleanly. A new capability lands additively.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Encode the vocabulary in code as an enum",
14
+ "summary": "Refuse any capability string outside the initial four at the loader.",
15
+ "reasonNotChosen": "Constrains a future capability behind a rcf-lite release; the section 6a chunk-zero pattern is the ratified convention for vocabulary in prose."
16
+ },
17
+ {
18
+ "name": "Use providesRoles[] for capabilities",
19
+ "summary": "Overload the existing providesRoles[] field to carry capabilities.",
20
+ "reasonNotChosen": "providesRoles paired with a scope:global ADR by design; a capability is a projection of the applied blueprints own state, not a role it offers to a second consumer. Overloading blurs the mechanism (spec 5.5.3)."
21
+ }
22
+ ],
23
+ "createdAt": "2026-09-05T01:30:00Z",
24
+ "updatedAt": "2026-09-05T01:30:00Z"
25
+ }