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,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1402-persistence-data-d1-migration-discipline",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Numbered forward-only migrations owned by the vendor CLI; deploy pipeline gates the target Worker on the apply succeeding first",
|
|
8
|
+
"context": "Schema evolution in a Workers-deployed application has three failure modes: silent drift (the deployed database does not match the code's assumptions), half-application (a migration ran partway and left the database in an undefined shape), and deploy-order hazard (the Worker deploys ahead of the migration and starts failing per request against a schema behind its expectations). The migration story has to close all three at the substrate level. D1's vendor tooling already owns numbered forward-only migrations and per-database bookkeeping; the discipline this ADR sets is where the vendor's tooling fits into the deploy pipeline, and where the gate that prevents the deploy-order hazard lives.",
|
|
9
|
+
"decision": "Schema evolution is a directory of numbered `.sql` migration files under the wrangler-configured `migrations_dir` (default `migrations/`), one file per shipped change, applied by `wrangler d1 migrations apply <database> --env <target>`. The vendor's bookkeeping table (`migrations_table`, default `d1_migrations`) is the applied-state ledger; no project-side runner duplicates it. Half-application is closed by the vendor's own transaction semantics: each migration file's statements are applied under the vendor's atomicity guarantee, and a mid-apply failure surfaces as a wrangler non-zero exit. Deploy-order hazard is closed by the deploy-pipeline gate (TAC-1403): the CI job orders `wrangler d1 migrations apply` strictly before `wrangler deploy` for the same environment, and refuses the deploy on any apply failure. Forward-only: there are no down migrations; a rollback to an older schema is a redeploy against the older Worker build (whose migration set is a prefix), and the newer database refuses no request in that case because the older Worker's SQL literals target the older schema shape.",
|
|
10
|
+
"consequences": "Deploys are reproducible from a git ref because the migration directory and the Worker code ship in one commit. Half-migrations are structurally impossible at the D1 side. The Worker-behind-the-schema case is closed at deploy time by the CI gate; the operator sees a failed CI job instead of a customer-visible 5xx. The cost is that a botched schema change is a code fix and a redeploy of the migration file, not a schema-side undo: projects that need to revert a migration in-place cannot, and ship a compensating forward migration under a new number. Composing blueprints that hold their own opinion on migration discipline conflict on the `migrationDiscipline` topic; this ADR's opinion (vendor-CLI-owned, deploy-pipeline-gated) is deliberately distinct from a project-side boot-time runner discipline (the shape shipped by the SQLite blueprint on the same topic), and the expected resolution is one project-level ADR that fixes the discipline for the project.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Boot-time migration runner inside the Worker",
|
|
14
|
+
"summary": "The first Worker request per isolate checks the schema version against a code-side max and runs pending migrations before serving.",
|
|
15
|
+
"reasonNotChosen": "Wrong shape for D1. Workers are cold-started per isolate and per region; a boot-time runner introduces a request-tax spike on every cold start, competes with concurrent isolates trying to apply the same migration, and depends on transaction primitives the D1 Worker binding does not expose (no explicit BEGIN/COMMIT; only `batch()` for multi-statement atomicity). The vendor's out-of-band apply is the shape the substrate supports; the CI gate is the shape that keeps deploy-order safe."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "External migration tool (Drizzle Kit, Prisma Migrate, hand-rolled) instead of wrangler",
|
|
19
|
+
"summary": "Use an ORM-provided migration surface that talks to D1 through the same API; skip `wrangler d1 migrations`.",
|
|
20
|
+
"reasonNotChosen": "The vendor's tooling is the one path the vendor supports and updates as D1 evolves; an external tool that owns the bookkeeping table means the project reconciles two applied-state sources on every apply. Projects that pin an ORM can align it with wrangler by pointing `migrations_pattern` at the ORM's filename shape; the applied-state ledger stays with wrangler."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Application-side polling to detect a schema behind the code, and fail hot on detection",
|
|
24
|
+
"summary": "The Worker reads the schema version on each request and returns 503 when it observes a schema behind the code's expectations.",
|
|
25
|
+
"reasonNotChosen": "Trades one problem for another. The customer sees the 503 instead of the CI job seeing the failure; the recovery loop is the operator noticing the alert and running the apply manually. Ordering the apply in the deploy pipeline itself closes the window entirely instead of catching it in production."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
29
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
30
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1403-persistence-data-d1-event-secrecy",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Store event fields are restricted to store metadata; no domain-row values reach the event sink",
|
|
8
|
+
"context": "The store's event log describes the store's own lifecycle (facadeReady, migrationsApplied, backupExported, timeTravelRestored, queryFailed). The store also holds the domain's most sensitive material: session handles, token secrets, credential material, private keys, whatever the project stores. Conflating the two produces a log stream a downstream observability provider cannot be trusted with, and a log-store breach turns into a domain-data breach. The store's log shape is distinct from the application-api-rest tier's wire-log shape (topic `logging`, owned by the application-api-rest blueprint): this ADR governs the store event surface only.",
|
|
9
|
+
"decision": "Every field on every store event is restricted to store metadata: the event name string, an ISO-8601 timestamp, the binding name, the environment name, the database identifier, migration version integers and filenames, artifact paths, Time Travel bookmarks or timestamps, D1 error codes, and the domain-verb name that surfaced a queryFailed event. No event field is populated with a value read from a domain row; no event field is populated with a value derived from a domain-row column marked as secret. The discipline is enforced at emit time inside the facade (TAC-1401), the deploy gate (TAC-1403), and the recovery runner (TAC-1404); the sink is treated as though it ships every field to a third-party observability provider by default. Downstream redaction is not relied on. A queryFailed event carries the domain-verb name and the D1 error code, never the failed statement's parameter values.",
|
|
10
|
+
"consequences": "The store's event log is safe to ship to any observability provider the operator picks; no per-provider redaction rule is negotiated. A log-store breach exposes lifecycle metadata (when did the facade initialise, what migration versions applied, when did the last export land) but no domain data. Operators who need per-request correlation between the store's events and the domain surface derive a correlation id from something other than a row value (the request id is the intended surface). The REST tier's own log shape governs its own field set; the two logs may share a shipper but do not share this ADR's rules.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Emit failed-statement parameter values inside queryFailed events under a downstream redaction rule",
|
|
14
|
+
"summary": "Ship rich queryFailed events with parameter context and rely on a log-shipper redactor to strip secret fields.",
|
|
15
|
+
"reasonNotChosen": "Redactors miss cases (new field, misspelled field, escaped value in a nested structure), and the log is already on disk on the emitting host by the time the redactor runs. Not-emitting-at-source is the only reliable posture; the domain-verb name plus the D1 error code is enough to open the diagnostic."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Hashed parameter values in event fields",
|
|
19
|
+
"summary": "Emit a stable hash of the parameter so investigations can correlate without exposing the plaintext.",
|
|
20
|
+
"reasonNotChosen": "A hashed session handle still lets an attacker with log access confirm 'this handle is the handle for that principal', which is enough for correlation attacks. The request id already provides the correlation surface without leaking anything, and no store-lifecycle event has a use case for domain-row correlation."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
24
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1404-persistence-data-d1-store-boundary",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "The D1 store facade is the only module that reads the D1 binding; consumers use named domain verbs, and every statement is a parameterised prepared statement",
|
|
8
|
+
"context": "A persistence boundary that leaks (the domain code reads the D1 binding from `env` directly, or the facade exposes a general-purpose raw-SQL passthrough) is a boundary the swap-out story does not work through, the test-double story does not work through, the reasoning-about-persistence-code-paths story does not work through, and (worse for D1 than for a local-file engine) the SQL-injection story does not work through: consumer-supplied string concatenation into a prepared-statement argument is functionally equivalent to a `db.exec(<consumer string>)` call, and the vendor's `prepare().bind()` chain is only safe when it stays a static SQL literal.",
|
|
9
|
+
"decision": "One module (the D1 store facade, TAC-1401) reads the D1 binding from the Worker `env`. Every other module in the source tree that touches persistence imports the facade and calls its named verbs. The facade's public surface exposes named domain verbs with typed parameters; it does not export the D1 binding, and it does not expose a general-purpose query method whose parameter is a SQL string or a prepared-statement object supplied by a consumer. Every statement the facade issues is a `db.prepare(<static SQL literal>).bind(<parameters>).first() | .all() | .run() | .raw()` chain; `db.exec(...)` is never called with a non-literal string; SQL is never constructed by string concatenation with consumer arguments. Multi-statement writes that require atomicity go through `db.batch([...])`; the facade never fakes atomicity by chaining sequential independent calls under an application-side try-catch.",
|
|
10
|
+
"consequences": "The engine choice is swappable because there is exactly one place that reads the binding. Domain tests run against an in-memory double that implements the same verb surface, without any reference to D1 at any point in the test's call path. Every persistence code path is discoverable by grepping for the facade's exports. Consumer arguments never traverse the SQL parser; the vendor's parameter-binding layer is the only place values reach the engine, and SQL injection is closed by construction rather than by discipline-at-call-site. Consumers pay a small cost when they need a new query shape (a facade edit and a consumer edit, in one commit); the size of that cost is the mechanism enforcing the boundary. Composing blueprints that contribute persistence-adjacent components (a cache, an outbox, a projection) contribute their own facade modules on the same discipline; every one of them imports the D1 store facade for its persistence needs, not the D1 binding.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "General-purpose raw-query passthrough on the facade",
|
|
14
|
+
"summary": "The facade exposes `execute(sql, params)` that consumers use for ad-hoc queries the facade does not otherwise express.",
|
|
15
|
+
"reasonNotChosen": "Any raw-query passthrough migrates over time from 'occasional escape hatch' to 'the way consumers write queries'. Every such call site is a code path that has to be re-audited on an engine swap, a code path that cannot be tested against an in-memory double, and (uniquely damaging on D1) a code path where the consumer-supplied SQL string is one edit away from a SQL-injection surface. The escape hatch is not worth the boundary erosion."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Domain-code direct env reads for hot-path queries",
|
|
19
|
+
"summary": "Performance-sensitive queries read `env.<BINDING_NAME>` directly and skip the facade.",
|
|
20
|
+
"reasonNotChosen": "Performance is not a defensible reason to erode the boundary at the rcf-lite Workers-tier target: the facade adds no measurable overhead over the direct binding read, and hot-path queries that genuinely need it are a rare-enough case to justify a specialised facade verb rather than a binding-read shortcut. Projects that outgrow the tier and need a different posture do so by superseding this ADR with reasoning."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
24
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1405-persistence-data-d1-recovery-model",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Recovery is Time Travel point-in-time restore plus a scheduled portable export; both paths carry the load, neither substitutes for the other",
|
|
8
|
+
"context": "A recovery model has three axes: what the artifact is (an in-vendor point-in-time snapshot, a portable dump, a stream), when it is available (bounded lookback, unbounded off-vendor retention), and how it recovers (rewind in place, replay against a fresh database, promote a replica). D1 has one built-in fast path (Time Travel point-in-time recovery, bounded by the plan's recovery window) and one vendor-provided portable path (`wrangler d1 export`, unbounded off-vendor retention when the operator holds the artifacts). Neither substitutes for the other; the two together cover the recovery cases a Workers-tier project actually faces.",
|
|
9
|
+
"decision": "The recovery model is two paths, both configured in the project and both exercisable from the ops or CI surface without a Worker code change (TAC-1404). Path one, Time Travel: `wrangler d1 time-travel restore <database> --timestamp=<unix-seconds>`; the target database rewinds in place to the recorded state at the named timestamp within the vendor's supported recovery window (currently 30 days on Paid, 7 days on Free). Path two, portable export: a scheduled `wrangler d1 export <database> --output <artifact-path> --remote`; the artifact is a `.sql` file the project stores off-vendor (a repository asset, an R2 bucket, an object store the project already runs); recovery is `wrangler d1 execute --file <artifact-path>` into a fresh database (with any BEGIN TRANSACTION / COMMIT statements stripped per the vendor's import guidance). Every invocation of either path emits a structured event on the store event log: `timeTravelRestored` or `backupExported`; event fields are metadata only per ADR-1403.",
|
|
10
|
+
"consequences": "The operator has a one-command answer to the accidental-drop and bad-migration cases inside the vendor recovery window (Time Travel), and a portable off-vendor artifact for the compliance-retention and vendor-outage cases (export). No Worker code change is required to exercise either path; the ops surface is where recovery lives. Time Travel is destructive in place (the vendor's contract), so an operator restoring under uncertainty pairs a pre-restore export with the restore. The export path is slow enough that the vendor's own guidance warns it blocks other database requests for the duration; schedule it in low-traffic windows. Composing blueprints that hold their own opinion on recovery (a replication-based failover blueprint, a logical-dump-only blueprint) supersede this ADR at the project level; the two-path posture is the shape D1's currently published tooling supports.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Time Travel only, no scheduled export",
|
|
14
|
+
"summary": "Rely on Time Travel's bounded recovery window; skip the export step and the off-vendor artifact.",
|
|
15
|
+
"reasonNotChosen": "Loses the compliance-retention story and the vendor-outage story. An operator whose regulator asks 'produce the state as of six months ago' cannot answer from Time Travel alone once the plan window expires, and an operator locked out of the vendor console cannot restore without an off-vendor artifact. The export step is cheap enough to keep as the second path."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Scheduled export only, no Time Travel usage",
|
|
19
|
+
"summary": "Treat Time Travel as a vendor feature the project does not exercise; recover only from the exported artifact.",
|
|
20
|
+
"reasonNotChosen": "Loses the fast in-place restore path Time Travel gives for free. An accidental drop is a one-command Time Travel restore inside the window; forcing every recovery through export-and-reimport pays the export run time on every drill and gives up the vendor's in-place semantics. The two paths cost little to keep both."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Continuous replication to a second D1 database",
|
|
24
|
+
"summary": "Stand up a second database and stream writes; failover by pointing the binding at the replica.",
|
|
25
|
+
"reasonNotChosen": "D1's currently published replication surface (read replicas via `withSession`) targets read scaling, not failover. A project that genuinely needs failover semantics supersedes this ADR with a project-level ADR selecting an alternate engine that provides them; the Workers-tier target this blueprint targets is not where failover is default."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
29
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
30
|
+
}
|
package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "persistence-data-d1-REQ-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Every persistent entity lives in one D1 database accessed through one facade module",
|
|
5
|
+
"description": "The application persists every stateful entity (session records, work items, audit trail, whatever the project's domain model requires) in a single D1 database bound into the Worker under a named binding. One facade module in the source tree is the sole reader of that binding; every other module that touches persistence imports the facade and calls its named domain verbs. The D1 binding is never destructured or re-exported outside the facade module.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "persistence",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "D1 is only available inside the Worker request context; a single facade module is what turns that request-scoped binding into an application-side surface with domain-shaped verbs. Multiple call sites reaching into env for the binding produces a codebase where the shape of the store, the parameter binding discipline, and the event-emission discipline are all diffused across the tree. One facade means one place to test, one place to swap, and one place where the persistence code paths are discoverable.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:persistence-data-d1",
|
|
12
|
+
"category:01-store-facade"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
18
|
+
}
|
package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "persistence-data-d1-REQ-002",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The store schema evolves through numbered forward-only migration files managed by the wrangler CLI",
|
|
5
|
+
"description": "Schema evolution is expressed as a directory of numbered `.sql` migration files under the project-side migrations folder configured in the wrangler binding (`migrations_dir`). Each file's leading version integer is monotonic and unique; the file body is engine-native SQL. Applying migrations is the wrangler CLI's responsibility (`wrangler d1 migrations apply <database> --env <target>`), which tracks applied versions in the D1-side bookkeeping table configured by `migrations_table` (default `d1_migrations`). The project's source tree does not carry a hand-rolled migration runner; the wrangler CLI is the runner.",
|
|
6
|
+
"category": "technical",
|
|
7
|
+
"domain": "persistence",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "D1 is a managed service whose vendor tooling already owns the migration surface (create/list/apply plus a bookkeeping table). Layering a project-side runner on top duplicates the vendor's contract and forces a project to reconcile two sources of truth on 'has this migration applied'. Delegating to wrangler keeps the vendor's bookkeeping authoritative, the migration file shape portable to any project reading these docs, and the deploy pipeline the one place migration application is orchestrated.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:persistence-data-d1",
|
|
12
|
+
"category:02-migration-catalog"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
18
|
+
}
|
package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "persistence-data-d1-REQ-003",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The Worker deploy pipeline refuses to deploy a build whose migrations set has not been applied to the target environment first",
|
|
5
|
+
"description": "The deploy pipeline runs `wrangler d1 migrations apply <database> --env <target>` as a step ordered strictly before `wrangler deploy` against the same environment. When the migrations apply step exits non-zero (a migration statement failed, the database is unreachable, the CI credential lacks apply permission), the deploy pipeline fails and no Worker deploy is attempted against that environment. When the migrations apply step exits zero, the deploy pipeline proceeds; the Worker deploying against the target reads a database at or ahead of the migration set the code was built against.",
|
|
6
|
+
"category": "technical",
|
|
7
|
+
"domain": "persistence",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "D1 is not opened at process boot; a Worker isolate that observes a schema behind the code's expectations fails per request, not at deploy, and the operator sees the failure as customer-visible 5xxs instead of a red CI job. Ordering the apply strictly before the deploy in the pipeline makes the schema-behind-the-code case impossible in production: the migration set either applies cleanly and the deploy proceeds, or the apply fails and the older Worker keeps serving on the older schema.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:persistence-data-d1",
|
|
12
|
+
"category:03-deploy-gate"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
18
|
+
}
|
package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "persistence-data-d1-REQ-004",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Every statement the facade issues against D1 is a parameterised prepared statement; no consumer-supplied SQL reaches the binding",
|
|
5
|
+
"description": "The facade module issues every read or write against D1 through the prepared-statement surface: `db.prepare(<static SQL literal>).bind(<parameters>).first()`, `.all()`, or `.run()`. The static SQL literal is authored inside the facade module and does not embed values from consumer arguments through string concatenation, template interpolation, or any other join that produces a call-site-specific SQL fragment. The facade does not export a general-purpose query method whose parameter is a SQL string supplied by a consumer, and it does not use `db.exec(<consumer string>)` on any path.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "persistence",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "D1's prepared-statement surface is the only path that binds parameters through the vendor's escaping layer; SQL concatenated at a call site is a SQL-injection surface exactly the way it is on any other engine, and D1's ergonomic prepare/bind chain removes the excuse to reach for concatenation. Restating the discipline as a REQ that binds runtime-observable ACs turns the vendor's ergonomic default into a shipped floor of the blueprint.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:persistence-data-d1",
|
|
12
|
+
"category:04-prepared-statements"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
18
|
+
}
|
package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "persistence-data-d1-REQ-005",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Multi-statement writes that require atomicity are issued through the batch surface; the facade never surfaces a partial-batch result",
|
|
5
|
+
"description": "When the facade needs to commit two or more statements as one unit (a domain operation that writes to more than one table, an insert-then-update pair whose semantics depend on both landing), the facade issues them through `db.batch([<prepared statements>])`. On any statement in the batch failing, the facade surfaces the failure to the caller without surfacing any of the batch's other statement results as though they had committed. Single-statement writes commit as their own transaction; the facade does not synthesise atomicity across independent facade calls, and consumers do not chain facade calls under the assumption that they run in one transaction.",
|
|
6
|
+
"category": "technical",
|
|
7
|
+
"domain": "persistence",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "D1 does not expose explicit BEGIN/COMMIT to the Worker binding; `batch()` is the only vendor-supported multi-statement atomicity primitive, and its contract is that a mid-batch failure rolls back the sequence. Naming that surface explicitly at the REQ level puts every domain operation whose correctness depends on multi-statement atomicity on the one path the vendor's contract supports. Refusing to expose partial-batch results means a consumer never has to reason about whether an error is 'some statements landed, some did not'; either the batch committed or it did not.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:persistence-data-d1",
|
|
12
|
+
"category:05-batch-atomicity"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
18
|
+
}
|
package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "persistence-data-d1-REQ-006",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Recovery is available through Time Travel point-in-time recovery and through a scheduled export to a portable artifact",
|
|
5
|
+
"description": "Recovery has two paths, both configured in the project. Path one: Time Travel, the vendor's built-in point-in-time recovery, invoked via `wrangler d1 time-travel restore <database> --timestamp=<unix-seconds>`; the recovery window is the vendor's supported window at the project's plan tier. Path two: a scheduled `wrangler d1 export <database> --output=<artifact> --remote` producing a portable `.sql` artifact written to a project-configured destination (a repository asset, an R2 bucket, an object store the project already runs); the schedule and destination are project-configured. Both paths preserve the schema and rows at the recovery moment; both are exercisable from the CI or ops surface without a Worker code change.",
|
|
6
|
+
"category": "nonFunctional",
|
|
7
|
+
"domain": "persistence",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Time Travel is the natural first line of defence for D1: it is built in, requires no configuration, and covers the operator's likely restore window (accidental drop, bad deploy) inside a bounded lookback. It is not a substitute for a portable dump: the recovery window is finite, the restore is in-place and destructive, and an operator whose compliance model demands off-vendor retention needs the export as well. Naming both paths at the REQ level makes the two-part recovery posture a floor, not a project convention.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:persistence-data-d1",
|
|
12
|
+
"category:06-recovery"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
18
|
+
}
|
package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "persistence-data-d1-REQ-007",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The store lifecycle event log holds no secret material",
|
|
5
|
+
"description": "No field on any store lifecycle event (facadeReady, migrationsApplied, backupExported, timeTravelRestored, queryFailed) carries user data, credential material, session handles, token secrets, private keys, or the values of any column marked as secret in the domain schema. Event fields are limited to store metadata: the binding name, environment name, ISO-8601 timestamps, migration version integers, migration filenames, artifact paths, Time Travel bookmarks or timestamps, D1 error codes, and the domain-verb name that surfaced a queryFailed event.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "persistence",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "The event log is safe to ship to a third-party observability provider only if it holds no secret material. Store events describe the store's own lifecycle, not the domain data it holds; conflating the two produces a log stream a leak turns into a session-takeover breach. Enforcing metadata-only at emit time inside the facade is the only reliable posture; downstream redaction misses cases.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:persistence-data-d1",
|
|
12
|
+
"category:07-log-secrecy"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
18
|
+
}
|
package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-1401-persistence-data-d1-facade",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "D1 store facade",
|
|
8
|
+
"purpose": "The single Worker-side module that reads the D1 binding from `env`, exposes narrow named domain verbs to consumer code, issues every query as a parameterised prepared statement, batches multi-statement writes that require atomicity, and emits structured lifecycle events to the injected sink. Consumers never destructure the D1 binding outside this module; the facade is the one place the vendor surface lives.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Read the D1 binding from the Worker `env` under the configured binding name; hold no other reference to the vendor surface; export no symbol that leaks the raw binding (AC-13101-1, AC-13101-2).",
|
|
11
|
+
"Expose the domain CRUD verbs as named exports with typed parameters; refuse a general-purpose raw-SQL passthrough on the public surface (AC-13101-2, AC-13104-2).",
|
|
12
|
+
"Issue every read and write through `db.prepare(<static SQL literal>).bind(<parameters>).first() | .all() | .run() | .raw()`; never call `db.exec(...)` with a non-literal string; never build SQL by string concatenation with consumer arguments (AC-13104-1, AC-13104-3).",
|
|
13
|
+
"Issue multi-statement writes requiring atomicity through a single `db.batch([...])` call; surface no partial-batch result on a mid-batch failure (AC-13105-1, AC-13105-2, AC-13105-3).",
|
|
14
|
+
"Emit structured lifecycle events on the injected onEvent sink: facadeReady on first invocation per Worker isolate, queryFailed on any prepared-statement or batch failure the facade catches. Carry only store-metadata fields; never carry values read from domain rows (AC-13107-1, AC-13107-2)."
|
|
15
|
+
],
|
|
16
|
+
"internalStructure": "One module that exports a `createStore({ env, bindingName, onEvent })` factory returning a facade object whose methods are the named CRUD verbs plus an event-sink hook. The D1 binding read is scoped to this module; the factory captures the binding reference and the sink and hands back a set of closures. Consumers destructure the verbs they need at their top level and hold the facade reference for the Worker request's lifetime (or, when the isolate reuses the facade across requests, for the isolate's lifetime).",
|
|
17
|
+
"interfaces": [
|
|
18
|
+
{
|
|
19
|
+
"name": "createStore",
|
|
20
|
+
"kind": "factory",
|
|
21
|
+
"description": "createStore({ env, bindingName, onEvent }) -> Store; the sole entry point every consumer calls. Reads env[bindingName] as the D1 binding; hands back a Store whose methods are the named CRUD verbs."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "onEvent",
|
|
25
|
+
"kind": "callback",
|
|
26
|
+
"description": "Structured-event sink invoked with { event, ts, ... } for facadeReady and queryFailed events. Never invoked with domain-row values."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "store.verbs",
|
|
30
|
+
"kind": "read-write-api",
|
|
31
|
+
"description": "The named domain CRUD verbs the facade exposes. Each verb has typed parameters; no verb accepts a raw SQL string or a general query object from consumer code."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"dependencies": [
|
|
35
|
+
{
|
|
36
|
+
"name": "Migration catalog",
|
|
37
|
+
"kind": "tac",
|
|
38
|
+
"tacId": "TAC-1402-persistence-data-d1-migration-catalog",
|
|
39
|
+
"description": "The catalog directory the wrangler CLI applies against the target database; the facade does not import it at runtime, but its schema is what the facade's static SQL literals target."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "Recovery runner",
|
|
43
|
+
"kind": "tac",
|
|
44
|
+
"tacId": "TAC-1404-persistence-data-d1-recovery-runner",
|
|
45
|
+
"description": "Shares the facade's event sink for backupExported and timeTravelRestored events; invoked from the ops or CI surface, not from Worker code."
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"tradeoffs": "The facade holds no long-lived engine handle: D1 is request-scoped, and each Worker invocation reads env for the binding. That cost buys the same one-boundary invariant every other AC on this blueprint depends on. Projects that need per-verb tracing or connection-scoped context (session tokens for read-replica routing via `withSession`) wire it inside this module and preserve the facade's outward interface unchanged.",
|
|
49
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
50
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
51
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-1402-persistence-data-d1-migration-catalog",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Wrangler-managed migration catalog",
|
|
8
|
+
"purpose": "The in-tree source of schema truth. A directory of numbered `.sql` migration files, one per shipped schema change, under the path configured on the D1 binding's `migrations_dir` (default `migrations/`). Each filename carries a monotonic version integer; each file body is engine-native SQL. The wrangler CLI is the applier; the D1 side of the bookkeeping table (`migrations_table`, default `d1_migrations`) is the applied-state ledger. The catalog itself contributes no runtime code.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Hold every schema change ever shipped in this project's history as one `.sql` file under the configured migrations directory. Each filename begins with a monotonic integer that is unique across the directory (AC-13102-1).",
|
|
11
|
+
"Match the wrangler configuration: `d1_databases[<index>].migrations_dir` names the directory; `migrations_table` names the bookkeeping table (default `d1_migrations`); `migrations_pattern` selects the file glob (default is the wrangler-generated numbered form). Any deviation from the defaults is explicit on the binding, not implicit in the tree layout (AC-13102-1, AC-13102-2).",
|
|
12
|
+
"Support the `wrangler d1 migrations list` / `apply` cycle against `--local` for development and `--remote` for the target environment; the applied-state ledger is the D1 database's own bookkeeping table (AC-13102-2, AC-13102-3)."
|
|
13
|
+
],
|
|
14
|
+
"internalStructure": "One source-tree directory (the wrangler-configured migrations directory) containing one `.sql` file per shipped migration. Files are appended, never edited: a shipped migration is a fact of production, and any correction is a new migration that supersedes it. The statements are engine-native SQL. No Worker-side module imports the directory at runtime; the wrangler CLI is the sole reader, and the D1 bookkeeping table is the applied-state fact.",
|
|
15
|
+
"interfaces": [
|
|
16
|
+
{
|
|
17
|
+
"name": "migrations/",
|
|
18
|
+
"kind": "directory",
|
|
19
|
+
"description": "The source-tree directory named on `d1_databases[].migrations_dir`; holds one numbered `.sql` file per shipped migration."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "d1_migrations",
|
|
23
|
+
"kind": "table",
|
|
24
|
+
"description": "The D1-side bookkeeping table named on `d1_databases[].migrations_table`; wrangler writes one row per applied migration. Read via `wrangler d1 execute <database> --command \"SELECT * FROM <table>\"` for verification."
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"dependencies": [],
|
|
28
|
+
"tradeoffs": "One numbered file per migration is trivial to reason about at small history and starts to lengthen the directory listing at large history (dozens of files); the tradeoff mirrors any file-per-migration migration tool. The vendor tooling picks the file naming for `wrangler d1 migrations create`; a project can override `migrations_pattern` for ORM compatibility (Drizzle, Prisma) at the cost of pinning that ORM into the pipeline. Statements-as-SQL keeps the catalog readable but couples it to D1's SQLite dialect; a project that intends to swap engines pays that translation cost at swap time, not now.",
|
|
29
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
30
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
31
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-1403-persistence-data-d1-deploy-gate",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Deploy-time migration gate",
|
|
8
|
+
"purpose": "The CI or ops-side step that runs `wrangler d1 migrations apply <database> --env <target>` strictly before `wrangler deploy --env <target>` for the same environment; refuses to publish a new Worker version when the migration apply fails; emits a structured `migrationsApplied` event on the store event log on each successful apply.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Run `wrangler d1 migrations apply <database> --env <target>` as a step whose completion is a hard prerequisite for the deploy step against the same environment (AC-13103-1).",
|
|
11
|
+
"Fail the deploy job when the migrations-apply step exits non-zero; do not run `wrangler deploy` against that environment; leave the previously deployed Worker in place (AC-13103-2).",
|
|
12
|
+
"Emit one `migrationsApplied` event per successful apply carrying the environment name, the database identifier, the applied migration filenames or version integers, and the ISO-8601 completion timestamp; carry no domain-row values (AC-13103-3, AC-13107-1)."
|
|
13
|
+
],
|
|
14
|
+
"internalStructure": "A CI job (GitHub Actions step, or the project's equivalent) whose YAML or configuration is committed alongside the Worker source. The step invokes wrangler via the vendor's own action or via a direct `pnpm exec wrangler d1 migrations apply` call; environment secrets are supplied by the CI credential store, following the discipline the project's secrets management sets. On success, the step invokes the project's event-emission surface with a `migrationsApplied` payload before the deploy step runs.",
|
|
15
|
+
"interfaces": [
|
|
16
|
+
{
|
|
17
|
+
"name": "ciStep.migrationsApply",
|
|
18
|
+
"kind": "ci-step",
|
|
19
|
+
"description": "The CI job step that runs `wrangler d1 migrations apply <database> --env <target>`; declared as a prerequisite for the deploy step."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "ciStep.deploy",
|
|
23
|
+
"kind": "ci-step",
|
|
24
|
+
"description": "The CI job step that runs `wrangler deploy --env <target>`; declares the migrations-apply step as its prerequisite (needs, depends-on, or sequential ordering per the CI tool)."
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"dependencies": [
|
|
28
|
+
{
|
|
29
|
+
"name": "Migration catalog",
|
|
30
|
+
"kind": "tac",
|
|
31
|
+
"tacId": "TAC-1402-persistence-data-d1-migration-catalog",
|
|
32
|
+
"description": "The directory the apply step reads; the file set at HEAD determines what the apply attempts."
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"tradeoffs": "Ordering the apply strictly before the deploy costs a small amount of CI latency per environment (one wrangler invocation, one round trip to the D1 API) in exchange for making the schema-behind-the-code state impossible in production. Projects that need faster CI can parallelise across environments, but never inside one environment's apply-then-deploy sequence. The gate is a project-authored CI file; the blueprint does not ship a CI template, because CI shape is a `delivery-ci-workflows`-adjacent concern the project owns.",
|
|
36
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
37
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
38
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-1404-persistence-data-d1-recovery-runner",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Recovery runner (Time Travel and export)",
|
|
8
|
+
"purpose": "The project-side ops surface that exercises D1's two recovery paths without a Worker code change: `wrangler d1 time-travel restore <database> --timestamp=<unix-seconds>` for the in-vendor point-in-time restore path, and `wrangler d1 export <database> --output <artifact> --remote` for the off-vendor portable-artifact path. Emits `backupExported` and `timeTravelRestored` events on the store event log at each invocation.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Invoke `wrangler d1 time-travel restore <database> --timestamp=<unix-seconds>` on operator request; the target database is rewound in place to the recorded state at the named timestamp within the vendor's supported recovery window (AC-13106-1).",
|
|
11
|
+
"Invoke `wrangler d1 export <database> --output <artifact-path> --remote` on the configured schedule; the artifact file is written to the project-configured destination (a repository asset, an R2 bucket, an object store the project already runs); the artifact is a portable `.sql` file that reloads into a fresh D1 via `wrangler d1 execute --file <artifact-path>` (after stripping BEGIN TRANSACTION / COMMIT statements per the vendor's import guidance) (AC-13106-2).",
|
|
12
|
+
"Emit `backupExported` and `timeTravelRestored` events on the store event log carrying only store-metadata fields (target database, artifact path, restore timestamp or bookmark, ISO-8601 completion timestamp); never carry values read from domain rows (AC-13106-1, AC-13106-2, AC-13107-1).",
|
|
13
|
+
"Run entirely from the project's ops or CI surface; require no Worker source change to invoke either path (AC-13106-3)."
|
|
14
|
+
],
|
|
15
|
+
"internalStructure": "A small set of ops-side scripts or CI job steps (project-authored) that invoke the wrangler commands and post events to the project's log sink. The runner shares the facade's onEvent contract (metadata only, no domain values) but does not import the facade module; the two surfaces meet only through the shared event-record shape.",
|
|
16
|
+
"interfaces": [
|
|
17
|
+
{
|
|
18
|
+
"name": "recovery.timeTravelRestore",
|
|
19
|
+
"kind": "ops-command",
|
|
20
|
+
"description": "recovery.timeTravelRestore({ database, env, timestamp }) invokes `wrangler d1 time-travel restore` and emits the timeTravelRestored event."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "recovery.export",
|
|
24
|
+
"kind": "ops-command",
|
|
25
|
+
"description": "recovery.export({ database, env, outputPath }) invokes `wrangler d1 export` and emits the backupExported event."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"dependencies": [
|
|
29
|
+
{
|
|
30
|
+
"name": "Store facade",
|
|
31
|
+
"kind": "tac",
|
|
32
|
+
"tacId": "TAC-1401-persistence-data-d1-facade",
|
|
33
|
+
"description": "Shares the event-record shape used for backupExported and timeTravelRestored; the runner does not import the facade module at runtime."
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"tradeoffs": "Time Travel is the vendor's built-in fast path but bounded by the plan's recovery window (7 days on Free, 30 days on Paid at the vendor's currently published limits); an operator whose compliance model needs longer retention runs the export step on a schedule and holds the artifacts off-vendor. The export path is portable at the cost of run time (an export blocks other database requests for the duration per the vendor's current guidance), so schedule it in low-traffic windows. Neither path fully covers the other; the two-path posture is the shape the vendor's tooling produces.",
|
|
37
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
38
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
39
|
+
}
|
package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "persistence-data-d1-US-13101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "persistence-data-d1-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "One facade module is the only place the D1 binding is read",
|
|
8
|
+
"asA": "developer who needs the domain code to stay swappable and testable across the persistence boundary",
|
|
9
|
+
"iWant": "one facade module to hold the D1 binding and expose named domain verbs, with no consumer reaching into env for the binding directly",
|
|
10
|
+
"soThat": "the boundary between the domain and the D1 vendor surface is the only place that has to move when the vendor changes and the only place tests have to double",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-13101-1",
|
|
14
|
+
"description": "Exactly one source-tree module reads the D1 binding from the Worker `env`. Every other module that touches persistence imports the facade module and calls its named domain verbs.",
|
|
15
|
+
"given": "the running source tree after a Worker request is handled",
|
|
16
|
+
"when": "the import graph and source tree are inspected for the D1 binding reference (`env.<BINDING_NAME>` where BINDING_NAME is the value configured on `d1_databases[].binding` in the project's wrangler config)",
|
|
17
|
+
"then": "the reference appears in exactly one file (the facade module) and no other file in the source tree contains the reference, verified by an import-graph query or a targeted grep against the configured binding name",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-13101-2",
|
|
23
|
+
"description": "The facade exposes named domain verbs for every persistence operation the domain requires; the facade module does not export the raw D1 binding or a general-purpose query method that accepts a raw SQL string from consumer code.",
|
|
24
|
+
"given": "the facade module's public surface",
|
|
25
|
+
"when": "the surface is inspected",
|
|
26
|
+
"then": "every exported symbol is either a named domain verb with typed parameters or an event-sink registration; no exported symbol is the D1 binding itself, and no exported function accepts a raw SQL string as a call argument from consumer code",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-13101-3",
|
|
32
|
+
"description": "Replacing the facade module with an in-memory double that implements the same verb surface allows the domain code to run against it without any reference to the D1 binding.",
|
|
33
|
+
"given": "a test double implementing the same named verbs as the facade with an in-memory backing store",
|
|
34
|
+
"when": "the domain code runs against the double in place of the facade",
|
|
35
|
+
"then": "the domain code executes to completion with no reference to the D1 binding on its call path, and its behaviour is unchanged from a facade-backed run for the operations under test",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"tacIds": [
|
|
41
|
+
"TAC-1401-persistence-data-d1-facade"
|
|
42
|
+
],
|
|
43
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
44
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
45
|
+
}
|
package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "persistence-data-d1-US-13102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "persistence-data-d1-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Schema evolution ships as numbered forward-only migration files under a wrangler-managed directory",
|
|
8
|
+
"asA": "operator who needs deploys reproducible from a git ref with no schema state outside version control",
|
|
9
|
+
"iWant": "every schema change to be a new numbered `.sql` file under the wrangler-configured migrations directory, applied by the wrangler CLI",
|
|
10
|
+
"soThat": "the schema shape at any deployed version can be read from the committed files and the vendor's own tooling is the single applier",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-13102-1",
|
|
14
|
+
"description": "The migrations directory named on the D1 binding (`migrations_dir` in the project's wrangler config; default `migrations/`) exists in the source tree and contains one `.sql` file per shipped migration. Each filename begins with a monotonic integer that is unique across the directory; the file body is engine-native SQL.",
|
|
15
|
+
"given": "the source tree at any commit that produces a running Worker",
|
|
16
|
+
"when": "the migrations directory is listed and each filename's leading integer is extracted",
|
|
17
|
+
"then": "the sequence of leading integers is strictly increasing with no duplicates, every file has a non-empty SQL body, and no file in the directory falls outside the wrangler-configured pattern",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-13102-2",
|
|
23
|
+
"description": "Running `wrangler d1 migrations list <database> --local` against a fresh local D1 lists every file in the migrations directory as unapplied; running `wrangler d1 migrations apply <database> --local` applies them in order and a subsequent `list` reports zero unapplied.",
|
|
24
|
+
"given": "a fresh local D1 (no prior applies) and the migrations directory from AC-13102-1",
|
|
25
|
+
"when": "the `list` then `apply` then `list` sequence runs against the local database",
|
|
26
|
+
"then": "the first `list` prints every migration file as unapplied, the `apply` exits zero, and the second `list` prints zero unapplied migrations",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-13102-3",
|
|
32
|
+
"description": "The D1 bookkeeping table configured on the binding (`migrations_table`; default `d1_migrations`) holds one row per applied migration, keyed by the filename or its leading integer, after `wrangler d1 migrations apply` completes.",
|
|
33
|
+
"given": "the local D1 after the `apply` in AC-13102-2 completes",
|
|
34
|
+
"when": "the bookkeeping table is read via `wrangler d1 execute <database> --local --command \"SELECT * FROM d1_migrations\"` (or the configured `migrations_table` name)",
|
|
35
|
+
"then": "the returned row count equals the number of migration files in the directory, and the recorded identifiers match the migration filenames or their leading integers",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"tacIds": [
|
|
41
|
+
"TAC-1402-persistence-data-d1-migration-catalog"
|
|
42
|
+
],
|
|
43
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
44
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
45
|
+
}
|
package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "persistence-data-d1-US-13103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "persistence-data-d1-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Deploy is gated on migrations applying cleanly to the target environment first",
|
|
8
|
+
"asA": "operator whose Worker deploys must never reach production ahead of the schema they were built against",
|
|
9
|
+
"iWant": "the deploy pipeline to run `wrangler d1 migrations apply` before `wrangler deploy` for the same environment, and to abort the deploy on any apply failure",
|
|
10
|
+
"soThat": "a schema-behind-the-code state is impossible in production and a bad migration fails the CI job instead of the customer request",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-13103-1",
|
|
14
|
+
"description": "The deploy pipeline definition for each environment contains a `wrangler d1 migrations apply <database> --env <target>` step ordered strictly before the `wrangler deploy --env <target>` step; the Worker deploy step declares the migrations-apply step as a prerequisite (job dependency, sequential step, or equivalent).",
|
|
15
|
+
"given": "the CI pipeline configuration for the project (GitHub Actions workflow, or the pipeline the project uses)",
|
|
16
|
+
"when": "the deploy job's step list is inspected for each environment",
|
|
17
|
+
"then": "the migrations-apply step appears before the deploy step in that job, and any parallelism configuration is such that the deploy cannot start until the apply has exited zero",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-13103-2",
|
|
23
|
+
"description": "A pipeline run where `wrangler d1 migrations apply` exits non-zero fails the deploy job and does not run `wrangler deploy` against that environment.",
|
|
24
|
+
"given": "a branch on which the migrations set contains a statement that fails at apply (an ALTER against a missing table, a syntactically invalid statement) and the CI pipeline is triggered",
|
|
25
|
+
"when": "the pipeline runs",
|
|
26
|
+
"then": "the migrations-apply step exits non-zero, the deploy step does not execute, the deploy job is reported as failed, and no new Worker version has been published to the target environment",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-13103-3",
|
|
32
|
+
"description": "The deploy pipeline emits a `migrationsApplied` structured event on the store event log per successful apply, carrying the environment name, the target database name or identifier, the applied migration filenames or version integers, and the ISO-8601 completion timestamp. No event field carries a domain-row value.",
|
|
33
|
+
"given": "a successful CI run whose migrations-apply step applied at least one migration",
|
|
34
|
+
"when": "the store event log for that CI run is inspected",
|
|
35
|
+
"then": "the log contains exactly one migrationsApplied event whose metadata fields match the run and whose payload contains no value read from a domain table",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"tacIds": [
|
|
41
|
+
"TAC-1403-persistence-data-d1-deploy-gate",
|
|
42
|
+
"TAC-1402-persistence-data-d1-migration-catalog"
|
|
43
|
+
],
|
|
44
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
45
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
46
|
+
}
|