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,190 @@
|
|
|
1
|
+
// Shared helpers for security-auth-oauth2 probes.
|
|
2
|
+
//
|
|
3
|
+
// Runtime-dependency posture:
|
|
4
|
+
// - Local probes drive shipped-shape checks against the fixture at
|
|
5
|
+
// packages/rcf-lite/test/fixtures/security-auth-oauth2/ without
|
|
6
|
+
// contacting a real identity provider.
|
|
7
|
+
// - authorisation-code-flow-shape probe boots a small local mock
|
|
8
|
+
// authorisation server on a port in the 47400-47449 range (see
|
|
9
|
+
// fixture README) and drives a full RFC 6749 + RFC 7636 PKCE code
|
|
10
|
+
// flow against it: request id, response body excerpts and the
|
|
11
|
+
// final access-token response prove the wire shape locally.
|
|
12
|
+
// - real-account-authorisation-code-flow probe honest-skips on
|
|
13
|
+
// CI_HAS_OAUTH2_PROVIDER: no live commercial IdP is available in
|
|
14
|
+
// this estate. The probe records accountBoundSkipped: true naming
|
|
15
|
+
// CI_HAS_OAUTH2_PROVIDER per rule 7d; the AMBER row on the shelf
|
|
16
|
+
// review is the honest outcome.
|
|
17
|
+
|
|
18
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
19
|
+
import { dirname, resolve } from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
|
|
22
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
export const PROJECT_ROOT = resolve(HERE, '..', '..', '..', '..');
|
|
24
|
+
export const SLUG = 'security-auth-oauth2';
|
|
25
|
+
export const FIXTURE_DIR = resolve(PROJECT_ROOT, 'packages/rcf-lite/test/fixtures/security-auth-oauth2');
|
|
26
|
+
export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/security-auth-oauth2');
|
|
27
|
+
|
|
28
|
+
export const DECLARED_ENV = Object.freeze([
|
|
29
|
+
'CI_HAS_OAUTH2_PROVIDER',
|
|
30
|
+
'OAUTH2_ISSUER_URL',
|
|
31
|
+
'OAUTH2_CLIENT_ID',
|
|
32
|
+
'OAUTH2_CLIENT_SECRET',
|
|
33
|
+
'OAUTH2_REDIRECT_URI',
|
|
34
|
+
'OAUTH2_MOCK_PORT',
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
export const MOCK_PORT_RANGE = { min: 47400, max: 47449 };
|
|
38
|
+
|
|
39
|
+
// First-8-words-of-anchor helper. Each result row's `detail` starts
|
|
40
|
+
// with the first eight words of the anchored AC's or REQ's
|
|
41
|
+
// description text. Anchor lookup walks contributions/user-stories/
|
|
42
|
+
// and contributions/requirements/ under the blueprint root and
|
|
43
|
+
// caches the map on first call. Null / unknown / missing anchors
|
|
44
|
+
// yield an empty prefix.
|
|
45
|
+
import { readFileSync as _rf } from 'node:fs';
|
|
46
|
+
import { readdirSync as _rd } from 'node:fs';
|
|
47
|
+
let _anchorMap = null;
|
|
48
|
+
function _loadAnchorMap() {
|
|
49
|
+
const map = new Map();
|
|
50
|
+
const dirs = [
|
|
51
|
+
{ dir: resolve(PROJECT_ROOT, 'blueprints', SLUG, 'contributions', 'user-stories'), kind: 'ac' },
|
|
52
|
+
{ dir: resolve(PROJECT_ROOT, 'blueprints', SLUG, 'contributions', 'requirements'), kind: 'req' },
|
|
53
|
+
];
|
|
54
|
+
for (const { dir, kind } of dirs) {
|
|
55
|
+
let entries;
|
|
56
|
+
try { entries = _rd(dir); } catch { continue; }
|
|
57
|
+
for (const name of entries) {
|
|
58
|
+
if (!name.endsWith('.json')) continue;
|
|
59
|
+
let j;
|
|
60
|
+
try { j = JSON.parse(_rf(resolve(dir, name), 'utf8')); } catch { continue; }
|
|
61
|
+
if (kind === 'ac') {
|
|
62
|
+
const usId = j.usId;
|
|
63
|
+
for (const ac of (j.acceptanceCriteria || [])) {
|
|
64
|
+
// AC id in the shipped JSON is like "AC-9101-1"; the
|
|
65
|
+
// anchor form used by probes is "<slug>-AC-9101-1".
|
|
66
|
+
const key = `${SLUG}-${ac.id}`;
|
|
67
|
+
map.set(key, ac.description || '');
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
const key = j.reqId; // already "<slug>-REQ-###"
|
|
71
|
+
if (key) map.set(key, j.description || j.title || '');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return map;
|
|
76
|
+
}
|
|
77
|
+
export function first8Words(anchor) {
|
|
78
|
+
if (!anchor) return '';
|
|
79
|
+
if (!_anchorMap) _anchorMap = _loadAnchorMap();
|
|
80
|
+
const txt = _anchorMap.get(anchor) || '';
|
|
81
|
+
if (!txt) return '';
|
|
82
|
+
const words = txt.split(/\s+/).filter(Boolean).slice(0, 8).join(' ');
|
|
83
|
+
return words;
|
|
84
|
+
}
|
|
85
|
+
export function withAnchorPrefix(row) {
|
|
86
|
+
const prefix = first8Words(row.anchorAcId);
|
|
87
|
+
if (!prefix) return row;
|
|
88
|
+
const already = typeof row.detail === 'string' && row.detail.startsWith(prefix);
|
|
89
|
+
if (already) return row;
|
|
90
|
+
const oldDetail = row.detail || '';
|
|
91
|
+
return { ...row, detail: `${prefix} :: ${oldDetail}` };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function aggregate(results) {
|
|
95
|
+
if (!Array.isArray(results) || results.length === 0) return 'fail';
|
|
96
|
+
if (results.some((r) => r.verdict === 'fail')) return 'fail';
|
|
97
|
+
if (results.some((r) => r.verdict === 'warn')) return 'warn';
|
|
98
|
+
return 'pass';
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function isSkipped(results) {
|
|
102
|
+
return results.length > 0 && results.every((r) => r.accountBoundSkipped === true);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function writeReport({ probeName, engine, results, extra }) {
|
|
106
|
+
await mkdir(REPORT_DIR, { recursive: true });
|
|
107
|
+
// Prefix every row's detail with the first eight words of its
|
|
108
|
+
// anchored AC or REQ description; unanchored rows are left alone.
|
|
109
|
+
const prefixedResults = (results || []).map(withAnchorPrefix);
|
|
110
|
+
const raw = aggregate(prefixedResults);
|
|
111
|
+
const aggregateVerdict = isSkipped(prefixedResults) ? 'pass' : raw;
|
|
112
|
+
const report = {
|
|
113
|
+
slug: 'security-auth-oauth2',
|
|
114
|
+
probeName,
|
|
115
|
+
runAt: new Date().toISOString(),
|
|
116
|
+
engine,
|
|
117
|
+
results: prefixedResults,
|
|
118
|
+
aggregateVerdict,
|
|
119
|
+
...(extra ?? {}),
|
|
120
|
+
};
|
|
121
|
+
const path = resolve(REPORT_DIR, `${probeName}.json`);
|
|
122
|
+
await writeFile(path, JSON.stringify(report, null, 2) + '\n', 'utf8');
|
|
123
|
+
return { report, path };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export async function runShim(probeName, engine, mainFn) {
|
|
127
|
+
try {
|
|
128
|
+
const outcome = await mainFn();
|
|
129
|
+
if (!outcome || !Array.isArray(outcome.results) || outcome.results.length === 0) {
|
|
130
|
+
const results = [{
|
|
131
|
+
anchorAcId: 'unknown',
|
|
132
|
+
verdict: 'fail',
|
|
133
|
+
detail: 'no checks ran',
|
|
134
|
+
}];
|
|
135
|
+
const { report, path } = await writeReport({ probeName, engine, results });
|
|
136
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
137
|
+
process.stderr.write(`no-checks-ran fail written to ${path}\n`);
|
|
138
|
+
process.exitCode = 1;
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const { results, extra } = outcome;
|
|
142
|
+
const { report, path } = await writeReport({ probeName, engine, results, extra });
|
|
143
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
144
|
+
process.stdout.write(`report written to ${path}\n`);
|
|
145
|
+
if (report.aggregateVerdict === 'fail') process.exitCode = 1;
|
|
146
|
+
} catch (err) {
|
|
147
|
+
const results = [{
|
|
148
|
+
anchorAcId: 'unknown',
|
|
149
|
+
verdict: 'fail',
|
|
150
|
+
detail: `probe threw: ${err && err.message ? err.message : String(err)}`,
|
|
151
|
+
}];
|
|
152
|
+
const { report, path } = await writeReport({ probeName, engine, results });
|
|
153
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
154
|
+
process.stderr.write(`probe error: ${err && err.stack ? err.stack : String(err)}\n`);
|
|
155
|
+
process.stderr.write(`report written to ${path}\n`);
|
|
156
|
+
process.exitCode = 1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// De-claim helper. When the shipped AC does not observe what the probe observes, the row keeps its
|
|
161
|
+
// verdict, evidence and engine as they are, but the anchor drops to null and the
|
|
162
|
+
// row carries conformanceOnly:true plus a limitation string naming the AC that
|
|
163
|
+
// this probe does NOT observe and why. The integration-harness follow-up (the auth integration harness follow-up)
|
|
164
|
+
// is the surface where those AC-level properties become observable.
|
|
165
|
+
export function deClaim(row, { ac, limitation }) {
|
|
166
|
+
const acId = ac || 'unknown-AC';
|
|
167
|
+
const limText = (limitation || '').trim();
|
|
168
|
+
const finalLim = /^(security-[a-z0-9-]+-)?(AC|REQ)-/.test(limText) ? limText : (limText ? `${acId}: ${limText}` : `${acId}: not observable at this probe surface; needs the integration harness (the auth integration harness follow-up)`);
|
|
169
|
+
const out = { ...row };
|
|
170
|
+
out.anchorAcId = null;
|
|
171
|
+
if ('anchorReqId' in out) delete out.anchorReqId;
|
|
172
|
+
out.conformanceOnly = true;
|
|
173
|
+
out.limitation = finalLim;
|
|
174
|
+
const tag = ` :: conformance-only (${finalLim})`;
|
|
175
|
+
if (typeof out.detail === 'string' && !out.detail.includes('conformance-only')) {
|
|
176
|
+
out.detail = out.detail + tag;
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function accountBoundSkippedResult(anchorAcId, capability, reason) {
|
|
182
|
+
return {
|
|
183
|
+
anchorAcId,
|
|
184
|
+
capability,
|
|
185
|
+
verdict: 'pass',
|
|
186
|
+
accountBoundSkipped: true,
|
|
187
|
+
reason,
|
|
188
|
+
detail: `accountBoundSkipped: ${reason} unset; probe did not execute against a real OAuth 2.0 provider. Set the missing var and re-run.`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Provider-adapter shape probe. Conformance-only. Every row records
|
|
2
|
+
// anchorAcId=null with a limitation naming the shipped AC whose
|
|
3
|
+
// route/boot property the local validator/selector helper does not
|
|
4
|
+
// exercise. The integration harness follow-up is the surface where
|
|
5
|
+
// the AC-level properties become observable.
|
|
6
|
+
//
|
|
7
|
+
// capability: principalDirectory. engine: fixture. accountBound: false.
|
|
8
|
+
|
|
9
|
+
import { pathToFileURL } from 'node:url';
|
|
10
|
+
import { resolve, dirname } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { deClaim } from './probe-utils.mjs';
|
|
13
|
+
|
|
14
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
const FIXTURE_SRC = resolve(HERE, '..', '..', '..', '..', 'packages', 'rcf-lite', 'test', 'fixtures', 'security-auth-oauth2', 'src');
|
|
16
|
+
|
|
17
|
+
export const anchorAcId = null;
|
|
18
|
+
export const capability = 'principalDirectory';
|
|
19
|
+
export const accountBound = false;
|
|
20
|
+
|
|
21
|
+
const LIM_VAL = 'security-auth-oauth2-AC-10111-2: probe calls a validator helper; the AC states the mechanism refuses at boot with a stable-coded error, needs the boot lifecycle (auth integration harness follow-up).';
|
|
22
|
+
const LIM_SEL1 = 'security-auth-oauth2-AC-10109-1: probe checks selector known-name only; the AC states the second-provider sign-in round-trip issues a project session, needs the integration harness (the auth integration harness follow-up).';
|
|
23
|
+
const LIM_SEL2 = 'security-auth-oauth2-AC-10109-2: probe calls a selector helper; the AC states the sign-in route refuses an unknown provider and the redirect guard blocks it, needs the integration harness (the auth integration harness follow-up).';
|
|
24
|
+
|
|
25
|
+
export default async function runProbe() {
|
|
26
|
+
const { chooseDiscoveryUrl, selectProvider, knownProviders } = await import(pathToFileURL(resolve(FIXTURE_SRC, 'provider-adapter.mjs')).href);
|
|
27
|
+
const results = [];
|
|
28
|
+
|
|
29
|
+
const good = chooseDiscoveryUrl('https://accounts.example.com/');
|
|
30
|
+
results.push(deClaim({
|
|
31
|
+
capability,
|
|
32
|
+
verdict: good.ok && good.discoveryUrl === 'https://accounts.example.com/.well-known/openid-configuration' ? 'pass' : 'fail',
|
|
33
|
+
detail: `validator accepts well-formed https issuer: discoveryUrl=${good.discoveryUrl}`,
|
|
34
|
+
evidence: { input: 'https://accounts.example.com/', adapterReturn: good },
|
|
35
|
+
vendorCitation: { url: 'https://openid.net/specs/openid-connect-discovery-1_0.html', verifiedOn: '2026-09-11' },
|
|
36
|
+
}, { ac: 'security-auth-oauth2-AC-10111-2', limitation: LIM_VAL }));
|
|
37
|
+
|
|
38
|
+
const insecure = chooseDiscoveryUrl('http://insecure.example.com');
|
|
39
|
+
results.push(deClaim({
|
|
40
|
+
capability,
|
|
41
|
+
verdict: !insecure.ok && /must use https/.test(insecure.error) ? 'pass' : 'fail',
|
|
42
|
+
detail: `insecure-issuer refused (helper level): error=${JSON.stringify(insecure.error)}`,
|
|
43
|
+
evidence: { input: 'http://insecure.example.com', adapterReturn: insecure },
|
|
44
|
+
vendorCitation: { url: 'https://datatracker.ietf.org/doc/html/rfc6749#section-3.1', verifiedOn: '2026-09-11' },
|
|
45
|
+
}, { ac: 'security-auth-oauth2-AC-10111-2', limitation: LIM_VAL }));
|
|
46
|
+
|
|
47
|
+
const knownOk = selectProvider('auth0');
|
|
48
|
+
results.push(deClaim({
|
|
49
|
+
capability: 'credentialSelfService',
|
|
50
|
+
verdict: knownOk.ok && knownOk.provider === 'auth0' ? 'pass' : 'fail',
|
|
51
|
+
detail: `selector known-name resolves: ok=${knownOk.ok} provider=${knownOk.provider}`,
|
|
52
|
+
evidence: { adapterReturn: knownOk, knownProviders },
|
|
53
|
+
}, { ac: 'security-auth-oauth2-AC-10109-1', limitation: LIM_SEL1 }));
|
|
54
|
+
|
|
55
|
+
const unknownRef = selectProvider('atlantis-single-signon');
|
|
56
|
+
results.push(deClaim({
|
|
57
|
+
capability: 'credentialSelfService',
|
|
58
|
+
verdict: !unknownRef.ok && /unknown provider/.test(unknownRef.error) ? 'pass' : 'fail',
|
|
59
|
+
detail: `selector refuses unknown provider (helper level): error=${JSON.stringify(unknownRef.error)}`,
|
|
60
|
+
evidence: { adapterReturn: unknownRef },
|
|
61
|
+
}, { ac: 'security-auth-oauth2-AC-10109-2', limitation: LIM_SEL2 }));
|
|
62
|
+
|
|
63
|
+
return { results, extra: {} };
|
|
64
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Real-account authorisation-code-flow probe for security-auth-
|
|
2
|
+
// oauth2. Runs the RFC 6749 code flow with RFC 7636 PKCE against a
|
|
3
|
+
// real, commercial OAuth 2.0 authorisation server when the estate
|
|
4
|
+
// has one wired.
|
|
5
|
+
//
|
|
6
|
+
// This estate does NOT have a live commercial IdP available. The
|
|
7
|
+
// probe honest-skips when the gate variables are not set, and when
|
|
8
|
+
// credentials ARE supplied the probe explicitly reports that the
|
|
9
|
+
// live-provider branch is not yet implemented and returns a FAIL
|
|
10
|
+
// per rule (never a misleading pass).
|
|
11
|
+
//
|
|
12
|
+
// capability: authorisationCodeFlow.
|
|
13
|
+
// Anchor: AC-10110-2 (a live public-provider smoke
|
|
14
|
+
// against a real IdP completes a full authorisation-code + PKCE
|
|
15
|
+
// round-trip and issues a project session).
|
|
16
|
+
// accountBound: true.
|
|
17
|
+
|
|
18
|
+
import { DECLARED_ENV, accountBoundSkippedResult } from './probe-utils.mjs';
|
|
19
|
+
|
|
20
|
+
export const anchorAcId = 'security-auth-oauth2-AC-10110-2';
|
|
21
|
+
export const capability = 'authorisationCodeFlow';
|
|
22
|
+
export const accountBound = true;
|
|
23
|
+
|
|
24
|
+
const SECOND_TIER_VARS = ['OAUTH2_ISSUER_URL', 'OAUTH2_CLIENT_ID', 'OAUTH2_CLIENT_SECRET', 'OAUTH2_REDIRECT_URI'];
|
|
25
|
+
|
|
26
|
+
function gateResult(varName, value) {
|
|
27
|
+
// Distinguishes unset from set-but-not-true per rule 4 of the master brief.
|
|
28
|
+
if (value === undefined || value === '') {
|
|
29
|
+
return { kind: 'unset', reason: varName };
|
|
30
|
+
}
|
|
31
|
+
if (value !== 'true') {
|
|
32
|
+
return { kind: 'set-not-true', reason: `${varName}_SET_NOT_TRUE`, observedValue: value };
|
|
33
|
+
}
|
|
34
|
+
return { kind: 'true' };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default async function runProbe() {
|
|
38
|
+
const gate = gateResult('CI_HAS_OAUTH2_PROVIDER', process.env.CI_HAS_OAUTH2_PROVIDER);
|
|
39
|
+
if (gate.kind === 'unset') {
|
|
40
|
+
return {
|
|
41
|
+
results: [accountBoundSkippedResult(anchorAcId, capability, 'CI_HAS_OAUTH2_PROVIDER')],
|
|
42
|
+
extra: {
|
|
43
|
+
accountBoundSkipped: true,
|
|
44
|
+
reason: 'CI_HAS_OAUTH2_PROVIDER',
|
|
45
|
+
envDeclared: [...DECLARED_ENV],
|
|
46
|
+
note: 'No live commercial OAuth 2.0 IdP is available in this estate. Local shipped-shape evidence is authorisation-code-flow-shape against the fixture mock. The live branch reads AMBER on criterion e until an IdP is wired.',
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (gate.kind === 'set-not-true') {
|
|
51
|
+
return {
|
|
52
|
+
results: [{
|
|
53
|
+
anchorAcId, capability, verdict: 'fail',
|
|
54
|
+
detail: `AC-10110-2 gate: CI_HAS_OAUTH2_PROVIDER is set to "${gate.observedValue}" (not the string "true"). Gate refuses this shape; set the variable to the exact string "true" to run the live branch.`,
|
|
55
|
+
evidence: { gate: 'CI_HAS_OAUTH2_PROVIDER', observedValue: gate.observedValue, expected: 'true', status: 400 },
|
|
56
|
+
}],
|
|
57
|
+
extra: { gateMisconfigured: true, gate: 'CI_HAS_OAUTH2_PROVIDER', envDeclared: [...DECLARED_ENV] },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Second-tier variable check: one result row per unset variable
|
|
62
|
+
// per rule 4 of the master brief.
|
|
63
|
+
const unsetRows = [];
|
|
64
|
+
for (const v of SECOND_TIER_VARS) {
|
|
65
|
+
if (!process.env[v]) {
|
|
66
|
+
unsetRows.push({
|
|
67
|
+
anchorAcId, capability, verdict: 'pass', accountBoundSkipped: true, reason: v,
|
|
68
|
+
detail: `accountBoundSkipped: ${v} unset. AC-10110-2 requires a live public provider; set ${v} to run the live branch.`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (unsetRows.length > 0) {
|
|
73
|
+
return {
|
|
74
|
+
results: unsetRows,
|
|
75
|
+
extra: { accountBoundSkipped: true, unsetVars: unsetRows.map((r) => r.reason), envDeclared: [...DECLARED_ENV] },
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Credentials present but the live branch is not implemented in
|
|
80
|
+
// this estate. Return FAIL with an explicit named-not-implemented
|
|
81
|
+
// detail (never a misleading pass).
|
|
82
|
+
return {
|
|
83
|
+
results: [{
|
|
84
|
+
anchorAcId, capability, verdict: 'fail',
|
|
85
|
+
detail: 'AC-10110-2 live branch is NOT IMPLEMENTED. Every gate variable is set, but the estate has no wired live commercial IdP and no round-trip code has been authored. Supplying credentials does not silently pass; the branch must be implemented before this result flips to pass. Local shipped-shape evidence is authorisation-code-flow-shape against the fixture mock; the live branch remains AMBER until an IdP is wired.',
|
|
86
|
+
}],
|
|
87
|
+
extra: {
|
|
88
|
+
envDeclared: [...DECLARED_ENV],
|
|
89
|
+
liveBranchImplemented: false,
|
|
90
|
+
note: 'implement round-trip against OAUTH2_ISSUER_URL/OAUTH2_CLIENT_ID/OAUTH2_CLIENT_SECRET/OAUTH2_REDIRECT_URI here when a live IdP is added to the estate',
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
package/blueprints/security-auth-oauth2/contributions/probes/run-authorisation-code-flow-shape.mjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './authorisation-code-flow-shape.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'fixture', image: 'in-process mock RFC 6749 + RFC 7636 server on 127.0.0.1', healthy: true };
|
|
4
|
+
runShim('authorisation-code-flow-shape', engine, runProbe);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './real-account-authorisation-code-flow.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'oauth2-provider' /* live-provider branch is honest-skip; slug AMBER */, image: 'commercial OAuth 2.0 authorisation server (or skipped)', healthy: true };
|
|
4
|
+
runShim('real-account-authorisation-code-flow', engine, runProbe);
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Session-bridge shape probe. Conformance-only. Every row records
|
|
2
|
+
// anchorAcId=null with a limitation naming the shipped AC whose
|
|
3
|
+
// request/cookie property the local bridge observation does not
|
|
4
|
+
// exercise. The integration harness follow-up is the surface where
|
|
5
|
+
// the AC-level properties become observable.
|
|
6
|
+
//
|
|
7
|
+
// capability: sessionInventory. engine: fixture. accountBound: false.
|
|
8
|
+
|
|
9
|
+
import { pathToFileURL } from 'node:url';
|
|
10
|
+
import { resolve, dirname } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { deClaim } from './probe-utils.mjs';
|
|
13
|
+
|
|
14
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
const FIXTURE_SRC = resolve(HERE, '..', '..', '..', '..', 'packages', 'rcf-lite', 'test', 'fixtures', 'security-auth-oauth2', 'src');
|
|
16
|
+
|
|
17
|
+
export const anchorAcId = null;
|
|
18
|
+
export const capability = 'sessionInventory';
|
|
19
|
+
export const accountBound = false;
|
|
20
|
+
|
|
21
|
+
const LIM_P = 'security-auth-oauth2-AC-10106-1: probe returns a bridged session object; the AC states request.auth carries a Principal on a protected request, needs the integration harness (the auth integration harness follow-up).';
|
|
22
|
+
const LIM_LEAK = 'security-auth-oauth2-AC-10106-3: probe inspects the bridge return; the AC states request.auth on a protected request does not expose provider tokens, needs the integration harness (the auth integration harness follow-up).';
|
|
23
|
+
const LIM_H = 'security-auth-oauth2-AC-10101-3: probe inspects a bridge handle string; the AC states the session cookie carries an opaque project handle, needs a real cookie set at the response, needs the integration harness (the auth integration harness follow-up).';
|
|
24
|
+
const LIM_INV = 'security-auth-oauth2-AC-10106-2: probe uses malformed provider inputs; the AC states a request lacking a valid handle is refused before session issue, needs the integration harness (the auth integration harness follow-up).';
|
|
25
|
+
|
|
26
|
+
export default async function runProbe() {
|
|
27
|
+
const { bridgeSession } = await import(pathToFileURL(resolve(FIXTURE_SRC, 'provider-adapter.mjs')).href);
|
|
28
|
+
const results = [];
|
|
29
|
+
|
|
30
|
+
const good = bridgeSession({
|
|
31
|
+
tokenResponse: { access_token: 'tok-abc', expires_in: 3600, scope: 'openid profile' },
|
|
32
|
+
userinfo: { sub: 'user-123', email: 'u@example.com' },
|
|
33
|
+
});
|
|
34
|
+
results.push(deClaim({
|
|
35
|
+
capability,
|
|
36
|
+
verdict: good.ok && good.session && good.session.principalId === 'user-123' ? 'pass' : 'fail',
|
|
37
|
+
detail: `bridge returns session with principalId: ok=${good.ok} principalId=${good.session && good.session.principalId}`,
|
|
38
|
+
evidence: { adapterReturn: good },
|
|
39
|
+
}, { ac: 'security-auth-oauth2-AC-10106-1', limitation: LIM_P }));
|
|
40
|
+
|
|
41
|
+
const sessionKeys = good.ok ? Object.keys(good.session) : [];
|
|
42
|
+
const providerTokenLeaks = sessionKeys.filter((k) => /^(access|refresh|id)_?[Tt]oken$/.test(k));
|
|
43
|
+
results.push(deClaim({
|
|
44
|
+
capability,
|
|
45
|
+
verdict: good.ok && providerTokenLeaks.length === 0 ? 'pass' : 'fail',
|
|
46
|
+
detail: `bridge return omits provider tokens: sessionKeys=${JSON.stringify(sessionKeys)} leaks=${JSON.stringify(providerTokenLeaks)}`,
|
|
47
|
+
evidence: { sessionKeys, providerTokenLeaks },
|
|
48
|
+
}, { ac: 'security-auth-oauth2-AC-10106-3', limitation: LIM_LEAK }));
|
|
49
|
+
|
|
50
|
+
const handleOk = good.ok
|
|
51
|
+
&& typeof good.session.handle === 'string'
|
|
52
|
+
&& good.session.handle.length >= 20
|
|
53
|
+
&& !good.session.handle.includes('tok-abc');
|
|
54
|
+
results.push(deClaim({
|
|
55
|
+
capability,
|
|
56
|
+
verdict: handleOk ? 'pass' : 'fail',
|
|
57
|
+
detail: `bridge handle is opaque and not derived from access_token: handleLen=${good.session && good.session.handle && good.session.handle.length}`,
|
|
58
|
+
evidence: { handlePrefix: good.session && good.session.handle && good.session.handle.slice(0, 4), handleLen: good.session && good.session.handle && good.session.handle.length },
|
|
59
|
+
}, { ac: 'security-auth-oauth2-AC-10101-3', limitation: LIM_H }));
|
|
60
|
+
|
|
61
|
+
const missingSub = bridgeSession({ tokenResponse: { access_token: 'tok-abc' }, userinfo: {} });
|
|
62
|
+
results.push(deClaim({
|
|
63
|
+
capability,
|
|
64
|
+
verdict: !missingSub.ok && /userinfo\.sub/.test(missingSub.error) ? 'pass' : 'fail',
|
|
65
|
+
detail: `bridge refuses missing userinfo.sub: ok=${missingSub.ok} error=${JSON.stringify(missingSub.error)}`,
|
|
66
|
+
evidence: { adapterReturn: missingSub },
|
|
67
|
+
}, { ac: 'security-auth-oauth2-AC-10106-2', limitation: LIM_INV }));
|
|
68
|
+
|
|
69
|
+
const missingTok = bridgeSession({ tokenResponse: {}, userinfo: { sub: 'x' } });
|
|
70
|
+
results.push(deClaim({
|
|
71
|
+
capability,
|
|
72
|
+
verdict: !missingTok.ok && /access_token/.test(missingTok.error) ? 'pass' : 'fail',
|
|
73
|
+
detail: `bridge refuses missing access_token: ok=${missingTok.ok} error=${JSON.stringify(missingTok.error)}`,
|
|
74
|
+
evidence: { adapterReturn: missingTok },
|
|
75
|
+
}, { ac: 'security-auth-oauth2-AC-10106-2', limitation: LIM_INV }));
|
|
76
|
+
|
|
77
|
+
return { results, extra: {} };
|
|
78
|
+
}
|
|
@@ -70,8 +70,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
70
70
|
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
71
71
|
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
72
72
|
|
|
73
|
-
US 10101-10111 sit at the LOW end of the 10101-10899 band on purpose. A project-side story that mechanically derives from a security-auth-oauth2 REQ id into the number `10111` would collide against security-auth-oauth2-US-10111 in this package; the band leaves headroom at the HIGH end (US 10181-10899) so a project's own stories anchored to security-auth-oauth2 REQs can allocate without conflict.
|
|
74
|
-
|
|
73
|
+
US 10101-10111 sit at the LOW end of the 10101-10899 band on purpose. A project-side story that mechanically derives from a security-auth-oauth2 REQ id into the number `10111` would collide against security-auth-oauth2-US-10111 in this package; the band leaves headroom at the HIGH end (US 10181-10899) so a project's own stories anchored to security-auth-oauth2 REQs can allocate without conflict.
|
|
75
74
|
The ADR/TAC suffix block 1101-1199 is the second block to cross into the four-digit suffix space; `security-auth-clerk` opened the four-digit door at 1001-1099. Every shipped blueprint continues to load, validate, and audit against this shape without a schema change: rcf-schemas 0.5.0 `adrId` and `tacId` patterns are `^ADR-\d{3,}(-[a-z0-9]+...)?$` (three-digit minimum, unbounded above); four-digit and higher suffixes validate verbatim. The registry table above records the growth for a downstream author reaching for the next block.
|
|
76
75
|
|
|
77
76
|
## Shared expectations for future composing blueprints
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# security-secrets-management changelog
|
|
2
2
|
|
|
3
|
+
## 1.1.5 - 2026-09-11
|
|
4
|
+
|
|
5
|
+
- Criterion-e probe pack refinement: every conformance-only result row now records `anchorAcId: null` alongside a `limitation` that opens with a shipped AC id from the blueprint's user stories (all ten SOPS-native rows move from `REQ-002` to `AC-8102-1`, the manager-module surface these probes do not observe). Detail strings on de-claimed rows describe only what was observed at the SOPS crypto layer and no longer name REQ-002. The anatomy helper enforces conformance-only rows to satisfy `anchorAcId === null`, requires limitations to open with an `AC-<n>-<n>` id that resolves to a shipped acceptance criterion on the blueprint's user stories (REQ-prefixed anchors are refused and fabricated ids are rejected), and does not count pre-delete presence as an absence observation on the inventory-diff shape.
|
|
6
|
+
|
|
7
|
+
## 1.1.4 - 2026-09-11
|
|
8
|
+
|
|
9
|
+
- Every SOPS-native result row is now marked `conformanceOnly: true` with a limitation naming the shipped AC that these SOPS-native operations do not observe (the manager-client boundary). Anchors stay `null` as before. Anatomy helper enforces field COMBINATIONS per shape; bare diagnostic evidence like `{macDiverged}`, `{sameRecipients}` or `{status,matched}` passes only under the `conformanceOnly` + limitation shape. This pack is criterion-e conformance evidence pending the manager-client probe follow-up.
|
|
10
|
+
|
|
11
|
+
## 1.1.3 - 2026-09-11
|
|
12
|
+
|
|
13
|
+
- Added a criterion-e probe pack (`contributions/probes/`) covering the secretsProvider capability across four probes running against real `sops(1)` + `age(1)` engines with throwaway keypairs the probes self-provision and self-clean under `RCF_SECRETS_SCRATCH_DIR`: `encrypt-decrypt-round-trip` (scratch scope encrypt then decrypt; sops metadata captured as evidence excerpts), `add-recipient-rotation` (`--rotate --add-age` extends recipient list, regenerates mac, and lets the new recipient decrypt), `key-rotation` (`--rotate` re-keys the payload without changing recipients), and `mismatched-key-refusal` (foreign-key decrypt returns non-zero with no plaintext). The estate vault at `.vault/scopes/` is never touched. Fixture at `packages/rcf-lite/test/fixtures/security-secrets-management/` declares every env var the pack reads; anatomy test pins pack shape, fixture manifest and per-probe aggregate pass on the real engine.
|
|
14
|
+
- Iteration on the probe pack: byte-equality is a real byte-buffer compare on `--input-type binary --output-type binary` streams; the SHA-256 witnesses stay in `evidence.byteCompare` alongside the byte-length + `Buffer.compare === 0` assertion. `aggregate([])` and null-result normalisation now report `detail: 'no checks ran'` exactly. Slug reads AMBER on criterion e until a manager-client probe is added that observes `AC-8102-1` at the module boundary.
|
|
15
|
+
|
|
3
16
|
## 1.1.2
|
|
4
17
|
|
|
5
18
|
- Rewrites `REQ-002.description` to reference `TAC-901-security-secrets-management-manager-client` `responsibilities.get` and the sibling responsibilities on the same TAC rather than restate the `get(name)` signature verbatim; the literal remains owned by the delivering TAC.
|
|
@@ -8,16 +21,14 @@
|
|
|
8
21
|
|
|
9
22
|
- Register: neutral wording in shipped prose (no capability change).
|
|
10
23
|
|
|
11
|
-
## 1.1.0 (
|
|
24
|
+
## 1.1.0 (2026-09-09)
|
|
12
25
|
|
|
13
|
-
- Adds `elicits[]` for `environmentSet` (string; the ordered environment list) and `uiOutcome` (enum: `integrate`, `admin-spa`, `none`) already described in prose on `REQ-007` and `REQ-010`. Promotes `REQ-010` to `must` priority (an apply-time choice is not a should) and names each option value explicitly on its description. Narrows `REQ-003` to code-side enforcement of the least-privilege slice, naming SOPS's inability to issue vendor-side per-process credentials and the supersede-via-ADR path for vendors that carry the property. Adds an explicit exception clause to `REQ-005` for the ephemeral `.env` reflection under `REQ-006`, constraining its location, `.gitignore` requirement, and file mode. Adds `deliveredBy` on every `must` requirement and `disposition: fixed` on every existing acceptance criterion. Names the `secretsProvider` capability on `REQ-002`, which already carries the vendor-agnostic-manager runtime clause.
|
|
26
|
+
- Adds `elicits[]` for `environmentSet` (string; the ordered environment list) and `uiOutcome` (enum: `integrate`, `admin-spa`, `none`) already described in prose on `REQ-007` and `REQ-010`. Promotes `REQ-010` to `must` priority (an apply-time choice is not a should) and names each option value explicitly on its description. Narrows `REQ-003` to code-side enforcement of the least-privilege slice, naming SOPS's inability to issue vendor-side per-process credentials and the supersede-via-ADR path for vendors that carry the property. Adds an explicit exception clause to `REQ-005` for the ephemeral `.env` reflection under `REQ-006`, constraining its location, `.gitignore` requirement, and file mode. Adds `deliveredBy` on every `must` requirement and `disposition: fixed` on every existing acceptance criterion. Names the `secretsProvider` capability on `REQ-002`, which already carries the vendor-agnostic-manager runtime clause.
|
|
14
27
|
|
|
15
28
|
## 1.0.1 - 2026-09-06
|
|
16
29
|
|
|
17
30
|
Additive minor: declares `capabilities: ["secretsProvider"]` on `blueprint.json` so consumer blueprints can gate composition on an applied secrets-management surface via the capability mechanism. No REQ / US / TAC / ADR contribution changes; the `secretRef` opaque-string contract, the elicited-parameters shape, and the shipped secretsSource semantics are unchanged. First consumer at v1.0.1: `object-storage-s3` v1.0.0 declares `requiresAppliedCapabilities: {capabilities: ["secretsProvider"], allowSkipFlag: "allow-no-secrets-yet", refusalMessageId: "object-storage-s3-no-secrets"}` so `rcf define blueprint add object-storage-s3` on a project that has not applied security-secrets-management exits 3 with the stable message id on stderr; the override records a note on `source.notes` for later reconciliation.
|
|
18
31
|
|
|
19
|
-
Landed via infra round 5 (spec section 5.2, platform decision 6) folded into PR #157 per shelf ruling on the runner-gap find; same-PR minor pattern as round-4 auth minors.
|
|
20
|
-
|
|
21
32
|
## 1.0.0 - 2026-08-31
|
|
22
33
|
|
|
23
34
|
Initial release. `secretRef` opaque-string contract, elicited-parameters (secretsSource, environment mapping), scope-global ADR on `secretsSource`.
|
|
@@ -27,9 +27,9 @@ 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
|
-
No FBS contributions, as a matter of principle (
|
|
32
|
+
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 manifest shape, the client contract, the least-privilege posture, the audit shape, the agent access discipline, the `.env` reflection posture, the rotation gate, the UI-choice contract); 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.
|
|
33
33
|
|
|
34
34
|
Deliberately not contributed: a vendor SDK (the default vendor is named in ADR-902 as SOPS+age, the shape of the vendor adapter is fixed by TAC-901, the actual adapter code is a project-authored implementation); a specific manifest schema library (any YAML parser plus the loader in TAC-902 satisfies the loader responsibilities); a project's authorisation model (secrets management authorises READ of secret material; who is allowed to act on which secret at which UI surface is a project-side authorisation concern layered above the audit sink); a rotation orchestrator (the blueprint gates on rotation age at CI, it does not itself run the rotation for you; running the rotation is a project-authored procedure the vendor's own tooling supports); the admin-UI Secrets page itself when `uiIntegration.mode` is `integrate` (the field contract is fixed by TAC-905, the page implementation lives in the host project); an admin-spa blueprint (a companion future blueprint, promotion signal noted in the guide); a project's audit-storage engine (the blueprint fixes the event shape, not where the events land).
|
|
35
35
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "security-secrets-management",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.5",
|
|
4
4
|
"category": "security",
|
|
5
5
|
"capabilities": [
|
|
6
6
|
"secretsProvider"
|
|
@@ -177,5 +177,6 @@
|
|
|
177
177
|
"none"
|
|
178
178
|
]
|
|
179
179
|
}
|
|
180
|
-
]
|
|
180
|
+
],
|
|
181
|
+
"updatedAt": "2026-09-11T15:37:12.000Z"
|
|
181
182
|
}
|