rcf-lite 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/bin/rcf.js +13 -2
- package/blueprints/application-account-settings/docs/topics.md +9 -1
- package/blueprints/application-admin-console/CHANGELOG.md +12 -0
- package/blueprints/application-admin-console/blueprint.json +34 -1
- package/blueprints/application-admin-console/contributions/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +25 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-014.json +17 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +32 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21815.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21816.json +27 -0
- package/blueprints/application-admin-console/docs/topics.md +9 -1
- package/blueprints/application-admin-console/guide/application-admin-console.md +24 -0
- package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +26 -1
- package/blueprints/application-api-rest/docs/topics.md +9 -1
- package/blueprints/application-charts/docs/topics.md +9 -1
- package/blueprints/application-dashboard/docs/topics.md +9 -1
- package/blueprints/application-datatable/docs/topics.md +9 -1
- package/blueprints/application-empty-error-states/docs/topics.md +9 -1
- package/blueprints/application-error-handling/docs/topics.md +9 -1
- package/blueprints/application-file-upload/docs/topics.md +9 -1
- package/blueprints/application-forms-wizard/docs/topics.md +9 -1
- package/blueprints/application-notifications-in-app/docs/topics.md +9 -1
- package/blueprints/application-onboarding-tour/docs/topics.md +9 -1
- package/blueprints/application-spa/docs/topics.md +10 -2
- package/blueprints/delivery-ci-workflows/docs/topics.md +9 -1
- package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +69 -0
- package/blueprints/deploy-cloudflare-workers/README.md +12 -0
- package/blueprints/deploy-cloudflare-workers/blueprint.json +234 -36
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +30 -0
- package/blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs +207 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +36 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +27 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +27 -0
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +10 -2
- package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +25 -0
- package/blueprints/edge-cloudflare-access/CHANGELOG.md +23 -0
- package/blueprints/edge-cloudflare-access/README.md +141 -0
- package/blueprints/edge-cloudflare-access/blueprint.json +197 -0
- package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3501-edge-cloudflare-access-jwt-gate.json +14 -0
- package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3502-edge-cloudflare-access-identity-provider.json +25 -0
- package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3503-edge-cloudflare-access-policy-scope.json +12 -0
- package/blueprints/edge-cloudflare-access/contributions/adrs/adr-3504-edge-cloudflare-access-audit-retention.json +12 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +100 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/audit-event-secrecy.mjs +70 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/jwt-validator-fixture.mjs +63 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/jwt-validator-reject.mjs +95 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/probe-utils.mjs +90 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/real-account-gated-url.mjs +65 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/run-admin-console-gate-surface.mjs +5 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/run-audit-event-secrecy.mjs +5 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-fixture.mjs +5 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-reject.mjs +5 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/run-real-account-gated-url.mjs +5 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/run-wrangler-seam.mjs +5 -0
- package/blueprints/edge-cloudflare-access/contributions/probes/wrangler-seam.mjs +203 -0
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-001.json +17 -0
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-002.json +17 -0
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-003.json +17 -0
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-004.json +17 -0
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-005.json +17 -0
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-006.json +18 -0
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3501-edge-cloudflare-access-jwt-validator.json +31 -0
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3502-edge-cloudflare-access-application-declaration.json +33 -0
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3503-edge-cloudflare-access-policy-shape.json +25 -0
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3504-edge-cloudflare-access-audit-sink.json +25 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34101.json +27 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34102.json +28 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34103.json +27 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34104.json +27 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34105.json +27 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34106.json +27 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34107.json +27 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34108.json +27 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34109.json +27 -0
- package/blueprints/edge-cloudflare-access/docs/topics.md +68 -0
- package/blueprints/edge-cloudflare-access/guide/edge-cloudflare-access.md +180 -0
- package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +10 -0
- package/blueprints/edge-cloudflare-rate-limiting/README.md +73 -0
- package/blueprints/edge-cloudflare-rate-limiting/blueprint.json +174 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3701-edge-cloudflare-rate-limiting-throttle-contract.json +14 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3702-edge-cloudflare-rate-limiting-layering.json +14 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3703-edge-cloudflare-rate-limiting-manifest-shape.json +14 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/adrs/adr-3704-edge-cloudflare-rate-limiting-drift-audit-cadence.json +14 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/event-secrecy.mjs +104 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/manifest-presence.mjs +95 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/manifest-schema-validate.mjs +130 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/probe-utils.mjs +111 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/real-account-burst-and-429.mjs +104 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-event-secrecy.mjs +5 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-manifest-presence.mjs +5 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-manifest-schema-validate.mjs +5 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/run-real-account-burst-and-429.mjs +5 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-001.json +17 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-002.json +17 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-003.json +17 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-004.json +17 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-005.json +17 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/schemas/rate-limit-rule.schema.json +67 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +31 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3702-edge-cloudflare-rate-limiting-management-surface-doc.json +25 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +26 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36101.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36102.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36103.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36104.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36105.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36106.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36107.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36108.json +27 -0
- package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +68 -0
- package/blueprints/edge-cloudflare-rate-limiting/guide/edge-cloudflare-rate-limiting.md +88 -0
- package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +20 -0
- package/blueprints/edge-cloudflare-turnstile/README.md +95 -0
- package/blueprints/edge-cloudflare-turnstile/blueprint.json +161 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3601-edge-cloudflare-turnstile-verifier-contract.json +14 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3602-edge-cloudflare-turnstile-widget-mode.json +14 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/adrs/adr-3603-edge-cloudflare-turnstile-refuse-shape.json +14 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/event-secrecy.mjs +51 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/guard-shape-scan.mjs +48 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/probe-utils.mjs +139 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-event-secrecy.mjs +5 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-guard-shape-scan.mjs +5 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-secret-shape-scan.mjs +5 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/run-siteverify-fixture.mjs +5 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/secret-shape-scan.mjs +77 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/probes/siteverify-fixture.mjs +53 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-001.json +17 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-002.json +17 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-003.json +17 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-004.json +17 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-005.json +17 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +26 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +36 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3603-edge-cloudflare-turnstile-magic-link-hook.json +25 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35101.json +27 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35102.json +27 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35103.json +27 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35104.json +27 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35105.json +36 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35106.json +27 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35107.json +27 -0
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35108.json +27 -0
- package/blueprints/edge-cloudflare-turnstile/docs/topics.md +68 -0
- package/blueprints/edge-cloudflare-turnstile/guide/edge-cloudflare-turnstile.md +104 -0
- package/blueprints/edge-cloudflare-turnstile/probe-packs/edge-cloudflare-turnstile.pack.mjs +146 -0
- package/blueprints/email-smtp-resend/docs/topics.md +9 -1
- package/blueprints/jobs-background/CHANGELOG.md +16 -0
- package/blueprints/jobs-background/README.md +105 -0
- package/blueprints/jobs-background/blueprint.json +149 -0
- package/blueprints/jobs-background/contributions/adrs/adr-3101-jobs-background-model.json +27 -0
- package/blueprints/jobs-background/contributions/adrs/adr-3102-jobs-background-scheduler-mode.json +25 -0
- package/blueprints/jobs-background/contributions/adrs/adr-3103-jobs-background-requires-applied-capabilities.json +25 -0
- package/blueprints/jobs-background/contributions/adrs/adr-3104-jobs-background-timeout-floor.json +25 -0
- package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +95 -0
- package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +82 -0
- package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +69 -0
- package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +65 -0
- package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +91 -0
- package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +65 -0
- package/blueprints/jobs-background/contributions/probes/run-apply-time-override.mjs +10 -0
- package/blueprints/jobs-background/contributions/probes/run-apply-time-refusal.mjs +11 -0
- package/blueprints/jobs-background/contributions/probes/run-event-secrecy.mjs +11 -0
- package/blueprints/jobs-background/contributions/probes/run-fake-clock-cron.mjs +11 -0
- package/blueprints/jobs-background/contributions/probes/run-retry-and-fail.mjs +11 -0
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-001.json +18 -0
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +18 -0
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +18 -0
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +18 -0
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +18 -0
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +18 -0
- package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +50 -0
- package/blueprints/jobs-background/contributions/tacs/tac-3102-jobs-background-scheduler.json +50 -0
- package/blueprints/jobs-background/contributions/tacs/tac-3103-jobs-background-run-log.json +49 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +25 -0
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +25 -0
- package/blueprints/jobs-background/docs/topics.md +68 -0
- package/blueprints/jobs-background/guide/jobs-background.md +147 -0
- package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +15 -0
- package/blueprints/messaging-queue-cloudflare/README.md +125 -0
- package/blueprints/messaging-queue-cloudflare/blueprint.json +67 -0
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +30 -0
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3003-messaging-queue-cloudflare-max-attempts-floor.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3004-messaging-queue-cloudflare-batch-defaults.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/event-secrecy.mjs +137 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/probe-utils.mjs +82 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/producer-facade-ready.mjs +35 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/publish-to-delivery.mjs +94 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +54 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/retry-and-dlq.mjs +87 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/run-event-secrecy.mjs +5 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/run-producer-facade-ready.mjs +11 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/run-publish-to-delivery.mjs +5 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/run-real-account-concurrency-smoke.mjs +5 -0
- package/blueprints/messaging-queue-cloudflare/contributions/probes/run-retry-and-dlq.mjs +5 -0
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +18 -0
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +18 -0
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +18 -0
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +18 -0
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +18 -0
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +18 -0
- package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3001-messaging-queue-cloudflare-producer-facade.json +56 -0
- package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3002-messaging-queue-cloudflare-consumer-registration.json +40 -0
- package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3003-messaging-queue-cloudflare-event-sink.json +39 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +34 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +34 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +25 -0
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +25 -0
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +68 -0
- package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +110 -0
- package/blueprints/object-storage-s3/docs/topics.md +9 -1
- package/blueprints/observability-essentials/docs/topics.md +9 -1
- package/blueprints/observability-logging/docs/topics.md +9 -1
- package/blueprints/observability-probe-endpoints/docs/topics.md +9 -1
- package/blueprints/persistence-data-d1/docs/topics.md +9 -1
- package/blueprints/persistence-data-postgres/docs/topics.md +9 -1
- package/blueprints/persistence-data-sqlite/docs/topics.md +9 -1
- package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +22 -0
- package/blueprints/platform-cloudflare-cron-triggers/README.md +117 -0
- package/blueprints/platform-cloudflare-cron-triggers/blueprint.json +85 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3301-platform-cloudflare-cron-triggers-scheduled-trigger-contract.json +14 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3302-platform-cloudflare-cron-triggers-dispatcher-mode.json +14 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3303-platform-cloudflare-cron-triggers-skew-tolerance-default.json +14 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/dispatcher-routing.mjs +64 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/event-secrecy.mjs +100 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/probe-utils.mjs +70 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/real-account-scheduled-smoke.mjs +100 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-dispatcher-routing.mjs +5 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-event-secrecy.mjs +5 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-real-account-scheduled-smoke.mjs +5 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-skew-tolerance.mjs +5 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/run-wrangler-test-scheduled.mjs +5 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/skew-tolerance.mjs +130 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/wrangler-test-scheduled.mjs +129 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-001.json +17 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-002.json +17 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-003.json +17 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-004.json +17 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3301-platform-cloudflare-cron-triggers-scheduled-handler.json +22 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3302-platform-cloudflare-cron-triggers-expression-router.json +22 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3303-platform-cloudflare-cron-triggers-event-sink.json +21 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32101.json +25 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32102.json +34 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32103.json +34 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32104.json +34 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32105.json +25 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32106.json +25 -0
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32107.json +25 -0
- package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +71 -0
- package/blueprints/platform-cloudflare-cron-triggers/guide/platform-cloudflare-cron-triggers.md +119 -0
- package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +23 -0
- package/blueprints/platform-cloudflare-durable-objects/README.md +200 -0
- package/blueprints/platform-cloudflare-durable-objects/blueprint.json +243 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3401-platform-cloudflare-durable-objects-single-cell-contract.json +14 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3402-platform-cloudflare-durable-objects-websocket-hub-contract.json +14 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3403-platform-cloudflare-durable-objects-storage-backend.json +14 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3404-platform-cloudflare-durable-objects-migrations-shape.json +14 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3405-platform-cloudflare-durable-objects-hibernation-posture.json +14 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/alarm-fires-once.mjs +63 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/namespace-facade-ready.mjs +60 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/probe-utils.mjs +105 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs +58 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-alarm-fires-once.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-namespace-facade-ready.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-real-account-storage-smoke.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-single-cell-concurrent-increment.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-sole-reader-scan.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-storage-round-trip.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-websocket-hub-broadcast.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/run-wrangler-seam.mjs +5 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/single-cell-concurrent-increment.mjs +56 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/sole-reader-scan.mjs +117 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/storage-round-trip.mjs +87 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/websocket-hub-broadcast.mjs +112 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/wrangler-seam.mjs +257 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-001.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-002.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-003.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-004.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-005.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-006.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-007.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-008.json +17 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3401-platform-cloudflare-durable-objects-namespace-facade.json +31 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3402-platform-cloudflare-durable-objects-single-cell-shape.json +30 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3403-platform-cloudflare-durable-objects-alarm-handler.json +29 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3404-platform-cloudflare-durable-objects-websocket-hub.json +31 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3405-platform-cloudflare-durable-objects-event-sink.json +24 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33101.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33102.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33103.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33104.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33105.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33106.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33107.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33108.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33109.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33110.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33111.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33112.json +27 -0
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33113.json +25 -0
- package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +73 -0
- package/blueprints/platform-cloudflare-durable-objects/guide/platform-cloudflare-durable-objects.md +237 -0
- package/blueprints/platform-cloudflare-kv/CHANGELOG.md +21 -0
- package/blueprints/platform-cloudflare-kv/README.md +159 -0
- package/blueprints/platform-cloudflare-kv/blueprint.json +87 -0
- package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3201-platform-cloudflare-kv-key-value-store-contract.json +14 -0
- package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3202-platform-cloudflare-kv-default-cache-ttl.json +14 -0
- package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3203-platform-cloudflare-kv-key-naming-convention.json +14 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/cache-aside-hit-then-miss.mjs +82 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/event-secrecy.mjs +102 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/facade-round-trip.mjs +92 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/list-with-prefix.mjs +52 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/probe-utils.mjs +73 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/real-account-eventual-consistency-smoke.mjs +102 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/run-cache-aside-hit-then-miss.mjs +5 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/run-event-secrecy.mjs +5 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/run-facade-round-trip.mjs +5 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/run-list-with-prefix.mjs +5 -0
- package/blueprints/platform-cloudflare-kv/contributions/probes/run-real-account-eventual-consistency-smoke.mjs +5 -0
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-001.json +18 -0
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-002.json +18 -0
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-003.json +18 -0
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-004.json +18 -0
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-005.json +18 -0
- package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3201-platform-cloudflare-kv-facade.json +27 -0
- package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3202-platform-cloudflare-kv-cache-aside.json +26 -0
- package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3203-platform-cloudflare-kv-event-sink.json +25 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31101.json +27 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31102.json +27 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31103.json +36 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31104.json +27 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31105.json +27 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31106.json +27 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31107.json +27 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31108.json +27 -0
- package/blueprints/platform-cloudflare-kv/docs/topics.md +71 -0
- package/blueprints/platform-cloudflare-kv/guide/platform-cloudflare-kv.md +138 -0
- package/blueprints/security-auth-clerk/docs/topics.md +9 -1
- package/blueprints/security-auth-keycloak/docs/topics.md +9 -1
- package/blueprints/security-auth-magic-link/docs/topics.md +9 -1
- package/blueprints/security-auth-oauth2/docs/topics.md +9 -1
- package/blueprints/security-secrets-management/docs/topics.md +9 -1
- package/fixtures/canary-manifest.json +6 -6
- package/package.json +1 -1
- package/rcf/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +13 -0
- package/rcf/adrs/adr-3501-edge-cloudflare-access-jwt-gate.json +13 -0
- package/rcf/adrs/adr-3502-edge-cloudflare-access-identity-provider.json +13 -0
- package/rcf/adrs/adr-3503-edge-cloudflare-access-policy-scope.json +13 -0
- package/rcf/adrs/adr-3504-edge-cloudflare-access-audit-retention.json +13 -0
- package/rcf/adrs/adr-3601-edge-cloudflare-turnstile-verifier-contract.json +13 -0
- package/rcf/adrs/adr-3602-edge-cloudflare-turnstile-widget-mode.json +13 -0
- package/rcf/adrs/adr-3603-edge-cloudflare-turnstile-refuse-shape.json +13 -0
- package/rcf/adrs/adr-3701-edge-cloudflare-rate-limiting-throttle-contract.json +13 -0
- package/rcf/adrs/adr-3702-edge-cloudflare-rate-limiting-layering.json +13 -0
- package/rcf/adrs/adr-3703-edge-cloudflare-rate-limiting-manifest-shape.json +13 -0
- package/rcf/adrs/adr-3704-edge-cloudflare-rate-limiting-drift-audit-cadence.json +13 -0
- package/rcf/code-nodes/cn-206.json +14 -0
- package/rcf/code-nodes/cn-207.json +13 -0
- package/rcf/code-nodes/cn-208.json +14 -0
- package/rcf/code-nodes/cn-209.json +14 -0
- package/rcf/code-nodes/cn-210.json +13 -0
- package/rcf/code-nodes/cn-211.json +12 -0
- package/rcf/code-nodes/cn-212.json +12 -0
- package/rcf/code-nodes/cn-213.json +12 -0
- package/rcf/code-nodes/cn-214.json +15 -0
- package/rcf/code-nodes/cn-215.json +13 -0
- package/rcf/code-nodes/cn-216.json +14 -0
- package/rcf/code-nodes/cn-217.json +13 -0
- package/rcf/code-nodes/cn-230.json +13 -0
- package/rcf/code-nodes/cn-231.json +14 -0
- package/rcf/code-nodes/cn-232.json +13 -0
- package/rcf/code-nodes/cn-233.json +14 -0
- package/rcf/code-nodes/cn-234.json +13 -0
- package/rcf/code-nodes/cn-260.json +21 -0
- package/rcf/code-nodes/cn-261.json +14 -0
- package/rcf/code-nodes/cn-262.json +18 -0
- package/rcf/code-nodes/cn-263.json +12 -0
- package/rcf/code-nodes/cn-264.json +13 -0
- package/rcf/code-nodes/cn-265.json +15 -0
- package/rcf/code-nodes/cn-266.json +12 -0
- package/rcf/code-nodes/cn-267.json +12 -0
- package/rcf/code-nodes/cn-290.json +21 -0
- package/rcf/code-nodes/cn-291.json +12 -0
- package/rcf/code-nodes/cn-292.json +13 -0
- package/rcf/code-nodes/cn-293.json +13 -0
- package/rcf/code-nodes/cn-294.json +13 -0
- package/rcf/code-nodes/cn-295.json +12 -0
- package/rcf/code-nodes/cn-296.json +12 -0
- package/rcf/code-nodes/cn-297.json +12 -0
- package/rcf/code-nodes/cn-298.json +12 -0
- package/rcf/code-nodes/cn-299.json +12 -0
- package/rcf/code-nodes/cn-300.json +12 -0
- package/rcf/code-nodes/cn-301.json +14 -0
- package/rcf/code-nodes/cn-302.json +12 -0
- package/rcf/code-nodes/cn-303.json +12 -0
- package/rcf/code-nodes/cn-304.json +21 -0
- package/rcf/code-nodes/cn-320.json +20 -0
- package/rcf/code-nodes/cn-321.json +14 -0
- package/rcf/code-nodes/cn-350.json +19 -0
- package/rcf/code-nodes/cn-380.json +19 -0
- package/rcf/fbs/fbs-062.json +20 -0
- package/rcf/fbs/fbs-063.json +22 -0
- package/rcf/fbs/fbs-064.json +23 -0
- package/rcf/fbs/fbs-070.json +24 -0
- package/rcf/fbs/fbs-080.json +24 -0
- package/rcf/fbs/fbs-090.json +24 -0
- package/rcf/fbs/fbs-100.json +23 -0
- package/rcf/fbs/fbs-101.json +16 -0
- package/rcf/fbs/fbs-110.json +23 -0
- package/rcf/fbs/fbs-120.json +22 -0
- package/rcf/requirements/req-029.json +57 -0
- package/rcf/requirements/req-030.json +67 -0
- package/rcf/requirements/req-042.json +59 -0
- package/rcf/requirements/req-043.json +39 -0
- package/rcf/requirements/req-050.json +18 -0
- package/rcf/requirements/req-051.json +18 -0
- package/rcf/requirements/req-052.json +18 -0
- package/rcf/requirements/req-053.json +18 -0
- package/rcf/requirements/req-054.json +18 -0
- package/rcf/requirements/req-060.json +20 -0
- package/rcf/requirements/req-061.json +18 -0
- package/rcf/requirements/req-062.json +20 -0
- package/rcf/requirements/req-063.json +20 -0
- package/rcf/requirements/req-070.json +18 -0
- package/rcf/requirements/req-071.json +18 -0
- package/rcf/requirements/req-072.json +18 -0
- package/rcf/requirements/req-073.json +18 -0
- package/rcf/requirements/req-074.json +18 -0
- package/rcf/requirements/req-075.json +18 -0
- package/rcf/requirements/req-076.json +18 -0
- package/rcf/requirements/req-077.json +18 -0
- package/rcf/requirements/req-080.json +18 -0
- package/rcf/requirements/req-081.json +18 -0
- package/rcf/requirements/req-082.json +18 -0
- package/rcf/requirements/req-083.json +18 -0
- package/rcf/requirements/req-084.json +18 -0
- package/rcf/requirements/req-085.json +18 -0
- package/rcf/requirements/req-086.json +18 -0
- package/rcf/requirements/req-090.json +44 -0
- package/rcf/requirements/req-091.json +53 -0
- package/rcf/requirements/req-092.json +32 -0
- package/rcf/requirements/req-093.json +52 -0
- package/rcf/requirements/req-094.json +32 -0
- package/rcf/requirements/req-100.json +13 -0
- package/rcf/requirements/req-101.json +13 -0
- package/rcf/requirements/req-102.json +13 -0
- package/rcf/requirements/req-103.json +13 -0
- package/rcf/requirements/req-104.json +13 -0
- package/rcf/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +15 -0
- package/rcf/tacs/tac-3501-edge-cloudflare-access-jwt-validator.json +15 -0
- package/rcf/tacs/tac-3502-edge-cloudflare-access-application-declaration.json +15 -0
- package/rcf/tacs/tac-3503-edge-cloudflare-access-policy-shape.json +15 -0
- package/rcf/tacs/tac-3504-edge-cloudflare-access-audit-sink.json +15 -0
- package/rcf/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +15 -0
- package/rcf/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +15 -0
- package/rcf/tacs/tac-3603-edge-cloudflare-turnstile-magic-link-hook.json +15 -0
- package/rcf/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +16 -0
- package/rcf/tacs/tac-3702-edge-cloudflare-rate-limiting-management-surface-doc.json +15 -0
- package/rcf/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +16 -0
- package/rcf/test-suites/ts-052.json +58 -8
- package/rcf/test-suites/ts-072.json +62 -0
- package/rcf/test-suites/ts-073.json +38 -0
- package/rcf/test-suites/ts-074.json +30 -0
- package/rcf/test-suites/ts-075.json +38 -0
- package/rcf/test-suites/ts-076.json +70 -0
- package/rcf/test-suites/ts-080.json +22 -0
- package/rcf/test-suites/ts-081.json +22 -0
- package/rcf/test-suites/ts-082.json +30 -0
- package/rcf/test-suites/ts-083.json +22 -0
- package/rcf/test-suites/ts-084.json +30 -0
- package/rcf/test-suites/ts-085.json +22 -0
- package/rcf/test-suites/ts-086.json +22 -0
- package/rcf/test-suites/ts-087.json +22 -0
- package/rcf/test-suites/ts-090.json +22 -0
- package/rcf/test-suites/ts-091.json +22 -0
- package/rcf/test-suites/ts-092.json +22 -0
- package/rcf/test-suites/ts-093.json +30 -0
- package/rcf/test-suites/ts-094.json +30 -0
- package/rcf/test-suites/ts-095.json +30 -0
- package/rcf/test-suites/ts-096.json +22 -0
- package/rcf/test-suites/ts-100.json +22 -0
- package/rcf/test-suites/ts-101.json +22 -0
- package/rcf/test-suites/ts-102.json +22 -0
- package/rcf/test-suites/ts-103.json +22 -0
- package/rcf/test-suites/ts-104.json +22 -0
- package/rcf/test-suites/ts-105.json +22 -0
- package/rcf/test-suites/ts-106.json +22 -0
- package/rcf/test-suites/ts-107.json +22 -0
- package/rcf/test-suites/ts-108.json +22 -0
- package/rcf/test-suites/ts-109.json +22 -0
- package/rcf/test-suites/ts-110.json +22 -0
- package/rcf/test-suites/ts-111.json +22 -0
- package/rcf/test-suites/ts-112.json +22 -0
- package/rcf/test-suites/ts-113.json +22 -0
- package/rcf/test-suites/ts-114.json +22 -0
- package/rcf/test-suites/ts-115.json +22 -0
- package/rcf/test-suites/ts-116.json +22 -0
- package/rcf/test-suites/ts-117.json +22 -0
- package/rcf/test-suites/ts-118.json +22 -0
- package/rcf/test-suites/ts-119.json +30 -0
- package/rcf/test-suites/ts-120.json +22 -0
- package/rcf/test-suites/ts-121.json +22 -0
- package/rcf/test-suites/ts-122.json +22 -0
- package/rcf/test-suites/ts-123.json +22 -0
- package/rcf/test-suites/ts-124.json +22 -0
- package/rcf/test-suites/ts-125.json +22 -0
- package/rcf/test-suites/ts-126.json +22 -0
- package/rcf/test-suites/ts-127.json +22 -0
- package/rcf/test-suites/ts-130.json +22 -0
- package/rcf/test-suites/ts-131.json +22 -0
- package/rcf/test-suites/ts-132.json +22 -0
- package/rcf/test-suites/ts-133.json +22 -0
- package/rcf/test-suites/ts-134.json +22 -0
- package/rcf/test-suites/ts-135.json +22 -0
- package/rcf/test-suites/ts-136.json +22 -0
- package/rcf/test-suites/ts-137.json +22 -0
- package/rcf/user-stories/us-10001.json +23 -0
- package/rcf/user-stories/us-10101.json +23 -0
- package/rcf/user-stories/us-10201.json +23 -0
- package/rcf/user-stories/us-10301.json +23 -0
- package/rcf/user-stories/us-10401.json +23 -0
- package/rcf/user-stories/us-10601.json +23 -0
- package/rcf/user-stories/us-10701.json +23 -0
- package/rcf/user-stories/us-10801.json +23 -0
- package/rcf/user-stories/us-2901.json +45 -0
- package/rcf/user-stories/us-2902.json +36 -0
- package/rcf/user-stories/us-3001.json +45 -0
- package/rcf/user-stories/us-4201.json +69 -0
- package/rcf/user-stories/us-4301.json +78 -0
- package/rcf/user-stories/us-5001.json +27 -0
- package/rcf/user-stories/us-5002.json +27 -0
- package/rcf/user-stories/us-5101.json +36 -0
- package/rcf/user-stories/us-5102.json +27 -0
- package/rcf/user-stories/us-5201.json +36 -0
- package/rcf/user-stories/us-5301.json +27 -0
- package/rcf/user-stories/us-5302.json +27 -0
- package/rcf/user-stories/us-5401.json +27 -0
- package/rcf/user-stories/us-6001.json +27 -0
- package/rcf/user-stories/us-6002.json +27 -0
- package/rcf/user-stories/us-6003.json +27 -0
- package/rcf/user-stories/us-6101.json +36 -0
- package/rcf/user-stories/us-6201.json +36 -0
- package/rcf/user-stories/us-6301.json +36 -0
- package/rcf/user-stories/us-6302.json +27 -0
- package/rcf/user-stories/us-7001.json +27 -0
- package/rcf/user-stories/us-7002.json +27 -0
- package/rcf/user-stories/us-7101.json +27 -0
- package/rcf/user-stories/us-7201.json +27 -0
- package/rcf/user-stories/us-7301.json +27 -0
- package/rcf/user-stories/us-7401.json +27 -0
- package/rcf/user-stories/us-7402.json +27 -0
- package/rcf/user-stories/us-7501.json +27 -0
- package/rcf/user-stories/us-7601.json +27 -0
- package/rcf/user-stories/us-7701.json +27 -0
- package/rcf/user-stories/us-8001.json +24 -0
- package/rcf/user-stories/us-8002.json +24 -0
- package/rcf/user-stories/us-8003.json +24 -0
- package/rcf/user-stories/us-8101.json +24 -0
- package/rcf/user-stories/us-8201.json +24 -0
- package/rcf/user-stories/us-8301.json +24 -0
- package/rcf/user-stories/us-8401.json +24 -0
- package/rcf/user-stories/us-8501.json +24 -0
- package/rcf/user-stories/us-8502.json +24 -0
- package/rcf/user-stories/us-8601.json +24 -0
- package/rcf/user-stories/us-8602.json +24 -0
- package/rcf/user-stories/us-9001.json +27 -0
- package/rcf/user-stories/us-9002.json +27 -0
- package/rcf/user-stories/us-9101.json +27 -0
- package/rcf/user-stories/us-9102.json +27 -0
- package/rcf/user-stories/us-9201.json +27 -0
- package/rcf/user-stories/us-9301.json +27 -0
- package/rcf/user-stories/us-9302.json +27 -0
- package/rcf/user-stories/us-9401.json +27 -0
- package/releases/releases.yaml +21 -1
- package/src/blueprint/apply.js +7 -4
- package/src/blueprint/capabilities.js +25 -0
- package/src/cli/blueprint.js +8 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "edge-cloudflare-access",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"category": "edge",
|
|
5
|
+
"capabilities": [
|
|
6
|
+
"zeroTrustGate"
|
|
7
|
+
],
|
|
8
|
+
"suggestedCompanions": [
|
|
9
|
+
{
|
|
10
|
+
"role": "logging",
|
|
11
|
+
"reason": "Every validate-pass, validate-reject and bypass event emits an audit record with metadata-only fields; a logging companion supplies the sink factory."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"role": "errorHandling",
|
|
15
|
+
"reason": "A JWKS fetch failure, a signature mismatch, an expired-JWT branch and a missing header each construct a rejection outcome; an error-handling companion supplies the record factory and the boundary."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"role": "secretsManagement",
|
|
19
|
+
"reason": "The paired break-glass service-auth secret and the JWKS-URL projection to production are stored in the operator's applied secretsManagement companion; the applied vault seam receives the elicited values at apply time and injects them at deploy."
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"elicits": [
|
|
23
|
+
{
|
|
24
|
+
"id": "access-application-host",
|
|
25
|
+
"prompt": "Cloudflare Access application hostname the Zero Trust policy is attached to (recommended for hostname-scoped applications). Supply this OR access-selfhosted-app-id.",
|
|
26
|
+
"kind": "string",
|
|
27
|
+
"default": ""
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "access-selfhosted-app-id",
|
|
31
|
+
"prompt": "Cloudflare Access self-hosted application id (recommended for API-managed applications). Supply this OR access-application-host.",
|
|
32
|
+
"kind": "string",
|
|
33
|
+
"default": ""
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "access-audience",
|
|
37
|
+
"prompt": "JWT audience tag the Access policy issues; the validator refuses tokens whose aud claim does not match this string.",
|
|
38
|
+
"kind": "string",
|
|
39
|
+
"default": ""
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "access-jwks-url",
|
|
43
|
+
"prompt": "JWKS endpoint URL the validator fetches keys from. Cloudflare Access publishes this at https://<team>.cloudflareaccess.com/cdn-cgi/access/certs.",
|
|
44
|
+
"kind": "string",
|
|
45
|
+
"default": ""
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "access-policy-shape",
|
|
49
|
+
"prompt": "Access policy shape per TAC-3503. email-domain restricts by @<domain>; service-token-only allows only the elicited bypass-service-auth pair; service-token-plus-email-domain permits both; group-membership binds to an identity-provider group claim (recommended for enterprise SSO).",
|
|
50
|
+
"kind": "enum",
|
|
51
|
+
"options": [
|
|
52
|
+
"email-domain",
|
|
53
|
+
"service-token-only",
|
|
54
|
+
"service-token-plus-email-domain",
|
|
55
|
+
"group-membership"
|
|
56
|
+
],
|
|
57
|
+
"default": "email-domain"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "access-bypass-service-auth-id",
|
|
61
|
+
"prompt": "Break-glass service-auth id (per ADR-3502 elicit-only; leave blank to disable break-glass). Recorded on rcf/blueprints/edge-cloudflare-access.applied.json; the paired secret goes through security-secrets-management.",
|
|
62
|
+
"kind": "string",
|
|
63
|
+
"default": ""
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"contributions": [
|
|
67
|
+
{
|
|
68
|
+
"id": "edge-cloudflare-access-REQ-001",
|
|
69
|
+
"kind": "req",
|
|
70
|
+
"path": "requirements/edge-cloudflare-access-req-001.json"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "edge-cloudflare-access-REQ-002",
|
|
74
|
+
"kind": "req",
|
|
75
|
+
"path": "requirements/edge-cloudflare-access-req-002.json"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "edge-cloudflare-access-REQ-003",
|
|
79
|
+
"kind": "req",
|
|
80
|
+
"path": "requirements/edge-cloudflare-access-req-003.json"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "edge-cloudflare-access-REQ-004",
|
|
84
|
+
"kind": "req",
|
|
85
|
+
"path": "requirements/edge-cloudflare-access-req-004.json"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "edge-cloudflare-access-REQ-005",
|
|
89
|
+
"kind": "req",
|
|
90
|
+
"path": "requirements/edge-cloudflare-access-req-005.json"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "edge-cloudflare-access-REQ-006",
|
|
94
|
+
"kind": "req",
|
|
95
|
+
"path": "requirements/edge-cloudflare-access-req-006.json"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"id": "edge-cloudflare-access-US-34101",
|
|
99
|
+
"kind": "us",
|
|
100
|
+
"path": "user-stories/edge-cloudflare-access-us-34101.json"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "edge-cloudflare-access-US-34102",
|
|
104
|
+
"kind": "us",
|
|
105
|
+
"path": "user-stories/edge-cloudflare-access-us-34102.json"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "edge-cloudflare-access-US-34103",
|
|
109
|
+
"kind": "us",
|
|
110
|
+
"path": "user-stories/edge-cloudflare-access-us-34103.json"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "edge-cloudflare-access-US-34104",
|
|
114
|
+
"kind": "us",
|
|
115
|
+
"path": "user-stories/edge-cloudflare-access-us-34104.json"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"id": "edge-cloudflare-access-US-34105",
|
|
119
|
+
"kind": "us",
|
|
120
|
+
"path": "user-stories/edge-cloudflare-access-us-34105.json"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "edge-cloudflare-access-US-34106",
|
|
124
|
+
"kind": "us",
|
|
125
|
+
"path": "user-stories/edge-cloudflare-access-us-34106.json"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"id": "edge-cloudflare-access-US-34107",
|
|
129
|
+
"kind": "us",
|
|
130
|
+
"path": "user-stories/edge-cloudflare-access-us-34107.json"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "edge-cloudflare-access-US-34108",
|
|
134
|
+
"kind": "us",
|
|
135
|
+
"path": "user-stories/edge-cloudflare-access-us-34108.json"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "edge-cloudflare-access-US-34109",
|
|
139
|
+
"kind": "us",
|
|
140
|
+
"path": "user-stories/edge-cloudflare-access-us-34109.json"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": "TAC-3501-edge-cloudflare-access-jwt-validator",
|
|
144
|
+
"kind": "tac",
|
|
145
|
+
"path": "tacs/tac-3501-edge-cloudflare-access-jwt-validator.json"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "TAC-3502-edge-cloudflare-access-application-declaration",
|
|
149
|
+
"kind": "tac",
|
|
150
|
+
"path": "tacs/tac-3502-edge-cloudflare-access-application-declaration.json"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "TAC-3503-edge-cloudflare-access-policy-shape",
|
|
154
|
+
"kind": "tac",
|
|
155
|
+
"path": "tacs/tac-3503-edge-cloudflare-access-policy-shape.json"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"id": "TAC-3504-edge-cloudflare-access-audit-sink",
|
|
159
|
+
"kind": "tac",
|
|
160
|
+
"path": "tacs/tac-3504-edge-cloudflare-access-audit-sink.json"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": "ADR-3501-edge-cloudflare-access-jwt-gate",
|
|
164
|
+
"kind": "adr",
|
|
165
|
+
"path": "adrs/adr-3501-edge-cloudflare-access-jwt-gate.json",
|
|
166
|
+
"scope": "global",
|
|
167
|
+
"topic": "edgeAuthenticationGate",
|
|
168
|
+
"recommendedDefault": true,
|
|
169
|
+
"elicited": false,
|
|
170
|
+
"standardsTraceClause": "Cloudflare Access policy actions and rule selectors"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "ADR-3502-edge-cloudflare-access-identity-provider",
|
|
174
|
+
"kind": "adr",
|
|
175
|
+
"path": "adrs/adr-3502-edge-cloudflare-access-identity-provider.json",
|
|
176
|
+
"recommendedDefault": false,
|
|
177
|
+
"elicited": true,
|
|
178
|
+
"standardsTraceClause": "generic enterprise practice"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"id": "ADR-3503-edge-cloudflare-access-policy-scope",
|
|
182
|
+
"kind": "adr",
|
|
183
|
+
"path": "adrs/adr-3503-edge-cloudflare-access-policy-scope.json",
|
|
184
|
+
"recommendedDefault": true,
|
|
185
|
+
"elicited": true,
|
|
186
|
+
"standardsTraceClause": "Cloudflare Access policy actions and rule selectors"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"id": "ADR-3504-edge-cloudflare-access-audit-retention",
|
|
190
|
+
"kind": "adr",
|
|
191
|
+
"path": "adrs/adr-3504-edge-cloudflare-access-audit-retention.json",
|
|
192
|
+
"recommendedDefault": true,
|
|
193
|
+
"elicited": false,
|
|
194
|
+
"standardsTraceClause": "generic enterprise practice"
|
|
195
|
+
}
|
|
196
|
+
]
|
|
197
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-3501-edge-cloudflare-access-jwt-gate",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Edge authentication gate: Cloudflare Access Zero-Trust JWT-assertion gate (scope global, new topic edgeAuthenticationGate)",
|
|
8
|
+
"context": "An applying Workers project has one native edge-authentication answer today: Cloudflare Access. Access enforces the policy at the CF edge, mints a short-lived JWT signed with its own JWKS, and forwards the JWT to the origin Worker in the Cf-Access-Jwt-Assertion header per https://developers.cloudflare.com/cloudflare-one/policies/access/. Every applied Worker needs one project-wide answer to the edgeAuthenticationGate topic; a future non-Cloudflare sibling (Google Cloud IAP, AWS Verified Access, Duo Beyond) would conflict on the same topic.",
|
|
9
|
+
"decision": "The shipped v1.0.0 default is Cloudflare Access's Zero-Trust JWT-assertion gate. The JWT validator (TAC-3501) is the sole reader of the Cf-Access-Jwt-Assertion header and reduces the principal onto request.auth. The edgeAuthenticationGate topic scope is global on this blueprint; the topic string is edgeAuthenticationGate (lower camel case, one concept per topic, no version suffix). A future non-Cloudflare adapter would contribute the same topic string with a different answer, forcing a DELIBERATE conflict the operator resolves with a project-level ADR.",
|
|
10
|
+
"consequences": "The applying project inherits Cloudflare's documented Access policy model, the platform-assigned per-application limits and the JWT rotation cadence Access publishes at https://<team>.cloudflareaccess.com/cdn-cgi/access/certs. Standards trace clause: Cloudflare Access policy actions and rule selectors (per https://developers.cloudflare.com/cloudflare-one/policies/access/). Consumers deploying to a non-Cloudflare edge reach for a sibling adapter blueprint that would land as a v1.x minor on this shelf.",
|
|
11
|
+
"alternativesConsidered": [],
|
|
12
|
+
"createdAt": "2026-09-07T16:00:00.000Z",
|
|
13
|
+
"updatedAt": "2026-09-07T16:00:00.000Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-3502-edge-cloudflare-access-identity-provider",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Identity provider for the Access application is elicited (recommendedDefault null)",
|
|
8
|
+
"context": "Cloudflare Access supports many identity providers: One-Time PIN over email, Google, GitHub, Okta, Microsoft Entra ID, SAML, OIDC, mTLS. The choice is an enterprise-integration decision that the shelf cannot pick for the operator: a solo project may take One-Time PIN; a mid-market SaaS may take Google Workspace; a regulated enterprise may take an SSO federation via SAML/OIDC.",
|
|
9
|
+
"decision": "Identity provider is elicited (elicited: true). No recommended default: recommendedDefault is null. The applied-sidecar records the operator's answer; the guide's dashboard walk-through and API alternative both operate on the selected provider. The break-glass service-auth pair (ADR-3503's elicited posture) is still available regardless of the identity provider, so CI can hit the Worker on top of any provider choice.",
|
|
10
|
+
"consequences": "The elicitation forces an explicit operator answer at apply. A workspace that never sets an identity provider cannot apply the blueprint (recommendedDefault=null refuses on apply per the shelf norm). Standards trace clause: generic enterprise practice (per the sentinel; no vendor documentation constrains which identity provider a Cloudflare Access application must use).",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Default to One-Time PIN over email",
|
|
14
|
+
"summary": "Pick OTP as the shipped default so a fresh project applies without an elicitation answer.",
|
|
15
|
+
"reasonNotChosen": "OTP is a stopgap for prototypes and personal projects; shipping it as the default would push operators to accept it silently in production. Making the choice explicit at apply is the honest posture."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Bind to security-auth-* companion",
|
|
19
|
+
"summary": "Derive the identity provider from whichever security-auth-* blueprint is applied.",
|
|
20
|
+
"reasonNotChosen": "Cloudflare Access is a distinct identity boundary from a same-app security-auth-* (Clerk, Keycloak, OAuth2, magic-link); an operator running Clerk in the app and Google Workspace as the Access IdP is a legitimate composition. Inference here would surprise the operator."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-07T16:00:00.000Z",
|
|
24
|
+
"updatedAt": "2026-09-07T16:00:00.000Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-3503-edge-cloudflare-access-policy-scope",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Policy scope: application-level (recommended default) or per-path elicited",
|
|
8
|
+
"context": "A Cloudflare Access application binds to a hostname or self-hosted-app id and a set of paths. Policies attach at the application level (one policy protects every path) or per-path (different policies for /admin vs /public). Application-level scope is the most common shape and the least surprising; per-path scope is a legitimate answer for a mixed-audience surface.",
|
|
9
|
+
"decision": "The shipped recommendedDefault is application-level (recommendedDefault: true). The elicited alternative is per-path (elicited: true). The guide's dashboard walk-through covers both paths; the API alternative differs only in the path selector on the policy issuance call. Standards trace clause: Cloudflare Access policy actions and rule selectors (per https://developers.cloudflare.com/cloudflare-one/policies/access/).",
|
|
10
|
+
"consequences": "A fresh project applying the blueprint gets one application-level policy protecting every path (the simplest deployment); an operator opting into per-path scope elicits a route table and issues one policy per route selector. The validator does not branch on the scope at runtime (the Cloudflare edge enforces the policy).",
|
|
11
|
+
"alternativesConsidered": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-3504-edge-cloudflare-access-audit-retention",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Audit retention window (metadata-only fields) is delegated to the applied logging companion",
|
|
8
|
+
"context": "The validator emits one audit event per outcome with the metadata-only shape {email, outcome, timestamp, path} per REQ-004. Long-term retention (7 days, 90 days, 7 years) is a compliance decision an application-level logging companion (observability-logging, or a dedicated audit-log blueprint) already answers; a per-blueprint retention window would duplicate the answer and diverge over time.",
|
|
9
|
+
"decision": "The audit event shape is frozen at the validator boundary; retention is delegated verbatim to the applied logging companion (suggestedCompanions[0]). The blueprint declares no retention policy of its own. Standards trace clause: generic enterprise practice (per the sentinel; the metadata-only shape is the blueprint's contribution, retention is the companion's).",
|
|
10
|
+
"consequences": "A workspace without a logging companion loses the audit events after the Worker context tears down (per Cloudflare Workers semantics); the guide names the trade at apply. A workspace with observability-logging v1.x applied inherits its retention window unchanged.",
|
|
11
|
+
"alternativesConsidered": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Probe: admin-console gate surface - the extended admin-console fixture flips its sign-in surface per applied capability set.
|
|
2
|
+
// anchorAcId: AC-34108-1. accountBound: false.
|
|
3
|
+
//
|
|
4
|
+
// This probe drives the extended probe-pack-application-admin-console fixture over HTTP (no browser).
|
|
5
|
+
// The fixture ships a /admin/sign-in route that renders one of two surfaces based on ?caps=:
|
|
6
|
+
// - with zeroTrustGate in the caps list: [data-surface=access-gated] + no [data-surface=local-login] +
|
|
7
|
+
// [data-role=principal-read] with the request.auth email
|
|
8
|
+
// - without zeroTrustGate: [data-surface=local-login] + no [data-surface=access-gated]
|
|
9
|
+
// The probe boots the fixture server, hits both combinations, greps the DOM for the surface markers,
|
|
10
|
+
// and asserts the mutually exclusive presence. The shipped pack check AC-21815-1 on
|
|
11
|
+
// application-admin-console.pack.mjs is exercised end-to-end in the anatomy test (it uses Playwright);
|
|
12
|
+
// this probe covers the DOM-shape guarantee without a browser dependency.
|
|
13
|
+
|
|
14
|
+
import { spawn } from 'node:child_process';
|
|
15
|
+
import { resolve, dirname } from 'node:path';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
|
|
18
|
+
export const anchorAcId = 'AC-34108-1';
|
|
19
|
+
export const accountBound = false;
|
|
20
|
+
|
|
21
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
const FIXTURE = resolve(HERE, '..', '..', '..', '..', 'packages', 'rcf-lite', 'test', 'fixtures', 'probe-pack-application-admin-console');
|
|
23
|
+
const BIND_CAP_MS = 8000;
|
|
24
|
+
|
|
25
|
+
async function bootServer() {
|
|
26
|
+
const proc = spawn(process.execPath, ['server.js'], {
|
|
27
|
+
cwd: FIXTURE,
|
|
28
|
+
env: { ...process.env, PORT: '0' },
|
|
29
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
30
|
+
});
|
|
31
|
+
let url = null;
|
|
32
|
+
let stderrTail = '';
|
|
33
|
+
proc.stdout.on('data', (buf) => {
|
|
34
|
+
const s = buf.toString();
|
|
35
|
+
const match = s.match(/LISTENING\s+(\d+)/);
|
|
36
|
+
if (match && !url) url = `http://127.0.0.1:${match[1]}`;
|
|
37
|
+
});
|
|
38
|
+
proc.stderr.on('data', (b) => { stderrTail = (stderrTail + b.toString()).slice(-2000); });
|
|
39
|
+
const start = Date.now();
|
|
40
|
+
while (!url && Date.now() - start < BIND_CAP_MS) {
|
|
41
|
+
if (proc.exitCode !== null) break;
|
|
42
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
43
|
+
}
|
|
44
|
+
return { proc, url, stderrTail };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function fetchDom(url, caps) {
|
|
48
|
+
const target = `${url}/admin/sign-in?caps=${encodeURIComponent(caps)}`;
|
|
49
|
+
const res = await fetch(target);
|
|
50
|
+
return { status: res.status, body: await res.text(), target };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function stop(proc) {
|
|
54
|
+
if (!proc || proc.killed) return;
|
|
55
|
+
try { proc.kill('SIGTERM'); } catch (_e) {}
|
|
56
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
57
|
+
try { if (!proc.killed) proc.kill('SIGKILL'); } catch (_e) {}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default async function runProbe() {
|
|
61
|
+
const { proc, url, stderrTail } = await bootServer();
|
|
62
|
+
if (!url) {
|
|
63
|
+
await stop(proc);
|
|
64
|
+
return { results: [{ anchorAcId: 'AC-34108-1', verdict: 'fail', detail: `admin-console fixture did not bind within ${BIND_CAP_MS}ms; stderr: ${stderrTail}` }] };
|
|
65
|
+
}
|
|
66
|
+
const results = [];
|
|
67
|
+
try {
|
|
68
|
+
// Gated combination
|
|
69
|
+
const gated = await fetchDom(url, 'principalDirectory,roleModel,auditLog,zeroTrustGate');
|
|
70
|
+
const gatedOk =
|
|
71
|
+
gated.status === 200 &&
|
|
72
|
+
gated.body.includes('data-surface="access-gated"') &&
|
|
73
|
+
!gated.body.includes('data-surface="local-login"') &&
|
|
74
|
+
gated.body.includes('data-role="principal-read"');
|
|
75
|
+
results.push({
|
|
76
|
+
anchorAcId: 'AC-34108-1',
|
|
77
|
+
verdict: gatedOk ? 'pass' : 'fail',
|
|
78
|
+
detail: gatedOk
|
|
79
|
+
? `gated: HTTP 200 with data-surface=access-gated, no data-surface=local-login, data-role=principal-read present at ${gated.target}`
|
|
80
|
+
: `gated combination did not match; status=${gated.status} accessGatedPresent=${gated.body.includes('data-surface="access-gated"')} localLoginPresent=${gated.body.includes('data-surface="local-login"')} principalReadPresent=${gated.body.includes('data-role="principal-read"')}`,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Fallback combination
|
|
84
|
+
const fallback = await fetchDom(url, 'principalDirectory,roleModel,auditLog');
|
|
85
|
+
const fallbackOk =
|
|
86
|
+
fallback.status === 200 &&
|
|
87
|
+
fallback.body.includes('data-surface="local-login"') &&
|
|
88
|
+
!fallback.body.includes('data-surface="access-gated"');
|
|
89
|
+
results.push({
|
|
90
|
+
anchorAcId: 'AC-34108-1',
|
|
91
|
+
verdict: fallbackOk ? 'pass' : 'fail',
|
|
92
|
+
detail: fallbackOk
|
|
93
|
+
? `fallback: HTTP 200 with data-surface=local-login, no data-surface=access-gated at ${fallback.target}`
|
|
94
|
+
: `fallback combination did not match; status=${fallback.status} localLoginPresent=${fallback.body.includes('data-surface="local-login"')} accessGatedPresent=${fallback.body.includes('data-surface="access-gated"')}`,
|
|
95
|
+
});
|
|
96
|
+
} finally {
|
|
97
|
+
await stop(proc);
|
|
98
|
+
}
|
|
99
|
+
return { results };
|
|
100
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Probe: audit event secrecy - 10 records after 5 pass + 5 reject, no forbidden substrings.
|
|
2
|
+
// anchorAcId: AC-34106-1. accountBound: false.
|
|
3
|
+
|
|
4
|
+
export const anchorAcId = 'AC-34106-1';
|
|
5
|
+
export const accountBound = false;
|
|
6
|
+
|
|
7
|
+
export default async function runProbe() {
|
|
8
|
+
const { bootFixtureJwks, loadValidator, fixtureEnv, FIXTURE_AUDIENCE, FIXTURE_ISSUER } = await import('./probe-utils.mjs');
|
|
9
|
+
|
|
10
|
+
const boot = await bootFixtureJwks();
|
|
11
|
+
const createAccessValidator = await loadValidator();
|
|
12
|
+
|
|
13
|
+
const sink = [];
|
|
14
|
+
const validator = createAccessValidator({ env: fixtureEnv(boot.jwksUrl), eventSink: (r) => sink.push(r) });
|
|
15
|
+
|
|
16
|
+
const tokens = [];
|
|
17
|
+
// 5 pass runs
|
|
18
|
+
for (let i = 0; i < 5; i++) {
|
|
19
|
+
const jwt = boot.signerMod.fixtureAccessJwt({
|
|
20
|
+
key: boot.key,
|
|
21
|
+
profile: { issuer: FIXTURE_ISSUER, audience: FIXTURE_AUDIENCE },
|
|
22
|
+
principal: { email: `user${i}@example.com`, sub: `user:u${i}`, groups: ['members'] },
|
|
23
|
+
ttlSec: 60,
|
|
24
|
+
});
|
|
25
|
+
tokens.push(jwt);
|
|
26
|
+
const req = new Request(`https://cf-edge.fixture/pass/${i}`, { headers: { 'Cf-Access-Jwt-Assertion': jwt } });
|
|
27
|
+
await validator.middleware(req);
|
|
28
|
+
}
|
|
29
|
+
// 5 reject runs (missing header)
|
|
30
|
+
for (let i = 0; i < 5; i++) {
|
|
31
|
+
const req = new Request(`https://cf-edge.fixture/reject/${i}`);
|
|
32
|
+
await validator.middleware(req);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const results = [];
|
|
36
|
+
const allowed = ['email', 'outcome', 'path', 'timestamp'];
|
|
37
|
+
const shapeOk = sink.length === 10 && sink.every((r) => Object.keys(r).sort().join(',') === allowed.join(','));
|
|
38
|
+
results.push({
|
|
39
|
+
anchorAcId: 'AC-34106-1',
|
|
40
|
+
verdict: shapeOk ? 'pass' : 'fail',
|
|
41
|
+
detail: shapeOk
|
|
42
|
+
? `10 audit records, allowed keys only (${allowed.join(',')})`
|
|
43
|
+
: `unexpected sink shape; count=${sink.length} sample=${JSON.stringify(sink[0] ?? null)}`,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// No forbidden substrings across the serialised sink.
|
|
47
|
+
const serialised = JSON.stringify(sink);
|
|
48
|
+
const forbidden = [];
|
|
49
|
+
for (const jwt of tokens) {
|
|
50
|
+
const parts = jwt.split('.');
|
|
51
|
+
// Include full JWT, header segment, payload segment and signature segment individually.
|
|
52
|
+
for (const seg of [jwt, parts[0], parts[1], parts[2]]) {
|
|
53
|
+
if (seg && serialised.includes(seg)) forbidden.push(`token-segment len=${seg.length}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const header of ['Cf-Access-Jwt-Assertion', 'Authorization', 'CF-Access-Client-Id', 'CF-Access-Client-Secret']) {
|
|
57
|
+
if (serialised.includes(header)) forbidden.push(`header-name ${header}`);
|
|
58
|
+
}
|
|
59
|
+
const secrecyOk = forbidden.length === 0;
|
|
60
|
+
results.push({
|
|
61
|
+
anchorAcId: 'AC-34106-1',
|
|
62
|
+
verdict: secrecyOk ? 'pass' : 'fail',
|
|
63
|
+
detail: secrecyOk
|
|
64
|
+
? `no forbidden substrings in the serialised sink; ran 5 pass + 5 reject; sink JSON bytes=${serialised.length}`
|
|
65
|
+
: `forbidden substrings found: ${JSON.stringify(forbidden)}`,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await boot.stop();
|
|
69
|
+
return { results };
|
|
70
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Probe: JWT validator - fixture-signed JWT validates and principal reduces onto request.auth.
|
|
2
|
+
// anchorAcId: AC-34101-1. accountBound: false.
|
|
3
|
+
|
|
4
|
+
export const anchorAcId = 'AC-34101-1';
|
|
5
|
+
export const accountBound = false;
|
|
6
|
+
|
|
7
|
+
export default async function runProbe() {
|
|
8
|
+
const { bootFixtureJwks, loadValidator, fixtureEnv, FIXTURE_AUDIENCE, FIXTURE_ISSUER } = await import('./probe-utils.mjs');
|
|
9
|
+
|
|
10
|
+
const boot = await bootFixtureJwks();
|
|
11
|
+
const createAccessValidator = await loadValidator();
|
|
12
|
+
|
|
13
|
+
const sink = [];
|
|
14
|
+
const validator = createAccessValidator({ env: fixtureEnv(boot.jwksUrl), eventSink: (r) => sink.push(r) });
|
|
15
|
+
|
|
16
|
+
const jwt = boot.signerMod.fixtureAccessJwt({
|
|
17
|
+
key: boot.key,
|
|
18
|
+
profile: { issuer: FIXTURE_ISSUER, audience: FIXTURE_AUDIENCE },
|
|
19
|
+
principal: { email: 'ada@example.com', sub: 'user:ada', groups: ['admins', 'shipping'] },
|
|
20
|
+
ttlSec: 60,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const req = new Request('https://cf-edge.fixture/protected', {
|
|
24
|
+
headers: { 'Cf-Access-Jwt-Assertion': jwt },
|
|
25
|
+
});
|
|
26
|
+
const outcome = await validator.middleware(req);
|
|
27
|
+
const results = [];
|
|
28
|
+
|
|
29
|
+
const principal = outcome.outcome?.principal;
|
|
30
|
+
const okShape =
|
|
31
|
+
outcome.rejected === false &&
|
|
32
|
+
principal &&
|
|
33
|
+
principal.email === 'ada@example.com' &&
|
|
34
|
+
principal.sub === 'user:ada' &&
|
|
35
|
+
Array.isArray(principal.groups) &&
|
|
36
|
+
principal.groups.length === 2 &&
|
|
37
|
+
req.auth &&
|
|
38
|
+
req.auth.email === 'ada@example.com';
|
|
39
|
+
|
|
40
|
+
results.push({
|
|
41
|
+
anchorAcId: 'AC-34101-1',
|
|
42
|
+
verdict: okShape ? 'pass' : 'fail',
|
|
43
|
+
detail: okShape
|
|
44
|
+
? `validator resolved; principal reduces to {email:${principal.email}, sub:${principal.sub}, groups:${JSON.stringify(principal.groups)}}; request.auth attached; audit outcome=validated`
|
|
45
|
+
: `validator did not resolve as expected; outcome=${JSON.stringify(outcome)} request.auth=${JSON.stringify(req.auth ?? null)}`,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Audit sink should hold one record, allowed keys only, outcome=validated.
|
|
49
|
+
const record = sink[sink.length - 1];
|
|
50
|
+
const allowed = new Set(['email', 'outcome', 'timestamp', 'path']);
|
|
51
|
+
const extraKeys = record ? Object.keys(record).filter((k) => !allowed.has(k)) : ['(no record)'];
|
|
52
|
+
const auditOk = sink.length === 1 && record && record.outcome === 'validated' && record.email === 'ada@example.com' && record.path === '/protected' && extraKeys.length === 0;
|
|
53
|
+
results.push({
|
|
54
|
+
anchorAcId: 'AC-34101-1',
|
|
55
|
+
verdict: auditOk ? 'pass' : 'fail',
|
|
56
|
+
detail: auditOk
|
|
57
|
+
? `one audit record with allowed keys only; outcome=validated email=${record.email} path=${record.path}`
|
|
58
|
+
: `unexpected audit shape; count=${sink.length} record=${JSON.stringify(record ?? null)} extraKeys=${JSON.stringify(extraKeys)}`,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await boot.stop();
|
|
62
|
+
return { results };
|
|
63
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Probe: JWT validator reject cases - missing, expired, mis-signed each return 401 with metadata-only audit event.
|
|
2
|
+
// anchorAcId: AC-34102-1. accountBound: false.
|
|
3
|
+
|
|
4
|
+
export const anchorAcId = 'AC-34102-1';
|
|
5
|
+
export const accountBound = false;
|
|
6
|
+
|
|
7
|
+
export default async function runProbe() {
|
|
8
|
+
const { bootFixtureJwks, loadValidator, fixtureEnv, FIXTURE_AUDIENCE, FIXTURE_ISSUER } = await import('./probe-utils.mjs');
|
|
9
|
+
|
|
10
|
+
const boot = await bootFixtureJwks();
|
|
11
|
+
const createAccessValidator = await loadValidator();
|
|
12
|
+
|
|
13
|
+
const results = [];
|
|
14
|
+
const subcases = [];
|
|
15
|
+
|
|
16
|
+
// 1. Missing header
|
|
17
|
+
{
|
|
18
|
+
const sink = [];
|
|
19
|
+
const validator = createAccessValidator({ env: fixtureEnv(boot.jwksUrl), eventSink: (r) => sink.push(r) });
|
|
20
|
+
const req = new Request('https://cf-edge.fixture/protected');
|
|
21
|
+
const outcome = await validator.middleware(req);
|
|
22
|
+
subcases.push({
|
|
23
|
+
name: 'missing',
|
|
24
|
+
rejected: outcome.rejected,
|
|
25
|
+
status: outcome.response?.status,
|
|
26
|
+
auditCount: sink.length,
|
|
27
|
+
auditOutcome: sink[0]?.outcome,
|
|
28
|
+
auditKeys: sink[0] ? Object.keys(sink[0]).sort() : null,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 2. Expired (SIMULATE_EXPIRED_JWT flag forces the code path)
|
|
33
|
+
{
|
|
34
|
+
const sink = [];
|
|
35
|
+
const validator = createAccessValidator({ env: fixtureEnv(boot.jwksUrl), eventSink: (r) => sink.push(r) });
|
|
36
|
+
const jwt = boot.signerMod.fixtureAccessJwt({
|
|
37
|
+
key: boot.key,
|
|
38
|
+
profile: { issuer: FIXTURE_ISSUER, audience: FIXTURE_AUDIENCE },
|
|
39
|
+
principal: { email: 'grace@example.com', sub: 'user:grace' },
|
|
40
|
+
ttlSec: 60,
|
|
41
|
+
});
|
|
42
|
+
const req = new Request('https://cf-edge.fixture/protected', { headers: { 'Cf-Access-Jwt-Assertion': jwt } });
|
|
43
|
+
const outcome = await validator.middleware(req, { SIMULATE_EXPIRED_JWT: true });
|
|
44
|
+
subcases.push({
|
|
45
|
+
name: 'expired',
|
|
46
|
+
rejected: outcome.rejected,
|
|
47
|
+
status: outcome.response?.status,
|
|
48
|
+
auditCount: sink.length,
|
|
49
|
+
auditOutcome: sink[0]?.outcome,
|
|
50
|
+
auditKeys: sink[0] ? Object.keys(sink[0]).sort() : null,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 3. Mis-signed: sign with a DIFFERENT key, JWKS only carries the fixture key.
|
|
55
|
+
{
|
|
56
|
+
const sink = [];
|
|
57
|
+
const validator = createAccessValidator({ env: fixtureEnv(boot.jwksUrl), eventSink: (r) => sink.push(r) });
|
|
58
|
+
const wrongKey = boot.signerMod.createFixtureKey(boot.key.kid); // same kid so JWKS lookup hits, but a different keypair
|
|
59
|
+
const jwt = boot.signerMod.fixtureAccessJwt({
|
|
60
|
+
key: wrongKey,
|
|
61
|
+
profile: { issuer: FIXTURE_ISSUER, audience: FIXTURE_AUDIENCE },
|
|
62
|
+
principal: { email: 'evil@example.com', sub: 'user:evil' },
|
|
63
|
+
ttlSec: 60,
|
|
64
|
+
});
|
|
65
|
+
const req = new Request('https://cf-edge.fixture/protected', { headers: { 'Cf-Access-Jwt-Assertion': jwt } });
|
|
66
|
+
const outcome = await validator.middleware(req);
|
|
67
|
+
subcases.push({
|
|
68
|
+
name: 'mis-signed',
|
|
69
|
+
rejected: outcome.rejected,
|
|
70
|
+
status: outcome.response?.status,
|
|
71
|
+
auditCount: sink.length,
|
|
72
|
+
auditOutcome: sink[0]?.outcome,
|
|
73
|
+
auditKeys: sink[0] ? Object.keys(sink[0]).sort() : null,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Note the mutation-check pair for the negative fires:
|
|
78
|
+
// Fires on the shipped code path (no bypass): every rejected===true, status===401, auditCount===1, audit keys drawn from allowed set.
|
|
79
|
+
// A mutation that removes the sink.push()/early-return call in the missing branch would drop auditCount to 0 (subcase would fail).
|
|
80
|
+
|
|
81
|
+
const allowed = ['email', 'outcome', 'path', 'timestamp'];
|
|
82
|
+
for (const sc of subcases) {
|
|
83
|
+
const ok = sc.rejected === true && sc.status === 401 && sc.auditCount === 1 && sc.auditKeys && sc.auditKeys.join(',') === allowed.join(',');
|
|
84
|
+
results.push({
|
|
85
|
+
anchorAcId: 'AC-34102-1',
|
|
86
|
+
verdict: ok ? 'pass' : 'fail',
|
|
87
|
+
detail: ok
|
|
88
|
+
? `subcase ${sc.name}: 401 with one audit event, allowed keys only (${sc.auditKeys.join(',')}), outcome=${sc.auditOutcome}`
|
|
89
|
+
: `subcase ${sc.name} broke: ${JSON.stringify(sc)}`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
await boot.stop();
|
|
94
|
+
return { results };
|
|
95
|
+
}
|