rcf-lite 0.23.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 (474) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/blueprints/application-account-settings/docs/topics.md +7 -1
  3. package/blueprints/application-admin-console/CHANGELOG.md +12 -0
  4. package/blueprints/application-admin-console/blueprint.json +34 -1
  5. package/blueprints/application-admin-console/contributions/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +25 -0
  6. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-014.json +17 -0
  7. package/blueprints/application-admin-console/contributions/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +32 -0
  8. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21815.json +27 -0
  9. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21816.json +27 -0
  10. package/blueprints/application-admin-console/docs/topics.md +7 -1
  11. package/blueprints/application-admin-console/guide/application-admin-console.md +24 -0
  12. package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +26 -1
  13. package/blueprints/application-api-rest/docs/topics.md +7 -1
  14. package/blueprints/application-charts/docs/topics.md +7 -1
  15. package/blueprints/application-dashboard/docs/topics.md +7 -1
  16. package/blueprints/application-datatable/docs/topics.md +7 -1
  17. package/blueprints/application-empty-error-states/docs/topics.md +7 -1
  18. package/blueprints/application-error-handling/docs/topics.md +7 -1
  19. package/blueprints/application-file-upload/docs/topics.md +7 -1
  20. package/blueprints/application-forms-wizard/docs/topics.md +7 -1
  21. package/blueprints/application-notifications-in-app/docs/topics.md +7 -1
  22. package/blueprints/application-onboarding-tour/docs/topics.md +7 -1
  23. package/blueprints/application-spa/docs/topics.md +7 -1
  24. package/blueprints/delivery-ci-workflows/docs/topics.md +7 -1
  25. package/blueprints/deploy-cloudflare-workers/docs/topics.md +7 -1
  26. package/blueprints/edge-cloudflare-access/CHANGELOG.md +23 -0
  27. package/blueprints/edge-cloudflare-access/README.md +141 -0
  28. package/blueprints/edge-cloudflare-access/blueprint.json +197 -0
  29. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3501-edge-cloudflare-access-jwt-gate.json +14 -0
  30. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3502-edge-cloudflare-access-identity-provider.json +25 -0
  31. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3503-edge-cloudflare-access-policy-scope.json +12 -0
  32. package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3504-edge-cloudflare-access-audit-retention.json +12 -0
  33. package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +100 -0
  34. package/blueprints/edge-cloudflare-access/contributions/probes/audit-event-secrecy.mjs +70 -0
  35. package/blueprints/edge-cloudflare-access/contributions/probes/jwt-validator-fixture.mjs +63 -0
  36. package/blueprints/edge-cloudflare-access/contributions/probes/jwt-validator-reject.mjs +95 -0
  37. package/blueprints/edge-cloudflare-access/contributions/probes/probe-utils.mjs +90 -0
  38. package/blueprints/edge-cloudflare-access/contributions/probes/real-account-gated-url.mjs +65 -0
  39. package/blueprints/edge-cloudflare-access/contributions/probes/run-admin-console-gate-surface.mjs +5 -0
  40. package/blueprints/edge-cloudflare-access/contributions/probes/run-audit-event-secrecy.mjs +5 -0
  41. package/blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-fixture.mjs +5 -0
  42. package/blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-reject.mjs +5 -0
  43. package/blueprints/edge-cloudflare-access/contributions/probes/run-real-account-gated-url.mjs +5 -0
  44. package/blueprints/edge-cloudflare-access/contributions/probes/run-wrangler-seam.mjs +5 -0
  45. package/blueprints/edge-cloudflare-access/contributions/probes/wrangler-seam.mjs +203 -0
  46. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-001.json +17 -0
  47. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-002.json +17 -0
  48. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-003.json +17 -0
  49. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-004.json +17 -0
  50. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-005.json +17 -0
  51. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-006.json +18 -0
  52. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3501-edge-cloudflare-access-jwt-validator.json +31 -0
  53. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3502-edge-cloudflare-access-application-declaration.json +33 -0
  54. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3503-edge-cloudflare-access-policy-shape.json +25 -0
  55. package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3504-edge-cloudflare-access-audit-sink.json +25 -0
  56. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34101.json +27 -0
  57. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34102.json +28 -0
  58. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34103.json +27 -0
  59. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34104.json +27 -0
  60. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34105.json +27 -0
  61. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34106.json +27 -0
  62. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34107.json +27 -0
  63. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34108.json +27 -0
  64. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34109.json +27 -0
  65. package/blueprints/edge-cloudflare-access/docs/topics.md +68 -0
  66. package/blueprints/edge-cloudflare-access/guide/edge-cloudflare-access.md +180 -0
  67. package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +10 -0
  68. package/blueprints/edge-cloudflare-rate-limiting/README.md +73 -0
  69. package/blueprints/edge-cloudflare-rate-limiting/blueprint.json +174 -0
  70. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3701-edge-cloudflare-rate-limiting-throttle-contract.json +14 -0
  71. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3702-edge-cloudflare-rate-limiting-layering.json +14 -0
  72. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3703-edge-cloudflare-rate-limiting-manifest-shape.json +14 -0
  73. package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3704-edge-cloudflare-rate-limiting-drift-audit-cadence.json +14 -0
  74. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/event-secrecy.mjs +104 -0
  75. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/manifest-presence.mjs +95 -0
  76. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/manifest-schema-validate.mjs +130 -0
  77. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/probe-utils.mjs +111 -0
  78. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/real-account-burst-and-429.mjs +104 -0
  79. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-event-secrecy.mjs +5 -0
  80. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-manifest-presence.mjs +5 -0
  81. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-manifest-schema-validate.mjs +5 -0
  82. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-real-account-burst-and-429.mjs +5 -0
  83. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-001.json +17 -0
  84. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-002.json +17 -0
  85. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-003.json +17 -0
  86. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-004.json +17 -0
  87. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-005.json +17 -0
  88. package/blueprints/edge-cloudflare-rate-limiting/contributions/schemas/rate-limit-rule.schema.json +67 -0
  89. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +31 -0
  90. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3702-edge-cloudflare-rate-limiting-management-surface-doc.json +25 -0
  91. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +26 -0
  92. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36101.json +27 -0
  93. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36102.json +27 -0
  94. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36103.json +27 -0
  95. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36104.json +27 -0
  96. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36105.json +27 -0
  97. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36106.json +27 -0
  98. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36107.json +27 -0
  99. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36108.json +27 -0
  100. package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +68 -0
  101. package/blueprints/edge-cloudflare-rate-limiting/guide/edge-cloudflare-rate-limiting.md +88 -0
  102. package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +20 -0
  103. package/blueprints/edge-cloudflare-turnstile/README.md +95 -0
  104. package/blueprints/edge-cloudflare-turnstile/blueprint.json +161 -0
  105. package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3601-edge-cloudflare-turnstile-verifier-contract.json +14 -0
  106. package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3602-edge-cloudflare-turnstile-widget-mode.json +14 -0
  107. package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3603-edge-cloudflare-turnstile-refuse-shape.json +14 -0
  108. package/blueprints/edge-cloudflare-turnstile/contributions/probes/event-secrecy.mjs +51 -0
  109. package/blueprints/edge-cloudflare-turnstile/contributions/probes/guard-shape-scan.mjs +48 -0
  110. package/blueprints/edge-cloudflare-turnstile/contributions/probes/probe-utils.mjs +139 -0
  111. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-event-secrecy.mjs +5 -0
  112. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-guard-shape-scan.mjs +5 -0
  113. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-secret-shape-scan.mjs +5 -0
  114. package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-siteverify-fixture.mjs +5 -0
  115. package/blueprints/edge-cloudflare-turnstile/contributions/probes/secret-shape-scan.mjs +77 -0
  116. package/blueprints/edge-cloudflare-turnstile/contributions/probes/siteverify-fixture.mjs +53 -0
  117. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-001.json +17 -0
  118. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-002.json +17 -0
  119. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-003.json +17 -0
  120. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-004.json +17 -0
  121. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-005.json +17 -0
  122. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +26 -0
  123. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +36 -0
  124. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3603-edge-cloudflare-turnstile-magic-link-hook.json +25 -0
  125. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35101.json +27 -0
  126. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35102.json +27 -0
  127. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35103.json +27 -0
  128. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35104.json +27 -0
  129. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35105.json +36 -0
  130. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35106.json +27 -0
  131. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35107.json +27 -0
  132. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35108.json +27 -0
  133. package/blueprints/edge-cloudflare-turnstile/docs/topics.md +68 -0
  134. package/blueprints/edge-cloudflare-turnstile/guide/edge-cloudflare-turnstile.md +104 -0
  135. package/blueprints/edge-cloudflare-turnstile/probe-packs/edge-cloudflare-turnstile.pack.mjs +146 -0
  136. package/blueprints/email-smtp-resend/docs/topics.md +7 -1
  137. package/blueprints/jobs-background/docs/topics.md +7 -1
  138. package/blueprints/messaging-queue-cloudflare/docs/topics.md +7 -1
  139. package/blueprints/object-storage-s3/docs/topics.md +7 -1
  140. package/blueprints/observability-essentials/docs/topics.md +7 -1
  141. package/blueprints/observability-logging/docs/topics.md +7 -1
  142. package/blueprints/observability-probe-endpoints/docs/topics.md +7 -1
  143. package/blueprints/persistence-data-d1/docs/topics.md +7 -1
  144. package/blueprints/persistence-data-postgres/docs/topics.md +7 -1
  145. package/blueprints/persistence-data-sqlite/docs/topics.md +7 -1
  146. package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +22 -0
  147. package/blueprints/platform-cloudflare-cron-triggers/README.md +117 -0
  148. package/blueprints/platform-cloudflare-cron-triggers/blueprint.json +85 -0
  149. package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3301-platform-cloudflare-cron-triggers-scheduled-trigger-contract.json +14 -0
  150. package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3302-platform-cloudflare-cron-triggers-dispatcher-mode.json +14 -0
  151. package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3303-platform-cloudflare-cron-triggers-skew-tolerance-default.json +14 -0
  152. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/dispatcher-routing.mjs +64 -0
  153. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/event-secrecy.mjs +100 -0
  154. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/probe-utils.mjs +70 -0
  155. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/real-account-scheduled-smoke.mjs +100 -0
  156. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-dispatcher-routing.mjs +5 -0
  157. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-event-secrecy.mjs +5 -0
  158. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-real-account-scheduled-smoke.mjs +5 -0
  159. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-skew-tolerance.mjs +5 -0
  160. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-wrangler-test-scheduled.mjs +5 -0
  161. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/skew-tolerance.mjs +130 -0
  162. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/wrangler-test-scheduled.mjs +129 -0
  163. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-001.json +17 -0
  164. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-002.json +17 -0
  165. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-003.json +17 -0
  166. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-004.json +17 -0
  167. package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3301-platform-cloudflare-cron-triggers-scheduled-handler.json +22 -0
  168. package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3302-platform-cloudflare-cron-triggers-expression-router.json +22 -0
  169. package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3303-platform-cloudflare-cron-triggers-event-sink.json +21 -0
  170. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32101.json +25 -0
  171. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32102.json +34 -0
  172. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32103.json +34 -0
  173. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32104.json +34 -0
  174. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32105.json +25 -0
  175. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32106.json +25 -0
  176. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32107.json +25 -0
  177. package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +71 -0
  178. package/blueprints/platform-cloudflare-cron-triggers/guide/platform-cloudflare-cron-triggers.md +119 -0
  179. package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +23 -0
  180. package/blueprints/platform-cloudflare-durable-objects/README.md +200 -0
  181. package/blueprints/platform-cloudflare-durable-objects/blueprint.json +243 -0
  182. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3401-platform-cloudflare-durable-objects-single-cell-contract.json +14 -0
  183. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3402-platform-cloudflare-durable-objects-websocket-hub-contract.json +14 -0
  184. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3403-platform-cloudflare-durable-objects-storage-backend.json +14 -0
  185. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3404-platform-cloudflare-durable-objects-migrations-shape.json +14 -0
  186. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3405-platform-cloudflare-durable-objects-hibernation-posture.json +14 -0
  187. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/alarm-fires-once.mjs +63 -0
  188. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/namespace-facade-ready.mjs +60 -0
  189. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/probe-utils.mjs +105 -0
  190. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs +58 -0
  191. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-alarm-fires-once.mjs +5 -0
  192. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-namespace-facade-ready.mjs +5 -0
  193. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-real-account-storage-smoke.mjs +5 -0
  194. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-single-cell-concurrent-increment.mjs +5 -0
  195. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-sole-reader-scan.mjs +5 -0
  196. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-storage-round-trip.mjs +5 -0
  197. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-websocket-hub-broadcast.mjs +5 -0
  198. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-wrangler-seam.mjs +5 -0
  199. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/single-cell-concurrent-increment.mjs +56 -0
  200. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/sole-reader-scan.mjs +117 -0
  201. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/storage-round-trip.mjs +87 -0
  202. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/websocket-hub-broadcast.mjs +112 -0
  203. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/wrangler-seam.mjs +257 -0
  204. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-001.json +17 -0
  205. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-002.json +17 -0
  206. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-003.json +17 -0
  207. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-004.json +17 -0
  208. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-005.json +17 -0
  209. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-006.json +17 -0
  210. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-007.json +17 -0
  211. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-008.json +17 -0
  212. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3401-platform-cloudflare-durable-objects-namespace-facade.json +31 -0
  213. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3402-platform-cloudflare-durable-objects-single-cell-shape.json +30 -0
  214. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3403-platform-cloudflare-durable-objects-alarm-handler.json +29 -0
  215. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3404-platform-cloudflare-durable-objects-websocket-hub.json +31 -0
  216. package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3405-platform-cloudflare-durable-objects-event-sink.json +24 -0
  217. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33101.json +27 -0
  218. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33102.json +27 -0
  219. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33103.json +27 -0
  220. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33104.json +27 -0
  221. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33105.json +27 -0
  222. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33106.json +27 -0
  223. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33107.json +27 -0
  224. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33108.json +27 -0
  225. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33109.json +27 -0
  226. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33110.json +27 -0
  227. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33111.json +27 -0
  228. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33112.json +27 -0
  229. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33113.json +25 -0
  230. package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +73 -0
  231. package/blueprints/platform-cloudflare-durable-objects/guide/platform-cloudflare-durable-objects.md +237 -0
  232. package/blueprints/platform-cloudflare-kv/CHANGELOG.md +21 -0
  233. package/blueprints/platform-cloudflare-kv/README.md +159 -0
  234. package/blueprints/platform-cloudflare-kv/blueprint.json +87 -0
  235. package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3201-platform-cloudflare-kv-key-value-store-contract.json +14 -0
  236. package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3202-platform-cloudflare-kv-default-cache-ttl.json +14 -0
  237. package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3203-platform-cloudflare-kv-key-naming-convention.json +14 -0
  238. package/blueprints/platform-cloudflare-kv/contributions/probes/cache-aside-hit-then-miss.mjs +82 -0
  239. package/blueprints/platform-cloudflare-kv/contributions/probes/event-secrecy.mjs +102 -0
  240. package/blueprints/platform-cloudflare-kv/contributions/probes/facade-round-trip.mjs +92 -0
  241. package/blueprints/platform-cloudflare-kv/contributions/probes/list-with-prefix.mjs +52 -0
  242. package/blueprints/platform-cloudflare-kv/contributions/probes/probe-utils.mjs +73 -0
  243. package/blueprints/platform-cloudflare-kv/contributions/probes/real-account-eventual-consistency-smoke.mjs +102 -0
  244. package/blueprints/platform-cloudflare-kv/contributions/probes/run-cache-aside-hit-then-miss.mjs +5 -0
  245. package/blueprints/platform-cloudflare-kv/contributions/probes/run-event-secrecy.mjs +5 -0
  246. package/blueprints/platform-cloudflare-kv/contributions/probes/run-facade-round-trip.mjs +5 -0
  247. package/blueprints/platform-cloudflare-kv/contributions/probes/run-list-with-prefix.mjs +5 -0
  248. package/blueprints/platform-cloudflare-kv/contributions/probes/run-real-account-eventual-consistency-smoke.mjs +5 -0
  249. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-001.json +18 -0
  250. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-002.json +18 -0
  251. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-003.json +18 -0
  252. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-004.json +18 -0
  253. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-005.json +18 -0
  254. package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3201-platform-cloudflare-kv-facade.json +27 -0
  255. package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3202-platform-cloudflare-kv-cache-aside.json +26 -0
  256. package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3203-platform-cloudflare-kv-event-sink.json +25 -0
  257. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31101.json +27 -0
  258. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31102.json +27 -0
  259. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31103.json +36 -0
  260. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31104.json +27 -0
  261. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31105.json +27 -0
  262. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31106.json +27 -0
  263. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31107.json +27 -0
  264. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31108.json +27 -0
  265. package/blueprints/platform-cloudflare-kv/docs/topics.md +71 -0
  266. package/blueprints/platform-cloudflare-kv/guide/platform-cloudflare-kv.md +138 -0
  267. package/blueprints/security-auth-clerk/docs/topics.md +7 -1
  268. package/blueprints/security-auth-keycloak/docs/topics.md +7 -1
  269. package/blueprints/security-auth-magic-link/docs/topics.md +7 -1
  270. package/blueprints/security-auth-oauth2/docs/topics.md +7 -1
  271. package/blueprints/security-secrets-management/docs/topics.md +7 -1
  272. package/fixtures/canary-manifest.json +6 -6
  273. package/package.json +1 -1
  274. package/rcf/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +13 -0
  275. package/rcf/adrs/adr-3501-edge-cloudflare-access-jwt-gate.json +13 -0
  276. package/rcf/adrs/adr-3502-edge-cloudflare-access-identity-provider.json +13 -0
  277. package/rcf/adrs/adr-3503-edge-cloudflare-access-policy-scope.json +13 -0
  278. package/rcf/adrs/adr-3504-edge-cloudflare-access-audit-retention.json +13 -0
  279. package/rcf/adrs/adr-3601-edge-cloudflare-turnstile-verifier-contract.json +13 -0
  280. package/rcf/adrs/adr-3602-edge-cloudflare-turnstile-widget-mode.json +13 -0
  281. package/rcf/adrs/adr-3603-edge-cloudflare-turnstile-refuse-shape.json +13 -0
  282. package/rcf/adrs/adr-3701-edge-cloudflare-rate-limiting-throttle-contract.json +13 -0
  283. package/rcf/adrs/adr-3702-edge-cloudflare-rate-limiting-layering.json +13 -0
  284. package/rcf/adrs/adr-3703-edge-cloudflare-rate-limiting-manifest-shape.json +13 -0
  285. package/rcf/adrs/adr-3704-edge-cloudflare-rate-limiting-drift-audit-cadence.json +13 -0
  286. package/rcf/code-nodes/cn-230.json +13 -0
  287. package/rcf/code-nodes/cn-231.json +14 -0
  288. package/rcf/code-nodes/cn-232.json +13 -0
  289. package/rcf/code-nodes/cn-233.json +14 -0
  290. package/rcf/code-nodes/cn-234.json +13 -0
  291. package/rcf/code-nodes/cn-260.json +21 -0
  292. package/rcf/code-nodes/cn-261.json +14 -0
  293. package/rcf/code-nodes/cn-262.json +18 -0
  294. package/rcf/code-nodes/cn-263.json +12 -0
  295. package/rcf/code-nodes/cn-264.json +13 -0
  296. package/rcf/code-nodes/cn-265.json +15 -0
  297. package/rcf/code-nodes/cn-266.json +12 -0
  298. package/rcf/code-nodes/cn-267.json +12 -0
  299. package/rcf/code-nodes/cn-290.json +21 -0
  300. package/rcf/code-nodes/cn-291.json +12 -0
  301. package/rcf/code-nodes/cn-292.json +13 -0
  302. package/rcf/code-nodes/cn-293.json +13 -0
  303. package/rcf/code-nodes/cn-294.json +13 -0
  304. package/rcf/code-nodes/cn-295.json +12 -0
  305. package/rcf/code-nodes/cn-296.json +12 -0
  306. package/rcf/code-nodes/cn-297.json +12 -0
  307. package/rcf/code-nodes/cn-298.json +12 -0
  308. package/rcf/code-nodes/cn-299.json +12 -0
  309. package/rcf/code-nodes/cn-300.json +12 -0
  310. package/rcf/code-nodes/cn-301.json +14 -0
  311. package/rcf/code-nodes/cn-302.json +12 -0
  312. package/rcf/code-nodes/cn-303.json +12 -0
  313. package/rcf/code-nodes/cn-304.json +21 -0
  314. package/rcf/code-nodes/cn-320.json +20 -0
  315. package/rcf/code-nodes/cn-321.json +14 -0
  316. package/rcf/code-nodes/cn-350.json +19 -0
  317. package/rcf/code-nodes/cn-380.json +19 -0
  318. package/rcf/fbs/fbs-070.json +24 -0
  319. package/rcf/fbs/fbs-080.json +24 -0
  320. package/rcf/fbs/fbs-090.json +24 -0
  321. package/rcf/fbs/fbs-100.json +23 -0
  322. package/rcf/fbs/fbs-101.json +16 -0
  323. package/rcf/fbs/fbs-110.json +23 -0
  324. package/rcf/fbs/fbs-120.json +22 -0
  325. package/rcf/requirements/req-050.json +18 -0
  326. package/rcf/requirements/req-051.json +18 -0
  327. package/rcf/requirements/req-052.json +18 -0
  328. package/rcf/requirements/req-053.json +18 -0
  329. package/rcf/requirements/req-054.json +18 -0
  330. package/rcf/requirements/req-060.json +20 -0
  331. package/rcf/requirements/req-061.json +18 -0
  332. package/rcf/requirements/req-062.json +20 -0
  333. package/rcf/requirements/req-063.json +20 -0
  334. package/rcf/requirements/req-070.json +18 -0
  335. package/rcf/requirements/req-071.json +18 -0
  336. package/rcf/requirements/req-072.json +18 -0
  337. package/rcf/requirements/req-073.json +18 -0
  338. package/rcf/requirements/req-074.json +18 -0
  339. package/rcf/requirements/req-075.json +18 -0
  340. package/rcf/requirements/req-076.json +18 -0
  341. package/rcf/requirements/req-077.json +18 -0
  342. package/rcf/requirements/req-080.json +18 -0
  343. package/rcf/requirements/req-081.json +18 -0
  344. package/rcf/requirements/req-082.json +18 -0
  345. package/rcf/requirements/req-083.json +18 -0
  346. package/rcf/requirements/req-084.json +18 -0
  347. package/rcf/requirements/req-085.json +18 -0
  348. package/rcf/requirements/req-086.json +18 -0
  349. package/rcf/requirements/req-090.json +44 -0
  350. package/rcf/requirements/req-091.json +53 -0
  351. package/rcf/requirements/req-092.json +32 -0
  352. package/rcf/requirements/req-093.json +52 -0
  353. package/rcf/requirements/req-094.json +32 -0
  354. package/rcf/requirements/req-100.json +13 -0
  355. package/rcf/requirements/req-101.json +13 -0
  356. package/rcf/requirements/req-102.json +13 -0
  357. package/rcf/requirements/req-103.json +13 -0
  358. package/rcf/requirements/req-104.json +13 -0
  359. package/rcf/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +15 -0
  360. package/rcf/tacs/tac-3501-edge-cloudflare-access-jwt-validator.json +15 -0
  361. package/rcf/tacs/tac-3502-edge-cloudflare-access-application-declaration.json +15 -0
  362. package/rcf/tacs/tac-3503-edge-cloudflare-access-policy-shape.json +15 -0
  363. package/rcf/tacs/tac-3504-edge-cloudflare-access-audit-sink.json +15 -0
  364. package/rcf/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +15 -0
  365. package/rcf/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +15 -0
  366. package/rcf/tacs/tac-3603-edge-cloudflare-turnstile-magic-link-hook.json +15 -0
  367. package/rcf/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +16 -0
  368. package/rcf/tacs/tac-3702-edge-cloudflare-rate-limiting-management-surface-doc.json +15 -0
  369. package/rcf/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +16 -0
  370. package/rcf/test-suites/ts-052.json +58 -8
  371. package/rcf/test-suites/ts-080.json +22 -0
  372. package/rcf/test-suites/ts-081.json +22 -0
  373. package/rcf/test-suites/ts-082.json +30 -0
  374. package/rcf/test-suites/ts-083.json +22 -0
  375. package/rcf/test-suites/ts-084.json +30 -0
  376. package/rcf/test-suites/ts-085.json +22 -0
  377. package/rcf/test-suites/ts-086.json +22 -0
  378. package/rcf/test-suites/ts-087.json +22 -0
  379. package/rcf/test-suites/ts-090.json +22 -0
  380. package/rcf/test-suites/ts-091.json +22 -0
  381. package/rcf/test-suites/ts-092.json +22 -0
  382. package/rcf/test-suites/ts-093.json +30 -0
  383. package/rcf/test-suites/ts-094.json +30 -0
  384. package/rcf/test-suites/ts-095.json +30 -0
  385. package/rcf/test-suites/ts-096.json +22 -0
  386. package/rcf/test-suites/ts-100.json +22 -0
  387. package/rcf/test-suites/ts-101.json +22 -0
  388. package/rcf/test-suites/ts-102.json +22 -0
  389. package/rcf/test-suites/ts-103.json +22 -0
  390. package/rcf/test-suites/ts-104.json +22 -0
  391. package/rcf/test-suites/ts-105.json +22 -0
  392. package/rcf/test-suites/ts-106.json +22 -0
  393. package/rcf/test-suites/ts-107.json +22 -0
  394. package/rcf/test-suites/ts-108.json +22 -0
  395. package/rcf/test-suites/ts-109.json +22 -0
  396. package/rcf/test-suites/ts-110.json +22 -0
  397. package/rcf/test-suites/ts-111.json +22 -0
  398. package/rcf/test-suites/ts-112.json +22 -0
  399. package/rcf/test-suites/ts-113.json +22 -0
  400. package/rcf/test-suites/ts-114.json +22 -0
  401. package/rcf/test-suites/ts-115.json +22 -0
  402. package/rcf/test-suites/ts-116.json +22 -0
  403. package/rcf/test-suites/ts-117.json +22 -0
  404. package/rcf/test-suites/ts-118.json +22 -0
  405. package/rcf/test-suites/ts-119.json +30 -0
  406. package/rcf/test-suites/ts-120.json +22 -0
  407. package/rcf/test-suites/ts-121.json +22 -0
  408. package/rcf/test-suites/ts-122.json +22 -0
  409. package/rcf/test-suites/ts-123.json +22 -0
  410. package/rcf/test-suites/ts-124.json +22 -0
  411. package/rcf/test-suites/ts-125.json +22 -0
  412. package/rcf/test-suites/ts-126.json +22 -0
  413. package/rcf/test-suites/ts-127.json +22 -0
  414. package/rcf/test-suites/ts-130.json +22 -0
  415. package/rcf/test-suites/ts-131.json +22 -0
  416. package/rcf/test-suites/ts-132.json +22 -0
  417. package/rcf/test-suites/ts-133.json +22 -0
  418. package/rcf/test-suites/ts-134.json +22 -0
  419. package/rcf/test-suites/ts-135.json +22 -0
  420. package/rcf/test-suites/ts-136.json +22 -0
  421. package/rcf/test-suites/ts-137.json +22 -0
  422. package/rcf/user-stories/us-10001.json +23 -0
  423. package/rcf/user-stories/us-10101.json +23 -0
  424. package/rcf/user-stories/us-10201.json +23 -0
  425. package/rcf/user-stories/us-10301.json +23 -0
  426. package/rcf/user-stories/us-10401.json +23 -0
  427. package/rcf/user-stories/us-10601.json +23 -0
  428. package/rcf/user-stories/us-10701.json +23 -0
  429. package/rcf/user-stories/us-10801.json +23 -0
  430. package/rcf/user-stories/us-5001.json +27 -0
  431. package/rcf/user-stories/us-5002.json +27 -0
  432. package/rcf/user-stories/us-5101.json +36 -0
  433. package/rcf/user-stories/us-5102.json +27 -0
  434. package/rcf/user-stories/us-5201.json +36 -0
  435. package/rcf/user-stories/us-5301.json +27 -0
  436. package/rcf/user-stories/us-5302.json +27 -0
  437. package/rcf/user-stories/us-5401.json +27 -0
  438. package/rcf/user-stories/us-6001.json +27 -0
  439. package/rcf/user-stories/us-6002.json +27 -0
  440. package/rcf/user-stories/us-6003.json +27 -0
  441. package/rcf/user-stories/us-6101.json +36 -0
  442. package/rcf/user-stories/us-6201.json +36 -0
  443. package/rcf/user-stories/us-6301.json +36 -0
  444. package/rcf/user-stories/us-6302.json +27 -0
  445. package/rcf/user-stories/us-7001.json +27 -0
  446. package/rcf/user-stories/us-7002.json +27 -0
  447. package/rcf/user-stories/us-7101.json +27 -0
  448. package/rcf/user-stories/us-7201.json +27 -0
  449. package/rcf/user-stories/us-7301.json +27 -0
  450. package/rcf/user-stories/us-7401.json +27 -0
  451. package/rcf/user-stories/us-7402.json +27 -0
  452. package/rcf/user-stories/us-7501.json +27 -0
  453. package/rcf/user-stories/us-7601.json +27 -0
  454. package/rcf/user-stories/us-7701.json +27 -0
  455. package/rcf/user-stories/us-8001.json +24 -0
  456. package/rcf/user-stories/us-8002.json +24 -0
  457. package/rcf/user-stories/us-8003.json +24 -0
  458. package/rcf/user-stories/us-8101.json +24 -0
  459. package/rcf/user-stories/us-8201.json +24 -0
  460. package/rcf/user-stories/us-8301.json +24 -0
  461. package/rcf/user-stories/us-8401.json +24 -0
  462. package/rcf/user-stories/us-8501.json +24 -0
  463. package/rcf/user-stories/us-8502.json +24 -0
  464. package/rcf/user-stories/us-8601.json +24 -0
  465. package/rcf/user-stories/us-8602.json +24 -0
  466. package/rcf/user-stories/us-9001.json +27 -0
  467. package/rcf/user-stories/us-9002.json +27 -0
  468. package/rcf/user-stories/us-9101.json +27 -0
  469. package/rcf/user-stories/us-9102.json +27 -0
  470. package/rcf/user-stories/us-9201.json +27 -0
  471. package/rcf/user-stories/us-9301.json +27 -0
  472. package/rcf/user-stories/us-9302.json +27 -0
  473. package/rcf/user-stories/us-9401.json +27 -0
  474. package/releases/releases.yaml +11 -1
