rcf-lite 0.27.0 → 0.28.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 +23 -0
- package/README.md +10 -0
- package/bin/rcf.js +2 -0
- package/blueprints/application-account-settings/CHANGELOG.md +35 -6
- package/blueprints/application-account-settings/README.md +1 -1
- package/blueprints/application-account-settings/blueprint.json +4 -2
- package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +1 -1
- package/blueprints/application-account-settings/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-account-settings/contributions/probes/profile-form-autocomplete.mjs +67 -0
- package/blueprints/application-account-settings/contributions/probes/run-profile-form-autocomplete.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-adapter-uniform.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-surface-shape.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-shell-tablist-per-capability.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-theme-radiogroup.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-adapter-uniform.mjs +130 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-surface-shape.mjs +70 -0
- package/blueprints/application-account-settings/contributions/probes/shell-tablist-per-capability.mjs +60 -0
- package/blueprints/application-account-settings/contributions/probes/theme-radiogroup.mjs +126 -0
- package/blueprints/application-admin-console/CHANGELOG.md +32 -6
- package/blueprints/application-admin-console/README.md +1 -1
- package/blueprints/application-admin-console/blueprint.json +4 -2
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +1 -1
- package/blueprints/application-admin-console/contributions/probes/audit-log-surface.mjs +79 -0
- package/blueprints/application-admin-console/contributions/probes/org-switcher-surface.mjs +83 -0
- package/blueprints/application-admin-console/contributions/probes/permission-matrix-grid.mjs +67 -0
- package/blueprints/application-admin-console/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-admin-console/contributions/probes/run-audit-log-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-org-switcher-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-permission-matrix-grid.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-sign-in-access-gated-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-users-directory-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/sign-in-access-gated-surface.mjs +117 -0
- package/blueprints/application-admin-console/contributions/probes/users-directory-surface.mjs +145 -0
- package/blueprints/application-api-rest/CHANGELOG.md +16 -8
- package/blueprints/application-api-rest/README.md +3 -3
- package/blueprints/application-api-rest/blueprint.json +3 -2
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +1 -1
- package/blueprints/application-api-rest/contributions/probes/cursor-pagination-round-trip.mjs +154 -0
- package/blueprints/application-api-rest/contributions/probes/health-probes-distinct.mjs +124 -0
- package/blueprints/application-api-rest/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-api-rest/contributions/probes/problem-details-on-error.mjs +77 -0
- package/blueprints/application-api-rest/contributions/probes/request-id-echoed.mjs +76 -0
- package/blueprints/application-api-rest/contributions/probes/run-cursor-pagination-round-trip.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-health-probes-distinct.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-problem-details-on-error.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-request-id-echoed.mjs +5 -0
- package/blueprints/application-api-rest/docs/topics.md +1 -1
- package/blueprints/application-charts/CHANGELOG.md +35 -9
- package/blueprints/application-charts/README.md +6 -6
- package/blueprints/application-charts/blueprint.json +5 -3
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +1 -1
- package/blueprints/application-charts/contributions/probes/keyboard-traversal.mjs +151 -0
- package/blueprints/application-charts/contributions/probes/non-colour-distinction.mjs +67 -0
- package/blueprints/application-charts/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-charts/contributions/probes/run-keyboard-traversal.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-non-colour-distinction.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-text-alternative-table.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/text-alternative-table.mjs +139 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +1 -1
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +1 -1
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +5 -5
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +1 -1
- package/blueprints/application-charts/guide/application-charts.md +1 -1
- package/blueprints/application-dashboard/CHANGELOG.md +20 -10
- package/blueprints/application-dashboard/README.md +6 -6
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +2 -2
- package/blueprints/application-dashboard/blueprint.json +3 -2
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +1 -1
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +1 -1
- package/blueprints/application-dashboard/contributions/probes/export-handle-formats.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/four-tile-states.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/primary-kpi-top-left.mjs +58 -0
- package/blueprints/application-dashboard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-dashboard/contributions/probes/run-export-handle-formats.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-four-tile-states.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-primary-kpi-top-left.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-shell-five-regions.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/shell-five-regions.mjs +93 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +1 -1
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +5 -5
- package/blueprints/application-dashboard/docs/topics.md +2 -2
- package/blueprints/application-dashboard/guide/application-dashboard.md +2 -2
- package/blueprints/application-datatable/CHANGELOG.md +19 -9
- package/blueprints/application-datatable/README.md +2 -2
- package/blueprints/application-datatable/blueprint.json +3 -2
- package/blueprints/application-datatable/contributions/probes/apg-table-shape.mjs +57 -0
- package/blueprints/application-datatable/contributions/probes/four-states-regions.mjs +80 -0
- package/blueprints/application-datatable/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-datatable/contributions/probes/run-apg-table-shape.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-four-states-regions.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-search-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-sort-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/search-adapter-round-trip.mjs +58 -0
- package/blueprints/application-datatable/contributions/probes/sort-adapter-round-trip.mjs +60 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +1 -1
- package/blueprints/application-datatable/docs/topics.md +1 -1
- package/blueprints/application-empty-error-states/CHANGELOG.md +33 -3
- package/blueprints/application-empty-error-states/blueprint.json +4 -2
- package/blueprints/application-empty-error-states/contributions/probes/empty-list-and-no-search.mjs +66 -0
- package/blueprints/application-empty-error-states/contributions/probes/error-boundary-alert.mjs +65 -0
- package/blueprints/application-empty-error-states/contributions/probes/forbidden-and-server-error.mjs +167 -0
- package/blueprints/application-empty-error-states/contributions/probes/not-found-and-recovery.mjs +61 -0
- package/blueprints/application-empty-error-states/contributions/probes/permission-denied-and-offline.mjs +155 -0
- package/blueprints/application-empty-error-states/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-empty-list-and-no-search.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-error-boundary-alert.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-forbidden-and-server-error.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-not-found-and-recovery.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-permission-denied-and-offline.mjs +5 -0
- package/blueprints/application-error-handling/CHANGELOG.md +45 -6
- package/blueprints/application-error-handling/blueprint.json +3 -2
- package/blueprints/application-error-handling/contributions/probes/category-vocabulary.mjs +90 -0
- package/blueprints/application-error-handling/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-error-handling/contributions/probes/record-shape-adr-1701.mjs +78 -0
- package/blueprints/application-error-handling/contributions/probes/run-category-vocabulary.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-record-shape-adr-1701.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-two-boundaries-registered.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/two-boundaries-registered.mjs +343 -0
- package/blueprints/application-file-upload/CHANGELOG.md +28 -6
- package/blueprints/application-file-upload/README.md +1 -1
- package/blueprints/application-file-upload/blueprint.json +3 -2
- package/blueprints/application-file-upload/contributions/probes/assertive-completion-slot.mjs +78 -0
- package/blueprints/application-file-upload/contributions/probes/chunked-transport-endpoints.mjs +173 -0
- package/blueprints/application-file-upload/contributions/probes/per-file-progressbar.mjs +124 -0
- package/blueprints/application-file-upload/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-file-upload/contributions/probes/run-assertive-completion-slot.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-chunked-transport-endpoints.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-per-file-progressbar.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-upload-surface-shape.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/upload-surface-shape.mjs +55 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +1 -1
- package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +1 -1
- package/blueprints/application-forms-wizard/CHANGELOG.md +20 -6
- package/blueprints/application-forms-wizard/README.md +2 -2
- package/blueprints/application-forms-wizard/blueprint.json +3 -2
- package/blueprints/application-forms-wizard/contributions/probes/draft-persistence-round-trip.mjs +110 -0
- package/blueprints/application-forms-wizard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-draft-persistence-round-trip.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-step-page-shape.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-task-list-surface.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/step-page-shape.mjs +61 -0
- package/blueprints/application-forms-wizard/contributions/probes/task-list-surface.mjs +109 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +1 -1
- package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +1 -1
- package/blueprints/application-notifications-in-app/CHANGELOG.md +38 -5
- package/blueprints/application-notifications-in-app/README.md +4 -4
- package/blueprints/application-notifications-in-app/blueprint.json +4 -2
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/probes/centre-acknowledge-round-trip.mjs +210 -0
- package/blueprints/application-notifications-in-app/contributions/probes/live-region-preseeding.mjs +93 -0
- package/blueprints/application-notifications-in-app/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-centre-acknowledge-round-trip.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-live-region-preseeding.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-toast-contract.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/toast-contract.mjs +92 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +3 -3
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +1 -1
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +3 -3
- package/blueprints/application-onboarding-tour/CHANGELOG.md +31 -5
- package/blueprints/application-onboarding-tour/README.md +1 -1
- package/blueprints/application-onboarding-tour/blueprint.json +5 -3
- package/blueprints/application-onboarding-tour/contributions/probes/checklist-anchor-open.mjs +81 -0
- package/blueprints/application-onboarding-tour/contributions/probes/completion-persistence.mjs +159 -0
- package/blueprints/application-onboarding-tour/contributions/probes/first-run-detection.mjs +67 -0
- package/blueprints/application-onboarding-tour/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-checklist-anchor-open.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-completion-persistence.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-first-run-detection.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-stepper-role-dialog.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/stepper-role-dialog.mjs +45 -0
- package/blueprints/application-spa/CHANGELOG.md +20 -11
- package/blueprints/application-spa/README.md +9 -10
- package/blueprints/application-spa/blueprint.json +3 -2
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
- package/blueprints/application-spa/contributions/probes/designed-empty-state.mjs +72 -0
- package/blueprints/application-spa/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-spa/contributions/probes/route-inventory-published.mjs +185 -0
- package/blueprints/application-spa/contributions/probes/run-designed-empty-state.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-route-inventory-published.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-shell-nav-present.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/shell-nav-present.mjs +69 -0
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +3 -3
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +1 -1
- package/blueprints/application-spa/docs/topics.md +1 -1
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +31 -11
- package/blueprints/delivery-ci-workflows/README.md +3 -3
- package/blueprints/delivery-ci-workflows/blueprint.json +3 -2
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +2 -2
- package/blueprints/delivery-ci-workflows/contributions/probes/node-gate-entrypoint.mjs +76 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/probe-utils.mjs +56 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/real-account-github-actions-run-record.mjs +139 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-node-gate-entrypoint.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-real-account-github-actions-run-record.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-workflow-template-shape.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/workflow-template-shape.mjs +94 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +1 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +2 -3
- package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +4 -4
- package/blueprints/deploy-cloudflare-workers/README.md +3 -3
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +2 -2
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
- package/blueprints/deploy-hetzner-server/CHANGELOG.md +98 -7
- package/blueprints/deploy-hetzner-server/blueprint.json +7 -6
- package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +46 -21
- package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +344 -83
- package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +211 -42
- package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +140 -22
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +111 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +158 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +154 -32
- package/blueprints/edge-cloudflare-access/CHANGELOG.md +6 -5
- package/blueprints/edge-cloudflare-access/blueprint.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +9 -1
- package/blueprints/edge-cloudflare-access/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +4 -7
- package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +4 -6
- package/blueprints/edge-cloudflare-tunnel/README.md +1 -2
- package/blueprints/edge-cloudflare-tunnel/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +2 -3
- package/blueprints/edge-cloudflare-turnstile/docs/topics.md +1 -1
- package/blueprints/email-smtp-resend/CHANGELOG.md +24 -8
- package/blueprints/email-smtp-resend/README.md +2 -2
- package/blueprints/email-smtp-resend/blueprint.json +3 -2
- package/blueprints/email-smtp-resend/contributions/probes/probe-utils.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/real-account-resend-send.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-real-account-resend-send.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-smtp-round-trip.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-unverified-sender-refusal.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/smtp-round-trip.mjs +43 -0
- package/blueprints/email-smtp-resend/contributions/probes/unverified-sender-refusal.mjs +99 -0
- package/blueprints/email-smtp-resend/docs/topics.md +2 -3
- package/blueprints/jobs-background/CHANGELOG.md +66 -5
- package/blueprints/jobs-background/README.md +2 -2
- package/blueprints/jobs-background/blueprint.json +3 -2
- package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +38 -10
- package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +28 -6
- package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +16 -2
- package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +102 -21
- package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +10 -2
- package/blueprints/jobs-background/contributions/probes/retry-and-fail-real-account.mjs +355 -0
- package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +33 -2
- package/blueprints/jobs-background/contributions/probes/run-retry-and-fail-real-account.mjs +12 -0
- package/blueprints/jobs-background/docs/topics.md +1 -1
- package/blueprints/jobs-background/guide/jobs-background.md +1 -1
- package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +25 -19
- package/blueprints/messaging-queue-cloudflare/README.md +12 -12
- package/blueprints/messaging-queue-cloudflare/blueprint.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +180 -12
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +1 -1
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +2 -2
- package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +2 -2
- package/blueprints/object-storage-s3/CHANGELOG.md +75 -4
- package/blueprints/object-storage-s3/blueprint.json +3 -2
- package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +73 -12
- package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +55 -7
- package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +102 -18
- package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +105 -36
- package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +104 -55
- package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +129 -7
- package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +80 -18
- package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +291 -37
- package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +5 -5
- package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +8 -5
- package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +6 -3
- package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +10 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +1 -1
- package/blueprints/object-storage-s3/docs/topics.md +1 -1
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +1 -1
- package/blueprints/observability-essentials/CHANGELOG.md +23 -7
- package/blueprints/observability-essentials/README.md +2 -2
- package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json +1 -1
- package/blueprints/observability-essentials/blueprint.json +3 -2
- package/blueprints/observability-essentials/contributions/probes/liveness-probe.mjs +84 -0
- package/blueprints/observability-essentials/contributions/probes/metrics-endpoint.mjs +96 -0
- package/blueprints/observability-essentials/contributions/probes/probe-utils.mjs +52 -0
- package/blueprints/observability-essentials/contributions/probes/readiness-probe.mjs +171 -0
- package/blueprints/observability-essentials/contributions/probes/run-liveness-probe.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-metrics-endpoint.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-readiness-probe.mjs +3 -0
- package/blueprints/observability-essentials/docs/topics.md +2 -3
- package/blueprints/observability-logging/CHANGELOG.md +29 -4
- package/blueprints/observability-logging/README.md +2 -2
- package/blueprints/observability-logging/blueprint.json +3 -2
- package/blueprints/observability-logging/contributions/probes/correlation-id-flow.mjs +173 -0
- package/blueprints/observability-logging/contributions/probes/line-shape-and-fields.mjs +82 -0
- package/blueprints/observability-logging/contributions/probes/probe-utils.mjs +47 -0
- package/blueprints/observability-logging/contributions/probes/redaction-boundary.mjs +130 -0
- package/blueprints/observability-logging/contributions/probes/run-correlation-id-flow.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-line-shape-and-fields.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-redaction-boundary.mjs +3 -0
- package/blueprints/observability-probe-endpoints/CHANGELOG.md +23 -8
- package/blueprints/observability-probe-endpoints/README.md +3 -3
- package/blueprints/observability-probe-endpoints/blueprint.json +3 -2
- package/blueprints/observability-probe-endpoints/contributions/probes/kubernetes-startup-enabled.mjs +80 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/partial-profile-refusal.mjs +101 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/probe-utils.mjs +49 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/profile-boot-materialisation.mjs +69 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-kubernetes-startup-enabled.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-partial-profile-refusal.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-profile-boot-materialisation.mjs +3 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/CHANGELOG.md +16 -3
- package/blueprints/persistence-data-d1/README.md +2 -2
- package/blueprints/persistence-data-d1/blueprint.json +3 -2
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +1 -1
- package/blueprints/persistence-data-d1/contributions/probes/facade-round-trip.mjs +140 -0
- package/blueprints/persistence-data-d1/contributions/probes/migrations-forward-only.mjs +66 -0
- package/blueprints/persistence-data-d1/contributions/probes/probe-utils.mjs +51 -0
- package/blueprints/persistence-data-d1/contributions/probes/real-account-d1-round-trip.mjs +133 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-facade-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-migrations-forward-only.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-real-account-d1-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/docs/topics.md +2 -3
- package/blueprints/persistence-data-postgres/CHANGELOG.md +84 -4
- package/blueprints/persistence-data-postgres/README.md +2 -2
- package/blueprints/persistence-data-postgres/blueprint.json +3 -2
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +87 -12
- package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +245 -19
- package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +109 -26
- package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +151 -38
- package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +24 -6
- package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +261 -48
- package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +76 -20
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +1 -1
- package/blueprints/persistence-data-postgres/docs/topics.md +1 -1
- package/blueprints/persistence-data-sqlite/CHANGELOG.md +16 -2
- package/blueprints/persistence-data-sqlite/README.md +2 -2
- package/blueprints/persistence-data-sqlite/blueprint.json +3 -2
- package/blueprints/persistence-data-sqlite/contributions/probes/boot-open-migrate.mjs +90 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/facade-round-trip.mjs +82 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/probe-utils.mjs +83 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-boot-open-migrate.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-facade-round-trip.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-wal-checkpoint.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/wal-checkpoint.mjs +137 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +5 -5
- package/blueprints/platform-cloudflare-cron-triggers/README.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +6 -10
- package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-kv/CHANGELOG.md +16 -12
- package/blueprints/platform-cloudflare-kv/README.md +2 -4
- package/blueprints/platform-cloudflare-kv/blueprint.json +2 -2
- package/blueprints/platform-cloudflare-kv/docs/topics.md +1 -1
- package/blueprints/platform-docker-compose-host/CHANGELOG.md +92 -5
- package/blueprints/platform-docker-compose-host/blueprint.json +2 -2
- package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +116 -29
- package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +181 -109
- package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +146 -26
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +238 -24
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +207 -21
- package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +246 -42
- package/blueprints/platform-docker-compose-host/docs/topics.md +1 -1
- package/blueprints/security-auth-clerk/CHANGELOG.md +18 -6
- package/blueprints/security-auth-clerk/README.md +3 -3
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +1 -1
- package/blueprints/security-auth-clerk/blueprint.json +3 -2
- package/blueprints/security-auth-clerk/contributions/probes/hosted-identity-ui-config.mjs +61 -0
- package/blueprints/security-auth-clerk/contributions/probes/probe-utils.mjs +188 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-principal-directory-round-trip.mjs +216 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-session-inventory.mjs +260 -0
- package/blueprints/security-auth-clerk/contributions/probes/role-model-adapter.mjs +53 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-hosted-identity-ui-config.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-principal-directory-round-trip.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-session-inventory.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-role-model-adapter.mjs +4 -0
- package/blueprints/security-auth-clerk/docs/topics.md +2 -3
- package/blueprints/security-auth-keycloak/CHANGELOG.md +18 -7
- package/blueprints/security-auth-keycloak/README.md +2 -2
- package/blueprints/security-auth-keycloak/blueprint.json +3 -2
- package/blueprints/security-auth-keycloak/contributions/probes/discovery-shape.mjs +68 -0
- package/blueprints/security-auth-keycloak/contributions/probes/introspection-shape.mjs +88 -0
- package/blueprints/security-auth-keycloak/contributions/probes/jwt-verifier-shape.mjs +86 -0
- package/blueprints/security-auth-keycloak/contributions/probes/probe-utils.mjs +180 -0
- package/blueprints/security-auth-keycloak/contributions/probes/real-account-realm-round-trip.mjs +91 -0
- package/blueprints/security-auth-keycloak/contributions/probes/role-adapter-shape.mjs +69 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-discovery-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-introspection-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-jwt-verifier-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-real-account-realm-round-trip.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-role-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +1 -2
- package/blueprints/security-auth-magic-link/CHANGELOG.md +15 -4
- package/blueprints/security-auth-magic-link/README.md +2 -2
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +1 -1
- package/blueprints/security-auth-magic-link/blueprint.json +3 -2
- package/blueprints/security-auth-magic-link/contributions/probes/probe-utils.mjs +174 -0
- package/blueprints/security-auth-magic-link/contributions/probes/real-account-magic-link-send.mjs +139 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-real-account-magic-link-send.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-entropy-shape.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-issue-verify.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-entropy-shape.mjs +60 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-issue-verify.mjs +90 -0
- package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +16 -5
- package/blueprints/security-auth-oauth2/README.md +2 -2
- package/blueprints/security-auth-oauth2/blueprint.json +3 -2
- package/blueprints/security-auth-oauth2/contributions/probes/authorisation-code-flow-shape.mjs +259 -0
- package/blueprints/security-auth-oauth2/contributions/probes/pkce-challenge-shape.mjs +58 -0
- package/blueprints/security-auth-oauth2/contributions/probes/probe-utils.mjs +190 -0
- package/blueprints/security-auth-oauth2/contributions/probes/provider-adapter-shape.mjs +64 -0
- package/blueprints/security-auth-oauth2/contributions/probes/real-account-authorisation-code-flow.mjs +93 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-authorisation-code-flow-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-pkce-challenge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-provider-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-real-account-authorisation-code-flow.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-session-bridge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/session-bridge-shape.mjs +78 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +1 -2
- package/blueprints/security-secrets-management/CHANGELOG.md +15 -4
- package/blueprints/security-secrets-management/README.md +2 -2
- package/blueprints/security-secrets-management/blueprint.json +3 -2
- package/blueprints/security-secrets-management/contributions/probes/add-recipient-rotation.mjs +107 -0
- package/blueprints/security-secrets-management/contributions/probes/encrypt-decrypt-round-trip.mjs +122 -0
- package/blueprints/security-secrets-management/contributions/probes/key-rotation.mjs +93 -0
- package/blueprints/security-secrets-management/contributions/probes/mismatched-key-refusal.mjs +74 -0
- package/blueprints/security-secrets-management/contributions/probes/probe-utils.mjs +214 -0
- package/blueprints/security-secrets-management/contributions/probes/run-add-recipient-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-encrypt-decrypt-round-trip.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-key-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-mismatched-key-refusal.mjs +4 -0
- package/blueprints/security-secrets-management/docs/topics.md +2 -3
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/harness-template.md +25 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +25 -0
- package/package.json +2 -2
- package/rcf/adrs/adr-4101-feedback-store-gitignored.json +20 -0
- package/rcf/adrs/adr-4102-fingerprint-and-labels.json +25 -0
- package/rcf/adrs/adr-4103-redaction-rule-based.json +20 -0
- package/rcf/adrs/adr-4104-destination-on-library.json +25 -0
- package/rcf/adrs/adr-4105-gh-ambient-auth.json +20 -0
- package/rcf/adrs/adr-4106-bundled-entries-terminal.json +20 -0
- package/rcf/adrs/adr-4107-stop-is-ask-event.json +30 -0
- package/rcf/adrs/adr-4108-hooks-in-committed-config.json +25 -0
- package/rcf/adrs/adr-4109-referee-validate-adr-crosslinks.json +25 -0
- package/rcf/adrs/adr-4110-referee-coverage-strict-by-default.json +25 -0
- package/rcf/adrs/adr-4111-referee-finalise-refusals.json +20 -0
- package/rcf/adrs/adr-4112-referee-finalise-verified-invariant.json +30 -0
- package/rcf/code-nodes/cn-600.json +45 -0
- package/rcf/code-nodes/cn-601.json +18 -0
- package/rcf/code-nodes/cn-602.json +15 -0
- package/rcf/code-nodes/cn-603.json +12 -0
- package/rcf/code-nodes/cn-604.json +14 -0
- package/rcf/code-nodes/cn-605.json +17 -0
- package/rcf/code-nodes/cn-606.json +12 -0
- package/rcf/code-nodes/cn-607.json +12 -0
- package/rcf/code-nodes/cn-608.json +14 -0
- package/rcf/code-nodes/cn-609.json +17 -0
- package/rcf/code-nodes/cn-620.json +18 -0
- package/rcf/code-nodes/cn-621.json +14 -0
- package/rcf/code-nodes/cn-622.json +15 -0
- package/rcf/code-nodes/cn-623.json +16 -0
- package/rcf/code-nodes/cn-624.json +14 -0
- package/rcf/code-nodes/cn-625.json +15 -0
- package/rcf/code-nodes/cn-626.json +13 -0
- package/rcf/code-nodes/cn-627.json +13 -0
- package/rcf/code-nodes/cn-628.json +14 -0
- package/rcf/code-nodes/cn-629.json +12 -0
- package/rcf/code-nodes/cn-630.json +12 -0
- package/rcf/code-nodes/cn-631.json +13 -0
- package/rcf/code-nodes/cn-632.json +13 -0
- package/rcf/fbs/fbs-180.json +45 -0
- package/rcf/fbs/fbs-181.json +45 -0
- package/rcf/fbs/fbs-182.json +42 -0
- package/rcf/fbs/fbs-183.json +50 -0
- package/rcf/fbs/fbs-184.json +49 -0
- package/rcf/fbs/fbs-185.json +34 -0
- package/rcf/fbs/fbs-186.json +16 -0
- package/rcf/fbs/fbs-187.json +17 -0
- package/rcf/fbs/fbs-188.json +17 -0
- package/rcf/fbs/fbs-189.json +17 -0
- package/rcf/requirements/req-155.json +13 -0
- package/rcf/requirements/req-156.json +13 -0
- package/rcf/requirements/req-157.json +13 -0
- package/rcf/requirements/req-158.json +13 -0
- package/rcf/requirements/req-159.json +13 -0
- package/rcf/requirements/req-160.json +13 -0
- package/rcf/requirements/req-161.json +13 -0
- package/rcf/requirements/req-162.json +13 -0
- package/rcf/requirements/req-163.json +13 -0
- package/rcf/requirements/req-164.json +13 -0
- package/rcf/requirements/req-165.json +13 -0
- package/rcf/tacs/tac-4101-feedback-cli.json +77 -0
- package/rcf/tacs/tac-4102-feedback-store.json +50 -0
- package/rcf/tacs/tac-4103-feedback-redact.json +39 -0
- package/rcf/tacs/tac-4104-feedback-fingerprint.json +33 -0
- package/rcf/tacs/tac-4105-feedback-render.json +45 -0
- package/rcf/tacs/tac-4106-feedback-destination.json +39 -0
- package/rcf/tacs/tac-4107-feedback-gh.json +43 -0
- package/rcf/tacs/tac-4108-feedback-hook.json +46 -0
- package/rcf/tacs/tac-4109-referee-validate-adr-crosslinks.json +20 -0
- package/rcf/tacs/tac-4110-referee-coverage-mode-selector.json +21 -0
- package/rcf/tacs/tac-4111-referee-finalise-per-ac-refusals.json +21 -0
- package/rcf/tacs/tac-4112-referee-finalise-verified-invariant.json +22 -0
- package/rcf/test-suites/ts-140.json +9 -9
- package/rcf/test-suites/ts-150.json +9 -9
- package/rcf/test-suites/ts-185.json +54 -0
- package/rcf/test-suites/ts-186.json +58 -0
- package/rcf/test-suites/ts-187.json +44 -0
- package/rcf/test-suites/ts-188.json +166 -0
- package/rcf/test-suites/ts-189.json +38 -0
- package/rcf/test-suites/ts-190.json +30 -0
- package/rcf/test-suites/ts-191.json +51 -0
- package/rcf/test-suites/ts-192.json +37 -0
- package/rcf/test-suites/ts-193.json +60 -0
- package/rcf/test-suites/ts-194.json +67 -0
- package/rcf/test-suites/ts-195.json +52 -0
- package/rcf/test-suites/ts-196.json +58 -0
- package/rcf/test-suites/ts-197.json +66 -0
- package/rcf/test-suites/ts-198.json +87 -0
- package/rcf/test-suites/ts-199.json +51 -0
- package/rcf/test-suites/ts-200.json +30 -0
- package/rcf/test-suites/ts-201.json +38 -0
- package/rcf/test-suites/ts-202.json +38 -0
- package/rcf/test-suites/ts-203.json +38 -0
- package/rcf/user-stories/us-15501.json +60 -0
- package/rcf/user-stories/us-15502.json +33 -0
- package/rcf/user-stories/us-15503.json +33 -0
- package/rcf/user-stories/us-15601.json +51 -0
- package/rcf/user-stories/us-15701.json +42 -0
- package/rcf/user-stories/us-15801.json +42 -0
- package/rcf/user-stories/us-15802.json +33 -0
- package/rcf/user-stories/us-15901.json +33 -0
- package/rcf/user-stories/us-15902.json +51 -0
- package/rcf/user-stories/us-16001.json +51 -0
- package/rcf/user-stories/us-16101.json +42 -0
- package/rcf/user-stories/us-16102.json +33 -0
- package/rcf/user-stories/us-16103.json +42 -0
- package/rcf/user-stories/us-16104.json +42 -0
- package/rcf/user-stories/us-16201.json +33 -0
- package/rcf/user-stories/us-16301.json +36 -0
- package/rcf/user-stories/us-16401.json +45 -0
- package/rcf/user-stories/us-16501.json +45 -0
- package/rcf/user-stories/us-16502.json +45 -0
- package/releases/releases.yaml +11 -1
- package/src/blueprint/library-loader.js +48 -0
- package/src/blueprint/library-registry.js +13 -0
- package/src/browser-verify/pack-runner.js +7 -12
- package/src/build/mark.js +1 -1
- package/src/cli/blueprint-library.js +149 -0
- package/src/cli/coverage.js +49 -24
- package/src/cli/doctor.js +195 -7
- package/src/cli/feedback.js +2204 -0
- package/src/cli/finalise.js +158 -1
- package/src/cli/help.js +6 -0
- package/src/cli/init.js +63 -0
- package/src/cli/update.js +21 -1
- package/src/core/store/walker.js +33 -0
- package/src/core/store/writer.js +23 -0
- package/src/feedback/destination.js +361 -0
- package/src/feedback/fingerprint.js +132 -0
- package/src/feedback/gh.js +376 -0
- package/src/feedback/hook.js +183 -0
- package/src/feedback/labels.js +87 -0
- package/src/feedback/redact-allowlist.json +14 -0
- package/src/feedback/redact.js +1108 -0
- package/src/feedback/render.js +267 -0
- package/src/feedback/store.js +604 -0
- package/src/finalise/index.js +4 -0
- package/src/finalise/ingest.js +61 -0
- package/src/finalise/ship-without-eval.js +19 -7
- package/src/mcp/tools.js +8 -2
- package/src/setup/feedback-hooks.js +397 -0
- package/src/setup/managed-gitignore.js +3 -0
- package/src/view/html-page.js +5 -5
- package/src/view/style.css +2 -2
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Liveness-probe probe for observability-essentials.
|
|
2
|
+
//
|
|
3
|
+
// Boots the fixture server, VARIES the input by supplying a distinct
|
|
4
|
+
// x-request-id header per request, and observes the /live endpoint.
|
|
5
|
+
//
|
|
6
|
+
// AC-7101-1 requires the endpoint path to come from project
|
|
7
|
+
// configuration under probeInterface.paths.liveness (no shipped
|
|
8
|
+
// default). This probe uses a hard-coded '/live' path against the
|
|
9
|
+
// fixture rather than reading a configured path from a downstream
|
|
10
|
+
// project; row de-claimed (conformanceOnly, anchorAcId=null) with
|
|
11
|
+
// the limitation naming AC-7101-1. The observation (HTTP 200 with
|
|
12
|
+
// body.status='pass' on the healthy path) is retained.
|
|
13
|
+
//
|
|
14
|
+
// AC-7101-5 requires the unhealthy path to answer HTTP 503 with
|
|
15
|
+
// content-length 0 AND for a follow-up GET while the predicate stays
|
|
16
|
+
// fail to continue answering 503 AND for a GET after the predicate
|
|
17
|
+
// returns pass to answer 200. This probe exercises all three requests
|
|
18
|
+
// (unhealthy, repeat unhealthy, restored healthy) and anchors AC-7101-5.
|
|
19
|
+
|
|
20
|
+
import { randomUUID } from 'node:crypto';
|
|
21
|
+
import { createProbeServer } from '../../../../packages/rcf-lite/test/fixtures/probe-pack-observability-essentials/src/probe-server.mjs';
|
|
22
|
+
import { envPort } from './probe-utils.mjs';
|
|
23
|
+
|
|
24
|
+
export const anchorAcId = 'AC-7101-5';
|
|
25
|
+
export const accountBound = false;
|
|
26
|
+
const AC5 = 'A liveness handler on a process whose in-process';
|
|
27
|
+
const LIM_7101_1 = `AC-7101-1: requires the liveness endpoint path to come from project configuration under probeInterface.paths.liveness (no shipped default from v2.0.0). This row observes the endpoint behaviour at the hard-coded fixture path '/live'; it does not observe the path being sourced from configuration in a downstream project.`;
|
|
28
|
+
|
|
29
|
+
async function get(port, path, headers) {
|
|
30
|
+
const res = await fetch(`http://127.0.0.1:${port}${path}`, { headers });
|
|
31
|
+
const text = await res.text();
|
|
32
|
+
let parsed = null; try { parsed = JSON.parse(text); } catch {}
|
|
33
|
+
return { status: res.status, requestId: res.headers.get('x-request-id'), contentLength: res.headers.get('content-length'), body: text, parsed };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export default async function runProbe() {
|
|
37
|
+
const srv = createProbeServer();
|
|
38
|
+
const { port } = await srv.listen(envPort());
|
|
39
|
+
const results = [];
|
|
40
|
+
const healthyIds = [randomUUID(), randomUUID(), randomUUID()];
|
|
41
|
+
const healthyObserved = [];
|
|
42
|
+
let unhealthyObserved, repeatObserved, restoredObserved;
|
|
43
|
+
try {
|
|
44
|
+
for (const rid of healthyIds) {
|
|
45
|
+
const r = await get(port, '/live', { 'x-request-id': rid });
|
|
46
|
+
healthyObserved.push({ supplied: rid, echoedHeader: r.requestId, echoedBody: r.parsed?.requestIdEchoed, status: r.status, bodyStatus: r.parsed?.status });
|
|
47
|
+
}
|
|
48
|
+
const allEchoed = healthyObserved.every((o) => o.status === 200 && o.echoedHeader === o.supplied && o.echoedBody === o.supplied && o.bodyStatus === 'pass');
|
|
49
|
+
results.push({
|
|
50
|
+
anchorAcId: null,
|
|
51
|
+
conformanceOnly: true,
|
|
52
|
+
limitation: LIM_7101_1,
|
|
53
|
+
verdict: allEchoed ? 'pass' : 'fail',
|
|
54
|
+
detail: `observed ${healthyIds.length} varied x-request-id inputs at the hard-coded fixture path '/live'; every response is HTTP 200 with body.status='pass' and header/body echo the supplied id. Path-from-configuration clause not observed.`,
|
|
55
|
+
evidence: { variedInputs: healthyIds, observed: healthyObserved },
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
srv.setLivenessUnhealthy(true);
|
|
59
|
+
const badId = randomUUID();
|
|
60
|
+
const bad = await get(port, '/live', { 'x-request-id': badId });
|
|
61
|
+
unhealthyObserved = { supplied: badId, echoedHeader: bad.requestId, status: bad.status, contentLength: bad.contentLength, bodyLength: bad.body.length };
|
|
62
|
+
const badId2 = randomUUID();
|
|
63
|
+
const bad2 = await get(port, '/live', { 'x-request-id': badId2 });
|
|
64
|
+
repeatObserved = { supplied: badId2, echoedHeader: bad2.requestId, status: bad2.status, contentLength: bad2.contentLength, bodyLength: bad2.body.length };
|
|
65
|
+
srv.setLivenessUnhealthy(false);
|
|
66
|
+
const goodId = randomUUID();
|
|
67
|
+
const restored = await get(port, '/live', { 'x-request-id': goodId });
|
|
68
|
+
restoredObserved = { supplied: goodId, echoedHeader: restored.requestId, status: restored.status, bodyStatus: restored.parsed?.status };
|
|
69
|
+
|
|
70
|
+
const failOk = bad.status === 503 && (bad.contentLength === '0' || bad.body.length === 0) && bad.requestId === badId;
|
|
71
|
+
const repeatOk = bad2.status === 503 && (bad2.contentLength === '0' || bad2.body.length === 0) && bad2.requestId === badId2;
|
|
72
|
+
const restoredOk = restored.status === 200 && restored.parsed?.status === 'pass' && restored.requestId === goodId;
|
|
73
|
+
results.push({
|
|
74
|
+
anchorAcId: 'AC-7101-5',
|
|
75
|
+
verdict: failOk && repeatOk && restoredOk ? 'pass' : 'fail',
|
|
76
|
+
detail: `${AC5} - fail: HTTP ${bad.status} content-length='${bad.contentLength}' bodyLength=${bad.body.length}; repeat-fail: HTTP ${bad2.status} content-length='${bad2.contentLength}' bodyLength=${bad2.body.length}; restored-pass: HTTP ${restored.status} body.status='${restored.parsed?.status}'. Observes AC-7101-5 three-step contract (503 -> 503 while predicate fails -> 200 after predicate restored).`,
|
|
77
|
+
evidence: { variedInput: badId, observed: unhealthyObserved, repeatObserved, restoredObserved },
|
|
78
|
+
});
|
|
79
|
+
} finally {
|
|
80
|
+
srv.setLivenessUnhealthy(false);
|
|
81
|
+
await srv.close();
|
|
82
|
+
}
|
|
83
|
+
return { results, extra: { envDeclared: ['RCF_FIXTURE_OBS_ESS_PORT'], boundPort: port, variedInputs: healthyIds, healthyObserved, unhealthyObserved, repeatObserved, restoredObserved } };
|
|
84
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Status-page probe for observability-essentials (kept under the
|
|
2
|
+
// legacy metrics-endpoint filename so the run-metrics-endpoint.mjs
|
|
3
|
+
// wrapper and the anatomy test's PROBES list continue to resolve
|
|
4
|
+
// without shipping a rename in the same patch).
|
|
5
|
+
//
|
|
6
|
+
// Anchors AC-7104-2 and AC-7104-3 by asking the fixture for /status
|
|
7
|
+
// with declared components in mixed states. AC-7104-2 requires each
|
|
8
|
+
// component's state attribute to EQUAL the declared current state
|
|
9
|
+
// AND be drawn from the fixed enum. AC-7104-3 requires render order
|
|
10
|
+
// equals declaration order. AC-7104-1 (configured-path clause) is
|
|
11
|
+
// de-claimed to conformanceOnly: the shipped probe-server hard-codes
|
|
12
|
+
// '/status' rather than accepting a paths.status option, so the
|
|
13
|
+
// configuration-provenance property is not observed here (the strict-evidence contract).
|
|
14
|
+
// Every retained row records the server-echoed x-request-id header
|
|
15
|
+
// as its identifier alongside the derived rendered lists.
|
|
16
|
+
// Every detail line begins with the first eight words of the anchored
|
|
17
|
+
// AC text.
|
|
18
|
+
import { randomUUID } from 'node:crypto';
|
|
19
|
+
import { createProbeServer } from '../../../../packages/rcf-lite/test/fixtures/probe-pack-observability-essentials/src/probe-server.mjs';
|
|
20
|
+
import { envPort } from './probe-utils.mjs';
|
|
21
|
+
|
|
22
|
+
export const anchorAcId = 'AC-7104-2';
|
|
23
|
+
export const accountBound = false;
|
|
24
|
+
const AC2 = 'Each rendered component element carries its current state';
|
|
25
|
+
const AC3 = 'The component render order on the page matches';
|
|
26
|
+
|
|
27
|
+
const DECLARED = [
|
|
28
|
+
{ name: 'api', state: 'operational' },
|
|
29
|
+
{ name: 'jobs', state: 'degraded' },
|
|
30
|
+
{ name: 'billing', state: 'outage' },
|
|
31
|
+
{ name: 'search', state: 'maintenance' },
|
|
32
|
+
];
|
|
33
|
+
const ALLOWED_STATES = new Set(['operational', 'degraded', 'outage', 'maintenance']);
|
|
34
|
+
|
|
35
|
+
function parseComponents(html) {
|
|
36
|
+
const parsed = [];
|
|
37
|
+
const re = /<li[^>]*class="component"[^>]*data-name="([^"]*)"[^>]*data-state="([^"]*)"[^>]*>([^<]*)<\/li>/g;
|
|
38
|
+
let m;
|
|
39
|
+
while ((m = re.exec(html)) !== null) parsed.push({ nameAttr: m[1], stateAttr: m[2], text: m[3] });
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default async function runProbe() {
|
|
44
|
+
const srv = createProbeServer();
|
|
45
|
+
srv.setComponents(DECLARED);
|
|
46
|
+
const { port } = await srv.listen(envPort());
|
|
47
|
+
const results = [];
|
|
48
|
+
let firstBody, contentType;
|
|
49
|
+
try {
|
|
50
|
+
const suppliedRequestId = randomUUID();
|
|
51
|
+
const res = await fetch(`http://127.0.0.1:${port}/status`, { headers: { 'x-request-id': suppliedRequestId } });
|
|
52
|
+
contentType = res.headers.get('content-type');
|
|
53
|
+
const echoedRequestId = res.headers.get('x-request-id');
|
|
54
|
+
firstBody = await res.text();
|
|
55
|
+
const parsed = parseComponents(firstBody);
|
|
56
|
+
// AC-7104-1: exact declared list (count AND each rendered name
|
|
57
|
+
// equals declared name at same position AND text content equals
|
|
58
|
+
// the declared name). Row de-claimed (conformanceOnly, the strict-evidence contract)
|
|
59
|
+
// because the shipped probe-server hard-codes '/status' rather
|
|
60
|
+
// than accepting a paths.status option; the configured-path
|
|
61
|
+
// clause on AC-7104-1 is not observed here.
|
|
62
|
+
const namesMatch = parsed.length === DECLARED.length && parsed.every((c, i) => c.nameAttr === DECLARED[i].name && c.text === DECLARED[i].name);
|
|
63
|
+
const declaredSet = new Set(DECLARED.map((d) => d.name));
|
|
64
|
+
const renderedSet = new Set(parsed.map((c) => c.nameAttr));
|
|
65
|
+
const phantom = [...renderedSet].filter((n) => !declaredSet.has(n));
|
|
66
|
+
const missing = [...declaredSet].filter((n) => !renderedSet.has(n));
|
|
67
|
+
results.push({
|
|
68
|
+
anchorAcId: null,
|
|
69
|
+
conformanceOnly: true,
|
|
70
|
+
limitation: `AC-7104-1: the configured-path clause requires the fixture to accept an explicit paths.status option and refuse when the shipped default is used unwrapped. This probe uses the hard-coded '/status' path in both the probe and the fixture, so configuration provenance is not observed here.`,
|
|
71
|
+
verdict: res.status === 200 && (contentType || '').startsWith('text/html') && namesMatch && phantom.length === 0 && missing.length === 0 ? 'pass' : 'fail',
|
|
72
|
+
detail: `observed GET /status -> ${res.status} content-type='${contentType}'; rendered ${parsed.length} components; declared=${JSON.stringify(DECLARED.map((d) => d.name))}; rendered=${JSON.stringify(parsed.map((c) => c.nameAttr))}; phantom=${JSON.stringify(phantom)}; missing=${JSON.stringify(missing)}; namesAndTextMatch=${namesMatch}. AC-7104-1 configured-path clause not exercised.`,
|
|
73
|
+
evidence: { status: res.status, contentType, componentsFound: parsed.length, componentsDeclared: DECLARED.length, bodyExcerpt: firstBody.slice(0, 500), declared: DECLARED.map((d) => d.name), rendered: parsed.map((c) => c.nameAttr), phantom, missing },
|
|
74
|
+
});
|
|
75
|
+
// AC-7104-2: each state EQUALS declared state AND is in enum.
|
|
76
|
+
const enumOk = parsed.length > 0 && parsed.every((c) => ALLOWED_STATES.has(c.stateAttr));
|
|
77
|
+
const equalityOk = parsed.length === DECLARED.length && parsed.every((c, i) => c.stateAttr === DECLARED[i].state);
|
|
78
|
+
const mismatches = parsed.map((c, i) => ({ name: c.nameAttr, rendered: c.stateAttr, declared: DECLARED[i]?.state })).filter((r) => r.rendered !== r.declared);
|
|
79
|
+
results.push({
|
|
80
|
+
anchorAcId: 'AC-7104-2',
|
|
81
|
+
verdict: enumOk && equalityOk && echoedRequestId === suppliedRequestId ? 'pass' : 'fail',
|
|
82
|
+
detail: `${AC2} as a machine-readable attribute drawn from - observed every rendered component's data-state; suppliedInput='${suppliedRequestId}' echoedHeader='${echoedRequestId}' echoMatches=${echoedRequestId === suppliedRequestId}; enumMembership=${enumOk}; equalsDeclaredState=${equalityOk}; mismatches=${JSON.stringify(mismatches)}.`,
|
|
83
|
+
evidence: { suppliedInput: suppliedRequestId, derivedResponseHeader: echoedRequestId, stateAttrs: parsed.map((c) => c.stateAttr), declaredStates: DECLARED.map((d) => d.state), enumMembership: enumOk, equalsDeclared: equalityOk, mismatches, bodyExcerpt: firstBody.slice(0, 500) },
|
|
84
|
+
});
|
|
85
|
+
const orderMatches = parsed.length === DECLARED.length && parsed.every((c, i) => c.nameAttr === DECLARED[i].name);
|
|
86
|
+
results.push({
|
|
87
|
+
anchorAcId: 'AC-7104-3',
|
|
88
|
+
verdict: orderMatches && echoedRequestId === suppliedRequestId ? 'pass' : 'fail',
|
|
89
|
+
detail: `${AC3} the declaration order in configuration - observed rendered order=${JSON.stringify(parsed.map((c) => c.nameAttr))}; declared order=${JSON.stringify(DECLARED.map((c) => c.name))}; matches=${orderMatches}; suppliedInput='${suppliedRequestId}' echoedHeader='${echoedRequestId}'.`,
|
|
90
|
+
evidence: { suppliedInput: suppliedRequestId, derivedResponseHeader: echoedRequestId, renderedOrder: parsed.map((c) => c.nameAttr), declaredOrder: DECLARED.map((c) => c.name), matches: orderMatches, bodyExcerpt: firstBody.slice(0, 500) },
|
|
91
|
+
});
|
|
92
|
+
} finally {
|
|
93
|
+
await srv.close();
|
|
94
|
+
}
|
|
95
|
+
return { results, extra: { envDeclared: ['RCF_FIXTURE_OBS_ESS_PORT'], boundPort: port, declaredComponents: DECLARED, contentType, statusPageBodyExcerpt: (firstBody || '').slice(0, 500) } };
|
|
96
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
|
|
5
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
export const PROJECT_ROOT = resolve(HERE, '..', '..', '..', '..');
|
|
7
|
+
export const FIXTURE_DIR = resolve(PROJECT_ROOT, 'packages/rcf-lite/test/fixtures/probe-pack-observability-essentials');
|
|
8
|
+
export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/observability-essentials');
|
|
9
|
+
export const DECLARED_ENV = new Set(['RCF_FIXTURE_OBS_ESS_PORT']);
|
|
10
|
+
|
|
11
|
+
export function aggregate(results) {
|
|
12
|
+
if (!Array.isArray(results) || results.length === 0) return 'fail';
|
|
13
|
+
if (results.some((r) => r.verdict === 'fail')) return 'fail';
|
|
14
|
+
if (results.some((r) => r.verdict === 'warn')) return 'warn';
|
|
15
|
+
return 'pass';
|
|
16
|
+
}
|
|
17
|
+
export function isSkipped(results) { return Array.isArray(results) && results.length > 0 && results.every((r) => r.accountBoundSkipped === true); }
|
|
18
|
+
export async function writeReport({ probeName, engine, results, extra }) {
|
|
19
|
+
await mkdir(REPORT_DIR, { recursive: true });
|
|
20
|
+
const normalised = (Array.isArray(results) && results.length > 0)
|
|
21
|
+
? results
|
|
22
|
+
: [{ anchorAcId: null, harnessError: true, verdict: 'fail', detail: 'no checks ran', evidence: { reason: 'no checks ran', probeName, runAt: new Date().toISOString(), engine } }];
|
|
23
|
+
const raw = aggregate(normalised);
|
|
24
|
+
const aggregateVerdict = isSkipped(normalised) ? 'pass' : raw;
|
|
25
|
+
const report = { slug: 'observability-essentials', probeName, runAt: new Date().toISOString(), engine, results: normalised, aggregateVerdict, ...(extra ?? {}) };
|
|
26
|
+
const path = resolve(REPORT_DIR, `${probeName}.json`);
|
|
27
|
+
await writeFile(path, JSON.stringify(report, null, 2) + '\n', 'utf8');
|
|
28
|
+
return { report, path };
|
|
29
|
+
}
|
|
30
|
+
export async function runShim(probeName, engine, mainFn) {
|
|
31
|
+
try {
|
|
32
|
+
const outcome = (await mainFn()) ?? { results: [] };
|
|
33
|
+
const { results, extra } = outcome;
|
|
34
|
+
const { report, path } = await writeReport({ probeName, engine, results, extra });
|
|
35
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
36
|
+
process.stdout.write(`report written to ${path}\n`);
|
|
37
|
+
if (report.aggregateVerdict === 'fail') process.exitCode = 1;
|
|
38
|
+
} catch (err) {
|
|
39
|
+
const results = [{ anchorAcId: null, harnessError: true, verdict: 'fail', detail: `probe threw: ${err?.message ?? err}`, evidence: { thrown: true, message: err?.message ?? String(err), name: err?.name ?? 'Error', probeName, runAt: new Date().toISOString(), engine } }];
|
|
40
|
+
const { report, path } = await writeReport({ probeName, engine, results });
|
|
41
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
42
|
+
process.stderr.write(`probe error: ${err?.stack ?? err}\n`);
|
|
43
|
+
process.stderr.write(`report written to ${path}\n`);
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function envPort() {
|
|
48
|
+
const raw = process.env.RCF_FIXTURE_OBS_ESS_PORT;
|
|
49
|
+
if (raw === undefined || raw === '') return 0;
|
|
50
|
+
const n = Number(raw);
|
|
51
|
+
return Number.isInteger(n) && n >= 0 && n <= 65535 ? n : 0;
|
|
52
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Readiness-probe probe for observability-essentials.
|
|
2
|
+
//
|
|
3
|
+
// AC-7102-1 requires the readiness endpoint to be served at a path
|
|
4
|
+
// SUPPLIED BY PROJECT CONFIGURATION under probeInterface.paths.readiness
|
|
5
|
+
// (no shipped default from v2.0.0), and that path MUST be distinct
|
|
6
|
+
// from the liveness path. This probe boots the fixture with an
|
|
7
|
+
// explicit non-default readiness path and a distinct liveness path
|
|
8
|
+
// (both sourced from the probe's configuration input), then asserts:
|
|
9
|
+
// - a GET at the CONFIGURED readiness path returns 200 body.status=pass
|
|
10
|
+
// when the declared dependency is healthy;
|
|
11
|
+
// - a GET at the CONFIGURED readiness path returns 503 body.status=fail
|
|
12
|
+
// when the declared dependency has failed;
|
|
13
|
+
// - a GET at the SAME readiness path when the liveness path is /live-cfg
|
|
14
|
+
// is NOT reached by the liveness handler (distinctness);
|
|
15
|
+
// - a GET at the liveness path against the same listener returns
|
|
16
|
+
// the liveness body shape, not the readiness body shape.
|
|
17
|
+
//
|
|
18
|
+
// Teardown closes the fixture http server first and propagates any
|
|
19
|
+
// error from a registered teardown callback; a failing teardown fails
|
|
20
|
+
// the verdict.
|
|
21
|
+
//
|
|
22
|
+
// AC-7103-1 (boot-refusal on missing/malformed declaration) and
|
|
23
|
+
// AC-7103-2 (checkedAt within a fixture-configured evaluation budget)
|
|
24
|
+
// are de-claimed with limitations naming the respective ACs.
|
|
25
|
+
|
|
26
|
+
import { randomUUID } from 'node:crypto';
|
|
27
|
+
import { createServer } from 'node:net';
|
|
28
|
+
import { createProbeServer } from '../../../../packages/rcf-lite/test/fixtures/probe-pack-observability-essentials/src/probe-server.mjs';
|
|
29
|
+
import { envPort } from './probe-utils.mjs';
|
|
30
|
+
|
|
31
|
+
export const anchorAcId = 'AC-7102-1';
|
|
32
|
+
export const accountBound = false;
|
|
33
|
+
const AC1 = 'The application serves the readiness endpoint at a';
|
|
34
|
+
|
|
35
|
+
const LIM_7103_1 = `AC-7103-1: requires the readiness dependency set to be declared at boot AND the endpoint to refuse a missing or malformed declaration at boot. This row observes only the checks object shape at request time; the boot-refusal clause is not observed.`;
|
|
36
|
+
const LIM_7103_2 = `AC-7103-2: requires the checks[name].checkedAt timestamp to be no older than an evaluation budget declared in fixture configuration. This row applies a probe-authored 5000 ms upper-bound constant, not a value declared in fixture configuration.`;
|
|
37
|
+
|
|
38
|
+
// Configuration-sourced paths (probe's stand-in for project config
|
|
39
|
+
// under probeInterface.paths.*). Deliberately non-default so the
|
|
40
|
+
// observation cannot be a lucky match against a shipped default.
|
|
41
|
+
const CONFIGURED_PATHS = { liveness: '/live-cfg-v2', readiness: '/readiness-cfg-v2' };
|
|
42
|
+
|
|
43
|
+
async function openStubTcp() {
|
|
44
|
+
return new Promise((resolve, reject) => {
|
|
45
|
+
const s = createServer((sock) => { sock.destroy(); });
|
|
46
|
+
s.once('error', reject);
|
|
47
|
+
s.listen(0, '127.0.0.1', () => resolve({ server: s, port: s.address().port }));
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function get(port, path, headers) {
|
|
52
|
+
const res = await fetch(`http://127.0.0.1:${port}${path}`, { headers });
|
|
53
|
+
const text = await res.text();
|
|
54
|
+
let parsed = null; try { parsed = JSON.parse(text); } catch {}
|
|
55
|
+
return { status: res.status, requestId: res.headers.get('x-request-id'), body: text, parsed };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export default async function runProbe() {
|
|
59
|
+
const srv = createProbeServer({ paths: CONFIGURED_PATHS });
|
|
60
|
+
const stub = await openStubTcp();
|
|
61
|
+
let stubClosed = false;
|
|
62
|
+
srv.addTcpDependency('probe-stub-tcp', '127.0.0.1', stub.port);
|
|
63
|
+
srv.registerTeardown(async () => {
|
|
64
|
+
if (stubClosed) return;
|
|
65
|
+
await new Promise((resolve, reject) => stub.server.close((err) => (err ? reject(err) : resolve())));
|
|
66
|
+
stubClosed = true;
|
|
67
|
+
});
|
|
68
|
+
const { port } = await srv.listen(envPort());
|
|
69
|
+
const results = [];
|
|
70
|
+
const supplied = { host: '127.0.0.1', port: stub.port, name: 'probe-stub-tcp' };
|
|
71
|
+
const readinessPathFromConfig = CONFIGURED_PATHS.readiness;
|
|
72
|
+
const livenessPathFromConfig = CONFIGURED_PATHS.liveness;
|
|
73
|
+
const readinessPathServed = srv.resolvedPaths?.readiness;
|
|
74
|
+
const livenessPathServed = srv.resolvedPaths?.liveness;
|
|
75
|
+
const pathsDistinct = readinessPathFromConfig !== livenessPathFromConfig
|
|
76
|
+
&& readinessPathServed === readinessPathFromConfig
|
|
77
|
+
&& livenessPathServed === livenessPathFromConfig;
|
|
78
|
+
let readyObs, unreadyObs, distinctnessObs, defaultAbsent;
|
|
79
|
+
try {
|
|
80
|
+
// Healthy GET at the CONFIGURED readiness path.
|
|
81
|
+
const rid1 = randomUUID();
|
|
82
|
+
const ready = await get(port, readinessPathFromConfig, { 'x-request-id': rid1 });
|
|
83
|
+
const passEntry = ready.parsed?.checks?.['probe-stub-tcp'];
|
|
84
|
+
readyObs = { status: ready.status, requestId: ready.requestId, echoedBody: ready.parsed?.requestIdEchoed, checks: ready.parsed?.checks };
|
|
85
|
+
// Confirm the shipped default path '/ready' is NOT served (the
|
|
86
|
+
// fixture routes the readiness handler to the CONFIGURED path).
|
|
87
|
+
const defaultRes = await fetch(`http://127.0.0.1:${port}/ready`);
|
|
88
|
+
defaultAbsent = defaultRes.status === 404;
|
|
89
|
+
|
|
90
|
+
results.push({
|
|
91
|
+
anchorAcId: 'AC-7102-1',
|
|
92
|
+
verdict: pathsDistinct && defaultAbsent && ready.status === 200 && ready.parsed?.status === 'pass' && ready.requestId === rid1 ? 'pass' : 'fail',
|
|
93
|
+
detail: `${AC1} - GET ${readinessPathFromConfig} (from probe configuration input, no shipped default) with stub tcp open on port ${stub.port} -> ${ready.status} body.status='${ready.parsed?.status}'; configured liveness path='${livenessPathFromConfig}' is distinct; the shipped default '/ready' returns ${defaultRes.status} (expect 404 = default absent). Observes AC-7102-1 configuration-sourced-path + distinct-from-liveness + 200-on-healthy clauses.`,
|
|
94
|
+
evidence: {
|
|
95
|
+
suppliedInput: rid1,
|
|
96
|
+
derivedResponseHeader: ready.requestId,
|
|
97
|
+
readinessPathFromConfig,
|
|
98
|
+
livenessPathDistinct: `configured='${livenessPathFromConfig}' vs readiness='${readinessPathFromConfig}'`,
|
|
99
|
+
readinessPathServedByFixture: readinessPathServed,
|
|
100
|
+
livenessPathServedByFixture: livenessPathServed,
|
|
101
|
+
defaultReadyStatus: defaultRes.status,
|
|
102
|
+
defaultAbsent,
|
|
103
|
+
pathsDistinct,
|
|
104
|
+
suppliedDependency: supplied,
|
|
105
|
+
observed: readyObs,
|
|
106
|
+
bodyExcerpt: ready.body.slice(0, 300),
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
results.push({
|
|
110
|
+
anchorAcId: null,
|
|
111
|
+
conformanceOnly: true,
|
|
112
|
+
limitation: LIM_7103_1,
|
|
113
|
+
verdict: ready.parsed?.checks && typeof ready.parsed.checks === 'object' && Object.keys(ready.parsed.checks).length === 1 && passEntry ? 'pass' : 'fail',
|
|
114
|
+
detail: `AC-7103-1 boot-declaration: checks object keys=${JSON.stringify(Object.keys(ready.parsed?.checks || {}))}; the boot-refusal clause on AC-7103-1 (missing or malformed declaration refused at boot) is not observed here.`,
|
|
115
|
+
evidence: { checksKeys: Object.keys(ready.parsed?.checks || {}), entry: passEntry },
|
|
116
|
+
});
|
|
117
|
+
results.push({
|
|
118
|
+
anchorAcId: null,
|
|
119
|
+
conformanceOnly: true,
|
|
120
|
+
limitation: LIM_7103_2,
|
|
121
|
+
verdict: passEntry && (passEntry.state === 'pass' || passEntry.state === 'fail') && typeof passEntry.checkedAt === 'string' && !Number.isNaN(Date.parse(passEntry.checkedAt)) && (Date.now() - Date.parse(passEntry.checkedAt)) <= 5000 ? 'pass' : 'fail',
|
|
122
|
+
detail: `AC-7103-2 checked-at budget: checks['probe-stub-tcp'] state='${passEntry?.state}' checkedAt='${passEntry?.checkedAt}'; state in {pass,fail} AND ISO-8601 checkedAt observed. Evaluation-budget upper bound is a probe-authored 5000 ms constant, not a fixture-configured value.`,
|
|
123
|
+
evidence: { entry: passEntry },
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Distinctness observation: GET the configured LIVENESS path,
|
|
127
|
+
// confirm the response is the liveness body shape (no checks{}).
|
|
128
|
+
const ridDistinct = randomUUID();
|
|
129
|
+
const distinct = await get(port, livenessPathFromConfig, { 'x-request-id': ridDistinct });
|
|
130
|
+
distinctnessObs = { status: distinct.status, requestId: distinct.requestId, hasChecks: Boolean(distinct.parsed?.checks), bodyStatus: distinct.parsed?.status };
|
|
131
|
+
results.push({
|
|
132
|
+
anchorAcId: 'AC-7102-1',
|
|
133
|
+
verdict: pathsDistinct && distinct.status === 200 && distinct.parsed?.status === 'pass' && distinctnessObs.hasChecks === false && distinct.requestId === ridDistinct ? 'pass' : 'fail',
|
|
134
|
+
detail: `${AC1} - distinctness: GET ${livenessPathFromConfig} (liveness) -> ${distinct.status} body.status='${distinct.parsed?.status}' checks-present=${distinctnessObs.hasChecks} (readiness body shape carries a checks object; liveness body shape does not). Observes AC-7102-1 readiness-distinct-from-liveness clause.`,
|
|
135
|
+
evidence: {
|
|
136
|
+
suppliedInput: ridDistinct,
|
|
137
|
+
derivedResponseHeader: distinct.requestId,
|
|
138
|
+
readinessPathFromConfig,
|
|
139
|
+
livenessPathDistinct: `configured='${livenessPathFromConfig}' vs readiness='${readinessPathFromConfig}'`,
|
|
140
|
+
observed: distinctnessObs,
|
|
141
|
+
bodyExcerpt: distinct.body.slice(0, 300),
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Unhealthy GET at the CONFIGURED readiness path.
|
|
146
|
+
await new Promise((resolve, reject) => stub.server.close((err) => (err ? reject(err) : resolve())));
|
|
147
|
+
stubClosed = true;
|
|
148
|
+
const rid2 = randomUUID();
|
|
149
|
+
const unready = await get(port, readinessPathFromConfig, { 'x-request-id': rid2 });
|
|
150
|
+
const failEntry = unready.parsed?.checks?.['probe-stub-tcp'];
|
|
151
|
+
unreadyObs = { status: unready.status, requestId: unready.requestId, checks: unready.parsed?.checks, unreadyDependencies: unready.parsed?.unreadyDependencies };
|
|
152
|
+
results.push({
|
|
153
|
+
anchorAcId: 'AC-7102-1',
|
|
154
|
+
verdict: pathsDistinct && unready.status === 503 && unready.parsed?.status === 'fail' && unready.requestId === rid2 && failEntry?.state === 'fail' ? 'pass' : 'fail',
|
|
155
|
+
detail: `${AC1} - after stub tcp closed on port ${stub.port}: GET ${readinessPathFromConfig} -> ${unready.status} body.status='${unready.parsed?.status}' checks['probe-stub-tcp'].state='${failEntry?.state}'; observes AC-7102-1 503+body.status='fail' clause on the configured path.`,
|
|
156
|
+
evidence: {
|
|
157
|
+
suppliedInput: rid2,
|
|
158
|
+
derivedResponseHeader: unready.requestId,
|
|
159
|
+
readinessPathFromConfig,
|
|
160
|
+
livenessPathDistinct: `configured='${livenessPathFromConfig}' vs readiness='${readinessPathFromConfig}'`,
|
|
161
|
+
closedDependency: supplied,
|
|
162
|
+
observed: unreadyObs,
|
|
163
|
+
entry: failEntry,
|
|
164
|
+
bodyExcerpt: unready.body.slice(0, 300),
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
} finally {
|
|
168
|
+
await srv.close();
|
|
169
|
+
}
|
|
170
|
+
return { results, extra: { envDeclared: ['RCF_FIXTURE_OBS_ESS_PORT'], boundPort: port, suppliedDependency: supplied, configuredPaths: CONFIGURED_PATHS, resolvedPaths: srv.resolvedPaths, readyObserved: readyObs, unreadyObserved: unreadyObs, distinctnessObserved: distinctnessObs, defaultReadyPathAbsent: defaultAbsent } };
|
|
171
|
+
}
|
|
@@ -29,7 +29,7 @@ Rules for new topics (inherited from the application-spa, application-api-rest,
|
|
|
29
29
|
|
|
30
30
|
## Id number bands (registry bootstrap)
|
|
31
31
|
|
|
32
|
-
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
|
|
32
|
+
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 policy; 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).
|
|
33
33
|
|
|
34
34
|
This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
|
|
35
35
|
|
|
@@ -74,8 +74,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
74
74
|
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
75
75
|
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
76
76
|
|
|
77
|
-
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.
|
|
78
|
-
|
|
77
|
+
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.
|
|
79
78
|
Row-status caveat: the delivery-ci-workflows seat shipped first (PR #95 merged at 595cab9c on main). This branch was rebased onto that main; the delivery-ci-workflows row reflects the shipped state, and the observability row flips to `shipped v1.0.0` at this branch's merge (the maintainer coordinates that final flip in the merge commit or an immediate follow-up).
|
|
80
79
|
|
|
81
80
|
## Shared expectations for future composing blueprints
|
|
@@ -1,18 +1,43 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.3.7 - 2026-09-11
|
|
4
|
+
|
|
5
|
+
Identifier-pairing rule tightened to equality. `line-shape-and-fields` now records each AC-15101-1/-3/-4 row's supplied correlation id under `suppliedInput` (with the parsed log-line object under `line`) so the row can be verified as `line.correlationId === suppliedInput`; the AC-15101-1 row also carries the observedEmissions list its detail already names. `correlation-id-flow` AC-15102-1 header-absent row records the fixture-minted UUID as an engine-minted `requestId` (with `absentSuppliedInput: true` for readability) instead of a `<no-header>` sentinel that could not equal the echoed value.
|
|
6
|
+
|
|
7
|
+
## 1.3.6 - 2026-09-11
|
|
8
|
+
|
|
9
|
+
redaction-boundary probe now emits one payload per recommended-default category (credential, token, bearer, pii.email, pii.name, pii.address) inside its own runWithCorrelation(randomUUID(), ...) so each row records a per-emission correlation id paired to the emitted line's correlationId; every one of the six mandatory categories AC-15103-1 names is now anchored to AC-15103-1 with derived redacted value AND payload-unmutated observation. The AC-15103-4-shaped row is emitted in its own correlation context and records the supplied/emitted correlationId pair alongside userId preservation and pii.email redaction. Anatomy helper strict-evidence contract tightened: bare `suppliedInput`, `headerName`, `workflowName`, `line.correlationId`, `observed[].supplied` and `observedRoundTrips[].supplied` no longer satisfy the identifier half on their own; each must be paired with the engine's echo of that value (echoedHeader, derivedResponseHeader, a returned resource id, or a log-line correlationId equal to the value the probe supplied).
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
## 1.3.5 - 2026-09-11
|
|
13
|
+
|
|
14
|
+
redaction-boundary probe now wraps each emission in runWithCorrelation(randomUUID(), ...) so every AC-15103-1 row and the AC-15103-4-shaped row carry a real per-emission correlation id as the identifier alongside the derived redacted value; the run-notes claim about redaction-boundary correlation ids is now true to the recorded rows. correlation-id-flow AC-15102-3 row (bare emission with correlationId=null by design) is de-claimed to conformanceOnly, since a bare emission carries no engine-returned identifier.
|
|
15
|
+
|
|
16
|
+
## 1.3.4 - 2026-09-11
|
|
17
|
+
|
|
18
|
+
line-shape-and-fields probe now wraps every emission (per-level, BigInt, reserved-key-collision) in runWithCorrelation(randomUUID(), ...) so each emitted log line carries a real correlation id; the AC-15101-1/-3/-4 rows record the parsed line object plus a correlationIdEchoed identifier and a bodyExcerpt derived value.
|
|
19
|
+
|
|
1
20
|
# observability-logging CHANGELOG
|
|
2
21
|
|
|
22
|
+
## 1.3.3 - 2026-09-11
|
|
23
|
+
|
|
24
|
+
Adds a contributions/probes/ pack (line-shape-and-fields, correlation-id-flow, redaction-boundary) with a fixture-side logger factory and HTTP transport under packages/rcf-lite/test/fixtures/probe-pack-observability-logging/. Probes run against the fixture on Node 24. No account gate.
|
|
25
|
+
|
|
26
|
+
Anchoring: line-shape-and-fields anchors AC-15101-1/3/4 (seven-field minimum with per-field non-empty-string type checks and ISO-8601 timestamp; BigInt folded to a decimal string; reserved-key collision safety). correlation-id-flow anchors AC-15102-1 with BOTH the header-present clause (three varied inbound ids echoed on the response header, response body and emitted log line with a fixture-computed sequence and hash the probe recomputes locally) AND the header-absent clause (fixture mints a v4 UUID, response body carries mintedFromAbsent=true and the correlationId, the emitted line matches); also anchors AC-15102-3 (bare emission with no ambient context carries correlationId=null). The monotonic-sequence row de-claims with the limitation naming AC-15102-1. redaction-boundary anchors AC-15103-1 (top-level recommended-default category folded with `[REDACTED:<category>]` AND the caller's original payload object unmutated after log.info returns) and AC-15103-4 (the { user: { id, pii: { email } } } shape with user.id preserved and user.pii.email redacted, plus caller unmutated). The nested top-level pii row and the bare `note` row de-claim with limitations naming AC-15103-4 and AC-15103-3 respectively. probe-utils normalisation and thrown-error rows carry an evidence object; the fallback anchorAcId is null.
|
|
27
|
+
|
|
3
28
|
## 1.3.1 (register-sweep patch, 2026-09-10)
|
|
4
29
|
|
|
5
30
|
- Register: neutral wording in shipped prose (no capability change).
|
|
6
31
|
|
|
7
|
-
## 1.3.0 (
|
|
32
|
+
## 1.3.0 (2026-09-09)
|
|
8
33
|
|
|
9
34
|
- Removes `sessionInventory` from `capabilities[]`. The section 7c backing requirement never landed on this blueprint: a logging surface does not own or deliver a session-listing surface. The applied `security-auth-clerk` blueprint owns `sessionInventory` through `TAC-1003-security-auth-clerk-session-verifier.interfaces.sessionInventory` (being defined on the security branch tonight); a project that runs Clerk continues to gate the account-settings sessions surface via that capability, unchanged. Shelf-wide grep of `requiresAppliedCapabilities` names no consumer that requires `sessionInventory` from this blueprint; the soft consumer (`application-account-settings` probe pack check `AC-25106-1` via `readAppliedCapabilities`) reads the union across applied blueprints and is unaffected. Removal is reasoned per section 7c, not a downgrade of the semantic surface.
|
|
10
|
-
- Adds `elicits[]` with four apply-time answers: `correlation-header-name` (string, default X-Correlation-Id; ADR-1602), `minimum-log-level` (enum trace/debug/info/warn/error/fatal, default info; ADR-1604), `redaction-categories-additions` (string, default blank; ADR-1603) and `boot-identity-fields` (string, JSON object with environment/serviceName/serviceVersion; REQ-005). Every option value is backed by a must-priority REQ description (section 7c criterion a).
|
|
35
|
+
- Adds `elicits[]` with four apply-time answers: `correlation-header-name` (string, default X-Correlation-Id; ADR-1602), `minimum-log-level` (enum trace/debug/info/warn/error/fatal, default info; ADR-1604), `redaction-categories-additions` (string, default blank; ADR-1603) and `boot-identity-fields` (string, JSON object with environment/serviceName/serviceVersion; REQ-005). Every option value is backed by a must-priority REQ description (section 7c criterion a).
|
|
11
36
|
- Adds `ADR-1605-observability-logging-serialisation-refusal`: BigInt values fold to their decimal string form on the emitted line; circular references and function references are dropped with one stderr notice naming the offending dotted path. Closes the family-pass F-4 chain-contradiction specimen (TAC-1601 internalStructure previously described a BigInt fold while REQ-001 / AC-15101-2 described a drop). TAC-1601 internalStructure and responsibility 4 are rewritten to reference ADR-1605; the F-4 outcome split is separately observable at AC-15101-2 (drop for circular/function) and AC-15101-3 (BigInt fold).
|
|
12
37
|
- Adds `REQ-006` and `US-15109` naming the `auditLog` capability explicitly: the audit-log stream carries actor, target, before, after and correlationId on the shared minimum field set the consumer (application-admin-console AC-21105-1) reads. Backs the `auditLog` token per section 7c.
|
|
13
38
|
- Grows `US-15101` from 2 ACs to 5 ACs: adds AC-15101-3 (BigInt fold oracle), AC-15101-4 (reserved-name collision refusal), AC-15101-5 (ISO-8601 timestamp millisecond oracle). Every existing and new AC on the story carries `disposition`; ACs observing a specific TAC surface carry `ownerRef`.
|
|
14
39
|
- Adds `deliveredBy` to every REQ: REQ-001/002/003/005 point at TAC-1601 or TAC-1602 interfaces the responsibility genuinely carries; REQ-004 delivered by ADR-1604. Closes 5 pass-2 lint findings; per-blueprint `rcf define blueprint lint-consistency` reports zero on pass 1 and pass 2.
|
|
15
|
-
-
|
|
40
|
+
- adds section 7a coverage-note descriptions to US-15106 and US-15108 recording the guide-and-TAC trace outcome (no additional mechanism-specific failure paths named beyond the two ACs each story already binds).
|
|
16
41
|
- Register scan fix (customer-facing register): neutralises historical CHANGELOG entries (1.1.0 and 1.2.0) so shipped content carries no internal author names.
|
|
17
42
|
|
|
18
43
|
## 1.2.0 (visual round, spec 2026-09-06 section 5.4.2, operator Q2 default)
|
|
@@ -21,4 +46,4 @@
|
|
|
21
46
|
|
|
22
47
|
## 1.1.0 (visual round, spec 2026-09-04 section 5.5.2, operator Q2 default)
|
|
23
48
|
|
|
24
|
-
- Declares `capabilities: [auditLog]` on `blueprint.json`. No other change. The new field is additive per section 6 of `blueprint-authoring.md` (an additive optional field with no global-topic change is a minor bump). Keeps a single grammar for capability declaration: consumer blueprints read the union of declared `capabilities[]` on applied blueprints, never the `providesRoles[]` -> capability inference. This is the
|
|
49
|
+
- Declares `capabilities: [auditLog]` on `blueprint.json`. No other change. The new field is additive per section 6 of `blueprint-authoring.md` (an additive optional field with no global-topic change is a minor bump). Keeps a single grammar for capability declaration: consumer blueprints read the union of declared `capabilities[]` on applied blueprints, never the `providesRoles[]` -> capability inference. This is the shipped rule (one grammar, no role-to-capability inference); the section 6a table previously noted `auditLog` as "implicit through the `logging` role" and now names `observability-logging` as the explicit shelf provider. Consumed at apply time by the `application-admin-console` blueprint to gate the audit-log surface (probe pack check `AC-21105-1`).
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Structured single-line JSON emission for a rcf-lite project. General enterprise practice, no vendor lock-in. Ships the shelf-canonical `logging` global topic on `ADR-1601-observability-logging-line-shape` (transferred from `application-api-rest-ADR-304`, retained there as superseded history). Provides the `logging` role for the companion-suggestion mechanism. From 1.1.0, declares `capabilities: [auditLog]` on `blueprint.json` so the application-admin-console probe pack activates the audit-log surface check `AC-21105-1` when this blueprint is applied on the project (one grammar; consumer blueprints read declared capabilities, never a role-to-capability inference).
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> Latest: **v1.3.0
|
|
6
|
+
> Latest: **v1.3.0**. `capabilities: [auditLog]`; elicits: correlation-header-name, minimum-log-level, redaction-categories-additions, boot-identity-fields. See [CHANGELOG.md](CHANGELOG.md).
|
|
7
7
|
|
|
8
8
|
## Apply
|
|
9
9
|
|
|
@@ -27,7 +27,7 @@ The doc set is contributions (copied into the project tree by `rcf define bluepr
|
|
|
27
27
|
|
|
28
28
|
## What it contributes, and what it deliberately does not
|
|
29
29
|
|
|
30
|
-
Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (
|
|
30
|
+
Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (shipped policy 5) and no code.
|
|
31
31
|
|
|
32
32
|
Deliberately not contributed: a specific log-shipping transport (Elastic Common Schema over Logstash, Loki push endpoints, Datadog agent, Splunk HEC); a rotation policy for on-disk log files (the shipped emission target is stdout, and the surrounding platform owns the pipe); a metrics-export surface (out of scope, sits with the metrics-store companion when the shelf ships one); a distributed-tracing surface (spans, propagation, sampling; out of scope for v1). The choice of ECS library (Elastic's, `pino-elastic-common-schema`, a project-authored shim) stays project-side; the blueprint names the ECS-neutral field set the AC binds to.
|
|
33
33
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "observability-logging",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.7",
|
|
4
4
|
"category": "observability",
|
|
5
5
|
"providesRoles": [
|
|
6
6
|
"logging"
|
|
@@ -164,5 +164,6 @@
|
|
|
164
164
|
"kind": "req",
|
|
165
165
|
"path": "requirements/observability-logging-req-006.json"
|
|
166
166
|
}
|
|
167
|
-
]
|
|
167
|
+
],
|
|
168
|
+
"updatedAt": "2026-09-11"
|
|
168
169
|
}
|