rcf-lite 0.22.0 → 0.24.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 (591) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/bin/rcf.js +13 -2
  3. package/blueprints/application-account-settings/docs/topics.md +9 -1
  4. package/blueprints/application-admin-console/CHANGELOG.md +12 -0
  5. package/blueprints/application-admin-console/blueprint.json +34 -1
  6. package/blueprints/application-admin-console/contributions/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +25 -0
  7. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-014.json +17 -0
  8. package/blueprints/application-admin-console/contributions/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +32 -0
  9. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21815.json +27 -0
  10. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21816.json +27 -0
  11. package/blueprints/application-admin-console/docs/topics.md +9 -1
  12. package/blueprints/application-admin-console/guide/application-admin-console.md +24 -0
  13. package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +26 -1
  14. package/blueprints/application-api-rest/docs/topics.md +9 -1
  15. package/blueprints/application-charts/docs/topics.md +9 -1
  16. package/blueprints/application-dashboard/docs/topics.md +9 -1
  17. package/blueprints/application-datatable/docs/topics.md +9 -1
  18. package/blueprints/application-empty-error-states/docs/topics.md +9 -1
  19. package/blueprints/application-error-handling/docs/topics.md +9 -1
  20. package/blueprints/application-file-upload/docs/topics.md +9 -1
  21. package/blueprints/application-forms-wizard/docs/topics.md +9 -1
  22. package/blueprints/application-notifications-in-app/docs/topics.md +9 -1
  23. package/blueprints/application-onboarding-tour/docs/topics.md +9 -1
  24. package/blueprints/application-spa/docs/topics.md +10 -2
  25. package/blueprints/delivery-ci-workflows/docs/topics.md +9 -1
  26. package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +69 -0
  27. package/blueprints/deploy-cloudflare-workers/README.md +12 -0
  28. package/blueprints/deploy-cloudflare-workers/blueprint.json +234 -36
  29. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +30 -0
  30. package/blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs +207 -0
  31. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +18 -0
  32. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +18 -0
  33. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +36 -0
  34. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +27 -0
  35. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +27 -0
  36. package/blueprints/deploy-cloudflare-workers/docs/topics.md +10 -2
  37. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +25 -0
  38. package/blueprints/edge-cloudflare-access/CHANGELOG.md +23 -0
  39. package/blueprints/edge-cloudflare-access/README.md +141 -0
  40. package/blueprints/edge-cloudflare-access/blueprint.json +197 -0
  41. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3501-edge-cloudflare-access-jwt-gate.json +14 -0
  42. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3502-edge-cloudflare-access-identity-provider.json +25 -0
  43. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3503-edge-cloudflare-access-policy-scope.json +12 -0
  44. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3504-edge-cloudflare-access-audit-retention.json +12 -0
  45. package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +100 -0
  46. package/blueprints/edge-cloudflare-access/contributions/probes/audit-event-secrecy.mjs +70 -0
  47. package/blueprints/edge-cloudflare-access/contributions/probes/jwt-validator-fixture.mjs +63 -0
  48. package/blueprints/edge-cloudflare-access/contributions/probes/jwt-validator-reject.mjs +95 -0
  49. package/blueprints/edge-cloudflare-access/contributions/probes/probe-utils.mjs +90 -0
  50. package/blueprints/edge-cloudflare-access/contributions/probes/real-account-gated-url.mjs +65 -0
  51. package/blueprints/edge-cloudflare-access/contributions/probes/run-admin-console-gate-surface.mjs +5 -0
  52. package/blueprints/edge-cloudflare-access/contributions/probes/run-audit-event-secrecy.mjs +5 -0
  53. package/blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-fixture.mjs +5 -0
  54. package/blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-reject.mjs +5 -0
  55. package/blueprints/edge-cloudflare-access/contributions/probes/run-real-account-gated-url.mjs +5 -0
  56. package/blueprints/edge-cloudflare-access/contributions/probes/run-wrangler-seam.mjs +5 -0
  57. package/blueprints/edge-cloudflare-access/contributions/probes/wrangler-seam.mjs +203 -0
  58. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-001.json +17 -0
  59. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-002.json +17 -0
  60. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-003.json +17 -0
  61. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-004.json +17 -0
  62. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-005.json +17 -0
  63. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-006.json +18 -0
  64. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3501-edge-cloudflare-access-jwt-validator.json +31 -0
  65. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3502-edge-cloudflare-access-application-declaration.json +33 -0
  66. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3503-edge-cloudflare-access-policy-shape.json +25 -0
  67. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3504-edge-cloudflare-access-audit-sink.json +25 -0
  68. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34101.json +27 -0
  69. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34102.json +28 -0
  70. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34103.json +27 -0
  71. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34104.json +27 -0
  72. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34105.json +27 -0
  73. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34106.json +27 -0
  74. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34107.json +27 -0
  75. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34108.json +27 -0
  76. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34109.json +27 -0
  77. package/blueprints/edge-cloudflare-access/docs/topics.md +68 -0
  78. package/blueprints/edge-cloudflare-access/guide/edge-cloudflare-access.md +180 -0
  79. package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +10 -0
  80. package/blueprints/edge-cloudflare-rate-limiting/README.md +73 -0
  81. package/blueprints/edge-cloudflare-rate-limiting/blueprint.json +174 -0
  82. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3701-edge-cloudflare-rate-limiting-throttle-contract.json +14 -0
  83. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3702-edge-cloudflare-rate-limiting-layering.json +14 -0
  84. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3703-edge-cloudflare-rate-limiting-manifest-shape.json +14 -0
  85. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3704-edge-cloudflare-rate-limiting-drift-audit-cadence.json +14 -0
  86. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/event-secrecy.mjs +104 -0
  87. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/manifest-presence.mjs +95 -0
  88. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/manifest-schema-validate.mjs +130 -0
  89. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/probe-utils.mjs +111 -0
  90. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/real-account-burst-and-429.mjs +104 -0
  91. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-event-secrecy.mjs +5 -0
  92. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-manifest-presence.mjs +5 -0
  93. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-manifest-schema-validate.mjs +5 -0
  94. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-real-account-burst-and-429.mjs +5 -0
  95. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-001.json +17 -0
  96. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-002.json +17 -0
  97. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-003.json +17 -0
  98. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-004.json +17 -0
  99. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-005.json +17 -0
  100. package/blueprints/edge-cloudflare-rate-limiting/contributions/schemas/rate-limit-rule.schema.json +67 -0
  101. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +31 -0
  102. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3702-edge-cloudflare-rate-limiting-management-surface-doc.json +25 -0
  103. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +26 -0
  104. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36101.json +27 -0
  105. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36102.json +27 -0
  106. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36103.json +27 -0
  107. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36104.json +27 -0
  108. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36105.json +27 -0
  109. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36106.json +27 -0
  110. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36107.json +27 -0
  111. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36108.json +27 -0
  112. package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +68 -0
  113. package/blueprints/edge-cloudflare-rate-limiting/guide/edge-cloudflare-rate-limiting.md +88 -0
  114. package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +20 -0
  115. package/blueprints/edge-cloudflare-turnstile/README.md +95 -0
  116. package/blueprints/edge-cloudflare-turnstile/blueprint.json +161 -0
  117. package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3601-edge-cloudflare-turnstile-verifier-contract.json +14 -0
  118. package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3602-edge-cloudflare-turnstile-widget-mode.json +14 -0
  119. package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3603-edge-cloudflare-turnstile-refuse-shape.json +14 -0
  120. package/blueprints/edge-cloudflare-turnstile/contributions/probes/event-secrecy.mjs +51 -0
  121. package/blueprints/edge-cloudflare-turnstile/contributions/probes/guard-shape-scan.mjs +48 -0
  122. package/blueprints/edge-cloudflare-turnstile/contributions/probes/probe-utils.mjs +139 -0
  123. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-event-secrecy.mjs +5 -0
  124. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-guard-shape-scan.mjs +5 -0
  125. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-secret-shape-scan.mjs +5 -0
  126. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-siteverify-fixture.mjs +5 -0
  127. package/blueprints/edge-cloudflare-turnstile/contributions/probes/secret-shape-scan.mjs +77 -0
  128. package/blueprints/edge-cloudflare-turnstile/contributions/probes/siteverify-fixture.mjs +53 -0
  129. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-001.json +17 -0
  130. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-002.json +17 -0
  131. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-003.json +17 -0
  132. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-004.json +17 -0
  133. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-005.json +17 -0
  134. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +26 -0
  135. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +36 -0
  136. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3603-edge-cloudflare-turnstile-magic-link-hook.json +25 -0
  137. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35101.json +27 -0
  138. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35102.json +27 -0
  139. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35103.json +27 -0
  140. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35104.json +27 -0
  141. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35105.json +36 -0
  142. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35106.json +27 -0
  143. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35107.json +27 -0
  144. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35108.json +27 -0
  145. package/blueprints/edge-cloudflare-turnstile/docs/topics.md +68 -0
  146. package/blueprints/edge-cloudflare-turnstile/guide/edge-cloudflare-turnstile.md +104 -0
  147. package/blueprints/edge-cloudflare-turnstile/probe-packs/edge-cloudflare-turnstile.pack.mjs +146 -0
  148. package/blueprints/email-smtp-resend/docs/topics.md +9 -1
  149. package/blueprints/jobs-background/CHANGELOG.md +16 -0
  150. package/blueprints/jobs-background/README.md +105 -0
  151. package/blueprints/jobs-background/blueprint.json +149 -0
  152. package/blueprints/jobs-background/contributions/adrs/adr-3101-jobs-background-model.json +27 -0
  153. package/blueprints/jobs-background/contributions/adrs/adr-3102-jobs-background-scheduler-mode.json +25 -0
  154. package/blueprints/jobs-background/contributions/adrs/adr-3103-jobs-background-requires-applied-capabilities.json +25 -0
  155. package/blueprints/jobs-background/contributions/adrs/adr-3104-jobs-background-timeout-floor.json +25 -0
  156. package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +95 -0
  157. package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +82 -0
  158. package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +69 -0
  159. package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +65 -0
  160. package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +91 -0
  161. package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +65 -0
  162. package/blueprints/jobs-background/contributions/probes/run-apply-time-override.mjs +10 -0
  163. package/blueprints/jobs-background/contributions/probes/run-apply-time-refusal.mjs +11 -0
  164. package/blueprints/jobs-background/contributions/probes/run-event-secrecy.mjs +11 -0
  165. package/blueprints/jobs-background/contributions/probes/run-fake-clock-cron.mjs +11 -0
  166. package/blueprints/jobs-background/contributions/probes/run-retry-and-fail.mjs +11 -0
  167. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-001.json +18 -0
  168. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +18 -0
  169. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +18 -0
  170. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +18 -0
  171. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +18 -0
  172. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +18 -0
  173. package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +50 -0
  174. package/blueprints/jobs-background/contributions/tacs/tac-3102-jobs-background-scheduler.json +50 -0
  175. package/blueprints/jobs-background/contributions/tacs/tac-3103-jobs-background-run-log.json +49 -0
  176. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +25 -0
  177. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +25 -0
  178. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +25 -0
  179. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +25 -0
  180. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +25 -0
  181. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +25 -0
  182. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +25 -0
  183. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +25 -0
  184. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +25 -0
  185. package/blueprints/jobs-background/docs/topics.md +68 -0
  186. package/blueprints/jobs-background/guide/jobs-background.md +147 -0
  187. package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +15 -0
  188. package/blueprints/messaging-queue-cloudflare/README.md +125 -0
  189. package/blueprints/messaging-queue-cloudflare/blueprint.json +67 -0
  190. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +30 -0
  191. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +25 -0
  192. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3003-messaging-queue-cloudflare-max-attempts-floor.json +25 -0
  193. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3004-messaging-queue-cloudflare-batch-defaults.json +25 -0
  194. package/blueprints/messaging-queue-cloudflare/contributions/probes/event-secrecy.mjs +137 -0
  195. package/blueprints/messaging-queue-cloudflare/contributions/probes/probe-utils.mjs +82 -0
  196. package/blueprints/messaging-queue-cloudflare/contributions/probes/producer-facade-ready.mjs +35 -0
  197. package/blueprints/messaging-queue-cloudflare/contributions/probes/publish-to-delivery.mjs +94 -0
  198. package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +54 -0
  199. package/blueprints/messaging-queue-cloudflare/contributions/probes/retry-and-dlq.mjs +87 -0
  200. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-event-secrecy.mjs +5 -0
  201. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-producer-facade-ready.mjs +11 -0
  202. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-publish-to-delivery.mjs +5 -0
  203. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-real-account-concurrency-smoke.mjs +5 -0
  204. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-retry-and-dlq.mjs +5 -0
  205. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +18 -0
  206. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +18 -0
  207. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +18 -0
  208. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +18 -0
  209. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +18 -0
  210. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +18 -0
  211. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3001-messaging-queue-cloudflare-producer-facade.json +56 -0
  212. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3002-messaging-queue-cloudflare-consumer-registration.json +40 -0
  213. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3003-messaging-queue-cloudflare-event-sink.json +39 -0
  214. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +34 -0
  215. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +34 -0
  216. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +25 -0
  217. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +25 -0
  218. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +25 -0
  219. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +25 -0
  220. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +25 -0
  221. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +25 -0
  222. package/blueprints/messaging-queue-cloudflare/docs/topics.md +68 -0
  223. package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +110 -0
  224. package/blueprints/object-storage-s3/docs/topics.md +9 -1
  225. package/blueprints/observability-essentials/docs/topics.md +9 -1
  226. package/blueprints/observability-logging/docs/topics.md +9 -1
  227. package/blueprints/observability-probe-endpoints/docs/topics.md +9 -1
  228. package/blueprints/persistence-data-d1/docs/topics.md +9 -1
  229. package/blueprints/persistence-data-postgres/docs/topics.md +9 -1
  230. package/blueprints/persistence-data-sqlite/docs/topics.md +9 -1
  231. package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +22 -0
  232. package/blueprints/platform-cloudflare-cron-triggers/README.md +117 -0
  233. package/blueprints/platform-cloudflare-cron-triggers/blueprint.json +85 -0
  234. package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3301-platform-cloudflare-cron-triggers-scheduled-trigger-contract.json +14 -0
  235. package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3302-platform-cloudflare-cron-triggers-dispatcher-mode.json +14 -0
  236. package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3303-platform-cloudflare-cron-triggers-skew-tolerance-default.json +14 -0
  237. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/dispatcher-routing.mjs +64 -0
  238. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/event-secrecy.mjs +100 -0
  239. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/probe-utils.mjs +70 -0
  240. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/real-account-scheduled-smoke.mjs +100 -0
  241. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-dispatcher-routing.mjs +5 -0
  242. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-event-secrecy.mjs +5 -0
  243. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-real-account-scheduled-smoke.mjs +5 -0
  244. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-skew-tolerance.mjs +5 -0
  245. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-wrangler-test-scheduled.mjs +5 -0
  246. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/skew-tolerance.mjs +130 -0
  247. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/wrangler-test-scheduled.mjs +129 -0
  248. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-001.json +17 -0
  249. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-002.json +17 -0
  250. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-003.json +17 -0
  251. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-004.json +17 -0
  252. package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3301-platform-cloudflare-cron-triggers-scheduled-handler.json +22 -0
  253. package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3302-platform-cloudflare-cron-triggers-expression-router.json +22 -0
  254. package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3303-platform-cloudflare-cron-triggers-event-sink.json +21 -0
  255. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32101.json +25 -0
  256. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32102.json +34 -0
  257. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32103.json +34 -0
  258. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32104.json +34 -0
  259. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32105.json +25 -0
  260. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32106.json +25 -0
  261. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32107.json +25 -0
  262. package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +71 -0
  263. package/blueprints/platform-cloudflare-cron-triggers/guide/platform-cloudflare-cron-triggers.md +119 -0
  264. package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +23 -0
  265. package/blueprints/platform-cloudflare-durable-objects/README.md +200 -0
  266. package/blueprints/platform-cloudflare-durable-objects/blueprint.json +243 -0
  267. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3401-platform-cloudflare-durable-objects-single-cell-contract.json +14 -0
  268. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3402-platform-cloudflare-durable-objects-websocket-hub-contract.json +14 -0
  269. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3403-platform-cloudflare-durable-objects-storage-backend.json +14 -0
  270. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3404-platform-cloudflare-durable-objects-migrations-shape.json +14 -0
  271. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3405-platform-cloudflare-durable-objects-hibernation-posture.json +14 -0
  272. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/alarm-fires-once.mjs +63 -0
  273. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/namespace-facade-ready.mjs +60 -0
  274. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/probe-utils.mjs +105 -0
  275. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs +58 -0
  276. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-alarm-fires-once.mjs +5 -0
  277. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-namespace-facade-ready.mjs +5 -0
  278. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-real-account-storage-smoke.mjs +5 -0
  279. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-single-cell-concurrent-increment.mjs +5 -0
  280. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-sole-reader-scan.mjs +5 -0
  281. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-storage-round-trip.mjs +5 -0
  282. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-websocket-hub-broadcast.mjs +5 -0
  283. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-wrangler-seam.mjs +5 -0
  284. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/single-cell-concurrent-increment.mjs +56 -0
  285. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/sole-reader-scan.mjs +117 -0
  286. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/storage-round-trip.mjs +87 -0
  287. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/websocket-hub-broadcast.mjs +112 -0
  288. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/wrangler-seam.mjs +257 -0
  289. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-001.json +17 -0
  290. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-002.json +17 -0
  291. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-003.json +17 -0
  292. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-004.json +17 -0
  293. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-005.json +17 -0
  294. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-006.json +17 -0
  295. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-007.json +17 -0
  296. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-008.json +17 -0
  297. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3401-platform-cloudflare-durable-objects-namespace-facade.json +31 -0
  298. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3402-platform-cloudflare-durable-objects-single-cell-shape.json +30 -0
  299. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3403-platform-cloudflare-durable-objects-alarm-handler.json +29 -0
  300. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3404-platform-cloudflare-durable-objects-websocket-hub.json +31 -0
  301. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3405-platform-cloudflare-durable-objects-event-sink.json +24 -0
  302. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33101.json +27 -0
  303. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33102.json +27 -0
  304. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33103.json +27 -0
  305. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33104.json +27 -0
  306. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33105.json +27 -0
  307. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33106.json +27 -0
  308. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33107.json +27 -0
  309. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33108.json +27 -0
  310. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33109.json +27 -0
  311. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33110.json +27 -0
  312. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33111.json +27 -0
  313. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33112.json +27 -0
  314. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33113.json +25 -0
  315. package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +73 -0
  316. package/blueprints/platform-cloudflare-durable-objects/guide/platform-cloudflare-durable-objects.md +237 -0
  317. package/blueprints/platform-cloudflare-kv/CHANGELOG.md +21 -0
  318. package/blueprints/platform-cloudflare-kv/README.md +159 -0
  319. package/blueprints/platform-cloudflare-kv/blueprint.json +87 -0
  320. package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3201-platform-cloudflare-kv-key-value-store-contract.json +14 -0
  321. package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3202-platform-cloudflare-kv-default-cache-ttl.json +14 -0
  322. package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3203-platform-cloudflare-kv-key-naming-convention.json +14 -0
  323. package/blueprints/platform-cloudflare-kv/contributions/probes/cache-aside-hit-then-miss.mjs +82 -0
  324. package/blueprints/platform-cloudflare-kv/contributions/probes/event-secrecy.mjs +102 -0
  325. package/blueprints/platform-cloudflare-kv/contributions/probes/facade-round-trip.mjs +92 -0
  326. package/blueprints/platform-cloudflare-kv/contributions/probes/list-with-prefix.mjs +52 -0
  327. package/blueprints/platform-cloudflare-kv/contributions/probes/probe-utils.mjs +73 -0
  328. package/blueprints/platform-cloudflare-kv/contributions/probes/real-account-eventual-consistency-smoke.mjs +102 -0
  329. package/blueprints/platform-cloudflare-kv/contributions/probes/run-cache-aside-hit-then-miss.mjs +5 -0
  330. package/blueprints/platform-cloudflare-kv/contributions/probes/run-event-secrecy.mjs +5 -0
  331. package/blueprints/platform-cloudflare-kv/contributions/probes/run-facade-round-trip.mjs +5 -0
  332. package/blueprints/platform-cloudflare-kv/contributions/probes/run-list-with-prefix.mjs +5 -0
  333. package/blueprints/platform-cloudflare-kv/contributions/probes/run-real-account-eventual-consistency-smoke.mjs +5 -0
  334. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-001.json +18 -0
  335. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-002.json +18 -0
  336. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-003.json +18 -0
  337. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-004.json +18 -0
  338. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-005.json +18 -0
  339. package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3201-platform-cloudflare-kv-facade.json +27 -0
  340. package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3202-platform-cloudflare-kv-cache-aside.json +26 -0
  341. package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3203-platform-cloudflare-kv-event-sink.json +25 -0
  342. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31101.json +27 -0
  343. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31102.json +27 -0
  344. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31103.json +36 -0
  345. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31104.json +27 -0
  346. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31105.json +27 -0
  347. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31106.json +27 -0
  348. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31107.json +27 -0
  349. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31108.json +27 -0
  350. package/blueprints/platform-cloudflare-kv/docs/topics.md +71 -0
  351. package/blueprints/platform-cloudflare-kv/guide/platform-cloudflare-kv.md +138 -0
  352. package/blueprints/security-auth-clerk/docs/topics.md +9 -1
  353. package/blueprints/security-auth-keycloak/docs/topics.md +9 -1
  354. package/blueprints/security-auth-magic-link/docs/topics.md +9 -1
  355. package/blueprints/security-auth-oauth2/docs/topics.md +9 -1
  356. package/blueprints/security-secrets-management/docs/topics.md +9 -1
  357. package/fixtures/canary-manifest.json +6 -6
  358. package/package.json +1 -1
  359. package/rcf/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +13 -0
  360. package/rcf/adrs/adr-3501-edge-cloudflare-access-jwt-gate.json +13 -0
  361. package/rcf/adrs/adr-3502-edge-cloudflare-access-identity-provider.json +13 -0
  362. package/rcf/adrs/adr-3503-edge-cloudflare-access-policy-scope.json +13 -0
  363. package/rcf/adrs/adr-3504-edge-cloudflare-access-audit-retention.json +13 -0
  364. package/rcf/adrs/adr-3601-edge-cloudflare-turnstile-verifier-contract.json +13 -0
  365. package/rcf/adrs/adr-3602-edge-cloudflare-turnstile-widget-mode.json +13 -0
  366. package/rcf/adrs/adr-3603-edge-cloudflare-turnstile-refuse-shape.json +13 -0
  367. package/rcf/adrs/adr-3701-edge-cloudflare-rate-limiting-throttle-contract.json +13 -0
  368. package/rcf/adrs/adr-3702-edge-cloudflare-rate-limiting-layering.json +13 -0
  369. package/rcf/adrs/adr-3703-edge-cloudflare-rate-limiting-manifest-shape.json +13 -0
  370. package/rcf/adrs/adr-3704-edge-cloudflare-rate-limiting-drift-audit-cadence.json +13 -0
  371. package/rcf/code-nodes/cn-206.json +14 -0
  372. package/rcf/code-nodes/cn-207.json +13 -0
  373. package/rcf/code-nodes/cn-208.json +14 -0
  374. package/rcf/code-nodes/cn-209.json +14 -0
  375. package/rcf/code-nodes/cn-210.json +13 -0
  376. package/rcf/code-nodes/cn-211.json +12 -0
  377. package/rcf/code-nodes/cn-212.json +12 -0
  378. package/rcf/code-nodes/cn-213.json +12 -0
  379. package/rcf/code-nodes/cn-214.json +15 -0
  380. package/rcf/code-nodes/cn-215.json +13 -0
  381. package/rcf/code-nodes/cn-216.json +14 -0
  382. package/rcf/code-nodes/cn-217.json +13 -0
  383. package/rcf/code-nodes/cn-230.json +13 -0
  384. package/rcf/code-nodes/cn-231.json +14 -0
  385. package/rcf/code-nodes/cn-232.json +13 -0
  386. package/rcf/code-nodes/cn-233.json +14 -0
  387. package/rcf/code-nodes/cn-234.json +13 -0
  388. package/rcf/code-nodes/cn-260.json +21 -0
  389. package/rcf/code-nodes/cn-261.json +14 -0
  390. package/rcf/code-nodes/cn-262.json +18 -0
  391. package/rcf/code-nodes/cn-263.json +12 -0
  392. package/rcf/code-nodes/cn-264.json +13 -0
  393. package/rcf/code-nodes/cn-265.json +15 -0
  394. package/rcf/code-nodes/cn-266.json +12 -0
  395. package/rcf/code-nodes/cn-267.json +12 -0
  396. package/rcf/code-nodes/cn-290.json +21 -0
  397. package/rcf/code-nodes/cn-291.json +12 -0
  398. package/rcf/code-nodes/cn-292.json +13 -0
  399. package/rcf/code-nodes/cn-293.json +13 -0
  400. package/rcf/code-nodes/cn-294.json +13 -0
  401. package/rcf/code-nodes/cn-295.json +12 -0
  402. package/rcf/code-nodes/cn-296.json +12 -0
  403. package/rcf/code-nodes/cn-297.json +12 -0
  404. package/rcf/code-nodes/cn-298.json +12 -0
  405. package/rcf/code-nodes/cn-299.json +12 -0
  406. package/rcf/code-nodes/cn-300.json +12 -0
  407. package/rcf/code-nodes/cn-301.json +14 -0
  408. package/rcf/code-nodes/cn-302.json +12 -0
  409. package/rcf/code-nodes/cn-303.json +12 -0
  410. package/rcf/code-nodes/cn-304.json +21 -0
  411. package/rcf/code-nodes/cn-320.json +20 -0
  412. package/rcf/code-nodes/cn-321.json +14 -0
  413. package/rcf/code-nodes/cn-350.json +19 -0
  414. package/rcf/code-nodes/cn-380.json +19 -0
  415. package/rcf/fbs/fbs-062.json +20 -0
  416. package/rcf/fbs/fbs-063.json +22 -0
  417. package/rcf/fbs/fbs-064.json +23 -0
  418. package/rcf/fbs/fbs-070.json +24 -0
  419. package/rcf/fbs/fbs-080.json +24 -0
  420. package/rcf/fbs/fbs-090.json +24 -0
  421. package/rcf/fbs/fbs-100.json +23 -0
  422. package/rcf/fbs/fbs-101.json +16 -0
  423. package/rcf/fbs/fbs-110.json +23 -0
  424. package/rcf/fbs/fbs-120.json +22 -0
  425. package/rcf/requirements/req-029.json +57 -0
  426. package/rcf/requirements/req-030.json +67 -0
  427. package/rcf/requirements/req-042.json +59 -0
  428. package/rcf/requirements/req-043.json +39 -0
  429. package/rcf/requirements/req-050.json +18 -0
  430. package/rcf/requirements/req-051.json +18 -0
  431. package/rcf/requirements/req-052.json +18 -0
  432. package/rcf/requirements/req-053.json +18 -0
  433. package/rcf/requirements/req-054.json +18 -0
  434. package/rcf/requirements/req-060.json +20 -0
  435. package/rcf/requirements/req-061.json +18 -0
  436. package/rcf/requirements/req-062.json +20 -0
  437. package/rcf/requirements/req-063.json +20 -0
  438. package/rcf/requirements/req-070.json +18 -0
  439. package/rcf/requirements/req-071.json +18 -0
  440. package/rcf/requirements/req-072.json +18 -0
  441. package/rcf/requirements/req-073.json +18 -0
  442. package/rcf/requirements/req-074.json +18 -0
  443. package/rcf/requirements/req-075.json +18 -0
  444. package/rcf/requirements/req-076.json +18 -0
  445. package/rcf/requirements/req-077.json +18 -0
  446. package/rcf/requirements/req-080.json +18 -0
  447. package/rcf/requirements/req-081.json +18 -0
  448. package/rcf/requirements/req-082.json +18 -0
  449. package/rcf/requirements/req-083.json +18 -0
  450. package/rcf/requirements/req-084.json +18 -0
  451. package/rcf/requirements/req-085.json +18 -0
  452. package/rcf/requirements/req-086.json +18 -0
  453. package/rcf/requirements/req-090.json +44 -0
  454. package/rcf/requirements/req-091.json +53 -0
  455. package/rcf/requirements/req-092.json +32 -0
  456. package/rcf/requirements/req-093.json +52 -0
  457. package/rcf/requirements/req-094.json +32 -0
  458. package/rcf/requirements/req-100.json +13 -0
  459. package/rcf/requirements/req-101.json +13 -0
  460. package/rcf/requirements/req-102.json +13 -0
  461. package/rcf/requirements/req-103.json +13 -0
  462. package/rcf/requirements/req-104.json +13 -0
  463. package/rcf/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +15 -0
  464. package/rcf/tacs/tac-3501-edge-cloudflare-access-jwt-validator.json +15 -0
  465. package/rcf/tacs/tac-3502-edge-cloudflare-access-application-declaration.json +15 -0
  466. package/rcf/tacs/tac-3503-edge-cloudflare-access-policy-shape.json +15 -0
  467. package/rcf/tacs/tac-3504-edge-cloudflare-access-audit-sink.json +15 -0
  468. package/rcf/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +15 -0
  469. package/rcf/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +15 -0
  470. package/rcf/tacs/tac-3603-edge-cloudflare-turnstile-magic-link-hook.json +15 -0
  471. package/rcf/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +16 -0
  472. package/rcf/tacs/tac-3702-edge-cloudflare-rate-limiting-management-surface-doc.json +15 -0
  473. package/rcf/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +16 -0
  474. package/rcf/test-suites/ts-052.json +58 -8
  475. package/rcf/test-suites/ts-072.json +62 -0
  476. package/rcf/test-suites/ts-073.json +38 -0
  477. package/rcf/test-suites/ts-074.json +30 -0
  478. package/rcf/test-suites/ts-075.json +38 -0
  479. package/rcf/test-suites/ts-076.json +70 -0
  480. package/rcf/test-suites/ts-080.json +22 -0
  481. package/rcf/test-suites/ts-081.json +22 -0
  482. package/rcf/test-suites/ts-082.json +30 -0
  483. package/rcf/test-suites/ts-083.json +22 -0
  484. package/rcf/test-suites/ts-084.json +30 -0
  485. package/rcf/test-suites/ts-085.json +22 -0
  486. package/rcf/test-suites/ts-086.json +22 -0
  487. package/rcf/test-suites/ts-087.json +22 -0
  488. package/rcf/test-suites/ts-090.json +22 -0
  489. package/rcf/test-suites/ts-091.json +22 -0
  490. package/rcf/test-suites/ts-092.json +22 -0
  491. package/rcf/test-suites/ts-093.json +30 -0
  492. package/rcf/test-suites/ts-094.json +30 -0
  493. package/rcf/test-suites/ts-095.json +30 -0
  494. package/rcf/test-suites/ts-096.json +22 -0
  495. package/rcf/test-suites/ts-100.json +22 -0
  496. package/rcf/test-suites/ts-101.json +22 -0
  497. package/rcf/test-suites/ts-102.json +22 -0
  498. package/rcf/test-suites/ts-103.json +22 -0
  499. package/rcf/test-suites/ts-104.json +22 -0
  500. package/rcf/test-suites/ts-105.json +22 -0
  501. package/rcf/test-suites/ts-106.json +22 -0
  502. package/rcf/test-suites/ts-107.json +22 -0
  503. package/rcf/test-suites/ts-108.json +22 -0
  504. package/rcf/test-suites/ts-109.json +22 -0
  505. package/rcf/test-suites/ts-110.json +22 -0
  506. package/rcf/test-suites/ts-111.json +22 -0
  507. package/rcf/test-suites/ts-112.json +22 -0
  508. package/rcf/test-suites/ts-113.json +22 -0
  509. package/rcf/test-suites/ts-114.json +22 -0
  510. package/rcf/test-suites/ts-115.json +22 -0
  511. package/rcf/test-suites/ts-116.json +22 -0
  512. package/rcf/test-suites/ts-117.json +22 -0
  513. package/rcf/test-suites/ts-118.json +22 -0
  514. package/rcf/test-suites/ts-119.json +30 -0
  515. package/rcf/test-suites/ts-120.json +22 -0
  516. package/rcf/test-suites/ts-121.json +22 -0
  517. package/rcf/test-suites/ts-122.json +22 -0
  518. package/rcf/test-suites/ts-123.json +22 -0
  519. package/rcf/test-suites/ts-124.json +22 -0
  520. package/rcf/test-suites/ts-125.json +22 -0
  521. package/rcf/test-suites/ts-126.json +22 -0
  522. package/rcf/test-suites/ts-127.json +22 -0
  523. package/rcf/test-suites/ts-130.json +22 -0
  524. package/rcf/test-suites/ts-131.json +22 -0
  525. package/rcf/test-suites/ts-132.json +22 -0
  526. package/rcf/test-suites/ts-133.json +22 -0
  527. package/rcf/test-suites/ts-134.json +22 -0
  528. package/rcf/test-suites/ts-135.json +22 -0
  529. package/rcf/test-suites/ts-136.json +22 -0
  530. package/rcf/test-suites/ts-137.json +22 -0
  531. package/rcf/user-stories/us-10001.json +23 -0
  532. package/rcf/user-stories/us-10101.json +23 -0
  533. package/rcf/user-stories/us-10201.json +23 -0
  534. package/rcf/user-stories/us-10301.json +23 -0
  535. package/rcf/user-stories/us-10401.json +23 -0
  536. package/rcf/user-stories/us-10601.json +23 -0
  537. package/rcf/user-stories/us-10701.json +23 -0
  538. package/rcf/user-stories/us-10801.json +23 -0
  539. package/rcf/user-stories/us-2901.json +45 -0
  540. package/rcf/user-stories/us-2902.json +36 -0
  541. package/rcf/user-stories/us-3001.json +45 -0
  542. package/rcf/user-stories/us-4201.json +69 -0
  543. package/rcf/user-stories/us-4301.json +78 -0
  544. package/rcf/user-stories/us-5001.json +27 -0
  545. package/rcf/user-stories/us-5002.json +27 -0
  546. package/rcf/user-stories/us-5101.json +36 -0
  547. package/rcf/user-stories/us-5102.json +27 -0
  548. package/rcf/user-stories/us-5201.json +36 -0
  549. package/rcf/user-stories/us-5301.json +27 -0
  550. package/rcf/user-stories/us-5302.json +27 -0
  551. package/rcf/user-stories/us-5401.json +27 -0
  552. package/rcf/user-stories/us-6001.json +27 -0
  553. package/rcf/user-stories/us-6002.json +27 -0
  554. package/rcf/user-stories/us-6003.json +27 -0
  555. package/rcf/user-stories/us-6101.json +36 -0
  556. package/rcf/user-stories/us-6201.json +36 -0
  557. package/rcf/user-stories/us-6301.json +36 -0
  558. package/rcf/user-stories/us-6302.json +27 -0
  559. package/rcf/user-stories/us-7001.json +27 -0
  560. package/rcf/user-stories/us-7002.json +27 -0
  561. package/rcf/user-stories/us-7101.json +27 -0
  562. package/rcf/user-stories/us-7201.json +27 -0
  563. package/rcf/user-stories/us-7301.json +27 -0
  564. package/rcf/user-stories/us-7401.json +27 -0
  565. package/rcf/user-stories/us-7402.json +27 -0
  566. package/rcf/user-stories/us-7501.json +27 -0
  567. package/rcf/user-stories/us-7601.json +27 -0
  568. package/rcf/user-stories/us-7701.json +27 -0
  569. package/rcf/user-stories/us-8001.json +24 -0
  570. package/rcf/user-stories/us-8002.json +24 -0
  571. package/rcf/user-stories/us-8003.json +24 -0
  572. package/rcf/user-stories/us-8101.json +24 -0
  573. package/rcf/user-stories/us-8201.json +24 -0
  574. package/rcf/user-stories/us-8301.json +24 -0
  575. package/rcf/user-stories/us-8401.json +24 -0
  576. package/rcf/user-stories/us-8501.json +24 -0
  577. package/rcf/user-stories/us-8502.json +24 -0
  578. package/rcf/user-stories/us-8601.json +24 -0
  579. package/rcf/user-stories/us-8602.json +24 -0
  580. package/rcf/user-stories/us-9001.json +27 -0
  581. package/rcf/user-stories/us-9002.json +27 -0
  582. package/rcf/user-stories/us-9101.json +27 -0
  583. package/rcf/user-stories/us-9102.json +27 -0
  584. package/rcf/user-stories/us-9201.json +27 -0
  585. package/rcf/user-stories/us-9301.json +27 -0
  586. package/rcf/user-stories/us-9302.json +27 -0
  587. package/rcf/user-stories/us-9401.json +27 -0
  588. package/releases/releases.yaml +21 -1
  589. package/src/blueprint/apply.js +7 -4
  590. package/src/blueprint/capabilities.js +25 -0
  591. package/src/cli/blueprint.js +8 -1
