rcf-lite 0.12.0 → 0.14.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 +39 -0
- package/README.md +2 -0
- package/bin/rcf.js +3 -1
- package/bin/view-supervisor-child.mjs +0 -0
- package/blueprints/application-api-rest/README.md +40 -0
- package/blueprints/application-api-rest/assets/middleware/auth-classes.md +45 -0
- package/blueprints/application-api-rest/assets/openapi/openapi-skeleton.yaml +322 -0
- package/blueprints/application-api-rest/assets/sample-data/sample-resources.json +53 -0
- package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +204 -0
- package/blueprints/application-api-rest/blueprint.json +265 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +25 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +18 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +48 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +41 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +46 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +46 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +40 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +46 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +90 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +90 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +64 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +73 -0
- package/blueprints/application-api-rest/docs/topics.md +46 -0
- package/blueprints/application-api-rest/guide/application-api-rest.md +41 -0
- package/blueprints/application-spa/README.md +90 -0
- package/blueprints/application-spa/assets/component-specs/actions-and-text-inputs.md +36 -0
- package/blueprints/application-spa/assets/component-specs/data-display.md +19 -0
- package/blueprints/application-spa/assets/component-specs/feedback-and-status.md +27 -0
- package/blueprints/application-spa/assets/component-specs/overlays.md +23 -0
- package/blueprints/application-spa/assets/component-specs/selection-controls.md +23 -0
- package/blueprints/application-spa/assets/sample-data/sample-entities.json +41 -0
- package/blueprints/application-spa/assets/tokens/design-tokens.json +140 -0
- package/blueprints/application-spa/assets/tokens/theme.css +169 -0
- package/blueprints/application-spa/assets/viewports.md +18 -0
- package/blueprints/application-spa/assets/wireframes/dashboard.md +48 -0
- package/blueprints/application-spa/assets/wireframes/detail.md +40 -0
- package/blueprints/application-spa/assets/wireframes/empty.md +31 -0
- package/blueprints/application-spa/assets/wireframes/error.md +46 -0
- package/blueprints/application-spa/assets/wireframes/form.md +50 -0
- package/blueprints/application-spa/assets/wireframes/list.md +45 -0
- package/blueprints/application-spa/assets/wireframes/session-expired.md +35 -0
- package/blueprints/application-spa/assets/wireframes/sign-in.md +41 -0
- package/blueprints/application-spa/assets/wireframes/sign-out.md +32 -0
- package/blueprints/application-spa/blueprint.json +387 -0
- package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +13 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +18 -0
- package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +45 -0
- package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +32 -0
- package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +32 -0
- package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +27 -0
- package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +27 -0
- package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +19 -0
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +57 -0
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +56 -0
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +61 -0
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +70 -0
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +70 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +100 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +81 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +82 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +60 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +60 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +78 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +51 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +72 -0
- package/blueprints/application-spa/docs/topics.md +57 -0
- package/blueprints/application-spa/guide/application-spa.md +40 -0
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +39 -0
- package/blueprints/delivery-ci-workflows/README.md +57 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/default-branch-checks.yml +55 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +65 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/release.yml +71 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/scheduled-audit.yml +61 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +61 -0
- package/blueprints/delivery-ci-workflows/assets/report-samples/per-gate.json +13 -0
- package/blueprints/delivery-ci-workflows/assets/report-samples/pipeline.json +28 -0
- package/blueprints/delivery-ci-workflows/blueprint.json +87 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-701-delivery-ci-workflows-ci-gates.json +30 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-703-delivery-ci-workflows-node-only-runner.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-704-delivery-ci-workflows-report-shape.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-705-delivery-ci-workflows-elicitation-surface.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-709-delivery-ci-workflows-release-artefacts.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-710-delivery-ci-workflows-scheduled-audit.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-701-delivery-ci-workflows-gate-runner.json +59 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-702-delivery-ci-workflows-gate-report.json +32 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-703-delivery-ci-workflows-aggregate-report.json +41 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +64 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +51 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +38 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6105.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6108.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +37 -0
- package/blueprints/delivery-ci-workflows/docs/topics.md +61 -0
- package/blueprints/delivery-ci-workflows/guide/delivery-ci-workflows.md +136 -0
- package/blueprints/deploy-cloudflare-workers/README.md +63 -0
- package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/build-and-upload.yml.md +109 -0
- package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/promote.yml.md +120 -0
- package/blueprints/deploy-cloudflare-workers/assets/verification/served-surface-probes.md +90 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md +87 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/preview-alias-shape.md +86 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/wrangler-toml-shape.md +85 -0
- package/blueprints/deploy-cloudflare-workers/blueprint.json +48 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json +30 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json +35 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +30 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json +25 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json +25 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +54 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +57 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +51 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +64 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +54 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +47 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +46 -0
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +46 -0
- package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +74 -0
- package/blueprints/email-smtp-resend/README.md +45 -0
- package/blueprints/email-smtp-resend/assets/from-address-rotation-pattern.md +44 -0
- package/blueprints/email-smtp-resend/assets/resend-verification-pointer.md +25 -0
- package/blueprints/email-smtp-resend/assets/stub-adapter.md +65 -0
- package/blueprints/email-smtp-resend/blueprint.json +23 -0
- package/blueprints/email-smtp-resend/contributions/adrs/adr-401-email-smtp-resend-transport-choice.json +30 -0
- package/blueprints/email-smtp-resend/contributions/adrs/adr-402-email-smtp-resend-retry-and-backoff-posture.json +30 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +18 -0
- package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +53 -0
- package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +56 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +36 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +36 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +37 -0
- package/blueprints/email-smtp-resend/docs/topics.md +44 -0
- package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +71 -0
- package/blueprints/observability-essentials/README.md +53 -0
- package/blueprints/observability-essentials/assets/probe-samples/liveness-body.json +4 -0
- package/blueprints/observability-essentials/assets/probe-samples/readiness-body.json +18 -0
- package/blueprints/observability-essentials/assets/status-page-samples/status-page-clean.html +22 -0
- package/blueprints/observability-essentials/assets/status-page-samples/status-page-with-notice.html +25 -0
- package/blueprints/observability-essentials/blueprint.json +54 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-803-observability-essentials-status-page-contract.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-804-observability-essentials-probe-secrecy.json +25 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-805-observability-essentials-notification-outcome-model.json +25 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +18 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +32 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +43 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +37 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +42 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +46 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +47 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +46 -0
- package/blueprints/observability-essentials/docs/topics.md +57 -0
- package/blueprints/observability-essentials/guide/observability-essentials.md +68 -0
- package/blueprints/observability-probe-endpoints/README.md +53 -0
- package/blueprints/observability-probe-endpoints/assets/docker/dockerfile-healthcheck.md +19 -0
- package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md +54 -0
- package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes.md +36 -0
- package/blueprints/observability-probe-endpoints/assets/load-balancer/health-check-config.md +23 -0
- package/blueprints/observability-probe-endpoints/assets/systemd/notify-service.md +30 -0
- package/blueprints/observability-probe-endpoints/assets/uptime-monitor/monitor-config.md +22 -0
- package/blueprints/observability-probe-endpoints/blueprint.json +44 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1501-observability-probe-endpoints-health-probes.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1504-observability-probe-endpoints-separate-port-option.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +39 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +40 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +51 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +39 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +46 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +51 -0
- package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +83 -0
- package/blueprints/persistence-data-d1/README.md +50 -0
- package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +72 -0
- package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +115 -0
- package/blueprints/persistence-data-d1/assets/migration-shape/migration-file-shape.md +119 -0
- package/blueprints/persistence-data-d1/assets/wrangler-config/d1-binding-shape.md +93 -0
- package/blueprints/persistence-data-d1/blueprint.json +42 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1401-persistence-data-d1-store-model.json +30 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1402-persistence-data-d1-migration-discipline.json +30 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1403-persistence-data-d1-event-secrecy.json +25 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +25 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1405-persistence-data-d1-recovery-model.json +30 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +18 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +51 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +31 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +38 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +39 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +46 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +46 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +38 -0
- package/blueprints/persistence-data-d1/docs/topics.md +59 -0
- package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +77 -0
- package/blueprints/persistence-data-sqlite/README.md +50 -0
- package/blueprints/persistence-data-sqlite/assets/backup-procedures/hot-checkpoint-note.md +22 -0
- package/blueprints/persistence-data-sqlite/assets/backup-procedures/sqlite-file-copy.md +70 -0
- package/blueprints/persistence-data-sqlite/assets/schema-samples/catalog-file-layout.md +73 -0
- package/blueprints/persistence-data-sqlite/assets/schema-samples/migration-shape.md +76 -0
- package/blueprints/persistence-data-sqlite/blueprint.json +50 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-601-persistence-data-sqlite-store-model.json +30 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-602-persistence-data-sqlite-migration-discipline.json +30 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-603-persistence-data-sqlite-event-secrecy.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-604-persistence-data-sqlite-store-boundary.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-605-persistence-data-sqlite-backup-model.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +57 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +34 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +31 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +33 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +37 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +37 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +37 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +49 -0
- package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +69 -0
- package/blueprints/security-auth-clerk/README.md +52 -0
- package/blueprints/security-auth-clerk/assets/authorisation/role-claim-mapping-sample.md +99 -0
- package/blueprints/security-auth-clerk/assets/middleware/node-middleware-shape.md +86 -0
- package/blueprints/security-auth-clerk/assets/middleware/workers-fetch-shape.md +123 -0
- package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-react.md +48 -0
- package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-vue.md +41 -0
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +51 -0
- package/blueprints/security-auth-clerk/blueprint.json +42 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1001-security-auth-clerk-auth-model.json +30 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1002-security-auth-clerk-middleware-boundary.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1005-security-auth-clerk-session-lifecycle.json +25 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +18 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +42 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +30 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +38 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1004-security-auth-clerk-claims-mapper.json +22 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +38 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +37 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +37 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +36 -0
- package/blueprints/security-auth-clerk/docs/topics.md +56 -0
- package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +80 -0
- package/blueprints/security-auth-keycloak/README.md +56 -0
- package/blueprints/security-auth-keycloak/assets/local-container/keycloak-bootstrap.md +54 -0
- package/blueprints/security-auth-keycloak/assets/middleware/verifier-wiring.md +93 -0
- package/blueprints/security-auth-keycloak/assets/mock-introspection/mock-introspection-shape.md +62 -0
- package/blueprints/security-auth-keycloak/assets/provider-router/router-shape.md +71 -0
- package/blueprints/security-auth-keycloak/assets/realm-skeleton/realm-config-shape.md +55 -0
- package/blueprints/security-auth-keycloak/blueprint.json +49 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1201-security-auth-keycloak-auth-model.json +35 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1202-security-auth-keycloak-verification-mode-choice.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1203-security-auth-keycloak-provider-routing-seam.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1204-security-auth-keycloak-session-vs-token-contract.json +25 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1205-security-auth-keycloak-jwks-rotation-cache-lifetime.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1206-security-auth-keycloak-refresh-and-sign-out-posture.json +25 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +51 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +46 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +32 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +47 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +36 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +36 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +46 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +36 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +74 -0
- package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +81 -0
- package/blueprints/security-auth-magic-link/README.md +46 -0
- package/blueprints/security-auth-magic-link/assets/email-templates/magic-link-email.md +44 -0
- package/blueprints/security-auth-magic-link/assets/email-templates/stub-adapter.md +55 -0
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/allow-list-file.md +46 -0
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +35 -0
- package/blueprints/security-auth-magic-link/blueprint.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-501-security-auth-magic-link-model.json +30 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-502-security-auth-magic-link-token-secrecy.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-503-security-auth-magic-link-anti-enumeration-budget.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-504-security-auth-magic-link-session-lifecycle.json +30 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-505-security-auth-magic-link-rate-limiting.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +76 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +26 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +26 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +64 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +54 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +55 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +54 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +48 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +45 -0
- package/blueprints/security-auth-magic-link/docs/topics.md +45 -0
- package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +65 -0
- package/blueprints/security-auth-oauth2/README.md +50 -0
- package/blueprints/security-auth-oauth2/assets/mock-provider/mock-oidc-shape.md +55 -0
- package/blueprints/security-auth-oauth2/assets/provider-selector/list-shape.md +27 -0
- package/blueprints/security-auth-oauth2/assets/providers/generic-oidc-discovery.md +31 -0
- package/blueprints/security-auth-oauth2/assets/providers/github-oauth2-only.md +31 -0
- package/blueprints/security-auth-oauth2/assets/providers/google-oidc.md +31 -0
- package/blueprints/security-auth-oauth2/assets/session-bridge/opaque-handle-shape.md +59 -0
- package/blueprints/security-auth-oauth2/blueprint.json +44 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1101-security-auth-oauth2-auth-model.json +35 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1103-security-auth-oauth2-pkce-discipline.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +61 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +33 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +51 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +29 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +47 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +45 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +36 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +36 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +55 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +45 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +46 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +46 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +37 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +37 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +28 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +58 -0
- package/blueprints/security-auth-oauth2/guide/security-auth-oauth2.md +65 -0
- package/blueprints/security-secrets-management/README.md +48 -0
- package/blueprints/security-secrets-management/assets/cli-usage/agent-access-pattern.md +69 -0
- package/blueprints/security-secrets-management/assets/manifest-samples/environment-aware-example.md +33 -0
- package/blueprints/security-secrets-management/assets/manifest-samples/secrets-yaml-shape.md +74 -0
- package/blueprints/security-secrets-management/assets/ui-integration/three-way-choice.md +44 -0
- package/blueprints/security-secrets-management/blueprint.json +43 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-901-security-secrets-management-secrets-source.json +30 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-902-security-secrets-management-default-vendor.json +35 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-903-security-secrets-management-agent-access-discipline.json +25 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-904-security-secrets-management-dotenv-reflection.json +25 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-905-security-secrets-management-rotation-and-audit.json +30 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +18 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +52 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +34 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +46 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +57 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +59 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +37 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +55 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +45 -0
- package/blueprints/security-secrets-management/docs/topics.md +46 -0
- package/blueprints/security-secrets-management/guide/security-secrets-management.md +68 -0
- package/fixtures/canary-manifest.json +1 -101
- package/guidance/build-cycle-playbook.md +2 -2
- package/guidance/document-model.md +1 -1
- package/guidance/harness-template.md +13 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +13 -0
- package/package.json +18 -9
- package/rcf/adrs/adr-001.json +1 -1
- package/rcf/adrs/adr-009.json +1 -1
- package/rcf/build-sequence.json +1 -1
- package/rcf/manifest.json +2 -2
- package/rcf/prd.json +2 -2
- package/releases/releases.yaml +116 -0
- package/scripts/preinstall-node-check.mjs +61 -0
- package/src/blueprint/apply.js +62 -18
- package/src/blueprint/conflicts.js +8 -8
- package/src/blueprint/index.js +14 -1
- package/src/blueprint/library-loader.js +271 -0
- package/src/blueprint/library-registry.js +341 -0
- package/src/blueprint/list.js +94 -0
- package/src/blueprint/loader.js +26 -1
- package/src/blueprint/namespace.js +20 -16
- package/src/blueprint/shelf-resolver.js +286 -0
- package/src/blueprint/supersede.js +3 -2
- package/src/browser-verify/invariants.js +40 -0
- package/src/browser-verify/runner.js +2 -0
- package/src/cli/blueprint-library.js +419 -0
- package/src/cli/blueprint.js +91 -10
- package/src/cli/guidance.js +1 -1
- package/src/cli/help.js +27 -1
- package/src/cli/init.js +2 -0
- package/src/cli/version.js +673 -0
- package/src/cli/view.js +282 -1
- package/src/core/store/writer.js +64 -2
- package/src/server/index.js +3 -0
- package/src/server/routes.js +15 -1
- package/src/server/scope-endpoint.js +105 -0
- package/src/setup/agent-setup.js +28 -10
- package/src/view/live-client.js +253 -6
- package/src/view/scope.js +231 -0
- package/src/view/style.css +42 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# delivery-ci-workflows blueprint guide
|
|
2
|
+
|
|
3
|
+
## What it is
|
|
4
|
+
|
|
5
|
+
The default CI floor for rcf-lite projects, expressed as a workflow SET the operator declares once and the workflow-materialiser produces from that declaration. The blueprint contributes the WHAT of the workflow set: which workflows exist per branch model, which required check set every check-set workflow runs, what the release workflow does per release mode, what the scheduled-audit workflow does when enabled, and what report files land on disk after every run. Each workflow is a single Node entry point the CI job invokes with one line; the elicitation surface is the four required plus two optional fields of `workflowShape` in `.rcf/config/delivery-ci-workflows.json` on the project tree.
|
|
6
|
+
|
|
7
|
+
Concretely, the blueprint ships 23 requirements, 23 user stories (roughly 50 acceptance criteria), 6 architecture components, and 10 architecture decision records. Three ADRs are `scope: global` on the topics `ciGates` (the required check set every commit-triggered workflow runs), `strictCoverageGate` (the per-AC strict coverage posture), and `releaseArtefacts` (the four-mode release workflow shape); the other seven ADRs are scope-local.
|
|
8
|
+
|
|
9
|
+
## What it is not
|
|
10
|
+
|
|
11
|
+
Not a matrix of provider-specific configuration files. v2.0.0 ships one illustrative GitHub Actions workflow file per workflow the matrix materialises under `assets/ci-provider-examples/github-actions/` (`pull-request-checks.yml`, `default-branch-checks.yml`, `release.yml`, `scheduled-audit.yml`) as copy-paste starting points. Alternate providers (GitLab CI, CircleCI, Buildkite, Jenkins) wire the same Node entry points per the four-point mapping named below applied to each workflow; the blueprint does not carry per-provider configuration files for those runners at v2.0.0.
|
|
12
|
+
|
|
13
|
+
Not a source-code contribution. The blueprint contributes the workflow-materialiser contract, the gate-runner contract, the release-workflow contract, the scheduled-audit contract, the per-gate report writer contract, the aggregate report writer contract, and the discipline that binds them. The project realises the Node entry points against those contracts in its own build cycle; the blueprint does not ship the entry-point source.
|
|
14
|
+
|
|
15
|
+
Not a choice of linter, formatter, typechecker, test runner, or security scanner. The elicited check catalogue names the check kinds; the project picks the tools that satisfy the runner-contract interfaces. A code-formatting style guide, a security-scan severity threshold, and the linter rule set are all project decisions the blueprint does not opine on.
|
|
16
|
+
|
|
17
|
+
Not a release-mechanism. The release workflow reacts to a tag or a `workflow_dispatch`; the project creates the tag through its own release mechanism (a `standard-version` invocation, a manual git tag, a release-please bot). The blueprint does not ship a tag-creation workflow, a changelog generator, or a version-bump tool.
|
|
18
|
+
|
|
19
|
+
Not a merge-queue integration or a coverage-trend dashboard. A project that wants either reads the aggregate reports from the queue tool or the dashboard of its choice; the blueprint owns the aggregate report shapes and stability, not the reader wiring.
|
|
20
|
+
|
|
21
|
+
Not a branch-protection or merge-policy configuration. AC-6101-2, AC-6114-3, AC-6115-1, and AC-6115-2 state the property the project owes on the platform's own configuration surface per branch model; the blueprint does not ship the configuration file.
|
|
22
|
+
|
|
23
|
+
## When to reach for it
|
|
24
|
+
|
|
25
|
+
Reach for the `delivery-ci-workflows` blueprint when:
|
|
26
|
+
|
|
27
|
+
- The project is an rcf-lite deployment with an RCF chain and a default or trunk branch.
|
|
28
|
+
- The project's CI provider can run Node 24 or later on its runner (every mainstream provider can).
|
|
29
|
+
- The project wants the required check set (RCF chain plus enabled elicited checks) to be a merge-blocking property, not an author-time habit.
|
|
30
|
+
- The project wants a stable per-run report artefact any downstream reader (dashboard, audit tool, merge queue) can pick up without scraping the CI provider's log surface.
|
|
31
|
+
- The project wants a release workflow that scales with what the project has already declared (from `none` for internal packages up to `deployHandoff:<slug>` for paired services).
|
|
32
|
+
|
|
33
|
+
## When it does not fit
|
|
34
|
+
|
|
35
|
+
Do not reach for the `delivery-ci-workflows` blueprint when:
|
|
36
|
+
|
|
37
|
+
- The project does not use RCF (no `rcf/` tree, no `rcf define validate` invocation makes sense).
|
|
38
|
+
- The project runs on a CI provider whose runners cannot execute Node 24 or later.
|
|
39
|
+
- The project wants a coverage-mode grace window on newly introduced ACs (supersede ADR-702 with a project-level ADR stating the grace window).
|
|
40
|
+
- The project wants required checks that are not in the catalogue and not naturally cross-blueprint (a mutation-testing gate, an accessibility scan). Supersede ADR-701 with a project-level ADR listing the extended catalogue and register the check under `custom:<name>`.
|
|
41
|
+
|
|
42
|
+
## What a good outcome looks like
|
|
43
|
+
|
|
44
|
+
A project applies the `delivery-ci-workflows` blueprint on a fresh tree, populates `.rcf/config/delivery-ci-workflows.json` with its `workflowShape` (four required fields plus any optional ones), realises the six TACs in project-authored FBSes, and lands on a deployed workflow set where:
|
|
45
|
+
|
|
46
|
+
- Every commit-triggered event fires the appropriate workflow (per branch model). The workflow's aggregate report at `.rcf/reports/ci/pipeline.json` records the trigger, the timing, and the ordered gate outcomes including the `checkKind` per gate.
|
|
47
|
+
- A pull request whose head commit fails any required check sees the failed check in the aggregate, sees the specific issue in the per-gate report, and cannot be merged through the platform's standard merge path.
|
|
48
|
+
- A pull request whose head commit passes every required check sees `verdict: passed` in the aggregate, sees green on the platform's required-check surface, and can be merged.
|
|
49
|
+
- A release trigger fires the release workflow per `releaseMode`: `none` means no workflow at all; `tagOnly` creates a release entity; `tagPlusArtefact` also publishes an artefact; `deployHandoff:<slug>` also invokes the named deploy blueprint's promote workflow with the `versionId` input.
|
|
50
|
+
- When `scheduledAudit: true`, the scheduled-audit workflow fires on a cron cadence and writes to `.rcf/reports/ci/scheduled-audit.json`, distinct from commit-triggered `pipeline.json`.
|
|
51
|
+
- A developer reproducing a CI failure on their machine runs the same one-line invocation the CI job's step recorded and sees the same per-gate outcomes at the same report paths.
|
|
52
|
+
|
|
53
|
+
## The workflowShape declaration (four dimensions plus two optional)
|
|
54
|
+
|
|
55
|
+
The project ships `.rcf/config/delivery-ci-workflows.json` at the project root. The declaration has three required fields, one optional field with defined default semantics, and two optional dimensions.
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"workflowShape": {
|
|
60
|
+
"branchModel": "feature",
|
|
61
|
+
"checkSet": {
|
|
62
|
+
"linter": true,
|
|
63
|
+
"formatter": true,
|
|
64
|
+
"typecheck": true,
|
|
65
|
+
"unitTest": true,
|
|
66
|
+
"securityScan": true
|
|
67
|
+
},
|
|
68
|
+
"releaseMode": "tagPlusArtefact",
|
|
69
|
+
"providerHint": "githubActions",
|
|
70
|
+
"scheduledAudit": false
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- `branchModel` (required): `feature` or `trunk`.
|
|
76
|
+
- `checkSet` (required): object of booleans keyed by elicited-check name.
|
|
77
|
+
- `providerHint` (required): `githubActions`, `gitlabCi`, `circleCi`, `buildkite`, or `jenkins`.
|
|
78
|
+
- `releaseMode` (OPTIONAL, Q6-B ratification): `none`, `tagOnly`, `tagPlusArtefact`, or `deployHandoff:<slug>`. An absent field is treated the same as `none` (no release workflow ships). Not having a release path yet is a common scenario when starting a project; the ratification chose ergonomics over an explicit `none`.
|
|
79
|
+
- `scheduledAudit` (optional): boolean; default `false`.
|
|
80
|
+
- `trunkPullRequests` (optional; qualifies `branchModel: trunk`): `never` or `sometimes`; default `never`.
|
|
81
|
+
|
|
82
|
+
### Profile aliases
|
|
83
|
+
|
|
84
|
+
Named profile aliases (`smallLibrary`, `smallService`, `internalPackage`, `trunkLibrary`) compose the four-field form. The materialiser expands the alias to the four-field form at boot; every AC binds to the four-field form. Adding an alias is a minor bump; renaming or removing an alias is a minor bump.
|
|
85
|
+
|
|
86
|
+
## The check catalogue
|
|
87
|
+
|
|
88
|
+
Two tiers:
|
|
89
|
+
|
|
90
|
+
- **Mandatory tier** (preserved from v1): `validate` (running `rcf define validate`) then `coverage-strict` (running `rcf audit coverage --strict`), in that order.
|
|
91
|
+
- **Elicited tier** (v2 additions): `linter`, `formatter`, `typecheck`, `unitTest`, `securityScan`. Default: every catalogued check on. Per-check auto-detection may adjust the default (typecheck defaults on when the project tree contains a `tsconfig.json` or equivalent tool marker).
|
|
92
|
+
|
|
93
|
+
Each elicited check ships an AC contract stating what its runner must produce: a non-zero exit code on any blocking finding, a per-gate report at the check's stable path, and a `checkKind` field naming the check kind. The blueprint does NOT ship the linter, formatter, typechecker, test runner, or scanner; the project picks the tools.
|
|
94
|
+
|
|
95
|
+
Custom checks (`custom:<name>`) supersede this ADR at the project level and register alongside the catalogued checks in the aggregate.
|
|
96
|
+
|
|
97
|
+
## The four release modes
|
|
98
|
+
|
|
99
|
+
`releaseMode` scales what the release workflow does:
|
|
100
|
+
|
|
101
|
+
- `none` (or absent, per Q6-B ratification): no release workflow ships.
|
|
102
|
+
- `tagOnly`: on a release trigger, creates a release entity on the provider's release surface (a GitHub Release, a GitLab release).
|
|
103
|
+
- `tagPlusArtefact`: on a release trigger, creates the release entity and runs the project-realised artefact-publish step, uploading the artefact to the release entity.
|
|
104
|
+
- `deployHandoff:<slug>`: on a release trigger, runs the tagPlusArtefact flow and then dispatches the named deploy blueprint's `promote` workflow via `workflow_dispatch` with the just-published version identifier as the `versionId` input.
|
|
105
|
+
|
|
106
|
+
The release workflow does NOT invoke the required check set: that already ran on the `default-branch-checks` workflow at the commit the release points at.
|
|
107
|
+
|
|
108
|
+
The `deployHandoff:<slug>` mode has a manifest boot-check: the materialiser refuses when the named deploy blueprint is absent from `manifest.blueprints[]`.
|
|
109
|
+
|
|
110
|
+
## Wiring alternate CI providers (four-point mapping applied per workflow)
|
|
111
|
+
|
|
112
|
+
Every mainstream CI provider ships the same four ingredients under a different runner language. The blueprint's Node entry points are the fourth ingredient (one per workflow); the other three are provider-specific. The illustrative GitHub Actions workflow files show all four applied per workflow; alternate providers translate the first three and keep the fourth unchanged per workflow:
|
|
113
|
+
|
|
114
|
+
1. Job trigger. The trigger set per workflow (pull_request into the target branch for `pull-request-checks`; push to the target branch for `default-branch-checks`; release event or workflow_dispatch for `release`; cron schedule for `scheduled-audit`).
|
|
115
|
+
2. Node setup.
|
|
116
|
+
3. Package-manager setup and install.
|
|
117
|
+
4. Node entry-point invocation and artefact upload per workflow.
|
|
118
|
+
|
|
119
|
+
See `assets/ci-provider-examples/notes.md` for the per-provider translation.
|
|
120
|
+
|
|
121
|
+
## Operator decisions that remain open after apply
|
|
122
|
+
|
|
123
|
+
- The workflow shape declaration (`.rcf/config/delivery-ci-workflows.json` populated).
|
|
124
|
+
- Report directory path (default `.rcf/reports/ci/`).
|
|
125
|
+
- Tool choices for elicited checks (linter, formatter, typechecker, unit-test runner, security scanner).
|
|
126
|
+
- Security-scan severity threshold.
|
|
127
|
+
- Coverage-mode posture (supersede ADR-702 with a project-level ADR if a different posture is wanted).
|
|
128
|
+
- CI provider choice and the trigger/setup/install steps per workflow.
|
|
129
|
+
- Branch-protection or push-protection configuration on the default or trunk branch per branch model.
|
|
130
|
+
- Artefact-upload retention and destination.
|
|
131
|
+
- Merge-queue integration and coverage-trend dashboard wiring.
|
|
132
|
+
- Release-mechanism (how tags get created).
|
|
133
|
+
|
|
134
|
+
## Cost-honesty paragraph
|
|
135
|
+
|
|
136
|
+
Shipping this doc set costs the project the following. Every commit-triggered event runs the required check set every time; the elicited tier lengthens wall time in proportion to the number of enabled checks. The strict-coverage posture makes every new AC a two-file edit (author the AC and author the TC that resolves it). Adding a check kind outside the catalogue is a project-level ADR plus a runner realisation, not a knob-flip. The illustrative GHA assets are a starting point; a project on another provider owes the translation of the first three of the four mapping points per workflow (extending v1's per-workflow cost to a per-workflow-set cost). Branch-protection configuration is not shipped by the blueprint; a project that forgets to configure it satisfies every AC on the doc set and still ships a workflow set that does not block merges. The report directory grows one per-gate file per gate per run plus one aggregate per workflow per run; a project that runs many workflows against short-lived branches accumulates reports until the CI provider's artefact retention rolls them off.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Deploy Cloudflare Workers blueprint (v1.1.0)
|
|
2
|
+
|
|
3
|
+
The ninth content blueprint on the rcf-build-lite blueprint mechanism, and the first in the `deploy` category. Scope: an artefact-upload + explicit-promote deployment model with three distinct addressable URLs (per-version-id, stable preview alias, production), a single Deploy Adapter as the sole vendor caller, a repo-root wrangler manifest as the sole declaration of deploy shape, a rollback-is-promote posture, a served-surface verifier on every promote, a dev-mode-inadmissible-for-deployed-coverage posture, and build-provenance baked into every uploaded version. Targeted at small greenfield rcf-lite projects; larger deployments supersede the default vendor (ADR-1302) with a project-level ADR and swap the adapter's vendor binding.
|
|
4
|
+
|
|
5
|
+
## Apply
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
rcf define blueprint add <path-to>/blueprints/deploy-cloudflare-workers
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Phase 1 resolves local path sources only; registry and git-ref resolution is a mechanism follow-up. Apply is idempotent; `rcf define blueprint list` shows the applied entry grouped under the `deploy` category; `rcf define blueprint remove deploy-cloudflare-workers` cleanly removes an unreferenced application.
|
|
12
|
+
|
|
13
|
+
## Anatomy
|
|
14
|
+
|
|
15
|
+
| Piece | Where | What |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| Metadata | `blueprint.json` | Slug, version, category `deploy`, and the 35 contributions with scope/topic on the one global ADR |
|
|
18
|
+
| Doc set | `contributions/` | 12 REQs, 12 USs (36 ACs), 6 TACs, 5 ADRs, all schema-valid and namespaced (`deploy-cloudflare-workers-REQ-001` prefix family; `ADR-1301-deploy-cloudflare-workers-deployment-target` suffix family) |
|
|
19
|
+
| Wrangler manifest sample | `assets/wrangler-samples/wrangler-toml-shape.md` | The exact shape of a `wrangler.toml` for a Worker with static assets, KV, D1, and secret bindings, worked as one committable example |
|
|
20
|
+
| Preview alias example | `assets/wrangler-samples/preview-alias-shape.md` | The URL patterns for the three URL kinds (per-version-id, stable alias, production) with placeholder account/worker names |
|
|
21
|
+
| Build-and-upload workflow | `assets/ci-workflows/build-and-upload.yml.md` | The GitHub Actions form of the build-and-upload workflow with token binding, alias input, and structured output |
|
|
22
|
+
| Promote workflow | `assets/ci-workflows/promote.yml.md` | The GitHub Actions form of the promote workflow with `workflow_dispatch`, optional `versionId` input, and post-promote verifier invocation |
|
|
23
|
+
| Served-surface probe pattern | `assets/verification/served-surface-probes.md` | The probe-config shape, retry bounds, and expect-shape pattern for the health probe and one project smoke probe |
|
|
24
|
+
| Guide | `guide/deploy-cloudflare-workers.md` | Operator-facing: when to use it, when not, what stays your call, and the promotion signals for future deploy blueprints |
|
|
25
|
+
| Coordination vocabulary | `docs/topics.md` | The one global-topic string this blueprint contributes and the shared id band registry (nine shipped blueprints including this one) |
|
|
26
|
+
|
|
27
|
+
The doc set is contributions (copied into the project tree by `rcf define blueprint add`); the guide, assets, and docs are package-resident references. Guide rendering into `rcf/knowledge/docs/blueprint-guides/` and asset ingestion are mechanism follow-ups; until they land, the working agent reads them from the applied blueprint's source path recorded in `manifest.blueprints[].source`.
|
|
28
|
+
|
|
29
|
+
## What it contributes, and what it deliberately does not
|
|
30
|
+
|
|
31
|
+
Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (ratified decision 5) and no code.
|
|
32
|
+
|
|
33
|
+
No FBS contributions, as a matter of principle (ratified policy 2026-08-19): FBSs are the work of the implementing agent, not the blueprint; project constraints have to be applied at the time of creation. The blueprint contributes the WHAT (the deploy shape, the adapter contract, the manifest shape, the three URL kinds, the promote-is-explicit posture, the rollback-is-promote posture, the served-surface verify shape, the dev-mode drift posture, the build-provenance surface); the implementing agent derives the HOW-tasks (FBS) in the host project, where the ACs contributed here get picked up by the project's own build sequencing.
|
|
34
|
+
|
|
35
|
+
Deliberately not contributed: a vendor CLI implementation (the default vendor is named in ADR-1302 as Cloudflare's `wrangler`, the shape of the vendor binding is fixed by TAC-1301, the actual binding code is a project-authored implementation shelling to the CLI); a project's authorisation model for who is allowed to promote (promote authorisation sits at the CI platform's own permission model on the `workflow_dispatch` primitive); a promote-approval workflow (a project that wants an approver review on every promote layers a manual-approval step above the `workflow_dispatch` trigger); a canary or gradual-rollout controller (the vendor's own primitives support gradual promote where the operator wants it; the blueprint mandates the served-surface verifier on the eventual full promote); an image or artefact registry (the vendor's own upload-and-version primitive is the artefact store); a project's audit-log storage engine (the blueprint fixes the deploy-log record shape, not where the records land); a status page (the observability-essentials blueprint owns `statusPageContract`; the deploy log feeds into it); the secrets pipeline itself (the security-secrets-management blueprint owns `secretsSource`; this blueprint consumes it for the vendor API token and any application secret bindings the Worker reads).
|
|
36
|
+
|
|
37
|
+
## The one global decision
|
|
38
|
+
|
|
39
|
+
ADR-1301-deploy-cloudflare-workers-deployment-target ships `scope: global` on topic `deploymentTarget`. This is the project's single source of truth for how bits reach a running target: an artefact-upload + explicit-promote model with three distinct addressable URLs. A composing blueprint that wants a different deployment shape (a container-image-per-commit + rolling-deploy blueprint, a merge-to-production-coupled blueprint, a serverless-function-per-endpoint blueprint) conflicts here by design and expects a project-level ADR resolution. Vendor DEFAULT (ADR-1302) is deliberately scope-local: the contract is global; the default that ships behind it is not.
|
|
40
|
+
|
|
41
|
+
See `docs/topics.md` for the exact strings, the expected resolutions, the delineation from vendor-choice (which is not global), and the AC id band allocation (deploy-cloudflare-workers owns 12101-12899, ADR/TAC suffix block 13xx).
|
|
42
|
+
|
|
43
|
+
## Quality bar
|
|
44
|
+
|
|
45
|
+
Repo-root wrangler manifest as the sole declaration of Worker name, entry, compatibility settings, and every binding; one Deploy Adapter as the sole caller of the vendor CLI on the boundary; every merge to main uploads a Worker version reachable at both a permanent per-version-id URL and a stable preview alias URL; the uploaded version never serves production traffic; production only changes when the `promote` workflow runs on an explicit operator trigger; the promote workflow accepts one input `versionId` (empty defaults to newest-of-main); rollback IS a promote of a prior version id, on the same workflow, with the same audit shape; every promote runs the Served-surface Verifier against the production URL with bounded retries; a promote whose verifier fails is not marked successful; every uploaded version carries build provenance (commit sha, build timestamp, CI run URL) readable at a fixed health-probe path; the health probe's `versionSha` field is the served-surface verifier's confirmation that the promoted version is the version being served; no secret value ever lives in the wrangler manifest, in a committed environment file, in a CI variable readable outside the promote job, or in any CI log line; a probe against a dev-mode local URL is refused as coverage for a `deployed`-scope AC; the manifest loader refuses a wrangler config whose production route resolves to the same host as the preview alias URL. Every bar is carried by ACs in the doc set, not by this README.
|
|
46
|
+
|
|
47
|
+
## What v1.1.0 adds
|
|
48
|
+
|
|
49
|
+
v1.1.0 is an additive-non-global minor bump. No global topics change; no contribution is removed; the compose invocation is unchanged. The bump cures seven content findings that the round-2 dogfood acceptance build surfaced when a stranger followed the v1.0.0 teaching against wrangler 4.x reality (three HIGH, three MEDIUM, one LOW). Every fixed teaching is execution-verified against the shipped vendor CLI, with one depth-stop caveat: the bootstrap flow taught in `assets/wrangler-samples/bootstrap-vs-steady-state.md` (F-006) is composed from vendor CLI refusals reproduced against a real Worker (the three refusal-message excerpts in the asset are byte-verified against the shipped CLI's output) and each individual vendor primitive it composes is verified in isolation, but the composed `wrangler deploy --secrets-file <tmp>` bootstrap sequence itself is not end-to-end executed as a single verified run in this ship. A project applying the blueprint exercises the composed sequence the first time it bootstraps a Worker.
|
|
50
|
+
|
|
51
|
+
- **Bootstrap-vs-steady-state (HIGH).** A new asset `assets/wrangler-samples/bootstrap-vs-steady-state.md` teaches the one-time first-deploy flow (`wrangler deploy --secrets-file <tmp>`) that creates the Worker AND sets every referenced secret in one atomic act, and the steady-state ship path (`wrangler versions upload` on every merge, `wrangler versions deploy <versionId>` on operator-triggered promote) that assumes bootstrap has already run. The bootstrap prerequisite is called out on both CI workflow asset reader-notes.
|
|
52
|
+
- **Assets-binding auth-gate discipline (HIGH, security-class).** `assets/wrangler-samples/wrangler-toml-shape.md` now teaches `[assets] run_worker_first` as the default posture whenever the Worker gates access to any path a static file under `directory` could shadow, with the bypass mechanism explained (the assets pipeline serves files at their file-path from the edge cache BEFORE the fetch handler runs, silently bypassing any auth middleware for the collision path). US-12101 adds AC-12101-4, a runtime-observable acceptance criterion that a deployed unauthenticated request to a gated route returns the auth middleware's response, not the file body.
|
|
53
|
+
- **Newest-of-alias resolution (HIGH).** `wrangler versions view <alias>` is not a real verb in wrangler 4.x (the CLI accepts a version UUID as its positional argument only). `assets/wrangler-samples/preview-alias-shape.md` and TAC-1301's vendor binding now teach the working path: `wrangler versions list --json` filtered on `annotations['workers/alias']`, picking the item with the greatest `metadata.created_on`.
|
|
54
|
+
- **Compose boundary with `observability-probe-endpoints` (MEDIUM).** `assets/verification/served-surface-probes.md` gains a dedicated section documenting the deploy blueprint's `/healthz` provenance surface as distinct from any profile-owned probe path the probe-endpoints blueprint contributes; TAC-1305's trade-offs note the boundary. The sibling blueprint's guide carries one boundary sentence pointing back.
|
|
55
|
+
- **Two identifiers, one probe body (MEDIUM).** `assets/verification/served-surface-probes.md`, TAC-1301, TAC-1304, TAC-1305, US-12110's AC-12110-2, and US-12112's AC-12112-3 now distinguish `promotedVersionId` (the vendor-assigned version UUID, the string `wrangler versions deploy` takes) from `versionSha` (the git commit sha of the source tree the version was built from, baked into the bundle by `build-and-upload` and served on `/healthz`). The verifier reconciles the served body's `versionSha` against the promote record's `versionSha` field; both identifiers are now required on the promote record and both flow through the promote workflow's summary.
|
|
56
|
+
- **`[secrets]` block removed (MEDIUM).** The v1.0.0 `[secrets] required = [...]` block in `wrangler-toml-shape.md` was not a wrangler-parsed key. It is removed. The asset now teaches that wrangler 4.x treats every `env.<NAME>` reference from Worker code as an implicit binding declaration and enforces its presence at deploy time; project-intent documentation of the required secret set belongs in a README section or a project-owned `SECRETS.md` outside `wrangler.toml`. Reasoning: leaving decorative TOML in vendor-official position taught readers a false enforcement contract; moving intent-documentation to a non-mistakable location cures the invention.
|
|
57
|
+
- **workers.dev subdomain discovery (MEDIUM/LOW).** `assets/wrangler-samples/preview-alias-shape.md` gains a `Discovering the workers.dev subdomain` section teaching the CF REST endpoint `GET /accounts/<accountId>/workers/subdomain` (verified: no wrangler CLI verb returns the subdomain, `whoami` prints account id and email only). `wrangler-toml-shape.md` documents the workers.dev-only production branch alongside the custom-domain branch. TAC-1301 gains a `resolveSubdomain()` verb (env-var pin first, REST fallback, cached for the process's lifetime); TAC-1303's `workerIdentity` interface reads the subdomain through the new verb rather than from an ambiguous boot input.
|
|
58
|
+
|
|
59
|
+
An upgrade from v1.0.0 is compose-invocation identical (`rcf define blueprint add <path-to>/blueprints/deploy-cloudflare-workers` unchanged); a project on v1.0.0 that re-applies picks up the corrected teaching, the one new AC, and the new asset without changing contribution ids or bands.
|
|
60
|
+
|
|
61
|
+
## Known mechanism-reach gaps
|
|
62
|
+
|
|
63
|
+
None at v1.0.0. Every AC on every story is bound to at least one TAC that the host project must realise, and every AC's `then` clause is runtime-observable in the deployed application (source-tree import-graph scans for the adapter boundary, structured-record accumulation for the deploy-log shape, HTTP probes against the three URL kinds for the served-surface properties, byte-equality checks against resolved secret values for the leakage properties, workflow-file parsing for the trigger-set invariants, coverage-gate walk for the dev-mode-inadmissible invariant). The mechanism-reach principle from the authoring standard section 7 is satisfied at ship: a project that applies this blueprint and does not realise a TAC leaves an unresolved `tacIds` reference on the story that `rcf define validate` and `rcf audit coverage` refuse. The one operational surface a project must own on its own is the vendor binding implementation (the default `wrangler`-shelling binding, or a superseding vendor's binding); that responsibility is stated as a TAC interface, not as a smuggled runtime probe. The one AC whose runtime observability depends on operator choice is AC-12112-2 (the `/healthz` path is a common default but the project picks the actual path); the runtime observability there is the project-declared probe path resolving with the expected shape, which the served-surface verifier's own success signal confirms.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# build-and-upload workflow (GitHub Actions form)
|
|
2
|
+
|
|
3
|
+
Reference shape for the `build-and-upload` workflow. Every value with `<...>` is a placeholder the project fills. The workflow triggers on `push` to `main`, injects build provenance, invokes the Deploy Adapter's `uploadVersion` verb, and writes the uploaded version id plus the two preview URLs to the run summary and to a structured output the `promote` workflow reads.
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
# .github/workflows/build-and-upload.yml
|
|
7
|
+
name: build-and-upload
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
push:
|
|
11
|
+
branches: [main]
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: build-and-upload
|
|
15
|
+
cancel-in-progress: false
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build-and-upload:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
outputs:
|
|
23
|
+
versionId: ${{ steps.upload.outputs.versionId }}
|
|
24
|
+
versionIdUrl: ${{ steps.upload.outputs.versionIdUrl }}
|
|
25
|
+
previewAliasUrl: ${{ steps.upload.outputs.previewAliasUrl }}
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
fetch-depth: 0
|
|
30
|
+
|
|
31
|
+
- uses: actions/setup-node@v4
|
|
32
|
+
with:
|
|
33
|
+
node-version-file: .nvmrc
|
|
34
|
+
cache: pnpm
|
|
35
|
+
|
|
36
|
+
- uses: pnpm/action-setup@v4
|
|
37
|
+
|
|
38
|
+
- name: Install pinned dependencies
|
|
39
|
+
run: pnpm install --frozen-lockfile
|
|
40
|
+
|
|
41
|
+
- name: Build with provenance
|
|
42
|
+
env:
|
|
43
|
+
BUILD_VERSION_SHA: ${{ github.sha }}
|
|
44
|
+
BUILD_BUILT_AT: ${{ github.event.head_commit.timestamp }}
|
|
45
|
+
BUILD_CI_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
46
|
+
run: pnpm build
|
|
47
|
+
|
|
48
|
+
- name: Upload version
|
|
49
|
+
id: upload
|
|
50
|
+
env:
|
|
51
|
+
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
52
|
+
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
|
53
|
+
run: node scripts/deploy/upload-version.mjs --preview-alias main
|
|
54
|
+
|
|
55
|
+
- name: Write run summary
|
|
56
|
+
run: |
|
|
57
|
+
{
|
|
58
|
+
echo "## Uploaded version"
|
|
59
|
+
echo ""
|
|
60
|
+
echo "- versionId: \`${{ steps.upload.outputs.versionId }}\`"
|
|
61
|
+
echo "- versionIdUrl: ${{ steps.upload.outputs.versionIdUrl }}"
|
|
62
|
+
echo "- previewAliasUrl: ${{ steps.upload.outputs.previewAliasUrl }}"
|
|
63
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## The Node.js orchestration script
|
|
67
|
+
|
|
68
|
+
`scripts/deploy/upload-version.mjs` is the project-authored script the workflow invokes. Its body:
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
#!/usr/bin/env node
|
|
72
|
+
// Invoked by the build-and-upload workflow. Wraps the Deploy Adapter's
|
|
73
|
+
// uploadVersion verb, parses --preview-alias, and writes structured outputs
|
|
74
|
+
// the workflow references via ${{ steps.upload.outputs.<name> }}.
|
|
75
|
+
|
|
76
|
+
import { appendFileSync } from 'node:fs';
|
|
77
|
+
import { parseArgs } from 'node:util';
|
|
78
|
+
import { createDeployAdapter } from '../../src/deploy/adapter.mjs';
|
|
79
|
+
|
|
80
|
+
const { values } = parseArgs({
|
|
81
|
+
options: { 'preview-alias': { type: 'string' } }
|
|
82
|
+
});
|
|
83
|
+
if (!values['preview-alias']) {
|
|
84
|
+
console.error('DEPLOY_PREVIEW_ALIAS_REQUIRED: --preview-alias is required');
|
|
85
|
+
process.exit(2);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const adapter = createDeployAdapter();
|
|
89
|
+
const { versionId, versionIdUrl, previewAliasUrl } =
|
|
90
|
+
await adapter.uploadVersion({ previewAlias: values['preview-alias'] });
|
|
91
|
+
|
|
92
|
+
const out = process.env.GITHUB_OUTPUT;
|
|
93
|
+
if (!out) {
|
|
94
|
+
console.error('GITHUB_OUTPUT unset; running outside GitHub Actions?');
|
|
95
|
+
process.exit(2);
|
|
96
|
+
}
|
|
97
|
+
appendFileSync(out, `versionId=${versionId}\n`);
|
|
98
|
+
appendFileSync(out, `versionIdUrl=${versionIdUrl}\n`);
|
|
99
|
+
appendFileSync(out, `previewAliasUrl=${previewAliasUrl}\n`);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Reader notes
|
|
103
|
+
|
|
104
|
+
- Triggers ONLY on `push` to `main`. No `pull_request`, no `schedule`. AC-12107-1 refuses any other trigger; AC-12104-1 refuses any workflow that both pushes-to-main AND promotes.
|
|
105
|
+
- The Worker being uploaded must exist on the vendor before `wrangler versions upload` succeeds. The first-time-per-Worker bootstrap is a one-time operator act, not part of this workflow; see `assets/wrangler-samples/bootstrap-vs-steady-state.md`. This workflow assumes bootstrap has already run.
|
|
106
|
+
- The three provenance env vars (`BUILD_VERSION_SHA`, `BUILD_BUILT_AT`, `BUILD_CI_RUN_URL`) are baked into the built bundle by the project's build step. AC-12112-1 requires them readable from within the Worker at request time; the health probe exposes them. `BUILD_VERSION_SHA` is the git commit sha (`github.sha`); it is NOT the vendor-assigned version UUID that `wrangler versions upload` returns. The two identifiers name two different things (see `assets/verification/served-surface-probes.md` for the boundary the verifier reconciles).
|
|
107
|
+
- `CLOUDFLARE_API_TOKEN` and `CLOUDFLARE_ACCOUNT_ID` are GHA repository secrets. The token is scoped to the Worker's account with the minimum verbs the adapter uses. AC-12107-3 requires neither byte-sequence appear in any log line; wrangler and the redactor in the Deploy Adapter both mask them by default.
|
|
108
|
+
- `concurrency` on the workflow name prevents overlapping uploads racing the preview alias. `cancel-in-progress: false` because cancelling an upload mid-flight leaves the alias in an ambiguous state on some vendors.
|
|
109
|
+
- The workflow's `outputs` block surfaces `versionId`, `versionIdUrl`, and `previewAliasUrl` for the `promote` workflow's `resolveNewestOfMain` path. AC-12107-2 requires this structured output.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# promote workflow (GitHub Actions form)
|
|
2
|
+
|
|
3
|
+
Reference shape for the `promote` workflow. Every value with `<...>` is a placeholder the project fills. The workflow triggers only on `workflow_dispatch`, accepts an optional `versionId` input, invokes the Promote Gate, and honours the Served-surface Verifier's pass or fail.
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
# .github/workflows/promote.yml
|
|
7
|
+
name: promote
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
inputs:
|
|
12
|
+
versionId:
|
|
13
|
+
description: "Version id to promote. Leave blank for newest-of-main."
|
|
14
|
+
required: false
|
|
15
|
+
type: string
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: promote
|
|
19
|
+
cancel-in-progress: false
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
promote:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
permissions:
|
|
25
|
+
contents: read
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
|
|
29
|
+
- uses: actions/setup-node@v4
|
|
30
|
+
with:
|
|
31
|
+
node-version-file: .nvmrc
|
|
32
|
+
cache: pnpm
|
|
33
|
+
|
|
34
|
+
- uses: pnpm/action-setup@v4
|
|
35
|
+
|
|
36
|
+
- name: Install pinned dependencies
|
|
37
|
+
run: pnpm install --frozen-lockfile
|
|
38
|
+
|
|
39
|
+
- name: Promote and verify
|
|
40
|
+
id: promote
|
|
41
|
+
env:
|
|
42
|
+
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
43
|
+
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
|
44
|
+
PROMOTED_BY: ${{ github.actor }}
|
|
45
|
+
run: node scripts/deploy/promote.mjs --version-id "${{ inputs.versionId }}"
|
|
46
|
+
|
|
47
|
+
- name: Write run summary
|
|
48
|
+
if: always()
|
|
49
|
+
run: |
|
|
50
|
+
{
|
|
51
|
+
echo "## Promote outcome"
|
|
52
|
+
echo ""
|
|
53
|
+
echo "- promotedVersionId: \`${{ steps.promote.outputs.promotedVersionId }}\`"
|
|
54
|
+
echo "- versionSha: \`${{ steps.promote.outputs.versionSha }}\`"
|
|
55
|
+
echo "- previousVersionId: \`${{ steps.promote.outputs.previousVersionId }}\`"
|
|
56
|
+
echo "- promotedBy: \`${{ github.actor }}\`"
|
|
57
|
+
echo "- outcome: \`${{ steps.promote.outcome }}\`"
|
|
58
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## The Node.js orchestration script
|
|
62
|
+
|
|
63
|
+
`scripts/deploy/promote.mjs` is the project-authored script the workflow invokes. Its body:
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
#!/usr/bin/env node
|
|
67
|
+
// Invoked by the promote workflow. Wraps the Promote Gate (TAC-1304).
|
|
68
|
+
// Resolves the newest-of-main when --version-id is blank; refuses an unknown
|
|
69
|
+
// version id before any vendor call; invokes the Served-surface Verifier
|
|
70
|
+
// after promoteVersion returns success; writes structured outputs.
|
|
71
|
+
|
|
72
|
+
import { appendFileSync } from 'node:fs';
|
|
73
|
+
import { parseArgs } from 'node:util';
|
|
74
|
+
import { createDeployAdapter } from '../../src/deploy/adapter.mjs';
|
|
75
|
+
import { createServedSurfaceVerifier } from '../../src/deploy/verifier.mjs';
|
|
76
|
+
import { createPromoteGate } from '../../src/deploy/promote-gate.mjs';
|
|
77
|
+
|
|
78
|
+
const { values } = parseArgs({
|
|
79
|
+
options: { 'version-id': { type: 'string', default: '' } }
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const adapter = createDeployAdapter();
|
|
83
|
+
const verifier = createServedSurfaceVerifier({ adapter });
|
|
84
|
+
const gate = createPromoteGate({ adapter, verifier });
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const record = await gate.promote({
|
|
88
|
+
versionId: values['version-id'] || null,
|
|
89
|
+
promotedBy: process.env.PROMOTED_BY || 'unknown'
|
|
90
|
+
});
|
|
91
|
+
const out = process.env.GITHUB_OUTPUT;
|
|
92
|
+
if (out) {
|
|
93
|
+
// promotedVersionId is the vendor-assigned version UUID (the string
|
|
94
|
+
// `wrangler versions deploy` takes). versionSha is the git commit sha
|
|
95
|
+
// of the source tree the promoted version was built from; the verifier
|
|
96
|
+
// substitutes this into the health probe's `expectShape.versionSha`
|
|
97
|
+
// slot to reconcile served against promoted. Both identifiers are
|
|
98
|
+
// required on the promote record; they are never equal.
|
|
99
|
+
appendFileSync(out, `promotedVersionId=${record.promotedVersionId}\n`);
|
|
100
|
+
appendFileSync(out, `versionSha=${record.versionSha}\n`);
|
|
101
|
+
appendFileSync(out, `previousVersionId=${record.previousVersionId}\n`);
|
|
102
|
+
}
|
|
103
|
+
process.exit(0);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
console.error(`${err.code || 'PROMOTE_FAILED'}: ${err.message}`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Reader notes
|
|
111
|
+
|
|
112
|
+
- The Worker being promoted must have been bootstrapped once with `wrangler deploy --secrets-file <path>` before the first `wrangler versions upload` from `build-and-upload` can succeed; see `assets/wrangler-samples/bootstrap-vs-steady-state.md`. Steady-state ship (this workflow's world) assumes bootstrap has already run.
|
|
113
|
+
- The promote record carries two identifiers: `promotedVersionId` (vendor-assigned UUID, the value `wrangler versions deploy` took) and `versionSha` (git commit sha the promoted version was built from). The verifier reconciles the served health-probe body's `versionSha` against the promote record's `versionSha`, NOT against `promotedVersionId`; see `assets/verification/served-surface-probes.md` for the boundary.
|
|
114
|
+
- Triggers ONLY on `workflow_dispatch`. No `push`, no `pull_request`, no `schedule`. AC-12104-2 refuses any other trigger; AC-12104-1 refuses any workflow that pushes-to-main AND promotes.
|
|
115
|
+
- The `versionId` input is optional (`required: false`). Blank defaults to newest-of-main, resolved by the Promote Gate through the Deploy Adapter. AC-12108-1 requires exactly one optional input; AC-12108-2 requires the blank case to resolve through `resolveNewestOfMain`.
|
|
116
|
+
- The Promote Gate refuses a `versionId` absent from `listVersions()` BEFORE any vendor promote call. AC-12108-3 requires the refusal to exit non-zero with `DEPLOY_VERSION_NOT_FOUND` and to leave no promote record.
|
|
117
|
+
- The Served-surface Verifier runs after `promoteVersion` returns success. A verifier failure exits non-zero with `PROMOTE_VERIFY_FAILED` and refuses to mark the release successful. AC-12110-3 requires this.
|
|
118
|
+
- `PROMOTED_BY: ${{ github.actor }}` binds the operator principal from the trigger context into the deploy-log record. AC-12104-3 requires the record.
|
|
119
|
+
- To rollback: invoke this workflow with the prior version id supplied as the `versionId` input. AC-12109-1 requires no separate rollback path. AC-12109-3 requires rollback promotes to run the same verifier.
|
|
120
|
+
- Additional approver-gating (a two-person integrity policy on every promote) layers above `workflow_dispatch` through the platform's manual-approval primitive; the blueprint's ADR set does not fix that policy.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Served-surface probe pattern
|
|
2
|
+
|
|
3
|
+
Reference shape for the Served-surface Verifier's probe declaration. Every value with `<...>` is a placeholder the project fills.
|
|
4
|
+
|
|
5
|
+
## Two identifiers, one probe body
|
|
6
|
+
|
|
7
|
+
The verifier reconciles a promoted version against what production is serving. The reconciliation compares two named identifiers the vendor and the project both know:
|
|
8
|
+
|
|
9
|
+
| Identifier | What it is | Where it lives | Written by |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| `promotedVersionId` | The vendor-assigned version UUID (`06839e70-1f7c-414f-99a9-babf3969efca`), the string `wrangler versions deploy` takes as its positional argument | The promote record's `promotedVersionId` field, emitted by the Promote Gate on every promote | The vendor CLI's response to `wrangler versions deploy`, captured by the Deploy Adapter's `promoteVersion` return value |
|
|
12
|
+
| `versionSha` | The git commit sha of the source tree the version was built from (the 40-character hex the `github.sha` context carries), baked into the built bundle by `build-and-upload` | The bundle as a build-time constant AND the Worker's health-probe response body | The `build-and-upload` workflow, which sets `BUILD_VERSION_SHA=${{ github.sha }}` before the build step |
|
|
13
|
+
|
|
14
|
+
The two identifiers name two different things on two different systems. They are NEVER equal by construction: `promotedVersionId` is a UUID assigned by the vendor at upload time; `versionSha` is a git sha assigned by the source-control system at commit time. Any teaching that "substitutes the promoted id into the probe body" and expects a match is wrong on the wire.
|
|
15
|
+
|
|
16
|
+
The verifier's reconciliation is: the Promote Gate captures BOTH identifiers on every promote (the vendor returns `promotedVersionId`; the project pairs it with the `versionSha` of the source-tree the version was built from, carried on the promote record's `versionSha` field). At verify time, the verifier substitutes the promote record's `versionSha` into the probe's `expectShape.versionSha` slot and refuses the probe when the served body's `versionSha` does not match.
|
|
17
|
+
|
|
18
|
+
## The probe declaration
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
// src/deploy/verify-config.mjs
|
|
22
|
+
// Consumed by the Served-surface Verifier (TAC-1305). The health probe is
|
|
23
|
+
// mandatory; add project smoke probes for surfaces where a served-surface
|
|
24
|
+
// check adds signal a health probe does not.
|
|
25
|
+
|
|
26
|
+
export const probes = [
|
|
27
|
+
{
|
|
28
|
+
path: '/healthz',
|
|
29
|
+
method: 'GET',
|
|
30
|
+
successStatus: [200],
|
|
31
|
+
expectShape: {
|
|
32
|
+
// <PROMOTED_VERSION_SHA> is substituted at verify time from the
|
|
33
|
+
// promote record's `versionSha` field (the git sha), NOT from the
|
|
34
|
+
// promote record's `promotedVersionId` (the vendor UUID). The two
|
|
35
|
+
// are different identifiers on two different systems.
|
|
36
|
+
versionSha: '<PROMOTED_VERSION_SHA>'
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
// A project smoke probe: a read that exercises one binding and one
|
|
41
|
+
// Worker code path a health probe does not. Keep it stateless, idempotent,
|
|
42
|
+
// and observable in one round trip.
|
|
43
|
+
path: '/api/status',
|
|
44
|
+
method: 'GET',
|
|
45
|
+
successStatus: [200],
|
|
46
|
+
expectShape: {
|
|
47
|
+
ok: true
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
export const retryBounds = {
|
|
53
|
+
// At most six attempts per probe over at most sixty seconds; per-request
|
|
54
|
+
// timeout at most five seconds. AC-12110-1 refuses a bound looser than these.
|
|
55
|
+
maxAttemptsPerProbe: 6,
|
|
56
|
+
windowMs: 60_000,
|
|
57
|
+
perRequestTimeoutMs: 5_000
|
|
58
|
+
};
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## The verifier's runtime shape
|
|
62
|
+
|
|
63
|
+
The Served-surface Verifier consumes the config through the `probeConfig` interface (TAC-1305). Per probe:
|
|
64
|
+
|
|
65
|
+
1. Compose the request against the target URL (from `probeUrl('production', null)` for a promote verify, from `probeUrl('alias', <alias>)` for a preview-only verify).
|
|
66
|
+
2. Send the request; on transport error or on a status outside `successStatus`, sleep with an exponential-shaped backoff bounded by `windowMs / maxAttemptsPerProbe`.
|
|
67
|
+
3. On a status in `successStatus`, parse the response body as JSON and check every key in `expectShape` matches the value in the response. `<PROMOTED_VERSION_SHA>` in `expectShape` is substituted at verify time with the promote record's `versionSha` field (the git commit sha the promoted version was built from).
|
|
68
|
+
4. Pass on the first attempt whose status AND body-shape match.
|
|
69
|
+
5. Fail the verify when any probe exhausts `maxAttemptsPerProbe` or when the cumulative elapsed time exceeds `windowMs`, whichever comes first. Emit `{ probePath, status, elapsedMs, outcome: 'failed', versionShaSeen }` on the result sink.
|
|
70
|
+
|
|
71
|
+
## Compose boundary with observability-probe-endpoints
|
|
72
|
+
|
|
73
|
+
The `/healthz` probe declared above is a DEPLOY-blueprint surface. Its body carries build provenance (`versionSha`, `builtAt`, `ciRunUrl`) because the verifier's reconciliation requires it (AC-12112-3). That body shape is NOT a supervisor-integration probe response; it is the deploy blueprint's own provenance readback.
|
|
74
|
+
|
|
75
|
+
The `observability-probe-endpoints` blueprint contributes an operator-supervised probe interface derived from a target integration profile (`kubernetes`, `loadBalancer`, `uptimeMonitor`, `systemd`, `dockerHealthcheck`, `reverseProxy`). Every profile mandates a minimal response contract: `loadBalancer` requires an empty body; `kubernetes` requires exactly `{"status": "pass"|"fail"}`; the profile validator refuses any override that would add a field beyond the enumerated set. That contract's audience is the external supervisor whose conventions drive the wire shape; adding build-provenance fields to it would leak reconnaissance value to unintended readers and would fail the profile validator.
|
|
76
|
+
|
|
77
|
+
When both blueprints compose, the project runs TWO probe surfaces with distinct paths and distinct contracts:
|
|
78
|
+
|
|
79
|
+
- One `/health` (or the profile-declared path) owned by `observability-probe-endpoints`, whose body is minimal per its profile.
|
|
80
|
+
- One `/healthz` (or the deploy-blueprint's chosen path, distinct from the profile's) owned by `deploy-cloudflare-workers`, whose body carries `{ versionSha, builtAt, ciRunUrl }` for the verifier.
|
|
81
|
+
|
|
82
|
+
The two surfaces coexist on purpose; the deploy verifier never hits the profile-owned path and the external supervisor never hits the deploy-owned path. A project unsure which path is which picks distinct strings at apply time (`/health` for the profile, `/healthz` for the deploy verifier; or `/health` for the profile and `/build-info` for the deploy verifier) and documents both on the project's ADR set. Collapsing the two onto one path is not supported; the deploy verifier's provenance body would fail the profile validator, and stripping provenance from the body would break the verifier's reconciliation.
|
|
83
|
+
|
|
84
|
+
## Reader notes
|
|
85
|
+
|
|
86
|
+
- A dev-mode local URL (`http://localhost:<port>`, `http://127.0.0.1:<port>`) is refused by the verifier with `DEPLOY_DEV_MODE_INADMISSIBLE`. AC-12111-1 makes this a hard refusal at the verifier layer; AC-12111-2 accepts the vendor's preview and production URL patterns.
|
|
87
|
+
- The health probe's response body carries `{ versionSha, builtAt, ciRunUrl }`. The Worker reads these at request time from the build-time constants injected by `build-and-upload`. AC-12112-2 requires the shape; AC-12112-3 makes the `versionSha` field the verifier's evidence that the promoted version is the version being served.
|
|
88
|
+
- A probe path that returns 200 with the WRONG `versionSha` fails the probe. A stale response served by a routing layer that has not converged yet fails the probe; the retry window buys the propagation-lag window; a full exhaustion fails the release.
|
|
89
|
+
- The project may add authenticated smoke probes; each carries an operator-chosen auth binding (a signed request header, a probe-only token) that lives in the secrets contract, not in this file. The verifier does not carry an `Authorization` header that would bypass a production auth layer; a probe surface that requires auth is exposed on a project-declared unauthenticated path (a signed-header contract for probes only, with a rotation cadence tied to the deploy-log).
|
|
90
|
+
- The `/healthz` path (or whichever path the project picks) MUST be listed in `[assets] run_worker_first` when the Worker declares an `[assets]` binding whose directory contains any file that could shadow the path. Without the listing, the assets pipeline may serve a stale (or absent) response before the fetch handler runs, and the verifier reads a shape that is not the Worker's answer; see `wrangler-toml-shape.md` for the discipline.
|
package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# First-deploy bootstrap versus steady-state upload
|
|
2
|
+
|
|
3
|
+
The blueprint's ship path (`wrangler versions upload` on every merge, `wrangler versions deploy <versionId>` on operator-triggered promote) works only against a Worker that already exists on the vendor. A fresh Worker has to be bootstrapped once with a different verb. This asset documents both flows.
|
|
4
|
+
|
|
5
|
+
## Why the distinction exists
|
|
6
|
+
|
|
7
|
+
The vendor refuses `wrangler versions upload` against a Worker that has not been deployed at least once:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
You cannot upload a new version of a Worker that does not yet exist.
|
|
11
|
+
Please run the 'deploy' command first.
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The vendor also refuses `wrangler secret put <NAME>` against a Worker that does not yet exist:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
This Worker does not exist yet, so secrets cannot be set in advance
|
|
18
|
+
with 'wrangler secret put'.
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
And the vendor refuses `wrangler deploy` when the Worker code references secret bindings that have not been set:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
The following required secrets have not been set: <NAME>, <NAME>, ...
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The three refusals compose into one bootstrap constraint: the FIRST deploy has to (a) create the Worker, (b) set every referenced secret in the same act. Only `wrangler deploy --secrets-file <path>` satisfies both.
|
|
28
|
+
|
|
29
|
+
## The bootstrap flow (once per Worker)
|
|
30
|
+
|
|
31
|
+
Run this once, from an operator machine with the vendor credentials in the environment. The secrets file is a temp file in a directory the repo ignores; it must not touch the working tree and must not survive the run.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 1. Compose a temp secrets file. Sourced from the project's secrets
|
|
35
|
+
# contract (see the security-secrets-management blueprint or the
|
|
36
|
+
# equivalent project-authored pipeline). NO plaintext in the shell
|
|
37
|
+
# history; use a here-doc into a temp path outside the repo.
|
|
38
|
+
TMP_SECRETS="$(mktemp -t bootstrap-secrets.XXXXXX.json)"
|
|
39
|
+
trap 'rm -f "$TMP_SECRETS"' EXIT
|
|
40
|
+
|
|
41
|
+
# 2. Write the JSON object of secret NAME -> VALUE the Worker needs.
|
|
42
|
+
# The value strings are resolved from the secrets contract; this
|
|
43
|
+
# example shows the shape, not the values.
|
|
44
|
+
cat > "$TMP_SECRETS" <<'JSON'
|
|
45
|
+
{
|
|
46
|
+
"<SECRET_NAME_1>": "<value-from-secrets-contract>",
|
|
47
|
+
"<SECRET_NAME_2>": "<value-from-secrets-contract>"
|
|
48
|
+
}
|
|
49
|
+
JSON
|
|
50
|
+
|
|
51
|
+
# 3. First deploy: creates the Worker on the vendor AND sets every
|
|
52
|
+
# secret in one atomic act.
|
|
53
|
+
wrangler deploy --secrets-file "$TMP_SECRETS"
|
|
54
|
+
|
|
55
|
+
# 4. The trap removes the temp file. Verify it's gone.
|
|
56
|
+
[ ! -f "$TMP_SECRETS" ] || { echo "bootstrap-secrets leaked" >&2; exit 1; }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
After the bootstrap deploy returns success, the Worker exists on the vendor, every referenced secret is set, and the steady-state ship path becomes available.
|
|
60
|
+
|
|
61
|
+
## The steady-state flow (every merge and every operator-triggered promote)
|
|
62
|
+
|
|
63
|
+
Once the Worker exists, the blueprint's ship path is the only one used:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# On every merge to main (build-and-upload workflow, see
|
|
67
|
+
# `ci-workflows/build-and-upload.yml.md`):
|
|
68
|
+
wrangler versions upload --preview-alias main
|
|
69
|
+
|
|
70
|
+
# On operator-triggered promote (promote workflow, see
|
|
71
|
+
# `ci-workflows/promote.yml.md`):
|
|
72
|
+
wrangler versions deploy <versionId>
|
|
73
|
+
|
|
74
|
+
# When a secret's value has to rotate, steady-state is `wrangler secret
|
|
75
|
+
# put <NAME>` invoked from a CI step whose environment has the new value
|
|
76
|
+
# from the secrets contract. No temp file, because the Worker already
|
|
77
|
+
# exists.
|
|
78
|
+
wrangler secret put <NAME>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Reader notes
|
|
82
|
+
|
|
83
|
+
- The bootstrap flow is a one-time operator act. The blueprint's Deploy Adapter (TAC-1301) does NOT wrap it; the adapter's verbs are the steady-state surface. A project that automates bootstrap wraps this shell flow in a project-local script under `scripts/deploy/` and gates it behind an explicit operator invocation.
|
|
84
|
+
- The temp secrets file is the only shape wrangler 4.x accepts for pre-existence secret provisioning. Any alternative (`wrangler secret put` before `wrangler deploy`, an interactive prompt, environment-variable smuggling into `wrangler.toml`) either fails or leaks the value.
|
|
85
|
+
- The `--secrets-file` path must be outside the repo working tree, deleted on shell exit, and never emitted to stdout. The bootstrap shell above uses `mktemp` and a `trap` to enforce this.
|
|
86
|
+
- After bootstrap, the CI workflows never invoke `wrangler deploy`. Every version reaches the vendor via `wrangler versions upload` (which does NOT change the served version) and every production change rides `wrangler versions deploy <versionId>` from the promote workflow. Preserving this discipline is what keeps the promote-is-explicit invariant load-bearing.
|
|
87
|
+
- A project that superseded the default vendor (per ADR-1302) with a different target (Fly.io, Vercel, a hyperscaler's FaaS, a self-hosted target) authors an equivalent bootstrap flow against that vendor's own create-and-provision primitives; the WHEN (once per environment, before steady-state) stays; the WHAT (which CLI verb, which primitive) is vendor-specific.
|