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
|
@@ -1,64 +1,318 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* R2 real-account smoke probe.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* puts a 1 KiB payload, gets it back, asserts byte equality, deletes
|
|
7
|
-
* the temporary object.
|
|
4
|
+
* Against a real Cloudflare R2 account (credentials read via the
|
|
5
|
+
* fixture's secrets shim), the probe:
|
|
8
6
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* 1. mints a scratch bucket via S3 CreateBucket,
|
|
8
|
+
* 2. positively records the bucket present in an S3 ListBuckets
|
|
9
|
+
* inventory diff (post-create),
|
|
10
|
+
* 3. opens the shipped facade against that scratch bucket, puts a
|
|
11
|
+
* 1 KiB payload, gets it back byte-equal, lists to prove the key
|
|
12
|
+
* is present, deletes the object, lists again to prove it is
|
|
13
|
+
* absent (real inventory diff; a failed list is a FAIL, never an
|
|
14
|
+
* empty inventory),
|
|
15
|
+
* 4. deletes the scratch bucket via S3 DeleteBucket and confirms it
|
|
16
|
+
* is absent from a post-run ListBuckets inventory diff, recording
|
|
17
|
+
* the HTTP status of the DeleteBucket call and the ListBuckets
|
|
18
|
+
* call on the row itself.
|
|
11
19
|
*
|
|
12
|
-
*
|
|
20
|
+
* Each result row carries its own evidence object; skip records
|
|
21
|
+
* follow the one-unset-variable-per-row rule.
|
|
22
|
+
*
|
|
23
|
+
* Row anchoring:
|
|
24
|
+
* - The account-bound skip anchors AC-28108-1 (the skip acceptance).
|
|
25
|
+
* - The object round trip + inventory diff anchor AC-28108-2 (the
|
|
26
|
+
* live-account round trip).
|
|
27
|
+
* - Bucket lifecycle rows (bucket create / bucket delete / post-run
|
|
28
|
+
* bucket-inventory diff) are recorded as `conformanceOnly: true`
|
|
29
|
+
* with `anchorAcId: null`: no shipped AC states bucket-lifecycle
|
|
30
|
+
* behaviour, and REQ-002's verb contract is the four object-level
|
|
31
|
+
* verbs (putObject / getObject / deleteObject / listObjects), not
|
|
32
|
+
* CreateBucket / DeleteBucket / ListBuckets. The `limitation`
|
|
33
|
+
* field on each row names REQ-002 and explains the gap so a
|
|
34
|
+
* reader sees the property that was NOT observed alongside the
|
|
35
|
+
* observation that WAS made.
|
|
36
|
+
* - Endpoint-resolution failure after the preflight gates all pass
|
|
37
|
+
* is a FAIL anchored to REQ-001 (facade opens on boot), never a
|
|
38
|
+
* compound account skip.
|
|
39
|
+
*
|
|
40
|
+
* accountBound: true.
|
|
13
41
|
*/
|
|
14
42
|
|
|
15
|
-
import { createObjectStore, credentialsFromShim } from '../../../../packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/object-store.mjs';
|
|
16
|
-
import { secretsShim } from '../../../../packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/secrets.mjs';
|
|
17
43
|
import { probeKey } from './probe-utils.mjs';
|
|
18
44
|
|
|
19
45
|
export const accountBound = true;
|
|
46
|
+
export const DECLARED_ENV = Object.freeze([
|
|
47
|
+
'CI_HAS_CLOUDFLARE_ACCOUNT',
|
|
48
|
+
'R2_ACCOUNT_ID',
|
|
49
|
+
'R2_BUCKET',
|
|
50
|
+
'S3_ACCESS_KEY_ID',
|
|
51
|
+
'S3_SECRET_ACCESS_KEY',
|
|
52
|
+
]);
|
|
20
53
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
54
|
+
const AC28108_1_FIRST8 = 'Given CI_HAS_CLOUDFLARE_ACCOUNT is unset, when the r2-real-account-smoke.mjs shim';
|
|
55
|
+
const AC28108_2_FIRST8 = 'Given CI_HAS_CLOUDFLARE_ACCOUNT set alongside a real R2 endpoint';
|
|
56
|
+
const REQ001_FIRST8 = 'The application accesses object storage through a single';
|
|
57
|
+
const AC28108_2_INVENTORY_LIMITATION = 'AC-28108-2: Given CI_HAS_CLOUDFLARE_ACCOUNT set alongside a real R2 endpoint URL, bucket name, and credential pair (all from security-secrets-management), when the r2-real-account-smoke.mjs shim runs, then the facade opens against the R2 bucket, puts a 1 KiB payload, gets it back byte-equal, deletes the temporary object on exit, and the report carries aggregateVerdict pass with accountBoundSkipped absent or false. Not observed on this row: the object round-trip clause is observed on the byte-equal put/get row that anchors AC-28108-2 with the engine-returned ETag; this row records the per-object inventory diff (listObjects before delete, delete, listObjects after delete) which R2 does not surface a per-object engine-returned identifier for (S3 SDK $metadata.requestId returns null on Cloudflare R2 for object-level verbs).';
|
|
58
|
+
const AC28108_2_BUCKET_LIMITATION = 'AC-28108-2: Given CI_HAS_CLOUDFLARE_ACCOUNT set alongside a real R2 endpoint URL, bucket name, and credential pair (all from security-secrets-management), when the r2-real-account-smoke.mjs shim runs, then the facade opens against the R2 bucket, puts a 1 KiB payload, gets it back byte-equal, deletes the temporary object on exit, and the report carries aggregateVerdict pass with accountBoundSkipped absent or false. Not observed on this row: the AC states an object-level round trip on an already-provisioned bucket; this row records bucket-level lifecycle (CreateBucket / DeleteBucket / ListBuckets), which the AC does not state.';
|
|
59
|
+
|
|
60
|
+
function skipResult(reason) {
|
|
61
|
+
return {
|
|
62
|
+
results: [{
|
|
24
63
|
anchorAcId: 'AC-28108-1',
|
|
25
64
|
verdict: 'pass',
|
|
26
|
-
detail:
|
|
65
|
+
detail: `${AC28108_1_FIRST8} - accountBound: skipped (${reason})`,
|
|
27
66
|
accountBoundSkipped: true,
|
|
28
|
-
|
|
29
|
-
|
|
67
|
+
reason,
|
|
68
|
+
evidence: { skip: true, reason, envDeclared: [...DECLARED_ENV] },
|
|
69
|
+
}],
|
|
70
|
+
extra: { accountBoundSkipped: true, reason, envDeclared: [...DECLARED_ENV] },
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function shortId() {
|
|
75
|
+
return Math.random().toString(36).slice(2, 8);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export default async function runProbe() {
|
|
79
|
+
const gate = process.env.CI_HAS_CLOUDFLARE_ACCOUNT;
|
|
80
|
+
if (gate == null || gate === '') return skipResult('CI_HAS_CLOUDFLARE_ACCOUNT unset');
|
|
81
|
+
if (gate !== 'true') return skipResult('CI_HAS_CLOUDFLARE_ACCOUNT (not "true")');
|
|
82
|
+
if (!process.env.R2_ACCOUNT_ID) return skipResult('R2_ACCOUNT_ID unset');
|
|
83
|
+
if (!process.env.R2_BUCKET) return skipResult('R2_BUCKET unset');
|
|
84
|
+
if (!process.env.S3_ACCESS_KEY_ID) return skipResult('S3_ACCESS_KEY_ID unset');
|
|
85
|
+
if (!process.env.S3_SECRET_ACCESS_KEY) return skipResult('S3_SECRET_ACCESS_KEY unset');
|
|
86
|
+
|
|
87
|
+
const { createObjectStore, credentialsFromShim } = await import('../../../../packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/object-store.mjs');
|
|
88
|
+
const { secretsShim } = await import('../../../../packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/secrets.mjs');
|
|
89
|
+
const { createBucketOps } = await import('../../../../packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/bucket-ops.mjs');
|
|
90
|
+
|
|
30
91
|
const r2 = await secretsShim.getSecret('r2Endpoint');
|
|
31
|
-
if (!r2) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
92
|
+
if (!r2 || !r2.endpoint) {
|
|
93
|
+
// All preflight gates passed; endpoint resolution failure is a
|
|
94
|
+
// real facade-open failure, not an account-bound skip.
|
|
95
|
+
return {
|
|
96
|
+
results: [{
|
|
97
|
+
anchorReqId: 'object-storage-s3-REQ-001',
|
|
98
|
+
verdict: 'fail',
|
|
99
|
+
detail: `${REQ001_FIRST8} - endpoint could not be resolved from the secrets shim after all preflight gates passed; this is a facade-open failure, not an account skip`,
|
|
100
|
+
evidence: { endpointResolved: false, envDeclared: [...DECLARED_ENV] },
|
|
101
|
+
}],
|
|
102
|
+
extra: { envDeclared: [...DECLARED_ENV] },
|
|
103
|
+
};
|
|
37
104
|
}
|
|
38
105
|
const credentials = await credentialsFromShim(secretsShim);
|
|
39
|
-
const
|
|
40
|
-
const
|
|
106
|
+
const scratchBucket = `qa-e-s3-${shortId()}`;
|
|
107
|
+
const endpointHostRedacted = new URL(r2.endpoint).host.replace(/^[0-9a-f]+/, '[account-id]');
|
|
108
|
+
const evidence = { endpointHostRedacted, scratchBucket, envDeclared: [...DECLARED_ENV] };
|
|
109
|
+
const results = [];
|
|
110
|
+
const teardown = { deleteObject: null, deleteBucket: null, bucketAbsentAfter: null };
|
|
111
|
+
const bucketOps = createBucketOps({
|
|
41
112
|
endpointUrl: r2.endpoint,
|
|
42
|
-
bucket: r2.bucket,
|
|
43
|
-
credentialsRef: credentials,
|
|
44
113
|
region: 'auto',
|
|
114
|
+
credentials: { accessKeyId: credentials.accessKeyId, secretAccessKey: credentials.secretAccessKey },
|
|
45
115
|
forcePathStyle: false,
|
|
46
|
-
onEvent: (e) => events.push(e),
|
|
47
116
|
});
|
|
48
|
-
|
|
49
|
-
|
|
117
|
+
|
|
118
|
+
let bucketCreated = false;
|
|
119
|
+
let store = null;
|
|
50
120
|
try {
|
|
121
|
+
// 1) Create scratch bucket (anchor REQ-002: put verb).
|
|
122
|
+
const create = await bucketOps.createBucket(scratchBucket);
|
|
123
|
+
bucketCreated = true;
|
|
124
|
+
const createHttpStatus = create && create.$metadata && create.$metadata.httpStatusCode;
|
|
125
|
+
const createRequestId = create && create.$metadata && create.$metadata.requestId;
|
|
126
|
+
|
|
127
|
+
// 2) Inventory diff (REQ-002 list verb): post-create bucket must
|
|
128
|
+
// appear on ListBuckets. Failed list is a FAIL.
|
|
129
|
+
let bucketsAfterCreate;
|
|
130
|
+
let listAfterCreateHttpStatus;
|
|
131
|
+
let listAfterCreateRequestId;
|
|
132
|
+
try {
|
|
133
|
+
const list = await bucketOps.listBuckets();
|
|
134
|
+
bucketsAfterCreate = list.buckets;
|
|
135
|
+
listAfterCreateHttpStatus = list.raw && list.raw.$metadata && list.raw.$metadata.httpStatusCode;
|
|
136
|
+
listAfterCreateRequestId = list.raw && list.raw.$metadata && list.raw.$metadata.requestId;
|
|
137
|
+
} catch (err) {
|
|
138
|
+
results.push({
|
|
139
|
+
anchorAcId: null,
|
|
140
|
+
conformanceOnly: true,
|
|
141
|
+
limitation: AC28108_2_BUCKET_LIMITATION,
|
|
142
|
+
verdict: 'fail',
|
|
143
|
+
detail: `conformanceOnly (${AC28108_2_BUCKET_LIMITATION}) - ListBuckets after CreateBucket threw: ${err && err.message}; failed inventory is a FAIL`,
|
|
144
|
+
evidence: { scratchBucket, error: err && err.message, endpointHostRedacted },
|
|
145
|
+
});
|
|
146
|
+
throw err;
|
|
147
|
+
}
|
|
148
|
+
const seenAfterCreate = bucketsAfterCreate.includes(scratchBucket);
|
|
149
|
+
results.push({
|
|
150
|
+
anchorAcId: null,
|
|
151
|
+
conformanceOnly: true,
|
|
152
|
+
limitation: AC28108_2_BUCKET_LIMITATION,
|
|
153
|
+
verdict: seenAfterCreate ? 'pass' : 'fail',
|
|
154
|
+
detail: seenAfterCreate
|
|
155
|
+
? `conformanceOnly (${AC28108_2_BUCKET_LIMITATION}) - scratch bucket ${scratchBucket} present in ListBuckets after CreateBucket (positive inventory diff on bucket-level lifecycle)`
|
|
156
|
+
: `conformanceOnly (${AC28108_2_BUCKET_LIMITATION}) - scratch bucket ${scratchBucket} NOT in ListBuckets after CreateBucket; buckets=${JSON.stringify(bucketsAfterCreate)}`,
|
|
157
|
+
evidence: {
|
|
158
|
+
scratchBucket,
|
|
159
|
+
seenAfterCreate,
|
|
160
|
+
bucketCount: bucketsAfterCreate.length,
|
|
161
|
+
createBucketHttpStatus: createHttpStatus,
|
|
162
|
+
createBucketRequestId: createRequestId,
|
|
163
|
+
listBucketsHttpStatus: listAfterCreateHttpStatus,
|
|
164
|
+
listBucketsRequestId: listAfterCreateRequestId,
|
|
165
|
+
endpointHostRedacted,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// 3) Open facade against scratch bucket and round-trip (AC-28108-2).
|
|
170
|
+
const events = [];
|
|
171
|
+
store = await createObjectStore({
|
|
172
|
+
endpointUrl: r2.endpoint,
|
|
173
|
+
bucket: scratchBucket,
|
|
174
|
+
credentialsRef: credentials,
|
|
175
|
+
region: 'auto',
|
|
176
|
+
forcePathStyle: false,
|
|
177
|
+
onEvent: (e) => events.push(e),
|
|
178
|
+
});
|
|
51
179
|
await store.ready();
|
|
52
|
-
|
|
180
|
+
const key = probeKey('qa-e-s3/r2-smoke');
|
|
181
|
+
const body = Buffer.alloc(1024, 0x52);
|
|
182
|
+
const put = await store.putObject(key, 'application/octet-stream', body);
|
|
53
183
|
const got = await store.getObject(key);
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
anchorAcId: 'AC-28108-
|
|
57
|
-
verdict:
|
|
58
|
-
detail:
|
|
59
|
-
|
|
184
|
+
const roundTripEqual = got.body.length === body.length && got.body.equals(body);
|
|
185
|
+
results.push({
|
|
186
|
+
anchorAcId: 'AC-28108-2',
|
|
187
|
+
verdict: roundTripEqual ? 'pass' : 'fail',
|
|
188
|
+
detail: roundTripEqual
|
|
189
|
+
? `${AC28108_2_FIRST8} - R2 round-trip byte-equal against ${scratchBucket} through the shipped facade; putObject returned size=${put.size}, getObject body length=${got.body.length}`
|
|
190
|
+
: `${AC28108_2_FIRST8} - R2 round-trip failed byte equality; got ${got.body.length} expected ${body.length}`,
|
|
191
|
+
evidence: {
|
|
192
|
+
eTag: (put && put.eTag) || (got && got.eTag) || null,
|
|
193
|
+
vendorRequestId: (put && put.requestId) || (got && got.requestId) || null,
|
|
194
|
+
scratchBucket,
|
|
195
|
+
key,
|
|
196
|
+
putReturnedSize: put.size,
|
|
197
|
+
getSize: got.body.length,
|
|
198
|
+
byteEqual: roundTripEqual,
|
|
199
|
+
objectPutEvent: events.find((e) => e.event === 'objectPut') || null,
|
|
200
|
+
endpointHostRedacted,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// Real per-object inventory diff (AC-28108-2 covers the delete on
|
|
205
|
+
// exit). A failed list is a FAIL.
|
|
206
|
+
let listBefore;
|
|
207
|
+
try { listBefore = await store.listObjects(key); }
|
|
208
|
+
catch (err) {
|
|
209
|
+
results.push({
|
|
210
|
+
anchorAcId: 'AC-28108-2',
|
|
211
|
+
verdict: 'fail',
|
|
212
|
+
detail: `${AC28108_2_FIRST8} - listObjects before delete threw: ${err && err.message}`,
|
|
213
|
+
evidence: { scratchBucket, key, error: err && err.message },
|
|
214
|
+
});
|
|
215
|
+
throw err;
|
|
216
|
+
}
|
|
217
|
+
const seenBefore = listBefore.keys.includes(key);
|
|
218
|
+
const delRes = await store.deleteObject(key);
|
|
219
|
+
teardown.deleteObject = { key, ok: true, requestId: (delRes && delRes.requestId) || null };
|
|
220
|
+
let listAfter;
|
|
221
|
+
try { listAfter = await store.listObjects(key); }
|
|
222
|
+
catch (err) {
|
|
223
|
+
results.push({
|
|
224
|
+
anchorAcId: 'AC-28108-2',
|
|
225
|
+
verdict: 'fail',
|
|
226
|
+
detail: `${AC28108_2_FIRST8} - listObjects after delete threw: ${err && err.message}`,
|
|
227
|
+
evidence: { scratchBucket, key, error: err && err.message },
|
|
228
|
+
});
|
|
229
|
+
throw err;
|
|
230
|
+
}
|
|
231
|
+
const seenAfter = listAfter.keys.includes(key);
|
|
232
|
+
const inventoryPass = seenBefore && !seenAfter;
|
|
233
|
+
// R2 does not surface a per-object $metadata.requestId on the
|
|
234
|
+
// object-level list/delete verbs, so the inventory-diff row has
|
|
235
|
+
// no engine-returned scalar id. The AC-28108-2 object round-trip
|
|
236
|
+
// clause is anchored on the byte-equal put/get row above (which
|
|
237
|
+
// carries the engine-returned ETag). This row is conformanceOnly
|
|
238
|
+
// and records the per-object inventory diff as positive evidence
|
|
239
|
+
// toward AC-28108-2 without falsely counting as an anchor.
|
|
240
|
+
results.push({
|
|
241
|
+
anchorAcId: null,
|
|
242
|
+
conformanceOnly: true,
|
|
243
|
+
limitation: AC28108_2_INVENTORY_LIMITATION,
|
|
244
|
+
verdict: inventoryPass ? 'pass' : 'fail',
|
|
245
|
+
detail: inventoryPass
|
|
246
|
+
? `conformanceOnly (${AC28108_2_INVENTORY_LIMITATION}) - object inventory diff proves create+delete: key present before delete, absent after (listObjects returned ${listBefore.keys.length} then ${listAfter.keys.length} keys)`
|
|
247
|
+
: `conformanceOnly (${AC28108_2_INVENTORY_LIMITATION}) - inventory diff mismatch: seenBefore=${seenBefore} seenAfter=${seenAfter}`,
|
|
248
|
+
evidence: {
|
|
249
|
+
scratchBucket,
|
|
250
|
+
key,
|
|
251
|
+
seenBefore,
|
|
252
|
+
seenAfter,
|
|
253
|
+
keysBeforeCount: listBefore.keys.length,
|
|
254
|
+
keysAfterCount: listAfter.keys.length,
|
|
255
|
+
endpointHostRedacted,
|
|
256
|
+
},
|
|
257
|
+
});
|
|
60
258
|
} finally {
|
|
61
|
-
|
|
62
|
-
|
|
259
|
+
if (store) {
|
|
260
|
+
try { await store.close(); }
|
|
261
|
+
catch (err) { teardown.facadeClose = { ok: false, error: err && err.message }; }
|
|
262
|
+
}
|
|
263
|
+
if (bucketCreated) {
|
|
264
|
+
let deleteBucketErr = null;
|
|
265
|
+
let del = null;
|
|
266
|
+
try {
|
|
267
|
+
del = await bucketOps.deleteBucket(scratchBucket);
|
|
268
|
+
teardown.deleteBucket = {
|
|
269
|
+
bucket: scratchBucket,
|
|
270
|
+
ok: true,
|
|
271
|
+
httpStatus: del && del.$metadata && del.$metadata.httpStatusCode,
|
|
272
|
+
requestId: del && del.$metadata && del.$metadata.requestId,
|
|
273
|
+
};
|
|
274
|
+
} catch (err) {
|
|
275
|
+
deleteBucketErr = err;
|
|
276
|
+
teardown.deleteBucket = { bucket: scratchBucket, ok: false, error: err && err.message };
|
|
277
|
+
}
|
|
278
|
+
// Post-run bucket inventory
|
|
279
|
+
let postList = null;
|
|
280
|
+
try {
|
|
281
|
+
postList = await bucketOps.listBuckets();
|
|
282
|
+
const stillThere = postList.buckets.includes(scratchBucket);
|
|
283
|
+
teardown.bucketAbsentAfter = {
|
|
284
|
+
ok: !stillThere,
|
|
285
|
+
bucketCount: postList.buckets.length,
|
|
286
|
+
httpStatus: postList.raw && postList.raw.$metadata && postList.raw.$metadata.httpStatusCode,
|
|
287
|
+
requestId: postList.raw && postList.raw.$metadata && postList.raw.$metadata.requestId,
|
|
288
|
+
};
|
|
289
|
+
} catch (err) {
|
|
290
|
+
teardown.bucketAbsentAfter = { ok: false, error: err && err.message };
|
|
291
|
+
}
|
|
292
|
+
const facadeCloseOk = !teardown.facadeClose || teardown.facadeClose.ok !== false;
|
|
293
|
+
const teardownOk = teardown.deleteBucket && teardown.deleteBucket.ok
|
|
294
|
+
&& teardown.bucketAbsentAfter && teardown.bucketAbsentAfter.ok
|
|
295
|
+
&& facadeCloseOk;
|
|
296
|
+
results.push({
|
|
297
|
+
anchorAcId: null,
|
|
298
|
+
conformanceOnly: true,
|
|
299
|
+
limitation: AC28108_2_BUCKET_LIMITATION,
|
|
300
|
+
verdict: teardownOk ? 'pass' : 'fail',
|
|
301
|
+
detail: teardownOk
|
|
302
|
+
? `conformanceOnly (${AC28108_2_BUCKET_LIMITATION}) - scratch bucket ${scratchBucket} deleted and confirmed absent from post-run ListBuckets (deleteBucket http=${teardown.deleteBucket.httpStatus}, listBuckets http=${teardown.bucketAbsentAfter.httpStatus})`
|
|
303
|
+
: `conformanceOnly (${AC28108_2_BUCKET_LIMITATION}) - bucket teardown FAILED: deleteBucket=${JSON.stringify(teardown.deleteBucket)}; bucketAbsentAfter=${JSON.stringify(teardown.bucketAbsentAfter)}; facadeClose=${JSON.stringify(teardown.facadeClose)}${deleteBucketErr ? ` deleteBucketError=${deleteBucketErr.message}` : ''}`,
|
|
304
|
+
evidence: {
|
|
305
|
+
teardown,
|
|
306
|
+
scratchBucket,
|
|
307
|
+
deleteBucketHttpStatus: teardown.deleteBucket && teardown.deleteBucket.httpStatus,
|
|
308
|
+
deleteBucketRequestId: teardown.deleteBucket && teardown.deleteBucket.requestId,
|
|
309
|
+
postRunListHttpStatus: teardown.bucketAbsentAfter && teardown.bucketAbsentAfter.httpStatus,
|
|
310
|
+
postRunListRequestId: teardown.bucketAbsentAfter && teardown.bucketAbsentAfter.requestId,
|
|
311
|
+
facadeCloseOk,
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
bucketOps.close();
|
|
63
316
|
}
|
|
317
|
+
return { results, extra: { evidence, envDeclared: [...DECLARED_ENV], teardown } };
|
|
64
318
|
}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shim: run event-secrecy against the sample-app fixture. The engine
|
|
3
|
+
* descriptor carries a REAL health observation (MinIO /minio/health/live
|
|
4
|
+
* fetch outcome), not a fabricated healthy flag.
|
|
5
|
+
*/
|
|
1
6
|
import runProbe from './event-secrecy.mjs';
|
|
2
|
-
import { runShim } from './probe-utils.mjs';
|
|
3
|
-
|
|
7
|
+
import { runShim, observeMinioEngine } from './probe-utils.mjs';
|
|
8
|
+
|
|
9
|
+
const engine = await observeMinioEngine();
|
|
4
10
|
runShim('event-secrecy', engine, runProbe);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shim: run facade-round-trip against the sample-app fixture
|
|
3
|
-
*
|
|
2
|
+
* Shim: run facade-round-trip against the sample-app fixture. The engine
|
|
3
|
+
* descriptor carries a REAL health observation (MinIO /minio/health/live
|
|
4
|
+
* fetch outcome), not a fabricated healthy flag.
|
|
4
5
|
*/
|
|
5
|
-
|
|
6
6
|
import runProbe from './facade-round-trip.mjs';
|
|
7
|
-
import { runShim } from './probe-utils.mjs';
|
|
7
|
+
import { runShim, observeMinioEngine } from './probe-utils.mjs';
|
|
8
8
|
|
|
9
|
-
const engine =
|
|
9
|
+
const engine = await observeMinioEngine();
|
|
10
10
|
runShim('facade-round-trip', engine, runProbe);
|
package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shim: run hetzner-object-storage-round-trip
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Shim: run hetzner-object-storage-round-trip. Without the account
|
|
3
|
+
* gate the engine descriptor is `observed: false` naming the missing
|
|
4
|
+
* gate; a live run would carry a real request id + http status on the
|
|
5
|
+
* engine, but a real Hetzner branch is not exercised here (the probe
|
|
6
|
+
* account-bound-skips honestly).
|
|
5
7
|
*/
|
|
6
|
-
|
|
7
8
|
import runProbe from './hetzner-object-storage-round-trip.mjs';
|
|
8
9
|
import { runShim } from './probe-utils.mjs';
|
|
9
10
|
|
|
10
|
-
const engine =
|
|
11
|
+
const engine = process.env.CI_HAS_HETZNER_OBJECT_STORAGE === 'true'
|
|
12
|
+
? { kind: 's3', vendor: 'hetzner-object-storage', observed: false, note: 'live run recorded per-request on the probe result rows' }
|
|
13
|
+
: { kind: 's3', vendor: 'hetzner-object-storage', observed: false, reason: 'CI_HAS_HETZNER_OBJECT_STORAGE unset' };
|
|
11
14
|
runShim('hetzner-object-storage-round-trip', engine, runProbe);
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shim: run multipart-upload against the sample-app fixture. The engine
|
|
3
|
+
* descriptor carries a REAL health observation (MinIO /minio/health/live
|
|
4
|
+
* fetch outcome), not a fabricated healthy flag.
|
|
5
|
+
*/
|
|
1
6
|
import runProbe from './multipart-upload.mjs';
|
|
2
|
-
import { runShim } from './probe-utils.mjs';
|
|
3
|
-
|
|
7
|
+
import { runShim, observeMinioEngine } from './probe-utils.mjs';
|
|
8
|
+
|
|
9
|
+
const engine = await observeMinioEngine();
|
|
4
10
|
runShim('multipart-upload', engine, runProbe);
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shim: run presigned-url against the sample-app fixture. The engine
|
|
3
|
+
* descriptor carries a REAL health observation (MinIO /minio/health/live
|
|
4
|
+
* fetch outcome), not a fabricated healthy flag.
|
|
5
|
+
*/
|
|
1
6
|
import runProbe from './presigned-url.mjs';
|
|
2
|
-
import { runShim } from './probe-utils.mjs';
|
|
3
|
-
|
|
7
|
+
import { runShim, observeMinioEngine } from './probe-utils.mjs';
|
|
8
|
+
|
|
9
|
+
const engine = await observeMinioEngine();
|
|
4
10
|
runShim('presigned-url', engine, runProbe);
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shim: run put-get-round-trip against the sample-app fixture.
|
|
2
|
+
* Shim: run put-get-round-trip against the sample-app fixture. The engine
|
|
3
|
+
* descriptor carries a REAL health observation (MinIO /minio/health/live
|
|
4
|
+
* fetch outcome), not a fabricated healthy flag.
|
|
3
5
|
*/
|
|
4
6
|
import runProbe from './put-get-round-trip.mjs';
|
|
5
|
-
import { runShim } from './probe-utils.mjs';
|
|
6
|
-
|
|
7
|
+
import { runShim, observeMinioEngine } from './probe-utils.mjs';
|
|
8
|
+
|
|
9
|
+
const engine = await observeMinioEngine();
|
|
7
10
|
runShim('put-get-round-trip', engine, runProbe);
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shim: run r2-real-account-smoke. The engine descriptor carries a
|
|
3
|
+
* real observation (an S3 ListBuckets against the R2 endpoint from
|
|
4
|
+
* the fixture secrets shim, returning a real requestId + httpStatus)
|
|
5
|
+
* when the account gate is set, otherwise a not-observed descriptor
|
|
6
|
+
* that names the missing gate.
|
|
7
|
+
*/
|
|
1
8
|
import runProbe from './r2-real-account-smoke.mjs';
|
|
2
|
-
import { runShim } from './probe-utils.mjs';
|
|
3
|
-
|
|
9
|
+
import { runShim, observeR2Engine } from './probe-utils.mjs';
|
|
10
|
+
|
|
11
|
+
const engine = await observeR2Engine();
|
|
4
12
|
runShim('r2-real-account-smoke', engine, runProbe);
|
package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"reqId": "object-storage-s3-REQ-006",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
4
|
"title": "Credential-pair discipline via security-secrets-management; refuses composition without",
|
|
5
|
-
"description": "The credential pair (accessKeyId, secretAccessKey) required to sign S3 requests is a secretRef value delegated to security-secrets-management: an opaque string agreed between object-storage-s3 and security-secrets-management naming the secret entry, never the credential value itself. The apply verb refuses composition on a project that has NOT applied security-secrets-management with exit code 3 and the stable message id object-storage-s3-no-secrets on stderr
|
|
5
|
+
"description": "The credential pair (accessKeyId, secretAccessKey) required to sign S3 requests is a secretRef value delegated to security-secrets-management: an opaque string agreed between object-storage-s3 and security-secrets-management naming the secret entry, never the credential value itself. The apply verb refuses composition on a project that has NOT applied security-secrets-management with exit code 3 and the stable message id object-storage-s3-no-secrets on stderr (sibling reservation). The refusal names the required predecessor blueprint (security-secrets-management) and the override flag (--allow-no-secrets-yet). The override records a note on the applied blueprint's source.notes so rcf define validate can later flag the surface as not-yet-activated. The compose-test path checks the pair through the applied secrets facade before the object-store facade opens. The facade factory accepts only the opaque secretRef and a resolver callback: the applying project passes an unresolved secretRef ({ id, provider }) plus a resolver that dereferences it inside the facade module. The factory refuses a plain { accessKeyId, secretAccessKey } object at the boundary; the resolver runs once per boot inside the module and never leaks the resolved pair beyond the S3 client construction call.",
|
|
6
6
|
"category": "security",
|
|
7
7
|
"domain": "object-storage",
|
|
8
8
|
"priority": "must",
|
|
@@ -58,7 +58,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
58
58
|
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
59
59
|
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
60
60
|
|
|
61
|
-
US 28101-28108 sit at the LOW end of the 28101-28899 band on purpose
|
|
61
|
+
US 28101-28108 sit at the LOW end of the 28101-28899 band on purpose. A project-side story mechanically derived from an object-storage-s3 REQ id into the number 28110 would collide against a shipped US-28110; band headroom (28109-28899) leaves that space.
|
|
62
62
|
|
|
63
63
|
ADR/TAC suffixes for this blueprint use the 2901-2999 block, continuing the shelf pattern.
|
|
64
64
|
|
|
@@ -55,7 +55,7 @@ await store.deleteObject('uploads/report.pdf');
|
|
|
55
55
|
const { keys, isTruncated } = await store.listObjects('uploads/');
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
The facade is the sole importer of `@aws-sdk/client-s3` in your source tree per REQ-001. A project-side call site that reaches into the SDK directly is refused at author-side
|
|
58
|
+
The facade is the sole importer of `@aws-sdk/client-s3` in your source tree per REQ-001. A project-side call site that reaches into the SDK directly is refused at the author-side check.
|
|
59
59
|
|
|
60
60
|
## Adapter choice per deploy target
|
|
61
61
|
|
|
@@ -1,5 +1,21 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.1.6 - 2026-09-11
|
|
4
|
+
|
|
5
|
+
metrics-endpoint (status-page) probe now supplies an x-request-id header on the GET /status call and asserts the fixture echoes it; AC-7104-2 and AC-7104-3 rows record the echoed request id as the identifier alongside the derived rendered-state and rendered-order lists. AC-7104-1 (configured-path clause) is de-claimed to conformanceOnly because the shipped probe-server hard-codes '/status' rather than accepting a paths.status option, so the configuration-provenance property is not observed here.
|
|
6
|
+
|
|
7
|
+
## 2.1.5 - 2026-09-11
|
|
8
|
+
|
|
9
|
+
readiness-probe AC-7102-1 anchor now observes the configuration-sourced path clause and the distinct-from-liveness clause. The probe boots the fixture with an explicit non-default readiness path (/readiness-cfg-v2) alongside a distinct liveness path (/live-cfg-v2), asserts the fixture serves the configured readiness path AND that the shipped default /ready returns 404 (default absent) AND that a GET at the configured liveness path returns the liveness body shape (no checks{}). The fixture probe-server accepts { paths: { liveness, readiness } } and refuses boot with PROBE_INTERFACE_PATHS_NOT_DISTINCT when the two are equal.
|
|
10
|
+
|
|
1
11
|
# observability-essentials CHANGELOG
|
|
2
12
|
|
|
13
|
+
## 2.1.4 - 2026-09-11
|
|
14
|
+
|
|
15
|
+
Adds a contributions/probes/ pack (liveness-probe, readiness-probe, metrics-endpoint) with a fixture-side probe server under packages/rcf-lite/test/fixtures/probe-pack-observability-essentials/. Probes run against the fixture on Node 24 with a real TCP dependency the readiness probe controls. No account gate.
|
|
16
|
+
|
|
17
|
+
Anchoring: liveness-probe anchors AC-7101-5 (three-request flow: HTTP 503 empty body on unhealthy; HTTP 503 repeat while predicate stays fail; HTTP 200 body.status='pass' after predicate restored). The healthy warm-up row de-claims with the limitation naming AC-7101-1 (path-from-configuration clause not observed). readiness-probe anchors AC-7102-1 (200 with body.status='pass' when every declared dependency passes; 503 with body.status='fail' when at least one fails, verified by closing a TCP dependency the probe controls). The checks-object shape and checkedAt rows de-claim with limitations naming AC-7103-1 (boot-time missing/malformed declaration refusal not observed) and AC-7103-2 (evaluation-budget bound is a probe-authored 5000 ms constant, not fixture-configured). metrics-endpoint asserts the /status page exact component set, states and rendered order per AC-7104-1. probe-utils normalisation and thrown-error rows carry an evidence object; the fallback anchorAcId is null.
|
|
18
|
+
|
|
3
19
|
## 2.1.2 - 2026-09-10
|
|
4
20
|
|
|
5
21
|
Dimension-d single-definition-ownership cleanup on REQ-007: REQ description now references the JSON media-type header owned on TAC-801.responsibilities[1] rather than restating the header literal. Chain-consistency lint zero on pass 1 and pass 2.
|
|
@@ -8,14 +24,14 @@ Dimension-d single-definition-ownership cleanup on REQ-007: REQ description now
|
|
|
8
24
|
|
|
9
25
|
- Register: neutral wording in shipped prose (no capability change).
|
|
10
26
|
|
|
11
|
-
## 2.1.0 (
|
|
27
|
+
## 2.1.0 (2026-09-09)
|
|
12
28
|
|
|
13
29
|
- Adds `elicits[]` with four apply-time answers: `liveness-probe-path` (string, default /live; REQ-001), `readiness-probe-path` (string, default /ready; REQ-002), `declared-dependency-set` (string, comma-separated; REQ-003), and `notification-outcome-substrate` (enum sqlite/postgres/custom, default sqlite; REQ-006). Every option value is backed by a must-priority REQ description (section 7c criterion a).
|
|
14
30
|
- Adds `deliveredBy` to every REQ (REQ-001/002/003/007/010 -> TAC-801/TAC-802 interface names; REQ-004/005 -> TAC-803; REQ-006 -> TAC-804; REQ-008 -> ADR-804; REQ-009 -> ADR-803). Closes 8 pass-2 lint findings; per-blueprint lint reports zero on pass 1 and pass 2.
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
31
|
+
- AC-7107-3 is a v2-baseline snapshot compatibility check against `blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json` with stable-coded PROBE_BODY_SHAPE_DRIFT on rename or removal.
|
|
32
|
+
- The liveness self-check failure without AC coverage gap is fixed: adds AC-7101-5 asserting a response-capable in-process self-check predicate answers HTTP 503 with content-length 0 on fail and returns to 200 on pass; the AC is `template` because the predicate itself is project-owned.
|
|
33
|
+
- The boot-refuse ACs for dependency declaration gap is fixed: adds AC-7103-4 (deps missing -> READINESS_DEPS_MISSING), AC-7103-5 (duplicate name -> READINESS_DEPS_DUPLICATE, template on the declared set), AC-7103-6 (blank/malformed name -> READINESS_DEPS_MALFORMED).
|
|
34
|
+
- The durable outcome sink gap is fixed: adds AC-7106-4 asserting outcome records survive a sink restart (template on the elicited notification-outcome-substrate) and AC-7106-5 asserting a failed write signals NOTIFICATION_OUTCOME_WRITE_FAILED to the caller and does not fabricate a success record.
|
|
19
35
|
- Re-sweeps every existing AC's `disposition` per section 7b: ACs marked `template` (those whose text references elicited paths, project-declared dependencies, or the elicited substrate) with `templateFillIns` naming which values the applying agent sets; the remaining ACs stay `fixed`.
|
|
20
|
-
-
|
|
21
|
-
-
|
|
36
|
+
- adds `probeBodyShapeCompatibility` interface entry to TAC-802 that owns the cross-probe response body shape contract and names `PROBE_BODY_SHAPE_DRIFT`; updates AC-7107-3.ownerRef from ADR-803.decision.probeBodyShape (which the decision text did not carry) to TAC-802.interfaces.probeBodyShapeCompatibility; moves the v2 baseline snapshot from `packages/rcf-lite/test/blueprint/` to `blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json` so its placement matches its documentation-fixture nature (no suite test read it in the previous location).
|
|
37
|
+
- extends REQ-006 description with a runtime clause per substrate option (`sqlite`, `postgres`, `custom`), literally named and each backed as the accepted values the notification-outcome-substrate elicit resolves at boot (AC-7106-4 exercises the restart path across substrates; AC-7106-5 exercises the failed-write path).
|
|
@@ -31,9 +31,9 @@ The doc set is contributions (copied into the project tree by `rcf define bluepr
|
|
|
31
31
|
|
|
32
32
|
## What it contributes, and what it deliberately does not
|
|
33
33
|
|
|
34
|
-
Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (
|
|
34
|
+
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.
|
|
35
35
|
|
|
36
|
-
No FBS contributions, as a matter of principle (
|
|
36
|
+
No FBS contributions, as a matter of principle (policy): FBSs are the work of the implementing agent, not the blueprint; project constraints have to be applied at the time of creation. The blueprint contributes the WHAT (the liveness probe contract, the readiness probe contract with its dependency-set declaration and cached-state evaluator, the public status page contract with its declared component list and stable notice fields, the notification outcome sink contract with its recordOutcome and queryByRecipient verbs); the implementing agent derives the HOW-tasks (FBS) in the host project, where the ACs contributed here get picked up by the project's own build sequencing.
|
|
37
37
|
|
|
38
38
|
Deliberately not contributed: historical uptime charts and rolling reliability numbers on the status page (out of scope at v1.0.0; see 'Known mechanism-reach gaps' below and the guide 'when it does not fit'); a metrics-export surface (Prometheus scrape endpoints, StatsD emission, OpenTelemetry metrics); a distributed-tracing surface (span emission, propagation, sampling); a log-shipping surface (the application-api-rest blueprint's `logging` topic already governs the wire-log shape; this blueprint neither extends nor conflicts with it); an authenticated operator dashboard for granular internal state (the operator gets granular state through the readiness probe body and through project-authored authenticated surfaces, not through this blueprint); the durable substrate for the notification outcome sink (project-owned; the persistence-data-sqlite blueprint is the natural compose partner). An operator-panel-style authenticated drift surface is deliberately outside this blueprint's scope: `operatorPanel` is claimed by the hello-panel walkthrough exemplar and this blueprint does not overlap it.
|
|
39
39
|
|
package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"// Baseline documented for observability-essentials AC-7107-3": "
|
|
2
|
+
"// Baseline documented for observability-essentials AC-7107-3": "captures the v2 baseline shape of the /live and /ready probe response bodies so a release-time compatibility check can compare a candidate against the current v2 snapshot. A candidate that renames or removes a field named here fails with PROBE_BODY_SHAPE_DRIFT; additions are allowed.",
|
|
3
3
|
"live": {
|
|
4
4
|
"status": "pass",
|
|
5
5
|
"checkedAt": "ISO-8601 timestamp string"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "observability-essentials",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"category": "observability",
|
|
5
5
|
"elicits": [
|
|
6
6
|
{
|
|
@@ -181,5 +181,6 @@
|
|
|
181
181
|
"kind": "adr",
|
|
182
182
|
"path": "adrs/adr-805-observability-essentials-notification-outcome-model.json"
|
|
183
183
|
}
|
|
184
|
-
]
|
|
184
|
+
],
|
|
185
|
+
"updatedAt": "2026-09-11"
|
|
185
186
|
}
|