@@ -0,0 +1,119 @@
1
+ # platform-cloudflare-cron-triggers guide
2
+
3
+ ## When to reach for this blueprint
4
+
5
+ You reach for `platform-cloudflare-cron-triggers` when your Worker
6
+ needs to run scheduled work on a recurring cadence, the workload
7
+ is stateless per fire, and you are already on Cloudflare Workers.
8
+ The blueprint ships the scheduled() handler wiring, an
9
+ expression-routed dispatcher, a skew-tolerance classifier and a
10
+ soft-budget observer. Every fire emits a metadata-only lifecycle
11
+ event a logging companion renders directly.
12
+
13
+ If your scheduled work is stateful across fires (a workflow that
14
+ retries partial progress, a long-running fan-out with state per
15
+ step), reach for the follow-up Workflows adapter on
16
+ `jobs-background` v1.1.0 instead (round-6 minor bump, per spec
17
+ section 5.7). If your scheduled work is a background job produced
18
+ by a request handler (a queue push that runs later, not on a fixed
19
+ cadence), reach for `jobs-background` v1.0.0 directly.
20
+
21
+ ## Decision tree
22
+
23
+ - Recurring cadence, stateless per fire, Cloudflare Workers ->
24
+ this blueprint (Cron Triggers).
25
+ - Background job produced by a request, retried and observed ->
26
+ `jobs-background` v1.0.0 over `messaging-queue-cloudflare`.
27
+ - Durable workflow with state across steps, retried per step ->
28
+ follow-up Workflows adapter on `jobs-background` v1.1.0 (round-6
29
+ minor bump).
30
+ - Not on Cloudflare Workers -> reach for a platform-native
31
+ cron adapter when one ships; the shelf has no non-Cloudflare
32
+ cron blueprint today.
33
+
34
+ ## The apply-time answers
35
+
36
+ Answer four elicits at `rcf define blueprint add` time:
37
+
38
+ - `cron-expressions`: your cron cadences as a comma-separated
39
+ list. Standard POSIX cron strings. Example: `* * * * *,*/5 * * * *`
40
+ runs one handler every minute and a second handler every five
41
+ minutes.
42
+ - `cron-dispatcher-mode`: `single-handler` when you elicited one
43
+ expression and want every fire to run one handler;
44
+ `expression-routed` when you elicited more than one expression
45
+ and want the dispatcher to route by exact expression match. The
46
+ recommended default follows your `cron-expressions` list: one
47
+ entry -> `single-handler`; more than one -> `expression-routed`.
48
+ - `cron-skew-tolerance-seconds`: the drift window inside which a
49
+ fire is `onTime` and outside which the dispatcher records
50
+ `cronSkewed`. Default `30`, floor `5`, ceiling `300`.
51
+ - `cron-soft-budget-seconds`: the per-handler duration past which
52
+ the dispatcher records `cronStalled`. Default `30`. The
53
+ dispatcher never terminates the handler; termination is
54
+ Cloudflare's platform-level concern per
55
+ https://developers.cloudflare.com/workers/platform/limits/.
56
+
57
+ ## The event shape
58
+
59
+ Every scheduled-side event on the sink carries only:
60
+
61
+ ```
62
+ { event, expression, scheduledTime, outcome, duration }
63
+ ```
64
+
65
+ Plus optional numeric fields:
66
+
67
+ - `softBudgetMs` on `cronStalled` records
68
+ - `deltaMs` on `cronSkewed` records
69
+
70
+ The event-secrecy probe drives a spy handler that closes over a
71
+ PII fixture (`{userId, ssn}`) and asserts neither the closure nor
72
+ any PII substring survives the sink boundary. See
73
+ `contributions/probes/event-secrecy.mjs` for the two-layer assertion.
74
+
75
+ ## Verifying at mechanism reach
76
+
77
+ The blueprint ships five Node-only probes under
78
+ `contributions/probes/`. Run them from the cf-platform fixture:
79
+
80
+ ```
81
+ cd packages/rcf-lite/test/fixtures/cf-platform
82
+ pnpm install --ignore-workspace
83
+ node ../../../../../blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-wrangler-test-scheduled.mjs
84
+ node ../../../../../blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-dispatcher-routing.mjs
85
+ node ../../../../../blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-skew-tolerance.mjs
86
+ node ../../../../../blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-event-secrecy.mjs
87
+ ```
88
+
89
+ Each writes a report under
90
+ `.rcf/reports/blueprints/platform-cloudflare-cron-triggers/<probe-name>.json`.
91
+ The real-account smoke:
92
+
93
+ ```
94
+ node ../../../../../blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-real-account-scheduled-smoke.mjs
95
+ ```
96
+
97
+ Without `CI_HAS_CLOUDFLARE_ACCOUNT=true` and the paired env vars,
98
+ the probe records `accountBoundSkipped: true` and exits 0 per spec
99
+ section 3.5.
100
+
101
+ ## Induced-failure switches
102
+
103
+ - `SIMULATE_PII_LEAK=true`: wraps the sink on the event-secrecy
104
+ probe so it forwards the closure onto every record. The probe
105
+ surfaces the forbidden keys and the PII substrings and returns
106
+ `aggregateVerdict: fail`. Use this before shipping to confirm
107
+ the whitelist assertion is teeth-bearing.
108
+ - `SIMULATE_SLOW_HANDLER=true`: extends the spy handler on the
109
+ skew-tolerance probe past `softBudgetMs` on every dispatch so
110
+ a reviewer can see `cronStalled` fires without editing the
111
+ probe. The shipped path already exercises the soft-budget
112
+ branch; the switch is a reviewer aid.
113
+
114
+ ## References
115
+
116
+ - Cloudflare Cron Triggers documentation: https://developers.cloudflare.com/workers/configuration/cron-triggers/
117
+ - Cloudflare Workers scheduled handler contract: https://developers.cloudflare.com/workers/runtime-apis/handlers/scheduled/
118
+ - Cloudflare Workers platform limits: https://developers.cloudflare.com/workers/platform/limits/
119
+ - Wrangler `wrangler dev` documentation (carries the `--test-scheduled` flag under the `dev` command): https://developers.cloudflare.com/workers/wrangler/commands/
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ All notable changes to `platform-cloudflare-durable-objects` are recorded here. The shape follows Keep a Changelog and Semantic Versioning per the blueprint authoring standard.
4
+
5
+ ## 1.0.0 (2026-09-07)
6
+
7
+ ### Added
8
+
9
+ - v1.0.0 mint of the `platform-cloudflare-durable-objects` blueprint, category `platform`, capabilities `["strongConsistencyCell", "hibernatableWebSocket"]`. Ships two composable shapes: the SINGLE-CELL shape (a named object as an authoritative counter, session store or lock) and the WEBSOCKET-HUB shape (a named object hosting many websocket clients with per-message routing and hibernate-and-wake support). One DO facade module owns the DO namespace bindings; typed storage API wraps both SQL and KV backends; alarm surface fires exactly once per scheduled time; hibernatable-WebSocket shape realises Cloudflare's documented hibernate-and-wake contract.
10
+ - 8 REQs (`platform-cloudflare-durable-objects-REQ-001..008`), 13 USs (`platform-cloudflare-durable-objects-US-33101..33113`; US-33113 covers the wrangler-seam runtime coverage), 5 TACs (`TAC-3401` namespace facade, `TAC-3402` single-cell shape, `TAC-3403` alarm handler, `TAC-3404` websocket hub, `TAC-3405` lifecycle event sink), 5 ADRs (`ADR-3401` scope-global on new topic `strongConsistencyCellContract` with `standardsTraceClause: Cloudflare Durable Objects documented consistency model`; `ADR-3402` scope-global on new topic `websocketHubContract` with `standardsTraceClause: Cloudflare Durable Objects hibernatable WebSockets shape`; `ADR-3403` storage backend `elicited: true` `recommendedDefault: sql`; `ADR-3404` migrations-shape with `standardsTraceClause: Cloudflare Durable Objects migration documentation`; `ADR-3405` hibernation posture `elicited: true` with idempotent-by-contract wake handler).
11
+ - 8 Node-only probes under `contributions/probes/`: `namespace-facade-ready` (facade opens and emits namespaceReady with metadata-only payload), `single-cell-concurrent-increment` (two concurrent increments serialise FIFO; also folds AC-33109-1 witness field), `storage-round-trip` (both sql and kv backends; also folds AC-33111-1 default backend), `alarm-fires-once` (once-per-schedule contract with drained storage), `websocket-hub-broadcast` (fan-out within window; folds AC-33110-1 hibernate-and-wake and AC-33106-1 event-secrecy on the shipped path with SIMULATE_PII_LEAK=true mutation), `sole-reader-scan` (source-tree scan of the applied source root with comment-stripping; folds SIMULATE_NON_FACADE_IMPORT=true mutation), `real-account-storage-smoke` (`accountBound: true`; records `accountBoundSkipped` in CI without `CI_HAS_CLOUDFLARE_ACCOUNT` per spec section 3.5), and `wrangler-seam` (drives `wrangler dev --local` on the fixture; two concurrent POST /cell/<id>/increment requests through the DO facade reaching env.CELL observe per-instance serialisation; one WebSocket upgrade against /hub/<id>/connect through the facade reaching env.HUB receives one broadcast frame; additional AC-33108-1 result on the same run greps wrangler.toml for both binding pairs and the migrations tag/new_classes; warn semantics per section 3.1 pass-with-skip if wrangler is missing or fails to bind).
12
+ - 7 elicited parameters on `blueprint.json`: `do-cell-binding` (default `CELL`), `do-hub-binding` (default `HUB`), `do-cell-class-name` (default `SingleCellObject`), `do-hub-class-name` (default `HubObject`), `do-storage-backend` (default `sql` per ADR-3403), `do-hub-broadcast-window-ms` (default `500`), `do-hub-hibernate-after-idle-ms` (default `30000` per ADR-3405).
13
+ - `suggestedCompanions`: `logging` (for the lifecycle-event sink) and `errorHandling` (for the handler-failure boundary).
14
+ - Extends the shared `cf-platform` sample-app fixture with the `[[durable_objects.bindings]]` blocks (one binding named `CELL` with `class_name` `SingleCellObject`, one binding named `HUB` with `class_name` `HubObject`), the paired `[[migrations]]` block with `tag = "v1"` and `new_classes = ["SingleCellObject", "HubObject"]`, the sole-reader DO facade (`src/do-facade.mjs`), the single-cell class (`src/do-single-cell.mjs`), the hub class (`src/do-hub.mjs`), and the in-memory DO storage driver (`src/do-storage.mjs`) realising both sql and kv backends. The T-0 `[assets]`, T-1 `[[kv_namespaces]]` and T-2 `[triggers]` crons blocks are preserved verbatim; the facade does NOT dereference `env.CACHE` (KV binding stays owned by the T-1 KV facade).
15
+ - Anatomy test at `packages/rcf-lite/test/blueprint/platform-cloudflare-durable-objects-anatomy.test.js` covers `TS-100..109` on the T-3 chain slice plus the wrangler-seam probe module shape (TC-wrangler-seam-shape) that binds AC-33113-1 to the shipped probe file (blueprint shape, contributions cross-check, probe module contracts, fixture files, ADR bodies and clauses, guide sections and URLs, two-mint-topic scope entries).
16
+
17
+ ### Known limitations
18
+
19
+ - The `real-account-storage-smoke` probe records `accountBoundSkipped: true` and aggregates to `pass` when `CI_HAS_CLOUDFLARE_ACCOUNT` is unset (spec section 3.5 pass-with-skip). Full mechanism reach requires a CI environment with `CI_HAS_CLOUDFLARE_ACCOUNT=true` plus paired `CF_ACCOUNT_ID`, `CF_DO_NAMESPACE_ID` and `CF_API_TOKEN` env vars, and a deployed Worker exposing the DO facade round-trip.
20
+ - The v1.0.0 boundary defers RPC-style class methods, storage backups and multi-object transactions across namespaces to v1.1.0 per spec section 5.3. The shipped code path does not open any of these seams; the v1.1.0 minor lands them as an additive minor.
21
+ - The in-memory DO storage driver realises both `sql` and `kv` backends deterministically for the shipped probes; a real Cloudflare DO backend (SQL storage vs KV storage) may exhibit different edge-case semantics on the wrangler dev boot path. The real-account smoke covers the real-backend edge; the local probes cover the shipped code path.
22
+ - The hub-shape hibernate-and-wake round-trip in the shipped in-process probe uses a fake state object with `acceptWebSocket`, `getWebSockets` and a fake websocket pair. A real `wrangler dev` process hosting DO bindings would exhibit different hibernation timing behaviour; the guide notes the trade at self-review.
23
+ - The `_serialise` promise queue on the shipped SingleCellObject class is defence-in-depth against non-workerd runtimes. Under workerd's fetch path, per-instance input gates plus storage output gates serialise concurrent invocations against the same object, so removing the `_serialise` guard is not observable through the wrangler-seam probe unless an additional race window (for example an artificial delay between the storage read and write) is also introduced. The in-process `single-cell-concurrent-increment` probe DOES observe the `_serialise` removal on its own (Node without workerd's storage gate); mutation-check tails on both probes ride the PR body.
@@ -0,0 +1,200 @@
1
+ # platform-cloudflare-durable-objects
2
+
3
+ A rcf-lite blueprint that ships a small, opinionated wiring over
4
+ Cloudflare Durable Objects. Two shapes ride in one blueprint: the
5
+ SINGLE-CELL shape (a named object as an authoritative counter,
6
+ session store or lock) and the WEBSOCKET-HUB shape (a named object
7
+ hosting many websocket clients with per-message routing and
8
+ hibernate-and-wake support). A facade module owns the DO namespace
9
+ bindings; typed domain verbs wrap the storage API; the alarm
10
+ surface and the hibernatable-WebSocket contract land under two
11
+ scope-global ADRs on new topics.
12
+
13
+ - Version: `1.0.0`
14
+ - Category: `platform`
15
+ - Capabilities: `["strongConsistencyCell", "hibernatableWebSocket"]`
16
+ - Suggested companions: `logging`, `errorHandling`
17
+
18
+ ## When to reach for it
19
+
20
+ - Authoritative state on Cloudflare Workers (counter, session
21
+ store, lock, coordinator) that needs strong-consistency writes:
22
+ the single-cell shape.
23
+ - Coordinated multiplayer websocket connections in one authoritative
24
+ hub (rooms, live cursors, presence): the hub shape.
25
+
26
+ The sibling `platform-cloudflare-kv` (round 6 T-1) is the shipped
27
+ answer for eventually-consistent low-latency reads. The guide's
28
+ decision tree pairs them.
29
+
30
+ ## The two shapes: decision tree at the top
31
+
32
+ - Do you need a strongly consistent authoritative cell? Reach for
33
+ the SINGLE-CELL shape.
34
+ - Do you need coordinated multiplayer websocket connections?
35
+ Reach for the WEBSOCKET-HUB shape.
36
+ - Do you need cache-shaped read-hot reads with no strong-consistency
37
+ contract? Reach for `platform-cloudflare-kv` instead.
38
+ - Do you need durable multi-step workflows with retries and state
39
+ across steps? Reach for the round-6 Workflows adapter on
40
+ `jobs-background` v1.1.0 instead.
41
+
42
+ ## The eight REQs
43
+
44
+ | REQ | What |
45
+ | --- | --- |
46
+ | `platform-cloudflare-durable-objects-REQ-001` | The DO facade is the sole reader of `env.CELL` and `env.HUB` and opens on boot with `namespaceReady`. |
47
+ | `platform-cloudflare-durable-objects-REQ-002` | The single-cell shape exposes typed domain verbs (`increment`, `read`, `reset`) and serialises concurrent invocations per instance. |
48
+ | `platform-cloudflare-durable-objects-REQ-003` | The storage API provides typed `put`, `get`, `delete` and `list` on the object with an elicited backend (SQL or KV). |
49
+ | `platform-cloudflare-durable-objects-REQ-004` | The alarm surface fires `alarm()` exactly once per scheduled time and `doAlarmFired` carries `objectName` and `scheduledTime`. |
50
+ | `platform-cloudflare-durable-objects-REQ-005` | The hibernatable WebSocket hub accepts clients via `state.acceptWebSocket` and the wake handler runs from cold reading the same storage. |
51
+ | `platform-cloudflare-durable-objects-REQ-006` | Lifecycle events fire at namespace and object level with metadata-only payloads. |
52
+ | `platform-cloudflare-durable-objects-REQ-007` | The sole-reader guarantee is enforced by an AST scan; no non-facade module dereferences `env.CELL` or `env.HUB`. |
53
+ | `platform-cloudflare-durable-objects-REQ-008` | Migration-safe class exports: stable class names committed to wrangler config with a paired `[[migrations]]` block. |
54
+
55
+ ## The wired shape
56
+
57
+ The DO facade is the ONE place `env.CELL` and `env.HUB` are read.
58
+ Typed handles wrap named instances of the SingleCellObject and
59
+ HubObject classes. The public surface is:
60
+
61
+ ```
62
+ createDoFacade({ env, eventSink, clock? })
63
+ -> { ready, cellHandle(name), hubHandle(name) }
64
+ ```
65
+
66
+ For in-process probing (no wrangler dev), the in-process variant:
67
+
68
+ ```
69
+ createDoFacadeInProcess({ singleCell, hub, eventSink, clock? })
70
+ -> { ready, cell(name), hub(name), registerCell(i), registerHub(i) }
71
+ ```
72
+
73
+ The two DO classes:
74
+
75
+ ```
76
+ new SingleCellObject({ storage, eventSink, name, clock? })
77
+ -> instance.increment(delta?) / read() / reset() / setAlarm(offsetMs) / alarm()
78
+
79
+ new HubObject({ state, storage, eventSink, name, hibernateAfterIdleMs?, clock? })
80
+ -> instance.accept(ws) / webSocketMessage(ws, msg) / webSocketClose(ws)
81
+ / hibernate() / wake()
82
+ ```
83
+
84
+ ## Elicited parameters
85
+
86
+ - `do-cell-binding` (default `CELL`): the DO namespace binding name
87
+ for the single-cell shape.
88
+ - `do-hub-binding` (default `HUB`): the DO namespace binding name
89
+ for the hub shape.
90
+ - `do-cell-class-name` (default `SingleCellObject`): the stable class
91
+ name string for the single-cell class.
92
+ - `do-hub-class-name` (default `HubObject`): the stable class name
93
+ string for the hub class.
94
+ - `do-storage-backend` (default `sql`, per ADR-3403): SQL (typed
95
+ columns, query) or KV (simple put/get/delete/list).
96
+ - `do-hub-broadcast-window-ms` (default `500`): the elicited window
97
+ for broadcast fan-out.
98
+ - `do-hub-hibernate-after-idle-ms` (default `30000`, per ADR-3405):
99
+ the hibernate-after-idle window on the hub shape. The wake
100
+ handler is idempotent-by-contract per the same ADR.
101
+
102
+ ## The eight probes
103
+
104
+ The eight probes live under `contributions/probes/`. Each has a
105
+ matching `run-<probe-name>.mjs` shim that writes a per-blueprint
106
+ report to `.rcf/reports/blueprints/platform-cloudflare-durable-objects/<probe-name>.json`
107
+ under the fixture root.
108
+
109
+ | Probe | anchorAcId | accountBound | What it covers |
110
+ | --- | --- | --- | --- |
111
+ | `namespace-facade-ready.mjs` | `AC-33101-1` | false | Facade opens; `namespaceReady` fires with allowed keys; `cell(name)` and `hub(name)` return the registered instances. |
112
+ | `single-cell-concurrent-increment.mjs` | `AC-33102-1` | false | Two concurrent increments serialise FIFO; counters `[1,2]`, witnesses `[0,1]`, final read `2`. Also covers `AC-33109-1` (witness field). |
113
+ | `storage-round-trip.mjs` | `AC-33103-1` | false | `put`, `get`, `delete`, `list` on both `sql` and `kv` backends; `driver.backend` reports the elicited answer. Also covers `AC-33111-1`. |
114
+ | `alarm-fires-once.mjs` | `AC-33104-1` | false | `alarm()` fires once; `doAlarmFired` carries `objectName` and `scheduledTime`; drained storage does not re-fire. |
115
+ | `websocket-hub-broadcast.mjs` | `AC-33105-1` | false | Broadcast from A reaches A and B within 500 ms; storage persists `lastBroadcast`. Also covers `AC-33110-1` (hibernate-and-wake) and `AC-33106-1` (event-secrecy on the shipped path). |
116
+ | `sole-reader-scan.mjs` | `AC-33107-1` | false | Every `.mjs`/`.js`/`.ts` file under the fixture applied source root is scanned; only `src/do-facade.mjs` may dereference `env.CELL` or `env.HUB` in live source. |
117
+ | `real-account-storage-smoke.mjs` | `AC-33112-1` | true | Facade round-trip against a real Cloudflare DO namespace when `CI_HAS_CLOUDFLARE_ACCOUNT=true`; otherwise records `accountBoundSkipped` and passes per spec section 3.5. |
118
+ | `wrangler-seam.mjs` | `AC-33113-1` | false | Spawns `wrangler dev --local` on the fixture and drives two concurrent `POST /cell/<id>/increment` requests through the DO facade against `env.CELL`, asserting per-instance serialisation (counters `[1, 2]`, witnesses `[0, 1]`); opens one WebSocket upgrade against `/hub/<id>/connect` through the facade against `env.HUB`, asserting one broadcast frame arrives on connect. Also carries an additional `AC-33108-1` result that greps `wrangler.toml` for both binding pairs and the migrations tag/new_classes. Warn semantics per section 3.1 pass-with-skip if wrangler is not installed or fails to bind. |
119
+
120
+ ## Two-line gate-reviewer boot
121
+
122
+ ```
123
+ cd packages/rcf-lite/test/fixtures/cf-platform
124
+ pnpm install --ignore-workspace
125
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-namespace-facade-ready.mjs
126
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-single-cell-concurrent-increment.mjs
127
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-storage-round-trip.mjs
128
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-alarm-fires-once.mjs
129
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-websocket-hub-broadcast.mjs
130
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-sole-reader-scan.mjs
131
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-real-account-storage-smoke.mjs
132
+ node ../../../../../blueprints/platform-cloudflare-durable-objects/contributions/probes/run-wrangler-seam.mjs
133
+ ```
134
+
135
+ Each returns exit 0 with `aggregateVerdict: pass`. The seventh
136
+ records `accountBoundSkipped: true` without the CI env var per
137
+ spec section 3.5.
138
+
139
+ The wrangler-dev boot (documented in the fixture README
140
+ under the T-3 sections) is required for the eighth probe
141
+ (`wrangler-seam.mjs`), which spawns `wrangler dev --local` on
142
+ the fixture to drive the shipped DO facade + SingleCellObject +
143
+ HubObject code path against a real workerd runtime. The six
144
+ local probes drive the shipped code path in-process against the
145
+ in-memory DO storage driver and a fake WebSocket state; a
146
+ real-account round-trip lives on the `real-account-storage-smoke`
147
+ probe and is skipped by default per the Clerk pattern. Prepare
148
+ the fixture once with `pnpm install --ignore-workspace`; the
149
+ wrangler-seam probe returns warn per spec section 3.1 pass-with-skip
150
+ if the CLI is missing or fails to bind within the cap.
151
+
152
+ ## The v1.0.0 boundary
153
+
154
+ The v1.0.0 mint keeps a single build worker inside its context
155
+ budget for an L blueprint. The following items DEFER to the v1.1.0
156
+ minor bump per spec section 5.3 and land as an additive minor once
157
+ at least one project needs them:
158
+
159
+ - RPC-style class methods (per the DO RPC surface).
160
+ - Storage backups.
161
+ - Multi-object transactions across namespaces.
162
+
163
+ The v1.0.0 shipped code path does not open any of these seams; a
164
+ future v1.1.0 grows the mechanism inside the same blueprint.
165
+
166
+ ## Companion pairing
167
+
168
+ - `logging`: every lifecycle event on the sink writes through the
169
+ applied logger; a logging companion supplies the sink factory.
170
+ - `errorHandling`: a namespace binding miss, an alarm handler
171
+ throwing, a hub broadcast failure constructs an internal error
172
+ record; an error-handling companion supplies the record factory
173
+ and the boundary.
174
+
175
+ ## Cross-reference to `platform-cloudflare-kv`
176
+
177
+ If your project needs eventually-consistent low-latency reads on
178
+ a read-hot path (feature flags, session cache, config cache),
179
+ reach for `platform-cloudflare-kv` (round 6 T-1) instead. Durable
180
+ Objects owns the strong-consistency slot on the shelf; KV owns
181
+ the cache-shaped eventually-consistent slot. Both compose on the
182
+ same Worker.
183
+
184
+ ## The two mint topics
185
+
186
+ - `strongConsistencyCellContract` (ADR-3401): the shipped shape is
187
+ a Cloudflare Durable Object named instance. A future non-Cloudflare
188
+ sibling (Postgres advisory-lock singleton, Redis single-master)
189
+ conflicts on this topic.
190
+ - `websocketHubContract` (ADR-3402): the shipped shape is a
191
+ Cloudflare Durable Object hub instance with hibernatable
192
+ WebSockets. A future non-Cloudflare hub sibling conflicts on
193
+ this topic.
194
+
195
+ Both topics are `scope: global` on the ADR contribution entries in
196
+ `blueprint.json`; the round-2 conflict pattern applies.
197
+
198
+ ## References
199
+
200
+ - Cloudflare Durable Objects overview: https://developers.cloudflare.com/durable-objects/
@@ -0,0 +1,243 @@
1
+ {
2
+ "slug": "platform-cloudflare-durable-objects",
3
+ "version": "1.0.0",
4
+ "category": "platform",
5
+ "capabilities": [
6
+ "strongConsistencyCell",
7
+ "hibernatableWebSocket"
8
+ ],
9
+ "suggestedCompanions": [
10
+ {
11
+ "role": "logging",
12
+ "reason": "Every namespaceReady, doAccept, doAlarmFired, doWakeUp and doHibernate event writes through the applied logger; a logging companion supplies the sink factory."
13
+ },
14
+ {
15
+ "role": "errorHandling",
16
+ "reason": "A namespace binding miss, an alarm handler throwing, a hub broadcast failure constructs an internal error record; an error-handling companion supplies the record factory and the boundary."
17
+ }
18
+ ],
19
+ "elicits": [
20
+ {
21
+ "id": "do-cell-binding",
22
+ "prompt": "Durable Object namespace binding name for the single-cell shape (a stable identifier in wrangler.toml under [[durable_objects.bindings]]; recommended default CELL).",
23
+ "kind": "string",
24
+ "default": "CELL"
25
+ },
26
+ {
27
+ "id": "do-hub-binding",
28
+ "prompt": "Durable Object namespace binding name for the hibernatable-WebSocket hub shape (recommended default HUB).",
29
+ "kind": "string",
30
+ "default": "HUB"
31
+ },
32
+ {
33
+ "id": "do-cell-class-name",
34
+ "prompt": "Stable class name string for the single-cell class exported from src/do-single-cell.mjs; committed under [[migrations]] on the v1 mint tag (recommended default SingleCellObject).",
35
+ "kind": "string",
36
+ "default": "SingleCellObject"
37
+ },
38
+ {
39
+ "id": "do-hub-class-name",
40
+ "prompt": "Stable class name string for the hub class exported from src/do-hub.mjs; committed under [[migrations]] on the v1 mint tag (recommended default HubObject).",
41
+ "kind": "string",
42
+ "default": "HubObject"
43
+ },
44
+ {
45
+ "id": "do-storage-backend",
46
+ "prompt": "Storage backend for the single-cell class per ADR-3403: sql (typed columns, query) or kv (simple put/get/delete/list). Recommended default sql.",
47
+ "kind": "enum",
48
+ "options": [
49
+ "sql",
50
+ "kv"
51
+ ],
52
+ "default": "sql"
53
+ },
54
+ {
55
+ "id": "do-hub-broadcast-window-ms",
56
+ "prompt": "Broadcast delivery window per HubObject fan-out, in milliseconds (recommended default 500).",
57
+ "kind": "string",
58
+ "default": "500"
59
+ },
60
+ {
61
+ "id": "do-hub-hibernate-after-idle-ms",
62
+ "prompt": "Hibernate-after-idle window per ADR-3405, in milliseconds (recommended default 30000; a coordinated-multiplayer workload with tight latency budgets picks a longer window).",
63
+ "kind": "string",
64
+ "default": "30000"
65
+ }
66
+ ],
67
+ "contributions": [
68
+ {
69
+ "id": "platform-cloudflare-durable-objects-REQ-001",
70
+ "kind": "req",
71
+ "path": "requirements/platform-cloudflare-durable-objects-req-001.json"
72
+ },
73
+ {
74
+ "id": "platform-cloudflare-durable-objects-REQ-002",
75
+ "kind": "req",
76
+ "path": "requirements/platform-cloudflare-durable-objects-req-002.json"
77
+ },
78
+ {
79
+ "id": "platform-cloudflare-durable-objects-REQ-003",
80
+ "kind": "req",
81
+ "path": "requirements/platform-cloudflare-durable-objects-req-003.json"
82
+ },
83
+ {
84
+ "id": "platform-cloudflare-durable-objects-REQ-004",
85
+ "kind": "req",
86
+ "path": "requirements/platform-cloudflare-durable-objects-req-004.json"
87
+ },
88
+ {
89
+ "id": "platform-cloudflare-durable-objects-REQ-005",
90
+ "kind": "req",
91
+ "path": "requirements/platform-cloudflare-durable-objects-req-005.json"
92
+ },
93
+ {
94
+ "id": "platform-cloudflare-durable-objects-REQ-006",
95
+ "kind": "req",
96
+ "path": "requirements/platform-cloudflare-durable-objects-req-006.json"
97
+ },
98
+ {
99
+ "id": "platform-cloudflare-durable-objects-REQ-007",
100
+ "kind": "req",
101
+ "path": "requirements/platform-cloudflare-durable-objects-req-007.json"
102
+ },
103
+ {
104
+ "id": "platform-cloudflare-durable-objects-REQ-008",
105
+ "kind": "req",
106
+ "path": "requirements/platform-cloudflare-durable-objects-req-008.json"
107
+ },
108
+ {
109
+ "id": "platform-cloudflare-durable-objects-US-33101",
110
+ "kind": "us",
111
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33101.json"
112
+ },
113
+ {
114
+ "id": "platform-cloudflare-durable-objects-US-33102",
115
+ "kind": "us",
116
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33102.json"
117
+ },
118
+ {
119
+ "id": "platform-cloudflare-durable-objects-US-33103",
120
+ "kind": "us",
121
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33103.json"
122
+ },
123
+ {
124
+ "id": "platform-cloudflare-durable-objects-US-33104",
125
+ "kind": "us",
126
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33104.json"
127
+ },
128
+ {
129
+ "id": "platform-cloudflare-durable-objects-US-33105",
130
+ "kind": "us",
131
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33105.json"
132
+ },
133
+ {
134
+ "id": "platform-cloudflare-durable-objects-US-33106",
135
+ "kind": "us",
136
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33106.json"
137
+ },
138
+ {
139
+ "id": "platform-cloudflare-durable-objects-US-33107",
140
+ "kind": "us",
141
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33107.json"
142
+ },
143
+ {
144
+ "id": "platform-cloudflare-durable-objects-US-33108",
145
+ "kind": "us",
146
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33108.json"
147
+ },
148
+ {
149
+ "id": "platform-cloudflare-durable-objects-US-33109",
150
+ "kind": "us",
151
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33109.json"
152
+ },
153
+ {
154
+ "id": "platform-cloudflare-durable-objects-US-33110",
155
+ "kind": "us",
156
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33110.json"
157
+ },
158
+ {
159
+ "id": "platform-cloudflare-durable-objects-US-33111",
160
+ "kind": "us",
161
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33111.json"
162
+ },
163
+ {
164
+ "id": "platform-cloudflare-durable-objects-US-33112",
165
+ "kind": "us",
166
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33112.json"
167
+ },
168
+ {
169
+ "id": "platform-cloudflare-durable-objects-US-33113",
170
+ "kind": "us",
171
+ "path": "user-stories/platform-cloudflare-durable-objects-us-33113.json"
172
+ },
173
+ {
174
+ "id": "TAC-3401-platform-cloudflare-durable-objects-namespace-facade",
175
+ "kind": "tac",
176
+ "path": "tacs/tac-3401-platform-cloudflare-durable-objects-namespace-facade.json"
177
+ },
178
+ {
179
+ "id": "TAC-3402-platform-cloudflare-durable-objects-single-cell-shape",
180
+ "kind": "tac",
181
+ "path": "tacs/tac-3402-platform-cloudflare-durable-objects-single-cell-shape.json"
182
+ },
183
+ {
184
+ "id": "TAC-3403-platform-cloudflare-durable-objects-alarm-handler",
185
+ "kind": "tac",
186
+ "path": "tacs/tac-3403-platform-cloudflare-durable-objects-alarm-handler.json"
187
+ },
188
+ {
189
+ "id": "TAC-3404-platform-cloudflare-durable-objects-websocket-hub",
190
+ "kind": "tac",
191
+ "path": "tacs/tac-3404-platform-cloudflare-durable-objects-websocket-hub.json"
192
+ },
193
+ {
194
+ "id": "TAC-3405-platform-cloudflare-durable-objects-event-sink",
195
+ "kind": "tac",
196
+ "path": "tacs/tac-3405-platform-cloudflare-durable-objects-event-sink.json"
197
+ },
198
+ {
199
+ "id": "ADR-3401-platform-cloudflare-durable-objects-single-cell-contract",
200
+ "kind": "adr",
201
+ "path": "adrs/adr-3401-platform-cloudflare-durable-objects-single-cell-contract.json",
202
+ "scope": "global",
203
+ "topic": "strongConsistencyCellContract",
204
+ "recommendedDefault": true,
205
+ "elicited": false,
206
+ "standardsTraceClause": "Cloudflare Durable Objects documented consistency model"
207
+ },
208
+ {
209
+ "id": "ADR-3402-platform-cloudflare-durable-objects-websocket-hub-contract",
210
+ "kind": "adr",
211
+ "path": "adrs/adr-3402-platform-cloudflare-durable-objects-websocket-hub-contract.json",
212
+ "scope": "global",
213
+ "topic": "websocketHubContract",
214
+ "recommendedDefault": true,
215
+ "elicited": false,
216
+ "standardsTraceClause": "Cloudflare Durable Objects hibernatable WebSockets shape"
217
+ },
218
+ {
219
+ "id": "ADR-3403-platform-cloudflare-durable-objects-storage-backend",
220
+ "kind": "adr",
221
+ "path": "adrs/adr-3403-platform-cloudflare-durable-objects-storage-backend.json",
222
+ "recommendedDefault": true,
223
+ "elicited": true,
224
+ "standardsTraceClause": "generic enterprise practice"
225
+ },
226
+ {
227
+ "id": "ADR-3404-platform-cloudflare-durable-objects-migrations-shape",
228
+ "kind": "adr",
229
+ "path": "adrs/adr-3404-platform-cloudflare-durable-objects-migrations-shape.json",
230
+ "recommendedDefault": true,
231
+ "elicited": false,
232
+ "standardsTraceClause": "Cloudflare Durable Objects migration documentation"
233
+ },
234
+ {
235
+ "id": "ADR-3405-platform-cloudflare-durable-objects-hibernation-posture",
236
+ "kind": "adr",
237
+ "path": "adrs/adr-3405-platform-cloudflare-durable-objects-hibernation-posture.json",
238
+ "recommendedDefault": true,
239
+ "elicited": true,
240
+ "standardsTraceClause": "generic enterprise practice"
241
+ }
242
+ ]
243
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "adrId": "ADR-3401-platform-cloudflare-durable-objects-single-cell-contract",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Single-cell contract: Cloudflare Durable Objects authoritative-cell shape (scope global, new topic strongConsistencyCellContract)",
8
+ "context": "An applying Workers project has one native strong-consistency answer today: Cloudflare Durable Objects. The DO runtime serialises invocations against a named instance per https://developers.cloudflare.com/durable-objects/, providing the authoritative-cell shape a counter, session store or lock needs. Two shapes ship in this blueprint (single-cell and websocket-hub) per spec section 5.3; both share the DO namespace mechanic. The single-cell shape is the one project-wide answer to strongConsistencyCellContract; a future non-Cloudflare adapter (a Postgres advisory-lock singleton, a Redis single-master pattern) would conflict on the same topic.",
9
+ "decision": "The shipped v1.0.0 default is a Cloudflare Durable Object named instance behind the DO facade (env.CELL), realising the single-cell shape per REQ-002 and TAC-3402. The strongConsistencyCellContract topic scope is global on this blueprint; the topic string is strongConsistencyCellContract (lower camelCase, one concept per topic, no version suffix, per the round-2 rules-for-new-topics clause). A future non-Cloudflare adapter would contribute the same topic string with a different answer, forcing a DELIBERATE conflict the operator resolves with a project-level ADR.",
10
+ "consequences": "The applying project inherits Cloudflare's documented DO consistency model, the platform-assigned per-object limits (https://developers.cloudflare.com/durable-objects/), and the migration-safe class-export contract (REQ-008). Standards trace clause: Cloudflare Durable Objects documented consistency model (per https://developers.cloudflare.com/durable-objects/). Consumers needing weaker-consistency low-latency reads reach for the sibling platform-cloudflare-kv blueprint (round 6 T-1) instead; the guide names the decision.",
11
+ "alternativesConsidered": [],
12
+ "createdAt": "2026-09-07T14:00:00.000Z",
13
+ "updatedAt": "2026-09-07T14:00:00.000Z"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "adrId": "ADR-3402-platform-cloudflare-durable-objects-websocket-hub-contract",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Websocket hub contract: Cloudflare Durable Objects hibernatable WebSockets shape (scope global, new topic websocketHubContract)",
8
+ "context": "A named DO instance can host many websocket clients via state.acceptWebSocket per the hibernatable WebSockets shape (https://developers.cloudflare.com/durable-objects/). The runtime hibernates the object when idle and wakes it on the next message; the wake handler runs from cold and reads the same storage. This is the shipped answer for the coordinated-multiplayer shape the WSD lane consumers reach for. A future non-Cloudflare hub adapter (a Redis pub-sub broker, a bespoke websocket server) would conflict on the same topic; the guide names the trade.",
9
+ "decision": "The shipped v1.0.0 default is a Cloudflare Durable Object hub instance behind the DO facade (env.HUB), realising the hibernatable-WebSocket hub shape per REQ-005 and TAC-3404. The websocketHubContract topic scope is global on this blueprint; the topic string is websocketHubContract. A future non-Cloudflare adapter would contribute the same topic string, forcing a DELIBERATE conflict the operator resolves with a project-level ADR.",
10
+ "consequences": "The applying project inherits Cloudflare's documented hibernatable-WebSockets contract, the hibernate-after-idle window (elicited per ADR-3405) and the idempotent wake-handler shape. Standards trace clause: Cloudflare Durable Objects hibernatable WebSockets shape (per https://developers.cloudflare.com/durable-objects/). The hub shape shares the DO namespace mechanic with the single-cell shape; a future non-Cloudflare websocket-hub sibling mints on demand and the two-blueprint split conversation resurfaces then.",
11
+ "alternativesConsidered": [],
12
+ "createdAt": "2026-09-07T14:00:00.000Z",
13
+ "updatedAt": "2026-09-07T14:00:00.000Z"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "adrId": "ADR-3403-platform-cloudflare-durable-objects-storage-backend",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Storage backend: SQL or KV on the object (elicited)",
8
+ "context": "A Cloudflare Durable Object exposes state.storage per https://developers.cloudflare.com/durable-objects/. Two backends are documented: SQL storage (state.storage.sql) supports typed columns and query; KV storage (state.storage.put/get/delete/list) is simpler and single-key. Both are useful; the choice depends on the shipped object's data shape. The elicit forces the operator to pick at apply time so the shipped code path can carry the trace record.",
9
+ "decision": "The applied blueprint elicits do-storage-backend at apply time with two options (sql, kv). The recommendedDefault is sql for new objects (SQL supports typed columns and future migrations without a driver rewrite). The chosen answer threads through the storage driver factory as driver.backend per AC-33111-1; the shipped SingleCellObject class code is backend-agnostic and does not care which backend is live.",
10
+ "consequences": "A project that picks sql inherits the DO SQL storage semantics and the shipped SQL migration path; a project that picks kv inherits the simpler put/get/delete/list surface and the KV eventual-consistency-on-the-object trade the guide documents. Standards trace clause: generic enterprise practice (the sql-vs-kv trade is a general enterprise-tier storage-shape choice, not a Cloudflare-specific claim).",
11
+ "alternativesConsidered": [],
12
+ "createdAt": "2026-09-07T14:00:00.000Z",
13
+ "updatedAt": "2026-09-07T14:00:00.000Z"
14
+ }