rcf-lite 0.11.0 → 0.13.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 +30 -0
- package/README.md +2 -0
- 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/ci-pipeline/README.md +49 -0
- package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +61 -0
- package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +50 -0
- package/blueprints/ci-pipeline/assets/report-samples/per-gate.json +12 -0
- package/blueprints/ci-pipeline/assets/report-samples/pipeline.json +28 -0
- package/blueprints/ci-pipeline/blueprint.json +46 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-702-ci-pipeline-strict-coverage-gate.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-703-ci-pipeline-node-only-runner.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-704-ci-pipeline-report-shape.json +25 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-002.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-003.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-004.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-005.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-006.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-007.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-008.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-010.json +18 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-701-ci-pipeline-gate-runner.json +59 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-702-ci-pipeline-gate-report.json +32 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-703-ci-pipeline-aggregate-report.json +41 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6102.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6103.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6104.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6105.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6106.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6107.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6108.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6110.json +36 -0
- package/blueprints/ci-pipeline/docs/topics.md +49 -0
- package/blueprints/ci-pipeline/guide/ci-pipeline.md +79 -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 +50 -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/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/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 +71 -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/package.json +16 -10
- package/rcf/.identity/profile.md +37 -0
- package/rcf/knowledge/INDEX.md +12 -0
- package/rcf/knowledge/README.md +41 -0
- package/rcf/knowledge/docs/.gitkeep +0 -0
- package/rcf/knowledge/notes/.gitkeep +0 -0
- package/scripts/preinstall-node-check.mjs +61 -0
- package/src/blueprint/apply.js +12 -6
- package/src/blueprint/conflicts.js +8 -8
- package/src/blueprint/index.js +2 -1
- package/src/blueprint/list.js +60 -0
- package/src/blueprint/loader.js +26 -1
- package/src/blueprint/namespace.js +20 -16
- package/src/blueprint/shelf-resolver.js +173 -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.js +53 -9
- package/src/cli/init.js +2 -0
- package/src/core/store/validator.js +15 -27
- package/src/core/store/writer.js +64 -2
- package/src/ruleset/ruleset.json +1 -1
- package/src/setup/agent-setup.js +28 -10
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Migration file shape
|
|
2
|
+
|
|
3
|
+
Every migration in the wrangler-configured `migrations_dir` (default `migrations/`) is one `.sql` file (TAC-1402). The wrangler CLI is the applier and the D1 bookkeeping table (`migrations_table`, default `d1_migrations`) is the applied-state ledger. This asset shows the exact shape.
|
|
4
|
+
|
|
5
|
+
## Filename shape
|
|
6
|
+
|
|
7
|
+
The default wrangler pattern is `<zero-padded-integer>_<description>.sql`, generated by `wrangler d1 migrations create <database> <description>`:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
migrations/
|
|
11
|
+
0001_initial_schema.sql
|
|
12
|
+
0002_soft_delete_column.sql
|
|
13
|
+
0003_boot_markers.sql
|
|
14
|
+
0004_notifier_schema.sql
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The leading integer is monotonic across the directory; it anchors the applied-state ordering and the AC-13102-1 sequence check. The description is human-readable and appears in the file name and (by convention) the file header comment; it does not affect ordering.
|
|
18
|
+
|
|
19
|
+
Projects that pin an ORM override `migrations_pattern` on the D1 binding to match the ORM's filename shape (Drizzle's `0000_name.sql`, Prisma's `<timestamp>_name/migration.sql`). The leading-integer monotonicity property still holds; the pattern controls what the CLI matches, not the ordering discipline.
|
|
20
|
+
|
|
21
|
+
## File body shape
|
|
22
|
+
|
|
23
|
+
Each file body is engine-native SQL: one or more statements separated by `;`, terminating in `;`. Comments (`--` line comments) are allowed. The wrangler CLI executes the statements against the D1 database and records the applied file in the bookkeeping table.
|
|
24
|
+
|
|
25
|
+
Worked four-migration example (SQLite dialect, D1's native syntax):
|
|
26
|
+
|
|
27
|
+
`migrations/0001_initial_schema.sql`:
|
|
28
|
+
|
|
29
|
+
```sql
|
|
30
|
+
-- Initial schema for the domain.
|
|
31
|
+
-- Four tables: entityA, entityB, session, auditEntry.
|
|
32
|
+
|
|
33
|
+
CREATE TABLE entityA (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
name TEXT NOT NULL UNIQUE,
|
|
36
|
+
createdAt TEXT NOT NULL,
|
|
37
|
+
updatedAt TEXT NOT NULL
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
CREATE TABLE entityB (
|
|
41
|
+
id TEXT PRIMARY KEY,
|
|
42
|
+
entityAId TEXT NOT NULL REFERENCES entityA(id),
|
|
43
|
+
payload TEXT NOT NULL,
|
|
44
|
+
createdAt TEXT NOT NULL
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE TABLE session (
|
|
48
|
+
handle TEXT PRIMARY KEY,
|
|
49
|
+
principal TEXT NOT NULL,
|
|
50
|
+
issuedAt TEXT NOT NULL,
|
|
51
|
+
expiresAt TEXT NOT NULL
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
CREATE TABLE auditEntry (
|
|
55
|
+
id TEXT PRIMARY KEY,
|
|
56
|
+
actor TEXT NOT NULL,
|
|
57
|
+
action TEXT NOT NULL,
|
|
58
|
+
targetId TEXT NOT NULL,
|
|
59
|
+
at TEXT NOT NULL
|
|
60
|
+
);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`migrations/0002_soft_delete_column.sql`:
|
|
64
|
+
|
|
65
|
+
```sql
|
|
66
|
+
-- Soft-delete column on entityA for file-lane removal without eager history loss.
|
|
67
|
+
ALTER TABLE entityA ADD COLUMN removedAt TEXT;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`migrations/0003_boot_markers.sql`:
|
|
71
|
+
|
|
72
|
+
```sql
|
|
73
|
+
-- Boot markers: audit trail of Worker isolate cold-starts.
|
|
74
|
+
CREATE TABLE bootMarker (
|
|
75
|
+
bootAt TEXT PRIMARY KEY
|
|
76
|
+
);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`migrations/0004_notifier_schema.sql`:
|
|
80
|
+
|
|
81
|
+
```sql
|
|
82
|
+
-- Notifier: per-entity channel routes and pending-delivery queue.
|
|
83
|
+
CREATE TABLE entityChannelRoute (
|
|
84
|
+
entityId TEXT NOT NULL,
|
|
85
|
+
channelId TEXT NOT NULL,
|
|
86
|
+
PRIMARY KEY (entityId, channelId)
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
CREATE TABLE channel (
|
|
90
|
+
id TEXT PRIMARY KEY,
|
|
91
|
+
isDefault INTEGER NOT NULL DEFAULT 0
|
|
92
|
+
);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Applying migrations
|
|
96
|
+
|
|
97
|
+
The wrangler CLI applies files in ascending leading-integer order:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
# Local dev
|
|
101
|
+
wrangler d1 migrations list <database> --local
|
|
102
|
+
wrangler d1 migrations apply <database> --local
|
|
103
|
+
|
|
104
|
+
# Preview environment
|
|
105
|
+
wrangler d1 migrations apply <database> --env preview
|
|
106
|
+
|
|
107
|
+
# Live environment (typically run by the CI job before the Worker deploy)
|
|
108
|
+
wrangler d1 migrations apply <database> --env live
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The applied files land in the bookkeeping table (`d1_migrations` by default). A subsequent `list` reports zero unapplied migrations; a `SELECT * FROM d1_migrations` returns one row per applied file.
|
|
112
|
+
|
|
113
|
+
## Rules a project must not break
|
|
114
|
+
|
|
115
|
+
- **Leading integers are monotonic and unique across the directory.** A missing integer between shipped files, or a duplicate, breaks the ordering guarantee the wrangler CLI relies on. Two contributors landing overlapping integers is a merge conflict, not a runtime bug.
|
|
116
|
+
- **A shipped migration is never edited.** Adding a statement to an already-applied file is a silent schema divergence between deployed databases at different apply cycles. Fixes ship as new numbered files, appended.
|
|
117
|
+
- **The bookkeeping table is not the migration's concern.** A migration whose statements include an `INSERT INTO d1_migrations` corrupts the wrangler CLI's ordering; the CLI already handles that insert inside the same transaction as the migration's statements.
|
|
118
|
+
- **Statements are D1-flavoured SQLite dialect.** D1 shares SQLite's SQL semantics; statements that assume Postgres-specific features (SERIAL, native JSONB, LATERAL) fail at apply. When switching engines under a superseding ADR-1401, plan for a dialect translation pass.
|
|
119
|
+
- **Import from an existing SQLite dump requires stripping `BEGIN TRANSACTION` and `COMMIT`.** The vendor's guidance is explicit: D1's `wrangler d1 execute --file` refuses these statements. A migration file authored from a sqlite3 dump has them removed at authoring time.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# D1 binding shape in the wrangler config
|
|
2
|
+
|
|
3
|
+
The Worker reads the D1 database through a binding declared on `d1_databases[]` in the project's wrangler config file (`wrangler.jsonc` or `wrangler.toml`). This asset shows the exact shape with placeholders only; substitute the project's actual identifiers at the time of writing.
|
|
4
|
+
|
|
5
|
+
## Minimal shape (wrangler.jsonc)
|
|
6
|
+
|
|
7
|
+
```jsonc
|
|
8
|
+
{
|
|
9
|
+
"name": "<worker-name>",
|
|
10
|
+
"main": "src/worker.js",
|
|
11
|
+
"compatibility_date": "<yyyy-mm-dd>",
|
|
12
|
+
"d1_databases": [
|
|
13
|
+
{
|
|
14
|
+
"binding": "<BINDING_NAME>",
|
|
15
|
+
"database_name": "<database-name>",
|
|
16
|
+
"database_id": "<database-uuid>"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Field notes:
|
|
23
|
+
|
|
24
|
+
- `binding` is the property name the Worker reads off `env`. Convention: uppercase snake or Pascal, one binding per named database per environment. The store facade module (TAC-1401) is the only place this name is read; every other module imports the facade.
|
|
25
|
+
- `database_name` is the human-readable name from `wrangler d1 create` or `wrangler d1 list`. Used by wrangler CLI arguments (`wrangler d1 execute <database_name> ...`); not read by the Worker.
|
|
26
|
+
- `database_id` is the vendor-assigned UUID from `wrangler d1 create` or `wrangler d1 info`. This is the durable identifier the vendor uses; substitute the value the project owns.
|
|
27
|
+
|
|
28
|
+
## Full shape with migration overrides (wrangler.jsonc)
|
|
29
|
+
|
|
30
|
+
```jsonc
|
|
31
|
+
{
|
|
32
|
+
"d1_databases": [
|
|
33
|
+
{
|
|
34
|
+
"binding": "<BINDING_NAME>",
|
|
35
|
+
"database_name": "<database-name>",
|
|
36
|
+
"database_id": "<database-uuid>",
|
|
37
|
+
"migrations_dir": "migrations",
|
|
38
|
+
"migrations_table": "d1_migrations",
|
|
39
|
+
"migrations_pattern": "*.sql"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Field notes:
|
|
46
|
+
|
|
47
|
+
- `migrations_dir` names the directory the migration files live in. Default: `migrations/` at the wrangler config's parent directory. TAC-1402 anchors the migration catalog to this value.
|
|
48
|
+
- `migrations_table` names the D1-side bookkeeping table. Default: `d1_migrations`. TAC-1402 anchors the applied-state ledger to this value; AC-13102-3 reads this table for verification.
|
|
49
|
+
- `migrations_pattern` is a glob selecting migration files under `migrations_dir`. Default: the wrangler-generated numbered form. Override for ORM compatibility (Drizzle's `0000_name.sql`, Prisma's `<timestamp>_name/migration.sql`).
|
|
50
|
+
|
|
51
|
+
## Per-environment shape
|
|
52
|
+
|
|
53
|
+
Environments (dev, preview, live) each get their own D1 database. The `env` block on the wrangler config binds them per environment:
|
|
54
|
+
|
|
55
|
+
```jsonc
|
|
56
|
+
{
|
|
57
|
+
"d1_databases": [
|
|
58
|
+
{
|
|
59
|
+
"binding": "<BINDING_NAME>",
|
|
60
|
+
"database_name": "<database-name>-dev",
|
|
61
|
+
"database_id": "<dev-database-uuid>"
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"env": {
|
|
65
|
+
"preview": {
|
|
66
|
+
"d1_databases": [
|
|
67
|
+
{
|
|
68
|
+
"binding": "<BINDING_NAME>",
|
|
69
|
+
"database_name": "<database-name>-preview",
|
|
70
|
+
"database_id": "<preview-database-uuid>"
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
"live": {
|
|
75
|
+
"d1_databases": [
|
|
76
|
+
{
|
|
77
|
+
"binding": "<BINDING_NAME>",
|
|
78
|
+
"database_name": "<database-name>-live",
|
|
79
|
+
"database_id": "<live-database-uuid>"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
TAC-1403's deploy-gate orders `wrangler d1 migrations apply <database-name> --env <target>` strictly before `wrangler deploy --env <target>` for each named environment. The binding name stays constant across environments so the facade module reads the same `env[BINDING_NAME]` regardless of target.
|
|
88
|
+
|
|
89
|
+
## What this asset is not
|
|
90
|
+
|
|
91
|
+
Not a wrangler config template the project copies verbatim. The shape above is the SHAPE of the binding block; the project fills in its own identifiers, compatibility date, and any other fields (routes, custom domains, Static Assets) its Worker needs. A future `deploy-cloudflare-workers` blueprint (round-2 sibling) is the natural owner of the wider wrangler config surface; this blueprint owns the D1 binding shape only.
|
|
92
|
+
|
|
93
|
+
Not a credentials-storage guide. `CLOUDFLARE_API_TOKEN` and any deploy-specific secret the CI job uses are the concern of the `security-secrets-management` blueprint; store them there, not in this file.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "persistence-data-d1",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"category": "persistence",
|
|
5
|
+
"contributions": [
|
|
6
|
+
{ "id": "persistence-data-d1-REQ-001", "kind": "req", "path": "requirements/persistence-data-d1-req-001.json" },
|
|
7
|
+
{ "id": "persistence-data-d1-REQ-002", "kind": "req", "path": "requirements/persistence-data-d1-req-002.json" },
|
|
8
|
+
{ "id": "persistence-data-d1-REQ-003", "kind": "req", "path": "requirements/persistence-data-d1-req-003.json" },
|
|
9
|
+
{ "id": "persistence-data-d1-REQ-004", "kind": "req", "path": "requirements/persistence-data-d1-req-004.json" },
|
|
10
|
+
{ "id": "persistence-data-d1-REQ-005", "kind": "req", "path": "requirements/persistence-data-d1-req-005.json" },
|
|
11
|
+
{ "id": "persistence-data-d1-REQ-006", "kind": "req", "path": "requirements/persistence-data-d1-req-006.json" },
|
|
12
|
+
{ "id": "persistence-data-d1-REQ-007", "kind": "req", "path": "requirements/persistence-data-d1-req-007.json" },
|
|
13
|
+
{ "id": "persistence-data-d1-US-13101", "kind": "us", "path": "user-stories/persistence-data-d1-us-13101.json" },
|
|
14
|
+
{ "id": "persistence-data-d1-US-13102", "kind": "us", "path": "user-stories/persistence-data-d1-us-13102.json" },
|
|
15
|
+
{ "id": "persistence-data-d1-US-13103", "kind": "us", "path": "user-stories/persistence-data-d1-us-13103.json" },
|
|
16
|
+
{ "id": "persistence-data-d1-US-13104", "kind": "us", "path": "user-stories/persistence-data-d1-us-13104.json" },
|
|
17
|
+
{ "id": "persistence-data-d1-US-13105", "kind": "us", "path": "user-stories/persistence-data-d1-us-13105.json" },
|
|
18
|
+
{ "id": "persistence-data-d1-US-13106", "kind": "us", "path": "user-stories/persistence-data-d1-us-13106.json" },
|
|
19
|
+
{ "id": "persistence-data-d1-US-13107", "kind": "us", "path": "user-stories/persistence-data-d1-us-13107.json" },
|
|
20
|
+
{ "id": "TAC-1401-persistence-data-d1-facade", "kind": "tac", "path": "tacs/tac-1401-persistence-data-d1-facade.json" },
|
|
21
|
+
{ "id": "TAC-1402-persistence-data-d1-migration-catalog", "kind": "tac", "path": "tacs/tac-1402-persistence-data-d1-migration-catalog.json" },
|
|
22
|
+
{ "id": "TAC-1403-persistence-data-d1-deploy-gate", "kind": "tac", "path": "tacs/tac-1403-persistence-data-d1-deploy-gate.json" },
|
|
23
|
+
{ "id": "TAC-1404-persistence-data-d1-recovery-runner", "kind": "tac", "path": "tacs/tac-1404-persistence-data-d1-recovery-runner.json" },
|
|
24
|
+
{
|
|
25
|
+
"id": "ADR-1401-persistence-data-d1-store-model",
|
|
26
|
+
"kind": "adr",
|
|
27
|
+
"path": "adrs/adr-1401-persistence-data-d1-store-model.json",
|
|
28
|
+
"scope": "global",
|
|
29
|
+
"topic": "persistenceStore"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "ADR-1402-persistence-data-d1-migration-discipline",
|
|
33
|
+
"kind": "adr",
|
|
34
|
+
"path": "adrs/adr-1402-persistence-data-d1-migration-discipline.json",
|
|
35
|
+
"scope": "global",
|
|
36
|
+
"topic": "migrationDiscipline"
|
|
37
|
+
},
|
|
38
|
+
{ "id": "ADR-1403-persistence-data-d1-event-secrecy", "kind": "adr", "path": "adrs/adr-1403-persistence-data-d1-event-secrecy.json" },
|
|
39
|
+
{ "id": "ADR-1404-persistence-data-d1-store-boundary", "kind": "adr", "path": "adrs/adr-1404-persistence-data-d1-store-boundary.json" },
|
|
40
|
+
{ "id": "ADR-1405-persistence-data-d1-recovery-model", "kind": "adr", "path": "adrs/adr-1405-persistence-data-d1-recovery-model.json" }
|
|
41
|
+
]
|
|
42
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1401-persistence-data-d1-store-model",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Cloudflare D1 as the project's primary durable store, read through a Worker-side facade; other engines behind the same facade contract on supersede",
|
|
8
|
+
"context": "A project deployed on Cloudflare Workers has a natural persistence choice: D1, the vendor's managed serverless SQLite-semantics database, bound directly into the Worker's `env` and accessed request-scoped through a vendor-owned prepared-statement surface. The alternatives (a self-managed store fronted by a Worker adapter, an external Postgres reached from the Worker over HTTPS, an in-memory Workers KV substrate) each cost the project either an operator surface the Workers tier is supposed to eliminate or the relational semantics the domain expects. The rcf-lite Workers-tier target for this blueprint has one obvious answer.",
|
|
9
|
+
"decision": "The default primary durable store is one Cloudflare D1 database bound into the Worker under a named binding declared in `d1_databases[]`, accessed through the D1 store facade (TAC-1401) which is the only module that reads the binding. One binding per environment; the binding name and database identifier are project-configured; migrations are numbered forward-only `.sql` files under the wrangler-managed directory and applied by the vendor's own tooling (TAC-1402); the deploy pipeline is the gate that binds the applied set to the deployed Worker (TAC-1403); recovery is Time Travel plus a scheduled portable export (TAC-1404). Other engines behind the same store facade contract on supersede: a project that outgrows the D1 tier, or that has a workload D1 does not fit (relational semantics but scale beyond a single D1 database, non-Workers deploy target), supersedes this ADR with a project-level ADR selecting the alternate engine and replaces the facade's binding read with an engine-appropriate handle.",
|
|
10
|
+
"consequences": "The project inherits zero-infrastructure persistence at the Workers tier: no database server, no connection pool, no network round trip outside the vendor's own edge substrate. The binding is request-scoped inside the Worker; the facade is the one module the vendor surface lives in; migrations are a CI concern, not a boot-time runner; recovery is a wrangler command, not a hand-rolled backup daemon. The scale ceiling is the vendor's per-database size limit (a currently-published upper bound of 10 GB per D1 database on the Paid plan; 500 MB on the Free plan) plus the queries-per-Worker-invocation limit (currently 1000 on Paid, 50 on Free); a project whose steady-state working set outgrows either supersedes this ADR. Composing blueprints that hold an opinion on the store engine conflict on the `persistenceStore` topic; this blueprint's ADR is one of at least two shipped answers on the rcf-lite shelf (the other names a single-file local SQLite for non-Workers tiers), and the expected resolution is one project-level ADR that fixes the engine and states the tier reasoning.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "External Postgres reached from the Worker over HTTPS",
|
|
14
|
+
"summary": "Point the Worker at a hosted Postgres (Neon, Supabase, an operator-run cluster) reached via an HTTP-fronted client; the store facade wraps the HTTP client.",
|
|
15
|
+
"reasonNotChosen": "Wrong shape for the tier. A Workers-deployed application whose persistence is a network hop outside the vendor's edge substrate pays the round-trip on every request, gives up the vendor's built-in point-in-time recovery, and reintroduces the connection-pool sizing problem the Workers tier is supposed to remove. Projects whose scale genuinely needs Postgres supersede this ADR; the Workers tier is not where that supersede is default."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Cloudflare Workers KV as the substrate",
|
|
19
|
+
"summary": "Drop the relational shape and use KV as the persistence layer; the store facade wraps KV get/put.",
|
|
20
|
+
"reasonNotChosen": "The relational shape is what makes the query story sane for the domain the rcf-lite Workers-tier target typically ships. KV pushes the query problem into application code and gives up the constraint-checking safety net the SQL substrate provides for free. Projects whose domain is genuinely KV-shaped supersede this ADR and pick a KV blueprint when one ships."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Ship D1 and a second engine as co-contributed alternate TACs in one blueprint",
|
|
24
|
+
"summary": "Contribute D1 and Postgres store TACs side by side; the project picks one at apply time.",
|
|
25
|
+
"reasonNotChosen": "The rcf-lite blueprint mechanism (Phase 1) has no variant/profile selector. Two TACs contributed together are both applied, and both leave dangling tacIds references on their user stories if the project only realises one. The composable-vendor-siblings pattern (this blueprint plus the SQLite blueprint, each shipping its own opinion on `persistenceStore`, resolved at operator supersede time) is the shape the mechanism supports today; a mechanism-side variant concept is a future investment."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
29
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
30
|
+
}
|
|
@@ -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
|
+
}
|