rcf-lite 0.21.0 → 0.23.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 (458) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/bin/rcf.js +13 -2
  3. package/blueprints/application-account-settings/CHANGELOG.md +12 -0
  4. package/blueprints/application-account-settings/README.md +114 -0
  5. package/blueprints/application-account-settings/blueprint.json +234 -0
  6. package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +20 -0
  7. package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +20 -0
  8. package/blueprints/application-account-settings/contributions/adrs/adr-2603-application-account-settings-theme-persistence.json +20 -0
  9. package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +20 -0
  10. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +18 -0
  11. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +18 -0
  12. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +18 -0
  13. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +18 -0
  14. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +18 -0
  15. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +18 -0
  16. package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +41 -0
  17. package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +28 -0
  18. package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +35 -0
  19. package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +40 -0
  20. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +34 -0
  21. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -0
  22. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +27 -0
  23. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +27 -0
  24. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +33 -0
  25. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +27 -0
  26. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +27 -0
  27. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -0
  28. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +33 -0
  29. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +27 -0
  30. package/blueprints/application-account-settings/docs/topics.md +50 -0
  31. package/blueprints/application-account-settings/guide/application-account-settings.md +30 -0
  32. package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +246 -0
  33. package/blueprints/application-admin-console/docs/topics.md +9 -0
  34. package/blueprints/application-api-rest/docs/topics.md +10 -1
  35. package/blueprints/application-charts/docs/topics.md +9 -0
  36. package/blueprints/application-dashboard/docs/topics.md +9 -0
  37. package/blueprints/application-datatable/docs/topics.md +9 -0
  38. package/blueprints/application-empty-error-states/CHANGELOG.md +9 -0
  39. package/blueprints/application-empty-error-states/README.md +88 -0
  40. package/blueprints/application-empty-error-states/blueprint.json +119 -0
  41. package/blueprints/application-empty-error-states/contributions/adrs/adr-2301-application-empty-error-states-status-contract.json +25 -0
  42. package/blueprints/application-empty-error-states/contributions/adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json +25 -0
  43. package/blueprints/application-empty-error-states/contributions/adrs/adr-2303-application-empty-error-states-offline-strategy.json +25 -0
  44. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +18 -0
  45. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +18 -0
  46. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +18 -0
  47. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +18 -0
  48. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +18 -0
  49. package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +46 -0
  50. package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +36 -0
  51. package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +40 -0
  52. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +29 -0
  53. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +29 -0
  54. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +29 -0
  55. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +29 -0
  56. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +29 -0
  57. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +29 -0
  58. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +29 -0
  59. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +29 -0
  60. package/blueprints/application-empty-error-states/docs/topics.md +55 -0
  61. package/blueprints/application-empty-error-states/guide/application-empty-error-states.md +50 -0
  62. package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +284 -0
  63. package/blueprints/application-error-handling/docs/topics.md +9 -0
  64. package/blueprints/application-file-upload/CHANGELOG.md +9 -0
  65. package/blueprints/application-file-upload/README.md +85 -0
  66. package/blueprints/application-file-upload/blueprint.json +114 -0
  67. package/blueprints/application-file-upload/contributions/adrs/adr-2401-application-file-upload-transport.json +25 -0
  68. package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +25 -0
  69. package/blueprints/application-file-upload/contributions/adrs/adr-2403-application-file-upload-virus-scan.json +25 -0
  70. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +18 -0
  71. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +18 -0
  72. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +18 -0
  73. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +18 -0
  74. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +18 -0
  75. package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +46 -0
  76. package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +47 -0
  77. package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +46 -0
  78. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +28 -0
  79. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +28 -0
  80. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +29 -0
  81. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +28 -0
  82. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +29 -0
  83. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +28 -0
  84. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +28 -0
  85. package/blueprints/application-file-upload/docs/topics.md +60 -0
  86. package/blueprints/application-file-upload/guide/application-file-upload.md +48 -0
  87. package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +238 -0
  88. package/blueprints/application-forms-wizard/CHANGELOG.md +9 -0
  89. package/blueprints/application-forms-wizard/README.md +102 -0
  90. package/blueprints/application-forms-wizard/blueprint.json +120 -0
  91. package/blueprints/application-forms-wizard/contributions/adrs/adr-2501-application-forms-wizard-navigation.json +25 -0
  92. package/blueprints/application-forms-wizard/contributions/adrs/adr-2502-application-forms-wizard-save-and-return.json +25 -0
  93. package/blueprints/application-forms-wizard/contributions/adrs/adr-2503-application-forms-wizard-step-indicator.json +25 -0
  94. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +18 -0
  95. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +18 -0
  96. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +18 -0
  97. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +18 -0
  98. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +18 -0
  99. package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +46 -0
  100. package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +40 -0
  101. package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +40 -0
  102. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +28 -0
  103. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +29 -0
  104. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +28 -0
  105. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +29 -0
  106. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +28 -0
  107. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +28 -0
  108. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +28 -0
  109. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +29 -0
  110. package/blueprints/application-forms-wizard/docs/topics.md +51 -0
  111. package/blueprints/application-forms-wizard/guide/application-forms-wizard.md +48 -0
  112. package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +233 -0
  113. package/blueprints/application-notifications-in-app/docs/topics.md +9 -0
  114. package/blueprints/application-onboarding-tour/CHANGELOG.md +12 -0
  115. package/blueprints/application-onboarding-tour/README.md +77 -0
  116. package/blueprints/application-onboarding-tour/blueprint.json +164 -0
  117. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2701-application-onboarding-tour-dismissal-policy.json +20 -0
  118. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +20 -0
  119. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2703-application-onboarding-tour-checklist-anchor.json +20 -0
  120. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +18 -0
  121. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +18 -0
  122. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +18 -0
  123. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +18 -0
  124. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +41 -0
  125. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +35 -0
  126. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +34 -0
  127. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +27 -0
  128. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +27 -0
  129. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +27 -0
  130. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +27 -0
  131. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +27 -0
  132. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +27 -0
  133. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +27 -0
  134. package/blueprints/application-onboarding-tour/docs/topics.md +50 -0
  135. package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +59 -0
  136. package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +231 -0
  137. package/blueprints/application-spa/docs/topics.md +11 -2
  138. package/blueprints/delivery-ci-workflows/docs/topics.md +10 -1
  139. package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +69 -0
  140. package/blueprints/deploy-cloudflare-workers/README.md +12 -0
  141. package/blueprints/deploy-cloudflare-workers/blueprint.json +234 -36
  142. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +30 -0
  143. package/blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs +207 -0
  144. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +18 -0
  145. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +18 -0
  146. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +36 -0
  147. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +27 -0
  148. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +27 -0
  149. package/blueprints/deploy-cloudflare-workers/docs/topics.md +11 -2
  150. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +25 -0
  151. package/blueprints/email-smtp-resend/docs/topics.md +10 -1
  152. package/blueprints/jobs-background/CHANGELOG.md +16 -0
  153. package/blueprints/jobs-background/README.md +105 -0
  154. package/blueprints/jobs-background/blueprint.json +149 -0
  155. package/blueprints/jobs-background/contributions/adrs/adr-3101-jobs-background-model.json +27 -0
  156. package/blueprints/jobs-background/contributions/adrs/adr-3102-jobs-background-scheduler-mode.json +25 -0
  157. package/blueprints/jobs-background/contributions/adrs/adr-3103-jobs-background-requires-applied-capabilities.json +25 -0
  158. package/blueprints/jobs-background/contributions/adrs/adr-3104-jobs-background-timeout-floor.json +25 -0
  159. package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +95 -0
  160. package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +82 -0
  161. package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +69 -0
  162. package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +65 -0
  163. package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +91 -0
  164. package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +65 -0
  165. package/blueprints/jobs-background/contributions/probes/run-apply-time-override.mjs +10 -0
  166. package/blueprints/jobs-background/contributions/probes/run-apply-time-refusal.mjs +11 -0
  167. package/blueprints/jobs-background/contributions/probes/run-event-secrecy.mjs +11 -0
  168. package/blueprints/jobs-background/contributions/probes/run-fake-clock-cron.mjs +11 -0
  169. package/blueprints/jobs-background/contributions/probes/run-retry-and-fail.mjs +11 -0
  170. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-001.json +18 -0
  171. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +18 -0
  172. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +18 -0
  173. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +18 -0
  174. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +18 -0
  175. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +18 -0
  176. package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +50 -0
  177. package/blueprints/jobs-background/contributions/tacs/tac-3102-jobs-background-scheduler.json +50 -0
  178. package/blueprints/jobs-background/contributions/tacs/tac-3103-jobs-background-run-log.json +49 -0
  179. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +25 -0
  180. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +25 -0
  181. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +25 -0
  182. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +25 -0
  183. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +25 -0
  184. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +25 -0
  185. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +25 -0
  186. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +25 -0
  187. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +25 -0
  188. package/blueprints/jobs-background/docs/topics.md +62 -0
  189. package/blueprints/jobs-background/guide/jobs-background.md +147 -0
  190. package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +15 -0
  191. package/blueprints/messaging-queue-cloudflare/README.md +125 -0
  192. package/blueprints/messaging-queue-cloudflare/blueprint.json +67 -0
  193. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +30 -0
  194. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +25 -0
  195. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3003-messaging-queue-cloudflare-max-attempts-floor.json +25 -0
  196. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3004-messaging-queue-cloudflare-batch-defaults.json +25 -0
  197. package/blueprints/messaging-queue-cloudflare/contributions/probes/event-secrecy.mjs +137 -0
  198. package/blueprints/messaging-queue-cloudflare/contributions/probes/probe-utils.mjs +82 -0
  199. package/blueprints/messaging-queue-cloudflare/contributions/probes/producer-facade-ready.mjs +35 -0
  200. package/blueprints/messaging-queue-cloudflare/contributions/probes/publish-to-delivery.mjs +94 -0
  201. package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +54 -0
  202. package/blueprints/messaging-queue-cloudflare/contributions/probes/retry-and-dlq.mjs +87 -0
  203. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-event-secrecy.mjs +5 -0
  204. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-producer-facade-ready.mjs +11 -0
  205. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-publish-to-delivery.mjs +5 -0
  206. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-real-account-concurrency-smoke.mjs +5 -0
  207. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-retry-and-dlq.mjs +5 -0
  208. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +18 -0
  209. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +18 -0
  210. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +18 -0
  211. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +18 -0
  212. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +18 -0
  213. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +18 -0
  214. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3001-messaging-queue-cloudflare-producer-facade.json +56 -0
  215. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3002-messaging-queue-cloudflare-consumer-registration.json +40 -0
  216. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3003-messaging-queue-cloudflare-event-sink.json +39 -0
  217. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +34 -0
  218. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +34 -0
  219. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +25 -0
  220. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +25 -0
  221. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +25 -0
  222. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +25 -0
  223. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +25 -0
  224. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +25 -0
  225. package/blueprints/messaging-queue-cloudflare/docs/topics.md +62 -0
  226. package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +110 -0
  227. package/blueprints/object-storage-s3/CHANGELOG.md +13 -0
  228. package/blueprints/object-storage-s3/README.md +108 -0
  229. package/blueprints/object-storage-s3/blueprint.json +72 -0
  230. package/blueprints/object-storage-s3/contributions/adrs/adr-2901-object-storage-s3-adapter.json +30 -0
  231. package/blueprints/object-storage-s3/contributions/adrs/adr-2902-object-storage-s3-presigned-ttl-floor.json +25 -0
  232. package/blueprints/object-storage-s3/contributions/adrs/adr-2903-object-storage-s3-multipart-threshold.json +25 -0
  233. package/blueprints/object-storage-s3/contributions/adrs/adr-2904-object-storage-s3-contract.json +25 -0
  234. package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +103 -0
  235. package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +43 -0
  236. package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +84 -0
  237. package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +101 -0
  238. package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +85 -0
  239. package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +84 -0
  240. package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +64 -0
  241. package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +4 -0
  242. package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +10 -0
  243. package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +4 -0
  244. package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +4 -0
  245. package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +7 -0
  246. package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +4 -0
  247. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +18 -0
  248. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +18 -0
  249. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +18 -0
  250. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +18 -0
  251. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +18 -0
  252. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +18 -0
  253. package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +57 -0
  254. package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +36 -0
  255. package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +36 -0
  256. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +34 -0
  257. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +43 -0
  258. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +25 -0
  259. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +34 -0
  260. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -0
  261. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +34 -0
  262. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +34 -0
  263. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +34 -0
  264. package/blueprints/object-storage-s3/docs/topics.md +64 -0
  265. package/blueprints/object-storage-s3/guide/object-storage-s3.md +207 -0
  266. package/blueprints/observability-essentials/docs/topics.md +10 -1
  267. package/blueprints/observability-logging/CHANGELOG.md +4 -0
  268. package/blueprints/observability-logging/README.md +3 -0
  269. package/blueprints/observability-logging/blueprint.json +3 -2
  270. package/blueprints/observability-logging/docs/topics.md +9 -0
  271. package/blueprints/observability-probe-endpoints/docs/topics.md +10 -1
  272. package/blueprints/persistence-data-d1/docs/topics.md +10 -1
  273. package/blueprints/persistence-data-postgres/CHANGELOG.md +12 -0
  274. package/blueprints/persistence-data-postgres/README.md +101 -0
  275. package/blueprints/persistence-data-postgres/blueprint.json +80 -0
  276. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +30 -0
  277. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2802-persistence-data-postgres-migration-shape.json +25 -0
  278. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2803-persistence-data-postgres-runner-mode.json +25 -0
  279. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2804-persistence-data-postgres-recovery.json +25 -0
  280. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +25 -0
  281. package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +56 -0
  282. package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +75 -0
  283. package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +56 -0
  284. package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +186 -0
  285. package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +76 -0
  286. package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +173 -0
  287. package/blueprints/persistence-data-postgres/contributions/probes/run-facade-round-trip.mjs +10 -0
  288. package/blueprints/persistence-data-postgres/contributions/probes/run-migration-apply.mjs +10 -0
  289. package/blueprints/persistence-data-postgres/contributions/probes/run-pool-posture-smoke.mjs +9 -0
  290. package/blueprints/persistence-data-postgres/contributions/probes/run-prepared-statement-scan.mjs +10 -0
  291. package/blueprints/persistence-data-postgres/contributions/probes/run-recovery-restore-round-trip.mjs +9 -0
  292. package/blueprints/persistence-data-postgres/contributions/probes/run-transaction-atomicity.mjs +10 -0
  293. package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +79 -0
  294. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +18 -0
  295. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +18 -0
  296. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +18 -0
  297. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +18 -0
  298. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +18 -0
  299. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +18 -0
  300. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +18 -0
  301. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +58 -0
  302. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +40 -0
  303. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +35 -0
  304. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +40 -0
  305. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +34 -0
  306. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +25 -0
  307. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +25 -0
  308. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +25 -0
  309. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +25 -0
  310. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +25 -0
  311. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +25 -0
  312. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +25 -0
  313. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +25 -0
  314. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +25 -0
  315. package/blueprints/persistence-data-postgres/docs/topics.md +66 -0
  316. package/blueprints/persistence-data-postgres/guide/persistence-data-postgres.md +172 -0
  317. package/blueprints/persistence-data-sqlite/docs/topics.md +10 -1
  318. package/blueprints/security-auth-clerk/CHANGELOG.md +4 -0
  319. package/blueprints/security-auth-clerk/README.md +3 -0
  320. package/blueprints/security-auth-clerk/blueprint.json +147 -30
  321. package/blueprints/security-auth-clerk/docs/topics.md +10 -1
  322. package/blueprints/security-auth-keycloak/CHANGELOG.md +4 -0
  323. package/blueprints/security-auth-keycloak/README.md +3 -0
  324. package/blueprints/security-auth-keycloak/blueprint.json +182 -37
  325. package/blueprints/security-auth-keycloak/docs/topics.md +10 -1
  326. package/blueprints/security-auth-magic-link/CHANGELOG.md +4 -0
  327. package/blueprints/security-auth-magic-link/README.md +3 -0
  328. package/blueprints/security-auth-magic-link/blueprint.json +159 -33
  329. package/blueprints/security-auth-magic-link/docs/topics.md +10 -1
  330. package/blueprints/security-auth-oauth2/CHANGELOG.md +4 -0
  331. package/blueprints/security-auth-oauth2/README.md +3 -0
  332. package/blueprints/security-auth-oauth2/blueprint.json +158 -32
  333. package/blueprints/security-auth-oauth2/docs/topics.md +10 -1
  334. package/blueprints/security-secrets-management/CHANGELOG.md +11 -0
  335. package/blueprints/security-secrets-management/blueprint.json +2 -1
  336. package/blueprints/security-secrets-management/docs/topics.md +10 -1
  337. package/fixtures/canary-manifest.json +9 -9
  338. package/package.json +1 -1
  339. package/rcf/code-nodes/cn-134.json +13 -0
  340. package/rcf/code-nodes/cn-135.json +12 -0
  341. package/rcf/code-nodes/cn-136.json +13 -0
  342. package/rcf/code-nodes/cn-137.json +13 -0
  343. package/rcf/code-nodes/cn-138.json +12 -0
  344. package/rcf/code-nodes/cn-139.json +12 -0
  345. package/rcf/code-nodes/cn-140.json +13 -0
  346. package/rcf/code-nodes/cn-141.json +13 -0
  347. package/rcf/code-nodes/cn-142.json +12 -0
  348. package/rcf/code-nodes/cn-143.json +13 -0
  349. package/rcf/code-nodes/cn-144.json +13 -0
  350. package/rcf/code-nodes/cn-145.json +12 -0
  351. package/rcf/code-nodes/cn-146.json +12 -0
  352. package/rcf/code-nodes/cn-147.json +13 -0
  353. package/rcf/code-nodes/cn-148.json +13 -0
  354. package/rcf/code-nodes/cn-149.json +12 -0
  355. package/rcf/code-nodes/cn-150.json +13 -0
  356. package/rcf/code-nodes/cn-151.json +13 -0
  357. package/rcf/code-nodes/cn-152.json +12 -0
  358. package/rcf/code-nodes/cn-153.json +12 -0
  359. package/rcf/code-nodes/cn-154.json +13 -0
  360. package/rcf/code-nodes/cn-155.json +14 -0
  361. package/rcf/code-nodes/cn-156.json +13 -0
  362. package/rcf/code-nodes/cn-157.json +13 -0
  363. package/rcf/code-nodes/cn-158.json +12 -0
  364. package/rcf/code-nodes/cn-159.json +13 -0
  365. package/rcf/code-nodes/cn-160.json +12 -0
  366. package/rcf/code-nodes/cn-161.json +12 -0
  367. package/rcf/code-nodes/cn-162.json +13 -0
  368. package/rcf/code-nodes/cn-163.json +12 -0
  369. package/rcf/code-nodes/cn-164.json +13 -0
  370. package/rcf/code-nodes/cn-165.json +12 -0
  371. package/rcf/code-nodes/cn-166.json +12 -0
  372. package/rcf/code-nodes/cn-167.json +12 -0
  373. package/rcf/code-nodes/cn-168.json +12 -0
  374. package/rcf/code-nodes/cn-169.json +12 -0
  375. package/rcf/code-nodes/cn-170.json +12 -0
  376. package/rcf/code-nodes/cn-171.json +12 -0
  377. package/rcf/code-nodes/cn-172.json +12 -0
  378. package/rcf/code-nodes/cn-173.json +12 -0
  379. package/rcf/code-nodes/cn-174.json +12 -0
  380. package/rcf/code-nodes/cn-175.json +13 -0
  381. package/rcf/code-nodes/cn-176.json +12 -0
  382. package/rcf/code-nodes/cn-177.json +12 -0
  383. package/rcf/code-nodes/cn-178.json +12 -0
  384. package/rcf/code-nodes/cn-179.json +12 -0
  385. package/rcf/code-nodes/cn-180.json +13 -0
  386. package/rcf/code-nodes/cn-181.json +12 -0
  387. package/rcf/code-nodes/cn-182.json +13 -0
  388. package/rcf/code-nodes/cn-183.json +12 -0
  389. package/rcf/code-nodes/cn-184.json +13 -0
  390. package/rcf/code-nodes/cn-185.json +12 -0
  391. package/rcf/code-nodes/cn-186.json +12 -0
  392. package/rcf/code-nodes/cn-200.json +14 -0
  393. package/rcf/code-nodes/cn-201.json +13 -0
  394. package/rcf/code-nodes/cn-202.json +14 -0
  395. package/rcf/code-nodes/cn-203.json +14 -0
  396. package/rcf/code-nodes/cn-204.json +13 -0
  397. package/rcf/code-nodes/cn-205.json +14 -0
  398. package/rcf/code-nodes/cn-206.json +14 -0
  399. package/rcf/code-nodes/cn-207.json +13 -0
  400. package/rcf/code-nodes/cn-208.json +14 -0
  401. package/rcf/code-nodes/cn-209.json +14 -0
  402. package/rcf/code-nodes/cn-210.json +13 -0
  403. package/rcf/code-nodes/cn-211.json +12 -0
  404. package/rcf/code-nodes/cn-212.json +12 -0
  405. package/rcf/code-nodes/cn-213.json +12 -0
  406. package/rcf/code-nodes/cn-214.json +15 -0
  407. package/rcf/code-nodes/cn-215.json +13 -0
  408. package/rcf/code-nodes/cn-216.json +14 -0
  409. package/rcf/code-nodes/cn-217.json +13 -0
  410. package/rcf/fbs/fbs-043.json +23 -0
  411. package/rcf/fbs/fbs-044.json +23 -0
  412. package/rcf/fbs/fbs-045.json +23 -0
  413. package/rcf/fbs/fbs-046.json +24 -0
  414. package/rcf/fbs/fbs-047.json +24 -0
  415. package/rcf/fbs/fbs-060.json +22 -0
  416. package/rcf/fbs/fbs-061.json +20 -0
  417. package/rcf/fbs/fbs-062.json +20 -0
  418. package/rcf/fbs/fbs-063.json +22 -0
  419. package/rcf/fbs/fbs-064.json +23 -0
  420. package/rcf/requirements/req-024.json +69 -0
  421. package/rcf/requirements/req-025.json +59 -0
  422. package/rcf/requirements/req-026.json +154 -0
  423. package/rcf/requirements/req-027.json +33 -0
  424. package/rcf/requirements/req-028.json +13 -0
  425. package/rcf/requirements/req-029.json +57 -0
  426. package/rcf/requirements/req-030.json +67 -0
  427. package/rcf/requirements/req-040.json +13 -0
  428. package/rcf/requirements/req-041.json +125 -0
  429. package/rcf/requirements/req-042.json +59 -0
  430. package/rcf/requirements/req-043.json +39 -0
  431. package/rcf/test-suites/ts-053.json +70 -0
  432. package/rcf/test-suites/ts-054.json +70 -0
  433. package/rcf/test-suites/ts-055.json +77 -0
  434. package/rcf/test-suites/ts-056.json +78 -0
  435. package/rcf/test-suites/ts-057.json +78 -0
  436. package/rcf/test-suites/ts-070.json +62 -0
  437. package/rcf/test-suites/ts-071.json +62 -0
  438. package/rcf/test-suites/ts-072.json +62 -0
  439. package/rcf/test-suites/ts-073.json +38 -0
  440. package/rcf/test-suites/ts-074.json +30 -0
  441. package/rcf/test-suites/ts-075.json +38 -0
  442. package/rcf/test-suites/ts-076.json +70 -0
  443. package/rcf/user-stories/us-2401.json +62 -0
  444. package/rcf/user-stories/us-2501.json +58 -0
  445. package/rcf/user-stories/us-2601.json +51 -0
  446. package/rcf/user-stories/us-2701.json +55 -0
  447. package/rcf/user-stories/us-2801.json +55 -0
  448. package/rcf/user-stories/us-2901.json +45 -0
  449. package/rcf/user-stories/us-2902.json +36 -0
  450. package/rcf/user-stories/us-3001.json +45 -0
  451. package/rcf/user-stories/us-4001.json +69 -0
  452. package/rcf/user-stories/us-4101.json +69 -0
  453. package/rcf/user-stories/us-4201.json +69 -0
  454. package/rcf/user-stories/us-4301.json +78 -0
  455. package/releases/releases.yaml +21 -1
  456. package/src/blueprint/apply.js +13 -1
  457. package/src/blueprint/capabilities.js +66 -2
  458. package/src/cli/blueprint.js +15 -1