@@ -0,0 +1,22 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:31.243Z",
3
+ "updatedAt": "2026-09-07T21:41:31.532Z",
4
+ "purpose": "Cover AC-10701-1 via the T-6 anatomy test in test/blueprint/edge-cloudflare-rate-limiting-anatomy.test.js.",
5
+ "testLevel": "integration",
6
+ "acIds": [
7
+ "AC-10701-1"
8
+ ],
9
+ "id": "TS-136",
10
+ "usId": "US-10701",
11
+ "title": "T-6 AC-10701-1 anatomy proof",
12
+ "testCases": [
13
+ {
14
+ "id": "TC-136-event-secrecy-pass-and-leak",
15
+ "acId": "AC-10701-1",
16
+ "description": "AC-10701-1 anatomy proof (T-6 rate-limiting slice, TC-136-event-secrecy-pass-and-leak)",
17
+ "status": "pending",
18
+ "testPointer": "test/blueprint/edge-cloudflare-rate-limiting-anatomy.test.js::T-6 rate-limiting AC-10701-1 anatomy proof (TC-136-event-secrecy-pass-and-leak)"
19
+ }
20
+ ],
21
+ "status": "draft"
22
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:31.821Z",
3
+ "updatedAt": "2026-09-07T21:41:32.111Z",
4
+ "purpose": "Cover AC-10801-1 via the T-6 anatomy test in test/blueprint/edge-cloudflare-rate-limiting-anatomy.test.js.",
5
+ "testLevel": "integration",
6
+ "acIds": [
7
+ "AC-10801-1"
8
+ ],
9
+ "id": "TS-137",
10
+ "usId": "US-10801",
11
+ "title": "T-6 AC-10801-1 anatomy proof",
12
+ "testCases": [
13
+ {
14
+ "id": "TC-137-manifest-presence-missing-fail",
15
+ "acId": "AC-10801-1",
16
+ "description": "AC-10801-1 anatomy proof (T-6 rate-limiting slice, TC-137-manifest-presence-missing-fail)",
17
+ "status": "pending",
18
+ "testPointer": "test/blueprint/edge-cloudflare-rate-limiting-anatomy.test.js::T-6 rate-limiting AC-10801-1 anatomy proof (TC-137-manifest-presence-missing-fail)"
19
+ }
20
+ ],
21
+ "status": "draft"
22
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:02.422Z",
3
+ "updatedAt": "2026-09-07T21:41:02.422Z",
4
+ "asA": "shelf consumer applying the edge-cloudflare-rate-limiting v1.0.0 blueprint on a Workers project using the cf-edge fixture",
5
+ "iWant": "the elicited manifest directory to hold at least one committed JSON file per rate-limit rule, each carrying the seven documented fields and no plaintext secret",
6
+ "soThat": "the rules are source-controlled and reviewable and the operator has a stable source of truth to apply to the live zone",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10001-1",
10
+ "description": "The cf-edge fixture's cloudflare/rate-limits/ directory holds at least one JSON file per rule; every file parses; every file carries id, expression, threshold, period, characteristics, action, duration; no file body carries a plaintext bearer token, private key or inline CF_API_TOKEN reference.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3701-edge-cloudflare-rate-limiting-manifest-schema"
16
+ ],
17
+ "usId": "US-10001",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-100",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 rate-limit manifest present in cf-edge cloudflare/rate-limits/ carrying seven required fields without plaintext secrets"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:02.760Z",
3
+ "updatedAt": "2026-09-07T21:41:02.760Z",
4
+ "asA": "operator on the applying project preparing to push rate-limit rules from the local manifest to the live Cloudflare zone",
5
+ "iWant": "a documented flow with both wrangler command steps and a Cloudflare dashboard walkthrough",
6
+ "soThat": "I can pick the flow that suits my operating discipline and reproduce the apply from the manifest",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10101-1",
10
+ "description": "The blueprint guide documents an operator-facing management surface with a wrangler command flow and a Cloudflare dashboard flow; the guide references https://developers.cloudflare.com/waf/rate-limiting-rules/.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3702-edge-cloudflare-rate-limiting-management-surface-doc"
16
+ ],
17
+ "usId": "US-10101",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-101",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 operator-facing management surface: wrangler command flow and Cloudflare dashboard flow documented in the guide"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:03.086Z",
3
+ "updatedAt": "2026-09-07T21:41:03.086Z",
4
+ "asA": "operator running the real-account burst probe against a scheduled HQ-owned URL",
5
+ "iWant": "the probe to fire an undici burst above the rule threshold and observe the (N+1)th and subsequent requests return HTTP 429 with Retry-After and Cf-Ray, or record accountBoundSkipped in CI",
6
+ "soThat": "the over-threshold behaviour is verified against a real Cloudflare account when the account is available, and CI without an account records the honest verdict per ruling 6",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10201-1",
10
+ "description": "With CI_HAS_CLOUDFLARE_ACCOUNT=true and CF_RATE_LIMIT_URL set, the burst probe returns 429 with Retry-After and Cf-Ray on over-threshold requests; without either env var it records accountBoundSkipped: true and aggregates to pass per spec section 3.5 and ruling 6.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3701-edge-cloudflare-rate-limiting-manifest-schema"
16
+ ],
17
+ "usId": "US-10201",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-102",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 real-account burst returns 429 with Retry-After and Cf-Ray on over-threshold requests, or accountBoundSkipped in CI per ruling 6"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:03.411Z",
3
+ "updatedAt": "2026-09-07T21:41:03.411Z",
4
+ "asA": "operator on the applying project running the scheduled drift-audit runner behind the elicited cadence",
5
+ "iWant": "the runner to fetch the live rules via the Cloudflare API and diff each against the local manifest, constructing metadata-only drift records",
6
+ "soThat": "manifest drift is surfaced through the logging companion rather than lingering unnoticed",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10301-1",
10
+ "description": "Given a fixture manifest with threshold 60 and a fake live-zone response with threshold 90 on the same rule id, the runner constructs one drift record with {ruleId, clientIpHash, outcome, timestamp, diff:[{field:threshold, manifestValue:60, liveValue:90}]}; no full IP, body or user-agent field is present.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3703-edge-cloudflare-rate-limiting-drift-audit-runner"
16
+ ],
17
+ "usId": "US-10301",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-103",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 drift-audit runner reads live rules and diffs against manifest, constructing metadata-only drift records"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:03.736Z",
3
+ "updatedAt": "2026-09-07T21:41:03.736Z",
4
+ "asA": "operator applying both edge-cloudflare-rate-limiting and security-auth-magic-link on the same project",
5
+ "iWant": "the guide to name the ADR-3702 layering explicitly with a copy-paste example",
6
+ "soThat": "I understand the two-rule shape at apply time rather than by trial and error",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10401-1",
10
+ "description": "The guide contains a Composition with security-auth-magic-link section referencing ADR-3702, naming the two characteristic sets (IP-per-URL and per-email per-minute) verbatim, and showing a copy-paste example of both blueprints applied.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3702-edge-cloudflare-rate-limiting-management-surface-doc"
16
+ ],
17
+ "usId": "US-10401",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-104",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 composition with security-auth-magic-link: zone rule layers over the per-email application rule per ADR-3702, documented in the guide"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:04.062Z",
3
+ "updatedAt": "2026-09-07T21:41:04.062Z",
4
+ "asA": "operator committing new rate-limit rule files under the elicited manifest directory",
5
+ "iWant": "the shipped JSON Schema to validate every rule file and the manifest-schema-validate probe to surface any file that violates the shape",
6
+ "soThat": "invalid manifest changes are caught in the fixture probe rather than at operator apply time",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10601-1",
10
+ "description": "The manifest-schema-validate probe validates every manifest file against the shipped rate-limit-rule.schema.json (draft-07); valid files pass; a manifest file missing threshold (SIMULATE_SCHEMA_INVALID=true) fails validation with the offending field named in the detail.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3701-edge-cloudflare-rate-limiting-manifest-schema"
16
+ ],
17
+ "usId": "US-10601",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-100",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 manifest schema validates every rule file against the shipped draft-07 schema and refuses invalid shapes"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:04.389Z",
3
+ "updatedAt": "2026-09-07T21:41:04.389Z",
4
+ "asA": "operator reading drift-audit reports and rate-limit event records through the applied logging companion",
5
+ "iWant": "every drift-audit record to carry only metadata-safe fields, never a full IP, request body or user agent string",
6
+ "soThat": "the audit trail is safe to store, forward and read without additional PII scrubbing",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10701-1",
10
+ "description": "The event-secrecy probe drives the drift-audit runner with a synthetic input pair; every record carries only {ruleId, clientIpHash, outcome, timestamp, diff}; SIMULATE_EVENT_LEAK_IP=true injects a full IP into the outcome so the probe surfaces the leak.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3703-edge-cloudflare-rate-limiting-drift-audit-runner"
16
+ ],
17
+ "usId": "US-10701",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-103",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 drift-audit event records carry ruleId, clientIpHash, outcome, timestamp, diff only; no full IP, body or user-agent"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T21:41:04.712Z",
3
+ "updatedAt": "2026-09-07T21:41:04.712Z",
4
+ "asA": "operator that accidentally deletes or moves a manifest file",
5
+ "iWant": "the manifest-presence probe to surface the missing file at fixture probe time",
6
+ "soThat": "a manifest under-population defect is caught in CI rather than at operator apply time",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-10801-1",
10
+ "description": "With SIMULATE_MANIFEST_MISSING=true the manifest-presence probe returns aggregateVerdict: fail and names the missing file basename in the detail; without the switch the probe passes.",
11
+ "testable": true
12
+ }
13
+ ],
14
+ "tacIds": [
15
+ "TAC-3701-edge-cloudflare-rate-limiting-manifest-schema"
16
+ ],
17
+ "usId": "US-10801",
18
+ "prdId": "PRD-001",
19
+ "reqId": "REQ-100",
20
+ "version": "0.1.0",
21
+ "status": "draft",
22
+ "title": "T-6 manifest-presence probe refuses a missing manifest file and names the basename in the detail"
23
+ }
@@ -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
+ }