rcf-lite 0.27.0 → 0.28.1
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 +39 -0
- package/README.md +19 -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 +46 -0
- package/rcf/code-nodes/cn-601.json +18 -0
- package/rcf/code-nodes/cn-602.json +16 -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 +18 -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 +46 -0
- package/rcf/fbs/fbs-182.json +43 -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 +40 -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 +40 -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 +174 -0
- package/rcf/test-suites/ts-189.json +60 -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 +60 -0
- package/rcf/user-stories/us-15701.json +42 -0
- package/rcf/user-stories/us-15801.json +51 -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 +21 -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 +2213 -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 +455 -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 +1148 -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
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"acceptanceCriteria": [
|
|
12
12
|
{
|
|
13
13
|
"id": "AC-19106-1",
|
|
14
|
-
"description": "Given a rendered dashboard surface, the export handle region contains one labelled `<button>` (accessible name reads `Export` or an operator-configured equivalent) that on activation exposes a keyboard-reachable list of formats (a menu, a listbox or a set of `<button>` elements). The rendered format list carries at least the three shipped formats (CSV, PDF, PNG-of-chart) unless ADR-2003's elicited override replaces the set; every format entry carries a `data-export-format` attribute whose value is one of `csv`, `pdf`, `png-chart` or the elicited value. Escape closes the list and returns focus to the export button. Hover-only export dropdowns fail project-side
|
|
14
|
+
"description": "Given a rendered dashboard surface, the export handle region contains one labelled `<button>` (accessible name reads `Export` or an operator-configured equivalent) that on activation exposes a keyboard-reachable list of formats (a menu, a listbox or a set of `<button>` elements). The rendered format list carries at least the three shipped formats (CSV, PDF, PNG-of-chart) unless ADR-2003's elicited override replaces the set; every format entry carries a `data-export-format` attribute whose value is one of `csv`, `pdf`, `png-chart` or the elicited value. Escape closes the list and returns focus to the export button. Hover-only export dropdowns fail project-side check. Applying agent sets: the export-button accessible name (default `Export` or the operator-configured equivalent), the export-format list (default `csv`, `pdf`, `png-chart` or the ADR-2003 elicited override) and the `data-export-format` values the format entries carry.",
|
|
15
15
|
"given": "a rendered dashboard with an export handle",
|
|
16
16
|
"when": "the operator activates the export button",
|
|
17
17
|
"then": "an accessible format list opens with the shipped formats, keyboard-reachable, closable on Escape",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19106-2",
|
|
24
|
-
"description": "Given a PNG-of-chart export selection, the export handle delegates the PNG generation to the application-charts render shell (TAC-1901): the handle names the chart the operator picked from the chart region (a `data-chart-id` reference on the format entry, or a runtime prompt asking which chart) and the charts shell owns the PNG output. A dashboard shell that ships its own PNG generator inside the dashboard code fails project-side
|
|
24
|
+
"description": "Given a PNG-of-chart export selection, the export handle delegates the PNG generation to the application-charts render shell (TAC-1901): the handle names the chart the operator picked from the chart region (a `data-chart-id` reference on the format entry, or a runtime prompt asking which chart) and the charts shell owns the PNG output. A dashboard shell that ships its own PNG generator inside the dashboard code fails project-side check. This AC is a project-side contract; the pack does not exercise the PNG generation today (no download-capture seam on the pack browser), and the README names the delegation-observation gap under known mechanism-reach gaps. Applying agent sets: the chart-selection mechanism the export handle uses for PNG-of-chart (the `data-chart-id` reference on the format entry, or a runtime prompt naming the chart the operator picked) and the application-charts render-shell mount point the shell delegates to.",
|
|
25
25
|
"given": "a PNG-of-chart export selection",
|
|
26
26
|
"when": "the export handle activates",
|
|
27
27
|
"then": "PNG generation delegates to the application-charts render shell",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"acceptanceCriteria": [
|
|
12
12
|
{
|
|
13
13
|
"id": "AC-19107-1",
|
|
14
|
-
"description": "The blueprint ships an operator-and-agent-readable design-guidance file at `assets/guidance/dashboard-design.md` covering the eight sections named in spec 5.3.1 (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns). Each section names whether the rule hardens into an AC on this blueprint (the section names the AC id) or stays operator guidance the applying agent honours at project-side
|
|
14
|
+
"description": "The blueprint ships an operator-and-agent-readable design-guidance file at `assets/guidance/dashboard-design.md` covering the eight sections named in spec 5.3.1 (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns). Each section names whether the rule hardens into an AC on this blueprint (the section names the AC id) or stays operator guidance the applying agent honours at project-side check. The file cites at least five https:// sources from the five named source families (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs). The applying agent confirms the file is present on the applied blueprint source path recorded on `manifest.blueprints[].source` and takes no substitution at project apply time.",
|
|
15
15
|
"given": "the shipped blueprint",
|
|
16
16
|
"when": "the applying agent reads assets/guidance/dashboard-design.md",
|
|
17
17
|
"then": "the eight sections and the five https citations are present and each section names AC or guidance",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19107-2",
|
|
24
|
-
"description": "The dashboard shell's runtime shape reflects the rules the guidance hardens into ACs: the primary-kpi kind is one of the ADR-2001 enum values (asserted through `data-kpi-kind` on the primary tile; guidance section 1 hardens into AC-19102-1); the shell renders an `as of <ISO-8601>` stamp (guidance section 7 hardens into AC-19104-1); auto-refresh is off unless the elicited interval is set (guidance section 7 hardens into AC-19104-2). A shipped surface that violates any of these rules fails the corresponding pack check or project-side
|
|
24
|
+
"description": "The dashboard shell's runtime shape reflects the rules the guidance hardens into ACs: the primary-kpi kind is one of the ADR-2001 enum values (asserted through `data-kpi-kind` on the primary tile; guidance section 1 hardens into AC-19102-1); the shell renders an `as of <ISO-8601>` stamp (guidance section 7 hardens into AC-19104-1); auto-refresh is off unless the elicited interval is set (guidance section 7 hardens into AC-19104-2). A shipped surface that violates any of these rules fails the corresponding pack check or project-side check. Applying agent sets: the primary-kpi kind value from the ADR-2001 enum (`revenue`, `active-users`, `error-rate`, `throughput`, or `custom` with a `data-kpi-name`), the auto-refresh interval or the off default, and the tile-inventory slot mapping the shell renders.",
|
|
25
25
|
"given": "a rendered dashboard shell",
|
|
26
26
|
"when": "the shell is inspected against the guidance's hardened rules",
|
|
27
27
|
"then": "the shape honours the primary-kpi kind, the as-of stamp and the auto-refresh default",
|
|
@@ -63,10 +63,10 @@
|
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
"id": "AC-19107-5",
|
|
66
|
-
"description": "Given an applying project that ships a surface deviating from a
|
|
66
|
+
"description": "Given an applying project that ships a surface deviating from a shipped rule (a primary KPI placed top-right for cultural reasons, a tile density above the guidance cap), the deviation is documented on the project's own README under CALLS MADE with the guidance section quoted verbatim and the project's reason; a deviation without a documented CALLS MADE entry fails project-side check. Applying agent sets: the CALLS MADE entry text (the shipped guidance section quoted verbatim and the project's reason for deviating), the project's superseding REQ id, and the specific deviation named (for example the primary-kpi placement or the tile-density limit).",
|
|
67
67
|
"given": "an applying project surface deviating from a ratified guidance rule",
|
|
68
|
-
"when": "the
|
|
69
|
-
"then": "the deviation is documented with the guidance section quoted verbatim and the project's reason; an undocumented deviation fails
|
|
68
|
+
"when": "the check inspects the project's CALLS MADE section",
|
|
69
|
+
"then": "the deviation is documented with the guidance section quoted verbatim and the project's reason; an undocumented deviation fails the check",
|
|
70
70
|
"testable": true,
|
|
71
71
|
"scope": "unclassified",
|
|
72
72
|
"disposition": "template"
|
|
@@ -56,6 +56,6 @@ Every check carries a `description` field per spec section 9. `appliesTo` binds
|
|
|
56
56
|
|
|
57
57
|
## Consumers and dependencies
|
|
58
58
|
|
|
59
|
-
- Consumes `application-charts
|
|
60
|
-
- References `application-datatable`
|
|
59
|
+
- Consumes `application-charts`: the chart region on every dashboard surface mounts through the application-charts render shell (TAC-1901). The dashboard pack does not duplicate the chart-accessibility ACs; the charts pack fires on the dashboard's chart route through its own applicability predicate.
|
|
60
|
+
- References `application-datatable` in the packaged design guidance's section 6 ("when a table beats a chart"). A dashboard whose data really wants a records table applies the datatable blueprint instead of overloading the tile row.
|
|
61
61
|
- Extends the pack-browser seam with a `resize(width, height)` method; every blueprint after this one that ships a breakpoint-scoped visual AC reuses the seam.
|
|
@@ -37,7 +37,7 @@ Every dashboard surface renders the five labelled regions. The primary KPI tile
|
|
|
37
37
|
|
|
38
38
|
## Common gotchas
|
|
39
39
|
|
|
40
|
-
- The primary KPI is a fixed enum (five values plus `custom` with a name). A free-form `data-kpi-kind` is refused at project-side
|
|
40
|
+
- The primary KPI is a fixed enum (five values plus `custom` with a name). A free-form `data-kpi-kind` is refused at project-side check.
|
|
41
41
|
- The as-of stamp lives on the shell root and every tile carries the same value. A tile whose stamp drifts is a defect.
|
|
42
42
|
- Auto-refresh is off unless the operator opted in with an interval. A dashboard that refreshes every 30 seconds without an opt-in is a common accessibility and cost defect.
|
|
43
43
|
- The export handle carries no PNG generator of its own. PNG-of-chart delegates to the application-charts render shell; a project that ships a chart engine outside the render shell either supersedes the delegation or loses the PNG affordance.
|
|
@@ -45,4 +45,4 @@ Every dashboard surface renders the five labelled regions. The primary KPI tile
|
|
|
45
45
|
|
|
46
46
|
## Cost honesty
|
|
47
47
|
|
|
48
|
-
Shipping this blueprint costs the project a design pass on the tile inventory (which tile is the primary KPI, how many supporting tiles) and an operator conversation on the timeframe and export sets. It buys the accessibility contract on every tile, the fan-out contract on every timeframe change, the packaged design guidance the applying agent reads at apply, and the probe pack that refuses ship on a broken tile grid or a drifted fan-out. The
|
|
48
|
+
Shipping this blueprint costs the project a design pass on the tile inventory (which tile is the primary KPI, how many supporting tiles) and an operator conversation on the timeframe and export sets. It buys the accessibility contract on every tile, the fan-out contract on every timeframe change, the packaged design guidance the applying agent reads at apply, and the probe pack that refuses ship on a broken tile grid or a drifted fan-out. The probe pack runs green against the sample-app fixture and the applying project's own dashboard surface is reviewed against the packaged guidance's eight sections.
|
|
@@ -1,29 +1,39 @@
|
|
|
1
1
|
# application-datatable CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 1.0.9 - 2026-09-11
|
|
4
|
+
|
|
5
|
+
- Adds a contributions/probes pack meeting rule 7d.
|
|
6
|
+
- Probes: apg-table-shape, sort-adapter-round-trip, search-adapter-round-trip, four-states-regions.
|
|
7
|
+
- Arrow-key cell focus (AC-17107-5) is a browser-only property and is recorded as notObservableHere with the shipped AC id and reason; the row anchors nothing else.
|
|
8
|
+
- Sort/search adapters observe the server round trip; the DOM click / typing halves are conformanceOnly + limitation naming the AC id and the browser property.
|
|
9
|
+
- No-results uses a non-empty filter and checks the no-filter negative case.
|
|
10
|
+
- Anatomy test pin bumped to 1.0.9.
|
|
11
|
+
|
|
12
|
+
|
|
3
13
|
## 1.0.4 - 2026-09-10
|
|
4
14
|
|
|
5
|
-
|
|
15
|
+
Template-AC fill-in clauses on AC-17101-3, AC-17102-1, AC-17108-2, AC-17108-3, AC-17109-1 and AC-17109-3 now enumerate the specific applying-project substitutions (column-id set, query-adapter endpoint and debounce, elicited query-adapter mode, applied default page size, elicited selection-persistence value, accessible-copy text near the bulk-action control) in place of the earlier generic phrasing, so applying projects have precise values to fill in. TAC-1802 owns the `sort=<column>:<asc|desc>` grammar and the fixed `pageSize` query-parameter name; TAC-1803-application-datatable-selection-model patch-bumped to 1.0.2 with the `data-selection-persistence` marker on the bulk-action region added to responsibilities[3] and referenced from AC-17109-3. Datatable README and guide shipped prose neutralised: the dated visual-specification reference and the residual mechanism-reach gap parenthetical have been dropped from the README, and the dashboard-blueprint mention has been rewritten in the guide.
|
|
6
16
|
|
|
7
17
|
|
|
8
18
|
## 1.0.3 (register-sweep patch, 2026-09-10)
|
|
9
19
|
|
|
10
20
|
- Register: neutral wording in shipped prose (no capability change).
|
|
11
21
|
|
|
12
|
-
## 1.0.2 (
|
|
22
|
+
## 1.0.2 (2026-09-09)
|
|
13
23
|
|
|
14
24
|
- Adds top-level elicits[] block on blueprint.json declaring the four apply-time answers (query-adapter-mode, url-state-strategy, page-size, selection-persistence); each option value backed by a must REQ description with a runtime clause per section 7c. REQ-001 gains a page-size 25 default clause; REQ-002 gains url-query / session-scoped URL-state clause; REQ-004 gains per-page / cross-page selection-persistence clause. capabilities[] not declared: leaf blueprint (no consumer requiresAppliedCapabilities on the shelf references a datatable capability).
|
|
15
|
-
-
|
|
25
|
+
- Register-and-citation sweep 2026-09-10: vendorCitation added to eight fixed ACs whose assertions rest on W3C facts: AC-17104-3 (WCAG 2.4.3 focus-order), AC-17104-6 (ARIA APG dialog-modal pattern), AC-17105-2 (WCAG 1.4.1 use-of-color), AC-17106-4 (WCAG 2.5.7 dragging-movements), AC-17107-2 (WCAG 4.1.2 name-role-value), AC-17107-3 (WCAG 1.3.1 info-and-relationships), AC-17107-4 (ARIA APG table pattern), AC-17107-5 (ARIA APG grid pattern); each citation carries verifiedOn 2026-09-09.
|
|
16
26
|
- Adds refusal-path ACs to US-17104 (bulk-action max-cap refusal, dialog Cancel focus return, focus trap), US-17106 (drag-only refusal, hidden-column orphan cells, hidden column with active sort/filter), US-17107 (read-only role=grid refusal, role=grid arrow navigation, mixed-interactive shell pattern), US-17108 (session-scoped no-URL contract, invalid-URL rejection, history.replaceState per micro-change), US-17109 (dialog aria-describedby total count, filter narrows presentation not selection, Clear selection control). Every story now at the 7a floor (4-6 ACs per story, 46 ACs total on the blueprint).
|
|
17
27
|
|
|
18
|
-
## 1.0.1 (
|
|
28
|
+
## 1.0.1 (2026-09-09)
|
|
19
29
|
|
|
20
|
-
-
|
|
21
|
-
- Added AC-17101-4, AC-17102-4, AC-17103-4 and AC-17105-4 (loading indicator clears, announced error region replaces the pending state, last successful rows retained)
|
|
30
|
+
- Hardening cleanup: chain-consistency lint clean at baseline; added deliveredBy to every REQ, added ownerRef and disposition to every AC per section 7b.
|
|
31
|
+
- Added AC-17101-4, AC-17102-4, AC-17103-4 and AC-17105-4 (loading indicator clears, announced error region replaces the pending state, last successful rows retained) on TAC-1802.internalStructure for sort, filter, pagination and URL-state page requests that reject, so applying projects have explicit acceptance criteria for the four request-reject paths.
|
|
22
32
|
|
|
23
33
|
|
|
24
34
|
## 1.0.0 (2026-09-04)
|
|
25
35
|
|
|
26
|
-
-
|
|
36
|
+
- Initial shipped version of the shelf's datatable blueprint. Six REQs (table shell, sort semantics, filter chrome, selection and bulk actions, empty / loading / error / no-results states, column visibility / reorder / resize), nine USs binding 27 runtime-observable ACs, three TACs (shell, query adapter, selection model), four ADRs (pattern choice, URL state, page size, selection persistence). No new global topics.
|
|
27
37
|
- Ships `probe-packs/application-datatable.pack.mjs`: six browser-verify checks anchored to AC-17101-1, AC-17102-1, AC-17103-2, AC-17104-3, AC-17105-1, AC-17106-1. First blueprint on the shelf that ships a Playwright probe pack under the runner extension.
|
|
28
|
-
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-datatable/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the
|
|
29
|
-
- Suggests the `logging` and `errorHandling` companions with the
|
|
38
|
+
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-datatable/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the probe pack drives.
|
|
39
|
+
- Suggests the `logging` and `errorHandling` companions with the shipped spec's reasons.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Datatable blueprint (v1.0.4)
|
|
2
2
|
|
|
3
|
-
Vendor-neutral datatable contract for a rcf-lite application. Ships the ARIA APG table / grid pattern choice (per interactivity), the sort / filter / paginate discipline, the selection model with a bulk-action confirmation dialog, the four-state region contract (empty / loading / error / no-results), and a non-drag keyboard path for column visibility / reorder / resize. Ships a Playwright probe pack under `probe-packs/application-datatable.pack.mjs` whose six checks are the runtime gate the delivery-ci-workflows runner drives (section 5 of the
|
|
3
|
+
Vendor-neutral datatable contract for a rcf-lite application. Ships the ARIA APG table / grid pattern choice (per interactivity), the sort / filter / paginate discipline, the selection model with a bulk-action confirmation dialog, the four-state region contract (empty / loading / error / no-results), and a non-drag keyboard path for column visibility / reorder / resize. Ships a Playwright probe pack under `probe-packs/application-datatable.pack.mjs` whose six checks are the runtime gate the delivery-ci-workflows runner drives (section 5 of the visual specification). No new global topics; suggests the `logging` and `errorHandling` companions.
|
|
4
4
|
|
|
5
5
|
## Apply
|
|
6
6
|
|
|
@@ -34,7 +34,7 @@ The pack fires ONLY when its `appliesTo` returns true; a project whose FBS does
|
|
|
34
34
|
|
|
35
35
|
## Quality bar
|
|
36
36
|
|
|
37
|
-
Table or grid ARIA APG pattern per interactivity (ADR-1801); sortable columns keyboard-reachable with `aria-sort` announcing direction; text filter carrying `q` into the query adapter with per-column dropdowns composing deterministically; pagination controls with an `aria-live=\"polite\"` region reading `Page N of M`; selection model with per-row toggles and a page-level toggle; bulk actions opening a dialog under ARIA APG dialog-modal (`role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby`, `aria-describedby`, focus return to the originating row on close); four distinct states in `role=\"region\"` with `aria-live=\"polite\"`; non-colour distinction on every state (WCAG 1.4.1); URL-state serialisation of sort, filter and page as the recommended default (ADR-1802); default page size 25 elicitable at apply (ADR-1803); selection persistence elicited (ADR-1804); non-drag keyboard alternative for column visibility, reorder and resize (WCAG 2.5.7). Every bar is carried by ACs in the doc set
|
|
37
|
+
Table or grid ARIA APG pattern per interactivity (ADR-1801); sortable columns keyboard-reachable with `aria-sort` announcing direction; text filter carrying `q` into the query adapter with per-column dropdowns composing deterministically; pagination controls with an `aria-live=\"polite\"` region reading `Page N of M`; selection model with per-row toggles and a page-level toggle; bulk actions opening a dialog under ARIA APG dialog-modal (`role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby`, `aria-describedby`, focus return to the originating row on close); four distinct states in `role=\"region\"` with `aria-live=\"polite\"`; non-colour distinction on every state (WCAG 1.4.1); URL-state serialisation of sort, filter and page as the recommended default (ADR-1802); default page size 25 elicitable at apply (ADR-1803); selection persistence elicited (ADR-1804); non-drag keyboard alternative for column visibility, reorder and resize (WCAG 2.5.7). Every bar is carried by ACs in the doc set. Browser-observable bars are covered by the shipped Playwright pack. On the server-side probe pack: AC-17107-5 (arrow-key cell focus) is recorded as `notObservableHere`; AC-17107-1 is anchored positively on the returned grid/header markup; AC-17101-1 and AC-17102-1 are anchored on the server round trip and marked `conformanceOnly` with a limitation naming that the corresponding DOM interaction half is browser-only.
|
|
38
38
|
|
|
39
39
|
## Known mechanism-reach gaps
|
|
40
40
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "application-datatable",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"category": "application",
|
|
5
5
|
"suggestedCompanions": [
|
|
6
6
|
{
|
|
@@ -171,5 +171,6 @@
|
|
|
171
171
|
"elicited": true,
|
|
172
172
|
"standardsTraceClause": "generic enterprise practice"
|
|
173
173
|
}
|
|
174
|
-
]
|
|
174
|
+
],
|
|
175
|
+
"updatedAt": "2026-09-11T16:04:17Z"
|
|
175
176
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// apg-table-shape probe for application-datatable v1.0.9.
|
|
2
|
+
//
|
|
3
|
+
// AC-17107-1 (server-observable): the rendered
|
|
4
|
+
// datatable is a <table role="grid"> with <th> cells scoped to col;
|
|
5
|
+
// this is a real DOM shape the probe reads directly from the shell
|
|
6
|
+
// route. The row is a plain anchor (not conformanceOnly, not
|
|
7
|
+
// notObservableHere) - the AC is fully observable server-side.
|
|
8
|
+
// AC-17107-5 (arrow-key cell focus) remains browser-only.
|
|
9
|
+
//
|
|
10
|
+
// anchorAcId: application-datatable-AC-17107-1 (row 1) and
|
|
11
|
+
// application-datatable-AC-17107-5 (row 2, notObservableHere).
|
|
12
|
+
|
|
13
|
+
import { startFixture, evidenceFromResponse, notObservableHereResult } from './probe-utils.mjs';
|
|
14
|
+
|
|
15
|
+
export const anchorReqId = 'application-datatable-REQ-001';
|
|
16
|
+
export const accountBound = false;
|
|
17
|
+
|
|
18
|
+
export default async function runProbe() {
|
|
19
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js');
|
|
20
|
+
const fixture = await startFixture({ startServer, port: 0 });
|
|
21
|
+
try {
|
|
22
|
+
const results = [];
|
|
23
|
+
const res = await fetch(`${fixture.baseUrl}/`);
|
|
24
|
+
const body = await res.text();
|
|
25
|
+
const hasGrid = /<table[^>]+role="grid"/.test(body);
|
|
26
|
+
const colHeaders = (body.match(/scope="col"/g) || []).length;
|
|
27
|
+
const sortControls = (body.match(/class="sortControl"/g) || []).length;
|
|
28
|
+
const rowSelectors = (body.match(/class="rowSelect"/g) || []).length;
|
|
29
|
+
const interactivityShipped = /rowSelect/.test(body) && /bulkAction/.test(body);
|
|
30
|
+
const pass = res.status === 200 && hasGrid && colHeaders >= 4 && sortControls >= 4 && interactivityShipped;
|
|
31
|
+
results.push({
|
|
32
|
+
anchorAcId: 'application-datatable-AC-17107-1',
|
|
33
|
+
verdict: pass ? 'pass' : 'fail',
|
|
34
|
+
detail: `Given a datatable shell that renders interactive per-row - shell renders <table role="grid"> with ${colHeaders} scope="col" headers and per-row interactivity (sortControls=${sortControls}, rowSelectors=${rowSelectors})`,
|
|
35
|
+
evidence: evidenceFromResponse({
|
|
36
|
+
route: '/',
|
|
37
|
+
response: res,
|
|
38
|
+
bodyText: body,
|
|
39
|
+
extraFields: {
|
|
40
|
+
input: { fixtureShipsInteractivity: interactivityShipped },
|
|
41
|
+
derived: { gridRole: hasGrid, colHeaders, sortControls, rowSelectors },
|
|
42
|
+
},
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
results.push(notObservableHereResult({
|
|
47
|
+
ac: 'application-datatable-AC-17107-5',
|
|
48
|
+
detail: 'Given a `role="grid"` shell, when the operator uses - arrow-key cell focus is browser-only per the browser-only rule',
|
|
49
|
+
reason: 'AC-17107-5 requires observing arrow-key cell focus movement; server-side probe pack cannot observe focus',
|
|
50
|
+
evidence: { requires: 'browser keydown events + focus observation' },
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
return { results };
|
|
54
|
+
} finally {
|
|
55
|
+
await fixture.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// four-states-regions probe for application-datatable v1.0.9.
|
|
2
|
+
//
|
|
3
|
+
// Verifies AC-17105-1: each of the four AC-declared states
|
|
4
|
+
// (empty, loading, error, no-results) renders inside its own
|
|
5
|
+
// role="region" element carrying aria-live="polite". The no-results
|
|
6
|
+
// state is asserted under an ACTIVE filter (q=zzz-no-hits) so the
|
|
7
|
+
// fixture's "active filter with zero matches" branch is exercised
|
|
8
|
+
// (AC-17105-1's condition).
|
|
9
|
+
//
|
|
10
|
+
// anchorAcId: application-datatable-AC-17105-1.
|
|
11
|
+
|
|
12
|
+
import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
|
|
13
|
+
|
|
14
|
+
export const anchorReqId = 'application-datatable-REQ-005';
|
|
15
|
+
export const accountBound = false;
|
|
16
|
+
|
|
17
|
+
const STATE_MATRIX = [
|
|
18
|
+
{ state: 'empty', regionId: 'emptyRegion', query: '' },
|
|
19
|
+
{ state: 'loading', regionId: 'loadingRegion', query: '' },
|
|
20
|
+
{ state: 'error', regionId: 'errorRegion', query: '' },
|
|
21
|
+
{ state: 'no-results', regionId: 'noResultsRegion', query: '&q=zzz-no-hits' },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
export default async function runProbe() {
|
|
25
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js');
|
|
26
|
+
const fixture = await startFixture({ startServer, port: 0 });
|
|
27
|
+
try {
|
|
28
|
+
const results = [];
|
|
29
|
+
for (const { state, regionId, query } of STATE_MATRIX) {
|
|
30
|
+
const res = await fetch(`${fixture.baseUrl}/?state=${state}${query}`);
|
|
31
|
+
const body = await res.text();
|
|
32
|
+
const pattern = new RegExp(`<section[^>]+role="region"[^>]+aria-live="polite"[^>]+id="${regionId}"`);
|
|
33
|
+
const alternate = new RegExp(`<section[^>]+id="${regionId}"[^>]+role="region"[^>]+aria-live="polite"`);
|
|
34
|
+
const regionOk = pattern.test(body) || alternate.test(body);
|
|
35
|
+
const textNamed = new RegExp(state === 'no-results' ? '(No results|no results)' : `(${state.charAt(0).toUpperCase()}${state.slice(1)}|${state})`, 'i').test(body);
|
|
36
|
+
const pass = res.status === 200 && regionOk && textNamed;
|
|
37
|
+
results.push({
|
|
38
|
+
anchorAcId: 'application-datatable-AC-17105-1',
|
|
39
|
+
anchorReqId: 'application-datatable-REQ-005',
|
|
40
|
+
verdict: pass ? 'pass' : 'fail',
|
|
41
|
+
detail: `Given a datatable route in each of the - state="${state}" (query=${query || 'none'}) renders <section role="region" aria-live="polite" id="${regionId}"> with text naming the state`,
|
|
42
|
+
evidence: evidenceFromResponse({
|
|
43
|
+
route: `/?state=${state}${query}`,
|
|
44
|
+
response: res,
|
|
45
|
+
bodyText: body,
|
|
46
|
+
extraFields: {
|
|
47
|
+
input: { state, activeFilter: query.replace('&q=', '') || null },
|
|
48
|
+
derived: { regionId, regionOk, textNamed },
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// Negative case: state=no-results WITHOUT q falls back to
|
|
54
|
+
// populated grid (no noResultsRegion). Derived output is that
|
|
55
|
+
// absence.
|
|
56
|
+
const negRes = await fetch(`${fixture.baseUrl}/?state=no-results`);
|
|
57
|
+
const negBody = await negRes.text();
|
|
58
|
+
const negHasNoResults = /<section[^>]+id="noResultsRegion"/.test(negBody);
|
|
59
|
+
const negHasGrid = /<section[^>]+id="gridRegion"/.test(negBody);
|
|
60
|
+
const negOk = negRes.status === 200 && !negHasNoResults && negHasGrid;
|
|
61
|
+
results.push({
|
|
62
|
+
anchorAcId: 'application-datatable-AC-17105-1',
|
|
63
|
+
anchorReqId: 'application-datatable-REQ-005',
|
|
64
|
+
verdict: negOk ? 'pass' : 'fail',
|
|
65
|
+
detail: `Given a datatable route in each of the - state=no-results without an active filter falls back to populated grid (AC-17105-1's active-filter condition): noResultsRegion=${negHasNoResults} gridRegion=${negHasGrid}`,
|
|
66
|
+
evidence: evidenceFromResponse({
|
|
67
|
+
route: '/?state=no-results',
|
|
68
|
+
response: negRes,
|
|
69
|
+
bodyText: negBody,
|
|
70
|
+
extraFields: {
|
|
71
|
+
input: { state: 'no-results', activeFilter: null },
|
|
72
|
+
derived: { hasNoResultsRegion: negHasNoResults, hasGridRegion: negHasGrid },
|
|
73
|
+
},
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
return { results };
|
|
77
|
+
} finally {
|
|
78
|
+
await fixture.close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// Shared helpers for application-datatable probes.
|
|
2
|
+
//
|
|
3
|
+
// The engine under probe is the sample-app fixture at
|
|
4
|
+
// packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js. The
|
|
5
|
+
// fixture stamps an x-fixture-request-id header on every response as
|
|
6
|
+
// part of its own request pipeline (no probe-side monkey-patch), so
|
|
7
|
+
// the identifier the probe records is the identifier the engine
|
|
8
|
+
// itself issued. Probes call the fixture over real HTTP via node's
|
|
9
|
+
// fetch, vary inputs, assert derived outputs, and record the
|
|
10
|
+
// request-id, status, body excerpt, the varied input and the derived
|
|
11
|
+
// output as evidence on every result row.
|
|
12
|
+
// No account-bound branch: the engine is a local fixture, not a
|
|
13
|
+
// third-party account, so no CI_HAS_* gate is invented. Every env
|
|
14
|
+
// var this pack reads is declared on the fixture README.
|
|
15
|
+
|
|
16
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
17
|
+
import { dirname, resolve } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
|
|
20
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
export const PROJECT_ROOT = resolve(HERE, '..', '..', '..', '..');
|
|
22
|
+
export const FIXTURE_DIR = resolve(PROJECT_ROOT, 'packages/rcf-lite/test/fixtures/probe-pack-application-datatable');
|
|
23
|
+
export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/application-datatable');
|
|
24
|
+
|
|
25
|
+
export const DEFAULT_PORT = 0;
|
|
26
|
+
|
|
27
|
+
export function aggregate(results) {
|
|
28
|
+
if (!Array.isArray(results) || results.length === 0) return 'fail';
|
|
29
|
+
if (results.some((r) => r.verdict === 'fail')) return 'fail';
|
|
30
|
+
if (results.some((r) => r.verdict === 'warn')) return 'warn';
|
|
31
|
+
return 'pass';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Empty results never pass: a synthesised row is emitted with an actionable detail and its
|
|
35
|
+
// own evidence object recording the empty condition so the row is
|
|
36
|
+
// not a naked verdict scalar.
|
|
37
|
+
export function normaliseResults(results) {
|
|
38
|
+
if (!Array.isArray(results) || results.length === 0) {
|
|
39
|
+
return [{
|
|
40
|
+
anchorReqId: 'unknown',
|
|
41
|
+
verdict: 'fail',
|
|
42
|
+
detail: 'no checks ran',
|
|
43
|
+
evidence: {
|
|
44
|
+
reason: 'empty-results',
|
|
45
|
+
route: 'n/a',
|
|
46
|
+
status: 0,
|
|
47
|
+
xFixtureRequestId: null,
|
|
48
|
+
bodyExcerpt: '',
|
|
49
|
+
},
|
|
50
|
+
}];
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function writeReport({ probeName, engine, results, extra }) {
|
|
56
|
+
await mkdir(REPORT_DIR, { recursive: true });
|
|
57
|
+
const report = {
|
|
58
|
+
slug: 'application-datatable',
|
|
59
|
+
probeName,
|
|
60
|
+
runAt: new Date().toISOString(),
|
|
61
|
+
engine,
|
|
62
|
+
results,
|
|
63
|
+
aggregateVerdict: aggregate(results),
|
|
64
|
+
...(extra ?? {}),
|
|
65
|
+
};
|
|
66
|
+
const path = resolve(REPORT_DIR, `${probeName}.json`);
|
|
67
|
+
await writeFile(path, JSON.stringify(report, null, 2) + '\n', 'utf8');
|
|
68
|
+
return { report, path };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Starts the fixture on an ephemeral port (or PROBE_PORT when set)
|
|
72
|
+
// and returns { server, port, baseUrl, close }. The close helper
|
|
73
|
+
// rejects when the underlying close callback carries an error;
|
|
74
|
+
// swallowing a teardown error would hide a boundary failure.
|
|
75
|
+
export async function startFixture({ startServer, port } = {}) {
|
|
76
|
+
const resolvedPort = typeof port === 'number'
|
|
77
|
+
? port
|
|
78
|
+
: Number(process.env.PROBE_PORT ?? DEFAULT_PORT);
|
|
79
|
+
const started = await startServer({ port: resolvedPort });
|
|
80
|
+
return {
|
|
81
|
+
server: started.server,
|
|
82
|
+
port: started.port,
|
|
83
|
+
baseUrl: `http://127.0.0.1:${started.port}`,
|
|
84
|
+
close: () => new Promise((res, rej) => started.server.close((err) => {
|
|
85
|
+
if (err) rej(err);
|
|
86
|
+
else res();
|
|
87
|
+
})),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Reads a distinctive slice of a response body: the first N chars
|
|
92
|
+
// so the report carries a body excerpt alongside the header id.
|
|
93
|
+
export function bodyExcerpt(text, max = 240) {
|
|
94
|
+
if (text == null) return '';
|
|
95
|
+
const s = typeof text === 'string' ? text : String(text);
|
|
96
|
+
return s.length > max ? s.slice(0, max) + '...' : s;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Records the positive-evidence shape on a probe result. Every row
|
|
100
|
+
// carries route, status, the request id the fixture stamped, and a
|
|
101
|
+
// body excerpt; the caller may extend the object with the varied
|
|
102
|
+
// input and the derived output for that row.
|
|
103
|
+
export function evidenceFromResponse({ route, response, bodyText, extraFields }) {
|
|
104
|
+
return {
|
|
105
|
+
route,
|
|
106
|
+
status: response.status,
|
|
107
|
+
xFixtureRequestId: response.headers.get('x-fixture-request-id') || null,
|
|
108
|
+
bodyExcerpt: bodyExcerpt(bodyText),
|
|
109
|
+
...(extraFields ?? {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export async function runShim(probeName, engine, mainFn) {
|
|
114
|
+
try {
|
|
115
|
+
const outcome = (await mainFn()) ?? { results: [] };
|
|
116
|
+
const { results, extra } = outcome;
|
|
117
|
+
const { report, path } = await writeReport({ probeName, engine, results: normaliseResults(results), extra });
|
|
118
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
119
|
+
process.stdout.write(`report written to ${path}\n`);
|
|
120
|
+
if (report.aggregateVerdict !== 'pass') process.exitCode = 1;
|
|
121
|
+
} catch (err) {
|
|
122
|
+
const results = [{
|
|
123
|
+
anchorReqId: 'unknown',
|
|
124
|
+
verdict: 'fail',
|
|
125
|
+
detail: `probe threw: ${err && err.message ? err.message : String(err)}`,
|
|
126
|
+
evidence: {
|
|
127
|
+
reason: 'probe-threw',
|
|
128
|
+
route: 'n/a',
|
|
129
|
+
status: 0,
|
|
130
|
+
xFixtureRequestId: null,
|
|
131
|
+
bodyExcerpt: err && err.stack ? String(err.stack).slice(0, 240) : '',
|
|
132
|
+
},
|
|
133
|
+
}];
|
|
134
|
+
const { report, path } = await writeReport({ probeName, engine, results });
|
|
135
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
136
|
+
process.stderr.write(`probe error: ${err && err.stack ? err.stack : String(err)}\n`);
|
|
137
|
+
process.stderr.write(`report written to ${path}\n`);
|
|
138
|
+
process.exitCode = 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Browser-observable properties are AMBER on the shelf by ruling.
|
|
143
|
+
// A row that names such a property is recorded as notObservableHere
|
|
144
|
+
// carrying an object with the AC id and a reason; the tally script
|
|
145
|
+
// reads notObservableHere.ac to accept the row.
|
|
146
|
+
export function notObservableHereResult({ ac, anchorAcId, detail, reason, evidence } = {}) {
|
|
147
|
+
// A notObservableHere row anchors nothing else: no anchorAcId,
|
|
148
|
+
// no anchorReqId - only notObservableHere.ac.
|
|
149
|
+
const acId = ac || anchorAcId;
|
|
150
|
+
return {
|
|
151
|
+
verdict: 'pass',
|
|
152
|
+
notObservableHere: {
|
|
153
|
+
ac: acId,
|
|
154
|
+
reason: reason || 'not observable on server-side probe pack; needs a browser-driven runner',
|
|
155
|
+
},
|
|
156
|
+
detail: detail || 'not observable on server-side probe pack',
|
|
157
|
+
evidence: {
|
|
158
|
+
reason: reason || 'not observable here; needs a browser-driven probe runner',
|
|
159
|
+
...(evidence || {}),
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// A row that keeps a real observation but records that the
|
|
165
|
+
// observation only covers part of an AC uses conformanceOnly +
|
|
166
|
+
// limitation carrying the AC id and the property not observed.
|
|
167
|
+
export function conformanceOnlyResult({ anchorAcId, anchorReqId, verdict, detail, evidence, limitation }) {
|
|
168
|
+
return {
|
|
169
|
+
...(anchorAcId ? { anchorAcId } : {}),
|
|
170
|
+
...(anchorReqId ? { anchorReqId } : {}),
|
|
171
|
+
verdict: verdict || 'pass',
|
|
172
|
+
conformanceOnly: true,
|
|
173
|
+
limitation: limitation || 'browser-observable property not asserted from the server-side probe',
|
|
174
|
+
detail,
|
|
175
|
+
evidence,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './apg-table-shape.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-datatable-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js' };
|
|
4
|
+
runShim('apg-table-shape', engine, runProbe);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './four-states-regions.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-datatable-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js' };
|
|
4
|
+
runShim('four-states-regions', engine, runProbe);
|
package/blueprints/application-datatable/contributions/probes/run-search-adapter-round-trip.mjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './search-adapter-round-trip.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-datatable-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js' };
|
|
4
|
+
runShim('search-adapter-round-trip', engine, runProbe);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './sort-adapter-round-trip.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-datatable-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js' };
|
|
4
|
+
runShim('sort-adapter-round-trip', engine, runProbe);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// search-adapter-round-trip probe for application-datatable v1.0.9.
|
|
2
|
+
//
|
|
3
|
+
// AC-17102-1: the query adapter reads `q` and returns rows matching
|
|
4
|
+
// the filter. The API round-trip is server-observable and the row is
|
|
5
|
+
// a conformanceOnly with a limitation naming the browser half; no
|
|
6
|
+
// duplicate notObservableHere row is emitted for the same AC.
|
|
7
|
+
//
|
|
8
|
+
// anchorAcId: application-datatable-AC-17102-1.
|
|
9
|
+
|
|
10
|
+
import { startFixture, evidenceFromResponse, conformanceOnlyResult } from './probe-utils.mjs';
|
|
11
|
+
|
|
12
|
+
export const anchorReqId = 'application-datatable-REQ-003';
|
|
13
|
+
export const accountBound = false;
|
|
14
|
+
|
|
15
|
+
export default async function runProbe() {
|
|
16
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-datatable/server.js');
|
|
17
|
+
const fixture = await startFixture({ startServer, port: 0 });
|
|
18
|
+
try {
|
|
19
|
+
const results = [];
|
|
20
|
+
|
|
21
|
+
const noQ = await fetch(`${fixture.baseUrl}/api/rows?pageSize=100`);
|
|
22
|
+
const noQBody = await noQ.text();
|
|
23
|
+
const noQParsed = JSON.parse(noQBody);
|
|
24
|
+
const totalUnfiltered = noQParsed.total;
|
|
25
|
+
const noQNames = (noQParsed.rows || []).map((r) => r.name.toLowerCase());
|
|
26
|
+
|
|
27
|
+
const q = 'a';
|
|
28
|
+
const withQ = await fetch(`${fixture.baseUrl}/api/rows?q=${q}&pageSize=100`);
|
|
29
|
+
const withQBody = await withQ.text();
|
|
30
|
+
const withParsed = JSON.parse(withQBody);
|
|
31
|
+
const echoed = withParsed.q === q;
|
|
32
|
+
const totalFiltered = withParsed.total;
|
|
33
|
+
const filteredNames = (withParsed.rows || []).map((r) => r.name.toLowerCase());
|
|
34
|
+
const narrowed = totalFiltered < totalUnfiltered;
|
|
35
|
+
const allMatch = filteredNames.length > 0 && filteredNames.every((n) => n.includes(q.toLowerCase()));
|
|
36
|
+
const droppedNamesInclude = noQNames.some((n) => !filteredNames.includes(n));
|
|
37
|
+
const pass = noQ.status === 200 && withQ.status === 200 && echoed && narrowed && allMatch && droppedNamesInclude;
|
|
38
|
+
results.push(conformanceOnlyResult({
|
|
39
|
+
anchorAcId: 'application-datatable-AC-17102-1',
|
|
40
|
+
anchorReqId: 'application-datatable-REQ-003',
|
|
41
|
+
verdict: pass ? 'pass' : 'fail',
|
|
42
|
+
detail: `Given a rendered datatable route with a text - search q="${q}" narrowed ${totalUnfiltered} to ${totalFiltered}; every returned row.name contains "${q}" (server-observable half)`,
|
|
43
|
+
evidence: evidenceFromResponse({
|
|
44
|
+
route: `/api/rows?q=${q}&pageSize=100`,
|
|
45
|
+
response: withQ,
|
|
46
|
+
bodyText: withQBody,
|
|
47
|
+
extraFields: {
|
|
48
|
+
input: { q },
|
|
49
|
+
derived: { totalUnfiltered, totalFiltered, narrowed, allMatch, filteredNames, unfilteredCount: noQNames.length },
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
limitation: 'application-datatable-AC-17102-1: typing into the browser filter input and comparing rendered rows is browser-only',
|
|
53
|
+
}));
|
|
54
|
+
return { results };
|
|
55
|
+
} finally {
|
|
56
|
+
await fixture.close();
|
|
57
|
+
}
|
|
58
|
+
}
|