@@ -0,0 +1,36 @@
1
+ {
2
+ "createdAt": "2026-09-07T09:11:05.250Z",
3
+ "updatedAt": "2026-09-07T09:11:05.250Z",
4
+ "asA": "shelf consumer applying the deploy-cloudflare-workers v1.2.0 blueprint who wants the two new elicits to appear in the operator elicit prompt with sane defaults",
5
+ "iWant": "the blueprint.json top-level elicits[] to declare both new entries (assets-directory kind string default empty; run-worker-first kind boolean default false), the CLI to accept --answer assets-directory=<path> and --answer run-worker-first=<bool> at blueprint add, and the generated wrangler.toml under the applied project to reflect the answered values",
6
+ "soThat": "a project answering assets-directory=./dist gets [assets] directory = \"./dist\" emitted in its wrangler.toml, a project not answering assets-directory keeps the bare-Worker shape without any [assets] block, and the two elicits do not affect any shipped v1.1.0 contribution",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-2902-1",
10
+ "description": "The blueprint.json elicits[] block gains exactly two new entries: assets-directory with id assets-directory, kind string, default empty string, prompt describing the applied static-assets root; run-worker-first with id run-worker-first, kind boolean, default false, prompt describing the SPA fallback discipline that a truthy answer runs the Worker before asset lookup. The two elicits pass the loader's validateElicits shape gate on src/blueprint/loader.js (id kebab-slug, kind one of enum|string|boolean, default matches kind). Neither elicit carries providesCapability (both are shape choices not custom-auth discovery). The spec's intended when-predicate {elicitedNonEmpty: [assets-directory]} on run-worker-first is NOT shipped this round because the loader's supported when block only accepts requiresCapability arrays; the guide names the shape trade and CONCERNS on the PR names the smallest loader extension to close the gap.",
11
+ "given": "the shipped blueprint.json at blueprints/deploy-cloudflare-workers/blueprint.json",
12
+ "when": "jq .elicits returns the top-level array and the loader loads blueprint.json without a validation error",
13
+ "then": "the array contains exactly two entries whose ids are assets-directory and run-worker-first, with the shapes above; jq validation and the loader both accept the shape",
14
+ "testable": true,
15
+ "scope": "library"
16
+ },
17
+ {
18
+ "id": "AC-2902-2",
19
+ "description": "The cf-platform fixture at packages/rcf-lite/test/fixtures/cf-platform/ ships a wrangler.toml with [assets] directory = \"./dist\" and run_worker_first = true baked into the [assets] block. The fixture ships dist/index.html so the assets directory exists on disk. The fixture ships src/index.mjs as the minimal Worker entry, a package.json declaring wrangler as a devDependency and start = wrangler dev, a run-assets-manifest-scan.mjs shim requiring the probe module from blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs, and a README naming the wrangler dev boot line, the two elicit answers baked into wrangler.toml, and the two induced-failure switches SIMULATE_MIXED_SHAPE (inserts a pages_build_output_dir field so the probe surfaces the mixed-shape refusal) and SIMULATE_EMPTY_ASSETS (removes the [assets] block so the probe records the bare-Worker shape and passes with an empty-directory record).",
20
+ "given": "the cf-platform fixture tree after this T-0 slice lands",
21
+ "when": "ls -R the fixture directory",
22
+ "then": "the fixture ships wrangler.toml with the [assets] block, dist/index.html, src/index.mjs, package.json with wrangler dev, run-assets-manifest-scan.mjs and README.md with the switches and boot line documented",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ }
26
+ ],
27
+ "tags": [
28
+ "blueprint:deploy-cloudflare-workers"
29
+ ],
30
+ "usId": "US-2902",
31
+ "prdId": "PRD-001",
32
+ "reqId": "REQ-029",
33
+ "version": "0.1.0",
34
+ "status": "draft",
35
+ "title": "T-0 assets-directory and run-worker-first elicits on blueprint.json top-level elicits[] and baked into the cf-platform fixture wrangler.toml"
36
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "createdAt": "2026-09-07T09:11:05.463Z",
3
+ "updatedAt": "2026-09-07T09:11:05.463Z",
4
+ "asA": "shelf consumer applying the deploy-cloudflare-workers v1.2.0 blueprint on a project migrating from Cloudflare Pages",
5
+ "iWant": "an ADR blessing the Workers-with-static-assets shape as the ratified SPA-on-Workers deploy shape over Pages (ADR-1306-deploy-cloudflare-workers-spa-shape) carrying the verbatim Cloudflare Pages landing-page recommendation, a guide section titled Workers-with-static-assets: the SPA-on-Workers shape that links the Cloudflare migrate-from-Pages guide, and the SPA fallback discipline elicited via run_worker_first so a truthy answer emits run_worker_first = true under the [assets] block on the generated wrangler.toml",
6
+ "soThat": "a project can read the ratified shape decision with its standards trace to Cloudflare's own landing-page recommendation and know exactly how to migrate its Pages routing to Workers",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-3001-1",
10
+ "description": "The ADR contribution entry ADR-1306-deploy-cloudflare-workers-spa-shape sits under contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json and validates against the rcf-schemas 0.6.1 ADR shape (required fields adrId prdId tadId version status title context decision consequences createdAt updatedAt; optional alternativesConsidered supersededBy relatedAdrs). Its body carries the verbatim Cloudflare Pages landing-page quote Workers supports most Pages use cases and offers a broader feature set. It is Cloudflare's primary platform for building applications. Start new projects with Workers., alongside a decision blessing Workers-with-static-assets as the SPA-on-Workers deploy shape and consequences naming the two new elicits assets-directory and run-worker-first. The ADR contribution entry in blueprint.json carries recommendedDefault true, elicited false and standardsTraceClause Cloudflare Pages landing-page recommendation (2026-09-06). The ADR body does NOT carry standardsTraceClause (per section 8a.2 the clause belongs on the contribution entry).",
11
+ "given": "the shipped ADR contribution",
12
+ "when": "jq queries against blueprint.json contribution entry and the ADR JSON body",
13
+ "then": "the blueprint.json entry carries standardsTraceClause set to the 2026-09-06 landing-page recommendation clause; the ADR body carries the verbatim Cloudflare Pages landing-page quote in context or decision; the ADR body does not carry standardsTraceClause; the ADR body validates against the 0.6.1 ADR schema",
14
+ "testable": true,
15
+ "scope": "library"
16
+ },
17
+ {
18
+ "id": "AC-3001-2",
19
+ "description": "The guide at blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md gains a new section titled Workers-with-static-assets: the SPA-on-Workers shape with the verbatim Cloudflare landing-page quote, the two elicit signatures (assets-directory string default empty; run-worker-first boolean default false), a copy-paste wrangler.toml snippet showing the [assets] block with directory and the run_worker_first hint, and a link to the Cloudflare migrate-from-Pages guide at https://developers.cloudflare.com/workers/static-assets/migration-guides/migrate-from-pages/. The Cloudflare Workers static-assets doc at https://developers.cloudflare.com/workers/static-assets/ is cited in the same section. Both URLs return 200 at gate time.",
20
+ "given": "the updated guide file",
21
+ "when": "grep the guide for the new section heading and the two Cloudflare URLs",
22
+ "then": "the section heading appears once with the exact title; the migrate-from-Pages URL and the static-assets doc URL appear at least once each; both URLs return HTTP 200 on a plain curl -fsSI",
23
+ "testable": true,
24
+ "scope": "library"
25
+ },
26
+ {
27
+ "id": "AC-3001-3",
28
+ "description": "The spec's second canonical AC spaFallbackShape is realised in the blueprint contributions as AC-12113-2 on US-12113 with a runtime-observable then clause anchored to TAC-1302-deploy-cloudflare-workers-wrangler-manifest. The shipped probe assets-manifest-scan.mjs asserts run_worker_first presence and value under the [assets] block against the elicited answer. On the cf-platform fixture (which bakes run_worker_first = true) the probe returns verdict pass and the report carries a detail record naming runWorkerFirst true. On the SIMULATE_MIXED_SHAPE=true branch the fixture inserts a pages_build_output_dir field and the probe returns verdict fail naming the offending pages_build_output_dir line. On the SIMULATE_EMPTY_ASSETS=true branch the fixture removes the [assets] block and the probe returns verdict pass with an empty-directory record (bare-Worker shape).",
29
+ "given": "the shipped probe module and the cf-platform fixture with induced-failure switches",
30
+ "when": "run-assets-manifest-scan.mjs drives the probe on each of the three fixture states",
31
+ "then": "aggregateVerdict pass on the canonical state; aggregateVerdict fail on SIMULATE_MIXED_SHAPE with detail naming pages_build_output_dir; aggregateVerdict pass on SIMULATE_EMPTY_ASSETS with the empty-directory record",
32
+ "testable": true,
33
+ "scope": "runtime"
34
+ }
35
+ ],
36
+ "tags": [
37
+ "blueprint:deploy-cloudflare-workers"
38
+ ],
39
+ "usId": "US-3001",
40
+ "prdId": "PRD-001",
41
+ "reqId": "REQ-030",
42
+ "version": "0.1.0",
43
+ "status": "draft",
44
+ "title": "T-0 ADR-1306-deploy-cloudflare-workers-spa-shape, guide section with migrate-from-Pages link, and probed spaFallbackShape with induced-failure switches"
45
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "createdAt": "2026-09-06T16:59:00.000Z",
3
+ "updatedAt": "2026-09-06T16:59:00.000Z",
4
+ "usId": "US-4001",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-040",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "The persistence-data-postgres blueprint ships on the shelf; six Node-only probes pass against a live postgres:17-alpine container and refuse on each induced failure",
10
+ "asA": "shelf consumer applying the persistence-data-postgres v1.0.0 blueprint",
11
+ "iWant": "the shipped blueprint files with 26 contributions and six probes, a sample-app fixture that boots postgres:17-alpine and applies three toy forward-only migrations, and gate-runnable proof that every probe passes on the canonical fixture state and refuses on each induced-failure switch",
12
+ "soThat": "a rcf-lite project applying this blueprint gets a facade contract over pg with numbered forward-only migrations, prepared-statement discipline, transactional atomicity, a two-path recovery model, and pool posture per deploy target, with runtime-observable ACs proven by probes the HQ gate runs against a real Postgres container rather than a simulated harness",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-4001-1",
16
+ "description": "The shelf carries blueprints/persistence-data-postgres/blueprint.json declaring slug persistence-data-postgres, version 1.0.0, category persistence, 26 contributions in the 7 REQ / 10 US / 4 TAC / 5 ADR groups per infra round 5 spec section 5.1; capabilities is [relationalStore]; suggestedCompanions declares logging and errorHandling with spec section 5.1 reasons; providesRoles is absent; requiresAppliedCapabilities is absent.",
17
+ "given": "the shelf tree after this blueprint lands",
18
+ "when": "jq queries against blueprints/persistence-data-postgres/blueprint.json",
19
+ "then": "jq .slug returns persistence-data-postgres; jq .version returns 1.0.0; jq .contributions | length returns 26; jq .capabilities | index(relationalStore) returns 0; jq .suggestedCompanions | length returns 2",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ },
23
+ {
24
+ "id": "AC-4001-2",
25
+ "description": "rcf define blueprint add ./blueprints/persistence-data-postgres applies the 26 contributions cleanly on a fresh init project with no other persistence blueprint applied; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project.",
26
+ "given": "a fresh rcf init scratch project with no persistence-* blueprint applied",
27
+ "when": "rcf define blueprint add ./blueprints/persistence-data-postgres runs, then rcf define validate, then rcf audit coverage --strict, then rcf audit eval coverage --strict",
28
+ "then": "every command exits 0; the scratch project's rcf tree contains the 26 contributions; no globalAdrTopic conflict is raised",
29
+ "testable": true,
30
+ "scope": "runtime"
31
+ },
32
+ {
33
+ "id": "AC-4001-3",
34
+ "description": "rcf define blueprint add ./blueprints/persistence-data-postgres on a scratch project with persistence-data-d1 already applied surfaces a DELIBERATE conflict on the persistenceStore and migrationDiscipline global-ADR topics per the round-2 pattern; the tree is untouched by the failed add.",
35
+ "given": "a fresh rcf init scratch project with persistence-data-d1 v1.0.0 already applied",
36
+ "when": "rcf define blueprint add ./blueprints/persistence-data-postgres runs against the scratch project",
37
+ "then": "the add refuses with a globalAdrTopic conflict list containing persistenceStore and migrationDiscipline; the scratch project's rcf tree does not carry persistence-data-postgres contributions after the refusal",
38
+ "testable": true,
39
+ "scope": "runtime"
40
+ },
41
+ {
42
+ "id": "AC-4001-4",
43
+ "description": "The six probe modules under blueprints/persistence-data-postgres/contributions/probes/ each pass against a running postgres:17-alpine container brought up from the sample-app fixture: facade-round-trip asserts facadeReady fires and the round-trip returns; migration-apply asserts three migrations apply inside individual transactions and schema_version advances to 3; prepared-statement-scan asserts every pg.query first-argument node is a static string literal; transaction-atomicity asserts a rollback fires with the failing statement index; recovery-restore-round-trip asserts row-count and checksum equality between source and restored databases; pool-posture-smoke asserts twenty concurrent queries return with no timeout. Each per-blueprint probe report at .rcf/reports/blueprints/persistence-data-postgres/<probe-name>.json carries aggregateVerdict pass.",
44
+ "given": "the sample-app fixture at packages/rcf-lite/test/fixtures/infra-postgres/ with docker compose up -d postgres running and the fixture applied",
45
+ "when": "each of the six run-<probe-name>.mjs shims runs against the fixture in sequence",
46
+ "then": "every shim exits 0; every per-blueprint report file carries aggregateVerdict pass; every result carries an anchorAcId matching a contributed AC id on the blueprint",
47
+ "testable": true,
48
+ "scope": "runtime"
49
+ },
50
+ {
51
+ "id": "AC-4001-5",
52
+ "description": "The sample-app fixture's induced-failure switches surface each probe's negative-run behaviour: SIMULATE_MIGRATION_FAILURE=true makes run-migration-apply.mjs exit non-zero with the failing migration filename in its report and the transaction rolled back; SIMULATE_CONSTRAINT_VIOLATION=true names the transaction-atomicity probe's rollback observation. Every negative-run report carries aggregateVerdict fail on the AC anchored to the observation the switch corrupts.",
53
+ "given": "the sample-app fixture with docker compose up -d postgres running",
54
+ "when": "the migration-apply probe runs with SIMULATE_MIGRATION_FAILURE=true, and the transaction-atomicity probe runs with SIMULATE_CONSTRAINT_VIOLATION=true",
55
+ "then": "the migration-apply shim exits non-zero and its report at .rcf/reports/blueprints/persistence-data-postgres/migration-apply.json carries aggregateVerdict fail with the failing migration filename in a detail field; the transaction-atomicity probe records the rollback event with statementIndex 1 as evidence of the constraint-violation semantics",
56
+ "testable": true,
57
+ "scope": "runtime"
58
+ },
59
+ {
60
+ "id": "AC-4001-6",
61
+ "description": "The blueprint ships a sample-app fixture, a README, a CHANGELOG, a guide, and a docs/topics.md entry; the shelf-wide id-band registry table gains a persistence-data-postgres row at US band 27101-27899 / ADR-TAC suffix block 28xx across every shipped blueprint's docs/topics.md; packages/rcf-lite/docs/blueprint-authoring.md section 6a capability-declaration table gains one row for relationalStore per infra round 5 spec section 5.6.",
62
+ "given": "the shelf tree after this blueprint lands",
63
+ "when": "grep queries walk every blueprint's docs/topics.md and the section 6a table",
64
+ "then": "packages/rcf-lite/docs/blueprint-authoring.md contains a table row beginning | relationalStore |; every shipped blueprint's docs/topics.md carries a row beginning | persistence-data-postgres | with the 27101-27899 band and 28xx suffix; blueprints/persistence-data-postgres/README.md, CHANGELOG.md, guide/persistence-data-postgres.md, docs/topics.md, and packages/rcf-lite/test/fixtures/infra-postgres/ all exist; the fixture README names the docker and podman incantations and the two induced-failure switches",
65
+ "testable": true,
66
+ "scope": "runtime"
67
+ }
68
+ ]
69
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "createdAt": "2026-09-06T17:50:03.129Z",
3
+ "updatedAt": "2026-09-06T17:50:03.129Z",
4
+ "asA": "shelf consumer applying the object-storage-s3 v1.0.0 blueprint",
5
+ "iWant": "the shipped blueprint files with 21 contributions, six probes, and the T-2 side of the shared sample-app fixture that boots MinIO and applies the security-secrets-management shim, plus gate-runnable proof that every probe passes on the canonical fixture state and refuses on each induced-failure switch",
6
+ "soThat": "a rcf-lite project applying this blueprint gets an S3-shape facade over @aws-sdk/client-s3 or aws4fetch with put/get/delete/list, presigned URLs with bounded TTL, multipart-upload above threshold, a lifecycle-event sink with metadata-only fields, and a compose-time refusal on missing security-secrets-management, with runtime-observable ACs proven by probes the HQ gate runs against a real MinIO container",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-4101-1",
10
+ "description": "The shelf carries blueprints/object-storage-s3/blueprint.json declaring slug object-storage-s3, version 1.0.0, category object-storage, 21 contributions in the 6 REQ / 8 US / 3 TAC / 4 ADR groups per infra round 5 spec section 5.2; capabilities is [objectStorage]; suggestedCompanions declares logging and errorHandling with spec section 5.2 reasons; providesRoles is absent; requiresAppliedCapabilities is absent; every ADR contribution entry carries a non-null standardsTraceClause per section 8a.2.",
11
+ "given": "the shelf tree after this blueprint lands",
12
+ "when": "jq queries against blueprints/object-storage-s3/blueprint.json",
13
+ "then": "jq .slug returns object-storage-s3; jq .version returns 1.0.0; jq .contributions | length returns 21; jq .capabilities returns [objectStorage]; jq .suggestedCompanions | length returns 2; jq .contributions[] | select(.kind==adr) | .standardsTraceClause returns a non-null string for every entry",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ },
17
+ {
18
+ "id": "AC-4101-2",
19
+ "description": "rcf define blueprint add ./blueprints/object-storage-s3 applies the 21 contributions cleanly on a fresh init project with security-secrets-management already applied; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project.",
20
+ "given": "a fresh rcf init scratch project with security-secrets-management applied",
21
+ "when": "rcf define blueprint add ./blueprints/object-storage-s3 runs, then rcf define validate, then rcf audit coverage --strict, then rcf audit eval coverage --strict",
22
+ "then": "every command exits 0; the scratch project's rcf tree contains the 21 contributions; no globalAdrTopic conflict is raised",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ },
26
+ {
27
+ "id": "AC-4101-3",
28
+ "description": "rcf define blueprint add ./blueprints/object-storage-s3 on a scratch project without security-secrets-management refuses with exit 3 and stable message id object-storage-s3-no-secrets on stderr per REQ-006 and spec section 5.2; the --allow-no-secrets-yet override lands the contributions with a note recorded on source.notes for later reconciliation.",
29
+ "given": "a fresh rcf init scratch project with no security-secrets-management applied",
30
+ "when": "rcf define blueprint add ./blueprints/object-storage-s3 runs against the scratch project, then the same command runs with --allow-no-secrets-yet",
31
+ "then": "the first invocation exits 3 with stderr containing object-storage-s3-no-secrets and naming security-secrets-management and the override flag; the scratch tree does not carry object-storage-s3 contributions after the refusal; the second invocation exits 0 and the applied manifest records a source.notes entry naming the missing predecessor",
32
+ "testable": true,
33
+ "scope": "runtime"
34
+ },
35
+ {
36
+ "id": "AC-4101-4",
37
+ "description": "The six probe modules under blueprints/object-storage-s3/contributions/probes/ each pass against a running MinIO container brought up from the shared sample-app fixture: facade-round-trip asserts facadeReady fires with endpointHost and bucketName; put-get-round-trip asserts 1 KiB round-trip byte-equal, list under prefix, and delete round-trip with objectDeleted; presigned-url asserts 200 within TTL, 403 on tampered signature, and floor refusal below 60 s; multipart-upload asserts 10 MiB round-trip byte-equal via multipart with no orphan in-flight uploads; event-secrecy asserts the whitelist and no PII fixture leak; r2-real-account-smoke exits 0 with accountBoundSkipped:true without CI_HAS_CLOUDFLARE_ACCOUNT or runs a real R2 round-trip when the env var is set. Each per-blueprint probe report at .rcf/reports/blueprints/object-storage-s3/<probe-name>.json carries aggregateVerdict pass.",
38
+ "given": "the shared sample-app fixture at packages/rcf-lite/test/fixtures/infra-s3-and-queue/ with docker compose up -d minio running and the rcf-test bucket created",
39
+ "when": "each of the six run-<probe-name>.mjs shims runs against the fixture in sequence",
40
+ "then": "every shim exits 0; every per-blueprint report file carries aggregateVerdict pass; every result carries an anchorAcId matching a contributed AC id on the blueprint",
41
+ "testable": true,
42
+ "scope": "runtime"
43
+ },
44
+ {
45
+ "id": "AC-4101-5",
46
+ "description": "The sample-app fixture's induced-failure switches surface each probe's negative-run behaviour: SIMULATE_PART_UPLOAD_FAIL=true drives the multipart-upload probe's AC-28104-2 abort-on-failure path; SIMULATE_PRESIGN_MALFORMED=true drives the presigned-url probe's tampered-signature 403 path; SIMULATE_403_ON_GET=true drives the put-get-round-trip probe's fail on AC-28102-1. Each switched-run report carries aggregateVerdict fail on the AC anchored to the observation the switch corrupts (except SIMULATE_PART_UPLOAD_FAIL which surfaces the pass-on-abort-shape).",
47
+ "given": "the shared fixture with MinIO running",
48
+ "when": "each named induced-failure switch is set in turn and the paired probe runs",
49
+ "then": "SIMULATE_PART_UPLOAD_FAIL true yields multipart-upload report with AC-28104-2 pass and no orphan uploads; SIMULATE_403_ON_GET true yields put-get-round-trip report with aggregateVerdict fail; SIMULATE_PRESIGN_MALFORMED true yields presigned-url first-fetch 403 and aggregateVerdict fail; the fixture README documents each switch and the paired probe",
50
+ "testable": true,
51
+ "scope": "runtime"
52
+ },
53
+ {
54
+ "id": "AC-4101-6",
55
+ "description": "The blueprint ships a sample-app fixture entry, a README, a CHANGELOG, a guide, and a docs/topics.md entry; the shelf-wide id-band registry table gains an object-storage-s3 row at US band 28101-28899 / ADR-TAC suffix block 29xx across every shipped blueprint's docs/topics.md; packages/rcf-lite/docs/blueprint-authoring.md section 6a capability-declaration table gains one row for objectStorage per infra round 5 spec section 5.6.",
56
+ "given": "the shelf tree after this blueprint lands",
57
+ "when": "grep queries walk every blueprint's docs/topics.md and the section 6a table",
58
+ "then": "packages/rcf-lite/docs/blueprint-authoring.md contains a table row beginning | objectStorage |; every shipped blueprint's docs/topics.md carries a row beginning | object-storage-s3 | with the 28101-28899 band and 29xx suffix; blueprints/object-storage-s3/README.md, CHANGELOG.md, guide/object-storage-s3.md, docs/topics.md, and packages/rcf-lite/test/fixtures/infra-s3-and-queue/ all exist; the fixture README names docker and podman incantations and four wired induced-failure switches",
59
+ "testable": true,
60
+ "scope": "runtime"
61
+ }
62
+ ],
63
+ "usId": "US-4101",
64
+ "prdId": "PRD-001",
65
+ "reqId": "REQ-041",
66
+ "version": "0.1.0",
67
+ "status": "draft",
68
+ "title": "The object-storage-s3 blueprint ships on the shelf with five MinIO probes plus one accountBound R2 smoke"
69
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "createdAt": "2026-09-06T19:17:37.906Z",
3
+ "updatedAt": "2026-09-06T19:17:37.906Z",
4
+ "asA": "shelf consumer applying the messaging-queue-cloudflare v1.0.0 blueprint",
5
+ "iWant": "the shipped blueprint files with 20 to 24 contributions, six probes, and the T-3 side of the shared sample-app fixture that boots a Cloudflare Worker under wrangler dev with a queue binding and a DLQ binding, plus gate-runnable proof that every probe passes on the canonical fixture state and refuses on each induced-failure switch",
6
+ "soThat": "a rcf-lite project applying this blueprint gets a producer facade over the Cloudflare Queues binding with publish, consume, ack, retry, and DLQ, a lifecycle-event sink with metadata-only fields, and the queue capability the jobs-background blueprint composes on at apply time, with runtime-observable ACs proven by probes the HQ gate runs against a real wrangler dev process",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-4201-1",
10
+ "description": "The shelf carries blueprints/messaging-queue-cloudflare/blueprint.json declaring slug messaging-queue-cloudflare, version 1.0.0, category messaging, 21 contributions in the 6 REQ / 8 US / 3 TAC / 4 ADR groups per infra round 5 spec section 5.3; capabilities is [queue]; suggestedCompanions declares logging and errorHandling with spec section 5.3 reasons; providesRoles is absent; requiresAppliedCapabilities is absent; every ADR contribution entry carries a non-null standardsTraceClause per section 8a.2.",
11
+ "given": "the shelf tree after this blueprint lands",
12
+ "when": "jq queries against blueprints/messaging-queue-cloudflare/blueprint.json",
13
+ "then": "jq .slug returns messaging-queue-cloudflare; jq .version returns 1.0.0; jq .contributions | length returns 21; jq .capabilities returns [queue]; jq .suggestedCompanions | length returns 2; jq .contributions[] | select(.kind==adr) | .standardsTraceClause returns a non-null string for every entry",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ },
17
+ {
18
+ "id": "AC-4201-2",
19
+ "description": "rcf define blueprint add ./blueprints/messaging-queue-cloudflare applies the 21 contributions cleanly on a fresh init project; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project.",
20
+ "given": "a fresh rcf init scratch project",
21
+ "when": "rcf define blueprint add ./blueprints/messaging-queue-cloudflare runs, then rcf define validate, then rcf audit coverage --strict, then rcf audit eval coverage --strict",
22
+ "then": "every command exits 0; the scratch project's rcf tree contains the 21 contributions; no globalAdrTopic conflict is raised",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ },
26
+ {
27
+ "id": "AC-4201-3",
28
+ "description": "REQ-004 description names the dead_letter_queue field literal (per fetched Cloudflare Queues DLQ documentation) and the DLQ retention 4 days; jq grep on the contribution set returns at least one match for dead_letter_queue and at least one match for the retention constant.",
29
+ "given": "the shelf blueprint contribution set",
30
+ "when": "jq .contributions[] | select(.id==messaging-queue-cloudflare-REQ-004) | .description on the requirement file",
31
+ "then": "the description mentions dead_letter_queue and 4 days retention with the source URL literal https://developers.cloudflare.com/queues/configuration/dead-letter-queues/",
32
+ "testable": true,
33
+ "scope": "runtime"
34
+ },
35
+ {
36
+ "id": "AC-4201-4",
37
+ "description": "The six probe modules under blueprints/messaging-queue-cloudflare/contributions/probes/ each pass against a running wrangler-dev seam brought up from the shared sample-app fixture: producer-facade-ready asserts producerReady fires with the queue name; publish-to-delivery asserts consumer receives all 5 messages with matching bodies and trace-ids; retry-and-dlq asserts DLQ contents at attempt-counter 3 and messageDeadLettered fires; event-secrecy asserts no PII fixture text in any event record; real-account-concurrency-smoke exits 0 with accountBoundSkipped true without CI_HAS_CLOUDFLARE_ACCOUNT or runs a real 500-message round-trip when the env var is set. Each per-blueprint probe report at .rcf/reports/blueprints/messaging-queue-cloudflare/<probe-name>.json carries aggregateVerdict pass.",
38
+ "given": "the shared sample-app fixture at packages/rcf-lite/test/fixtures/infra-s3-and-queue/ with the T-3 wrangler-dev seam booted (or the in-memory queue-driver mode active for probes needing no live Wrangler process)",
39
+ "when": "each of the six run-<probe-name>.mjs shims runs against the fixture in sequence",
40
+ "then": "every shim exits 0; every per-blueprint report file carries aggregateVerdict pass; every result carries an anchorAcId matching a contributed AC id on the blueprint",
41
+ "testable": true,
42
+ "scope": "runtime"
43
+ },
44
+ {
45
+ "id": "AC-4201-5",
46
+ "description": "The sample-app fixture's three induced-failure switches surface each probe's negative-run behaviour: SIMULATE_CONSUMER_RETRY=true drives the retry-and-dlq probe's re-delivery path and (at max-attempts) the DLQ landing; SIMULATE_DLQ_OVERFLOW=true drives the retry-and-dlq probe past max-attempts on the first delivery so the message lands on the DLQ within one delivery cycle; SIMULATE_PII_IN_BODY=true drives the event-secrecy probe with a PII fixture body and asserts the event record whitelist enforces (no PII leak).",
47
+ "given": "the shared fixture with the T-3 seam active",
48
+ "when": "each named induced-failure switch is set in turn and the paired probe runs",
49
+ "then": "SIMULATE_CONSUMER_RETRY true yields retry-and-dlq report with attempt-counter increments to 3 and messageDeadLettered fires; SIMULATE_DLQ_OVERFLOW true yields retry-and-dlq report reaching DLQ on first cycle with aggregateVerdict pass; SIMULATE_PII_IN_BODY true yields event-secrecy report with aggregateVerdict pass proving the whitelist blocks the PII leak (or fail if the whitelist is bypassed); the fixture README documents each switch and the paired probe",
50
+ "testable": true,
51
+ "scope": "runtime"
52
+ },
53
+ {
54
+ "id": "AC-4201-6",
55
+ "description": "The blueprint ships a sample-app fixture entry, a README, a CHANGELOG, a guide, and a docs/topics.md entry; the shelf-wide id-band registry table gains a messaging-queue-cloudflare row at US band 29101-29899 / ADR-TAC suffix block 30xx across every shipped blueprint's docs/topics.md; packages/rcf-lite/docs/blueprint-authoring.md section 6a capability-declaration table gains one row for queue naming the reserved messaging-queue-postgres sibling per infra round 5 spec section 5.6 and Baz decision 7.",
56
+ "given": "the shelf tree after this blueprint lands",
57
+ "when": "grep queries walk every blueprint's docs/topics.md and the section 6a table",
58
+ "then": "packages/rcf-lite/docs/blueprint-authoring.md contains a table row beginning | queue | with the reserved messaging-queue-postgres sibling note; every shipped blueprint's docs/topics.md carries a row beginning | messaging-queue-cloudflare | with the 29101-29899 band and 30xx suffix; blueprints/messaging-queue-cloudflare/README.md, CHANGELOG.md, guide/messaging-queue-cloudflare.md, docs/topics.md, and the extended packages/rcf-lite/test/fixtures/infra-s3-and-queue/ all exist; the fixture README names the wrangler dev incantation and three wired induced-failure switches",
59
+ "testable": true,
60
+ "scope": "runtime"
61
+ }
62
+ ],
63
+ "usId": "US-4201",
64
+ "prdId": "PRD-001",
65
+ "reqId": "REQ-042",
66
+ "version": "0.1.0",
67
+ "status": "draft",
68
+ "title": "The messaging-queue-cloudflare blueprint ships on the shelf with four wrangler-dev probes plus one accountBound real-account concurrency smoke"
69
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "createdAt": "2026-09-06T20:28:34.000Z",
3
+ "updatedAt": "2026-09-06T20:28:34.000Z",
4
+ "asA": "shelf consumer applying the jobs-background v1.0.0 blueprint",
5
+ "iWant": "the shipped blueprint files with 22 contributions, five probes, an extension to the shared sample-app fixture wiring the jobs runtime and scheduler on top of the T-3 in-memory queue seam, plus gate-runnable proof that apply refuses on a bare project with exit 3 and the stable message id, --allow-no-queue-yet writes a sidecar note, and every probe passes on the canonical fixture state",
6
+ "soThat": "a rcf-lite project applying this blueprint gets a job-definition contract with retry policy and timeout, an elicited scheduler (inProcess for now, workerCron or external for shipped adapters, workflows reserved for v1.1.0), a metadata-only run-log event stream at four moments, and the backgroundJobs capability future consumer blueprints can compose on; the T-5 capability-consumer mechanism is exercised end to end through the queue-capability path with runtime-observable ACs proven by probes the HQ gate runs against the shared sample-app fixture",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-4301-1",
10
+ "description": "The shelf carries blueprints/jobs-background/blueprint.json declaring slug jobs-background, version 1.0.0, category jobs, 22 contributions in the 6 REQ / 9 US / 3 TAC / 4 ADR groups per infra round 5 spec section 5.4; capabilities is [backgroundJobs]; suggestedCompanions declares logging and errorHandling with spec section 5.4 reasons; providesRoles is absent; requiresAppliedCapabilities equals {capabilities:[queue],allowSkipFlag:allow-no-queue-yet,refusalMessageId:jobs-background-no-queue}; every ADR contribution entry carries a non-null standardsTraceClause per section 8a.2.",
11
+ "given": "the shelf tree after this blueprint lands",
12
+ "when": "jq queries against blueprints/jobs-background/blueprint.json",
13
+ "then": "jq .slug returns jobs-background; jq .version returns 1.0.0; jq .contributions | length returns 22; jq .capabilities returns [backgroundJobs]; jq .suggestedCompanions | length returns 2; jq .requiresAppliedCapabilities.capabilities returns [queue]; jq .requiresAppliedCapabilities.allowSkipFlag returns allow-no-queue-yet; jq .requiresAppliedCapabilities.refusalMessageId returns jobs-background-no-queue; jq .contributions[] | select(.kind==adr) | .standardsTraceClause returns a non-null string for every entry",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ },
17
+ {
18
+ "id": "AC-4301-2",
19
+ "description": "rcf define blueprint add ./blueprints/jobs-background on a bare fresh init project with no queue-capability provider applied refuses with exit 3 and the stderr message opens with the tag [jobs-background-no-queue] and explicitly names messaging-queue-cloudflare as the shipped provider and --allow-no-queue-yet as the override, per infra round 5 spec section 10 Q3 default asserting BOTH exit code AND stable message id.",
20
+ "given": "a fresh rcf init scratch project with no applied blueprints",
21
+ "when": "rcf define blueprint add ./blueprints/jobs-background runs",
22
+ "then": "exit code is 3; stderr contains the substring [jobs-background-no-queue]; stderr contains the substring messaging-queue-cloudflare; stderr contains the substring --allow-no-queue-yet; nothing is written to rcf/manifest.json under blueprints[] for jobs-background",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ },
26
+ {
27
+ "id": "AC-4301-3",
28
+ "description": "rcf define blueprint add ./blueprints/jobs-background --allow-no-queue-yet on the same bare project exits 0 and writes the sidecar rcf/blueprints/jobs-background.applied.json with allowNoAuthYet true, appliedCapabilities [], and a notes field naming the missing queue capability and the --allow-no-queue-yet override flag (queue-family prose, not auth-family prose); the T-5 mechanism's shipped sidecar path supersedes the spec section 5.4 prose reference to manifest.blueprints[jobs-background].source.notes because the applied-blueprint-record schema in rcf-schemas 0.6.1 is closed and cannot carry the notes field.",
29
+ "given": "a fresh rcf init scratch project with no applied blueprints",
30
+ "when": "rcf define blueprint add ./blueprints/jobs-background --allow-no-queue-yet runs",
31
+ "then": "exit code is 0; the file rcf/blueprints/jobs-background.applied.json exists; its slug is jobs-background; its allowNoAuthYet is true; its appliedCapabilities is []; its notes contains the substring no queue yet and the substring --allow-no-queue-yet and the substring queue; its notes does NOT contain the substring no auth yet nor no secrets-management yet",
32
+ "testable": true,
33
+ "scope": "runtime"
34
+ },
35
+ {
36
+ "id": "AC-4301-4",
37
+ "description": "rcf define blueprint add ./blueprints/jobs-background on a fresh init project that first applied messaging-queue-cloudflare exits 0 and the sidecar rcf/blueprints/jobs-background.applied.json records appliedCapabilities containing queue via the T-5 capability discovery mechanism (union across applied blueprint capability declarations); the spec section 5.4 prose reference to jq '.blueprints[] | select(.slug==\"jobs-background\") | .appliedCapabilities' rcf/manifest.json is superseded by the shipped mechanism which lives on the sidecar.",
38
+ "given": "a fresh rcf init scratch project with messaging-queue-cloudflare applied first",
39
+ "when": "rcf define blueprint add ./blueprints/jobs-background runs",
40
+ "then": "exit code is 0; the file rcf/blueprints/jobs-background.applied.json exists; its slug is jobs-background; its appliedCapabilities contains the string queue; its allowNoAuthYet is undefined; its notes is undefined",
41
+ "testable": true,
42
+ "scope": "runtime"
43
+ },
44
+ {
45
+ "id": "AC-4301-5",
46
+ "description": "Every probe module under blueprints/jobs-background/contributions/probes/ exports the spec section 3.2 verdict envelope with an anchorAcId matching a contributed AC id on the blueprint (apply-time-refusal.mjs anchorAcId AC-jobs-requiresQueue, apply-time-override.mjs AC-jobs-overrideRecorded, fake-clock-cron.mjs AC-jobs-scheduledRunsOnCron, retry-and-fail.mjs AC-jobs-retryOnHandlerFailure, event-secrecy.mjs AC-jobs-eventSecrecy); every run-<probe-name>.mjs shim exits 0 on a fresh run of the shared sample-app fixture with the T-3 in-memory queue seam active; every per-blueprint report at .rcf/reports/blueprints/jobs-background/<probe-name>.json carries aggregateVerdict pass.",
47
+ "given": "the shared sample-app fixture at packages/rcf-lite/test/fixtures/infra-s3-and-queue/ with the T-3 in-memory queue-driver seam active (SDR-3-a coordinator ruling: wrangler dev is not on this build host and the in-memory realisation of the Cloudflare Queues binding shape is the shipped local seam)",
48
+ "when": "each of the five run-<probe-name>.mjs shims runs against the fixture in sequence",
49
+ "then": "every shim exits 0; every per-blueprint report file carries aggregateVerdict pass; every result carries an anchorAcId matching a contributed AC id on the blueprint",
50
+ "testable": true,
51
+ "scope": "runtime"
52
+ },
53
+ {
54
+ "id": "AC-4301-6",
55
+ "description": "The shared sample-app fixture at packages/rcf-lite/test/fixtures/infra-s3-and-queue/ grows a jobs/ directory carrying two toy job-definition modules (send-welcome-email.mjs with retryPolicy {maxAttempts:3,backoff:exponential} and timeoutMs 60000, refresh-cache.mjs with retryPolicy {maxAttempts:5,backoff:constant} timeoutMs 10000 and cron every-minute), src/jobs-runtime.mjs realising the run-time (reads applied capabilities from the sidecar, registers job handlers with the queue consumer, fires the four lifecycle events per REQ-005), src/scheduler.mjs realising the inProcess scheduler with a fake-clock seam; two induced-failure switches SIMULATE_HANDLER_THROW and SIMULATE_PII_IN_JOB_INPUT are WIRED and driven live by the retry-and-fail.mjs and event-secrecy.mjs probes; the fixture README documents the two toy jobs, the jobs/ convention, the fake-clock switch, the elicited parameters and both induced-failure switches with paired probes.",
56
+ "given": "the shared fixture with the T-3 in-memory queue-driver seam and the T-4 jobs-runtime+scheduler wired on top",
57
+ "when": "each of the two induced-failure switches is set in turn and the paired probe runs",
58
+ "then": "SIMULATE_HANDLER_THROW true yields retry-and-fail report with attempts counter 1,2,3 across three jobStarted events with the same jobId followed by jobFailed with terminal code; SIMULATE_PII_IN_JOB_INPUT true yields event-secrecy report with aggregateVerdict pass proving the event whitelist blocks every PII input field; the fixture README documents each switch and the paired probe module by name",
59
+ "testable": true,
60
+ "scope": "runtime"
61
+ },
62
+ {
63
+ "id": "AC-4301-7",
64
+ "description": "The blueprint ships a README, a CHANGELOG, a guide, and a docs/topics.md entry; the shelf-wide id-band registry table gains a jobs-background row at US band 30101-30899 / ADR-TAC suffix block 31xx across every shipped blueprint's docs/topics.md; packages/rcf-lite/docs/blueprint-authoring.md section 6a capability-declaration table gains one row for backgroundJobs naming the reserved sibling posture per infra round 5 spec section 5.6.",
65
+ "given": "the shelf tree after this blueprint lands",
66
+ "when": "grep queries walk every blueprint's docs/topics.md and the section 6a table",
67
+ "then": "packages/rcf-lite/docs/blueprint-authoring.md contains a table row beginning | backgroundJobs | naming jobs-background and the reserved sibling posture; every shipped blueprint's docs/topics.md carries a row beginning | jobs-background | with the 30101-30899 band and 31xx suffix; blueprints/jobs-background/README.md, CHANGELOG.md, guide/jobs-background.md, docs/topics.md, and the extended packages/rcf-lite/test/fixtures/infra-s3-and-queue/ all exist; the fixture README names the jobs-runtime boot line and the two wired induced-failure switches",
68
+ "testable": true,
69
+ "scope": "runtime"
70
+ }
71
+ ],
72
+ "usId": "US-4301",
73
+ "prdId": "PRD-001",
74
+ "reqId": "REQ-043",
75
+ "version": "0.1.0",
76
+ "status": "draft",
77
+ "title": "The jobs-background blueprint ships on the shelf with five probes wired to the T-3 in-memory queue seam"
78
+ }
@@ -40,8 +40,28 @@
40
40
  # `npm install rcf-lite`.
