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.
- package/CHANGELOG.md +18 -0
- package/blueprints/application-account-settings/docs/topics.md +7 -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 +7 -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 +7 -1
- package/blueprints/application-charts/docs/topics.md +7 -1
- package/blueprints/application-dashboard/docs/topics.md +7 -1
- package/blueprints/application-datatable/docs/topics.md +7 -1
- package/blueprints/application-empty-error-states/docs/topics.md +7 -1
- package/blueprints/application-error-handling/docs/topics.md +7 -1
- package/blueprints/application-file-upload/docs/topics.md +7 -1
- package/blueprints/application-forms-wizard/docs/topics.md +7 -1
- package/blueprints/application-notifications-in-app/docs/topics.md +7 -1
- package/blueprints/application-onboarding-tour/docs/topics.md +7 -1
- package/blueprints/application-spa/docs/topics.md +7 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +7 -1
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +7 -1
- 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 +7 -1
- package/blueprints/jobs-background/docs/topics.md +7 -1
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +7 -1
- package/blueprints/object-storage-s3/docs/topics.md +7 -1
- package/blueprints/observability-essentials/docs/topics.md +7 -1
- package/blueprints/observability-logging/docs/topics.md +7 -1
- package/blueprints/observability-probe-endpoints/docs/topics.md +7 -1
- package/blueprints/persistence-data-d1/docs/topics.md +7 -1
- package/blueprints/persistence-data-postgres/docs/topics.md +7 -1
- package/blueprints/persistence-data-sqlite/docs/topics.md +7 -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 +7 -1
- package/blueprints/security-auth-keycloak/docs/topics.md +7 -1
- package/blueprints/security-auth-magic-link/docs/topics.md +7 -1
- package/blueprints/security-auth-oauth2/docs/topics.md +7 -1
- package/blueprints/security-secrets-management/docs/topics.md +7 -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-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-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-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-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-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 +11 -1
|
@@ -53,7 +53,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
53
53
|
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
54
54
|
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
55
55
|
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
56
|
-
| application-admin-console | 21101-21899 | 22xx | shipped v1.
|
|
56
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.1.0 | `adminConsoleSignInSurface` |
|
|
57
57
|
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
58
58
|
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
59
59
|
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
@@ -63,6 +63,12 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
63
63
|
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
64
64
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
65
65
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
66
|
+
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
67
|
+
| platform-cloudflare-cron-triggers | 32101-32899 | 33xx | shipped v1.0.0 | `scheduledTriggerContract` |
|
|
68
|
+
| platform-cloudflare-durable-objects | 33101-33899 | 34xx | shipped v1.0.0 | `strongConsistencyCellContract`, `websocketHubContract` |
|
|
69
|
+
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
70
|
+
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
71
|
+
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
66
72
|
|
|
67
73
|
US 6101-6110 sit at the LOW end of the 6101-6899 band on purpose. A project-side story that mechanically derives from `delivery-ci-workflows-REQ-011` into the number `6111` would collide against delivery-ci-workflows-US-6111 in this package; the band leaves headroom at the HIGH end (US 6181-6899) so a project's own stories anchored to delivery-ci-workflows REQs can allocate without conflict. The watchpost run4 lesson applies here too.
|
|
68
74
|
|
|
@@ -39,7 +39,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
39
39
|
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
40
40
|
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
41
41
|
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
42
|
-
| application-admin-console | 21101-21899 | 22xx | shipped v1.
|
|
42
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.1.0 | `adminConsoleSignInSurface` |
|
|
43
43
|
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
44
44
|
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
45
45
|
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
@@ -49,6 +49,12 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
49
49
|
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
50
50
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
51
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` |
|
|
52
58
|
|
|
53
59
|
US 12101-12112 sit at the LOW end of the 12101-12899 band on purpose. A project-side story that mechanically derives from a deploy-cloudflare-workers REQ id into the number `12112` would collide against deploy-cloudflare-workers-US-12112 in this package; the band leaves headroom at the HIGH end (US 12181-12899) so a project's own stories anchored to deploy-cloudflare-workers REQs can allocate without conflict. The watchpost run4 lesson applies here too. Band spacing between the last shipped block (security-secrets-management, 8101-8899, 9xx) and this one (12101-12899, 13xx) leaves the 9xxx-11xxx US bands and the 10xx-12xx suffix blocks open for concurrent-lane authoring so a peer authoring another blueprint in the same PR window does not collide with this one.
|
|
54
60
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `edge-cloudflare-access` are recorded here. The shape follows Keep a Changelog and Semantic Versioning per the blueprint authoring standard.
|
|
4
|
+
|
|
5
|
+
## 1.0.0 (2026-09-07)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- v1.0.0 mint of the `edge-cloudflare-access` blueprint, category `edge`, capabilities `["zeroTrustGate"]`. Ships a shipped JWT validator middleware that is the sole reader of the `Cf-Access-Jwt-Assertion` header per REQ-001, an Access application declaration surface with elicited hostname or self-hosted-app id, an elicited policy shape from the enum (email-domain, service-token-only, service-token-plus-email-domain, group-membership), a metadata-only audit event contract per REQ-004, and a break-glass posture per REQ-005 with an elicited service-auth pair for CI-signed automation.
|
|
10
|
+
- 6 REQs (`edge-cloudflare-access-REQ-001..006`), 9 USs (`edge-cloudflare-access-US-34101..34109`), 4 TACs (`TAC-3501` JWT validator, `TAC-3502` Access application declaration, `TAC-3503` policy shape enum, `TAC-3504` audit sink), 4 ADRs (`ADR-3501` scope-global on new topic `edgeAuthenticationGate` with `standardsTraceClause: Cloudflare Access policy actions and rule selectors`; `ADR-3502` identity provider elicited with `recommendedDefault: null`; `ADR-3503` policy scope elicited with `recommendedDefault: application-level`; `ADR-3504` audit retention delegated to the applied logging companion with sentinel clause).
|
|
11
|
+
- 6 Node-only probes under `contributions/probes/`: `jwt-validator-fixture` (fixture-signed JWT validates and principal reduces to `{email, sub, groups}` on request.auth), `jwt-validator-reject` (three subcases: missing header, expired exp, mis-signed each return 401 with one metadata-only audit event), `admin-console-gate-surface` (extended admin-console fixture flips its sign-in surface per applied capability set; covers `AC-34108-1`), `audit-event-secrecy` (5 pass + 5 reject runs produce 10 metadata-only records with no forbidden substrings, no token slices, no header names beyond `path`), `real-account-gated-url` (`accountBound: true`; records `accountBoundSkipped: true` in CI without `CI_HAS_CLOUDFLARE_ACCOUNT` per spec section 3.5) and `wrangler-seam` (drives `wrangler dev --local` on the fixture; `/protected` returns HTTP 401 on the shipped validator's missing-header reject path; `/health` returns HTTP 200 exempt; warn semantics per section 3.1 pass-with-skip if wrangler is missing or fails to bind).
|
|
12
|
+
- 6 elicited parameters on `blueprint.json`: `access-application-host` (or `access-selfhosted-app-id`, exactly one required), `access-audience`, `access-jwks-url`, `access-policy-shape` (enum default `email-domain`), `access-bypass-service-auth-id` (blank disables break-glass).
|
|
13
|
+
- `suggestedCompanions`: `logging` (for the metadata-only audit sink retention), `errorHandling` (for the validator failure boundary) and `secretsManagement` (for the paired break-glass service-auth secret).
|
|
14
|
+
- Ships the shared `cf-edge` sample-app fixture at `packages/rcf-lite/test/fixtures/cf-edge/` (T-4 mints it per spec section 3.3). The fixture ships the applied Worker (`src/index.mjs`), the JWT validator (`src/jwt-validator.mjs`, sole reader of the `Cf-Access-Jwt-Assertion` header), a dependency-free RS256 fixture-JWT signer (`test/jwt-signer.mjs`) and a local JWKS server (`test/jwks-server.mjs`). No new rcf-lite runtime dependency (Node's built-in `crypto` module signs and verifies).
|
|
15
|
+
- Extends `packages/rcf-lite/test/fixtures/probe-pack-application-admin-console/` with a `/admin/sign-in` route rendering the Access-gated surface (with `?caps=zeroTrustGate`) or the local-login surface (without). The extension rides `application-admin-console` v1.1.0.
|
|
16
|
+
- Anatomy test at `packages/rcf-lite/test/blueprint/edge-cloudflare-access-anatomy.test.js` covers `TS-110..119` on the T-4 chain slice (blueprint shape, contributions cross-check, JWT validator behaviour, sole-reader guarantee, audit-event secrecy, break-glass posture, admin-console composition, fixture files, ADR bodies and clauses, guide sections and vendor URL).
|
|
17
|
+
|
|
18
|
+
### Known limitations
|
|
19
|
+
|
|
20
|
+
- The `real-account-gated-url` probe records `accountBoundSkipped: true` and aggregates to `pass` when `CI_HAS_CLOUDFLARE_ACCOUNT` or `CF_ACCESS_HOST` are unset (spec section 3.5 pass-with-skip). Full mechanism reach requires a CI environment with both env vars set and a deployed hostname behind an issued Zero Trust policy.
|
|
21
|
+
- The v1.0.0 boundary defers per-path policy scope authoring, group-membership rule authoring and identity-provider federation to v1.1.0. The shipped validator observes the JWT's `groups` claim but does not enforce policy on it (the Cloudflare edge enforces before the request reaches the origin Worker); a future minor could ship a group-membership refinement.
|
|
22
|
+
- The `wrangler-seam` probe warns (never fails) when `wrangler` is not installed under `packages/rcf-lite/test/fixtures/cf-edge/node_modules/.bin/wrangler`; a handler thrown at the workerd boundary is a genuine fail per the round-6 T-3 gate directive.
|
|
23
|
+
- The Access-gated sign-in surface on `application-admin-console` v1.1.0 shows a placeholder principal email in the fixture (supplied via `?principalEmail=` or `ADMIN_CONSOLE_PRINCIPAL_EMAIL` env var). In a real deployment the principal reads from `request.auth.email` the JWT validator attaches; the fixture does not embed the validator (it renders the surface).
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# edge-cloudflare-access
|
|
2
|
+
|
|
3
|
+
A rcf-lite blueprint that ships an opinionated wiring for Cloudflare
|
|
4
|
+
Access as the edge authentication gate on a Workers project. One
|
|
5
|
+
JWT validator middleware sits at the top of every fetch handler,
|
|
6
|
+
verifies the JWT Cloudflare Access mints against the JWKS the
|
|
7
|
+
service publishes, and reduces the principal onto `request.auth` as
|
|
8
|
+
`{email, sub, groups}`. Every audit event carries only
|
|
9
|
+
`{email, outcome, timestamp, path}`; no token slice, no header
|
|
10
|
+
value beyond `path` ever leaves the validator boundary.
|
|
11
|
+
|
|
12
|
+
- Version: `1.0.0`
|
|
13
|
+
- Category: `edge`
|
|
14
|
+
- Capabilities: `["zeroTrustGate"]`
|
|
15
|
+
- Suggested companions: `logging`, `errorHandling`, `secretsManagement`
|
|
16
|
+
|
|
17
|
+
## When to reach for it
|
|
18
|
+
|
|
19
|
+
- Any Cloudflare Workers project that needs an authenticated edge
|
|
20
|
+
(only authenticated principals reach the origin Worker).
|
|
21
|
+
- Any project that has adopted the Zero Trust posture and wants a
|
|
22
|
+
vendor-neutral seam (`request.auth`) between the edge and the
|
|
23
|
+
downstream handler.
|
|
24
|
+
- Compose with `application-admin-console` v1.1.0 for the Access-gated
|
|
25
|
+
sign-in surface (round-4 T-4 capability-minor pattern).
|
|
26
|
+
|
|
27
|
+
## The six REQs
|
|
28
|
+
|
|
29
|
+
| REQ | What |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `edge-cloudflare-access-REQ-001` | The JWT validator is the sole reader of the `Cf-Access-Jwt-Assertion` header and reduces the principal onto `request.auth`. |
|
|
32
|
+
| `edge-cloudflare-access-REQ-002` | An Access application is declared with an elicited hostname or self-hosted-app id and an elicited policy shape from the enum. |
|
|
33
|
+
| `edge-cloudflare-access-REQ-003` | The operator issues a Zero Trust policy via the guide's dashboard walk-through or the alternative API path. |
|
|
34
|
+
| `edge-cloudflare-access-REQ-004` | The audit event carries only `{email, outcome, timestamp, path}` with no token value or headers. |
|
|
35
|
+
| `edge-cloudflare-access-REQ-005` | Break-glass posture: an elicited bypass-service-auth pair authenticates CI automation. |
|
|
36
|
+
| `edge-cloudflare-access-REQ-006` | Composition with `application-admin-console` v1.1.0: the sign-in surface flips per applied capability set. |
|
|
37
|
+
|
|
38
|
+
## The wired shape
|
|
39
|
+
|
|
40
|
+
The validator is the one place the `Cf-Access-Jwt-Assertion` header
|
|
41
|
+
is read. Consumers reach the reduced principal via `request.auth`.
|
|
42
|
+
The public surface is:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
createAccessValidator({ env, eventSink, fetch?, clock?, bypassServiceAuth? })
|
|
46
|
+
-> { validate, middleware }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Where `env` carries the elicited `ACCESS_JWKS_URL` and `ACCESS_AUDIENCE`.
|
|
50
|
+
The `middleware(request, envSwitches?)` returns either
|
|
51
|
+
`{rejected: true, response, outcome}` for a 401 rejection or
|
|
52
|
+
`{rejected: false, outcome}` after attaching `request.auth` in place.
|
|
53
|
+
|
|
54
|
+
## Elicited parameters
|
|
55
|
+
|
|
56
|
+
- `access-application-host` OR `access-selfhosted-app-id`: pick
|
|
57
|
+
exactly one at apply. The dashboard walk-through follows the
|
|
58
|
+
hostname path when the first is set and the self-hosted-app id
|
|
59
|
+
path when the second is set.
|
|
60
|
+
- `access-audience`: the JWT audience tag the Access policy issues
|
|
61
|
+
the validator refuses tokens whose `aud` claim does not match.
|
|
62
|
+
- `access-jwks-url`: the JWKS endpoint URL the validator fetches.
|
|
63
|
+
Cloudflare Access publishes this at
|
|
64
|
+
`https://<team>.cloudflareaccess.com/cdn-cgi/access/certs`.
|
|
65
|
+
- `access-policy-shape` (default `email-domain`): one of
|
|
66
|
+
`email-domain`, `service-token-only`,
|
|
67
|
+
`service-token-plus-email-domain`, `group-membership`. Drives
|
|
68
|
+
the guide walk-through and the API alternative.
|
|
69
|
+
- `access-bypass-service-auth-id`: leave blank to disable
|
|
70
|
+
break-glass. When set, the paired secret is delegated to the
|
|
71
|
+
applied `secretsManagement` companion via
|
|
72
|
+
`security-secrets-management`.
|
|
73
|
+
|
|
74
|
+
## The six probes
|
|
75
|
+
|
|
76
|
+
The probes live under `contributions/probes/`. Each has a matching
|
|
77
|
+
`run-<probe-name>.mjs` shim that writes a per-blueprint report to
|
|
78
|
+
`.rcf/reports/blueprints/edge-cloudflare-access/<probe-name>.json`
|
|
79
|
+
under the fixture root.
|
|
80
|
+
|
|
81
|
+
| Probe | anchorAcId | accountBound | What it covers |
|
|
82
|
+
| --- | --- | --- | --- |
|
|
83
|
+
| `jwt-validator-fixture.mjs` | `AC-34101-1` | false | Fixture-signed JWT validates; principal reduces to `{email, sub, groups}` on request.auth; one audit event with `outcome: validated` and allowed keys only. |
|
|
84
|
+
| `jwt-validator-reject.mjs` | `AC-34102-1` | false | Three subcases: missing header, expired exp, mis-signed each return HTTP 401 with exactly one audit event whose keys are drawn from the allowed set; outcomes: `missing`, `expired`, `invalid`. |
|
|
85
|
+
| `admin-console-gate-surface.mjs` | `AC-34108-1` | false | The extended admin-console fixture flips the sign-in surface: with `?caps=zeroTrustGate` it renders `[data-surface=access-gated]`; without it renders `[data-surface=local-login]`. Mutually exclusive on both branches. |
|
|
86
|
+
| `audit-event-secrecy.mjs` | `AC-34106-1` | false | After 5 pass + 5 reject runs, the audit sink holds 10 metadata-only records; the serialised sink contains no substring of any JWT (or its segments) and no header names beyond `path`. |
|
|
87
|
+
| `real-account-gated-url.mjs` | `AC-34109-1` | true | Fetch against a scheduled Access-configured hostname (`CF_ACCESS_HOST`) with `CI_HAS_CLOUDFLARE_ACCOUNT=true` follows the redirect chain to a `<team>.cloudflareaccess.com` URL. Records `accountBoundSkipped: true` without both env vars (pass-with-skip). |
|
|
88
|
+
| `wrangler-seam.mjs` | `AC-34101-1` | false | Spawns `wrangler dev --local` on the cf-edge fixture. `/protected` returns HTTP 401 on the shipped validator's missing-header reject path (workerd boundary); `/health` returns HTTP 200 exempt. Warn semantics per section 3.1 pass-with-skip if wrangler is missing or fails to bind; a handler thrown at the workerd boundary is a fail. |
|
|
89
|
+
|
|
90
|
+
## Mechanism-reach note
|
|
91
|
+
|
|
92
|
+
- `AC-34101-1` (fixture JWT validate) and `AC-34102-1` (reject) are
|
|
93
|
+
covered by the in-process probes plus the wrangler-seam probe
|
|
94
|
+
under workerd.
|
|
95
|
+
- `AC-34103-1` (sole-reader guarantee) is covered by the anatomy
|
|
96
|
+
test that greps `src/**/*.mjs` for the header string.
|
|
97
|
+
- `AC-34104-1` (Access application declaration) is covered by the
|
|
98
|
+
anatomy test that reads `blueprint.json` for the elicits[] shape.
|
|
99
|
+
- `AC-34105-1` (guide dashboard walk-through and API alternative)
|
|
100
|
+
is covered by the anatomy test that greps the shipped guide file
|
|
101
|
+
for the two section headings and the vendor URL.
|
|
102
|
+
- `AC-34106-1` (audit metadata secrecy) is covered by the
|
|
103
|
+
`audit-event-secrecy` probe.
|
|
104
|
+
- `AC-34107-1` (break-glass posture) is covered by the anatomy
|
|
105
|
+
test that drives the validator with an elicited pair.
|
|
106
|
+
- `AC-34108-1` (admin-console composition) is covered by the
|
|
107
|
+
`admin-console-gate-surface` probe (both branches) and by the
|
|
108
|
+
shipped `application-admin-console.pack.mjs` pack check
|
|
109
|
+
`AC-21815-1` (Playwright-driven on the extended fixture).
|
|
110
|
+
- `AC-34109-1` (real-account gated URL) is covered by the
|
|
111
|
+
`real-account-gated-url` probe (skipped in CI without both env
|
|
112
|
+
vars per section 3.5).
|
|
113
|
+
|
|
114
|
+
## Two-line gate-reviewer boot
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
cd packages/rcf-lite/test/fixtures/cf-edge
|
|
118
|
+
pnpm install --ignore-workspace
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Then run every probe:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
node ../../../../../blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-fixture.mjs
|
|
125
|
+
node ../../../../../blueprints/edge-cloudflare-access/contributions/probes/run-jwt-validator-reject.mjs
|
|
126
|
+
node ../../../../../blueprints/edge-cloudflare-access/contributions/probes/run-audit-event-secrecy.mjs
|
|
127
|
+
node ../../../../../blueprints/edge-cloudflare-access/contributions/probes/run-admin-console-gate-surface.mjs
|
|
128
|
+
node ../../../../../blueprints/edge-cloudflare-access/contributions/probes/run-real-account-gated-url.mjs
|
|
129
|
+
node ../../../../../blueprints/edge-cloudflare-access/contributions/probes/run-wrangler-seam.mjs
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Each probe prints a report envelope and writes it to
|
|
133
|
+
`.rcf/reports/blueprints/edge-cloudflare-access/<probe-name>.json`.
|
|
134
|
+
|
|
135
|
+
## Composition companion
|
|
136
|
+
|
|
137
|
+
- `application-admin-console` v1.1.0 consumes `zeroTrustGate`
|
|
138
|
+
optionally: the admin-console's sign-in surface renders
|
|
139
|
+
Access-gated when `zeroTrustGate` is in the applied set (and
|
|
140
|
+
falls back to `security-auth-*` local login otherwise). The
|
|
141
|
+
v1.1.0 minor rides this PR (round-4 T-4 capability-minor pattern).
|
|
@@ -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
|
+
}
|