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,78 @@
1
+ {
2
+ "createdAt": "2026-09-06T20:28:34.000Z",
3
+ "updatedAt": "2026-09-06T20:28:34.000Z",
4
+ "asA": "shelf consumer applying the jobs-background v1.0.0 blueprint",
5
+ "iWant": "the shipped blueprint files with 22 contributions, five probes, an extension to the shared sample-app fixture wiring the jobs runtime and scheduler on top of the T-3 in-memory queue seam, plus gate-runnable proof that apply refuses on a bare project with exit 3 and the stable message id, --allow-no-queue-yet writes a sidecar note, and every probe passes on the canonical fixture state",
6
+ "soThat": "a rcf-lite project applying this blueprint gets a job-definition contract with retry policy and timeout, an elicited scheduler (inProcess for now, workerCron or external for shipped adapters, workflows reserved for v1.1.0), a metadata-only run-log event stream at four moments, and the backgroundJobs capability future consumer blueprints can compose on; the T-5 capability-consumer mechanism is exercised end to end through the queue-capability path with runtime-observable ACs proven by probes the HQ gate runs against the shared sample-app fixture",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-4301-1",
10
+ "description": "The shelf carries blueprints/jobs-background/blueprint.json declaring slug jobs-background, version 1.0.0, category jobs, 22 contributions in the 6 REQ / 9 US / 3 TAC / 4 ADR groups per infra round 5 spec section 5.4; capabilities is [backgroundJobs]; suggestedCompanions declares logging and errorHandling with spec section 5.4 reasons; providesRoles is absent; requiresAppliedCapabilities equals {capabilities:[queue],allowSkipFlag:allow-no-queue-yet,refusalMessageId:jobs-background-no-queue}; every ADR contribution entry carries a non-null standardsTraceClause per section 8a.2.",
11
+ "given": "the shelf tree after this blueprint lands",
12
+ "when": "jq queries against blueprints/jobs-background/blueprint.json",
13
+ "then": "jq .slug returns jobs-background; jq .version returns 1.0.0; jq .contributions | length returns 22; jq .capabilities returns [backgroundJobs]; jq .suggestedCompanions | length returns 2; jq .requiresAppliedCapabilities.capabilities returns [queue]; jq .requiresAppliedCapabilities.allowSkipFlag returns allow-no-queue-yet; jq .requiresAppliedCapabilities.refusalMessageId returns jobs-background-no-queue; jq .contributions[] | select(.kind==adr) | .standardsTraceClause returns a non-null string for every entry",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ },
17
+ {
18
+ "id": "AC-4301-2",
19
+ "description": "rcf define blueprint add ./blueprints/jobs-background on a bare fresh init project with no queue-capability provider applied refuses with exit 3 and the stderr message opens with the tag [jobs-background-no-queue] and explicitly names messaging-queue-cloudflare as the shipped provider and --allow-no-queue-yet as the override, per infra round 5 spec section 10 Q3 default asserting BOTH exit code AND stable message id.",
20
+ "given": "a fresh rcf init scratch project with no applied blueprints",
21
+ "when": "rcf define blueprint add ./blueprints/jobs-background runs",
22
+ "then": "exit code is 3; stderr contains the substring [jobs-background-no-queue]; stderr contains the substring messaging-queue-cloudflare; stderr contains the substring --allow-no-queue-yet; nothing is written to rcf/manifest.json under blueprints[] for jobs-background",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ },
26
+ {
27
+ "id": "AC-4301-3",
28
+ "description": "rcf define blueprint add ./blueprints/jobs-background --allow-no-queue-yet on the same bare project exits 0 and writes the sidecar rcf/blueprints/jobs-background.applied.json with allowNoAuthYet true, appliedCapabilities [], and a notes field naming the missing queue capability and the --allow-no-queue-yet override flag (queue-family prose, not auth-family prose); the T-5 mechanism's shipped sidecar path supersedes the spec section 5.4 prose reference to manifest.blueprints[jobs-background].source.notes because the applied-blueprint-record schema in rcf-schemas 0.6.1 is closed and cannot carry the notes field.",
29
+ "given": "a fresh rcf init scratch project with no applied blueprints",
30
+ "when": "rcf define blueprint add ./blueprints/jobs-background --allow-no-queue-yet runs",
31
+ "then": "exit code is 0; the file rcf/blueprints/jobs-background.applied.json exists; its slug is jobs-background; its allowNoAuthYet is true; its appliedCapabilities is []; its notes contains the substring no queue yet and the substring --allow-no-queue-yet and the substring queue; its notes does NOT contain the substring no auth yet nor no secrets-management yet",
32
+ "testable": true,
33
+ "scope": "runtime"
34
+ },
35
+ {
36
+ "id": "AC-4301-4",
37
+ "description": "rcf define blueprint add ./blueprints/jobs-background on a fresh init project that first applied messaging-queue-cloudflare exits 0 and the sidecar rcf/blueprints/jobs-background.applied.json records appliedCapabilities containing queue via the T-5 capability discovery mechanism (union across applied blueprint capability declarations); the spec section 5.4 prose reference to jq '.blueprints[] | select(.slug==\"jobs-background\") | .appliedCapabilities' rcf/manifest.json is superseded by the shipped mechanism which lives on the sidecar.",
38
+ "given": "a fresh rcf init scratch project with messaging-queue-cloudflare applied first",
39
+ "when": "rcf define blueprint add ./blueprints/jobs-background runs",
40
+ "then": "exit code is 0; the file rcf/blueprints/jobs-background.applied.json exists; its slug is jobs-background; its appliedCapabilities contains the string queue; its allowNoAuthYet is undefined; its notes is undefined",
41
+ "testable": true,
42
+ "scope": "runtime"
43
+ },
44
+ {
45
+ "id": "AC-4301-5",
46
+ "description": "Every probe module under blueprints/jobs-background/contributions/probes/ exports the spec section 3.2 verdict envelope with an anchorAcId matching a contributed AC id on the blueprint (apply-time-refusal.mjs anchorAcId AC-jobs-requiresQueue, apply-time-override.mjs AC-jobs-overrideRecorded, fake-clock-cron.mjs AC-jobs-scheduledRunsOnCron, retry-and-fail.mjs AC-jobs-retryOnHandlerFailure, event-secrecy.mjs AC-jobs-eventSecrecy); every run-<probe-name>.mjs shim exits 0 on a fresh run of the shared sample-app fixture with the T-3 in-memory queue seam active; every per-blueprint report at .rcf/reports/blueprints/jobs-background/<probe-name>.json carries aggregateVerdict pass.",
47
+ "given": "the shared sample-app fixture at packages/rcf-lite/test/fixtures/infra-s3-and-queue/ with the T-3 in-memory queue-driver seam active (SDR-3-a coordinator ruling: wrangler dev is not on this build host and the in-memory realisation of the Cloudflare Queues binding shape is the shipped local seam)",
48
+ "when": "each of the five run-<probe-name>.mjs shims runs against the fixture in sequence",
49
+ "then": "every shim exits 0; every per-blueprint report file carries aggregateVerdict pass; every result carries an anchorAcId matching a contributed AC id on the blueprint",
50
+ "testable": true,
51
+ "scope": "runtime"
52
+ },
53
+ {
54
+ "id": "AC-4301-6",
55
+ "description": "The shared sample-app fixture at packages/rcf-lite/test/fixtures/infra-s3-and-queue/ grows a jobs/ directory carrying two toy job-definition modules (send-welcome-email.mjs with retryPolicy {maxAttempts:3,backoff:exponential} and timeoutMs 60000, refresh-cache.mjs with retryPolicy {maxAttempts:5,backoff:constant} timeoutMs 10000 and cron every-minute), src/jobs-runtime.mjs realising the run-time (reads applied capabilities from the sidecar, registers job handlers with the queue consumer, fires the four lifecycle events per REQ-005), src/scheduler.mjs realising the inProcess scheduler with a fake-clock seam; two induced-failure switches SIMULATE_HANDLER_THROW and SIMULATE_PII_IN_JOB_INPUT are WIRED and driven live by the retry-and-fail.mjs and event-secrecy.mjs probes; the fixture README documents the two toy jobs, the jobs/ convention, the fake-clock switch, the elicited parameters and both induced-failure switches with paired probes.",
56
+ "given": "the shared fixture with the T-3 in-memory queue-driver seam and the T-4 jobs-runtime+scheduler wired on top",
57
+ "when": "each of the two induced-failure switches is set in turn and the paired probe runs",
58
+ "then": "SIMULATE_HANDLER_THROW true yields retry-and-fail report with attempts counter 1,2,3 across three jobStarted events with the same jobId followed by jobFailed with terminal code; SIMULATE_PII_IN_JOB_INPUT true yields event-secrecy report with aggregateVerdict pass proving the event whitelist blocks every PII input field; the fixture README documents each switch and the paired probe module by name",
59
+ "testable": true,
60
+ "scope": "runtime"
61
+ },
62
+ {
63
+ "id": "AC-4301-7",
64
+ "description": "The blueprint ships a README, a CHANGELOG, a guide, and a docs/topics.md entry; the shelf-wide id-band registry table gains a jobs-background row at US band 30101-30899 / ADR-TAC suffix block 31xx across every shipped blueprint's docs/topics.md; packages/rcf-lite/docs/blueprint-authoring.md section 6a capability-declaration table gains one row for backgroundJobs naming the reserved sibling posture per infra round 5 spec section 5.6.",
65
+ "given": "the shelf tree after this blueprint lands",
66
+ "when": "grep queries walk every blueprint's docs/topics.md and the section 6a table",
67
+ "then": "packages/rcf-lite/docs/blueprint-authoring.md contains a table row beginning | backgroundJobs | naming jobs-background and the reserved sibling posture; every shipped blueprint's docs/topics.md carries a row beginning | jobs-background | with the 30101-30899 band and 31xx suffix; blueprints/jobs-background/README.md, CHANGELOG.md, guide/jobs-background.md, docs/topics.md, and the extended packages/rcf-lite/test/fixtures/infra-s3-and-queue/ all exist; the fixture README names the jobs-runtime boot line and the two wired induced-failure switches",
68
+ "testable": true,
69
+ "scope": "runtime"
70
+ }
71
+ ],
72
+ "usId": "US-4301",
73
+ "prdId": "PRD-001",
74
+ "reqId": "REQ-043",
75
+ "version": "0.1.0",
76
+ "status": "draft",
77
+ "title": "The jobs-background blueprint ships on the shelf with five probes wired to the T-3 in-memory queue seam"
78
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:40.349Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5001",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-050",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 KV facade opens against the elicited KV binding on boot and emits facadeReady",
10
+ "asA": "shelf consumer applying the platform-cloudflare-kv v1.0.0 blueprint on a Workers project using the cf-platform fixture",
11
+ "iWant": "one KV facade module (src/kv-facade.mjs) that opens against the elicited KV binding on process boot and emits a facadeReady lifecycle event with a metadata-only payload",
12
+ "soThat": "boot ordering is observable, the ready-check seam is a single call site, and the applied project can compose its own bootstrapping around one predictable event",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5001-1",
16
+ "description": "On process boot, the facade opens against the elicited KV binding (env.CACHE on the fixture) with a bounded list(limit:1) ready-check; once the ready-check resolves, a facadeReady event fires on the injected event sink with a payload of exactly {event, key, size, ttl, timestamp} where key is null, size is 0 and ttl is null. The facade exposes typed named domain verbs (get, getWithMetadata, put, delete, list) and does NOT re-export the raw KV binding.",
17
+ "given": "a Node or Worker process with the facade module imported and its factory invoked with the elicited binding",
18
+ "when": "the process boots and the facade ready() call resolves",
19
+ "then": "a facadeReady event fires on the injected event sink with the metadata-only payload; the facade exposes named domain verbs only; the raw binding is not re-exported",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-kv"
26
+ ]
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:40.551Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5002",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-050",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 KV facade module is the sole reader of the KV binding grep-verified on the applied fixture tree",
10
+ "asA": "shelf consumer applying platform-cloudflare-kv v1.0.0",
11
+ "iWant": "the KV binding reference (env.CACHE) to appear in exactly one source module (src/kv-facade.mjs)",
12
+ "soThat": "the vendor surface is diffused across zero call sites outside the facade, and a future adapter swap lands without moving any AC",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5002-1",
16
+ "description": "A grep for env.CACHE in the applied fixture src/ tree returns exactly one file: src/kv-facade.mjs. No other module dereferences the raw KV binding. The public surface of src/kv-facade.mjs exports the createKvFacade factory only; the raw env.CACHE reference never crosses the module boundary.",
17
+ "given": "the applied project source tree after apply",
18
+ "when": "grep -rn env.CACHE walks the src/ tree",
19
+ "then": "the search returns one file src/kv-facade.mjs and no other match",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-kv"
26
+ ]
27
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:40.753Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5101",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-051",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 typed put get delete round-trip against the KV driver realises the Workers KV binding shape",
10
+ "asA": "shelf consumer applying platform-cloudflare-kv v1.0.0",
11
+ "iWant": "typed put and get verbs that round-trip a value through the KV driver realising the Workers KV binding shape",
12
+ "soThat": "the applied project can persist a small piece of state and read it back deterministically, in the same shape the real Workers KV binding would present",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5101-1",
16
+ "description": "facade.put(key, value) writes a value; facade.get(key) returns the same bytes; both operations emit their paired lifecycle events (kvWrite on put, kvHit on get). The round-trip works against the in-memory KV driver in the fixture (kv-driver.mjs) whose binding shape matches the real Workers KV binding contract per https://developers.cloudflare.com/kv/api/.",
17
+ "given": "the facade wired to the in-memory KV driver in the cf-platform fixture",
18
+ "when": "the facade-round-trip probe puts a fixture key/value and reads it back",
19
+ "then": "the read returns the same bytes; the event sink records one kvWrite and one kvHit; the probe report aggregates to pass",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ },
23
+ {
24
+ "id": "AC-5101-2",
25
+ "description": "facade.delete(key) removes a value; a subsequent facade.get(key) returns null and emits kvMiss.",
26
+ "given": "a key previously put via the facade",
27
+ "when": "facade.delete(key) then facade.get(key)",
28
+ "then": "the delete emits kvWrite; the get returns null and emits kvMiss",
29
+ "testable": true,
30
+ "scope": "runtime"
31
+ }
32
+ ],
33
+ "tags": [
34
+ "blueprint:platform-cloudflare-kv"
35
+ ]
36
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:40.958Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5102",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-051",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 list with prefix returns every key under the prefix with metadata shape intact",
10
+ "asA": "shelf consumer applying platform-cloudflare-kv v1.0.0",
11
+ "iWant": "facade.list({prefix}) to return every key under a prefix with the metadata shape intact",
12
+ "soThat": "the applied project can enumerate feature flags, sessions, or any prefix-scoped collection through one seam",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5102-1",
16
+ "description": "The list-with-prefix probe puts 10 keys under the prefix flags/ (each with a metadata blob) and calls facade.list({prefix: flags/}). The result returns all 10 keys, each entry carrying {name, metadata}, and every name preserves the domain-visible key (without the fixture keyPrefix if one was set).",
17
+ "given": "10 keys put under a shared prefix through the facade",
18
+ "when": "facade.list({prefix: flags/}) runs",
19
+ "then": "the result carries 10 entries with correct name and metadata fields; the aggregate probe verdict is pass",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-kv"
26
+ ]
27
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:41.162Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5201",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-052",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 cache-aside helper: hit-then-miss with a fake clock proves one origin call within TTL and a second past TTL",
10
+ "asA": "shelf consumer applying platform-cloudflare-kv v1.0.0",
11
+ "iWant": "the cache-aside helper to read from KV first and fall back to origin on miss, writing back with the elicited TTL",
12
+ "soThat": "the origin surface (a database, a downstream service) is spared one call per cached hit within TTL",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5201-1",
16
+ "description": "On first call, cache-aside.getOr(key, originFn) finds nothing in the facade, invokes originFn once, writes back with the elicited TTL, and returns the fresh value with source origin. On second call within TTL, the read is served from the facade (source cache) and originFn is NOT invoked (the invocation counter stays at 1).",
17
+ "given": "a fresh key and an origin function that increments a counter each call",
18
+ "when": "getOr(key, originFn) runs twice within TTL",
19
+ "then": "the invocation counter reaches 1; both calls return the same value; the second read reports source cache",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ },
23
+ {
24
+ "id": "AC-5201-2",
25
+ "description": "After the TTL elapses (in-memory driver clock advances past the expiration), cache-aside.getOr(key, originFn) finds nothing and invokes originFn a second time. The invocation counter reaches 2.",
26
+ "given": "a key past its TTL",
27
+ "when": "getOr(key, originFn) runs after clock advance past TTL",
28
+ "then": "the invocation counter reaches 2; the returned value comes from origin",
29
+ "testable": true,
30
+ "scope": "runtime"
31
+ }
32
+ ],
33
+ "tags": [
34
+ "blueprint:platform-cloudflare-kv"
35
+ ]
36
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:41.367Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5301",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-053",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 lifecycle events fire on facadeReady kvHit kvMiss kvWrite with metadata-only payload",
10
+ "asA": "shelf consumer applying platform-cloudflare-kv v1.0.0",
11
+ "iWant": "the facade to emit facadeReady kvHit kvMiss kvWrite events with metadata-only payload on the injected sink",
12
+ "soThat": "the applied logging companion can render KV activity without ever writing a body byte to the log stream",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5301-1",
16
+ "description": "Each lifecycle event emitted by the facade carries EXACTLY the whitelist {event, key, size, ttl, timestamp}. No body value, no metadata blob, no additional field ever appears on the record the sink receives.",
17
+ "given": "the facade wired to a spy event sink, with a mix of put/get/delete/list operations",
18
+ "when": "the operations run",
19
+ "then": "the sink records each event with only the whitelist keys; any extra key trips the probe",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-kv"
26
+ ]
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:41.585Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5302",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-053",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 event secrecy: no body bytes no PII no user id beyond the key ever reach the event sink",
10
+ "asA": "shelf consumer applying platform-cloudflare-kv v1.0.0",
11
+ "iWant": "the event-secrecy probe to prove no body bytes or PII ever reach the event sink",
12
+ "soThat": "the operator can trust that a KV that holds a PII fixture (users/1234/profile with SSN) never leaks the body to the log stream even under a mutation-run",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5302-1",
16
+ "description": "The event-secrecy probe puts, gets and deletes a PII fixture (key users/1234/profile, body {ssn: REDACTED-fixture}); every event record on the sink carries only the whitelist and no substring of the SSN, no substring of the user id beyond the key itself, and no substring of the body. A mutation-run turning on SIMULATE_PII_LEAK flips the probe to fail with the leaked field named.",
17
+ "given": "the facade wired to a spy sink with a PII fixture",
18
+ "when": "put/get/delete operations run on the PII key",
19
+ "then": "the recorded events contain only the whitelist; PII-substring scan returns zero hits; the mutation-run under SIMULATE_PII_LEAK trips the probe to fail",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-kv"
26
+ ]
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T10:18:41.795Z",
3
+ "updatedAt": "2026-09-07T10:20:10.276Z",
4
+ "usId": "US-5401",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-054",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-1 real-account eventual-consistency smoke: write eventually appears on a global read within a bounded 60-second cap or records accountBoundSkipped in CI",
10
+ "asA": "shelf consumer applying platform-cloudflare-kv v1.0.0 in CI with real Cloudflare credentials",
11
+ "iWant": "the real-account eventual-consistency smoke to open the facade against a real KV namespace and observe the write eventually appearing on a global read",
12
+ "soThat": "the applied project has one probe that exercises the real vendor surface (not just the in-memory driver) and closes the mechanism-reach gap between fixture and production",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-5401-1",
16
+ "description": "When CI_HAS_CLOUDFLARE_ACCOUNT is set (with CF_ACCOUNT_ID, CF_KV_NAMESPACE_ID and CF_API_TOKEN), the real-account probe opens the facade against the real KV namespace via the Workers KV REST API, writes a fixture key, polls the same key with bounded 60-second cap, and asserts the value eventually returns. Without CI_HAS_CLOUDFLARE_ACCOUNT the probe records accountBoundSkipped true and the aggregate flips to pass per spec section 3.5. The probe cleans up its written key on exit.",
17
+ "given": "the real-account smoke shim with or without CI_HAS_CLOUDFLARE_ACCOUNT",
18
+ "when": "the shim runs",
19
+ "then": "with the env var: the write eventually returns within 60 seconds and the aggregate is pass; without: the aggregate is pass and the report records accountBoundSkipped true",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-kv"
26
+ ]
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T12:28:01.537Z",
3
+ "updatedAt": "2026-09-07T12:28:01.537Z",
4
+ "asA": "shelf consumer applying the platform-cloudflare-cron-triggers v1.0.0 blueprint on a Workers project using the cf-platform fixture",
5
+ "iWant": "one scheduled() handler module (src/scheduled.mjs) that opens against the elicited cron triggers on process boot, wires the dispatcher and event sink, and emits a cronReady lifecycle event with a metadata-only payload",
6
+ "soThat": "boot ordering is observable, the scheduled seam is a single call site, and the applied project can compose its own bootstrapping around one predictable event",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-6001-1",
10
+ "description": "On process boot, the scheduled handler binds against the elicited cron triggers (the [triggers] crons block in wrangler.toml on the fixture), wires the dispatcher and the injected event sink, and emits a cronReady event on the sink with a payload of exactly {event, key, size, ttl, timestamp} where key is null, size is 0 and ttl is null. The scheduled handler does NOT dereference the KV binding (env.CACHE stays owned by the T-1 facade).",
11
+ "given": "a Node or Worker process with the scheduled handler module imported and its factory invoked with the elicited configuration",
12
+ "when": "the process boots and the scheduled handler ready() call resolves",
13
+ "then": "a cronReady event fires on the injected event sink with the metadata-only payload; the module does not dereference env.CACHE",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ }
17
+ ],
18
+ "tags": [
19
+ "blueprint:platform-cloudflare-cron-triggers"
20
+ ],
21
+ "usId": "US-6001",
22
+ "prdId": "PRD-001",
23
+ "reqId": "REQ-060",
24
+ "version": "0.1.0",
25
+ "status": "draft",
26
+ "title": "T-2 scheduled() handler opens against the elicited cron triggers on boot and emits cronReady"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T12:28:01.742Z",
3
+ "updatedAt": "2026-09-07T12:28:01.742Z",
4
+ "asA": "reviewer verifying the platform-cloudflare-cron-triggers v1.0.0 blueprint at mechanism reach",
5
+ "iWant": "the wrangler-test-scheduled probe to spawn wrangler dev --test-scheduled on the cf-platform fixture, drive its scheduled-fire route with a cron expression declared in wrangler.toml, assert a cronFired event fires on the sink and wrangler exits cleanly",
6
+ "soThat": "the shipped scheduled() handler is proven wired to the vendor's CLI seam, not only to an in-process spy",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-6002-1",
10
+ "description": "The wrangler-test-scheduled probe spawns wrangler dev --test-scheduled from the cf-platform fixture, waits bounded 30 seconds for the CLI to bind, drives its scheduled-fire route with an expression from wrangler.toml's [triggers] crons block, asserts a cronFired event fires on the injected sink with metadata {expression, scheduledTime, outcome, duration}, kills wrangler cleanly on exit, and returns aggregateVerdict: pass. On a shipped wrangler regression that prevents --test-scheduled from binding, the probe returns aggregateVerdict: warn with the observed CLI stderr quoted and the mechanism-reach gap noted, per section 3.1 pass-with-skip conventions.",
11
+ "given": "wrangler installed as a devDependency on the cf-platform fixture and the [triggers] crons block declared in wrangler.toml",
12
+ "when": "the probe runs from the fixture directory",
13
+ "then": "wrangler dev --test-scheduled binds, the scheduled-fire route drives a cronFired event and wrangler exits cleanly",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ }
17
+ ],
18
+ "tags": [
19
+ "blueprint:platform-cloudflare-cron-triggers"
20
+ ],
21
+ "usId": "US-6002",
22
+ "prdId": "PRD-001",
23
+ "reqId": "REQ-060",
24
+ "version": "0.1.0",
25
+ "status": "draft",
26
+ "title": "T-2 wrangler dev --test-scheduled fires cronFired on the fixture handler"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T12:28:01.964Z",
3
+ "updatedAt": "2026-09-07T12:28:01.964Z",
4
+ "asA": "operator validating platform-cloudflare-cron-triggers v1.0.0 against a real Cloudflare account",
5
+ "iWant": "the real-account-scheduled-smoke probe to schedule a per-minute cron on a real Worker, wait bounded 90 seconds and assert cronFired fires at least once",
6
+ "soThat": "the shipped scheduled() surface is proven against the vendor's global cron scheduler, not only against wrangler dev",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-6003-1",
10
+ "description": "The real-account-scheduled-smoke probe, when CI_HAS_CLOUDFLARE_ACCOUNT=true and the paired CF_ACCOUNT_ID / CF_WORKER_NAME / CF_API_TOKEN env vars are set, deploys a scheduled Worker with a per-minute cron expression (* * * * *), waits bounded 90 seconds (poll every 5s) for a cronFired event to appear on the Worker's log stream, and returns aggregateVerdict: pass. Without CI_HAS_CLOUDFLARE_ACCOUNT the probe records accountBoundSkipped: true and aggregates to pass per spec section 3.5.",
11
+ "given": "a real Cloudflare account with the paired env vars, or no such account and CI_HAS_CLOUDFLARE_ACCOUNT unset",
12
+ "when": "the probe runs",
13
+ "then": "with the account: cronFired appears within 90s and the probe passes. Without the account: the probe records accountBoundSkipped: true and exits 0.",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ }
17
+ ],
18
+ "tags": [
19
+ "blueprint:platform-cloudflare-cron-triggers"
20
+ ],
21
+ "usId": "US-6003",
22
+ "prdId": "PRD-001",
23
+ "reqId": "REQ-060",
24
+ "version": "0.1.0",
25
+ "status": "draft",
26
+ "title": "T-2 real-account live-cron smoke fires cronFired at least once against a real Cloudflare Worker"
27
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "createdAt": "2026-09-07T12:28:02.169Z",
3
+ "updatedAt": "2026-09-07T12:28:02.169Z",
4
+ "asA": "developer whose Worker needs to schedule two or more distinct workloads on distinct cron cadences",
5
+ "iWant": "one dispatcher module (src/dispatcher.mjs) that accepts an ordered map of cron expressions to handler functions and, on every scheduled invocation, routes to the matched handler with a bounded context",
6
+ "soThat": "one wrangler.toml [triggers] block with multiple cron expressions cleanly maps to distinct handler code paths without hand-rolled conditionals",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-6101-1",
10
+ "description": "createDispatcher({routes: [{expression, handler}, ...], eventSink}) returns a dispatch(event) function. Calling dispatch({cron: '* * * * *', scheduledTime}) invokes exactly the handler whose expression is '* * * * *' and passes {expression, scheduledTime, sink} to it; no other route's handler is called on that dispatch.",
11
+ "given": "a dispatcher wired with two routes and two spy handlers",
12
+ "when": "dispatch is called with a specific expression",
13
+ "then": "only the matched spy handler is invoked exactly once with the bounded context",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ },
17
+ {
18
+ "id": "AC-6101-2",
19
+ "description": "Calling dispatch({cron: expressionNotInRoutes, scheduledTime}) does NOT invoke any handler, fires a cronUnmatched event on the sink with metadata {expression, scheduledTime, outcome: unmatched, duration: 0} and returns without side effect.",
20
+ "given": "a dispatcher wired with two routes and two spy handlers",
21
+ "when": "dispatch is called with an expression not in the routes",
22
+ "then": "no spy is called, a cronUnmatched event fires, and dispatch returns without side effect",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ }
26
+ ],
27
+ "tags": [
28
+ "blueprint:platform-cloudflare-cron-triggers"
29
+ ],
30
+ "usId": "US-6101",
31
+ "prdId": "PRD-001",
32
+ "reqId": "REQ-061",
33
+ "version": "0.1.0",
34
+ "status": "draft",
35
+ "title": "T-2 dispatcher routes multiple cron expressions to distinct handlers by expression match"
36
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "createdAt": "2026-09-07T12:28:02.375Z",
3
+ "updatedAt": "2026-09-07T12:28:02.375Z",
4
+ "asA": "operator observing the timeliness of scheduled work on a Worker",
5
+ "iWant": "the dispatcher to classify every fire against an elicited skew window and record cronSkewed for late fires with the delta",
6
+ "soThat": "the applied logging companion surfaces cron drift as a first-class signal without every handler having to keep its own clock",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-6201-1",
10
+ "description": "With an elicited skew window of 30 seconds and a fake clock aligned to scheduledTime, dispatching a scheduled event fires cronFired with {expression, scheduledTime, outcome: onTime, duration: >=0} on the sink; no cronSkewed event fires for that dispatch.",
11
+ "given": "a dispatcher configured with skewToleranceMs=30000 and a fake clock aligned to scheduledTime",
12
+ "when": "an event is dispatched",
13
+ "then": "a cronFired event fires with outcome onTime and no cronSkewed fires",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ },
17
+ {
18
+ "id": "AC-6201-2",
19
+ "description": "With an elicited skew window of 30 seconds and a fake clock advanced 60000ms past scheduledTime, dispatching a scheduled event fires cronSkewed with {expression, scheduledTime, outcome: skewed, duration: >=0, deltaMs: 60000} on the sink; the routed handler still runs.",
20
+ "given": "a dispatcher configured with skewToleranceMs=30000 and a fake clock advanced 60000ms past scheduledTime",
21
+ "when": "an event is dispatched",
22
+ "then": "a cronSkewed event fires with the observed delta and the handler still runs",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ }
26
+ ],
27
+ "tags": [
28
+ "blueprint:platform-cloudflare-cron-triggers"
29
+ ],
30
+ "usId": "US-6201",
31
+ "prdId": "PRD-001",
32
+ "reqId": "REQ-062",
33
+ "version": "0.1.0",
34
+ "status": "draft",
35
+ "title": "T-2 skew tolerance: fires inside the elicited window are onTime; outside record cronSkewed with delta"
36
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "createdAt": "2026-09-07T12:28:02.582Z",
3
+ "updatedAt": "2026-09-07T12:28:02.582Z",
4
+ "asA": "operator observing long-running scheduled work on a Worker",
5
+ "iWant": "the dispatcher to fire cronStalled at the moment a handler's observed duration crosses the elicited soft budget, without terminating the handler",
6
+ "soThat": "the applied logging companion surfaces stalled fires as a first-class signal, and the Worker's own CPU budget remains the vendor's concern",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-6301-1",
10
+ "description": "With softBudgetMs=100 and a spy handler that resolves after 250ms of fake-clock time, dispatching fires exactly one cronStalled event on the sink with {expression, scheduledTime, outcome: stalled, duration: >=100, softBudgetMs: 100} at the moment the observed duration crosses 100ms.",
11
+ "given": "a dispatcher configured with softBudgetMs=100 and a spy handler that resolves after 250ms fake-clock",
12
+ "when": "an event is dispatched",
13
+ "then": "a cronStalled event fires exactly once with the observed duration at or past the budget",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ },
17
+ {
18
+ "id": "AC-6301-2",
19
+ "description": "With softBudgetMs=100 and a spy handler that resolves after 250ms of fake-clock time, the dispatcher does NOT terminate the handler on the soft-budget breach; the handler runs to completion, resolves, and a final cronFired event follows the cronStalled record with the total duration.",
20
+ "given": "a dispatcher configured with softBudgetMs=100 and a spy handler that resolves after 250ms fake-clock",
21
+ "when": "an event is dispatched",
22
+ "then": "the handler runs to completion and a cronFired follows the cronStalled record",
23
+ "testable": true,
24
+ "scope": "runtime"
25
+ }
26
+ ],
27
+ "tags": [
28
+ "blueprint:platform-cloudflare-cron-triggers"
29
+ ],
30
+ "usId": "US-6301",
31
+ "prdId": "PRD-001",
32
+ "reqId": "REQ-063",
33
+ "version": "0.1.0",
34
+ "status": "draft",
35
+ "title": "T-2 soft budget: a handler running past the elicited budget logs cronStalled and continues"
36
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T12:28:02.788Z",
3
+ "updatedAt": "2026-09-07T12:28:02.788Z",
4
+ "asA": "security reviewer reading the applied logging companion's stream",
5
+ "iWant": "every cron lifecycle event record to carry only {event, expression, scheduledTime, outcome, duration} and optional numeric metadata fields; never a handler input, closure or PII substring",
6
+ "soThat": "the logging stream stays safe to ship to any downstream sink without a per-blueprint scrub pass",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-6302-1",
10
+ "description": "The event-secrecy probe drives the dispatcher with a spy handler that receives a PII fixture ({userId, ssn}) via a closure, and drives put/get/delete-style operations on a fixture key. The probe asserts (layer 1) every event record's keys are a subset of the allow-list {event, expression, scheduledTime, outcome, duration, softBudgetMs, deltaMs}; and (layer 2) the JSON serialisation of every record (excluding the expression field, which is a legitimate literal from wrangler.toml) contains no PII substring (userId numeric, ssn placeholder). SIMULATE_PII_LEAK=true injects a wrapper sink that forwards the closure onto the record; the probe surfaces the forbidden keys and the leaked substrings and returns aggregateVerdict: fail.",
11
+ "given": "the event-secrecy probe run under both modes",
12
+ "when": "the shipped code path runs without the switch; the mutation-path runs with SIMULATE_PII_LEAK=true",
13
+ "then": "shipped: aggregateVerdict pass with zero forbidden keys and zero PII hits. Switch on: aggregateVerdict fail with the leaked fields named.",
14
+ "testable": true,
15
+ "scope": "runtime"
16
+ }
17
+ ],
18
+ "tags": [
19
+ "blueprint:platform-cloudflare-cron-triggers"
20
+ ],
21
+ "usId": "US-6302",
22
+ "prdId": "PRD-001",
23
+ "reqId": "REQ-063",
24
+ "version": "0.1.0",
25
+ "status": "draft",
26
+ "title": "T-2 event secrecy: every scheduled-side event record carries only metadata; no closure or PII"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T14:11:53.037Z",
3
+ "updatedAt": "2026-09-07T14:13:26.508Z",
4
+ "usId": "US-7001",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-070",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-3 DO facade opens against env.CELL and env.HUB and emits namespaceReady",
10
+ "asA": "shelf consumer applying the platform-cloudflare-durable-objects v1.0.0 blueprint on a Workers project using the cf-platform fixture",
11
+ "iWant": "one DO facade module (src/do-facade.mjs) that opens against env.CELL and env.HUB on boot, wires the injected event sink and emits a namespaceReady lifecycle event with a metadata-only payload",
12
+ "soThat": "boot ordering is observable, the DO namespace seam is a single call site, and the applied project can compose its own bootstrapping around one predictable event",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-7001-1",
16
+ "description": "On process boot, createDoFacadeInProcess (the in-process seam over the shipped facade code path) wires the injected event sink and emits a namespaceReady event on the sink with a payload of exactly {event, key, size, ttl, timestamp} where key is null, size is 0 and ttl is null. facade.cell(name) and facade.hub(name) return the registered SingleCellObject and HubObject instances.",
17
+ "given": "a facade wired with in-process SingleCellObject and HubObject instances and a spy event sink",
18
+ "when": "the facade ready() call resolves",
19
+ "then": "a namespaceReady event fires exactly once on the sink with the metadata-only payload; the registered handles return the instances",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-durable-objects"
26
+ ]
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "createdAt": "2026-09-07T14:11:54.952Z",
3
+ "updatedAt": "2026-09-07T14:13:26.508Z",
4
+ "usId": "US-7002",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-070",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "T-3 real-account storage smoke records accountBoundSkipped without env var",
10
+ "asA": "operator validating platform-cloudflare-durable-objects v1.0.0 against a real Cloudflare account",
11
+ "iWant": "the real-account-storage-smoke probe to record accountBoundSkipped and aggregate to pass when CI_HAS_CLOUDFLARE_ACCOUNT is unset",
12
+ "soThat": "the shipped account-bound seam matches the Clerk pattern (skip-in-CI when no account, run when one is available) per spec section 3.5",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-7002-1",
16
+ "description": "The real-account-storage-smoke probe with CI_HAS_CLOUDFLARE_ACCOUNT unset returns a single result with anchorAcId AC-33112-1 and verdict pass; the report carries accountBoundSkipped=true and aggregates to pass; exit code 0. With CI_HAS_CLOUDFLARE_ACCOUNT=true but any of CF_ACCOUNT_ID, CF_DO_NAMESPACE_ID or CF_API_TOKEN missing, the probe returns fail naming the missing keys.",
17
+ "given": "the real-account-storage-smoke probe module",
18
+ "when": "run without CI_HAS_CLOUDFLARE_ACCOUNT, and then with the env var but no paired creds",
19
+ "then": "the first run reports accountBoundSkipped and passes; the second reports the missing keys and fails",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ }
23
+ ],
24
+ "tags": [
25
+ "blueprint:platform-cloudflare-durable-objects"
26
+ ]
27
+ }