41
41
 
42
42
  feedVersion: 1
43
- latest: "0.21.0"
43
+ latest: "0.23.0"
44
44
  releases:
45
+ - version: "0.23.0"
46
+ date: "2026-09-07"
47
+ breaking: false
48
+ headlines:
49
+ - "rcf-lite 0.23.0 adds the infrastructure spine four blueprints wide: a Postgres store with a facade contract and forward-only migrations, an S3-shape object store with a Cloudflare R2 first adapter, a Cloudflare Queues producer and consumer with dead-letter semantics, and a background-jobs discipline that refuses to apply until a queue is applied."
50
+ - "Each blueprint verifies against the real engine with node-only probes, and the four surfaces compose through the capability mechanism the round-3 admin console shipped."
51
+ - "Also in this release: the deploy-cloudflare-workers blueprint bumps 1.1.0 to 1.2.0 to bless the Workers-with-static-assets shape as the SPA-on-Workers deploy shape, and a CLI stdout-flush fix so large outputs are not truncated at the pipe buffer."
52
+ minAgentAction: null
53
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
54
+
55
+ - version: "0.22.0"
56
+ date: "2026-09-07"
57
+ breaking: false
58
+ headlines:
59
+ - "rcf-lite 0.22.0 fills the visual shelf with five application blueprints (empty and error states, file upload with a WCAG keyboard gate, a multi-step forms wizard, a self-service account settings area, and a first-run onboarding tour)."
60
+ - "Account settings reuses the admin-console capability-gating mechanism, so the five settings surfaces only render when the applied auth blueprint declares the capability."
61
+ - "The four shipped auth blueprints and the logging blueprint pick up additive capability declarations in the same release."
62
+ minAgentAction: null
63
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
64
+
45
65
  - version: "0.21.0"
