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,40 @@
1
+ {
2
+ "tacId": "TAC-2802-persistence-data-postgres-migration-runner",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Postgres migration runner",
8
+ "purpose": "The in-tree runner that reads numbered forward-only .sql files from the elicited migrations directory, applies each inside its own transaction against the elicited connection URL, and tracks applied filenames in a schema_version bookkeeping table it maintains inside the same database. The runner mode (atBoot or ciStep) is elicited on ADR-2803; the runner tool (bespoke Node runner, node-pg-migrate, sqitch, flyway) is elicited on ADR-2802; the shipped fixture provides a bespoke Node runner as the reference implementation.",
9
+ "responsibilities": [
10
+ "Read the elicited migrations directory (default ./migrations/); enumerate .sql files sorted by their leading integer; reject a duplicate leading integer at load time (AC-27102-1).",
11
+ "Ensure the schema_version bookkeeping table exists on first invocation; upsert only via the applied-filename row it inserts on each successful file (AC-27102-1).",
12
+ "For each un-applied file, in order, issue client.query('BEGIN'), read the file body, execute it, insert the applied-filename row into schema_version, issue client.query('COMMIT') (AC-27102-1).",
13
+ "On any statement failure inside a file's transaction, issue client.query('ROLLBACK'), emit migrationApplyFailed with the failing filename, stop the runner, exit non-zero (AC-27109-1).",
14
+ "On successful completion of every file, emit migrationsApplied with the applied-filename list."
15
+ ],
16
+ "internalStructure": "One CLI-invokable Node module plus a library entry point the facade may call from atBoot mode. The module reads its config (connection URL, migrations directory, bookkeeping table name) from an elicited config source; enumerates the directory; loops over un-applied files; issues one BEGIN/apply/COMMIT per file; writes the schema_version row inside the same transaction so a mid-COMMIT crash never leaves a row behind for a file whose body did not land.",
17
+ "interfaces": [
18
+ {
19
+ "name": "run",
20
+ "kind": "cli",
21
+ "description": "node migrate.mjs applies every un-applied file in order; exits 0 on success, non-zero on any failure with the failing filename in stderr."
22
+ },
23
+ {
24
+ "name": "applyAll",
25
+ "kind": "read-write-api",
26
+ "description": "applyAll({ connectionUrl, migrationsDir, bookkeepingTable, onEvent }) -> Promise<{ applied: string[] }>. Library entry point the facade may call in atBoot mode."
27
+ }
28
+ ],
29
+ "dependencies": [
30
+ {
31
+ "name": "Postgres facade",
32
+ "kind": "tac",
33
+ "tacId": "TAC-2801-persistence-data-postgres-facade",
34
+ "description": "The runner may share the facade's connection pool in atBoot mode; in ciStep mode it opens its own pg.Client directly against the elicited URL and disposes it on exit."
35
+ }
36
+ ],
37
+ "tradeoffs": "One file one transaction bounds the rollback surface cleanly but forbids a migration that spans two files atomically. Projects that need a schema change split across two files inside one transaction combine the change into one file. Numbered forward-only excludes down migrations by design; a rollback is a new numbered file inverting the earlier change, not a down step.",
38
+ "createdAt": "2026-09-06T15:47:00.000Z",
39
+ "updatedAt": "2026-09-06T15:47:00.000Z"
40
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "tacId": "TAC-2803-persistence-data-postgres-transaction-helper",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Postgres transaction helper",
8
+ "purpose": "The helper that wraps client.query('BEGIN') and client.query('COMMIT') around a consumer callback and issues client.query('ROLLBACK') with a transactionRolledBack event on any error, tracking the zero-based index of the failing statement inside the callback.",
9
+ "responsibilities": [
10
+ "Acquire a pg.PoolClient from the facade's pool; issue client.query('BEGIN') (AC-27104-1).",
11
+ "Invoke the consumer callback with a wrapped client whose query(sql, params) delegates to the underlying client and increments a statement counter each time it is called (AC-27104-1).",
12
+ "On the callback's successful completion, issue client.query('COMMIT'), release the client, resolve the outer promise (AC-27104-1).",
13
+ "On any error thrown from a wrapped-client query or from the callback body, issue client.query('ROLLBACK'), fire transactionRolledBack on the injected event sink with { statementIndex, code }, release the client, re-throw the underlying error (AC-27104-1).",
14
+ "Preserve the underlying pg error object (code, detail, position, table, constraint) on the re-thrown error so the facade's own error boundary constructs the internal error record correctly."
15
+ ],
16
+ "internalStructure": "A single async function withTransaction({ pool, onEvent }) that returns a call helper. The helper wraps the pg.PoolClient in a proxy that intercepts .query() to increment the counter, forwards the arguments to the underlying client, and re-throws on error after firing the event.",
17
+ "interfaces": [
18
+ {
19
+ "name": "withTransaction",
20
+ "kind": "read-write-api",
21
+ "description": "await store.withTransaction(async (tx) => { await tx.query(...); await tx.query(...); }). Commits on successful return, rolls back on any thrown error, fires transactionRolledBack with statementIndex on rollback."
22
+ }
23
+ ],
24
+ "dependencies": [
25
+ {
26
+ "name": "Postgres facade",
27
+ "kind": "tac",
28
+ "tacId": "TAC-2801-persistence-data-postgres-facade",
29
+ "description": "The facade owns the pool the helper acquires from and the event sink the rollback event fires on."
30
+ }
31
+ ],
32
+ "tradeoffs": "Wrapping the client in a proxy adds one function-call hop per query; on a hot path this is negligible. Tracking statementIndex by counting calls does not survive nested withTransaction invocations (Postgres does not support nested transactions natively; savepoints would be a v1.1 minor). Consumers that need savepoints today drop to raw client.query('SAVEPOINT ...') inside the callback and accept that statementIndex points at the outer BEGIN sequence.",
33
+ "createdAt": "2026-09-06T15:47:00.000Z",
34
+ "updatedAt": "2026-09-06T15:47:00.000Z"
35
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "tacId": "TAC-2804-persistence-data-postgres-recovery-runner",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Postgres scheduled-export runner",
8
+ "purpose": "The scheduled export runner that drives pg_dump against the live database, writes the artefact to the elicited destination, and emits backupExported with the artefact path and completion timestamp. Pairs with the deploy target's own point-in-time recovery on ADR-2804; the runner covers the portable-artefact half of the two-path recovery model.",
9
+ "responsibilities": [
10
+ "Invoke pg_dump via child_process.execFile against the elicited connection URL with an elicited pg_dump argument set (default: --no-owner --no-acl --format=plain) (AC-27105-1).",
11
+ "Stream the pg_dump stdout to a temporary file, atomically rename to the elicited destination path (a filesystem path in the shipped fixture; an operator-owned path in production) (AC-27105-1).",
12
+ "On successful completion, emit backupExported on the injected event sink with { artefactPath, completedAt } (AC-27105-1).",
13
+ "On pg_dump non-zero exit, emit backupExportFailed with the exit code and stderr tail, delete the partial temp file, exit non-zero.",
14
+ "Cadence is elicited (a cron string, a systemd timer spec, or off for CI-only invocation); the runner does not schedule itself; a project-side scheduler invokes it."
15
+ ],
16
+ "internalStructure": "One Node module exporting an exportDatabase({ connectionUrl, destination, onEvent, pgDumpArgs }) async function. The module resolves pg_dump on PATH via child_process.execFile, streams stdout to a temp file inside the destination's directory, and atomically renames on success. The recovery-drill helper in the same module invokes exportDatabase, brings up a fresh Postgres via docker compose or podman, streams the artefact into psql, and compares row-count and checksum on both databases.",
17
+ "interfaces": [
18
+ {
19
+ "name": "exportDatabase",
20
+ "kind": "read-write-api",
21
+ "description": "await exportDatabase({ connectionUrl, destination, onEvent, pgDumpArgs }) -> { artefactPath, completedAt }. Runs pg_dump, writes the artefact, fires backupExported."
22
+ },
23
+ {
24
+ "name": "recoveryDrill",
25
+ "kind": "read-write-api",
26
+ "description": "await recoveryDrill({ sourceUrl, destination, onEvent }) -> { count, checksum }. Runs exportDatabase, primes a fresh Postgres from the artefact, compares row-count and checksum on the fixture table, fires recoveryDrillPassed."
27
+ }
28
+ ],
29
+ "dependencies": [
30
+ {
31
+ "name": "Postgres facade",
32
+ "kind": "tac",
33
+ "tacId": "TAC-2801-persistence-data-postgres-facade",
34
+ "description": "Shares the facade's event sink for backupExported and recoveryDrillPassed."
35
+ }
36
+ ],
37
+ "tradeoffs": "child_process.execFile against pg_dump requires the pg_dump binary to be on PATH (or a full path passed via config). On a container platform the runner ships a Postgres client image alongside the app for pg_dump availability; the guide names the CI-seam pattern. The runner does not implement WAL-shipping or a streaming backup; that path is the deploy target's own PITR obligation on ADR-2804.",
38
+ "createdAt": "2026-09-06T15:47:00.000Z",
39
+ "updatedAt": "2026-09-06T15:47:00.000Z"
40
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27101",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "One facade module opens a pg.Pool on boot and emits facadeReady with the database name",
8
+ "asA": "developer whose Node process needs a durable Postgres store behind a swappable boundary",
9
+ "iWant": "one facade module to hold the pg client and expose named domain verbs, with a facadeReady lifecycle event on the first successful pool ready-check",
10
+ "soThat": "the boundary between the domain and the pg vendor surface is the only place that has to move when the driver changes and the boot ordering is observable via the event",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27101-1",
14
+ "description": "On process boot, the facade opens a pg.Pool against the elicited connection URL; once the first successful pool ready-check completes, a facadeReady event fires on the injected event sink carrying the database name.",
15
+ "given": "a Node process with the facade module imported and its factory invoked",
16
+ "when": "the process boots and the facade's pool ready-check returns",
17
+ "then": "a facadeReady event fires on the injected event sink with a payload containing databaseName, and the pool is ready to accept queries; the facade exposes named domain verbs and does not re-export the raw pg client",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-27101-2",
23
+ "description": "Exactly one source-tree module inside the facade directory imports pg; every other module in the applied project's source tree that touches persistence imports the facade and calls its named domain verbs, verified by a targeted grep on the applied fixture.",
24
+ "given": "the applied project's source tree after apply",
25
+ "when": "grep 'from \\'pg\\'' or grep 'require(\\'pg\\')' walks the tree outside the facade directory",
26
+ "then": "no match is found outside the facade directory; the facade's public surface exports named domain verbs only, no raw pg reference",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": ["TAC-2801-persistence-data-postgres-facade"],
32
+ "createdAt": "2026-09-06T15:47:00.000Z",
33
+ "updatedAt": "2026-09-06T15:47:00.000Z"
34
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27102",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Numbered forward-only .sql migrations apply one file one transaction; schema_version advances",
8
+ "asA": "operator who needs deploys reproducible from a git ref with no schema state outside version control",
9
+ "iWant": "every schema change to be a new numbered .sql file under the elicited migrations directory, applied by the in-tree runner one file at a time inside its own transaction",
10
+ "soThat": "the schema shape at any deployed version can be read from committed files, each apply either commits or leaves the schema exactly as it was, and the schema_version bookkeeping table is the one source of truth on what has been applied",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27102-1",
14
+ "description": "Given a fresh Postgres database at schema_version 0 and three numbered forward-only .sql migration files (001, 002, 003), when the migration runner opens the store and applies them, then each file applies inside its own transaction (BEGIN, file body, COMMIT), a migrationsApplied event fires with the applied filename list, and the schema_version bookkeeping table records three rows keyed by filename.",
15
+ "given": "a fresh Postgres instance and a migrations directory with 001_*.sql, 002_*.sql, 003_*.sql each a single statement inside an implicit transaction",
16
+ "when": "the migration runner applies the directory against the database",
17
+ "then": "each file runs inside a BEGIN/COMMIT pair; after all three succeed a migrationsApplied event fires with the filename list ['001_*.sql', '002_*.sql', '003_*.sql'] and the schema_version table (or the runner's configured bookkeeping table name) carries a row per applied filename",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2802-persistence-data-postgres-migration-runner"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Every pg.query call site inside the facade passes a static string literal as its first argument",
8
+ "asA": "reviewer of an rcf-lite Postgres project auditing for SQL injection risk at the driver boundary",
9
+ "iWant": "an AST scan over the facade directory to prove every pg.query first argument is a static string literal with $N parameters, per the node-postgres parameterised-queries contract",
10
+ "soThat": "a call site that concatenates or template-literal-interpolates consumer values into SQL text is caught at build time before it ships",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27103-1",
14
+ "description": "An AST scan over every .ts/.js/.mjs file under the applied fixture's facade directory finds every call to pg.query and asserts each first-argument node is a StringLiteral (Literal node with a string value), not a TemplateLiteral, not a BinaryExpression whose operator is '+' with a string operand. Parameters are supplied as an array whose values bind to $1, $2, ... $N placeholders in the string.",
15
+ "given": "the applied fixture's src/store.mjs and any sibling module inside the facade directory",
16
+ "when": "a Node built-in AST parser walks every call expression whose callee is 'pg.query' or resolves to a method named 'query' on a pg.Client, pg.Pool, or pg.PoolClient reference",
17
+ "then": "every first-argument node is a Literal with typeof value === 'string'; no first-argument node is a TemplateLiteral or a string-concatenation expression",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2801-persistence-data-postgres-facade"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Transaction helper rolls back on any statement error and fires transactionRolledBack with the failing index",
8
+ "asA": "developer whose domain requires atomic multi-statement writes",
9
+ "iWant": "a transaction helper that wraps BEGIN and COMMIT around a callback and issues ROLLBACK on any error",
10
+ "soThat": "no partial commit lands on the shipped database and the failing statement's index is observable on the event sink",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27104-1",
14
+ "description": "Given the transaction helper wrapping a callback that issues two INSERTs where the second violates a UNIQUE constraint, when the helper runs, then client.query('BEGIN') is issued, the first INSERT lands on the transaction, the second INSERT throws a constraint error the helper catches, client.query('ROLLBACK') is issued, a transactionRolledBack event fires with statementIndex 1, the client is released back to the pool, and the underlying error is re-thrown to the caller. The database after rollback carries neither row from the aborted transaction.",
15
+ "given": "the facade's withTransaction helper, a table with a UNIQUE constraint on a column, and a callback issuing two INSERTs with the same value for that column",
16
+ "when": "await withTransaction(callback) runs",
17
+ "then": "BEGIN is issued, the first INSERT lands inside the transaction, the second INSERT throws, ROLLBACK is issued, transactionRolledBack fires on the event sink with { statementIndex: 1, code: '<pg error code>' }, the client is released, the promise rejects with the underlying error, and a subsequent SELECT against the table returns no rows from the aborted transaction",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2803-persistence-data-postgres-transaction-helper"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Scheduled pg_dump lands an artefact and a fresh Postgres primed from it round-trips the row set",
8
+ "asA": "operator responsible for restoring a Postgres project after a cluster loss or a data-integrity incident",
9
+ "iWant": "a scheduled export runner that drives pg_dump against the live database and writes an artefact to the elicited destination",
10
+ "soThat": "a fresh Postgres primed from the artefact returns the row set the source held at the artefact's completion timestamp",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27105-1",
14
+ "description": "Given a live Postgres containing a small fixture rowset, when the scheduled export runner runs, then it invokes pg_dump via child_process.execFile against the elicited connection URL, writes the artefact to the elicited destination, and emits backupExported with { artefactPath, completedAt }. A fresh Postgres primed by psql-restoring the artefact returns the same rowset (row count and row checksum both equal) as the source.",
15
+ "given": "a live Postgres seeded with a fixture rowset and the recovery runner configured to write to a temporary destination",
16
+ "when": "the recovery runner runs pg_dump against the source and a second Postgres is primed from the artefact",
17
+ "then": "the runner exits 0, backupExported fires with the artefact path and completion timestamp, the artefact file exists at the elicited destination, and a query against the restored Postgres returns the same row count and same checksum of the fixture rowset as the source",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2804-persistence-data-postgres-recovery-runner"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-006",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Two facades at pool size 5 handle twenty concurrent queries with no timeout",
8
+ "asA": "developer running a long-lived Node process with a warm pg pool",
9
+ "iWant": "the shipped pool defaults to handle a burst of twenty concurrent queries across two facade instances at pool size 5 without timing out",
10
+ "soThat": "the pool posture per deploy target is proven at the shape the shipped defaults name, not just at the single-query level",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27106-1",
14
+ "description": "Given two facade instances opened concurrently against the same Postgres at pool size 5 each, when twenty concurrent SELECT queries are issued across the two facades, then all twenty return with no timeout inside the shipped connectionTimeoutMillis (5000) and idleTimeoutMillis (30000) defaults, and the pool metric on each facade reports at most 5 in-use connections at any point.",
15
+ "given": "two facade instances opened against the same postgres:17-alpine container at pool size 5 each",
16
+ "when": "twenty SELECT queries are dispatched concurrently across the two facades via Promise.all",
17
+ "then": "all twenty promises resolve inside the connectionTimeoutMillis budget; no query throws; the observed maximum concurrent in-use pool connections on either facade is at most the configured pool size (5)",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2801-persistence-data-postgres-facade"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-007",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Advisory-lock helper is elicited off by default; when enabled it wraps pg_advisory_lock or pg_advisory_xact_lock per the elicited scope",
8
+ "asA": "developer building a workflow that needs cross-process coordination on a shared Postgres",
9
+ "iWant": "an optional advisory-lock helper on the facade that acquires and releases a session-level or transaction-level lock per an elicited key",
10
+ "soThat": "cross-process ordering is expressible through the engine's own primitive without a bespoke locks table",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27107-1",
14
+ "description": "The elicited advisoryLockHelper parameter has one of three values (off, session, transaction) with default off; when off the facade does not expose the helper on its public surface. When session or transaction, the facade exposes a withAdvisoryLock(key, callback) verb that acquires pg_advisory_lock (session) or pg_advisory_xact_lock (transaction) with the integer key, runs the callback, and releases the lock via pg_advisory_unlock on the session-level shape; the transaction-level shape releases automatically at COMMIT or ROLLBACK per the Postgres explicit-locking reference.",
15
+ "given": "the facade's public surface after apply, with the advisoryLockHelper elicit answered on each of the three permitted values",
16
+ "when": "the surface is inspected and the helper is invoked with a valid integer key on a supported answer",
17
+ "then": "the surface exposes withAdvisoryLock only when the answer is session or transaction; the helper acquires the correct lock verb per the answer, runs the callback, and releases (session) or lets COMMIT release (transaction); the sidecar records the elicited answer for later validation",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2801-persistence-data-postgres-facade"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27108",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Facade boot survives a first-connect race and does not double-emit facadeReady",
8
+ "asA": "developer whose process may issue queries against the facade before its pool's first ready-check completes",
9
+ "iWant": "the facade to serialise consumer queries behind the pool's ready-check without dropping any and to emit facadeReady exactly once per facade instance",
10
+ "soThat": "boot-time races do not surface as unhandled promise rejections and the ready event is not double-counted by an observability sink",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27108-1",
14
+ "description": "Given a facade instance and five concurrent domain-verb calls issued before the pool's first ready-check completes, when the pool becomes ready, then all five calls succeed against the pool once ready, the facadeReady event fires exactly once with the database name, and no consumer sees a NotReady error.",
15
+ "given": "a fresh facade instance and five concurrent getUserById calls issued immediately after construction",
16
+ "when": "the pool completes its first ready-check",
17
+ "then": "all five calls resolve successfully; facadeReady fires exactly once on the event sink; no unhandled rejection is raised",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2801-persistence-data-postgres-facade"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27109",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "A failing migration rolls back its own transaction and the runner exits non-zero without advancing schema_version",
8
+ "asA": "operator running migrations at boot on a long-lived Node process",
9
+ "iWant": "a failing migration to roll back its own transaction and stop the runner with a non-zero exit and the failing filename in the diagnostic",
10
+ "soThat": "the runner never leaves a partially-applied migration on the database and the operator can name the failing file to un-jam the deploy",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27109-1",
14
+ "description": "Given a migrations directory whose second file contains an invalid SQL statement (simulated in the fixture by the SIMULATE_MIGRATION_FAILURE switch), when the migration runner runs, then the first file commits, the second file's transaction rolls back on the invalid statement, the runner exits non-zero, and the failing filename appears in the runner's diagnostic output. The schema_version bookkeeping table records only the first file's row.",
15
+ "given": "a Postgres at schema_version 0 and three migration files where the second is intentionally broken",
16
+ "when": "the migration runner applies the directory with SIMULATE_MIGRATION_FAILURE=true",
17
+ "then": "the first file's transaction commits and its row lands in the bookkeeping table; the second file's transaction rolls back; the runner exits non-zero with the failing filename in its stderr; the third file is not attempted; the bookkeeping table shows exactly one applied row",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2802-persistence-data-postgres-migration-runner"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "usId": "persistence-data-postgres-US-27110",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-postgres-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "A recovery drill primes a fresh Postgres from the pg_dump artefact and the row-count and checksum match the source",
8
+ "asA": "operator running a recovery drill on a schedule to prove the pg_dump path works",
9
+ "iWant": "the drill to prime a fresh Postgres from the artefact and compare the restored dataset against the source by row-count and checksum",
10
+ "soThat": "the recovery path is proven end to end and drift on the artefact shape is caught before an incident forces a live restore",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-27110-1",
14
+ "description": "Given a live Postgres with a fixture rowset and a pg_dump artefact produced by the scheduled runner, when the drill primes a fresh Postgres from the artefact and computes the row-count and checksum of the fixture table on both databases, then the row-count and checksum on the restored Postgres equal those on the source and a recoveryDrillPassed event fires on the event sink carrying the two matched values.",
15
+ "given": "a source Postgres seeded with a fixture rowset and a pg_dump artefact at the elicited destination",
16
+ "when": "the drill primes a fresh Postgres from the artefact and runs SELECT count(*) and a checksum aggregate on the fixture table against both databases",
17
+ "then": "the two counts are equal; the two checksums are equal; recoveryDrillPassed fires on the event sink with { count, checksum }; the fresh Postgres and its artefact primer are torn down on exit",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": ["TAC-2804-persistence-data-postgres-recovery-runner"],
23
+ "createdAt": "2026-09-06T15:47:00.000Z",
24
+ "updatedAt": "2026-09-06T15:47:00.000Z"
25
+ }
@@ -0,0 +1,64 @@
1
+ # persistence-data-postgres blueprint coordination vocabulary
2
+
3
+ This file is the persistence-data-postgres half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.4.4 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
4
+
5
+ ## Global ADR topics this blueprint contributes (exact strings)
6
+
7
+ | Topic string | persistence-data-postgres contribution | Origin | Composition note |
8
+ |---|---|---|---|
9
+ | `persistenceStore` | ADR-2801-persistence-data-postgres-driver | Reused from persistence-data-sqlite and persistence-data-d1 (both contribute the same topic string). This blueprint contributes a Postgres store on the same topic string on purpose. | The one project-wide decision on the primary durable store engine. Composing this blueprint with persistence-data-sqlite or persistence-data-d1 conflicts here by design; expected resolution is one project-level ADR that fixes the engine end to end |
10
+ | `migrationDiscipline` | ADR-2802-persistence-data-postgres-migration-shape | Reused from persistence-data-sqlite (boot-time forward-only runner discipline) and persistence-data-d1 (wrangler-CLI-owned deploy-pipeline discipline). This blueprint contributes numbered forward-only .sql migrations applied by an in-tree runner one file one transaction. | The one project-wide schema-evolution discipline. Composing this blueprint with persistence-data-sqlite or persistence-data-d1 conflicts here by design; expected resolution is one project-level ADR |
11
+
12
+ The persistence-data-postgres blueprint claims two global topics. Every other contribution is scope-local (ADR-2803 runner mode, ADR-2804 recovery, ADR-2805 connection-pool posture do not contribute global topics; a composing blueprint that holds an opinion on any of them authors its own project-level ADR).
13
+
14
+ Note on the round-6 reserved Hyperdrive adapter slot: the v1.0.0 facade holds the driver reference OPAQUE at ADR-2801 boundary so the round-6 v1.1.0 Hyperdrive adapter slots in as an additive minor without a topic conflict. See infra round 5 spec section 5.7 for the reserved-slot register.
15
+
16
+ Rules for new topics: lower camel case, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer.
17
+
18
+ ## Id number bands (registry bootstrap)
19
+
20
+ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
21
+
22
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
23
+ |---|---|---|---|---|
24
+ | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
25
+ | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
26
+ | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
27
+ | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
28
+ | hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
29
+ | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
30
+ | delivery-ci-workflows | 6101-6899 | 7xx | shipped v2.0.0 (renamed from ci-pipeline) | `ciGates`, `strictCoverageGate`, `releaseArtefacts` |
31
+ | observability-essentials | 7101-7899 | 8xx | shipped v2.0.0 | `statusPageContract` |
32
+ | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.1 | `secretsSource` |
33
+ | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
34
+ | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
35
+ | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
36
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
37
+ | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
38
+ | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.1.0 | `healthProbes`, `readinessSemantics` |
39
+ | observability-logging | 15101-15899 | 16xx | shipped v1.0.0 | `logging` |
40
+ | application-error-handling | 16101-16899 | 17xx | shipped v1.0.0 | `errorHandling` |
41
+ | application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
42
+ | application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
43
+ | application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
44
+ | application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
45
+ | application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
46
+ | application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
47
+ | application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
48
+ | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
49
+ | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
50
+ | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
51
+
52
+ US 27101-27110 sit at the LOW end of the 27101-27899 band on purpose (watchpost run-4 lesson). A project-side story mechanically derived from a persistence-data-postgres REQ id into the number 27110 would collide against the shipped US-27110; band headroom (27111-27899) leaves that space.
53
+
54
+ Postgres suffixes for this blueprint use the 2801-2899 block, continuing the widening pattern (persistence-data-sqlite 6xx, persistence-data-d1 14xx, and persistence-data-postgres 28xx).
55
+
56
+ ## Shared expectations for future composing blueprints
57
+
58
+ - Reuse `persistenceStore` exactly as spelled here when your blueprint holds an opinion on the project's primary durable store engine; contribute your own scope:global ADR on that string and let composition surface the pairing.
59
+ - Reuse `migrationDiscipline` exactly as spelled here when your blueprint holds an opinion on schema evolution.
60
+ - Round-6 reserved slot: the Hyperdrive adapter inside `persistence-data-postgres` v1.1.0 wraps the same facade contract with the Cloudflare Hyperdrive connection-pool and query-cache surface. No topic conflict, no facade re-shape; the driver reference is opaque at the ADR-2801 boundary.
61
+
62
+ ## Deliberate-conflict statement
63
+
64
+ This blueprint's ADR-2801 on `persistenceStore` and ADR-2802 on `migrationDiscipline` are a Postgres-committed vendor sibling to persistence-data-sqlite (ADR-601, ADR-602) and persistence-data-d1 (ADR-1401, ADR-1402) on the same two topic strings. Applying two of the three on one project raises two `globalAdrTopic` conflicts the operator resolves via one of the four documented resolutions per topic (adopt one, keep the existing one, author a project-level supersede ADR, or `--resolve <topic>=project:<ADR-id>` on the add).