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,5 @@
|
|
|
1
|
+
import runProbe from './live-region-preseeding.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
|
|
4
|
+
const engine = { kind: 'fixture', image: 'test/fixtures/probe-pack-application-notifications-in-app/server.js', healthy: true };
|
|
5
|
+
runShim('live-region-preseeding', engine, runProbe);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// application-notifications-in-app probe: toast role/priority mapping
|
|
2
|
+
// and the WCAG 2.2.1 timeout floor (AC-20102-1) plus the focus-pause
|
|
3
|
+
// clause (AC-20102-4).
|
|
4
|
+
//
|
|
5
|
+
// AC-20102-1 concerns the client-JS-rendered toast DOM (priority to
|
|
6
|
+
// role/wrapper mapping, one wrapper per body, data-shown-at and
|
|
7
|
+
// data-dismissed-at ISO timestamps, elapsed timeout at or above the
|
|
8
|
+
// six-second floor). All of that is browser-only in this fixture:
|
|
9
|
+
// the toast DOM is created by the client script and the elapsed
|
|
10
|
+
// timing runs off a browser timer. The AC-20102-1 clause is emitted
|
|
11
|
+
// as a notObservableHere row anchored to AC-20102-1 (no focus-pause
|
|
12
|
+
// language - focus-pause is a separate AC, AC-20102-4).
|
|
13
|
+
//
|
|
14
|
+
// AC-20102-4 is the focus-pause clause: a focused toast pauses the
|
|
15
|
+
// timer and dismissal removes the toast. The fixture's current toast
|
|
16
|
+
// factory renders the toast in client JS, sets data-dismissed-at on
|
|
17
|
+
// dismiss but does not remove the toast from the DOM and does not
|
|
18
|
+
// pause the timer on focus. That is a fixture-level gap against the
|
|
19
|
+
// AC. Rather than attributing a positive observation, this probe
|
|
20
|
+
// emits a conformanceOnly row (null anchor, per the null-anchor +
|
|
21
|
+
// limitation contract) naming AC-20102-4 in the limitation so the
|
|
22
|
+
// AC-property gap is honestly recorded.
|
|
23
|
+
//
|
|
24
|
+
// The pack aggregate stays warn (AMBER) via the shared aggregate()
|
|
25
|
+
// rule (both rows carry verdict:'warn'). The fixture is still spun
|
|
26
|
+
// up so the probe exercises the fixture lifecycle
|
|
27
|
+
// (teardown-fails-verdict rule).
|
|
28
|
+
|
|
29
|
+
import { fixtureFetch, startFixture, excerpt } from './probe-utils.mjs';
|
|
30
|
+
|
|
31
|
+
export const anchorAcId = 'application-notifications-in-app-AC-20102-1';
|
|
32
|
+
export const accountBound = false;
|
|
33
|
+
|
|
34
|
+
export default async function runProbe() {
|
|
35
|
+
const fixture = await startFixture();
|
|
36
|
+
const results = [];
|
|
37
|
+
try {
|
|
38
|
+
// Reachability fetch: the fixture reports the shell root on /
|
|
39
|
+
// with data-toast-timeout-floor-seconds and the two live-region
|
|
40
|
+
// wrappers preseeded. Recorded so both conformance rows below
|
|
41
|
+
// carry a live x-fixture-request-id and a body excerpt from this
|
|
42
|
+
// run (rule-7d shape + tally: conformance rows require an
|
|
43
|
+
// evidence object; the shell body proves the fixture answered
|
|
44
|
+
// and lets a reader see the observable surface even though the
|
|
45
|
+
// client-JS toast rendering itself is not observable here).
|
|
46
|
+
const shell = await fixtureFetch(fixture.url, '/');
|
|
47
|
+
const shellRootMatch = (shell.body.match(/<div[^>]*data-region="shell-root"[^]{0,240}/) || [''])[0];
|
|
48
|
+
const timeoutFloorMatch = shell.body.match(/data-toast-timeout-floor-seconds="(\d+)"/);
|
|
49
|
+
const timeoutFloorSeconds = timeoutFloorMatch ? Number(timeoutFloorMatch[1]) : null;
|
|
50
|
+
|
|
51
|
+
results.push({
|
|
52
|
+
anchorAcId,
|
|
53
|
+
notObservableAcId: anchorAcId,
|
|
54
|
+
verdict: 'warn',
|
|
55
|
+
notObservableHere: true,
|
|
56
|
+
reason: 'AC-20102-1 requires observing client-driven toast emission into [data-live-region="polite"] with role="status" for info and [data-live-region="assertive"] with role="alert" for error, one wrapper per body, data-shown-at and data-dismissed-at ISO timestamps on the toast element, and the elapsed time between them at or above the ADR-2102 six-second floor. Toast DOM is emitted by client JS after load and elapsed timing runs off a browser timer, so a fixture-HTTP-only probe cannot observe them; a Playwright-driven check is required.',
|
|
57
|
+
detail: `Given a toast triggered by a background event, priority-to-role/wrapper mapping, one-shot announcement per wrapper, and the WCAG 2.2.1 six-second elapsed-timeout floor on data-shown-at/data-dismissed-at are all browser-only in this fixture; the shell root observed at GET / carries data-toast-timeout-floor-seconds=${timeoutFloorSeconds} (server-rendered constant, not the client-JS-driven toast) so the fixture reachability is recorded; needs a Playwright-driven observation for the toast contract itself; x-fixture-request-id=${shell.requestId}.`,
|
|
58
|
+
evidence: {
|
|
59
|
+
requestId: shell.requestId,
|
|
60
|
+
responseStatus: shell.status,
|
|
61
|
+
bodyExcerpt: excerpt(shellRootMatch),
|
|
62
|
+
derived: {
|
|
63
|
+
route: '/',
|
|
64
|
+
timeoutFloorSecondsServerRendered: timeoutFloorSeconds,
|
|
65
|
+
shellRootPresent: shellRootMatch.length > 0,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
results.push({
|
|
71
|
+
anchorAcId: null,
|
|
72
|
+
conformanceOnly: true,
|
|
73
|
+
limitation: 'application-notifications-in-app-AC-20102-4: the focus-pause clause (a focused toast pauses the timer and resumes on focus loss) and the toast-dismissal DOM-removal contract require observing a running browser (focus events, timer state and DOM mutation), and additionally the shipped fixture toast factory does not pause the timer on focus and marks dismissal by setting data-dismissed-at rather than removing the toast from the DOM. Deferred to a Playwright-driven check and named here as a fixture gap so the operator sees the property claim without a positive observation.',
|
|
74
|
+
verdict: 'warn',
|
|
75
|
+
detail: `Given a toast triggered by a background event and a focused-toast clause per AC-20102-4, the focus-pause + dismissal-removal properties are not observed by this Node HTTP probe and the shipped fixture does not implement them; this row is a null-anchored conformance de-claim so the AC-20102-4 gap is on the record; fixture reachability confirmed via the same shell fetch (x-fixture-request-id=${shell.requestId}).`,
|
|
76
|
+
evidence: {
|
|
77
|
+
requestId: shell.requestId,
|
|
78
|
+
responseStatus: shell.status,
|
|
79
|
+
bodyExcerpt: excerpt(shellRootMatch),
|
|
80
|
+
derived: {
|
|
81
|
+
route: '/',
|
|
82
|
+
focusPauseObserved: false,
|
|
83
|
+
dismissalRemovesToast: false,
|
|
84
|
+
reason: 'browser-only clauses of AC-20102-4; fixture does not implement them either',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
} finally {
|
|
89
|
+
await fixture.kill();
|
|
90
|
+
}
|
|
91
|
+
return { results };
|
|
92
|
+
}
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
{
|
|
29
29
|
"name": "priorityToRoleContract",
|
|
30
30
|
"kind": "shape",
|
|
31
|
-
"description": "The ADR-2101 mapping: `info` maps to `{ wrapper: 'polite', role: 'status' }`; `error` maps to `{ wrapper: 'assertive', role: 'alert' }`. A priority outside the ADR-2101 enum is refused at project-side
|
|
31
|
+
"description": "The ADR-2101 mapping: `info` maps to `{ wrapper: 'polite', role: 'status' }`; `error` maps to `{ wrapper: 'assertive', role: 'alert' }`. A priority outside the ADR-2101 enum is refused at project-side check."
|
|
32
32
|
}
|
|
33
33
|
],
|
|
34
34
|
"dependencies": [
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"description": "Every toast the live-region factory emits records a delivery-log row through TAC-2102's `writeDeliveryRow`; ownership of the row shape lives here through the delegating call, ownership of the persistence layer lives on TAC-2102 and the applied `logging` companion."
|
|
40
40
|
}
|
|
41
41
|
],
|
|
42
|
-
"tradeoffs": "The two-wrapper contract is opinionated: some designs use one wrapper per notification kind (informational, error, warning, success) with four ARIA politeness levels. This TAC insists on two wrappers because the WCAG 4.1.3 status-message clause and the ARIA APG alert pattern jointly draw the line at polite vs assertive; adding wrapper granularity that assistive technologies do not distinguish trades runtime discipline for false precision. The six-second timeout floor is deliberately not a ceiling: an elicited override raises the floor but never lowers it, so a design that shows a toast for two seconds fails at author-side
|
|
43
|
-
"notes": "Known mechanism-reach gap: the pack asserts the disjoint-content rule (AC-20108-1) at the moment it inspects the wrappers, not continuously across the toast lifetime. A pathological implementation that briefly writes into both wrappers between two microtasks would not be caught by the pack; project-side
|
|
42
|
+
"tradeoffs": "The two-wrapper contract is opinionated: some designs use one wrapper per notification kind (informational, error, warning, success) with four ARIA politeness levels. This TAC insists on two wrappers because the WCAG 4.1.3 status-message clause and the ARIA APG alert pattern jointly draw the line at polite vs assertive; adding wrapper granularity that assistive technologies do not distinguish trades runtime discipline for false precision. The six-second timeout floor is deliberately not a ceiling: an elicited override raises the floor but never lowers it, so a design that shows a toast for two seconds fails at the author-side check.",
|
|
43
|
+
"notes": "Known mechanism-reach gap: the pack asserts the disjoint-content rule (AC-20108-1) at the moment it inspects the wrappers, not continuously across the toast lifetime. A pathological implementation that briefly writes into both wrappers between two microtasks would not be caught by the pack; project-side check carries the residual. A v1.1 minor bump could add a MutationObserver-based check.",
|
|
44
44
|
"createdAt": "2026-09-04T23:59:00Z",
|
|
45
45
|
"updatedAt": "2026-09-04T23:59:00Z"
|
|
46
46
|
}
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
{
|
|
49
49
|
"name": "Applied logging companion",
|
|
50
50
|
"kind": "external",
|
|
51
|
-
"description": "The delivery-attempt log's persistence layer is the applied `logging` companion's; this TAC delegates the write path. A project applying this blueprint without a `logging` companion (neither applied nor registered library nor core shelf) sees the delivery-log endpoint returning an empty rows array, which fails project-side
|
|
51
|
+
"description": "The delivery-attempt log's persistence layer is the applied `logging` companion's; this TAC delegates the write path. A project applying this blueprint without a `logging` companion (neither applied nor registered library nor core shelf) sees the delivery-log endpoint returning an empty rows array, which fails project-side check."
|
|
52
52
|
}
|
|
53
53
|
],
|
|
54
54
|
"tradeoffs": "The centre reading through the delivery log (rather than a separate inbox store) keeps the shell single-sourced on the applied `logging` companion but couples the surface latency to the log query; a project with a very high notification volume may want to project a materialised inbox view alongside the log. This TAC accepts the coupling because it collapses two writers of the same row into one; a project that needs the materialised view supersedes with a project-authored REQ.",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-20101-2",
|
|
24
|
-
"description": "Given the shell's live-region factory (TAC-2101 `renderLiveRegions`), a call at first render emits exactly two wrapper elements matching the AC-20101-1 shape and never re-creates them on subsequent renders (the wrappers are stable identity across the app lifetime). A factory that recreates the wrappers on a route change fails this AC at project-side
|
|
24
|
+
"description": "Given the shell's live-region factory (TAC-2101 `renderLiveRegions`), a call at first render emits exactly two wrapper elements matching the AC-20101-1 shape and never re-creates them on subsequent renders (the wrappers are stable identity across the app lifetime). A factory that recreates the wrappers on a route change fails this AC at project-side check.",
|
|
25
25
|
"given": "the shell's live-region factory",
|
|
26
26
|
"when": "the factory is invoked at first render and again on a route change",
|
|
27
27
|
"then": "the same two wrapper elements are returned; identity is stable",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-20102-2",
|
|
24
|
-
"description": "Given the toast factory (TAC-2101 `renderToast({ priority, body })`), the factory picks the polite wrapper for `info` priority and the assertive wrapper for `error` priority; a factory that writes into both wrappers on one call, or picks the wrong wrapper for a priority, fails at project-side
|
|
24
|
+
"description": "Given the toast factory (TAC-2101 `renderToast({ priority, body })`), the factory picks the polite wrapper for `info` priority and the assertive wrapper for `error` priority; a factory that writes into both wrappers on one call, or picks the wrong wrapper for a priority, fails at project-side check.",
|
|
25
25
|
"given": "the toast factory",
|
|
26
26
|
"when": "the factory is invoked at a given priority",
|
|
27
27
|
"then": "the correct wrapper receives the toast",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-20103-2",
|
|
24
|
-
"description": "Given the centre factory (TAC-2102 `renderCentre`), the factory reads the delivery-attempt log from REQ-005's endpoint and emits one wrapper per row within the retention window; a factory that emits rows older than the retention window, or that skips rows within the window, fails at project-side
|
|
24
|
+
"description": "Given the centre factory (TAC-2102 `renderCentre`), the factory reads the delivery-attempt log from REQ-005's endpoint and emits one wrapper per row within the retention window; a factory that emits rows older than the retention window, or that skips rows within the window, fails at project-side check.",
|
|
25
25
|
"given": "the centre factory",
|
|
26
26
|
"when": "the delivery log is read",
|
|
27
27
|
"then": "one wrapper is emitted per row within the retention window",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"id": "AC-20105-2",
|
|
28
|
-
"description": "Given the delivery-log write factory (TAC-2102 `writeDeliveryRow`), a call from the toast factory and a call from the centre factory both write through the applied `logging` companion's record factory (the row shape lives on this blueprint; the persistence layer lives on the companion). A row written outside the companion's factory bypasses the companion's retention and audit path and is refused at project-side
|
|
28
|
+
"description": "Given the delivery-log write factory (TAC-2102 `writeDeliveryRow`), a call from the toast factory and a call from the centre factory both write through the applied `logging` companion's record factory (the row shape lives on this blueprint; the persistence layer lives on the companion). A row written outside the companion's factory bypasses the companion's retention and audit path and is refused at project-side check.",
|
|
29
29
|
"given": "the delivery-log write factory",
|
|
30
30
|
"when": "a toast or centre event surfaces a notification",
|
|
31
31
|
"then": "a row lands through the applied logging companion",
|
package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md
CHANGED
|
@@ -37,11 +37,11 @@ Every route the applying project ships preseeds both live-region wrappers in the
|
|
|
37
37
|
## Common gotchas
|
|
38
38
|
|
|
39
39
|
- The two live-region wrappers must be preseeded before the first notification. A lazy-mount defect is silent at the DOM (the wrapper appears "eventually") but loses the first announcement at the assistive-technology layer. The pack refuses ship on this shape.
|
|
40
|
-
- The priority-to-role mapping is fixed at v1.0.0 (info to polite/status, error to assertive/alert). A third priority (`warning`) is a v1.1 minor bump because it changes the role vocabulary; free-form priorities are refused at project-side
|
|
40
|
+
- The priority-to-role mapping is fixed at v1.0.0 (info to polite/status, error to assertive/alert). A third priority (`warning`) is a v1.1 minor bump because it changes the role vocabulary; free-form priorities are refused at project-side check.
|
|
41
41
|
- The toast timeout floor is a floor, not a ceiling. Six seconds is the default; an operator-elicited value above the floor is honoured (thirty seconds), a value below the floor is refused at apply. The pack measures the actual elapsed time against the shell root's declared floor and against the six-second baseline; both must clear.
|
|
42
42
|
- The centre enumerates items by `data-notification-id`, per the gate discipline. A centre implementation that uses only `role="listitem"` on the children (without a per-element id attribute) passes the accessibility contract but does not let the pack enumerate individual items reliably; ship both.
|
|
43
|
-
- The family-prefix reservation is documented; naming a future notifications blueprint outside the family (`application-alerts-email`) reads against the reservation and stops at author-side
|
|
43
|
+
- The family-prefix reservation is documented; naming a future notifications blueprint outside the family (`application-alerts-email`) reads against the reservation and stops at author-side check.
|
|
44
44
|
|
|
45
45
|
## Cost honesty
|
|
46
46
|
|
|
47
|
-
Shipping this blueprint costs the project a design pass on the notification categories and retention window, and a build pass on the live-region factory and the centre inbox surface. It buys the WCAG 4.1.3 and WCAG 2.2.1 disciplines enforced at ship, the ARIA APG alert pattern on the assertive slot, the centre inbox with the acknowledge round-trip, the preferences UI with sibling delegation, and the family-prefix reservation that survives when the shelf grows a second notifications channel. The gate reviewer verifies the pack runs green against the sample-app fixture and
|
|
47
|
+
Shipping this blueprint costs the project a design pass on the notification categories and retention window, and a build pass on the live-region factory and the centre inbox surface. It buys the WCAG 4.1.3 and WCAG 2.2.1 disciplines enforced at ship, the ARIA APG alert pattern on the assertive slot, the centre inbox with the acknowledge round-trip, the preferences UI with sibling delegation, and the family-prefix reservation that survives when the shelf grows a second notifications channel. The gate reviewer verifies the pack runs green against the sample-app fixture and inspects the applying project's own notifications surfaces against the ADR set.
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# application-onboarding-tour CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 1.1.9 - 2026-09-12
|
|
4
|
+
|
|
5
|
+
- Fixture client script fix: the restart-tour click listener now calls `event.preventDefault()` when the button is a submit-button inside the progressive-enhancement `<form method="post" action="/actions/restart-tour">`, so JS-on activation POSTs the server-side clear exactly once (previously the native form submission and the fetch fired both writes; the clear was idempotent so no data was lost, but the duplicate POST was measurable on `/__requests`). JS-off activation continues to POST the form natively; JS-on drives the same POST via fetch. Probe assertions and record shape are unchanged.
|
|
6
|
+
|
|
7
|
+
## 1.1.8 - 2026-09-12
|
|
8
|
+
|
|
9
|
+
- completion-persistence (AC-26104-1) upgraded from a de-claim to an honest positive-evidence row that observes both the persistence half and the restart-control-activation half of the AC server-side. The fixture derives the server-side first-run flag on `/tour` from the applied `completion-state-store` elicit when its value is `server-side-per-principal`: pages render `data-tour-first-run="true"` when the principal has no completion record and `data-tour-first-run="false"` when a completion record is present (`data-tour-completion-source` and `data-tour-principal-id` name the source). The settings surface now renders the restart-tour control inside a progressive-enhancement `<form method="post" action="/actions/restart-tour">` carrying the principal-id in a hidden input, backed by a new server route that clears the applied server-side completion record for the principal and returns `200 { ok:true, cleared:true, restartControl:"restart-tour" }`; the client script also fires the same POST via fetch on click for SPA parity, but the form action is the source of truth even with JS off. The probe drives the full cycle - initial completion GET (404) and initial `/tour` render (`data-tour-first-run="true"`); POST completion write; subsequent completion GET and `/tour` render (`data-tour-first-run="false"`); `/settings` render carrying the restart-tour form with the hidden principal-id input; POST `/actions/restart-tour` (the same form submission the button fires); final completion GET (404) and `/tour` render (`data-tour-first-run="true"`). The `?break=no-persist` switch now refuses the server-side POST and the restart-tour form action with a defined error shape (`COMPLETION_WRITE_FAILED` / `COMPLETION_CLEAR_FAILED`), so the negative-variants anatomy assertion drives the completion-persistence aggregate to fail. First-run-detection's returning-principal row re-anchored to AC-26104-1 (the AC the suppression clause belongs to) and left as `notObservableHere` for the client-side auto-open branch; the misleading AC-26101-1 attribution is removed. Stepper-role-dialog rows keep `notObservableHere` on the browser-only halves. Positive-evidence row shape tightened in the anatomy helper: a positive row now requires a non-empty engine-returned `requestId` AND (a non-empty `bodyExcerpt` OR a non-empty `derived` object); a `{derived:{}}` alone or a `requestId` alone no longer counts, with two new negative-case tests covering the empty-derived and id-only patterns. Fixture README env-var manifest already declared `PROBE_BREAK` and the probe-utils `DECLARED_ENV` list already carries it.
|
|
10
|
+
|
|
11
|
+
## 1.1.6 - 2026-09-11
|
|
12
|
+
|
|
13
|
+
- Shared `aggregate()` no longer promotes warn rows to pass: any row with verdict warn (including honest de-claim rows) lifts the aggregate to warn; a probe whose rows are all warn aggregates to warn, not pass. Shared teardown propagates a SIGKILL failure through the returned kill() promise instead of swallowing it. completion-persistence AC-26104-1 row de-claimed to `conformanceOnly:true` with `verdict:'warn'` and a `limitation` naming the browser-only clause (the restart-tour control activation and subsequent tour re-open are browser-driven and not observed by this Node HTTP probe); the server-side write-read-clear cycle still drives the row observation and flips to fail if the fixture cycle breaks. first-run-detection and stepper-role-dialog rows keep `notObservableHere` on the browser-only halves and emit `verdict:'warn'`. checklist-anchor-open stays as a positive-observation row that fully observes AC-26103-1 across both applied-branches. Anatomy test extended with a negative-variant assertion that the shipped fixture break switches drive the checklist aggregate to fail.
|
|
14
|
+
|
|
15
|
+
## 1.1.5 - 2026-09-11
|
|
16
|
+
|
|
17
|
+
- completion-persistence probe now observes AC-26104-1's server-observable half. Fixture ships three new endpoints keyed by `x-principal-id` header (or `?principal-id=` query) exercised only when `TOUR_STORE=server-side-per-principal`: `POST /api/tour/completion` writes, `GET /api/tour/completion` reads (404 when absent, 200 with the record when present), `DELETE /api/tour/completion` clears (models the restart-tour control). Probe drives a fresh principal through the full sequence (initial absent -> write -> read -> clear -> absent again) instead of de-claiming as `notObservableHere`. first-run-detection and stepper-role-dialog rows keep `notObservableHere` on the browser-only halves but now emit `verdict:'warn'` (never `pass`) so the aggregate correctly reports amber for those AC halves. Anatomy test extended to enumerate the shipped AC/REQ id set and refuse any row whose anchor is not in it, and to accept the conformance-only row shape.
|
|
18
|
+
|
|
19
|
+
## 1.1.4 - 2026-09-11
|
|
20
|
+
|
|
21
|
+
- Fixture tour-open runtime condition corrected from `FIRST_RUN || !alreadyDone` to `!alreadyDone` alone per AC-26101-1 (the tour opens on first run once, not any time FIRST_RUN is set past a stored completion). first-run-detection, stepper-role-dialog and completion-persistence probes de-claimed to notObservableHere with their AC anchors (AC-26101-1, AC-26102-1, AC-26104-1) because the observable properties - tour open behaviour, dialog focus lifecycle, focus return, responsive placement, completion write-and-restart-read - are all client-JS-driven and only observable in a browser. checklist-anchor-open remains observed (server-side surfaces the applied-capability-driven checklist state); rule 10 applied to both branches. Positive-anchor-on-absence broken-variant rows removed. Anatomy test extended to accept notObservableHere row shape. Register cleanup.
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
## 1.1.3 - 2026-09-11
|
|
25
|
+
|
|
26
|
+
- Added a criterion-e probe pack (`contributions/probes/`) covering 4 properties the fixture engine at `packages/rcf-lite/test/fixtures/probe-pack-application-onboarding-tour/server.js` answers: `first-run-detection`, `stepper-role-dialog`, `checklist-anchor-open`, `completion-persistence`. Every response now carries an `x-fixture-request-id` header; probes record the id, the HTTP status and a body excerpt as positive evidence per rule 7d. Fixture README declares every env var the pack reads. Anatomy test at `packages/rcf-lite/test/blueprint/application-onboarding-tour-anatomy.test.js` pins the new pack files and asserts each result carries one of the four 7d evidence shapes.
|
|
27
|
+
|
|
28
|
+
|
|
3
29
|
## 1.1.2 (2026-09-10)
|
|
4
30
|
|
|
5
31
|
### Changed
|
|
@@ -15,13 +41,13 @@
|
|
|
15
41
|
|
|
16
42
|
- Register: neutral wording in shipped prose (no capability change).
|
|
17
43
|
|
|
18
|
-
## 1.1.0 (2026-09-10
|
|
44
|
+
## 1.1.0 (2026-09-10)
|
|
19
45
|
|
|
20
46
|
### Added
|
|
21
47
|
|
|
22
|
-
- REQ-005 (dismissal-policy option coverage) and US-26108: dismiss-permanently, dismiss-until-next-major and dismiss-until-next-minor each carry a runtime clause tied to the completion store record shape. This is the section 7c worked example
|
|
23
|
-
- REQ-006 (checklist-anchor option coverage) and US-26109: dashboard-top, settings-page and custom-anchor each mount at a resolved slot with a defined default open state; custom-anchor falls back to the settings route on an unresolved/invisible/clipped selector with data-error=CHECKLIST_ANCHOR_UNRESOLVED.
|
|
24
|
-
- Failure-path acceptance criteria on US-26101 (unresolved and clipped anchors, out-of-range step count), US-26102 (dialog-modal role/aria and focus trap with WCAG citation), US-26103 (settings-route fallback), US-26104 (missing-provider refusal, failed write and failed read on the completion store), US-26105 (unparseable completion record), US-26106 (failed clear on restart), US-26107 (polite live-region close announcement).
|
|
48
|
+
- REQ-005 (dismissal-policy option coverage) and US-26108: dismiss-permanently, dismiss-until-next-major and dismiss-until-next-minor each carry a runtime clause tied to the completion store record shape. This is the section 7c worked example.
|
|
49
|
+
- REQ-006 (checklist-anchor option coverage) and US-26109: dashboard-top, settings-page and custom-anchor each mount at a resolved slot with a defined default open state; custom-anchor falls back to the settings route on an unresolved/invisible/clipped selector with data-error=CHECKLIST_ANCHOR_UNRESOLVED.
|
|
50
|
+
- Failure-path acceptance criteria on US-26101 (unresolved and clipped anchors, out-of-range step count), US-26102 (dialog-modal role/aria and focus trap with WCAG citation), US-26103 (settings-route fallback), US-26104 (missing-provider refusal, failed write and failed read on the completion store), US-26105 (unparseable completion record), US-26106 (failed clear on restart), US-26107 (polite live-region close announcement).
|
|
25
51
|
- Vendor citations on the ARIA APG dialog-modal, focus-trap and WCAG live-region acceptance criteria (verified 2026-09-10).
|
|
26
52
|
|
|
27
53
|
### Changed
|
|
@@ -29,7 +55,7 @@
|
|
|
29
55
|
- Every REQ now carries a deliveredBy link into TAC-2701 (step-runner), TAC-2702 (checklist-slot) or TAC-2703 (completion-store).
|
|
30
56
|
- Every AC on every user story now carries an explicit disposition (fixed or template).
|
|
31
57
|
- TAC-2702 responsibilities extended with resolveAnchor so REQ-006 delivery resolves.
|
|
32
|
-
-
|
|
58
|
+
- REQ-001 extended with runtime clauses naming the three string elicits `tour-step-manifest`, `anchor-selectors` and `per-step-content-voice` and their refusal branches; US-26101 gained three template ACs (AC-26101-5, AC-26101-6, AC-26101-7) each carrying an `Applying agent sets: <elicit-id>.` clause.
|
|
33
59
|
|
|
34
60
|
## 1.0.0 (visual round, spec 2026-09-06 section 5.5)
|
|
35
61
|
|
|
@@ -33,7 +33,7 @@ No `requiresAppliedCapabilities`: the blueprint has no hard dependency, and the
|
|
|
33
33
|
|
|
34
34
|
## Q4 fallback: completion-state store shape
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
When no persistence blueprint is applied AND the operator does not answer `completion-state-store` explicitly, the store defaults to `spa-local-storage`: a per-browser record so a returning principal on the same browser is not re-onboarded, and a different browser is re-onboarded. Rationale: a per-session tour that re-plays on every new session is worse than a one-time tour that persists across sessions on that browser; per the elicit surface, the operator can override to `spa-session-storage` (per-session refresh) or `server-side-per-principal` (cross-device; requires an applied persistence blueprint).
|
|
37
37
|
|
|
38
38
|
## Standards trace
|
|
39
39
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "application-onboarding-tour",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.9",
|
|
4
4
|
"category": "application",
|
|
5
5
|
"elicits": [
|
|
6
6
|
{
|
|
@@ -180,5 +180,7 @@
|
|
|
180
180
|
"elicited": true,
|
|
181
181
|
"standardsTraceClause": "generic enterprise practice"
|
|
182
182
|
}
|
|
183
|
-
]
|
|
184
|
-
|
|
183
|
+
],
|
|
184
|
+
"updatedAt": "2026-09-12T01:30:44Z",
|
|
185
|
+
"updatedIso": "2026-09-11T22:30:00Z"
|
|
186
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// application-onboarding-tour probe: checklist collapse contract
|
|
2
|
+
// (AC-26103-1).
|
|
3
|
+
//
|
|
4
|
+
// AC-26103-1 has three observable claims and every one is
|
|
5
|
+
// server-observable in the fixture: (i) when application-dashboard is
|
|
6
|
+
// in the applied set the checklist renders inside a <details open>
|
|
7
|
+
// element on the dashboard-top anchor slot; (ii) when it is NOT in
|
|
8
|
+
// the applied set the checklist renders inside a <details> (closed)
|
|
9
|
+
// element on the settings-page anchor slot; (iii) the <details>
|
|
10
|
+
// element carries data-role="onboarding-tour-checklist" in both
|
|
11
|
+
// branches. The two rows below drive both branches and assert all
|
|
12
|
+
// three claims per the first-eight-words rule (row detail opens on
|
|
13
|
+
// the AC's first eight words verbatim).
|
|
14
|
+
//
|
|
15
|
+
// AC-26103-1 first eight words: "Given the applied capability set includes application-dashboard, the".
|
|
16
|
+
|
|
17
|
+
import { fixtureFetch, startFixture, excerpt } from './probe-utils.mjs';
|
|
18
|
+
|
|
19
|
+
export const anchorAcId = 'application-onboarding-tour-AC-26103-1';
|
|
20
|
+
export const accountBound = false;
|
|
21
|
+
|
|
22
|
+
function parseChecklist(body) {
|
|
23
|
+
const details = body.match(/<details data-role="onboarding-tour-checklist" data-anchor="([^"]+)"(\s+open)?>/);
|
|
24
|
+
const section = body.match(/<section data-role="onboarding-tour-checklist" data-anchor="([^"]+)">/);
|
|
25
|
+
if (details) return { kind: 'details', anchor: details[1], open: !!details[2], dataRolePresent: true };
|
|
26
|
+
if (section) return { kind: 'section', anchor: section[1], open: false, dataRolePresent: true };
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default async function runProbe() {
|
|
31
|
+
const fixture = await startFixture();
|
|
32
|
+
const results = [];
|
|
33
|
+
try {
|
|
34
|
+
// Applied-dashboard branch: expect <details open> on dashboard-top with
|
|
35
|
+
// data-role="onboarding-tour-checklist".
|
|
36
|
+
const withDash = await fixtureFetch(fixture.url, '/dashboard?apps=application-dashboard');
|
|
37
|
+
const parsedWith = parseChecklist(withDash.body);
|
|
38
|
+
const withPass = withDash.status === 200 && !!withDash.requestId
|
|
39
|
+
&& parsedWith && parsedWith.kind === 'details'
|
|
40
|
+
&& parsedWith.anchor === 'dashboard-top' && parsedWith.open === true
|
|
41
|
+
&& parsedWith.dataRolePresent === true;
|
|
42
|
+
results.push({
|
|
43
|
+
anchorAcId,
|
|
44
|
+
verdict: withPass ? 'pass' : 'fail',
|
|
45
|
+
detail: withPass
|
|
46
|
+
? `Given the applied capability set includes application-dashboard, the checklist rendered as <details data-role="onboarding-tour-checklist" data-anchor="dashboard-top" open> at GET /dashboard?apps=application-dashboard (kind=${parsedWith.kind}, anchor=${parsedWith.anchor}, open=${parsedWith.open}, dataRolePresent=${parsedWith.dataRolePresent}); x-fixture-request-id=${withDash.requestId}.`
|
|
47
|
+
: `Given the applied capability set includes application-dashboard, the AC-26103-1 dashboard-branch observation failed: status=${withDash.status} rid=${withDash.requestId} parsed=${JSON.stringify(parsedWith)}.`,
|
|
48
|
+
evidence: {
|
|
49
|
+
requestId: withDash.requestId,
|
|
50
|
+
responseStatus: withDash.status,
|
|
51
|
+
bodyExcerpt: excerpt((withDash.body.match(/<details data-role="onboarding-tour-checklist"[^>]{0,140}/) || [''])[0]),
|
|
52
|
+
derived: { branch: 'application-dashboard-applied', checklist: parsedWith },
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Not-applied branch: expect <details> (closed, no open attribute) on
|
|
57
|
+
// settings-page with data-role="onboarding-tour-checklist".
|
|
58
|
+
const noDash = await fixtureFetch(fixture.url, '/settings?apps=');
|
|
59
|
+
const parsedNo = parseChecklist(noDash.body);
|
|
60
|
+
const noPass = noDash.status === 200 && !!noDash.requestId
|
|
61
|
+
&& parsedNo && parsedNo.kind === 'details'
|
|
62
|
+
&& parsedNo.anchor === 'settings-page' && parsedNo.open === false
|
|
63
|
+
&& parsedNo.dataRolePresent === true;
|
|
64
|
+
results.push({
|
|
65
|
+
anchorAcId,
|
|
66
|
+
verdict: noPass ? 'pass' : 'fail',
|
|
67
|
+
detail: noPass
|
|
68
|
+
? `Given the applied capability set includes application-dashboard, the complementary NOT-applied branch was observed at GET /settings?apps=: checklist rendered as <details data-role="onboarding-tour-checklist" data-anchor="settings-page"> (kind=${parsedNo.kind}, anchor=${parsedNo.anchor}, open=${parsedNo.open}, dataRolePresent=${parsedNo.dataRolePresent}); x-fixture-request-id=${noDash.requestId}.`
|
|
69
|
+
: `Given the applied capability set includes application-dashboard, the AC-26103-1 NOT-applied-branch observation failed: status=${noDash.status} rid=${noDash.requestId} parsed=${JSON.stringify(parsedNo)}.`,
|
|
70
|
+
evidence: {
|
|
71
|
+
requestId: noDash.requestId,
|
|
72
|
+
responseStatus: noDash.status,
|
|
73
|
+
bodyExcerpt: excerpt((noDash.body.match(/<details data-role="onboarding-tour-checklist"[^>]{0,140}/) || [''])[0]),
|
|
74
|
+
derived: { branch: 'application-dashboard-not-applied', checklist: parsedNo },
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
} finally {
|
|
78
|
+
await fixture.kill();
|
|
79
|
+
}
|
|
80
|
+
return { results };
|
|
81
|
+
}
|
package/blueprints/application-onboarding-tour/contributions/probes/completion-persistence.mjs
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// application-onboarding-tour probe: completion-state persistence and
|
|
2
|
+
// restart-tour activation (AC-26104-1) - server-side per-principal
|
|
3
|
+
// store (spa-local-storage and spa-session-storage variants are
|
|
4
|
+
// browser only; the server-side-per-principal store IS observable
|
|
5
|
+
// from a Node HTTP probe and this probe drives it via the applied
|
|
6
|
+
// completion API and the progressive-enhancement restart-tour form
|
|
7
|
+
// action, both of which are the fixture's own engine).
|
|
8
|
+
//
|
|
9
|
+
// AC-26104-1 first eight words: "Given a completed tour, the completion state persists".
|
|
10
|
+
//
|
|
11
|
+
// Server-observable steps this probe drives:
|
|
12
|
+
// 1. Fresh principalId: GET /api/tour/completion returns 404.
|
|
13
|
+
// 2. GET /tour renders data-tour-first-run="true" for the fresh
|
|
14
|
+
// principal (the server-side first-run flag is derived from the
|
|
15
|
+
// applied completion store on server render).
|
|
16
|
+
// 3. POST /api/tour/completion writes a record: 200 with the record
|
|
17
|
+
// echoed.
|
|
18
|
+
// 4. GET /api/tour/completion returns 200 with the same record
|
|
19
|
+
// (persistence across requests, i.e. the "restart read"): this
|
|
20
|
+
// is the server-side persistence half of the AC.
|
|
21
|
+
// 5. GET /tour then renders data-tour-first-run="false" (the
|
|
22
|
+
// completion feeds the server-derived first-run flag on the next
|
|
23
|
+
// principal load).
|
|
24
|
+
// 6. GET /settings renders the restart-tour control inside a
|
|
25
|
+
// <form method="post" action="/actions/restart-tour"> with the
|
|
26
|
+
// principal-id in a hidden input (progressive enhancement:
|
|
27
|
+
// activating the control POSTs the form even when JS is off).
|
|
28
|
+
// 7. POST /actions/restart-tour (the form submission the settings
|
|
29
|
+
// restart control drives) returns 200 { ok:true, cleared:true }
|
|
30
|
+
// and clears the server-side record.
|
|
31
|
+
// 8. GET /api/tour/completion returns 404 again (record cleared by
|
|
32
|
+
// the restart-control activation).
|
|
33
|
+
// 9. GET /tour then renders data-tour-first-run="true" (the tour
|
|
34
|
+
// re-opens on the next principal load, per AC-26104-1's
|
|
35
|
+
// "activating the control ... re-opens the tour on the next
|
|
36
|
+
// principal load" clause).
|
|
37
|
+
// Every step varies inputs (principalId is a fresh UUID, the record
|
|
38
|
+
// carries a distinct completedAt ISO) and asserts derived outputs
|
|
39
|
+
// the fixture had no choice about (the record echoed back, the
|
|
40
|
+
// data-tour-first-run flag flipping, the form-action response
|
|
41
|
+
// carrying cleared=true).
|
|
42
|
+
//
|
|
43
|
+
// The dialog-open behaviour and keyboard-only walk asked for by
|
|
44
|
+
// AC-26101-1 / AC-26102-1 are browser-only and covered by
|
|
45
|
+
// first-run-detection and stepper-role-dialog. This probe now
|
|
46
|
+
// observes AC-26104-1's persistence AND the server-observable half
|
|
47
|
+
// of the restart-tour activation (the form action the button fires
|
|
48
|
+
// server-side).
|
|
49
|
+
|
|
50
|
+
import { fixtureFetch, startFixture, excerpt } from './probe-utils.mjs';
|
|
51
|
+
import { randomUUID } from 'node:crypto';
|
|
52
|
+
|
|
53
|
+
export const anchorAcId = 'application-onboarding-tour-AC-26104-1';
|
|
54
|
+
export const accountBound = false;
|
|
55
|
+
|
|
56
|
+
const FIRST_EIGHT = 'Given a completed tour, the completion state persists';
|
|
57
|
+
|
|
58
|
+
export default async function runProbe() {
|
|
59
|
+
const fixture = await startFixture({ env: { TOUR_STORE: 'server-side-per-principal' } });
|
|
60
|
+
const results = [];
|
|
61
|
+
try {
|
|
62
|
+
const principalId = 'probe-tour-' + randomUUID();
|
|
63
|
+
const completedAt = new Date().toISOString();
|
|
64
|
+
const store = 'server-side-per-principal';
|
|
65
|
+
// Step 1a: initial completion GET is 404 (no record for this principal).
|
|
66
|
+
const initial = await fixtureFetch(fixture.url, `/api/tour/completion?principal-id=${principalId}&store=${store}`);
|
|
67
|
+
const initialBody = JSON.parse(initial.body || '{}');
|
|
68
|
+
// Step 1b: initial /tour render shows data-tour-first-run="true" for the
|
|
69
|
+
// fresh principal (server-derived from the empty completion store).
|
|
70
|
+
const initialTour = await fixtureFetch(fixture.url, `/tour?store=${store}&principal-id=${principalId}`);
|
|
71
|
+
const initialFirstRunTrue = /data-tour-first-run="true"/.test(initialTour.body)
|
|
72
|
+
&& new RegExp(`data-tour-principal-id="${principalId}"`).test(initialTour.body);
|
|
73
|
+
// Step 2: POST completion.
|
|
74
|
+
const writeRes = await fixtureFetch(fixture.url, `/api/tour/completion?principal-id=${principalId}&store=${store}`, {
|
|
75
|
+
method: 'POST',
|
|
76
|
+
headers: { 'content-type': 'application/json' },
|
|
77
|
+
body: JSON.stringify({ completedAt, blueprintSetVersion: '1.0.0', stepIds: ['step-1', 'step-2', 'step-3'] }),
|
|
78
|
+
});
|
|
79
|
+
const writeBody = JSON.parse(writeRes.body || '{}');
|
|
80
|
+
// Step 3a: completion GET reflects the written record (server-scoped
|
|
81
|
+
// persistence across requests).
|
|
82
|
+
const readRes = await fixtureFetch(fixture.url, `/api/tour/completion?principal-id=${principalId}&store=${store}`);
|
|
83
|
+
const readBody = JSON.parse(readRes.body || '{}');
|
|
84
|
+
// Step 3b: /tour render for the same principal now shows
|
|
85
|
+
// data-tour-first-run="false" (the completion feeds the server-derived
|
|
86
|
+
// first-run flag on the next principal load).
|
|
87
|
+
const afterWriteTour = await fixtureFetch(fixture.url, `/tour?store=${store}&principal-id=${principalId}`);
|
|
88
|
+
const afterWriteFirstRunFalse = /data-tour-first-run="false"/.test(afterWriteTour.body);
|
|
89
|
+
// Step 4: settings surface reachable and the restart-tour control
|
|
90
|
+
// is inside a POST form pointing at /actions/restart-tour with the
|
|
91
|
+
// principal-id in a hidden input (progressive-enhancement: this is
|
|
92
|
+
// what activating the button does on the server, regardless of JS).
|
|
93
|
+
const settings = await fixtureFetch(fixture.url, `/settings?store=${store}&principal-id=${principalId}`);
|
|
94
|
+
const restartFormActionMatch = settings.body.match(/<form[^>]*method="post"[^>]*action="\/actions\/restart-tour[^"]*"[^>]*>[\s\S]*?<button[^>]*data-action="restart-tour"[\s\S]*?<\/form>/i);
|
|
95
|
+
const settingsCarriesRestartForm = !!restartFormActionMatch
|
|
96
|
+
&& new RegExp(`name="principal-id"[^>]*value="${principalId}"`).test(restartFormActionMatch[0]);
|
|
97
|
+
const settingsReachable = settings.status === 200 && !!settings.requestId && settingsCarriesRestartForm;
|
|
98
|
+
// Step 5: POST /actions/restart-tour (the form submission the
|
|
99
|
+
// restart control fires). This is the server-observable "restart
|
|
100
|
+
// control activation" - the same POST fires whether the click was
|
|
101
|
+
// JS-driven or a plain form submit.
|
|
102
|
+
const restartRes = await fixtureFetch(fixture.url, `/actions/restart-tour?principal-id=${principalId}&store=${store}`, { method: 'POST' });
|
|
103
|
+
let restartBody = {};
|
|
104
|
+
try { restartBody = JSON.parse(restartRes.body || '{}'); } catch (_) { /* body parse */ }
|
|
105
|
+
// Step 6a: completion GET after restart-control activation returns 404 again.
|
|
106
|
+
const afterClear = await fixtureFetch(fixture.url, `/api/tour/completion?principal-id=${principalId}&store=${store}`);
|
|
107
|
+
const afterClearBody = JSON.parse(afterClear.body || '{}');
|
|
108
|
+
// Step 6b: /tour render for the same principal returns to
|
|
109
|
+
// data-tour-first-run="true" (the restart activation re-opens the
|
|
110
|
+
// tour on the next principal load, per AC-26104-1).
|
|
111
|
+
const afterClearTour = await fixtureFetch(fixture.url, `/tour?store=${store}&principal-id=${principalId}`);
|
|
112
|
+
const afterClearFirstRunTrue = /data-tour-first-run="true"/.test(afterClearTour.body);
|
|
113
|
+
|
|
114
|
+
const writePass = writeRes.status === 200 && writeBody.ok === true
|
|
115
|
+
&& writeBody.record && writeBody.record.completedAt === completedAt;
|
|
116
|
+
const readPass = readRes.status === 200 && readBody.completed === true
|
|
117
|
+
&& readBody.record && readBody.record.completedAt === completedAt
|
|
118
|
+
&& Array.isArray(readBody.record.stepIds) && readBody.record.stepIds.length === 3;
|
|
119
|
+
const restartActivationPass = restartRes.status === 200 && restartBody.ok === true
|
|
120
|
+
&& restartBody.principalId === principalId && restartBody.cleared === true
|
|
121
|
+
&& restartBody.restartControl === 'restart-tour';
|
|
122
|
+
const initialAbsent = initial.status === 404 && initialBody.completed === false;
|
|
123
|
+
const afterClearAbsent = afterClear.status === 404 && afterClearBody.completed === false;
|
|
124
|
+
const pass = !!initial.requestId && !!writeRes.requestId && !!readRes.requestId && !!restartRes.requestId && !!afterClear.requestId && !!afterClearTour.requestId
|
|
125
|
+
&& initialAbsent && writePass && readPass && settingsReachable && restartActivationPass && afterClearAbsent
|
|
126
|
+
&& initialFirstRunTrue && afterWriteFirstRunFalse && afterClearFirstRunTrue;
|
|
127
|
+
|
|
128
|
+
results.push({
|
|
129
|
+
anchorAcId,
|
|
130
|
+
verdict: pass ? 'pass' : 'fail',
|
|
131
|
+
detail: pass
|
|
132
|
+
? `${FIRST_EIGHT} for a fresh principalId ${principalId} under completion-state-store server-side-per-principal: initial completion GET returned 404 and the /tour render carried data-tour-first-run="true"; POST wrote a record with completedAt=${completedAt} and 3 stepIds; a subsequent completion GET returned the same record (persistence across requests) and the /tour render carried data-tour-first-run="false" (the completion feeds the server-derived first-run flag on the next principal load); the /settings render carried a <form method="post" action="/actions/restart-tour"> wrapping the data-action="restart-tour" button with the principal-id in a hidden input; POST /actions/restart-tour returned 200 { ok:true, cleared:true, principalId, restartControl:"restart-tour" } (the restart-control activation cleared the applied server-side store); a further completion GET returned 404 and the /tour render returned to data-tour-first-run="true" (the restart activation re-opens the tour on the next principal load); x-fixture-request-id (final)=${afterClearTour.requestId}`
|
|
133
|
+
: `${FIRST_EIGHT} evidence gap: initial=${initial.status}/${initialAbsent} initialFirstRunTrue=${initialFirstRunTrue} write=${writeRes.status}/${writePass} read=${readRes.status}/${readPass} afterWriteFirstRunFalse=${afterWriteFirstRunFalse} settings=${settings.status}/${settingsReachable} restart=${restartRes.status}/${restartActivationPass} afterClear=${afterClear.status}/${afterClearAbsent} afterClearFirstRunTrue=${afterClearFirstRunTrue}`,
|
|
134
|
+
evidence: {
|
|
135
|
+
requestId: afterClearTour.requestId,
|
|
136
|
+
responseStatus: afterClearTour.status,
|
|
137
|
+
bodyExcerpt: excerpt(JSON.stringify({ initial: initialBody, write: writeBody, read: readBody, restart: restartBody, afterClear: afterClearBody, firstRun: { initialFirstRunTrue, afterWriteFirstRunFalse, afterClearFirstRunTrue } })),
|
|
138
|
+
derived: {
|
|
139
|
+
principalId,
|
|
140
|
+
completedAt,
|
|
141
|
+
initialAbsent,
|
|
142
|
+
writePass,
|
|
143
|
+
readPass,
|
|
144
|
+
settingsReachable,
|
|
145
|
+
restartActivationPass,
|
|
146
|
+
afterClearAbsent,
|
|
147
|
+
initialFirstRunTrue,
|
|
148
|
+
afterWriteFirstRunFalse,
|
|
149
|
+
afterClearFirstRunTrue,
|
|
150
|
+
restartFormAction: '/actions/restart-tour',
|
|
151
|
+
restartRequestId: restartRes.requestId,
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
} finally {
|
|
156
|
+
await fixture.kill();
|
|
157
|
+
}
|
|
158
|
+
return { results };
|
|
159
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// application-onboarding-tour probe: first-run tour open (AC-26101-1).
|
|
2
|
+
//
|
|
3
|
+
// AC-26101-1 requires observing the tour dialog opening on the SPA
|
|
4
|
+
// for a first-run principal, Escape dismissing the tooltip, and a
|
|
5
|
+
// keyboard-only walk of the tour controls (WCAG 2.1.1, 2.1.2, 2.4.3).
|
|
6
|
+
// Every one of those assertions is browser-only: the tour tooltip is
|
|
7
|
+
// created by client script in the DOM, focus movement and Escape
|
|
8
|
+
// dismissal are browser events, and no server-side marker in this
|
|
9
|
+
// fixture represents the dialog-open state. Attempting to observe
|
|
10
|
+
// the tour open from a fixture HTTP response would only inspect the
|
|
11
|
+
// script's source text, not the dialog itself, so this probe emits
|
|
12
|
+
// notObservableHere rows naming AC-26101-1 and defers the observed
|
|
13
|
+
// assertion to the pack's browser check.
|
|
14
|
+
//
|
|
15
|
+
// The fixture is still spun up so the run record proves the fixture
|
|
16
|
+
// answers the route, matching the pack's environment expectations.
|
|
17
|
+
//
|
|
18
|
+
// AC-26101-1 first eight words: "Given a first-run principal on the SPA, the".
|
|
19
|
+
|
|
20
|
+
import { fixtureFetch, startFixture } from './probe-utils.mjs';
|
|
21
|
+
|
|
22
|
+
export const anchorAcId = 'application-onboarding-tour-AC-26101-1';
|
|
23
|
+
export const accountBound = false;
|
|
24
|
+
|
|
25
|
+
export default async function runProbe() {
|
|
26
|
+
const fixture = await startFixture();
|
|
27
|
+
const results = [];
|
|
28
|
+
try {
|
|
29
|
+
// Prove the fixture is answering the SPA route before deferring the
|
|
30
|
+
// observation to the browser check; the response itself carries no
|
|
31
|
+
// AC-observable content.
|
|
32
|
+
for (const route of ['/tour', '/onboarding', '/welcome']) {
|
|
33
|
+
const res = await fixtureFetch(fixture.url, route);
|
|
34
|
+
const reachable = res.status === 200 && !!res.requestId;
|
|
35
|
+
results.push({
|
|
36
|
+
anchorAcId,
|
|
37
|
+
notObservableAcId: anchorAcId,
|
|
38
|
+
verdict: 'warn',
|
|
39
|
+
notObservableHere: true,
|
|
40
|
+
reason: 'AC-26101-1 requires observing the tour dialog opening on the SPA, focus movement to the tooltip, and Escape dismissing the dialog on a keyboard-only walk; those are DOM/browser events created by client script and cannot be observed from a fixture HTTP response body. The tour open is deferred to the browser check in application-onboarding-tour.pack.mjs.',
|
|
41
|
+
detail: `Given a first-run principal on the SPA, the tour-open assertion is browser-only for route ${route}; fixture reachability confirmed (status=${res.status}, requestId=${res.requestId || 'absent'}, reachable=${reachable}).`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Returning-principal suppression (a stored completion record must
|
|
45
|
+
// suppress the auto-open on the SPA) is AC-26104-1's clause, not
|
|
46
|
+
// AC-26101-1's. The server-side half of that AC (the completion
|
|
47
|
+
// store and the /tour data-tour-first-run="false" flag it drives on
|
|
48
|
+
// the next principal load) is observed positively by the
|
|
49
|
+
// completion-persistence probe. The client-side auto-open
|
|
50
|
+
// suppression itself (the JS-driven decision on the SPA) is
|
|
51
|
+
// browser-only; recorded here as notObservableHere against
|
|
52
|
+
// AC-26104-1 (the AC the suppression belongs to) so the operator
|
|
53
|
+
// sees the browser-only gap.
|
|
54
|
+
const suppressionAcId = 'application-onboarding-tour-AC-26104-1';
|
|
55
|
+
results.push({
|
|
56
|
+
anchorAcId: suppressionAcId,
|
|
57
|
+
notObservableAcId: suppressionAcId,
|
|
58
|
+
verdict: 'warn',
|
|
59
|
+
notObservableHere: true,
|
|
60
|
+
reason: 'AC-26104-1 requires that activating the restart-tour control clears the completion state and re-opens the tour on the next principal load; the server-observable half (server-side completion store + data-tour-first-run flag on /tour + the /actions/restart-tour form action) is covered positively by completion-persistence. The client-JS-driven auto-open suppression on the SPA (readCompletion -> !alreadyDone -> openStep(0)) is browser-only and cannot be observed from a fixture HTTP response. Deferred to the browser check.',
|
|
61
|
+
detail: 'Given a completed tour, the completion state persists per principal in the applied store; the client-side auto-open suppression branch (a stored completion record stops the client script re-opening the tour on the SPA) is browser-only. The server-side half of AC-26104-1 is positively observed by completion-persistence; this row records the client-only gap explicitly.',
|
|
62
|
+
});
|
|
63
|
+
} finally {
|
|
64
|
+
await fixture.kill();
|
|
65
|
+
}
|
|
66
|
+
return { results };
|
|
67
|
+
}
|