46
66
  date: "2026-09-05"
47
67
  breaking: false
@@ -393,7 +393,19 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
393
393
  appliedElicitations,
394
394
  allowNoAuthYet: allowNoAuthYet === true ? true : undefined,
395
395
  notes: allowNoAuthYet === true
396
- ? `no auth yet: applied under --${blueprint.requiresAppliedCapabilities?.allowSkipFlag ?? 'allow-no-auth-yet'}; surfaces gated on ${(blueprint.requiresAppliedCapabilities?.capabilities ?? []).join(', ')} will refuse at runtime until an auth blueprint is applied.`
396
+ ? (function buildOverrideNote() {
397
+ const flag = blueprint.requiresAppliedCapabilities?.allowSkipFlag ?? 'allow-no-auth-yet';
398
+ const caps = (blueprint.requiresAppliedCapabilities?.capabilities ?? []).join(', ');
399
+ // Predecessor-family prose is derived from the flag name so
400
+ // the note reads sensibly for the auth override, the secrets
401
+ // override, and the queue override (infra round 5 T-4)
402
+ // without the runner learning the family list. New families
403
+ // extend by pattern-matching a substring of the flag name.
404
+ const family = flag.includes('secrets')
405
+ ? 'secrets-management'
406
+ : (flag.includes('queue') ? 'queue' : 'auth');
407
+ return `no ${family} yet: applied under --${flag}; surfaces gated on ${caps} will refuse at runtime until a ${family} blueprint is applied.`;
408
+ })()
397
409
  : undefined,
