rcf-lite 0.12.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 +11 -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 +15 -9
- 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/writer.js +64 -2
- package/src/setup/agent-setup.js +28 -10
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Passwordless sign-in via emailed single-use magic link",
|
|
5
|
+
"description": "The application authenticates operators through a passwordless sign-in flow: the operator submits their email address to a POST /login endpoint; the server, when the address is a registered principal, mints a single-use token, composes a sign-in URL carrying that token, and sends the URL to the address via the configured email delivery adapter; the operator clicks the URL and lands on GET /login/verify, which consumes the token and issues a server-side session. No password field exists anywhere on the surface.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Passwords are a persistent liability: they leak, they get reused, they force the project into hashing, rotation, and reset flows that add surface without adding safety. A magic-link flow removes the credential the operator must remember, keeps the secret material server-owned and short-lived, and fits a single-deployable rcf-lite project without an external identity provider.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:01-sign-in-flow"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-002",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Sign-in tokens are single-use, time-limited, and superseded by the next mint",
|
|
5
|
+
"description": "Every sign-in token minted by the magic-link flow is consumable exactly once. A consumed token cannot be exchanged for a session a second time; an unconsumed token past its expiry cannot be exchanged either. When a fresh token is minted for a principal that has an outstanding unconsumed token, the outstanding token is invalidated at mint time so only the newest token can consume. Token expiry is bounded by a project-configurable window whose default the blueprint fixes at fifteen minutes.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A reusable token is a stolen-link problem waiting to happen; a token with no ceiling on lifetime is a permanent bearer credential mailed in plaintext. Bounding both dimensions and invalidating predecessors on remint means an intercepted or archived link stops working the moment the operator asks for another one.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:02-token-lifecycle"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-003",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Sessions are server-issued opaque handles, never signed client-readable claims",
|
|
5
|
+
"description": "A successful token consumption issues a session by writing a server-side record and returning an opaque handle to the client. The handle is base64url of at least 24 bytes of cryptographically random entropy; it carries no identity claim, no scope claim, no signed payload, and no data the client can decode. Identity, scope, and expiry are looked up server-side from the record on every request. No JWT-shaped token, no self-describing bearer, and no client-decodable envelope is issued on any authenticated code path.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A signed client-readable token turns every session into a JWT-shaped design problem: key rotation, revocation lists, clock skew, algorithm-confusion attacks. An opaque handle plus a server-side record makes revocation a delete, makes scope changes atomic, and keeps the secret material where the operator can actually see it.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:03-session-shape"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-004",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Session handles are carried in a Secure, HttpOnly, SameSite cookie",
|
|
5
|
+
"description": "The session handle is transported to the browser as a cookie with Secure, HttpOnly, and SameSite=Lax set on every issue and every refresh. The cookie is never readable by client-side script. The cookie's Path defaults to '/', its Domain is unset so the browser scopes it to the origin, and its Max-Age reflects the session's absolute expiry. Non-browser clients that authenticate via bearer header are out of scope for this requirement; projects wanting a bearer transport in addition compose a project-level ADR that supersedes the transport half.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A script-readable session handle is an XSS-to-account-takeover pipeline; a permissive SameSite is a CSRF pipeline. Setting all three flags at the transport layer is the cheapest way to keep the credential out of the DOM and out of the cross-site request path.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:04-session-transport"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-005",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Server-side session revocation on sign-out and administratively for a principal",
|
|
5
|
+
"description": "POST /logout invalidates the server-side session record for the presented handle and clears the cookie on the response. After sign-out, the handle cannot resurrect an authenticated request. An administrative revoke operation is exposed on the session manager surface that invalidates every unexpired session for a given principal in one call; sign-in flows that follow the revoke issue new records with fresh handles. Client-side cookie clearing alone is not the revocation mechanism.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A session that only ends when the browser forgets its cookie is a session an attacker with the cookie can still ride. Making revocation a server-side delete on a stored record is what makes 'sign me out everywhere' honest.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:05-session-revocation"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-006",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Sign-in submission is anti-enumeration: identical body, status, and timing for every input",
|
|
5
|
+
"description": "The POST /login handler returns the same response body, the same HTTP status, and the same wall-clock latency floor regardless of whether the submitted email is a registered principal, an unregistered address, a malformed string, or an empty value. The response never confirms or denies registration. The timing floor is set by a per-handler anti-enumeration budget that dominates the slowest legitimate branch (mint plus adapter send). Registered-branch work runs behind the same delay ceiling as unregistered-branch work.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A login endpoint that differentiates its responses on the basis of principal registration is a free enumeration oracle; an attacker with a wordlist harvests the registered set without ever guessing a password. Uniform body, uniform status, and uniform timing collapse the oracle.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:06-anti-enumeration"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-007",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Rate limits on the sign-in mint and consume endpoints",
|
|
5
|
+
"description": "POST /login and GET /login/verify are rate limited independently. The mint endpoint's ceiling is tight enough to make magic-link flooding unattractive and loose enough that a legitimate operator retry does not trip it; the blueprint defaults to five mints per minute per client key. The consume endpoint's ceiling defends against token-guessing sweeps; the blueprint defaults to twenty attempts per minute per client key. Both endpoints emit Retry-After with an honest wait window on 429 responses. Rate-limit rejections do not reveal registration state.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "An unbounded mint endpoint is an email-bombing pipeline aimed at the operator's own inbox; an unbounded consume endpoint is a brute-force pipeline aimed at the token space. Class-appropriate limits with honest Retry-After close both without asking the operator to configure a WAF.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:07-rate-limiting"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-008",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Sessions and tokens survive process restart",
|
|
5
|
+
"description": "The session store and the sign-in token store are backed by durable storage that survives a process restart. A process restart of the authenticating service does not invalidate outstanding sessions, does not reset idle-expiry clocks, and does not consume-then-lose in-flight sign-in tokens. The blueprint does not fix the storage engine; the project supplies the durable store through the session-manager and magic-link-manager interfaces.",
|
|
6
|
+
"category": "nonFunctional",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "In-memory sessions turn every deploy into a forced logout for every operator, which teaches the operator to distrust the sign-out button when it does happen. Persistent storage is the difference between authentication that outlives the process and authentication that pretends to.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:08-persistence"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-009",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Structured auth event log with zero secret leakage",
|
|
5
|
+
"description": "Every material auth event emits one structured log entry: sign-in requested, magic link minted, magic link sent, magic link consumed, session issued, session refreshed, session invalidated, session revoked, rate-limit tripped, adapter-send failed. Each entry carries at minimum an event name, a UTC timestamp, an outcome, and where applicable a principal id and a request id. Token secrets, session handles, and email-delivery-provider api keys never appear in any field of any log entry.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "An unlogged auth surface is a black box the first time it misfires; a logged auth surface that quotes tokens is the same black box plus a smoking gun in the log store. Naming the event set and forbidding secret quoting means the log is useful in an incident without becoming an incident itself.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:09-observability"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-010",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Email delivery is a pluggable adapter behind a fixed contract",
|
|
5
|
+
"description": "The blueprint owns a narrow email-delivery-adapter interface with a single send({ to, subject, textBody, htmlBody }) method returning a Promise resolving to a normalised outcome ({ ok, providerStatus, providerMessageId, error }). The project supplies the transport (SMTP, Resend, SES, a stub for tests). The magic-link routes call only the adapter interface; provider-specific fields, credentials, and rate-limit semantics never appear in the routes or the managers. Adapter-send failures are recorded on the event log and swallowed for the response body under the anti-enumeration budget.",
|
|
6
|
+
"category": "technical",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Hard-coding a delivery provider ties the blueprint to a business decision the project owns; hard-coding provider errors into the response body reintroduces the enumeration oracle the anti-enumeration requirement closes. A narrow contract lets the project swap providers without touching auth code.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:10-email-adapter"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "security-auth-magic-link-REQ-011",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Principal registry is pluggable behind a fixed lookup contract",
|
|
5
|
+
"description": "The blueprint owns a narrow principal-registry interface with a single isRegistered(email) method returning a Promise resolving to a boolean. The project supplies the registry implementation: a single-address constant for solo-operator deployments, a static allow-list file for small teams, or a database lookup for multi-tenant projects. The magic-link routes call only the registry interface and receive nothing from it except the boolean; principal roles, quotas, and identity metadata are project concerns that layer above this contract, not inside it.",
|
|
6
|
+
"category": "technical",
|
|
7
|
+
"domain": "authentication",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "The security-auth-magic-link blueprint's opinion is on the flow, not on who counts as a principal. Fixing the registry answer in the blueprint would fight every project that scales past its assumed shape; narrowing the contract to a boolean keeps the flow generic while letting the project own the truth.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:security-auth-magic-link",
|
|
12
|
+
"category:11-principal-registry"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-501-security-auth-magic-link-manager",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Magic-link manager",
|
|
8
|
+
"purpose": "Owns the mint and consume semantics of the sign-in token: entropy source, expiry ceiling, single-use enforcement, invalidation of predecessors on remint, and event emission for the mint and consume moments. The token secret exists as plaintext only as the return value of mint and the argument to consume; nowhere else on the surface holds it.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Mint a fresh token for a submitted principal with at least 24 bytes of cryptographic entropy, returning { token, expiresAt } (AC-3101-3, AC-3102-3).",
|
|
11
|
+
"Invalidate every prior unconsumed token for the principal at mint time so the newest token is the only one that can consume (AC-3102-4).",
|
|
12
|
+
"Consume a presented token exactly once, resolving to a principal id on success and to a failure without side effects on repeat, expiry, or unknown (AC-3102-1, AC-3102-2).",
|
|
13
|
+
"Never emit the token secret in any event field; emit magicLinkMinted with the principal id and expiresAt only (AC-3109-2, AC-3109-3).",
|
|
14
|
+
"Persist unconsumed tokens through the store interface so a process restart does not invalidate them (AC-3108-2)."
|
|
15
|
+
],
|
|
16
|
+
"internalStructure": "One stateless manager class with an injected store; the store owns durability and the manager owns semantics. The token value is base64url of 32 random bytes generated via node:crypto.randomBytes; expiryMs defaults to 900000 (fifteen minutes) and is a constructor option.",
|
|
17
|
+
"interfaces": [
|
|
18
|
+
{
|
|
19
|
+
"name": "store",
|
|
20
|
+
"kind": "read-write-api",
|
|
21
|
+
"description": "Project-supplied durable store implementing invalidatePriorMagicLinkTokens(email), insertMagicLinkToken({ token, email, expiresAt }), and consumeMagicLinkToken(token) returning the record or null."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "onEvent",
|
|
25
|
+
"kind": "callback",
|
|
26
|
+
"description": "Structured-event sink invoked with { event, principalId, outcome, at, ... } for magicLinkMinted and magicLinkConsumed; never invoked with the token secret."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "now",
|
|
30
|
+
"kind": "clock",
|
|
31
|
+
"description": "Injectable millisecond clock for expiry arithmetic (test surface)."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"dependencies": [
|
|
35
|
+
{
|
|
36
|
+
"name": "Session manager",
|
|
37
|
+
"kind": "tac",
|
|
38
|
+
"tacId": "TAC-502-security-auth-magic-link-session-manager",
|
|
39
|
+
"description": "Downstream consumer of a successful consume: converts the resolved principal id into an issued session record."
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"tradeoffs": "The manager holds no state of its own; every read and write goes through the store. That trade means every operation is a database round trip, which is honest for a persistence-first design and keeps restart continuity free. Projects that want in-memory token issuance for tests supply an in-memory store implementation of the same interface.",
|
|
43
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
44
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
45
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-502-security-auth-magic-link-session-manager",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Session manager",
|
|
8
|
+
"purpose": "Owns the shape and lifecycle of the server-side session record: opaque high-entropy handle generation, idle-sliding expiry, absolute expiry ceiling, per-request refresh, per-handle invalidation, and administrative revoke-by-principal. The handle is the credential; the record is the truth.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Issue a session by inserting a record and returning { handle, expiresAt } where handle is base64url of at least 24 bytes of entropy (AC-3103-1, AC-3103-2).",
|
|
11
|
+
"Validate a presented handle by lookup, applying the sliding idle window and the fixed absolute expiry (AC-3105-2).",
|
|
12
|
+
"Refresh the idle-expiry clock on every validated request without changing the handle value.",
|
|
13
|
+
"Invalidate a session by handle in one call (invalidateSession) and every session for a principal in one call (revokeAllForPrincipal) (AC-3105-1, AC-3105-3).",
|
|
14
|
+
"Guarantee handles carry no encoded payload: no dot-separated segments, no principal id, no expiry, no scope in the string (AC-3103-2, AC-3103-3).",
|
|
15
|
+
"Emit sessionIssued, sessionRefreshed, sessionInvalidated, and sessionRevoked events without quoting the handle value (AC-3109-1, AC-3109-2)."
|
|
16
|
+
],
|
|
17
|
+
"internalStructure": "One stateless manager class with an injected store; the store owns durability and the manager owns lifecycle rules. The default idle window is 900000 ms (fifteen minutes); the default absolute lifetime is 2592000000 ms (thirty days). Both are constructor options.",
|
|
18
|
+
"interfaces": [
|
|
19
|
+
{
|
|
20
|
+
"name": "store",
|
|
21
|
+
"kind": "read-write-api",
|
|
22
|
+
"description": "Project-supplied durable store implementing insertSession(record), findSession(handle), refreshSession(handle, lastSeenAt), deleteSession(handle), and deleteSessionsForPrincipal(principalId)."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "onEvent",
|
|
26
|
+
"kind": "callback",
|
|
27
|
+
"description": "Structured-event sink invoked with { event, principalId, outcome, at, ... } for the four session events; never invoked with the handle value."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "now",
|
|
31
|
+
"kind": "clock",
|
|
32
|
+
"description": "Injectable millisecond clock for expiry arithmetic."
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"dependencies": [
|
|
36
|
+
{
|
|
37
|
+
"name": "Login routes",
|
|
38
|
+
"kind": "tac",
|
|
39
|
+
"tacId": "TAC-503-security-auth-magic-link-login-routes",
|
|
40
|
+
"description": "The routes issue sessions on token consume and clear them on sign-out; the manager's methods are what the routes call."
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"tradeoffs": "The 900000 / 2592000000 default pair prioritises operator convenience over aggressive session rotation; projects with tighter idle needs or shorter absolute lifetimes override the constructor options and update the ADR's consequences to reflect the change. Sessions survive process restart because the store is durable; a project that supplies an in-memory store implementation trades restart continuity for test speed and states the trade in its own ADR.",
|
|
44
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
45
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
46
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-503-security-auth-magic-link-login-routes",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Login routes",
|
|
8
|
+
"purpose": "Owns the HTTP surface of the sign-in flow: the GET /login form page, the POST /login submission handler, the GET /login/verify consume handler, and the POST /logout handler. The routes compose the magic-link manager, the session manager, the email delivery adapter, and the principal registry into one HTTP-shaped orchestration; anti-enumeration timing and per-route rate-limit configuration live here.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Serve GET /login as a page with exactly one email input and no password input (AC-3101-1).",
|
|
11
|
+
"Accept POST /login with an application/x-www-form-urlencoded email field and return a 200 with a generic body (AC-3101-2, AC-3106-1, AC-3106-2).",
|
|
12
|
+
"Enforce an anti-enumeration budget on POST /login so no response returns earlier than the configured wall-clock floor and no branch's outcome affects the observable timing (AC-3106-3).",
|
|
13
|
+
"Configure per-route rate limits on POST /login (default five per minute per client key) and on GET /login/verify (default twenty per minute per client key), emitting 429 with Retry-After on breach (AC-3107-1, AC-3107-2, AC-3107-4).",
|
|
14
|
+
"On registered submissions, call the magic-link manager to mint a token, compose the sign-in URL from the deployment base URL, and hand the URL to the email delivery adapter (AC-3101-3).",
|
|
15
|
+
"On GET /login/verify with a valid unconsumed unexpired token, call the session manager to issue a session, set the session cookie with Secure, HttpOnly, and SameSite=Lax, and redirect to the configured post-sign-in route (AC-3101-4, AC-3104-1, AC-3104-2, AC-3104-3).",
|
|
16
|
+
"On GET /login/verify with any other token value, return a 401 with a generic sign-in-failed body and no Set-Cookie (AC-3101-5).",
|
|
17
|
+
"On POST /logout, call the session manager to invalidate the presented handle and return a Set-Cookie that clears the session cookie (AC-3105-1, AC-3105-2)."
|
|
18
|
+
],
|
|
19
|
+
"internalStructure": "One routes module registered onto the project's HTTP framework instance; the module receives its collaborators (magic-link manager, session manager, adapter, registry) as constructor arguments. The anti-enumeration budget is an injected constant with a default of 800 ms; per-route rate limits are configured on the framework's rate-limit plugin, not implemented in the module.",
|
|
20
|
+
"interfaces": [
|
|
21
|
+
{
|
|
22
|
+
"name": "app",
|
|
23
|
+
"kind": "framework-instance",
|
|
24
|
+
"description": "The project's HTTP framework instance the routes are registered onto; the framework must expose a per-route rate-limit configuration surface."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "magicLinks",
|
|
28
|
+
"kind": "collaborator",
|
|
29
|
+
"description": "TAC-501 instance; the routes call mint and consume through it."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "sessions",
|
|
33
|
+
"kind": "collaborator",
|
|
34
|
+
"description": "TAC-502 instance; the routes call issueSession, invalidateSession, and cookie helpers through it."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "adapter",
|
|
38
|
+
"kind": "collaborator",
|
|
39
|
+
"description": "TAC-504 instance; the routes call adapter.send through it."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "registry",
|
|
43
|
+
"kind": "collaborator",
|
|
44
|
+
"description": "TAC-505 instance; the routes call registry.isRegistered through it and consume only the boolean result."
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"dependencies": [
|
|
48
|
+
{
|
|
49
|
+
"name": "Magic-link manager",
|
|
50
|
+
"kind": "tac",
|
|
51
|
+
"tacId": "TAC-501-security-auth-magic-link-manager",
|
|
52
|
+
"description": "Provides mint and consume semantics."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "Session manager",
|
|
56
|
+
"kind": "tac",
|
|
57
|
+
"tacId": "TAC-502-security-auth-magic-link-session-manager",
|
|
58
|
+
"description": "Provides session issue, invalidate, and cookie shape."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "Email delivery adapter",
|
|
62
|
+
"kind": "tac",
|
|
63
|
+
"tacId": "TAC-504-security-auth-magic-link-email-delivery-adapter",
|
|
64
|
+
"description": "Provides the send method the routes call."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "Principal registry",
|
|
68
|
+
"kind": "tac",
|
|
69
|
+
"tacId": "TAC-505-security-auth-magic-link-principal-registry",
|
|
70
|
+
"description": "Provides isRegistered."
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"tradeoffs": "Rate-limit ceilings and the anti-enumeration budget are conservative defaults that make operator retry cheap and abuse expensive; a project with a heavier legitimate load overrides the ceilings and states the trade in its own ADR. The routes are the only auth-shaped HTTP surface the blueprint ships; projects wanting a bearer-token flow instead layer a project-authored ADR superseding auth-model and provide their own routes.",
|
|
74
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
75
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
76
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-504-security-auth-magic-link-email-delivery-adapter",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Email delivery adapter",
|
|
8
|
+
"purpose": "Names the narrow interface the auth flow uses to hand a composed sign-in URL to an external email transport, and specifies the outcome shape returned. Provider selection, credential handling, and provider-specific error semantics live inside project-authored implementations of this interface; nothing on the auth routes or the managers reaches around the interface.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Declare the send({ to, subject, textBody, htmlBody }) method as the sole auth-facing surface and { ok, providerStatus, providerMessageId, error } as the sole returned shape (AC-3110-1).",
|
|
11
|
+
"Ship one stub adapter implementation that resolves { ok: true, providerStatus: 200, providerMessageId: 'stub' } and records outgoing calls in memory, for tests and dry runs (AC-3110-3).",
|
|
12
|
+
"Route send failures to the auth event log via an adapterSendFailed entry without changing the POST /login response body or status (AC-3110-2, AC-3109-1)."
|
|
13
|
+
],
|
|
14
|
+
"internalStructure": "One JSDoc-typed interface declaration in the contract file and one stub-implementation module; provider adapters (SMTP, Resend, SES) are project-authored modules that satisfy the interface. The routes hold an adapter reference passed at composition time and call adapter.send directly.",
|
|
15
|
+
"interfaces": [
|
|
16
|
+
{
|
|
17
|
+
"name": "send",
|
|
18
|
+
"kind": "async-method",
|
|
19
|
+
"description": "send({ to, subject, textBody, htmlBody }) -> Promise<{ ok, providerStatus, providerMessageId, error }>; the sole method the auth code calls on the adapter."
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"dependencies": [],
|
|
23
|
+
"tradeoffs": "Fixing the return shape means every provider adapter has to normalise its own vocabulary (provider status codes, provider message ids) into the four declared fields; that is the cost of keeping the auth code provider-neutral. Projects that need richer provider observability wire it on the provider side of the interface and mirror the salient fields onto the adapterSendFailed event outcome.",
|
|
24
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
25
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-505-security-auth-magic-link-principal-registry",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Principal registry",
|
|
8
|
+
"purpose": "Names the narrow interface the auth flow uses to ask 'is this address registered?' and specifies that the answer is a boolean and nothing else. Principal roles, quotas, tenancy, and identity metadata are project concerns layered above this interface, not inside it.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Declare the isRegistered(email) method as the sole auth-facing surface and boolean as the sole returned type (AC-3111-1).",
|
|
11
|
+
"Ship one single-address registry implementation that reads one email from configuration and returns true only for that email (AC-3111-3).",
|
|
12
|
+
"Guarantee, at the interface level, that the response to a submission is uniform across true and false answers because the boolean never surfaces in the response body, status, or Content-Type (AC-3111-2)."
|
|
13
|
+
],
|
|
14
|
+
"internalStructure": "One JSDoc-typed interface declaration in the contract file and one single-address-implementation module. Multi-principal registries (allow-list file, database lookup, external identity provider) are project-authored modules that satisfy the interface.",
|
|
15
|
+
"interfaces": [
|
|
16
|
+
{
|
|
17
|
+
"name": "isRegistered",
|
|
18
|
+
"kind": "async-method",
|
|
19
|
+
"description": "isRegistered(email) -> Promise<boolean>; the sole method the auth code calls on the registry."
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"dependencies": [],
|
|
23
|
+
"tradeoffs": "Narrowing the answer to a boolean forbids the registry from returning richer information about the principal on the sign-in path; that is deliberate, because richer information on the sign-in path is exactly what makes an enumeration oracle. Projects that need identity metadata for authorisation load it after session issue, keyed by the principal id from the session record.",
|
|
24
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
25
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
26
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "security-auth-magic-link-US-3101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "security-auth-magic-link-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Operator signs in by receiving a one-shot magic link in their inbox",
|
|
8
|
+
"asA": "operator with a registered email address and no memorised password",
|
|
9
|
+
"iWant": "to submit my address to a sign-in form and receive a single URL that signs me in when I click it",
|
|
10
|
+
"soThat": "no password exists anywhere for me to lose, reuse, or leak",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-3101-1",
|
|
14
|
+
"description": "GET /login renders a form with a single email field and a submit control. No password field is present anywhere on the page.",
|
|
15
|
+
"given": "the operator navigates to /login",
|
|
16
|
+
"when": "the page renders",
|
|
17
|
+
"then": "the response body contains an input with type='email' and name='email', and no input with type='password' or autocomplete='current-password'",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-3101-2",
|
|
23
|
+
"description": "POST /login accepts application/x-www-form-urlencoded with an email field and returns a 200 response confirming that if the address is registered a link has been sent.",
|
|
24
|
+
"given": "the operator submits the form with a valid email string",
|
|
25
|
+
"when": "the POST /login handler runs",
|
|
26
|
+
"then": "the response status is 200 and the body confirms that a link will arrive if the address is registered, without confirming or denying that this address is registered",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-3101-3",
|
|
32
|
+
"description": "A submission for a registered address causes exactly one email to be dispatched via the configured adapter, carrying a URL that resolves to GET /login/verify on this deployment with the minted token as the sole query parameter.",
|
|
33
|
+
"given": "a registered principal submits the form",
|
|
34
|
+
"when": "the handler completes",
|
|
35
|
+
"then": "the email-delivery-adapter.send call fires exactly once with a body containing a URL whose path is /login/verify and whose only query parameter carries the token",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "AC-3101-4",
|
|
41
|
+
"description": "Following the emailed URL to GET /login/verify with a valid unconsumed unexpired token issues a session and redirects the operator to the configured post-sign-in landing route.",
|
|
42
|
+
"given": "the operator follows the emailed URL within the token's validity window",
|
|
43
|
+
"when": "GET /login/verify runs",
|
|
44
|
+
"then": "the response is a 302 to the configured post-sign-in route and carries a Set-Cookie header issuing a fresh session handle",
|
|
45
|
+
"testable": true,
|
|
46
|
+
"scope": "runtime"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "AC-3101-5",
|
|
50
|
+
"description": "GET /login/verify with a missing, malformed, unknown, expired, or already-consumed token returns a 401 with a generic sign-in-failed response and no session issue.",
|
|
51
|
+
"given": "GET /login/verify is called with any token value that does not resolve to a valid unconsumed unexpired record",
|
|
52
|
+
"when": "the handler runs",
|
|
53
|
+
"then": "the response status is 401, no Set-Cookie is emitted, and the response body reveals nothing about which failure class the token fell into",
|
|
54
|
+
"testable": true,
|
|
55
|
+
"scope": "runtime"
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"tacIds": [
|
|
59
|
+
"TAC-501-security-auth-magic-link-manager",
|
|
60
|
+
"TAC-503-security-auth-magic-link-login-routes"
|
|
61
|
+
],
|
|
62
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
63
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
64
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "security-auth-magic-link-US-3102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "security-auth-magic-link-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Sign-in tokens consume exactly once, expire on a bounded clock, and are superseded on remint",
|
|
8
|
+
"asA": "operator whose emailed link might be intercepted, archived, or replayed",
|
|
9
|
+
"iWant": "each link to work exactly one time within a short window and to become useless the moment I ask for a fresh link",
|
|
10
|
+
"soThat": "a stolen or forwarded URL stops mattering as soon as I have moved past it",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-3102-1",
|
|
14
|
+
"description": "A token consumed by GET /login/verify cannot be consumed a second time; a repeat call with the same token returns 401 without issuing a session.",
|
|
15
|
+
"given": "a token has been consumed once, issuing a session",
|
|
16
|
+
"when": "GET /login/verify is called again with the same token value",
|
|
17
|
+
"then": "the response status is 401 and no Set-Cookie header is emitted",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-3102-2",
|
|
23
|
+
"description": "A token past its expiry cannot be consumed; GET /login/verify after the expiry window returns 401 without issuing a session.",
|
|
24
|
+
"given": "a valid unconsumed token whose expiresAt is now in the past",
|
|
25
|
+
"when": "GET /login/verify is called with that token",
|
|
26
|
+
"then": "the response status is 401 and no Set-Cookie header is emitted",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-3102-3",
|
|
32
|
+
"description": "The default token expiry window is fifteen minutes; the window is a project-configurable option on the magic-link manager and its effective value is enumerable at runtime.",
|
|
33
|
+
"given": "a token is minted without a project override",
|
|
34
|
+
"when": "the manager records the expiry",
|
|
35
|
+
"then": "the recorded expiresAt is fifteen minutes after the mint clock; when a project supplies expiryMs the recorded expiry matches the override",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "AC-3102-4",
|
|
41
|
+
"description": "Minting a fresh token for a principal invalidates every prior unconsumed token for that principal; the previous URL cannot be exchanged after remint.",
|
|
42
|
+
"given": "a principal has an unconsumed token T1 and requests a fresh sign-in link, minting T2",
|
|
43
|
+
"when": "GET /login/verify is called with T1",
|
|
44
|
+
"then": "the response status is 401 and no Set-Cookie header is emitted",
|
|
45
|
+
"testable": true,
|
|
46
|
+
"scope": "runtime"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"tacIds": [
|
|
50
|
+
"TAC-501-security-auth-magic-link-manager"
|
|
51
|
+
],
|
|
52
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
53
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
54
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "security-auth-magic-link-US-3103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "security-auth-magic-link-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Session handles are opaque, high-entropy, and carry no client-readable claims",
|
|
8
|
+
"asA": "operator who does not want their session credential to double as a signed self-describing token",
|
|
9
|
+
"iWant": "the handle in my browser to be nothing more than a random opaque string that only the server can interpret",
|
|
10
|
+
"soThat": "revocation is a server delete and there is no signed payload for anyone to forge, decode, or replay past its expiry",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-3103-1",
|
|
14
|
+
"description": "Issued session handles are base64url of at least 24 bytes of entropy; every issue produces a distinct handle across a batch of one thousand.",
|
|
15
|
+
"given": "one thousand sessions are issued in a batch",
|
|
16
|
+
"when": "the handles are inspected",
|
|
17
|
+
"then": "every handle is a base64url string decoding to at least 24 bytes, and no two handles in the batch are equal",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-3103-2",
|
|
23
|
+
"description": "Handles carry no encoded payload; a handle contains no principal id, no expiry, no scope, and no signed segment separable by dots or other JWT-shaped delimiters.",
|
|
24
|
+
"given": "any issued session handle",
|
|
25
|
+
"when": "the string is inspected",
|
|
26
|
+
"then": "it contains no dot-separated JWT segments, decodes to random bytes, and reveals no substring matching the principal id, expiry timestamp, or scope value stored in the session record",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-3103-3",
|
|
32
|
+
"description": "No authenticated response body or header on any code path emits a JWT-shaped token, a signed bearer, or any credential envelope beyond the opaque session cookie.",
|
|
33
|
+
"given": "any authenticated request-response pair on the surface",
|
|
34
|
+
"when": "response headers and body are scanned for JWT-shaped tokens (three dot-separated base64url segments) or Authorization headers with Bearer prefixes",
|
|
35
|
+
"then": "no such artefact is present outside of a Set-Cookie header carrying the opaque session handle",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"tacIds": [
|
|
41
|
+
"TAC-502-security-auth-magic-link-session-manager"
|
|
42
|
+
],
|
|
43
|
+
"createdAt": "2026-08-21T00:00:00Z",
|
|
44
|
+
"updatedAt": "2026-08-21T00:00:00Z"
|
|
45
|
+
}
|