rcf-lite 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +2 -0
- package/bin/view-supervisor-child.mjs +0 -0
- package/blueprints/application-api-rest/README.md +40 -0
- package/blueprints/application-api-rest/assets/middleware/auth-classes.md +45 -0
- package/blueprints/application-api-rest/assets/openapi/openapi-skeleton.yaml +322 -0
- package/blueprints/application-api-rest/assets/sample-data/sample-resources.json +53 -0
- package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +204 -0
- package/blueprints/application-api-rest/blueprint.json +265 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +25 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +18 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +48 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +41 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +46 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +46 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +40 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +46 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +90 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +90 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +64 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +73 -0
- package/blueprints/application-api-rest/docs/topics.md +46 -0
- package/blueprints/application-api-rest/guide/application-api-rest.md +41 -0
- package/blueprints/application-spa/README.md +90 -0
- package/blueprints/application-spa/assets/component-specs/actions-and-text-inputs.md +36 -0
- package/blueprints/application-spa/assets/component-specs/data-display.md +19 -0
- package/blueprints/application-spa/assets/component-specs/feedback-and-status.md +27 -0
- package/blueprints/application-spa/assets/component-specs/overlays.md +23 -0
- package/blueprints/application-spa/assets/component-specs/selection-controls.md +23 -0
- package/blueprints/application-spa/assets/sample-data/sample-entities.json +41 -0
- package/blueprints/application-spa/assets/tokens/design-tokens.json +140 -0
- package/blueprints/application-spa/assets/tokens/theme.css +169 -0
- package/blueprints/application-spa/assets/viewports.md +18 -0
- package/blueprints/application-spa/assets/wireframes/dashboard.md +48 -0
- package/blueprints/application-spa/assets/wireframes/detail.md +40 -0
- package/blueprints/application-spa/assets/wireframes/empty.md +31 -0
- package/blueprints/application-spa/assets/wireframes/error.md +46 -0
- package/blueprints/application-spa/assets/wireframes/form.md +50 -0
- package/blueprints/application-spa/assets/wireframes/list.md +45 -0
- package/blueprints/application-spa/assets/wireframes/session-expired.md +35 -0
- package/blueprints/application-spa/assets/wireframes/sign-in.md +41 -0
- package/blueprints/application-spa/assets/wireframes/sign-out.md +32 -0
- package/blueprints/application-spa/blueprint.json +387 -0
- package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +13 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +18 -0
- package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +45 -0
- package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +32 -0
- package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +32 -0
- package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +27 -0
- package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +27 -0
- package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +19 -0
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +57 -0
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +56 -0
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +61 -0
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +70 -0
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +70 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +100 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +81 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +82 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +60 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +60 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +78 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +51 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +72 -0
- package/blueprints/application-spa/docs/topics.md +57 -0
- package/blueprints/application-spa/guide/application-spa.md +40 -0
- package/blueprints/ci-pipeline/README.md +49 -0
- package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +61 -0
- package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +50 -0
- package/blueprints/ci-pipeline/assets/report-samples/per-gate.json +12 -0
- package/blueprints/ci-pipeline/assets/report-samples/pipeline.json +28 -0
- package/blueprints/ci-pipeline/blueprint.json +46 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-702-ci-pipeline-strict-coverage-gate.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-703-ci-pipeline-node-only-runner.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-704-ci-pipeline-report-shape.json +25 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-002.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-003.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-004.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-005.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-006.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-007.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-008.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-010.json +18 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-701-ci-pipeline-gate-runner.json +59 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-702-ci-pipeline-gate-report.json +32 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-703-ci-pipeline-aggregate-report.json +41 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6102.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6103.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6104.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6105.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6106.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6107.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6108.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6110.json +36 -0
- package/blueprints/ci-pipeline/docs/topics.md +49 -0
- package/blueprints/ci-pipeline/guide/ci-pipeline.md +79 -0
- package/blueprints/deploy-cloudflare-workers/README.md +63 -0
- package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/build-and-upload.yml.md +109 -0
- package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/promote.yml.md +120 -0
- package/blueprints/deploy-cloudflare-workers/assets/verification/served-surface-probes.md +90 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md +87 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/preview-alias-shape.md +86 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/wrangler-toml-shape.md +85 -0
- package/blueprints/deploy-cloudflare-workers/blueprint.json +48 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json +30 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json +35 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +30 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json +25 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json +25 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +54 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +57 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +51 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +64 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +54 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +47 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +46 -0
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +46 -0
- package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +74 -0
- package/blueprints/email-smtp-resend/README.md +45 -0
- package/blueprints/email-smtp-resend/assets/from-address-rotation-pattern.md +44 -0
- package/blueprints/email-smtp-resend/assets/resend-verification-pointer.md +25 -0
- package/blueprints/email-smtp-resend/assets/stub-adapter.md +65 -0
- package/blueprints/email-smtp-resend/blueprint.json +23 -0
- package/blueprints/email-smtp-resend/contributions/adrs/adr-401-email-smtp-resend-transport-choice.json +30 -0
- package/blueprints/email-smtp-resend/contributions/adrs/adr-402-email-smtp-resend-retry-and-backoff-posture.json +30 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +18 -0
- package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +53 -0
- package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +56 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +36 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +36 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +37 -0
- package/blueprints/email-smtp-resend/docs/topics.md +44 -0
- package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +71 -0
- package/blueprints/observability-essentials/README.md +53 -0
- package/blueprints/observability-essentials/assets/probe-samples/liveness-body.json +4 -0
- package/blueprints/observability-essentials/assets/probe-samples/readiness-body.json +18 -0
- package/blueprints/observability-essentials/assets/status-page-samples/status-page-clean.html +22 -0
- package/blueprints/observability-essentials/assets/status-page-samples/status-page-with-notice.html +25 -0
- package/blueprints/observability-essentials/blueprint.json +54 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-803-observability-essentials-status-page-contract.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-804-observability-essentials-probe-secrecy.json +25 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-805-observability-essentials-notification-outcome-model.json +25 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +18 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +32 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +43 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +37 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +42 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +46 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +47 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +46 -0
- package/blueprints/observability-essentials/docs/topics.md +57 -0
- package/blueprints/observability-essentials/guide/observability-essentials.md +68 -0
- package/blueprints/observability-probe-endpoints/README.md +53 -0
- package/blueprints/observability-probe-endpoints/assets/docker/dockerfile-healthcheck.md +19 -0
- package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md +54 -0
- package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes.md +36 -0
- package/blueprints/observability-probe-endpoints/assets/load-balancer/health-check-config.md +23 -0
- package/blueprints/observability-probe-endpoints/assets/systemd/notify-service.md +30 -0
- package/blueprints/observability-probe-endpoints/assets/uptime-monitor/monitor-config.md +22 -0
- package/blueprints/observability-probe-endpoints/blueprint.json +44 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1501-observability-probe-endpoints-health-probes.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1504-observability-probe-endpoints-separate-port-option.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +39 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +40 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +51 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +39 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +46 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +51 -0
- package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +83 -0
- package/blueprints/persistence-data-d1/README.md +50 -0
- package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +72 -0
- package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +115 -0
- package/blueprints/persistence-data-d1/assets/migration-shape/migration-file-shape.md +119 -0
- package/blueprints/persistence-data-d1/assets/wrangler-config/d1-binding-shape.md +93 -0
- package/blueprints/persistence-data-d1/blueprint.json +42 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1401-persistence-data-d1-store-model.json +30 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1402-persistence-data-d1-migration-discipline.json +30 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1403-persistence-data-d1-event-secrecy.json +25 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +25 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1405-persistence-data-d1-recovery-model.json +30 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +18 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +51 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +31 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +38 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +39 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +46 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +46 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +38 -0
- package/blueprints/persistence-data-d1/docs/topics.md +59 -0
- package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +77 -0
- package/blueprints/persistence-data-sqlite/README.md +50 -0
- package/blueprints/persistence-data-sqlite/assets/backup-procedures/hot-checkpoint-note.md +22 -0
- package/blueprints/persistence-data-sqlite/assets/backup-procedures/sqlite-file-copy.md +70 -0
- package/blueprints/persistence-data-sqlite/assets/schema-samples/catalog-file-layout.md +73 -0
- package/blueprints/persistence-data-sqlite/assets/schema-samples/migration-shape.md +76 -0
- package/blueprints/persistence-data-sqlite/blueprint.json +50 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-601-persistence-data-sqlite-store-model.json +30 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-602-persistence-data-sqlite-migration-discipline.json +30 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-603-persistence-data-sqlite-event-secrecy.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-604-persistence-data-sqlite-store-boundary.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-605-persistence-data-sqlite-backup-model.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +57 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +34 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +31 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +33 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +37 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +37 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +37 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +49 -0
- package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +69 -0
- package/blueprints/security-auth-clerk/README.md +50 -0
- package/blueprints/security-auth-clerk/assets/authorisation/role-claim-mapping-sample.md +99 -0
- package/blueprints/security-auth-clerk/assets/middleware/node-middleware-shape.md +86 -0
- package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-react.md +48 -0
- package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-vue.md +41 -0
- package/blueprints/security-auth-clerk/blueprint.json +42 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1001-security-auth-clerk-auth-model.json +30 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1002-security-auth-clerk-middleware-boundary.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1005-security-auth-clerk-session-lifecycle.json +25 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +18 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +42 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +30 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +38 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1004-security-auth-clerk-claims-mapper.json +22 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +38 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +37 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +37 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +36 -0
- package/blueprints/security-auth-clerk/docs/topics.md +56 -0
- package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +71 -0
- package/blueprints/security-auth-keycloak/README.md +56 -0
- package/blueprints/security-auth-keycloak/assets/local-container/keycloak-bootstrap.md +54 -0
- package/blueprints/security-auth-keycloak/assets/middleware/verifier-wiring.md +93 -0
- package/blueprints/security-auth-keycloak/assets/mock-introspection/mock-introspection-shape.md +62 -0
- package/blueprints/security-auth-keycloak/assets/provider-router/router-shape.md +71 -0
- package/blueprints/security-auth-keycloak/assets/realm-skeleton/realm-config-shape.md +55 -0
- package/blueprints/security-auth-keycloak/blueprint.json +49 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1201-security-auth-keycloak-auth-model.json +35 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1202-security-auth-keycloak-verification-mode-choice.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1203-security-auth-keycloak-provider-routing-seam.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1204-security-auth-keycloak-session-vs-token-contract.json +25 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1205-security-auth-keycloak-jwks-rotation-cache-lifetime.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1206-security-auth-keycloak-refresh-and-sign-out-posture.json +25 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +51 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +46 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +32 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +47 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +36 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +36 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +46 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +36 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +74 -0
- package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +81 -0
- package/blueprints/security-auth-magic-link/README.md +46 -0
- package/blueprints/security-auth-magic-link/assets/email-templates/magic-link-email.md +44 -0
- package/blueprints/security-auth-magic-link/assets/email-templates/stub-adapter.md +55 -0
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/allow-list-file.md +46 -0
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +35 -0
- package/blueprints/security-auth-magic-link/blueprint.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-501-security-auth-magic-link-model.json +30 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-502-security-auth-magic-link-token-secrecy.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-503-security-auth-magic-link-anti-enumeration-budget.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-504-security-auth-magic-link-session-lifecycle.json +30 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-505-security-auth-magic-link-rate-limiting.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +76 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +26 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +26 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +64 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +54 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +55 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +54 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +48 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +45 -0
- package/blueprints/security-auth-magic-link/docs/topics.md +45 -0
- package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +65 -0
- package/blueprints/security-auth-oauth2/README.md +50 -0
- package/blueprints/security-auth-oauth2/assets/mock-provider/mock-oidc-shape.md +55 -0
- package/blueprints/security-auth-oauth2/assets/provider-selector/list-shape.md +27 -0
- package/blueprints/security-auth-oauth2/assets/providers/generic-oidc-discovery.md +31 -0
- package/blueprints/security-auth-oauth2/assets/providers/github-oauth2-only.md +31 -0
- package/blueprints/security-auth-oauth2/assets/providers/google-oidc.md +31 -0
- package/blueprints/security-auth-oauth2/assets/session-bridge/opaque-handle-shape.md +59 -0
- package/blueprints/security-auth-oauth2/blueprint.json +44 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1101-security-auth-oauth2-auth-model.json +35 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1103-security-auth-oauth2-pkce-discipline.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +61 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +33 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +51 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +29 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +47 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +45 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +36 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +36 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +55 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +45 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +46 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +46 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +37 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +37 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +28 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +58 -0
- package/blueprints/security-auth-oauth2/guide/security-auth-oauth2.md +65 -0
- package/blueprints/security-secrets-management/README.md +48 -0
- package/blueprints/security-secrets-management/assets/cli-usage/agent-access-pattern.md +69 -0
- package/blueprints/security-secrets-management/assets/manifest-samples/environment-aware-example.md +33 -0
- package/blueprints/security-secrets-management/assets/manifest-samples/secrets-yaml-shape.md +74 -0
- package/blueprints/security-secrets-management/assets/ui-integration/three-way-choice.md +44 -0
- package/blueprints/security-secrets-management/blueprint.json +43 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-901-security-secrets-management-secrets-source.json +30 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-902-security-secrets-management-default-vendor.json +35 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-903-security-secrets-management-agent-access-discipline.json +25 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-904-security-secrets-management-dotenv-reflection.json +25 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-905-security-secrets-management-rotation-and-audit.json +30 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +18 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +52 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +34 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +46 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +57 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +59 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +37 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +55 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +45 -0
- package/blueprints/security-secrets-management/docs/topics.md +46 -0
- package/blueprints/security-secrets-management/guide/security-secrets-management.md +68 -0
- package/fixtures/canary-manifest.json +1 -101
- package/package.json +16 -10
- package/rcf/.identity/profile.md +37 -0
- package/rcf/knowledge/INDEX.md +12 -0
- package/rcf/knowledge/README.md +41 -0
- package/rcf/knowledge/docs/.gitkeep +0 -0
- package/rcf/knowledge/notes/.gitkeep +0 -0
- package/scripts/preinstall-node-check.mjs +61 -0
- package/src/blueprint/apply.js +12 -6
- package/src/blueprint/conflicts.js +8 -8
- package/src/blueprint/index.js +2 -1
- package/src/blueprint/list.js +60 -0
- package/src/blueprint/loader.js +26 -1
- package/src/blueprint/namespace.js +20 -16
- package/src/blueprint/shelf-resolver.js +173 -0
- package/src/blueprint/supersede.js +3 -2
- package/src/browser-verify/invariants.js +40 -0
- package/src/browser-verify/runner.js +2 -0
- package/src/cli/blueprint.js +53 -9
- package/src/cli/init.js +2 -0
- package/src/core/store/validator.js +15 -27
- package/src/core/store/writer.js +64 -2
- package/src/ruleset/ruleset.json +1 -1
- package/src/setup/agent-setup.js +28 -10
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# observability-essentials blueprint coordination vocabulary
|
|
2
|
+
|
|
3
|
+
This file is the observability-essentials half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.4.4 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
|
|
4
|
+
|
|
5
|
+
## Global ADR topics this blueprint contributes (exact strings)
|
|
6
|
+
|
|
7
|
+
| Topic string | observability-essentials contribution | Origin | Composition note |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
| `healthProbes` | ADR-801-observability-essentials-health-probes | Minted here; pre-cleared as unclaimed against application-spa (`clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel`), application-api-rest (`errorEnvelope`, `authModel`, `apiVersioning`, `logging`), security-auth-magic-link (`authModel`), persistence-data-sqlite (`persistenceStore`, `migrationDiscipline`), ci-pipeline (`ciGates`, `strictCoverageGate`), and the hello-panel walkthrough exemplar (`operatorPanel`) | The one HTTP health probe contract for the project: two endpoints (liveness /healthz, readiness /readyz), shared JSON body shape, served on the request-traffic listener. A composing blueprint that holds a different endpoint contract (a single /health endpoint, gRPC health protocol, probes on a separate admin port) contributes its own scope:global ADR on this exact string and lets composition surface the pairing. Expected resolution: one project-level ADR that fixes the endpoint contract |
|
|
10
|
+
| `readinessSemantics` | ADR-802-observability-essentials-readiness-semantics | Minted here; pre-cleared as unclaimed against application-spa, application-api-rest, security-auth-magic-link, persistence-data-sqlite, ci-pipeline, and hello-panel | The one readiness aggregation and declaration scope for the project: strict-any-fail over an explicit boot-time-declared dependency set, evaluated against per-dep cached state. A composing blueprint that holds a different opinion (quorum aggregation, write-path-only readiness, graceful-degradation model) conflicts here by design. Expected resolution: one project-level ADR fixing the semantics |
|
|
11
|
+
| `statusPageContract` | ADR-803-observability-essentials-status-page-contract | Minted here; pre-cleared as unclaimed against application-spa, application-api-rest, security-auth-magic-link, persistence-data-sqlite, ci-pipeline, and hello-panel | The one public status page contract for the project: declared component list plus fixed state enum plus stable-fielded incident notices. A composing blueprint that wants a different public contract (JSON endpoint at /status.json, historical uptime cells as v1 requirement, webhook-posted notices) conflicts here by design. Expected resolution: one project-level ADR fixing the public contract |
|
|
12
|
+
|
|
13
|
+
The observability-essentials blueprint claims three global topics. Every other contribution is scope-local (ADR-804 probe secrecy and ADR-805 notification outcome model do not contribute global topics; a composing blueprint that holds an opinion on probe auth policy or notification outcome shape authors its own project-level ADR if it wants to override).
|
|
14
|
+
|
|
15
|
+
Note on the delineation from the hello-panel walkthrough's `operatorPanel` topic: `operatorPanel` (owned by the hello-panel walkthrough exemplar) governs the project's PRIMARY operator drift-detection surface, an AUTHENTICATED surface for the operator. This blueprint's status page (ADR-803) governs the PUBLIC status surface for external readers. The two surfaces are deliberately distinct in audience and vocabulary; this blueprint MUST NOT touch `operatorPanel` and does not contribute an ADR on it.
|
|
16
|
+
|
|
17
|
+
Note on the delineation from the application-api-rest blueprint's `logging` topic: `logging` (owned by application-api-rest ADR-304) governs the wire-log shape of the HTTP tier. This blueprint's notification outcome sink (ADR-805) is a durable record surface for notification attempts, not a log; the two do not overlap.
|
|
18
|
+
|
|
19
|
+
Note on the delineation from the persistence-data-sqlite blueprint's `persistenceStore` topic: this blueprint's notification outcome sink is substrate-agnostic. When composing with the persistence-data-sqlite blueprint, the outcome sink's substrate is a facade verb on that store; the observability-essentials blueprint does not itself hold an opinion on the store engine and does not conflict on `persistenceStore`.
|
|
20
|
+
|
|
21
|
+
Rules for new topics (inherited from the application-spa, application-api-rest, security-auth-magic-link, and persistence vocabularies, restated as law): lower camel case, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer. Do not mint variants of existing strings (`healthEndpoints`, `probes`, `livenessReadiness` are all wrong when `healthProbes` already exists; `readinessAggregation`, `readyPolicy` are all wrong when `readinessSemantics` already exists; `statusPage`, `publicStatus`, `uptimePage` are all wrong when `statusPageContract` already exists).
|
|
22
|
+
|
|
23
|
+
## Id number bands (registry bootstrap)
|
|
24
|
+
|
|
25
|
+
AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.4.4 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is ratified policy (2026-08-19); this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
|
|
26
|
+
|
|
27
|
+
This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
|
|
28
|
+
|
|
29
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
30
|
+
|---|---|---|---|---|
|
|
31
|
+
| application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
|
|
32
|
+
| application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
|
|
33
|
+
| security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
|
|
34
|
+
| email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
|
|
35
|
+
| hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
|
|
36
|
+
| persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
37
|
+
| ci-pipeline | 6101-6899 | 7xx | shipped v1.0.0 | `ciGates`, `strictCoverageGate` |
|
|
38
|
+
| observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
|
|
39
|
+
| security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
|
|
40
|
+
| security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
|
|
41
|
+
| security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
|
|
42
|
+
| security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
|
|
43
|
+
| deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
|
|
44
|
+
| persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
45
|
+
| observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics` |
|
|
46
|
+
|
|
47
|
+
US 7101-7110 sit at the LOW end of the 7101-7899 band on purpose. A project-side story that mechanically derives from an observability-essentials REQs id into the number `7110` would collide against observability-essentials-US-7110 in this package; the band leaves headroom at the HIGH end (US 7181-7899) so a project's own stories anchored to observability-essentials REQs can allocate without conflict. The watchpost run4 lesson applies here too.
|
|
48
|
+
|
|
49
|
+
Row-status caveat: the ci-pipeline seat shipped first (PR #95 merged at 595cab9c on main). This branch was rebased onto that main; the ci-pipeline row reflects the shipped state, and the observability row flips to `shipped v1.0.0` at this branch's merge (Dave coordinates that final flip in the merge commit or an immediate follow-up).
|
|
50
|
+
|
|
51
|
+
## Shared expectations for future composing blueprints
|
|
52
|
+
|
|
53
|
+
- Reuse `healthProbes` exactly as spelled here when your blueprint holds an opinion on the health endpoint contract; contribute your own scope:global ADR on that string and let composition surface the pairing. A gRPC-health blueprint or a single-endpoint blueprint will conflict here by design.
|
|
54
|
+
- Reuse `readinessSemantics` exactly as spelled here when your blueprint holds an opinion on readiness aggregation or the declaration scope; a quorum-aggregation blueprint conflicts here by design.
|
|
55
|
+
- Reuse `statusPageContract` exactly as spelled here when your blueprint holds an opinion on the public status surface; a machine-readable JSON-endpoint blueprint or a historical-uptime blueprint conflicts here by design.
|
|
56
|
+
- This blueprint's decision states the two-endpoint HTTP JSON contract, the strict-any-fail explicit-declaration readiness semantics, and the declared-component fixed-enum status page. Compose compatible metrics-export, tracing, or authenticated-operator-dashboard blueprints, or expect the operator to supersede with one project-level ADR per topic.
|
|
57
|
+
- Global topics that plausibly belong to a future blueprint and are NOT claimed by any shipped blueprint: `messageSerialisation` and `deliverySemantics` (a message-consumer blueprint's natural globals), `caching` (unclaimed by every shipped blueprint), `metricsExport` and `tracingProtocol` (natural globals for a metrics or tracing blueprint that would compose alongside this one). Define any of these in your own package's topics doc, in this file's format, and consider whether the band-registry table above needs your slug added.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Observability blueprint guide
|
|
2
|
+
|
|
3
|
+
## What it is
|
|
4
|
+
|
|
5
|
+
A default observability floor for small greenfield rcf-lite projects. The blueprint contributes the WHAT of an observability pattern: how the process advertises liveness to its orchestrator, how it advertises readiness to its load balancer, how external readers see the current state of the service on a public status page, and how the project records the outcome of every notification it attempts. The default endpoint shape is HTTP with a stable JSON body; metrics export, distributed tracing, and log shipping are documented future variants behind their own future blueprints.
|
|
6
|
+
|
|
7
|
+
Concretely, the blueprint ships ten requirements, ten user stories (thirty acceptance criteria), four architecture components, and five architecture decision records. Three ADRs are `scope: global` on the topics `healthProbes` (the two-endpoint HTTP JSON contract), `readinessSemantics` (strict-any-fail over an explicit boot-time-declared dependency set with cached per-dep state), and `statusPageContract` (the declared component list, the fixed state enum, and the stable notice fields on the public status page); the other two are scope-local operational ADRs (probe secrecy, notification outcome model) that a composing blueprint does not conflict with by default.
|
|
8
|
+
|
|
9
|
+
## What it is not
|
|
10
|
+
|
|
11
|
+
Not a metrics-export surface. There is no Prometheus scrape endpoint, no StatsD emission, no OpenTelemetry metrics contract. Projects that need metrics wire them in project-side or wait for a future `metrics-export` blueprint that composes alongside this one.
|
|
12
|
+
|
|
13
|
+
Not a distributed-tracing surface. There is no span emission contract, no propagation rules, no sampling policy. A future `tracing` blueprint composes alongside this one; until then, projects that need distributed tracing supersede with a project-level ADR or add a project-authored tracing surface.
|
|
14
|
+
|
|
15
|
+
Not a log-shipping surface. The application-api-rest blueprint's `logging` topic governs the wire-log shape of the HTTP tier; this blueprint does not extend or conflict with that. Notification outcome records are a durable record surface, not a log.
|
|
16
|
+
|
|
17
|
+
Not an authenticated operator dashboard. The readiness probe body exposes granular per-dependency state for operator consumption, but a rich UI for internal state (per-endpoint metrics, per-request tracing, live event streams) is out of scope; projects that need it author it on top of the readiness surface and their own authenticated dashboards.
|
|
18
|
+
|
|
19
|
+
Not a historical uptime chart on the status page. The public status page renders current state only at v1.0.0 (see the README's Known mechanism-reach gaps). Projects that need historical uptime cells layer them on top of a project-owned metrics substrate; a future `metrics-store` blueprint or persistence-event-log-fed variant lifts this into an AC at v1.1.
|
|
20
|
+
|
|
21
|
+
Not an operator drift-detection panel. The hello-panel walkthrough exemplar's `operatorPanel` topic (authenticated persistent operator status panel above the main content) is deliberately distinct from this blueprint's `statusPageContract`; the two surfaces have different audiences (operator vs external reader) and different vocabularies. A project that wants both applies both blueprints and lets them compose.
|
|
22
|
+
|
|
23
|
+
## When to reach for it
|
|
24
|
+
|
|
25
|
+
Reach for the observability-essentials blueprint when:
|
|
26
|
+
|
|
27
|
+
- The project is a small greenfield rcf-lite deployment (single deployable, one small team, one host or a small container fleet, no ops team standing by).
|
|
28
|
+
- The deploy target runs under an orchestrator that consumes HTTP health probes (Kubernetes, systemd with sd_notify or an http-check add-on, a container platform with an equivalent probe contract).
|
|
29
|
+
- The service has external readers (customers, partners, anonymous visitors) who need a canonical answer to 'is this up right now' without opening a support ticket.
|
|
30
|
+
- The project sends notifications (email, SMS, push, webhook) to human recipients and needs to answer 'did the customer get it' from a queryable record rather than by hunting a provider dashboard.
|
|
31
|
+
- The observability posture is 'start with the two-endpoint HTTP contract plus a public status page, layer metrics and tracing in later'; the blueprint's contract survives that layering, because the probe endpoints are the orchestrator's floor and everything else composes above them.
|
|
32
|
+
|
|
33
|
+
## When it does not fit
|
|
34
|
+
|
|
35
|
+
Do not reach for the observability-essentials blueprint when:
|
|
36
|
+
|
|
37
|
+
- The orchestrator does not consume HTTP probes and cannot be reconfigured to (a proprietary orchestration substrate with a fixed non-HTTP health contract, a gRPC-first application on a gRPC-only mesh). A project with these needs supersedes ADR-801 with a project-level ADR selecting the orchestrator's native probe surface; the readiness semantics (ADR-802) and the status page contract (ADR-803) are transport-agnostic and carry over.
|
|
38
|
+
- The service has no external readers and no public status contract is needed (an internal-only tool consumed only by authenticated operators). A project with these needs applies the blueprint with the status page path unrouted or supersedes ADR-803 with a project-level ADR declining the public surface. The probes stay useful.
|
|
39
|
+
- The service sends no notifications (a read-only API, a batch-only pipeline). A project with these needs applies the blueprint without wiring TAC-804 into any code path; the notification outcome sink is dormant.
|
|
40
|
+
- The observability posture is metrics-first or tracing-first (a project that has already committed to OpenTelemetry end-to-end and does not want a lightweight two-probe HTTP floor on top). A project with these needs supersedes the health probe ADR with a project-level ADR mapping to the OpenTelemetry contract; the notification outcome sink and the public status page contract stay useful.
|
|
41
|
+
- The project needs multi-region status roll-up on the public page (per-region component state, per-region incident notices). Out of scope at v1.0.0; a future `multi-region-status` blueprint composes alongside this one, or a project supersedes ADR-803 with a project-level ADR extending the component vocabulary to include region.
|
|
42
|
+
|
|
43
|
+
The design brief `w-2026-07-28-029` originally scoped observability as one of the five stock blueprint categories for the ergonomics ship gate. The observability-essentials blueprint at v1.0.0 does not include metrics export or distributed tracing because both are separate decision areas with their own contract surfaces (metrics-export names the wire format for a scrape or push; tracing names the propagation and sampling policy); folding them into one blueprint would produce a package with four global topics that a project has to resolve piecewise. Shipping the two-endpoint HTTP contract plus the public status page plus the notification outcome sink is the shape that fits the mechanism today; a future `metrics-export` blueprint plus a future `tracing` blueprint is the natural evolution.
|
|
44
|
+
|
|
45
|
+
## What a good outcome looks like
|
|
46
|
+
|
|
47
|
+
A project applies the observability-essentials blueprint on a fresh tree, declares its readiness dependency set (payments-provider, primary-store, sms-gateway) in configuration, declares its public component list (Payments, Notifications, Data) in configuration, wires TAC-801 through TAC-804 into project-authored FBSes, and lands on a deployed application where:
|
|
48
|
+
|
|
49
|
+
- The orchestrator hits /healthz on the request-traffic listener every N seconds; every hit gets 200 with the JSON body inside a millisecond budget; a stuck process is restarted within N seconds of wedging.
|
|
50
|
+
- The load balancer hits /readyz on the request-traffic listener every N seconds; a healthy replica gets 200 and stays in rotation, a replica whose declared payments-provider dependency has gone offline gets 503 and is pulled from rotation without restart. The replica comes back to rotation when the dependency's cached state returns to pass.
|
|
51
|
+
- An external customer visits /status without a login, sees the three declared components (Payments: operational, Notifications: degraded, Data: operational) with the current state enum values as data attributes, sees the active incident notice above the component list with its title, body, severity, startedAt and componentIds fields, and does not see any hostname, replica id, database identifier, queue name, internal URL, build hash, request count, latency number, error rate, queue depth, or readiness dependency name anywhere on the page.
|
|
52
|
+
- Every notification the application attempts records exactly one outcome record on the durable sink with the notificationId, channel, recipient, outcome, attemptedAt, and (on failure) errorCode fields; the operator queries the sink by recipient identifier and time window and gets the outcome records that match; a recipient with no attempts in the window returns an empty result set.
|
|
53
|
+
- A downstream partial outage (a payments-provider that has gone slow) turns the readiness cached state for that dependency to fail; readiness probes return 503 within the readiness evaluation budget; liveness probes continue to return 200 within the tighter liveness budget; the load balancer pulls the affected replicas from rotation; the orchestrator does not restart them; the payments-provider recovers, the background evaluator refreshes the cached state to pass, readiness returns 200, and the replicas re-enter rotation without human intervention.
|
|
54
|
+
|
|
55
|
+
## Operator decisions that remain open after apply
|
|
56
|
+
|
|
57
|
+
- The liveness path, the readiness path, and the status page path defaults are /healthz, /readyz, and /status; the project overrides them at boot for compliance with a particular orchestrator convention or platform mandate.
|
|
58
|
+
- The readiness dependency set (which downstream deps a failure of makes this replica unfit to serve). Blueprint owns the strict-any-fail semantics and the declaration shape; project owns the concrete dep list.
|
|
59
|
+
- The public component list on the status page (name and order). Blueprint owns the vocabulary shape and the state enum; project owns the components themselves and the mapping from internal dep state to public component state.
|
|
60
|
+
- The active incident notice authoring workflow (how the operator posts a notice, where the notice store lives, who has permission to post). Blueprint owns the notice field set and the render contract; project owns the write path.
|
|
61
|
+
- The background dep-health evaluator cadence and per-dep evaluation budget. Blueprint owns the pattern (cached state, background evaluator, per-dep budget); project owns the concrete cadence and per-dep budget values.
|
|
62
|
+
- The notification outcome sink substrate (composing with persistence: a facade verb on that store; standalone: a project-authored durable writer). Blueprint owns the record shape and the enums; project owns the substrate.
|
|
63
|
+
- The auth-exempt list (the three paths the blueprint declares; the project decides whether any additional paths should be exempt or whether the exempt list should be stricter).
|
|
64
|
+
- Whether to publish the readiness probe path (and its body) to third-party monitoring integrations. Blueprint owns the body shape stability guarantee; project owns the publish decision.
|
|
65
|
+
|
|
66
|
+
## Cost-honesty paragraph
|
|
67
|
+
|
|
68
|
+
Shipping this doc set costs the project the following. Every request path pays two probe endpoints on the same listener as request traffic; both handlers are trivial but still consume a small share of the router's dispatch cost. The background dep-health evaluator runs on its own cadence for the process lifetime; a project with N declared dependencies pays N per-dep evaluations per cadence, and each evaluation is a project-authored function that can spend as much time as it likes inside its own budget. The public status page is a first-class HTTP surface the project owns forever: renaming a declared component is a public-contract change; adding a new component is a public-contract change; the fixed state enum and fixed notice severity enum are commitments. The notification outcome sink adds a durable write per notification attempt; a project that sends millions of notifications a day pays proportionately, and the durable substrate has to handle the write rate. The three auth-exempt paths are a security invariant the project maintains across every auth middleware refactor. In return, the project gets: a restart signal decoupled from downstream health, a rotation signal that names which dep failed, a public surface that answers 'is this up' without human involvement, and an answer to 'did the customer get the notification' that is a query not an escalation.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Observability probe endpoints blueprint (v1.0.0)
|
|
2
|
+
|
|
3
|
+
The tenth content blueprint on the rcf-build-lite blueprint mechanism, and the second in the `observability` category, sibling to the shipped `observability-essentials`. Scope: a health probe interface derived from an operator-declared target integration profile (`kubernetes`, `loadBalancer`, `uptimeMonitor`, `systemd`, `dockerHealthcheck`, `reverseProxy`, plus a `custom:<name>` slot). Each profile fixes the probe transport, path or command surface, response contract, and semantic distinction between liveness and readiness for the supervisor at hand. Kubernetes is the shipped default (HTTPGet `/live` and `/ready` on the request-traffic listener); every HTTP profile ships with a `probeListener.separatePort` opt-in for probe-traffic isolation from user traffic. Response contracts are minimal by construction; the profile validator refuses any override that would add a field beyond the enumerated set. Targeted at rcf-lite projects that must integrate with a specific EXTERNAL supervising system whose conventions drive the probe wire shape; not targeted at the self-supervised all-in-one observability case (observability-essentials owns that).
|
|
4
|
+
|
|
5
|
+
## Apply
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
rcf define blueprint add <path-to>/blueprints/observability-probe-endpoints
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Phase 1 resolves local path sources only; registry and git-ref resolution is a mechanism follow-up. Apply is idempotent; `rcf define blueprint list` shows the applied entry grouped under the `observability` category; `rcf define blueprint remove observability-probe-endpoints` cleanly removes an unreferenced application.
|
|
12
|
+
|
|
13
|
+
## Anatomy
|
|
14
|
+
|
|
15
|
+
| Piece | Where | What |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| Metadata | `blueprint.json` | Slug, version, category `observability`, and the 25 contributions with scope/topic on the two global ADRs |
|
|
18
|
+
| Doc set | `contributions/` | 8 REQs, 8 USs (24 ACs), 4 TACs, 5 ADRs, all schema-valid and namespaced (`observability-probe-endpoints-REQ-001` prefix family; `ADR-1501-observability-probe-endpoints-health-probes` suffix family) |
|
|
19
|
+
| Kubernetes probe sample | `assets/kubernetes/podspec-probes.md` | The exact `livenessProbe` and `readinessProbe` fragments for a Kubernetes podspec that consumes the shipped default HTTPGet `/live` and `/ready` surface, with placeholder container name and port |
|
|
20
|
+
| Kubernetes separate-port sample | `assets/kubernetes/podspec-probes-separate-port.md` | The podspec fragment for the separate-port topology with a dedicated `containerPort` for probes that is not published on the `Service` |
|
|
21
|
+
| Load-balancer health-check sample | `assets/load-balancer/health-check-config.md` | A vendor-neutral load-balancer target-group health-check configuration illustrating the single-endpoint `/health` GET with status-code-only response |
|
|
22
|
+
| systemd unit sample | `assets/systemd/notify-service.md` | A `Type=notify` systemd unit fragment illustrating the `sd_notify(READY=1)` and `WATCHDOG=1` posture |
|
|
23
|
+
| Docker HEALTHCHECK sample | `assets/docker/dockerfile-healthcheck.md` | A Dockerfile fragment with `HEALTHCHECK CMD` invoking the profile's exec-transport entry point |
|
|
24
|
+
| Uptime monitor URL sample | `assets/uptime-monitor/monitor-config.md` | A vendor-neutral uptime-monitor configuration example for the single-URL check pattern |
|
|
25
|
+
| Guide | `guide/observability-probe-endpoints.md` | Operator-facing: when to use it, when not, boundary with observability-essentials, what stays your call, promotion signals |
|
|
26
|
+
| Coordination vocabulary | `docs/topics.md` | The two global-topic strings this blueprint contributes and the shared id band registry (twelve shipped or in-flight blueprints including this one) |
|
|
27
|
+
|
|
28
|
+
The doc set is contributions (copied into the project tree by `rcf define blueprint add`); the guide, assets, and docs are package-resident references. Guide rendering into `rcf/knowledge/docs/blueprint-guides/` and asset ingestion are mechanism follow-ups; until they land, the working agent reads them from the applied blueprint's source path recorded in `manifest.blueprints[].source`.
|
|
29
|
+
|
|
30
|
+
## What it contributes, and what it deliberately does not
|
|
31
|
+
|
|
32
|
+
Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (ratified decision 5) and no code.
|
|
33
|
+
|
|
34
|
+
No FBS contributions, as a matter of principle (ratified policy 2026-08-19): FBSs are the work of the implementing agent, not the blueprint; project constraints have to be applied at the time of creation. The blueprint contributes the WHAT (the elicitation surface, the six shipped profile contracts, the two-listener topology option, the auth-exempt-list emission, the response-contract secrecy rule, the profile-swap-is-config invariant); the implementing agent derives the HOW-tasks (FBS) in the host project, where the ACs contributed here get picked up by the project's own build sequencing.
|
|
35
|
+
|
|
36
|
+
Deliberately not contributed: a public status page (observability-essentials owns `statusPageContract` for that audience); a notification outcome sink (observability-essentials owns that); an authenticated operator dashboard for granular internal state (project-authored on top of the readiness predicate); a metrics-export surface (a future `metrics-export` blueprint composes alongside); a distributed-tracing surface (a future `tracing` blueprint composes alongside); a log-shipping surface (application-api-rest's `logging` topic governs the wire-log shape of the HTTP tier); the readiness predicate implementation itself (project-authored; the blueprint fixes the boundary and each profile's default aggregation rule, not the per-dependency check code); the auth middleware installer (project-authored; the blueprint emits an exact-match exempt list the installer consumes); the vendor-CLI or client-library binding for any supervisor beyond the profile contract (project-authored inside a `custom:<name>` profile).
|
|
37
|
+
|
|
38
|
+
## The two global decisions
|
|
39
|
+
|
|
40
|
+
ADR-1501-observability-probe-endpoints-health-probes ships `scope: global` on topic `healthProbes`. This is the project's health probe interface: elicited from the target integration profile, materialised by the profile-resolver into a frozen object that drives every downstream binding. A composing blueprint that holds a different opinion on the health probe interface (observability-essentials's self-supervised two-endpoint HTTP JSON floor is the shipped example; a future metrics-probe hybrid or a health-protocol variant would compose here too) conflicts by design.
|
|
41
|
+
|
|
42
|
+
ADR-1502-observability-probe-endpoints-readiness-semantics ships `scope: global` on topic `readinessSemantics`. This is the project's readiness aggregation and cadence: elicited per profile so the shape and the flip window follow what the supervising system reads. A composing blueprint that holds a different opinion on readiness semantics (observability-essentials's strict-any-fail-over-declared-deps as the ONE project-wide rule is the shipped example) conflicts by design.
|
|
43
|
+
|
|
44
|
+
Both ADRs conflict with observability-essentials on the same two topic strings on purpose. See `docs/topics.md` for the exact strings, the four documented resolution paths per conflict, the boundary with observability-essentials's `statusPageContract` (which this blueprint does not touch), and the AC id band allocation (observability-probe-endpoints owns 14101-14899, ADR/TAC suffix block 15xx).
|
|
45
|
+
|
|
46
|
+
## Quality bar
|
|
47
|
+
|
|
48
|
+
The probe surface always follows the operator-declared target integration profile; a missing or unrecognised declaration refuses boot with a stable-coded error naming the field. The Kubernetes profile is the shipped default; a bare apply exhibits HTTPGet `/live` and `/ready` on the request-traffic listener with the `{"status":"pass"|"fail"}` body shape and no operator configuration. Each of the six shipped profiles resolves to a config object whose transport, path (or command/notify equivalent), response contract, and semantic model are all present; a partial profile is refused at boot. Every HTTP profile carries a `probeListener.separatePort` opt-in; when set, probe handlers bind to a dedicated listener that serves only the resolved probe path set and no other routes; when unset, probe handlers bind to the user-traffic listener. Response contracts are minimal by construction: HTTP profiles that consume status-only carry content-length zero on every response; HTTP profiles that consume a body emit exactly the enumerated field set (`{"status":"pass"|"fail"}` for Kubernetes and nothing more); the profile validator refuses any override that would add a field beyond the enumerated set. No dependency name, environment name, hostname, replica id, build hash, or commit sha ever appears on any external-visible probe response. The auth-exempt list emitted by the topology component is exact-match scoped to the resolved probe path set on the resolved listener; a wildcard or prefix matcher is refused. Switching profiles is a configuration change; the source tree carries no per-profile conditional outside the profile modules and the profile-resolver. Every bar is carried by ACs in the doc set, not by this README.
|
|
49
|
+
|
|
50
|
+
## Known mechanism-reach gaps
|
|
51
|
+
|
|
52
|
+
- **Custom-profile contract adherence.** Projects that author a `custom:<name>` profile against the profile contract are expected to satisfy the same transport/paths/responseContract/semanticModel shape the shipped profiles do; the profile contract validator (TAC-1501) refuses a partial profile at boot, which is where the mechanism reach lands. What the validator cannot compel is that a project-authored custom profile's response shape is minimal in the AC-14105 and AC-14106 sense (a custom profile could in principle enumerate a rich field set the validator would accept as complete). Recorded here rather than smuggled in as an AC that would only apply to the shipped profiles. Promotion signal: a `custom-profile-shape-lint` addition to the profile contract validator that enforces the minimalism rule per field-set-size heuristic (harder than it sounds; some legitimate custom profiles do have wider fields); or a project-side grep gate. Project-side workaround until then: reviewers of a `custom:<name>` profile eyeball the enumerated field set against the pattern the shipped six carry.
|
|
53
|
+
- **Kubernetes gRPC probe transport.** The `kubernetes` profile ships HTTPGet and TCPSocket transports (via TAC-1504's tcpAdapter selection) but not gRPC. A project on a gRPC-only mesh that wants the standard gRPC health protocol supersedes ADR-1503 with a project-level ADR selecting the gRPC transport, or authors a `custom:kubernetes-grpc` profile. Promotion signal: a shipped gRPC-transport handler in a v1.1 pass if enough rcf-lite projects reach for it. Project-side workaround: the `custom:<name>` slot is the mechanism escape hatch.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Docker HEALTHCHECK
|
|
2
|
+
|
|
3
|
+
Reference for a Dockerfile fragment consuming the `dockerHealthcheck` profile's exec transport. The `HEALTHCHECK CMD` invokes the entry point the profile exposes; the exit code IS the probe answer.
|
|
4
|
+
|
|
5
|
+
```dockerfile
|
|
6
|
+
# ... application build stages omitted ...
|
|
7
|
+
|
|
8
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
9
|
+
CMD /usr/local/bin/<service-binary> --healthcheck || exit 1
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Notes.
|
|
13
|
+
|
|
14
|
+
- The `--healthcheck` flag on the service binary is the profile's exec entry point (TAC-1504's `execAdapter` exposes `runHealthcheck`); it reads the readiness predicate and exits 0 on pass, non-zero on fail.
|
|
15
|
+
- `--interval`, `--timeout`, `--start-period`, `--retries` are Docker HEALTHCHECK defaults; tune per the container orchestrator's expectations.
|
|
16
|
+
- `docker inspect` and Docker Compose's `depends_on: condition: service_healthy` consume the resulting health status.
|
|
17
|
+
- No HTTP probe listener is opened by the process when the `dockerHealthcheck` profile is selected (AC-14105-3).
|
|
18
|
+
|
|
19
|
+
Reference: docs.docker.com/reference/dockerfile/#healthcheck for the HEALTHCHECK instruction reference.
|
package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Kubernetes probe podspec (separate-port topology)
|
|
2
|
+
|
|
3
|
+
Reference fragment for a Kubernetes podspec that consumes the `kubernetes` profile with `probeListener.separatePort: 9091`: probes bind to a dedicated container port that is NOT published on the `Service`; only the traffic port is public. The kubelet reaches the probe port on the pod network.
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
containers:
|
|
7
|
+
- name: <container-name>
|
|
8
|
+
image: <image-ref>
|
|
9
|
+
ports:
|
|
10
|
+
- name: http
|
|
11
|
+
containerPort: 8080
|
|
12
|
+
- name: probe
|
|
13
|
+
containerPort: 9091
|
|
14
|
+
livenessProbe:
|
|
15
|
+
httpGet:
|
|
16
|
+
path: /live
|
|
17
|
+
port: probe
|
|
18
|
+
initialDelaySeconds: 5
|
|
19
|
+
periodSeconds: 10
|
|
20
|
+
timeoutSeconds: 1
|
|
21
|
+
failureThreshold: 3
|
|
22
|
+
readinessProbe:
|
|
23
|
+
httpGet:
|
|
24
|
+
path: /ready
|
|
25
|
+
port: probe
|
|
26
|
+
initialDelaySeconds: 2
|
|
27
|
+
periodSeconds: 5
|
|
28
|
+
timeoutSeconds: 1
|
|
29
|
+
failureThreshold: 3
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
And the matching `Service` that publishes only the traffic port:
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
apiVersion: v1
|
|
36
|
+
kind: Service
|
|
37
|
+
metadata:
|
|
38
|
+
name: <service-name>
|
|
39
|
+
spec:
|
|
40
|
+
selector:
|
|
41
|
+
app: <selector-label>
|
|
42
|
+
ports:
|
|
43
|
+
- name: http
|
|
44
|
+
port: 80
|
|
45
|
+
targetPort: http
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Notes.
|
|
49
|
+
|
|
50
|
+
- The probe port (`9091` here) appears on the pod but not on the `Service`; the probe surface is reachable to the kubelet on the pod network and not from cluster consumers of the `Service`.
|
|
51
|
+
- The separate probe listener binds only the profile's resolved probe path set; any other path on port 9091 returns not-found (AC-14104-2).
|
|
52
|
+
- Reachability equivalence between probes and user traffic is traded for probe-traffic isolation; the fused topology is the default and matches observability-essentials's posture for the case where the trade goes the other way.
|
|
53
|
+
|
|
54
|
+
Reference: kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes for probe field references and the pattern of using a distinct container port for probes.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Kubernetes probe podspec (fused topology default)
|
|
2
|
+
|
|
3
|
+
Reference fragment for a Kubernetes podspec that consumes the shipped `kubernetes` profile default: HTTPGet `/live` and `/ready` on the container's request-traffic port. The port name below assumes the container publishes its user-traffic listener on a named port `http`; substitute the project's chosen name.
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
containers:
|
|
7
|
+
- name: <container-name>
|
|
8
|
+
image: <image-ref>
|
|
9
|
+
ports:
|
|
10
|
+
- name: http
|
|
11
|
+
containerPort: 8080
|
|
12
|
+
livenessProbe:
|
|
13
|
+
httpGet:
|
|
14
|
+
path: /live
|
|
15
|
+
port: http
|
|
16
|
+
initialDelaySeconds: 5
|
|
17
|
+
periodSeconds: 10
|
|
18
|
+
timeoutSeconds: 1
|
|
19
|
+
failureThreshold: 3
|
|
20
|
+
readinessProbe:
|
|
21
|
+
httpGet:
|
|
22
|
+
path: /ready
|
|
23
|
+
port: http
|
|
24
|
+
initialDelaySeconds: 2
|
|
25
|
+
periodSeconds: 5
|
|
26
|
+
timeoutSeconds: 1
|
|
27
|
+
failureThreshold: 3
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Notes.
|
|
31
|
+
|
|
32
|
+
- The paths `/live` and `/ready` match the shipped `kubernetes` profile default. Override in the profile with `probeInterface.options.kubernetes.paths.{liveness,readiness}` and adjust these fragments to match.
|
|
33
|
+
- `initialDelaySeconds`, `periodSeconds`, `timeoutSeconds`, and `failureThreshold` are project defaults; tune per the supervising cluster's expectations.
|
|
34
|
+
- The response contract is `{"status":"pass"}` on pass and `{"status":"fail"}` on fail with status codes 200 and 503; the kubelet reads only the status code. The body is present for operator triage under `kubectl describe pod` and equivalent introspection paths, and stays minimal by construction (ADR-1505).
|
|
35
|
+
|
|
36
|
+
Reference: kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes for the probe reference; kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#httpgetaction-v1-core for the HTTPGetAction field reference.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Load balancer health check configuration
|
|
2
|
+
|
|
3
|
+
Reference for a vendor-neutral load-balancer target-group health check consuming the `loadBalancer` profile's single HTTP GET at `/health` with status-code-only response. Field names below reflect the shape most application-load-balancer products expose; substitute the exact field names of the vendor at hand.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
protocol: HTTP
|
|
7
|
+
port: <traffic-port>
|
|
8
|
+
path: /health
|
|
9
|
+
matcher: 200
|
|
10
|
+
interval: 15 seconds
|
|
11
|
+
timeout: 5 seconds
|
|
12
|
+
healthyThreshold: 2
|
|
13
|
+
unhealthyThreshold: 2
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Notes.
|
|
17
|
+
|
|
18
|
+
- The `path` `/health` matches the shipped `loadBalancer` profile default. Override with `probeInterface.options.loadBalancer.path`.
|
|
19
|
+
- The `matcher: 200` reflects the profile's response contract: pass is status code 200 with content-length zero; fail is status code 503 with content-length zero. The LB reads only the status code.
|
|
20
|
+
- `interval`, `timeout`, `healthyThreshold`, `unhealthyThreshold` are common defaults; tune per the LB's expectations and the readiness evaluator cadence the project chose (a shorter LB interval than the evaluator cadence sees stale answers; a longer LB interval flips slower than the underlying state).
|
|
21
|
+
- The response body is empty. A body-inspecting matcher against this profile is a project misconfiguration; the profile refuses at boot any override adding a body field (AC-14106-3).
|
|
22
|
+
|
|
23
|
+
Reference: general load-balancer health-check documentation across major vendors is consistent on the single-endpoint status-code-only shape (AWS ELB/ALB target-group health checks, GCP load balancer health checks, Azure Load Balancer health probes, Cloudflare Load Balancer monitors); consult the specific vendor's docs for exact field names.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# systemd Type=notify unit
|
|
2
|
+
|
|
3
|
+
Reference for a systemd unit consuming the `systemd` profile's `sd_notify` transport. The unit sits on `Type=notify` and delegates the ready-and-watchdog protocol to the process itself.
|
|
4
|
+
|
|
5
|
+
```ini
|
|
6
|
+
[Unit]
|
|
7
|
+
Description=<service description>
|
|
8
|
+
After=network-online.target
|
|
9
|
+
Wants=network-online.target
|
|
10
|
+
|
|
11
|
+
[Service]
|
|
12
|
+
Type=notify
|
|
13
|
+
NotifyAccess=main
|
|
14
|
+
ExecStart=/usr/local/bin/<service-binary>
|
|
15
|
+
Restart=on-failure
|
|
16
|
+
WatchdogSec=30s
|
|
17
|
+
TimeoutStartSec=60s
|
|
18
|
+
|
|
19
|
+
[Install]
|
|
20
|
+
WantedBy=multi-user.target
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Notes.
|
|
24
|
+
|
|
25
|
+
- `Type=notify` blocks systemd's start on the process reaching its ready state; the profile's non-HTTP adapter (TAC-1504) emits `sd_notify(READY=1)` after boot to satisfy that.
|
|
26
|
+
- `WatchdogSec=30s` declares the watchdog cadence; the profile's adapter then emits `sd_notify(WATCHDOG=1)` at (at most) that cadence for the process lifetime. A missed cadence causes systemd to terminate and restart the process per the unit's restart policy.
|
|
27
|
+
- `NotifyAccess=main` restricts the notify socket to the main process, matching the profile's single-adapter posture.
|
|
28
|
+
- No HTTP probe listener is opened for a process running only the `systemd` profile (AC-14105-3 for the analogous `dockerHealthcheck` invariant).
|
|
29
|
+
|
|
30
|
+
Reference: freedesktop.org/software/systemd/man/sd_notify.html for the notify protocol; freedesktop.org/software/systemd/man/systemd.service.html for the unit-file field reference.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Uptime monitor configuration
|
|
2
|
+
|
|
3
|
+
Reference for a vendor-neutral uptime-monitor configuration consuming the `uptimeMonitor` profile's single URL check. Uptime monitors probe a public URL from external vantage points and page the operator when the check fails against a threshold. Field names below reflect the shape most uptime-monitor products expose.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
url: https://<public-hostname>/health
|
|
7
|
+
method: GET
|
|
8
|
+
expectedStatus: 200
|
|
9
|
+
interval: 60 seconds
|
|
10
|
+
timeout: 10 seconds
|
|
11
|
+
regions: <one-or-more-vantage-points>
|
|
12
|
+
alertOn: <threshold-of-consecutive-failures>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Notes.
|
|
16
|
+
|
|
17
|
+
- The `url` path `/health` matches the shipped `uptimeMonitor` profile default (same path as `loadBalancer`; the difference sits in the flip cadence per ADR-1502, not in the path). Override with `probeInterface.options.uptimeMonitor.path`.
|
|
18
|
+
- The profile's response contract is status-code-only with content-length zero on every response; the monitor reads only the status code.
|
|
19
|
+
- `interval`, `timeout`, and `alertOn` are usually monitor-side tunables; the profile keeps its readiness evaluator cadence set for a stable answer over the monitor's flap window so a transient dependency blip does not page.
|
|
20
|
+
- Uptime monitors that page on body content are outside this profile's scope; a project on such a monitor authors a `custom:<name>` profile or supersedes ADR-1505.
|
|
21
|
+
|
|
22
|
+
Reference: general uptime-monitor documentation across vendors is consistent on the single-URL status-code-plus-optional-body-string shape (Pingdom, UptimeRobot, BetterStack, Datadog Synthetics, StatusCake); consult the specific vendor's docs for exact field names.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "observability-probe-endpoints",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"category": "observability",
|
|
5
|
+
"contributions": [
|
|
6
|
+
{ "id": "observability-probe-endpoints-REQ-001", "kind": "req", "path": "requirements/observability-probe-endpoints-req-001.json" },
|
|
7
|
+
{ "id": "observability-probe-endpoints-REQ-002", "kind": "req", "path": "requirements/observability-probe-endpoints-req-002.json" },
|
|
8
|
+
{ "id": "observability-probe-endpoints-REQ-003", "kind": "req", "path": "requirements/observability-probe-endpoints-req-003.json" },
|
|
9
|
+
{ "id": "observability-probe-endpoints-REQ-004", "kind": "req", "path": "requirements/observability-probe-endpoints-req-004.json" },
|
|
10
|
+
{ "id": "observability-probe-endpoints-REQ-005", "kind": "req", "path": "requirements/observability-probe-endpoints-req-005.json" },
|
|
11
|
+
{ "id": "observability-probe-endpoints-REQ-006", "kind": "req", "path": "requirements/observability-probe-endpoints-req-006.json" },
|
|
12
|
+
{ "id": "observability-probe-endpoints-REQ-007", "kind": "req", "path": "requirements/observability-probe-endpoints-req-007.json" },
|
|
13
|
+
{ "id": "observability-probe-endpoints-REQ-008", "kind": "req", "path": "requirements/observability-probe-endpoints-req-008.json" },
|
|
14
|
+
{ "id": "observability-probe-endpoints-US-14101", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14101.json" },
|
|
15
|
+
{ "id": "observability-probe-endpoints-US-14102", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14102.json" },
|
|
16
|
+
{ "id": "observability-probe-endpoints-US-14103", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14103.json" },
|
|
17
|
+
{ "id": "observability-probe-endpoints-US-14104", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14104.json" },
|
|
18
|
+
{ "id": "observability-probe-endpoints-US-14105", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14105.json" },
|
|
19
|
+
{ "id": "observability-probe-endpoints-US-14106", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14106.json" },
|
|
20
|
+
{ "id": "observability-probe-endpoints-US-14107", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14107.json" },
|
|
21
|
+
{ "id": "observability-probe-endpoints-US-14108", "kind": "us", "path": "user-stories/observability-probe-endpoints-us-14108.json" },
|
|
22
|
+
{ "id": "TAC-1501-observability-probe-endpoints-profile-resolver", "kind": "tac", "path": "tacs/tac-1501-observability-probe-endpoints-profile-resolver.json" },
|
|
23
|
+
{ "id": "TAC-1502-observability-probe-endpoints-handler-set", "kind": "tac", "path": "tacs/tac-1502-observability-probe-endpoints-handler-set.json" },
|
|
24
|
+
{ "id": "TAC-1503-observability-probe-endpoints-listener-topology", "kind": "tac", "path": "tacs/tac-1503-observability-probe-endpoints-listener-topology.json" },
|
|
25
|
+
{ "id": "TAC-1504-observability-probe-endpoints-non-http-adapters", "kind": "tac", "path": "tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json" },
|
|
26
|
+
{
|
|
27
|
+
"id": "ADR-1501-observability-probe-endpoints-health-probes",
|
|
28
|
+
"kind": "adr",
|
|
29
|
+
"path": "adrs/adr-1501-observability-probe-endpoints-health-probes.json",
|
|
30
|
+
"scope": "global",
|
|
31
|
+
"topic": "healthProbes"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "ADR-1502-observability-probe-endpoints-readiness-semantics",
|
|
35
|
+
"kind": "adr",
|
|
36
|
+
"path": "adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json",
|
|
37
|
+
"scope": "global",
|
|
38
|
+
"topic": "readinessSemantics"
|
|
39
|
+
},
|
|
40
|
+
{ "id": "ADR-1503-observability-probe-endpoints-kubernetes-default", "kind": "adr", "path": "adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json" },
|
|
41
|
+
{ "id": "ADR-1504-observability-probe-endpoints-separate-port-option", "kind": "adr", "path": "adrs/adr-1504-observability-probe-endpoints-separate-port-option.json" },
|
|
42
|
+
{ "id": "ADR-1505-observability-probe-endpoints-external-response-secrecy", "kind": "adr", "path": "adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json" }
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1501-observability-probe-endpoints-health-probes",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "The health probe interface is elicited from the operator-declared target integration profile; the probe transport, path, response contract, and semantics fall out of that one declaration",
|
|
8
|
+
"context": "External supervisors probing a service each carry their own conventions for what a probe looks like and what the answer means. A Kubernetes kubelet expects an HTTPGet, TCPSocket, Exec, or gRPC probe of a specific shape at a container-declared path or port, and reads a two-probe split (liveness vs readiness) as a first-class model. An application load balancer expects one HTTP GET with the answer in the status code and no body semantics beyond that. An uptime monitor expects a URL that returns 200 or 5xx. A systemd unit under `Type=notify` blocks on `sd_notify(READY=1)` and then watches for periodic `WATCHDOG=1` notifications, not synchronous probes. A Docker HEALTHCHECK is an exec command whose exit code is the answer. A service that ships one fixed probe shape is correct for one supervisor and wrong for the others; a service that ships adapter shims per deployment context adds surface area everywhere and never quite matches any convention. The observability-essentials sibling blueprint holds a legitimate different opinion for the case where the service designs its own observability floor without a specific external supervisor's conventions in view: two HTTP JSON probes on the request-traffic listener with a stable body shape, fine when the service is its own supervisor's audience. This blueprint targets the other case: the supervisor's conventions come first and the service materialises the probe surface for them.",
|
|
9
|
+
"decision": "The health probe interface is derived from an operator-declared target integration profile. The blueprint ships six profiles: `kubernetes`, `loadBalancer`, `uptimeMonitor`, `systemd`, `dockerHealthcheck`, `reverseProxy`, plus a `custom:<name>` slot for project-authored profiles. Each profile fixes the probe transport (HTTP GET, TCP socket accept, exec command, supervisor notify), the probe path or command surface, the response contract (status code only, minimal JSON body of the shape `{\"status\":\"pass\"|\"fail\"}`, exit code, notify call sequence, or connect-and-close), and the semantic distinction between liveness and readiness (two-endpoint for Kubernetes, single-signal for load balancers and uptime monitors, notify-plus-watchdog for systemd, one-command for Docker HEALTHCHECK). The Kubernetes profile is the shipped default (see ADR-1503). Every HTTP profile carries a `probeListener.separatePort` option for probe traffic isolation (see ADR-1504). The profile object drives every wiring choice; nothing in the process reaches for a probe transport, path, or response outside the profile.",
|
|
10
|
+
"consequences": "The probe surface always matches the supervisor conventions the service actually runs under, and a change of supervising system is a configuration change (see REQ-008 and US-14108). Composing this blueprint with the observability-essentials sibling on the same project fires a `healthProbes` global-topic conflict on purpose, because the two blueprints answer different questions about what the probes are for: essentials commits to a self-supervised HTTP JSON contract on the request-traffic listener as the project-wide floor; this blueprint commits to an elicit-and-adapt model whose shape follows the external supervisor. The expected resolution is one project-level ADR that either (a) accepts this blueprint's elicit-and-adapt model when the service must integrate with a specific external supervisor's conventions, (b) accepts observability-essentials's self-supervised fused model when the project designs its own probes without a specific external supervisor's conventions in view, or (c) authors a project-specific hybrid that names both surfaces (e.g., an internal essentials-shaped surface for one audience and a profile-shaped external surface for the supervising system) with explicit boundaries.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Fold the elicit-and-adapt shape into observability-essentials as a v2 addition",
|
|
14
|
+
"summary": "Extend observability-essentials's ADR-801 to accept a profile-name parameter and let the essentials blueprint carry both the self-supervised default and the external-integration variants inside one contribution set.",
|
|
15
|
+
"reasonNotChosen": "The essentials blueprint's identity is the all-in-one basic observability floor (probes plus public status page plus notification outcome sink); merging the elicit-and-adapt shape into it either dilutes that identity or forces the essentials all-in-one bundle onto projects that only wanted the external-integration probe surface. Keeping the two blueprints on separate rows honours the boundary the round-2 canon named and lets each carry the right defaults for its audience."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Ship one blueprint per external supervisor",
|
|
19
|
+
"summary": "Author `observability-probes-kubernetes`, `observability-probes-load-balancer`, `observability-probes-uptime-monitor`, `observability-probes-systemd`, `observability-probes-docker-healthcheck` as five distinct blueprints, one per supervisor family.",
|
|
20
|
+
"reasonNotChosen": "The elicitation surface is small and the profile contract is shared across supervisors; splitting into five blueprints multiplies the maintenance load (five README, five topics.md, five id band allocations, five conflict rows against observability-essentials) without giving the operator anything they cannot express by naming the profile at boot. The single-blueprint form also lets a project that legitimately runs under two supervisors (a Kubernetes deployment fronted by a load balancer whose LB health check hits a different path than the kubelet probes) declare a custom profile that composes the two shapes with one apply."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Kubernetes-only blueprint",
|
|
24
|
+
"summary": "Ship `observability-probes-kubernetes` alone and leave the other supervisors to project-side work or future blueprints.",
|
|
25
|
+
"reasonNotChosen": "The round-2 canon explicitly named the identity as `observability-probe-endpoints` (probe endpoints elicited per deployment type; k8s /live /ready default; separate-port/separate-server option), not `observability-probes-kubernetes`. The elicitation is the point; the Kubernetes default is one honoured convention among several the same profile-contract shape covers cleanly."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
29
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1502-observability-probe-endpoints-readiness-semantics",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Readiness semantics are declared per target integration profile; the aggregation rule and the meaning of 'not ready' belong to the operator's mapping onto the supervising system's interpretation",
|
|
8
|
+
"context": "Readiness answers a question the supervising system will act on. Kubernetes pulls a pod out of the Service endpoint list; a load balancer stops routing new requests to a target; an uptime monitor pages an operator; a Docker HEALTHCHECK failure marks the container unhealthy for other services to react to. What 'not ready' means, how per-dependency states aggregate into the answer, and how quickly the answer needs to flip are shaped by which supervisor is doing the interpretation. The observability-essentials sibling blueprint fixes one legitimate answer as the project-wide rule: strict-any-fail over an explicit boot-time-declared dependency set, evaluated against per-dependency cached state maintained by a background evaluator on its own cadence. That is a sensible default when the project owns readiness end-to-end and wants a single reviewable declaration. It is not the right default when the supervising system's interpretation drives the semantics: a load balancer that will pull the target aggressively wants a different aggregation from a kubelet that will only skip the pod for the next request-routing pass; an uptime monitor's threshold-based paging logic wants a different flip cadence from a synchronous supervisor's per-hit answer.",
|
|
9
|
+
"decision": "Readiness semantics are declared per target integration profile. The blueprint fixes the SHAPE of the readiness predicate contract (a synchronous function `() -> 'pass' | 'fail'` that reads state a project-supplied evaluator maintains on its own cadence and is called from the resolved probe handler) but each profile carries its own default for the aggregation rule and the evaluator cadence. Kubernetes profile default: strict-any-fail over the operator-declared dependency set, cached at the evaluator cadence (aligned with the Kubernetes community convention documented at kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes). Load balancer profile default: strict-any-fail with a tighter evaluator cadence so the LB observes the flip within its own health-check interval budget. Uptime monitor profile: the same predicate wired to a longer effective flip window because the monitor's threshold-based paging usually wants a stable answer rather than a per-hit flap. systemd profile: readiness is announced once via `sd_notify(READY=1)` and then the process holds ready state until watchdog cadence catches a wedge. Docker HEALTHCHECK: one exit-code answer per invocation, with the aggregation rule the profile default carries. Each profile documents its aggregation choice; a project supersedes at the profile-options layer without touching the readiness predicate contract.",
|
|
10
|
+
"consequences": "Composing this blueprint with observability-essentials on the same project fires a `readinessSemantics` global-topic conflict on purpose, because the two blueprints answer different questions. Essentials commits to strict-any-fail-over-declared-deps as the ONE project-wide semantics. This blueprint commits to per-profile semantics where the aggregation choice belongs to the operator's mapping onto the supervising system's interpretation. The expected resolution is one project-level ADR that either (a) commits to the fused observability-essentials rule when the project owns readiness end-to-end with a single supervisor, (b) commits to the elicit-per-profile rule when the readiness meaning is shaped by the specific supervising system, or (c) authors a project-specific hybrid where different surfaces answer to different semantics with explicit boundaries.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Adopt the observability-essentials strict-any-fail rule wholesale",
|
|
14
|
+
"summary": "Fix the readiness aggregation across every profile to strict-any-fail over the declared dependency set, matching the essentials sibling.",
|
|
15
|
+
"reasonNotChosen": "Collapses the reason this blueprint exists. The point of the elicit-and-adapt identity is that different supervisors read readiness differently; forcing one aggregation across every profile hides that difference from the operator and re-invents the problem observability-essentials's fused rule was correctly optimising for a narrower case."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Leave readiness entirely to project code",
|
|
19
|
+
"summary": "Ship only the predicate-interface boundary and refuse to name defaults per profile.",
|
|
20
|
+
"reasonNotChosen": "Would produce a blueprint that specifies interfaces without helping operators reach a working state; the round-2 identity is 'a service correctly probeable by the external system that supervises it', not 'a service that documents its own interface and expects the operator to bring the semantics'. Naming per-profile defaults is where the blueprint earns its keep."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Synchronous per-probe evaluation with no cached-state pattern",
|
|
24
|
+
"summary": "Every probe hit evaluates every declared dependency with a real network call from inside the probe handler.",
|
|
25
|
+
"reasonNotChosen": "Turns downstream latency into probe latency; a slow dependency causes the supervisor to time out the probe for reasons unrelated to whether the service could actually serve traffic. The cached-state pattern (the predicate reads state a background evaluator maintains) is a fundamental of the profile contract for that reason; every profile ships with it."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
29
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1503-observability-probe-endpoints-kubernetes-default",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Kubernetes is the shipped default target integration profile; HTTPGet /live and /ready on the request-traffic listener are its defaults",
|
|
8
|
+
"context": "One of the shipped profiles has to be the default the process falls back on when the operator does not declare `probeInterface.profile` explicitly. The choice matters because the default is what a project on the shipped configuration exhibits before the operator has spent any time on the observability surface, and because the default shapes the reader's expectation of what the blueprint 'is about'. The round-2 canon selected Kubernetes as the default: `probe endpoints elicited per deployment type; k8s /live + /ready default; separate-port/separate-server option`.",
|
|
9
|
+
"decision": "The `kubernetes` profile is the shipped default. When the operator does not declare `probeInterface.profile`, the resolver falls back to `kubernetes` with the default paths `/live` (liveness) and `/ready` (readiness), the default `httpGet` transport, the response contract `{\"status\":\"pass\"|\"fail\"}`, the fused listener topology (probes on the user-traffic listener), and the `strict-any-fail-over-declared-deps` readiness aggregation. The paths and the readiness aggregation are overridable at boot via `probeInterface.options.kubernetes.paths` and `probeInterface.options.kubernetes.readinessRule`. The default hits without operator configuration; overriding is a small config change on the same shape.",
|
|
10
|
+
"consequences": "A project that applies this blueprint and nothing else immediately exhibits a Kubernetes-shaped probe surface at `/live` and `/ready`; the standard `livenessProbe` and `readinessProbe` of shape `httpGet: { path: /live, port: <containerPort> }` and `httpGet: { path: /ready, port: <containerPort> }` in a Kubernetes podspec work without further wiring. The default is scope-local because it is a preference not a contract: the ADR-1501 elicitation model is the global commitment and the Kubernetes profile is one instantiation of it. A project on Docker Compose or on a bare-metal load-balancer setup that runs the shipped default sees `/live` and `/ready` bound instead of `/health` and reads the disagreement as the signal to declare `probeInterface.profile: loadBalancer` at boot.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Load-balancer profile as the default",
|
|
14
|
+
"summary": "Ship `loadBalancer` as the default so an unconfigured process answers a single `/health` HTTP GET with status code only.",
|
|
15
|
+
"reasonNotChosen": "The round-2 canon named Kubernetes as the default explicitly. Load-balancer profile is simpler on the wire (no JSON body, one path) but ships the wrong shape for the majority of the deployments the rcf-lite tier this blueprint targets tends to reach for; Kubernetes has become the default target integration in enough of the industry that shipping it as the default matches the reader's expectation."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "No default; refuse boot without a declaration",
|
|
19
|
+
"summary": "The resolver never falls back; the operator must always declare `probeInterface.profile` explicitly.",
|
|
20
|
+
"reasonNotChosen": "Costs every project one line of configuration for zero value. The whole point of a default is the correct-out-of-the-box case; a project that reaches for the blueprint and does not declare a profile signals 'I want the reasonable default', not 'I want to be nagged for a declaration'. The refusal path stays for the case where the declaration IS present but unrecognised (see US-14101 AC-14101-3)."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Auto-detect the deployment context (heuristics on env, hostname, socket paths)",
|
|
24
|
+
"summary": "Sniff the environment for signals (KUBERNETES_SERVICE_HOST env, /run/systemd/notify socket, Docker cgroups) and pick the profile from what is found.",
|
|
25
|
+
"reasonNotChosen": "Turns a declaration into a heuristic; heuristics that are usually right are surprising when they are wrong, and the failure mode is a silent binding of the wrong probe shape. The declaration is one field; making the operator name their target integration is a small friction that pays for itself the first time a heuristic would have guessed wrong."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
29
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-1504-observability-probe-endpoints-separate-port-option",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "The separate-port listener is an opt-in per-profile option; the fused topology is the default",
|
|
8
|
+
"context": "Kubernetes convention allows probe handlers to bind to a container port that is not published on the Service, which keeps probe traffic reachable only by the kubelet on the pod network and off the public interface. That property is useful in NAT-and-perimeter-controlled environments where the operator publishes only the request-traffic port outside the pod: an attacker who resolves the public host cannot reach the probe endpoint at all. Load balancers, uptime monitors, and reverse proxies probe the same URL humans browse, so the property does not apply to them. observability-essentials's ADR-801 fixes the fused topology as its answer (probes bind to the request-traffic listener) with a clear rationale: the load balancer probing the traffic port observes the same reachability the traffic will observe. This blueprint offers separate-port as an option instead of a mandate because both properties (reachability equivalence vs. probe-traffic isolation) are legitimate and belong to the operator's choice per environment.",
|
|
9
|
+
"decision": "Every HTTP-transport profile ships with a `probeListener.separatePort` option that defaults to unset. When unset, probe handlers bind to the user-traffic listener (fused topology, matches observability-essentials's default). When set to a port number, probe handlers bind to a dedicated HTTP listener on that port; the user-traffic listener does not serve probe paths and the separate probe listener serves only the profile's resolved probe path set. No other route on the process binds to the separate probe listener. The option is per-environment overridable; a project's `dev` environment may use fused topology while `live` uses separate-port.",
|
|
10
|
+
"consequences": "A project on Kubernetes that wants probe isolation from public traffic sets `probeListener.separatePort` and exposes only the traffic port on the Service; a project that wants the load-balancer reachability-equivalence property leaves it unset. Neither answer is the wrong answer; the choice is per environment. The separate-port topology opens a second HTTP listener, which costs a small amount of memory and one more port to think about; the fused topology avoids that at the cost of a second-in-line auth-exempt exception on the user-traffic listener that the project must maintain across every auth middleware refactor.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Fused topology mandatory",
|
|
14
|
+
"summary": "Refuse a `probeListener.separatePort` value; probe handlers always bind to the user-traffic listener.",
|
|
15
|
+
"reasonNotChosen": "Refuses the Kubernetes NAT-and-perimeter-isolation case the operator may genuinely want. observability-essentials made that choice for its own scope (self-supervised project-wide observability); this blueprint's scope (external-integration probing) is exactly where the Kubernetes convention around a dedicated probe port matters most."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Separate-port mandatory",
|
|
19
|
+
"summary": "Refuse the fused topology; probe handlers always bind to a dedicated listener.",
|
|
20
|
+
"reasonNotChosen": "Loses the reachability-equivalence property (the load balancer probing the traffic port observes the same reachability the traffic will observe). Load-balancer and uptime-monitor profiles legitimately want fused topology; forcing separate-port on them costs a port publication without a benefit."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "One separate probe listener with multiple auxiliary surfaces (metrics, admin, probes)",
|
|
24
|
+
"summary": "The separate listener also hosts a project's metrics endpoint and admin endpoints, not only probes.",
|
|
25
|
+
"reasonNotChosen": "Turns the topology component into a general-purpose admin-listener manager and blurs the scope. Metrics endpoints belong to a future `metrics-export` blueprint that composes alongside this one; admin surfaces belong to an authenticated admin blueprint. The topology component here keeps its scope to the probe path set exactly."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-08-30T00:00:00Z",
|
|
29
|
+
"updatedAt": "2026-08-30T00:00:00Z"
|
|
30
|
+
}
|