398
410
  });
399
411
  }
@@ -112,10 +112,74 @@ export function buildRefusalMessage({ slug, refusalMessageId, requiredCapabiliti
112
112
  ` rcf define blueprint add ${slug} --${allowSkipFlag}`,
113
113
  ].join('\n');
114
114
  }
115
+ if (refusalMessageId === 'application-account-settings-bare-spa') {
116
+ return [
117
+ `${slug} requires at least one applied security-auth-* blueprint,`,
118
+ `or an operator override with --${allowSkipFlag}.`,
119
+ '',
120
+ 'Applied blueprints on this project:',
121
+ appliedBlock,
122
+ '',
123
+ 'Suggested next steps:',
124
+ ' 1. Apply an auth blueprint first:',
125
+ ' rcf define blueprint add security-auth-magic-link',
126
+ ' (or security-auth-clerk, security-auth-oauth2, security-auth-keycloak)',
127
+ ` 2. Override for a scaffolding pass (surfaces will refuse at apply until an`,
128
+ ` auth blueprint is applied):`,
129
+ ` rcf define blueprint add ${slug} --${allowSkipFlag}`,
130
+ ].join('\n');
131
+ }
132
+ if (refusalMessageId === 'jobs-background-no-queue') {
133
+ // Infra round 5 T-4 (spec 5.4, Baz decision 5). Names the shipped
134
+ // queue provider explicitly (messaging-queue-cloudflare v1.0.0) so
135
+ // an operator hitting the refusal has the shipped answer in hand
136
+ // without a shelf-wide grep. Q3 default per spec section 10: the
137
+ // refusal asserts both exit code AND stable message id.
138
+ return [
139
+ `[jobs-background-no-queue] ${slug} requires an applied blueprint declaring`,
140
+ `at least one of: ${requiredCapabilities.join(', ')}`,
141
+ `or an operator override with --${allowSkipFlag}.`,
142
+ `The shipped provider is messaging-queue-cloudflare (v1.0.0+); a future`,
143
+ `messaging-queue-postgres sibling (Baz decision 7) will provide the same`,
144
+ `capability when demand mints it.`,
145
+ '',
146
+ 'Applied blueprints on this project:',
147
+ appliedBlock,
148
+ '',
149
+ 'Suggested next steps:',
150
+ ' 1. Apply messaging-queue-cloudflare first:',
151
+ ' rcf define blueprint add messaging-queue-cloudflare',
152
+ ` 2. Or override for a scaffolding pass (records a note on the applied`,
153
+ ` sidecar so later validation flags the surface as not-yet-activated):`,
154
+ ` rcf define blueprint add ${slug} --${allowSkipFlag}`,
155
+ ].join('\n');
156
+ }
157
+ if (refusalMessageId === 'object-storage-s3-no-secrets') {
158
+ return [
159
+ `[object-storage-s3-no-secrets] ${slug} requires an applied blueprint declaring`,
160
+ `at least one of: ${requiredCapabilities.join(', ')}.`,
161
+ `The shipped predecessor is security-secrets-management (v1.0.1+); the credential`,
162
+ `pair is a secretRef opaque string, never a value (infra round 5 spec 5.2, Baz`,
163
+ `decision 6).`,
164
+ '',
165
+ 'Applied blueprints on this project:',
166
+ appliedBlock,
167
+ '',
168
+ 'Suggested next steps:',
169
+ ' 1. Apply security-secrets-management first:',
170
+ ' rcf define blueprint add security-secrets-management',
171
+ ` 2. Or override for a scaffolding pass (records a note on source.notes so`,
172
+ ` later validation flags the surface as not-yet-activated):`,
173
+ ` rcf define blueprint add ${slug} --${allowSkipFlag}`,
174
+ ].join('\n');
175
+ }
115
176
  // Generic fallback. Names the required capabilities and applied set;
