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,17 @@
1
+ {
2
+ "reqId": "edge-cloudflare-access-REQ-003",
3
+ "prdId": "PRD-001",
4
+ "title": "The operator issues a Zero Trust policy via the guide's dashboard walk-through or the alternative API path",
5
+ "description": "The shipped guide documents two paths for issuing the Zero Trust policy that the shipped validator enforces: (1) a screen-by-screen walk-through of the Cloudflare Zero Trust dashboard for the operator picking hostname-scoped or self-hosted applications, per https://developers.cloudflare.com/cloudflare-one/policies/access/; and (2) a curl example against https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps/{app_id}/policies for the operator preferring API automation. The API path is idempotent per Cloudflare's documented semantics; the dashboard path is not.",
6
+ "category": "functional",
7
+ "domain": "edge",
8
+ "priority": "must",
9
+ "rationale": "Ratified in the Cloudflare round 6 spec (2026-09-06 section 5.4). Ships as v1.0.0 of edge-cloudflare-access.",
10
+ "tags": [
11
+ "blueprint:edge-cloudflare-access"
12
+ ],
13
+ "version": "1.0.0",
14
+ "status": "approved",
15
+ "createdAt": "2026-09-07T16:00:00.000Z",
16
+ "updatedAt": "2026-09-07T16:00:00.000Z"
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "reqId": "edge-cloudflare-access-REQ-004",
3
+ "prdId": "PRD-001",
4
+ "title": "The audit event carries only metadata fields (email, outcome, timestamp, path) with no token value and no header names beyond path",
5
+ "description": "Every validate-pass, validate-reject and bypass emits exactly one audit event on the injected sink with the metadata-only shape {email, outcome, timestamp, path}. The record is Object.frozen at the validator boundary so no downstream module can enrich it with a stray token slice or header value. The serialised JSON of every record contains no substring of the JWT (header, payload or signature), no Authorization value, and no header names beyond path.",
6
+ "category": "functional",
7
+ "domain": "edge",
8
+ "priority": "must",
9
+ "rationale": "Ratified in the Cloudflare round 6 spec (2026-09-06 section 5.4). Ships as v1.0.0 of edge-cloudflare-access.",
10
+ "tags": [
11
+ "blueprint:edge-cloudflare-access"
12
+ ],
13
+ "version": "1.0.0",
14
+ "status": "approved",
15
+ "createdAt": "2026-09-07T16:00:00.000Z",
16
+ "updatedAt": "2026-09-07T16:00:00.000Z"
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "reqId": "edge-cloudflare-access-REQ-005",
3
+ "prdId": "PRD-001",
4
+ "title": "Break-glass posture: an elicited bypass-service-auth token pair authenticates CI automation with a distinct audit outcome",
5
+ "description": "The operator elicits a break-glass service-auth id (blueprint.json elicit access-bypass-service-auth-id) and a paired secret delegated to the applied security-secrets-management vault seam. When a request presents CF-Access-Client-Id and CF-Access-Client-Secret matching the elicited pair (or SIMULATE_BYPASS_SERVICE_AUTH forces the code path), the validator observes the pair, records outcome=bypass with the same metadata-only shape, and delegates to the handler with request.auth.email='service:'+id. Without an elicited pair the break-glass code path is disabled.",
6
+ "category": "functional",
7
+ "domain": "edge",
8
+ "priority": "must",
9
+ "rationale": "Ratified in the Cloudflare round 6 spec (2026-09-06 section 5.4). Ships as v1.0.0 of edge-cloudflare-access.",
10
+ "tags": [
11
+ "blueprint:edge-cloudflare-access"
12
+ ],
13
+ "version": "1.0.0",
14
+ "status": "approved",
15
+ "createdAt": "2026-09-07T16:00:00.000Z",
16
+ "updatedAt": "2026-09-07T16:00:00.000Z"
17
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "edge-cloudflare-access-REQ-006",
3
+ "prdId": "PRD-001",
4
+ "title": "Composition with application-admin-console v1.1.0: the sign-in surface flips per applied capability set",
5
+ "description": "When application-admin-console v1.1.0 is applied alongside edge-cloudflare-access, the admin-console reads the appliedCapabilities set at apply-time (via the shipped readAppliedCapabilities helper, the T-5 visual-round mechanism); with zeroTrustGate in the set the admin-console renders the Access-gated sign-in surface (data-surface=access-gated, no [data-surface=local-login], a [data-role=principal-read] with the request.auth email); without zeroTrustGate the admin-console falls back to whatever security-auth-* is applied (data-surface=local-login). The composition is deterministic; the pack check AC-21815-1 on the shipped application-admin-console.pack.mjs enforces the gated branch.",
6
+ "category": "functional",
7
+ "domain": "edge",
8
+ "priority": "must",
9
+ "rationale": "Ratified in the Cloudflare round 6 spec (2026-09-06 section 5.4 plus section 5.4.1 admin-console v1.1.0 delta; spec section 1 ruling 7). Ships as v1.0.0 of edge-cloudflare-access and v1.1.0 of application-admin-console in the same PR (round-4 T-4 capability-minor pattern).",
10
+ "tags": [
11
+ "blueprint:edge-cloudflare-access",
12
+ "blueprint:application-admin-console"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-07T16:00:00.000Z",
17
+ "updatedAt": "2026-09-07T16:00:00.000Z"
18
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "tacId": "TAC-3501-edge-cloudflare-access-jwt-validator",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Access JWT validator with JWKS fetch and cache",
8
+ "purpose": "The single project-side module realising the Access JWT validator middleware. It is the sole reader of the Cf-Access-Jwt-Assertion header per REQ-001. Fetches the JWKS from env.ACCESS_JWKS_URL, caches keys per-kid for the elicited cache window, verifies the JWT against the cached key matching the header's kid, reduces the principal into request.auth as {email, sub, groups} and returns 401 on any validate-failure with a metadata-only audit event on the injected sink. Consumers never touch the header outside this module; the middleware is the one place the vendor surface lives so a future adapter (Google Cloud IAP, Duo Access) slots in without a consumer re-shape.",
9
+ "responsibilities": [
10
+ "Export createAccessValidator({env, eventSink, fetch, clock, bypassServiceAuth}) returning {validate, middleware} matching the Cloudflare Access JWT validation shape (AC-34101-1, AC-34102-1).",
11
+ "Own the ONLY reference to the Cf-Access-Jwt-Assertion header string in the applied source tree (AC-34103-1).",
12
+ "Emit exactly one audit event per validate outcome on the injected sink with the metadata-only shape {email, outcome, timestamp, path} (AC-34106-1).",
13
+ "Recognise the CF-Access-Client-Id / CF-Access-Client-Secret paired headers as break-glass when the elicited bypass-service-auth pair is applied, and route through with outcome=bypass (AC-34107-1)."
14
+ ],
15
+ "internalStructure": "One module (src/jwt-validator.mjs) exporting createAccessValidator. The middleware wires a fetch-shaped JWKS fetcher, a per-kid Map cache with a 60-second TTL and an audit sink boundary. The audit record is Object.frozen at the boundary so a downstream handler cannot enrich it with a stray token slice.",
16
+ "interfaces": [
17
+ {
18
+ "name": "createAccessValidator",
19
+ "kind": "factory",
20
+ "summary": "Access JWT validator factory over env.ACCESS_JWKS_URL and env.ACCESS_AUDIENCE."
21
+ },
22
+ {
23
+ "name": "validator.middleware",
24
+ "kind": "method",
25
+ "summary": "Handler-shaped middleware that either returns a rejection Response or attaches request.auth and returns rejected:false."
26
+ }
27
+ ],
28
+ "dependencies": [],
29
+ "createdAt": "2026-09-07T16:00:00.000Z",
30
+ "updatedAt": "2026-09-07T16:00:00.000Z"
31
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "tacId": "TAC-3502-edge-cloudflare-access-application-declaration",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Access application declaration surface",
8
+ "purpose": "The apply-time surface that captures the operator's Access application declaration: hostname or self-hosted-app id, JWT audience, JWKS URL, policy shape and (optionally) the break-glass service-auth pair. The declaration lands verbatim on rcf/blueprints/edge-cloudflare-access.applied.json so the shipped guide's dashboard walk-through and API alternative both operate on the same values.",
9
+ "responsibilities": [
10
+ "Elicit access-application-host OR access-selfhosted-app-id (exactly one is required at apply).",
11
+ "Elicit access-audience, access-jwks-url and access-policy-shape (from the enum in TAC-3503).",
12
+ "Elicit access-bypass-service-auth-id (blank disables break-glass); delegate the paired secret to the applied security-secrets-management vault seam.",
13
+ "Persist the elicited values on the applied-sidecar for the guide walk-through, the composition read from admin-console v1.1.0 and the sole-reader-scan probe."
14
+ ],
15
+ "internalStructure": "Declarative: the blueprint.json elicits[] block plus the applied-sidecar. The blueprint declares no runtime code path for the declaration surface itself; every consumer of the declaration reads the applied-sidecar via the shared readAppliedCapabilities helper.",
16
+ "interfaces": [
17
+ {
18
+ "name": "rcf/blueprints/edge-cloudflare-access.applied.json",
19
+ "kind": "artifact",
20
+ "summary": "The apply-time sidecar carrying the elicited declaration."
21
+ }
22
+ ],
23
+ "dependencies": [
24
+ {
25
+ "name": "TAC-3503 policy shape enum",
26
+ "kind": "tac",
27
+ "tacId": "TAC-3503-edge-cloudflare-access-policy-shape",
28
+ "description": "The policy-shape elicitation resolves to one of the enum values named in TAC-3503."
29
+ }
30
+ ],
31
+ "createdAt": "2026-09-07T16:00:00.000Z",
32
+ "updatedAt": "2026-09-07T16:00:00.000Z"
33
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "tacId": "TAC-3503-edge-cloudflare-access-policy-shape",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Access policy shape enum and its issuance flow",
8
+ "purpose": "Names the four policy shapes the blueprint supports: email-domain, service-token-only, service-token-plus-email-domain and group-membership. The guide walks each shape through the Cloudflare Zero Trust dashboard and documents the API alternative against api.cloudflare.com/client/v4/accounts/{account_id}/access/apps/{app_id}/policies per https://developers.cloudflare.com/cloudflare-one/policies/access/. A shape outside the enum is refused at apply.",
9
+ "responsibilities": [
10
+ "Enumerate the four shipped policy shapes.",
11
+ "Document the dashboard walk-through and the API alternative for each shape in the guide (AC-34105-1).",
12
+ "Name the audit outcome each shape emits on validate-pass (validated) and validate-reject (missing, expired, invalid)."
13
+ ],
14
+ "internalStructure": "Enum in blueprint.json elicits[]; the applied-sidecar records the operator's choice. The validator does not branch on the policy shape at runtime (the Cloudflare edge enforces the policy); the shape drives the guide's operator flow and the applied-sidecar seam the composition reads.",
15
+ "interfaces": [
16
+ {
17
+ "name": "access-policy-shape elicit",
18
+ "kind": "enum",
19
+ "summary": "email-domain | service-token-only | service-token-plus-email-domain | group-membership."
20
+ }
21
+ ],
22
+ "dependencies": [],
23
+ "createdAt": "2026-09-07T16:00:00.000Z",
24
+ "updatedAt": "2026-09-07T16:00:00.000Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "tacId": "TAC-3504-edge-cloudflare-access-audit-sink",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Access audit sink with metadata-only shape",
8
+ "purpose": "Names the audit-event contract every validator outcome writes through the injected sink. The record shape is exactly {email, outcome, timestamp, path}; the sink boundary Object.freezes the record so a downstream handler cannot enrich it with a stray token slice. Retention and long-term storage are delegated to the applied logging companion per ADR-3504.",
9
+ "responsibilities": [
10
+ "Emit exactly one audit event per validate outcome on the injected sink (AC-34106-1).",
11
+ "Freeze the record at the boundary so no downstream handler can add a token substring or header value (AC-34106-1).",
12
+ "Support four outcomes: validated (pass), missing, expired, invalid (reject) and bypass (break-glass)."
13
+ ],
14
+ "internalStructure": "One helper (auditRecord) inside src/jwt-validator.mjs constructing the frozen four-key record. The sink itself is a caller-supplied function; a production consumer wires this to the applied logging companion (whose retention policy binds).",
15
+ "interfaces": [
16
+ {
17
+ "name": "eventSink",
18
+ "kind": "callback",
19
+ "summary": "A function accepting one audit record per validator outcome."
20
+ }
21
+ ],
22
+ "dependencies": [],
23
+ "createdAt": "2026-09-07T16:00:00.000Z",
24
+ "updatedAt": "2026-09-07T16:00:00.000Z"
25
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34101",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Fixture-signed JWT validates and principal reduces onto request.auth",
8
+ "asA": "shelf consumer applying the edge-cloudflare-access v1.0.0 blueprint on a Workers project using the cf-edge fixture",
9
+ "iWant": "the Cf-Access-Jwt-Assertion header validated against the fixture Access JWKS on every request, the principal reduced into request.auth as {email, sub, groups} and the downstream handler observes 200 with the reduced principal fields",
10
+ "soThat": "the Worker only ever sees authenticated principals and downstream code reads a single stable seam for identity",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34101-1",
14
+ "description": "The JWT validator reads Cf-Access-Jwt-Assertion, verifies against the fixture JWKS (RS256, kid rotation supported by the per-kid cache), reduces the principal into request.auth as {email, sub, groups} and the downstream handler receives a 200 with the reduced principal fields exposed on request.auth.",
15
+ "given": "a Worker fetch handler wired with createAccessValidator(...).middleware and a fixture-signed JWT presented in the Cf-Access-Jwt-Assertion header",
16
+ "when": "the request dispatches through the validator",
17
+ "then": "the validator resolves, attaches {email, sub, groups} onto request.auth and delegates to the handler which returns 200 with the reduced principal reflected on the response body",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3501-edge-cloudflare-access-jwt-validator"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34102",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Missing, expired or mis-signed JWT rejects 401 with a metadata-only audit event",
8
+ "asA": "shelf consumer applying the edge-cloudflare-access v1.0.0 blueprint on a Workers project using the cf-edge fixture",
9
+ "iWant": "requests carrying a missing, expired or mis-signed JWT to reject with 401 and emit exactly one metadata-only audit event on the shipped audit sink",
10
+ "soThat": "unauthenticated traffic cannot reach the downstream handler and every reject is observable without leaking the token value",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34102-1",
14
+ "description": "The three reject subcases (missing header, expired exp, mis-signed) each return HTTP 401 and emit exactly one audit event whose keys are drawn from {email, outcome, timestamp, path} with no token substring, no header names beyond path, and no additional keys.",
15
+ "given": "a Worker fetch handler wired with createAccessValidator(...).middleware and one of the three reject subcases",
16
+ "when": "the request dispatches through the validator",
17
+ "then": "the validator returns 401 and emits one audit event whose outcome is drawn from {missing, expired, invalid} with the allowed-key shape",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3501-edge-cloudflare-access-jwt-validator",
24
+ "TAC-3504-edge-cloudflare-access-audit-sink"
25
+ ],
26
+ "createdAt": "2026-09-07T16:00:00.000Z",
27
+ "updatedAt": "2026-09-07T16:00:00.000Z"
28
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Sole-reader guarantee: src/jwt-validator.mjs is the only module reading the Cf-Access-Jwt-Assertion header",
8
+ "asA": "shelf consumer applying the edge-cloudflare-access v1.0.0 blueprint on a Workers project using the cf-edge fixture",
9
+ "iWant": "only src/jwt-validator.mjs to dereference the Cf-Access-Jwt-Assertion header string in the applied source tree",
10
+ "soThat": "the validator is the single seam and a stray header read in the applied code is a defect the AST scan catches",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34103-1",
14
+ "description": "The sole-reader scan walks the fixture applied source root (src/**/*.mjs), strips comments and string literals, and finds exactly one live-source occurrence of the header string Cf-Access-Jwt-Assertion, in src/jwt-validator.mjs. Any other live-source occurrence in a shipped module fails the probe (SIMULATE_NON_VALIDATOR_HEADER=true injects a second hit and the probe fails).",
15
+ "given": "the cf-edge fixture applied source tree",
16
+ "when": "the sole-reader-scan probe walks src/**/*.mjs",
17
+ "then": "the only live-source hit for Cf-Access-Jwt-Assertion is in src/jwt-validator.mjs",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3501-edge-cloudflare-access-jwt-validator"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Access application declared with elicited hostname or self-hosted-app id and elicited policy shape",
8
+ "asA": "operator applying the edge-cloudflare-access v1.0.0 blueprint",
9
+ "iWant": "the blueprint to elicit either an Access application hostname or a self-hosted-app id (one of the two), plus a policy shape from the enum",
10
+ "soThat": "the apply record captures the exact Access application declaration the operator will issue in the Zero Trust dashboard or over the API",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34104-1",
14
+ "description": "blueprint.json elicits access-application-host (kind string) and access-selfhosted-app-id (kind string; the operator supplies exactly one), plus access-audience (kind string), access-jwks-url (kind string), access-policy-shape (kind enum with options email-domain, service-token-only, service-token-plus-email-domain, group-membership; recommended default email-domain) and access-bypass-service-auth-id (kind string; blank disables break-glass). Applying the blueprint records the elicited values on rcf/blueprints/edge-cloudflare-access.applied.json.",
15
+ "given": "the blueprint.json elicits block",
16
+ "when": "the apply verb runs against a fixture project",
17
+ "then": "rcf/blueprints/edge-cloudflare-access.applied.json carries the elicited values plus appliedCapabilities=[zeroTrustGate]",
18
+ "testable": true,
19
+ "scope": "library"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3502-edge-cloudflare-access-application-declaration"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Guide walks the operator through the Zero Trust dashboard AND documents the API alternative",
8
+ "asA": "operator applying the edge-cloudflare-access v1.0.0 blueprint",
9
+ "iWant": "the guide to walk me through issuing the Zero Trust policy on the Cloudflare dashboard AND to document the alternative API path",
10
+ "soThat": "the policy issuance flow is unambiguous whether I use the dashboard or the API",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34105-1",
14
+ "description": "The shipped guide/edge-cloudflare-access.md carries a section Zero Trust dashboard walk-through with numbered steps naming each screen; and a section API alternative with a curl example against https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps/{app_id}/policies; the vendor URL https://developers.cloudflare.com/cloudflare-one/policies/access/ is cited from ADR-3501 and the guide.",
15
+ "given": "the shipped guide file",
16
+ "when": "the anatomy test greps for the two section headings, the curl example and the vendor URL",
17
+ "then": "each string matches at least once in the file",
18
+ "testable": true,
19
+ "scope": "library"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3503-edge-cloudflare-access-policy-shape"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Audit event carries only email, outcome, timestamp and path with no token value or headers",
8
+ "asA": "shelf consumer applying the edge-cloudflare-access v1.0.0 blueprint on a Workers project using the cf-edge fixture",
9
+ "iWant": "the audit sink to receive only metadata-only records for every validate-pass and validate-reject",
10
+ "soThat": "the audit trail is observable without leaking the JWT, its signature bytes or any request header value",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34106-1",
14
+ "description": "After 5 validate-pass and 5 validate-reject requests the audit sink holds 10 records each carrying exactly {email, outcome, timestamp, path}; the serialised JSON of every record contains no substring of the JWT (header, payload or signature), no Authorization value and no header names beyond path.",
15
+ "given": "the shipped createAccessValidator wired with a spy audit sink and 10 requests (5 pass, 5 reject)",
16
+ "when": "the requests dispatch through the validator",
17
+ "then": "10 sink records, each with allowed keys only, none containing forbidden substrings",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3504-edge-cloudflare-access-audit-sink"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Break-glass posture: an elicited bypass-service-auth pair authenticates CI automation",
8
+ "asA": "operator running CI-signed automation against an Access-gated Worker",
9
+ "iWant": "an elicited bypass-service-auth token pair that the validator recognises and passes through as an authenticated principal",
10
+ "soThat": "CI can hit the gated Worker without a browser flow while every bypass leaves a distinct audit trace",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34107-1",
14
+ "description": "When the request presents the elicited service-auth id and secret (as CF-Access-Client-Id and CF-Access-Client-Secret headers), the validator observes the pair, records outcome=bypass in the audit event with the metadata-only shape, and delegates to the handler as authenticated with request.auth.email='service:'+id. Break-glass is disabled unless the elicited pair is applied.",
15
+ "given": "the createAccessValidator wired with an elicited bypass-service-auth pair and a request presenting the paired headers",
16
+ "when": "the request dispatches through the validator",
17
+ "then": "the handler receives request.auth with the service principal and the audit sink records outcome=bypass with allowed keys only",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3501-edge-cloudflare-access-jwt-validator"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34108",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-006",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Admin-console composition: the sign-in surface flips per applied capability set",
8
+ "asA": "shelf consumer applying both edge-cloudflare-access and application-admin-console v1.1.0",
9
+ "iWant": "the admin-console sign-in surface to flip to Access-gated when zeroTrustGate is applied, and to fall back to the local security-auth-* surface otherwise",
10
+ "soThat": "the composition is deterministic and no local login form leaks into an Access-gated deployment",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34108-1",
14
+ "description": "Two applied combinations are exercised on the extended admin-console fixture: with ?caps=principalDirectory,roleModel,auditLog,zeroTrustGate the sign-in surface renders [data-surface=access-gated] and no [data-surface=local-login] is present; with ?caps=principalDirectory,roleModel,auditLog the sign-in surface renders [data-surface=local-login] and no [data-surface=access-gated] is present. Both combinations exercise the shipped pack check AC-21815-1 on application-admin-console.pack.mjs (pack check fires only on the gated combination).",
15
+ "given": "the extended admin-console pack fixture with the two caps combinations",
16
+ "when": "the pack runs against each combination",
17
+ "then": "AC-21815-1 fires on the gated combination and passes; the existing v1.0.0 surface renders on the non-gated combination and its own checks pass",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3502-edge-cloudflare-access-application-declaration"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "usId": "edge-cloudflare-access-US-34109",
3
+ "prdId": "PRD-001",
4
+ "reqId": "edge-cloudflare-access-REQ-006",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Real-account gated URL round-trip against a scheduled Access-configured hostname",
8
+ "asA": "HQ operator running the real-account gated-URL smoke against a scheduled Access-configured hostname",
9
+ "iWant": "the probe to fire against the hostname when the env vars are present and record accountBoundSkipped when not",
10
+ "soThat": "the mechanism-reach claim is proven on a real Cloudflare Access instance without ever failing the shelf gate on the absence of an account",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-34109-1",
14
+ "description": "With CI_HAS_CLOUDFLARE_ACCOUNT=true and CF_ACCESS_HOST=<hostname>, a plain fetch against https://<hostname>/ follows the redirect chain and terminates at an https://<team>.cloudflareaccess.com/ URL (the Access UI). Without either env var the probe records accountBoundSkipped=true and aggregateVerdict=pass per spec section 3.5.",
15
+ "given": "the run-real-account-gated-url.mjs probe shim and the two env vars",
16
+ "when": "the probe runs",
17
+ "then": "in the CI-with-account path the redirect chain reports cloudflareaccess.com as terminal; in the without-env path accountBoundSkipped is true",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-3502-edge-cloudflare-access-application-declaration"
24
+ ],
25
+ "createdAt": "2026-09-07T16:00:00.000Z",
26
+ "updatedAt": "2026-09-07T16:00:00.000Z"
27
+ }
@@ -0,0 +1,68 @@
1
+ # edge-cloudflare-access blueprint coordination vocabulary
2
+
3
+ This file is the edge-cloudflare-access half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.4.4 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
4
+
5
+ ## Global ADR topics this blueprint contributes (exact strings)
6
+
7
+ | Topic string | edge-cloudflare-access contribution | Origin | Composition note |
8
+ |---|---|---|---|
9
+ | `edgeAuthenticationGate` | ADR-3501-edge-cloudflare-access-jwt-gate | Minted by this blueprint. Names the wire-shape contract for the project-wide edge authentication gate; the shipped answer is a Cloudflare Access Zero-Trust JWT-assertion gate per https://developers.cloudflare.com/cloudflare-one/policies/access/. | The one project-wide decision on the edge authentication gate at the shipped-shape boundary. A future non-Cloudflare sibling (Google Cloud IAP, AWS Verified Access, Duo Beyond) would contribute the same topic string with a different answer, forcing a DELIBERATE conflict the operator resolves with a project-level ADR. |
10
+
11
+ The edge-cloudflare-access blueprint claims one global topic (minted here, shipped as the Cloudflare Access JWT-assertion gate). ADR-3502 identity provider, ADR-3503 policy scope and ADR-3504 audit retention do not contribute global topics; a composing blueprint that holds an opinion on any of them authors its own project-level ADR.
12
+
13
+ Rules for new topics: lower camel case, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer.
14
+
15
+ ## Id number bands (registry bootstrap)
16
+
17
+ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
18
+
19
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
20
+ |---|---|---|---|---|
21
+ | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
22
+ | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
23
+ | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
24
+ | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
25
+ | hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
26
+ | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
27
+ | delivery-ci-workflows | 6101-6899 | 7xx | shipped v2.0.0 (renamed from ci-pipeline) | `ciGates`, `strictCoverageGate`, `releaseArtefacts` |
28
+ | observability-essentials | 7101-7899 | 8xx | shipped v2.0.0 | `statusPageContract` |
29
+ | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.1 | `secretsSource` |
30
+ | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
31
+ | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
32
+ | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
33
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.2.0 | `deploymentTarget` |
34
+ | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
35
+ | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.1.0 | `healthProbes`, `readinessSemantics` |
36
+ | observability-logging | 15101-15899 | 16xx | shipped v1.0.0 | `logging` |
37
+ | application-error-handling | 16101-16899 | 17xx | shipped v1.0.0 | `errorHandling` |
38
+ | application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
39
+ | application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
40
+ | application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
41
+ | application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
42
+ | application-admin-console | 21101-21899 | 22xx | shipped v1.1.0 | `adminConsoleSignInSurface` |
43
+ | application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
44
+ | application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
45
+ | application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
46
+ | application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
47
+ | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
48
+ | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
49
+ | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
50
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
51
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
52
+ | platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
53
+ | platform-cloudflare-cron-triggers | 32101-32899 | 33xx | shipped v1.0.0 | `scheduledTriggerContract` |
54
+ | platform-cloudflare-durable-objects | 33101-33899 | 34xx | shipped v1.0.0 | `strongConsistencyCellContract`, `websocketHubContract` |
55
+ | edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
56
+ | edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
57
+ | edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
58
+
59
+ US 34101-34109 sit at the LOW end of the 34101-34899 band on purpose (watchpost run-4 lesson). ADR/TAC suffixes for this blueprint use the 3501-3599 block, continuing the shelf pattern.
60
+
61
+ ## Shared expectations for future composing blueprints
62
+
63
+ - Reuse `edgeAuthenticationGate` exactly as spelled here when your blueprint holds an opinion on the edge authentication gate contract; contribute your own scope:global ADR on that string and let composition surface the pairing.
64
+ - Consumer blueprints reading the `zeroTrustGate` capability declared on `blueprint.json` per section 6a of `blueprint-authoring.md` obtain the Access-gated composition at apply time via the T-5 visual-round capability-declaration mechanism.
65
+
66
+ ## Deliberate-conflict statement
67
+
68
+ This blueprint's ADR-3501 on `edgeAuthenticationGate` is the first shipped answer to a topic that will conflict, by design, with future non-Cloudflare siblings. Applying `edge-cloudflare-access` alongside such a sibling would raise a `globalAdrTopic` conflict the operator resolves via one of the four documented resolutions (adopt one, keep the existing one, author a project-level supersede ADR, or `--resolve <topic>=project:<ADR-id>` on the add).