116
- // the operator has enough to diagnose without a bespoke template.
177
+ // the operator has enough to diagnose without a bespoke template. The
178
+ // refusalMessageId is echoed on the first line as a stable dashboard-
179
+ // friendly tag downstream lint / dashboards can bind to.
180
+ const tag = refusalMessageId ? `[${refusalMessageId}] ` : '';
117
181
  return [
118
- `${slug} requires an applied blueprint declaring at least one of:`,
182
+ `${tag}${slug} requires an applied blueprint declaring at least one of:`,
119
183
  ` ${requiredCapabilities.join(', ')}`,
120
184
  `or an operator override with --${allowSkipFlag}.`,
121
185
  '',
@@ -190,6 +190,18 @@ const OPTION_SPEC = {
190
190
  // repeatable; --answers <file> reads a JSON object mapping elicit
191
191
  // ids to values. Both feed the elicitation phase in applyBlueprint.
192
192
  'allow-no-auth-yet': { type: 'boolean' },
193
+ // Infra round 5 T-2 (spec 5.2, Baz decision 6): object-storage-s3
194
+ // declares allowSkipFlag "allow-no-secrets-yet" so the override for
195
+ // its requiresAppliedCapabilities gate stays semantically aligned
196
+ // with the credential-pair discipline the spec names, rather than
197
+ // reusing the auth-flavoured flag.
198
+ 'allow-no-secrets-yet': { type: 'boolean' },
199
+ // Infra round 5 T-4 (spec 5.4, Baz decision 5): jobs-background
200
+ // declares allowSkipFlag "allow-no-queue-yet" so the override for
201
+ // its requiresAppliedCapabilities gate stays semantically aligned
202
+ // with the queue-capability discipline the spec names, rather than
203
+ // reusing the auth or secrets flavoured flags.
204
+ 'allow-no-queue-yet': { type: 'boolean' },
193
205
  answer: { type: 'string', multiple: true },
194
206
  answers: { type: 'string' },
195
207
  };
@@ -339,7 +351,9 @@ export async function main(argv, deps = {}) {
339
351
  const result = await applyBlueprint({
340
352
  projectRoot, tree, source,
341
353
  namespaceOverride: parsed.values.namespace,
342
- allowNoAuthYet: parsed.values['allow-no-auth-yet'] === true,
354
+ allowNoAuthYet: parsed.values['allow-no-auth-yet'] === true
355
+ || parsed.values['allow-no-secrets-yet'] === true
356
+ || parsed.values['allow-no-queue-yet'] === true,
343
357
  elicitAnswers,
344
358
  customAuthReadLine,
345
359
  // Library-qualified resolves rewire the applied identity under