rcf-lite 0.27.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +10 -0
- package/bin/rcf.js +2 -0
- package/blueprints/application-account-settings/CHANGELOG.md +35 -6
- package/blueprints/application-account-settings/README.md +1 -1
- package/blueprints/application-account-settings/blueprint.json +4 -2
- package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +1 -1
- package/blueprints/application-account-settings/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-account-settings/contributions/probes/profile-form-autocomplete.mjs +67 -0
- package/blueprints/application-account-settings/contributions/probes/run-profile-form-autocomplete.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-adapter-uniform.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-surface-shape.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-shell-tablist-per-capability.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-theme-radiogroup.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-adapter-uniform.mjs +130 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-surface-shape.mjs +70 -0
- package/blueprints/application-account-settings/contributions/probes/shell-tablist-per-capability.mjs +60 -0
- package/blueprints/application-account-settings/contributions/probes/theme-radiogroup.mjs +126 -0
- package/blueprints/application-admin-console/CHANGELOG.md +32 -6
- package/blueprints/application-admin-console/README.md +1 -1
- package/blueprints/application-admin-console/blueprint.json +4 -2
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +1 -1
- package/blueprints/application-admin-console/contributions/probes/audit-log-surface.mjs +79 -0
- package/blueprints/application-admin-console/contributions/probes/org-switcher-surface.mjs +83 -0
- package/blueprints/application-admin-console/contributions/probes/permission-matrix-grid.mjs +67 -0
- package/blueprints/application-admin-console/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-admin-console/contributions/probes/run-audit-log-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-org-switcher-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-permission-matrix-grid.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-sign-in-access-gated-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-users-directory-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/sign-in-access-gated-surface.mjs +117 -0
- package/blueprints/application-admin-console/contributions/probes/users-directory-surface.mjs +145 -0
- package/blueprints/application-api-rest/CHANGELOG.md +16 -8
- package/blueprints/application-api-rest/README.md +3 -3
- package/blueprints/application-api-rest/blueprint.json +3 -2
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +1 -1
- package/blueprints/application-api-rest/contributions/probes/cursor-pagination-round-trip.mjs +154 -0
- package/blueprints/application-api-rest/contributions/probes/health-probes-distinct.mjs +124 -0
- package/blueprints/application-api-rest/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-api-rest/contributions/probes/problem-details-on-error.mjs +77 -0
- package/blueprints/application-api-rest/contributions/probes/request-id-echoed.mjs +76 -0
- package/blueprints/application-api-rest/contributions/probes/run-cursor-pagination-round-trip.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-health-probes-distinct.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-problem-details-on-error.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-request-id-echoed.mjs +5 -0
- package/blueprints/application-api-rest/docs/topics.md +1 -1
- package/blueprints/application-charts/CHANGELOG.md +35 -9
- package/blueprints/application-charts/README.md +6 -6
- package/blueprints/application-charts/blueprint.json +5 -3
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +1 -1
- package/blueprints/application-charts/contributions/probes/keyboard-traversal.mjs +151 -0
- package/blueprints/application-charts/contributions/probes/non-colour-distinction.mjs +67 -0
- package/blueprints/application-charts/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-charts/contributions/probes/run-keyboard-traversal.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-non-colour-distinction.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-text-alternative-table.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/text-alternative-table.mjs +139 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +1 -1
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +1 -1
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +5 -5
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +1 -1
- package/blueprints/application-charts/guide/application-charts.md +1 -1
- package/blueprints/application-dashboard/CHANGELOG.md +20 -10
- package/blueprints/application-dashboard/README.md +6 -6
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +2 -2
- package/blueprints/application-dashboard/blueprint.json +3 -2
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +1 -1
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +1 -1
- package/blueprints/application-dashboard/contributions/probes/export-handle-formats.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/four-tile-states.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/primary-kpi-top-left.mjs +58 -0
- package/blueprints/application-dashboard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-dashboard/contributions/probes/run-export-handle-formats.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-four-tile-states.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-primary-kpi-top-left.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-shell-five-regions.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/shell-five-regions.mjs +93 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +1 -1
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +5 -5
- package/blueprints/application-dashboard/docs/topics.md +2 -2
- package/blueprints/application-dashboard/guide/application-dashboard.md +2 -2
- package/blueprints/application-datatable/CHANGELOG.md +19 -9
- package/blueprints/application-datatable/README.md +2 -2
- package/blueprints/application-datatable/blueprint.json +3 -2
- package/blueprints/application-datatable/contributions/probes/apg-table-shape.mjs +57 -0
- package/blueprints/application-datatable/contributions/probes/four-states-regions.mjs +80 -0
- package/blueprints/application-datatable/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-datatable/contributions/probes/run-apg-table-shape.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-four-states-regions.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-search-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-sort-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/search-adapter-round-trip.mjs +58 -0
- package/blueprints/application-datatable/contributions/probes/sort-adapter-round-trip.mjs +60 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +1 -1
- package/blueprints/application-datatable/docs/topics.md +1 -1
- package/blueprints/application-empty-error-states/CHANGELOG.md +33 -3
- package/blueprints/application-empty-error-states/blueprint.json +4 -2
- package/blueprints/application-empty-error-states/contributions/probes/empty-list-and-no-search.mjs +66 -0
- package/blueprints/application-empty-error-states/contributions/probes/error-boundary-alert.mjs +65 -0
- package/blueprints/application-empty-error-states/contributions/probes/forbidden-and-server-error.mjs +167 -0
- package/blueprints/application-empty-error-states/contributions/probes/not-found-and-recovery.mjs +61 -0
- package/blueprints/application-empty-error-states/contributions/probes/permission-denied-and-offline.mjs +155 -0
- package/blueprints/application-empty-error-states/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-empty-list-and-no-search.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-error-boundary-alert.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-forbidden-and-server-error.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-not-found-and-recovery.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-permission-denied-and-offline.mjs +5 -0
- package/blueprints/application-error-handling/CHANGELOG.md +45 -6
- package/blueprints/application-error-handling/blueprint.json +3 -2
- package/blueprints/application-error-handling/contributions/probes/category-vocabulary.mjs +90 -0
- package/blueprints/application-error-handling/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-error-handling/contributions/probes/record-shape-adr-1701.mjs +78 -0
- package/blueprints/application-error-handling/contributions/probes/run-category-vocabulary.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-record-shape-adr-1701.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-two-boundaries-registered.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/two-boundaries-registered.mjs +343 -0
- package/blueprints/application-file-upload/CHANGELOG.md +28 -6
- package/blueprints/application-file-upload/README.md +1 -1
- package/blueprints/application-file-upload/blueprint.json +3 -2
- package/blueprints/application-file-upload/contributions/probes/assertive-completion-slot.mjs +78 -0
- package/blueprints/application-file-upload/contributions/probes/chunked-transport-endpoints.mjs +173 -0
- package/blueprints/application-file-upload/contributions/probes/per-file-progressbar.mjs +124 -0
- package/blueprints/application-file-upload/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-file-upload/contributions/probes/run-assertive-completion-slot.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-chunked-transport-endpoints.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-per-file-progressbar.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-upload-surface-shape.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/upload-surface-shape.mjs +55 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +1 -1
- package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +1 -1
- package/blueprints/application-forms-wizard/CHANGELOG.md +20 -6
- package/blueprints/application-forms-wizard/README.md +2 -2
- package/blueprints/application-forms-wizard/blueprint.json +3 -2
- package/blueprints/application-forms-wizard/contributions/probes/draft-persistence-round-trip.mjs +110 -0
- package/blueprints/application-forms-wizard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-draft-persistence-round-trip.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-step-page-shape.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-task-list-surface.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/step-page-shape.mjs +61 -0
- package/blueprints/application-forms-wizard/contributions/probes/task-list-surface.mjs +109 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +1 -1
- package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +1 -1
- package/blueprints/application-notifications-in-app/CHANGELOG.md +38 -5
- package/blueprints/application-notifications-in-app/README.md +4 -4
- package/blueprints/application-notifications-in-app/blueprint.json +4 -2
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/probes/centre-acknowledge-round-trip.mjs +210 -0
- package/blueprints/application-notifications-in-app/contributions/probes/live-region-preseeding.mjs +93 -0
- package/blueprints/application-notifications-in-app/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-centre-acknowledge-round-trip.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-live-region-preseeding.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-toast-contract.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/toast-contract.mjs +92 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +3 -3
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +1 -1
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +3 -3
- package/blueprints/application-onboarding-tour/CHANGELOG.md +31 -5
- package/blueprints/application-onboarding-tour/README.md +1 -1
- package/blueprints/application-onboarding-tour/blueprint.json +5 -3
- package/blueprints/application-onboarding-tour/contributions/probes/checklist-anchor-open.mjs +81 -0
- package/blueprints/application-onboarding-tour/contributions/probes/completion-persistence.mjs +159 -0
- package/blueprints/application-onboarding-tour/contributions/probes/first-run-detection.mjs +67 -0
- package/blueprints/application-onboarding-tour/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-checklist-anchor-open.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-completion-persistence.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-first-run-detection.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-stepper-role-dialog.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/stepper-role-dialog.mjs +45 -0
- package/blueprints/application-spa/CHANGELOG.md +20 -11
- package/blueprints/application-spa/README.md +9 -10
- package/blueprints/application-spa/blueprint.json +3 -2
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
- package/blueprints/application-spa/contributions/probes/designed-empty-state.mjs +72 -0
- package/blueprints/application-spa/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-spa/contributions/probes/route-inventory-published.mjs +185 -0
- package/blueprints/application-spa/contributions/probes/run-designed-empty-state.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-route-inventory-published.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-shell-nav-present.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/shell-nav-present.mjs +69 -0
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +3 -3
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +1 -1
- package/blueprints/application-spa/docs/topics.md +1 -1
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +31 -11
- package/blueprints/delivery-ci-workflows/README.md +3 -3
- package/blueprints/delivery-ci-workflows/blueprint.json +3 -2
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +2 -2
- package/blueprints/delivery-ci-workflows/contributions/probes/node-gate-entrypoint.mjs +76 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/probe-utils.mjs +56 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/real-account-github-actions-run-record.mjs +139 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-node-gate-entrypoint.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-real-account-github-actions-run-record.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-workflow-template-shape.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/workflow-template-shape.mjs +94 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +1 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +2 -3
- package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +4 -4
- package/blueprints/deploy-cloudflare-workers/README.md +3 -3
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +2 -2
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
- package/blueprints/deploy-hetzner-server/CHANGELOG.md +98 -7
- package/blueprints/deploy-hetzner-server/blueprint.json +7 -6
- package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +46 -21
- package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +344 -83
- package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +211 -42
- package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +140 -22
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +111 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +158 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +154 -32
- package/blueprints/edge-cloudflare-access/CHANGELOG.md +6 -5
- package/blueprints/edge-cloudflare-access/blueprint.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +9 -1
- package/blueprints/edge-cloudflare-access/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +4 -7
- package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +4 -6
- package/blueprints/edge-cloudflare-tunnel/README.md +1 -2
- package/blueprints/edge-cloudflare-tunnel/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +2 -3
- package/blueprints/edge-cloudflare-turnstile/docs/topics.md +1 -1
- package/blueprints/email-smtp-resend/CHANGELOG.md +24 -8
- package/blueprints/email-smtp-resend/README.md +2 -2
- package/blueprints/email-smtp-resend/blueprint.json +3 -2
- package/blueprints/email-smtp-resend/contributions/probes/probe-utils.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/real-account-resend-send.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-real-account-resend-send.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-smtp-round-trip.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-unverified-sender-refusal.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/smtp-round-trip.mjs +43 -0
- package/blueprints/email-smtp-resend/contributions/probes/unverified-sender-refusal.mjs +99 -0
- package/blueprints/email-smtp-resend/docs/topics.md +2 -3
- package/blueprints/jobs-background/CHANGELOG.md +66 -5
- package/blueprints/jobs-background/README.md +2 -2
- package/blueprints/jobs-background/blueprint.json +3 -2
- package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +38 -10
- package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +28 -6
- package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +16 -2
- package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +102 -21
- package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +10 -2
- package/blueprints/jobs-background/contributions/probes/retry-and-fail-real-account.mjs +355 -0
- package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +33 -2
- package/blueprints/jobs-background/contributions/probes/run-retry-and-fail-real-account.mjs +12 -0
- package/blueprints/jobs-background/docs/topics.md +1 -1
- package/blueprints/jobs-background/guide/jobs-background.md +1 -1
- package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +25 -19
- package/blueprints/messaging-queue-cloudflare/README.md +12 -12
- package/blueprints/messaging-queue-cloudflare/blueprint.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +180 -12
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +1 -1
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +2 -2
- package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +2 -2
- package/blueprints/object-storage-s3/CHANGELOG.md +75 -4
- package/blueprints/object-storage-s3/blueprint.json +3 -2
- package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +73 -12
- package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +55 -7
- package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +102 -18
- package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +105 -36
- package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +104 -55
- package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +129 -7
- package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +80 -18
- package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +291 -37
- package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +5 -5
- package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +8 -5
- package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +6 -3
- package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +10 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +1 -1
- package/blueprints/object-storage-s3/docs/topics.md +1 -1
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +1 -1
- package/blueprints/observability-essentials/CHANGELOG.md +23 -7
- package/blueprints/observability-essentials/README.md +2 -2
- package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json +1 -1
- package/blueprints/observability-essentials/blueprint.json +3 -2
- package/blueprints/observability-essentials/contributions/probes/liveness-probe.mjs +84 -0
- package/blueprints/observability-essentials/contributions/probes/metrics-endpoint.mjs +96 -0
- package/blueprints/observability-essentials/contributions/probes/probe-utils.mjs +52 -0
- package/blueprints/observability-essentials/contributions/probes/readiness-probe.mjs +171 -0
- package/blueprints/observability-essentials/contributions/probes/run-liveness-probe.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-metrics-endpoint.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-readiness-probe.mjs +3 -0
- package/blueprints/observability-essentials/docs/topics.md +2 -3
- package/blueprints/observability-logging/CHANGELOG.md +29 -4
- package/blueprints/observability-logging/README.md +2 -2
- package/blueprints/observability-logging/blueprint.json +3 -2
- package/blueprints/observability-logging/contributions/probes/correlation-id-flow.mjs +173 -0
- package/blueprints/observability-logging/contributions/probes/line-shape-and-fields.mjs +82 -0
- package/blueprints/observability-logging/contributions/probes/probe-utils.mjs +47 -0
- package/blueprints/observability-logging/contributions/probes/redaction-boundary.mjs +130 -0
- package/blueprints/observability-logging/contributions/probes/run-correlation-id-flow.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-line-shape-and-fields.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-redaction-boundary.mjs +3 -0
- package/blueprints/observability-probe-endpoints/CHANGELOG.md +23 -8
- package/blueprints/observability-probe-endpoints/README.md +3 -3
- package/blueprints/observability-probe-endpoints/blueprint.json +3 -2
- package/blueprints/observability-probe-endpoints/contributions/probes/kubernetes-startup-enabled.mjs +80 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/partial-profile-refusal.mjs +101 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/probe-utils.mjs +49 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/profile-boot-materialisation.mjs +69 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-kubernetes-startup-enabled.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-partial-profile-refusal.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-profile-boot-materialisation.mjs +3 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/CHANGELOG.md +16 -3
- package/blueprints/persistence-data-d1/README.md +2 -2
- package/blueprints/persistence-data-d1/blueprint.json +3 -2
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +1 -1
- package/blueprints/persistence-data-d1/contributions/probes/facade-round-trip.mjs +140 -0
- package/blueprints/persistence-data-d1/contributions/probes/migrations-forward-only.mjs +66 -0
- package/blueprints/persistence-data-d1/contributions/probes/probe-utils.mjs +51 -0
- package/blueprints/persistence-data-d1/contributions/probes/real-account-d1-round-trip.mjs +133 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-facade-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-migrations-forward-only.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-real-account-d1-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/docs/topics.md +2 -3
- package/blueprints/persistence-data-postgres/CHANGELOG.md +84 -4
- package/blueprints/persistence-data-postgres/README.md +2 -2
- package/blueprints/persistence-data-postgres/blueprint.json +3 -2
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +87 -12
- package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +245 -19
- package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +109 -26
- package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +151 -38
- package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +24 -6
- package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +261 -48
- package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +76 -20
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +1 -1
- package/blueprints/persistence-data-postgres/docs/topics.md +1 -1
- package/blueprints/persistence-data-sqlite/CHANGELOG.md +16 -2
- package/blueprints/persistence-data-sqlite/README.md +2 -2
- package/blueprints/persistence-data-sqlite/blueprint.json +3 -2
- package/blueprints/persistence-data-sqlite/contributions/probes/boot-open-migrate.mjs +90 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/facade-round-trip.mjs +82 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/probe-utils.mjs +83 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-boot-open-migrate.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-facade-round-trip.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-wal-checkpoint.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/wal-checkpoint.mjs +137 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +5 -5
- package/blueprints/platform-cloudflare-cron-triggers/README.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +6 -10
- package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-kv/CHANGELOG.md +16 -12
- package/blueprints/platform-cloudflare-kv/README.md +2 -4
- package/blueprints/platform-cloudflare-kv/blueprint.json +2 -2
- package/blueprints/platform-cloudflare-kv/docs/topics.md +1 -1
- package/blueprints/platform-docker-compose-host/CHANGELOG.md +92 -5
- package/blueprints/platform-docker-compose-host/blueprint.json +2 -2
- package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +116 -29
- package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +181 -109
- package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +146 -26
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +238 -24
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +207 -21
- package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +246 -42
- package/blueprints/platform-docker-compose-host/docs/topics.md +1 -1
- package/blueprints/security-auth-clerk/CHANGELOG.md +18 -6
- package/blueprints/security-auth-clerk/README.md +3 -3
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +1 -1
- package/blueprints/security-auth-clerk/blueprint.json +3 -2
- package/blueprints/security-auth-clerk/contributions/probes/hosted-identity-ui-config.mjs +61 -0
- package/blueprints/security-auth-clerk/contributions/probes/probe-utils.mjs +188 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-principal-directory-round-trip.mjs +216 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-session-inventory.mjs +260 -0
- package/blueprints/security-auth-clerk/contributions/probes/role-model-adapter.mjs +53 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-hosted-identity-ui-config.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-principal-directory-round-trip.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-session-inventory.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-role-model-adapter.mjs +4 -0
- package/blueprints/security-auth-clerk/docs/topics.md +2 -3
- package/blueprints/security-auth-keycloak/CHANGELOG.md +18 -7
- package/blueprints/security-auth-keycloak/README.md +2 -2
- package/blueprints/security-auth-keycloak/blueprint.json +3 -2
- package/blueprints/security-auth-keycloak/contributions/probes/discovery-shape.mjs +68 -0
- package/blueprints/security-auth-keycloak/contributions/probes/introspection-shape.mjs +88 -0
- package/blueprints/security-auth-keycloak/contributions/probes/jwt-verifier-shape.mjs +86 -0
- package/blueprints/security-auth-keycloak/contributions/probes/probe-utils.mjs +180 -0
- package/blueprints/security-auth-keycloak/contributions/probes/real-account-realm-round-trip.mjs +91 -0
- package/blueprints/security-auth-keycloak/contributions/probes/role-adapter-shape.mjs +69 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-discovery-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-introspection-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-jwt-verifier-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-real-account-realm-round-trip.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-role-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +1 -2
- package/blueprints/security-auth-magic-link/CHANGELOG.md +15 -4
- package/blueprints/security-auth-magic-link/README.md +2 -2
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +1 -1
- package/blueprints/security-auth-magic-link/blueprint.json +3 -2
- package/blueprints/security-auth-magic-link/contributions/probes/probe-utils.mjs +174 -0
- package/blueprints/security-auth-magic-link/contributions/probes/real-account-magic-link-send.mjs +139 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-real-account-magic-link-send.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-entropy-shape.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-issue-verify.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-entropy-shape.mjs +60 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-issue-verify.mjs +90 -0
- package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +16 -5
- package/blueprints/security-auth-oauth2/README.md +2 -2
- package/blueprints/security-auth-oauth2/blueprint.json +3 -2
- package/blueprints/security-auth-oauth2/contributions/probes/authorisation-code-flow-shape.mjs +259 -0
- package/blueprints/security-auth-oauth2/contributions/probes/pkce-challenge-shape.mjs +58 -0
- package/blueprints/security-auth-oauth2/contributions/probes/probe-utils.mjs +190 -0
- package/blueprints/security-auth-oauth2/contributions/probes/provider-adapter-shape.mjs +64 -0
- package/blueprints/security-auth-oauth2/contributions/probes/real-account-authorisation-code-flow.mjs +93 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-authorisation-code-flow-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-pkce-challenge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-provider-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-real-account-authorisation-code-flow.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-session-bridge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/session-bridge-shape.mjs +78 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +1 -2
- package/blueprints/security-secrets-management/CHANGELOG.md +15 -4
- package/blueprints/security-secrets-management/README.md +2 -2
- package/blueprints/security-secrets-management/blueprint.json +3 -2
- package/blueprints/security-secrets-management/contributions/probes/add-recipient-rotation.mjs +107 -0
- package/blueprints/security-secrets-management/contributions/probes/encrypt-decrypt-round-trip.mjs +122 -0
- package/blueprints/security-secrets-management/contributions/probes/key-rotation.mjs +93 -0
- package/blueprints/security-secrets-management/contributions/probes/mismatched-key-refusal.mjs +74 -0
- package/blueprints/security-secrets-management/contributions/probes/probe-utils.mjs +214 -0
- package/blueprints/security-secrets-management/contributions/probes/run-add-recipient-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-encrypt-decrypt-round-trip.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-key-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-mismatched-key-refusal.mjs +4 -0
- package/blueprints/security-secrets-management/docs/topics.md +2 -3
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/harness-template.md +25 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +25 -0
- package/package.json +2 -2
- package/rcf/adrs/adr-4101-feedback-store-gitignored.json +20 -0
- package/rcf/adrs/adr-4102-fingerprint-and-labels.json +25 -0
- package/rcf/adrs/adr-4103-redaction-rule-based.json +20 -0
- package/rcf/adrs/adr-4104-destination-on-library.json +25 -0
- package/rcf/adrs/adr-4105-gh-ambient-auth.json +20 -0
- package/rcf/adrs/adr-4106-bundled-entries-terminal.json +20 -0
- package/rcf/adrs/adr-4107-stop-is-ask-event.json +30 -0
- package/rcf/adrs/adr-4108-hooks-in-committed-config.json +25 -0
- package/rcf/adrs/adr-4109-referee-validate-adr-crosslinks.json +25 -0
- package/rcf/adrs/adr-4110-referee-coverage-strict-by-default.json +25 -0
- package/rcf/adrs/adr-4111-referee-finalise-refusals.json +20 -0
- package/rcf/adrs/adr-4112-referee-finalise-verified-invariant.json +30 -0
- package/rcf/code-nodes/cn-600.json +45 -0
- package/rcf/code-nodes/cn-601.json +18 -0
- package/rcf/code-nodes/cn-602.json +15 -0
- package/rcf/code-nodes/cn-603.json +12 -0
- package/rcf/code-nodes/cn-604.json +14 -0
- package/rcf/code-nodes/cn-605.json +17 -0
- package/rcf/code-nodes/cn-606.json +12 -0
- package/rcf/code-nodes/cn-607.json +12 -0
- package/rcf/code-nodes/cn-608.json +14 -0
- package/rcf/code-nodes/cn-609.json +17 -0
- package/rcf/code-nodes/cn-620.json +18 -0
- package/rcf/code-nodes/cn-621.json +14 -0
- package/rcf/code-nodes/cn-622.json +15 -0
- package/rcf/code-nodes/cn-623.json +16 -0
- package/rcf/code-nodes/cn-624.json +14 -0
- package/rcf/code-nodes/cn-625.json +15 -0
- package/rcf/code-nodes/cn-626.json +13 -0
- package/rcf/code-nodes/cn-627.json +13 -0
- package/rcf/code-nodes/cn-628.json +14 -0
- package/rcf/code-nodes/cn-629.json +12 -0
- package/rcf/code-nodes/cn-630.json +12 -0
- package/rcf/code-nodes/cn-631.json +13 -0
- package/rcf/code-nodes/cn-632.json +13 -0
- package/rcf/fbs/fbs-180.json +45 -0
- package/rcf/fbs/fbs-181.json +45 -0
- package/rcf/fbs/fbs-182.json +42 -0
- package/rcf/fbs/fbs-183.json +50 -0
- package/rcf/fbs/fbs-184.json +49 -0
- package/rcf/fbs/fbs-185.json +34 -0
- package/rcf/fbs/fbs-186.json +16 -0
- package/rcf/fbs/fbs-187.json +17 -0
- package/rcf/fbs/fbs-188.json +17 -0
- package/rcf/fbs/fbs-189.json +17 -0
- package/rcf/requirements/req-155.json +13 -0
- package/rcf/requirements/req-156.json +13 -0
- package/rcf/requirements/req-157.json +13 -0
- package/rcf/requirements/req-158.json +13 -0
- package/rcf/requirements/req-159.json +13 -0
- package/rcf/requirements/req-160.json +13 -0
- package/rcf/requirements/req-161.json +13 -0
- package/rcf/requirements/req-162.json +13 -0
- package/rcf/requirements/req-163.json +13 -0
- package/rcf/requirements/req-164.json +13 -0
- package/rcf/requirements/req-165.json +13 -0
- package/rcf/tacs/tac-4101-feedback-cli.json +77 -0
- package/rcf/tacs/tac-4102-feedback-store.json +50 -0
- package/rcf/tacs/tac-4103-feedback-redact.json +39 -0
- package/rcf/tacs/tac-4104-feedback-fingerprint.json +33 -0
- package/rcf/tacs/tac-4105-feedback-render.json +45 -0
- package/rcf/tacs/tac-4106-feedback-destination.json +39 -0
- package/rcf/tacs/tac-4107-feedback-gh.json +43 -0
- package/rcf/tacs/tac-4108-feedback-hook.json +46 -0
- package/rcf/tacs/tac-4109-referee-validate-adr-crosslinks.json +20 -0
- package/rcf/tacs/tac-4110-referee-coverage-mode-selector.json +21 -0
- package/rcf/tacs/tac-4111-referee-finalise-per-ac-refusals.json +21 -0
- package/rcf/tacs/tac-4112-referee-finalise-verified-invariant.json +22 -0
- package/rcf/test-suites/ts-140.json +9 -9
- package/rcf/test-suites/ts-150.json +9 -9
- package/rcf/test-suites/ts-185.json +54 -0
- package/rcf/test-suites/ts-186.json +58 -0
- package/rcf/test-suites/ts-187.json +44 -0
- package/rcf/test-suites/ts-188.json +166 -0
- package/rcf/test-suites/ts-189.json +38 -0
- package/rcf/test-suites/ts-190.json +30 -0
- package/rcf/test-suites/ts-191.json +51 -0
- package/rcf/test-suites/ts-192.json +37 -0
- package/rcf/test-suites/ts-193.json +60 -0
- package/rcf/test-suites/ts-194.json +67 -0
- package/rcf/test-suites/ts-195.json +52 -0
- package/rcf/test-suites/ts-196.json +58 -0
- package/rcf/test-suites/ts-197.json +66 -0
- package/rcf/test-suites/ts-198.json +87 -0
- package/rcf/test-suites/ts-199.json +51 -0
- package/rcf/test-suites/ts-200.json +30 -0
- package/rcf/test-suites/ts-201.json +38 -0
- package/rcf/test-suites/ts-202.json +38 -0
- package/rcf/test-suites/ts-203.json +38 -0
- package/rcf/user-stories/us-15501.json +60 -0
- package/rcf/user-stories/us-15502.json +33 -0
- package/rcf/user-stories/us-15503.json +33 -0
- package/rcf/user-stories/us-15601.json +51 -0
- package/rcf/user-stories/us-15701.json +42 -0
- package/rcf/user-stories/us-15801.json +42 -0
- package/rcf/user-stories/us-15802.json +33 -0
- package/rcf/user-stories/us-15901.json +33 -0
- package/rcf/user-stories/us-15902.json +51 -0
- package/rcf/user-stories/us-16001.json +51 -0
- package/rcf/user-stories/us-16101.json +42 -0
- package/rcf/user-stories/us-16102.json +33 -0
- package/rcf/user-stories/us-16103.json +42 -0
- package/rcf/user-stories/us-16104.json +42 -0
- package/rcf/user-stories/us-16201.json +33 -0
- package/rcf/user-stories/us-16301.json +36 -0
- package/rcf/user-stories/us-16401.json +45 -0
- package/rcf/user-stories/us-16501.json +45 -0
- package/rcf/user-stories/us-16502.json +45 -0
- package/releases/releases.yaml +11 -1
- package/src/blueprint/library-loader.js +48 -0
- package/src/blueprint/library-registry.js +13 -0
- package/src/browser-verify/pack-runner.js +7 -12
- package/src/build/mark.js +1 -1
- package/src/cli/blueprint-library.js +149 -0
- package/src/cli/coverage.js +49 -24
- package/src/cli/doctor.js +195 -7
- package/src/cli/feedback.js +2204 -0
- package/src/cli/finalise.js +158 -1
- package/src/cli/help.js +6 -0
- package/src/cli/init.js +63 -0
- package/src/cli/update.js +21 -1
- package/src/core/store/walker.js +33 -0
- package/src/core/store/writer.js +23 -0
- package/src/feedback/destination.js +361 -0
- package/src/feedback/fingerprint.js +132 -0
- package/src/feedback/gh.js +376 -0
- package/src/feedback/hook.js +183 -0
- package/src/feedback/labels.js +87 -0
- package/src/feedback/redact-allowlist.json +14 -0
- package/src/feedback/redact.js +1108 -0
- package/src/feedback/render.js +267 -0
- package/src/feedback/store.js +604 -0
- package/src/finalise/index.js +4 -0
- package/src/finalise/ingest.js +61 -0
- package/src/finalise/ship-without-eval.js +19 -7
- package/src/mcp/tools.js +8 -2
- package/src/setup/feedback-hooks.js +397 -0
- package/src/setup/managed-gitignore.js +3 -0
- package/src/view/html-page.js +5 -5
- package/src/view/style.css +2 -2
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// application-charts probe: paired text-alternative table lives in
|
|
2
|
+
// the chart's landmark (AC-18103-1) and every cell matches the
|
|
3
|
+
// chart's rendered value for the same (x, series) coordinate to the
|
|
4
|
+
// same precision (AC-18103-3).
|
|
5
|
+
//
|
|
6
|
+
// The probe extracts the (series, x, value) tuple from every SVG
|
|
7
|
+
// data-point element (data-series/data-x/data-y on
|
|
8
|
+
// .chartDataPoint) as the render's own source of truth, then walks
|
|
9
|
+
// the paired <table> and confirms every cell holds the same numeric
|
|
10
|
+
// text at the same (x, series) coordinate. A single mismatch or a
|
|
11
|
+
// missing coordinate fails the row (AC-18103-3 wording: "every
|
|
12
|
+
// cell's text value matches the chart's rendered value for the same
|
|
13
|
+
// (x, series) coordinate to the same precision the chart renders;
|
|
14
|
+
// a mismatched or missing cell fails the pack check").
|
|
15
|
+
|
|
16
|
+
import { fixtureFetch, startFixture, excerpt } from './probe-utils.mjs';
|
|
17
|
+
|
|
18
|
+
export const anchorAcId = 'application-charts-AC-18103-1';
|
|
19
|
+
export const accountBound = false;
|
|
20
|
+
|
|
21
|
+
function parseChartRegions(body) {
|
|
22
|
+
// Each <section class="chartRegion"> holds one SVG and (unless
|
|
23
|
+
// broken) one <table class="chartAltTable"> in the same landmark.
|
|
24
|
+
const regions = [];
|
|
25
|
+
const regionRe = /<section class="chartRegion"[^>]*>([\s\S]*?)<\/section>/g;
|
|
26
|
+
let m;
|
|
27
|
+
while ((m = regionRe.exec(body)) !== null) regions.push(m[1]);
|
|
28
|
+
return regions;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function extractRenderedPoints(regionHtml) {
|
|
32
|
+
// The SVG data-points are the render's source of truth. Each
|
|
33
|
+
// element carries data-series="<name>" data-x="<xLabel>"
|
|
34
|
+
// data-y="<numeric value>". Return a Map keyed as "series|x".
|
|
35
|
+
const points = new Map();
|
|
36
|
+
const dpRe = /class="chartDataPoint"[^>]*data-series="([^"]+)"[^>]*data-x="([^"]+)"[^>]*data-y="([^"]+)"/g;
|
|
37
|
+
let m;
|
|
38
|
+
while ((m = dpRe.exec(regionHtml)) !== null) {
|
|
39
|
+
points.set(`${m[1]}|${m[2]}`, m[3]);
|
|
40
|
+
}
|
|
41
|
+
return points;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function extractTableCells(regionHtml) {
|
|
45
|
+
// Parse <thead><tr><th>Day</th><th>SeriesA (unit)</th>...</tr></thead>
|
|
46
|
+
// <tbody><tr><th>Mon</th><td>30</td>...</tr>...</tbody>
|
|
47
|
+
// and produce a Map keyed as "series|x" to cell text.
|
|
48
|
+
const tableMatch = regionHtml.match(/<table class="chartAltTable"[\s\S]*?<\/table>/);
|
|
49
|
+
if (!tableMatch) return null;
|
|
50
|
+
const table = tableMatch[0];
|
|
51
|
+
const headers = [...table.matchAll(/<th scope="col">([^<]+)<\/th>/g)].map((h) => h[1]);
|
|
52
|
+
// Column 0 is the row heading (e.g. "Day"); subsequent columns are
|
|
53
|
+
// series columns like "Prod (requests)". Strip the trailing unit
|
|
54
|
+
// in parens to isolate the series name.
|
|
55
|
+
const seriesCols = headers.slice(1).map((h) => h.replace(/\s*\(.*\)\s*$/, '').trim());
|
|
56
|
+
const rows = [...table.matchAll(/<tr>([\s\S]*?)<\/tr>/g)];
|
|
57
|
+
const cells = new Map();
|
|
58
|
+
for (const [_, rowInner] of rows) {
|
|
59
|
+
const rowHead = rowInner.match(/<th scope="row">([^<]+)<\/th>/);
|
|
60
|
+
if (!rowHead) continue;
|
|
61
|
+
const xLabel = rowHead[1];
|
|
62
|
+
const tdMatches = [...rowInner.matchAll(/<td>([^<]*)<\/td>/g)].map((c) => c[1]);
|
|
63
|
+
tdMatches.forEach((cellText, i) => {
|
|
64
|
+
const series = seriesCols[i];
|
|
65
|
+
if (series) cells.set(`${series}|${xLabel}`, cellText.trim());
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return cells;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default async function runProbe() {
|
|
72
|
+
const fixture = await startFixture();
|
|
73
|
+
const results = [];
|
|
74
|
+
try {
|
|
75
|
+
const golden = await fixtureFetch(fixture.url, '/');
|
|
76
|
+
const regions = parseChartRegions(golden.body);
|
|
77
|
+
const landmarkPass = golden.status === 200 && !!golden.requestId
|
|
78
|
+
&& regions.length >= 2
|
|
79
|
+
&& regions.every((r) => /<table class="chartAltTable"/.test(r));
|
|
80
|
+
results.push({
|
|
81
|
+
anchorAcId: null,
|
|
82
|
+
conformanceOnly: true,
|
|
83
|
+
limitation: 'application-charts-AC-18103-1: browser focus movement onto the paired table and assistive-tech traversal (the AC clauses beyond DOM shape) are browser-driven and not observed by this Node HTTP probe; the DOM landmark walk is a partial observation of AC-18103-1',
|
|
84
|
+
verdict: landmarkPass ? 'warn' : 'fail',
|
|
85
|
+
detail: landmarkPass
|
|
86
|
+
? `Given a rendered chart, a \`<table>\` element carrying; GET / carries ${regions.length} <section class="chartRegion" role="region"> landmarks; every landmark holds one <table class="chartAltTable"> as AC-18103-1 requires ("a <table> element carrying the same data lives in the same landmark"); x-fixture-request-id=${golden.requestId}`
|
|
87
|
+
: `Given a rendered chart, a \`<table>\` element carrying; landmark evidence gap: status=${golden.status} rid=${golden.requestId} regions=${regions.length}`,
|
|
88
|
+
evidence: {
|
|
89
|
+
requestId: golden.requestId,
|
|
90
|
+
responseStatus: golden.status,
|
|
91
|
+
bodyExcerpt: excerpt((golden.body.match(/<section class="chartRegion"[^]{0,140}/) || [''])[0]),
|
|
92
|
+
derived: { regionCount: regions.length, tablesPerRegion: regions.map((r) => (r.match(/<table class="chartAltTable"/g) || []).length) },
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// AC-18103-3: every cell matches the (series, x) coordinate.
|
|
97
|
+
const perRegion = [];
|
|
98
|
+
let allMatch = true;
|
|
99
|
+
let totalCoords = 0;
|
|
100
|
+
let mismatches = [];
|
|
101
|
+
for (let ri = 0; ri < regions.length; ri += 1) {
|
|
102
|
+
const rendered = extractRenderedPoints(regions[ri]);
|
|
103
|
+
const cells = extractTableCells(regions[ri]);
|
|
104
|
+
if (!cells) { allMatch = false; mismatches.push({ region: ri, reason: 'no table' }); continue; }
|
|
105
|
+
for (const [key, renderedValue] of rendered) {
|
|
106
|
+
totalCoords += 1;
|
|
107
|
+
const cellText = cells.get(key);
|
|
108
|
+
if (cellText === undefined) { allMatch = false; mismatches.push({ region: ri, key, renderedValue, cellText: null }); continue; }
|
|
109
|
+
// Same-precision comparison: the render emits the raw numeric
|
|
110
|
+
// token in data-y, the table emits the same text; compare as
|
|
111
|
+
// strings so a 30 vs 30.0 divergence is a fail.
|
|
112
|
+
if (cellText !== renderedValue) { allMatch = false; mismatches.push({ region: ri, key, renderedValue, cellText }); }
|
|
113
|
+
}
|
|
114
|
+
// Also refuse extra table cells the chart has no coordinate
|
|
115
|
+
// for (missing chart point / spurious cell): iterate cells.
|
|
116
|
+
for (const [key, cellText] of cells) {
|
|
117
|
+
if (!rendered.has(key)) { allMatch = false; mismatches.push({ region: ri, key, renderedValue: null, cellText }); }
|
|
118
|
+
}
|
|
119
|
+
perRegion.push({ region: ri, coords: rendered.size, tableCells: cells.size });
|
|
120
|
+
}
|
|
121
|
+
const cellPass = golden.status === 200 && !!golden.requestId && totalCoords > 0 && allMatch;
|
|
122
|
+
results.push({
|
|
123
|
+
anchorAcId: 'application-charts-AC-18103-3',
|
|
124
|
+
verdict: cellPass ? 'pass' : 'fail',
|
|
125
|
+
detail: cellPass
|
|
126
|
+
? `Given a rendered chart, when the pack inspects; Every one of ${totalCoords} rendered (series, x) coordinates matches its paired <td> cell text at the same precision the chart emits (per-region counts: ${JSON.stringify(perRegion)}); a mismatched or missing cell would fail per AC-18103-3; x-fixture-request-id=${golden.requestId}`
|
|
127
|
+
: `Given a rendered chart, when the pack inspects; AC-18103-3 evidence gap: total coords=${totalCoords} mismatches=${JSON.stringify(mismatches.slice(0, 4))}`,
|
|
128
|
+
evidence: {
|
|
129
|
+
requestId: golden.requestId,
|
|
130
|
+
responseStatus: golden.status,
|
|
131
|
+
bodyExcerpt: excerpt(`per-region=${JSON.stringify(perRegion)}`),
|
|
132
|
+
derived: { totalCoords, mismatchCount: mismatches.length, perRegion },
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
} finally {
|
|
136
|
+
await fixture.kill();
|
|
137
|
+
}
|
|
138
|
+
return { results };
|
|
139
|
+
}
|
package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"reqId": "application-charts-REQ-001",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
4
|
"title": "The application ships the small set of chart forms an operator SaaS actually shows",
|
|
5
|
-
"description": "The application realises the chart-form set the shelf's spec commits: bar, line, area, pie or donut, single-value with sparkline, and heatmap. Every rendered chart on the shipped surface picks one of these forms and honours the render-shell contract (TAC-1901). A form outside this set is refused at project-side
|
|
5
|
+
"description": "The application realises the chart-form set the shelf's spec commits: bar, line, area, pie or donut, single-value with sparkline, and heatmap. Every rendered chart on the shipped surface picks one of these forms and honours the render-shell contract (TAC-1901). A form outside this set is refused at project-side check; a specialised form the applying project needs (a candlestick, a Sankey) supersedes this REQ with a project-authored REQ and is documented as a known deviation. The chart engine is elicited at apply (`recharts`, `echarts`, `chart-js`, `d3-primitives` or `hand-authored-svg` per ADR-1901); a canvas-only engine that offers no text-alternative surface is refused at project-side check and the refusal is documented on the blueprint README under the engine-refusal rule.",
|
|
6
6
|
"category": "functional",
|
|
7
7
|
"domain": "application",
|
|
8
8
|
"priority": "must",
|
package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"reqId": "application-charts-REQ-002",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
4
|
"title": "Every chart series distinguishes on colour plus pattern plus direct label (non-colour distinction, WCAG 1.4.1)",
|
|
5
|
-
"description": "Every rendered chart with two or more series distinguishes the series through more than colour alone: colour is paired with a pattern (a dashed line, a hatched fill, a marker shape) and a direct label placed at the series (a legend entry alone does not satisfy the AC). A vision-deficiency simulation (deuteranopia is the shelf's default screen) still reads the series distinction. The blueprint's accessible palette (ADR-1902) is the colour default; the pattern and label rules apply regardless of palette. The elicited `palette-overrides` value on `blueprint.json:elicits[]` supplies operator-authored brand tokens keyed by series role or index; the render shell applies each supplied token verbatim, falls back to the accessible-defaults palette at the same series index for any missing token, and the render log records exactly one warning per unpaletted series naming the missing token (ADR-1902). An empty override string (the default) is legal and resolves to the accessible-defaults palette with no warnings; a malformed override (non-JSON, or a shape the shell cannot key by series role or index) is refused at project-side
|
|
5
|
+
"description": "Every rendered chart with two or more series distinguishes the series through more than colour alone: colour is paired with a pattern (a dashed line, a hatched fill, a marker shape) and a direct label placed at the series (a legend entry alone does not satisfy the AC). A vision-deficiency simulation (deuteranopia is the shelf's default screen) still reads the series distinction. The blueprint's accessible palette (ADR-1902) is the colour default; the pattern and label rules apply regardless of palette. The elicited `palette-overrides` value on `blueprint.json:elicits[]` supplies operator-authored brand tokens keyed by series role or index; the render shell applies each supplied token verbatim, falls back to the accessible-defaults palette at the same series index for any missing token, and the render log records exactly one warning per unpaletted series naming the missing token (ADR-1902). An empty override string (the default) is legal and resolves to the accessible-defaults palette with no warnings; a malformed override (non-JSON, or a shape the shell cannot key by series role or index) is refused at project-side check and the refusal is recorded on the render log.",
|
|
6
6
|
"category": "functional",
|
|
7
7
|
"domain": "application",
|
|
8
8
|
"priority": "must",
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"acceptanceCriteria": [
|
|
12
12
|
{
|
|
13
13
|
"id": "AC-18101-1",
|
|
14
|
-
"description": "Given a rendered chart on the surface, the chart's declared form matches one of {bar, line, area, pie, donut, single-value, sparkline, heatmap}; a form outside this set is refused at project-side
|
|
14
|
+
"description": "Given a rendered chart on the surface, the chart's declared form matches one of {bar, line, area, pie, donut, single-value, sparkline, heatmap}; a form outside this set is refused at project-side check or documented on the blueprint's README as a project-authored deviation.",
|
|
15
15
|
"given": "a rendered chart on the shipped surface",
|
|
16
16
|
"when": "the surface is reviewed against the shelf",
|
|
17
17
|
"then": "the chart's declared form is one of the six committed forms or a documented project deviation",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-18101-2",
|
|
24
|
-
"description": "Given a rendered chart, the chart mounts through the render-shell contract (TAC-1901): the shell exposes the accessible-defaults palette hook (ADR-1902) and the text-alternative slot; a chart that skips the shell contract (renders through a raw chart-library mount) is refused at project-side
|
|
24
|
+
"description": "Given a rendered chart, the chart mounts through the render-shell contract (TAC-1901): the shell exposes the accessible-defaults palette hook (ADR-1902) and the text-alternative slot; a chart that skips the shell contract (renders through a raw chart-library mount) is refused at project-side check.",
|
|
25
25
|
"given": "a rendered chart",
|
|
26
26
|
"when": "the mount seam is inspected",
|
|
27
27
|
"then": "the chart is mounted through TAC-1901's render shell",
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
"id": "AC-18101-4",
|
|
48
|
-
"description": "Given a specialised form the applying project needs (a candlestick, a Sankey), the project's README carries a CALLS MADE entry naming the deviation and the project supersedes REQ-001 with a project-authored REQ that names the deviating form; a specialised form without a documented CALLS MADE + superseding REQ fails project-side
|
|
48
|
+
"description": "Given a specialised form the applying project needs (a candlestick, a Sankey), the project's README carries a CALLS MADE entry naming the deviation and the project supersedes REQ-001 with a project-authored REQ that names the deviating form; a specialised form without a documented CALLS MADE + superseding REQ fails project-side check. Applying agent sets: the specialised chart form the project needs (a candlestick, a Sankey), the CALLS MADE entry text (the deviation from the six-form set quoted verbatim and the project's reason), and the project-authored superseding REQ id that names the deviating form.",
|
|
49
49
|
"given": "an applying project shipping a form outside the six committed",
|
|
50
|
-
"when": "
|
|
51
|
-
"then": "the deviation is documented with a project-authored superseding REQ; an undocumented deviation fails
|
|
50
|
+
"when": "the check inspects the project's CALLS MADE and REQ set",
|
|
51
|
+
"then": "the deviation is documented with a project-authored superseding REQ; an undocumented deviation fails the check",
|
|
52
52
|
"testable": true,
|
|
53
53
|
"scope": "unclassified",
|
|
54
54
|
"disposition": "template"
|
package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"acceptanceCriteria": [
|
|
12
12
|
{
|
|
13
13
|
"id": "AC-18106-1",
|
|
14
|
-
"description": "Given ADR-1901's engine choice, one of the canonical tokens `recharts`, `echarts`, `chart-js`, `d3-primitives` or `hand-authored-svg` on `blueprint.json:elicits[].chart-engine.options` (the manifest owns the token set; every other layer references these tokens verbatim), the applying project's manifest records the engine and the text-alternative reach: the engine's rendered chart is paired with a `<table>` element the pack asserts (AC-18103-1). An engine that renders exclusively to a `<canvas>` and does not offer a text-alternative surface is refused at project-side
|
|
14
|
+
"description": "Given ADR-1901's engine choice, one of the canonical tokens `recharts`, `echarts`, `chart-js`, `d3-primitives` or `hand-authored-svg` on `blueprint.json:elicits[].chart-engine.options` (the manifest owns the token set; every other layer references these tokens verbatim), the applying project's manifest records the engine and the text-alternative reach: the engine's rendered chart is paired with a `<table>` element the pack asserts (AC-18103-1). An engine that renders exclusively to a `<canvas>` and does not offer a text-alternative surface is refused at project-side check; the refusal is documented in the blueprint's README under the engine-refusal rule. Applying agent sets: the `blueprint.json:elicits[].chart-engine.options` token (one of `recharts`, `echarts`, `chart-js`, `d3-primitives`, `hand-authored-svg`) recorded on the manifest, and the paired `<table>` mount the pack asserts under AC-18103-1.",
|
|
15
15
|
"given": "an ADR-1901 engine choice",
|
|
16
16
|
"when": "the applying project's chart mount is reviewed",
|
|
17
17
|
"then": "the engine is refused if it renders canvas-only surfaces with no text-alternative path",
|
|
@@ -41,4 +41,4 @@ Every rendered chart on the surface mounts through the render shell; every multi
|
|
|
41
41
|
|
|
42
42
|
## Spec provenance
|
|
43
43
|
|
|
44
|
-
The shipped v1.0.0 realises the
|
|
44
|
+
The shipped v1.0.0 realises the visual specification for chart components verbatim; where the shell contract carries a documented deviation, the blueprint README names it under the engine-refusal or mechanism-reach sections.
|
|
@@ -1,31 +1,41 @@
|
|
|
1
1
|
# application-dashboard CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 1.0.9 - 2026-09-11
|
|
4
|
+
|
|
5
|
+
- Adds a contributions/probes pack meeting rule 7d.
|
|
6
|
+
- Probes: shell-five-regions (region layout derived from probe-controlled region enum), primary-kpi-top-left, four-tile-states, export-handle-formats.
|
|
7
|
+
- Export probe rethrows any teardown exception; a swallowed teardown error would hide a boundary failure.
|
|
8
|
+
- Primary-KPI at shipped viewports is a browser-only property; the row is conformanceOnly + limitation naming the specific AC id and the browser property not observed.
|
|
9
|
+
- notObservableHere rows anchor nothing else; conformanceOnly rows always carry a limitation.
|
|
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-19104-2, AC-19106-1, AC-19106-2 and AC-19107-2 now enumerate the specific applying-project substitutions (auto-refresh interval, export-button accessible name and format list, chart-selection mechanism, primary-kpi kind and tile inventory) in place of the earlier generic phrasing, so applying projects have precise values to fill in. AC-19107-1 changed to `disposition: fixed` (no project-side substitution: the shipped guidance file satisfies the AC directly). README shipped prose neutralised: the dated visual-specification reference has been dropped and the pack-browser seam-extension paragraph has been rewritten.
|
|
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 five apply-time answers (primary-kpi-kind, primary-kpi-custom-name, timeframe-presets, auto-refresh-interval-seconds, export-formats); each option value backed by a must REQ description with a runtime clause per section 7c. REQ-002 gains a data-kpi-name clause when kind is custom; REQ-004 gains an auto-refresh-interval-seconds clause; REQ-005 gains the lowercase csv/pdf/png-chart format tokens.
|
|
15
25
|
- Adds refusal-path ACs to US-19101 (silent region omission, duplicate region names, empty chart region), US-19102 (360 row-start conflict, custom kind requires data-kpi-name, invalid enum value), US-19103 (colour-only distinction refusal, error state requires visible reason, rapid-transition announcement throttling), US-19105 (invalid filter input, subset-reject fan-out stamp advancement, Clear filters reset), US-19107 (per-rule guidance check, design-guidance asset present, documented CALLS MADE deviation). US-19104 and US-19106 also extended with concurrent-preset cancellation, whole-surface failure announcement, elicited preset support and Escape focus return plus operator-authored export formats. Every story now at the 7a floor (3-5 ACs per story, 35 ACs total).
|
|
16
|
-
-
|
|
26
|
+
- Register-and-citation sweep 2026-09-10: vendorCitation added to AC-19103-3 (WCAG 1.4.1 use-of-color), AC-19106-4 (WCAG 2.4.3 focus-order) and AC-19107-3 (WCAG 1.4.1 use-of-color) with verifiedOn 2026-09-09; an Applying agent sets clause appended to AC-19107-5 naming the CALLS MADE entry text, the superseding REQ id and the specific deviation; a pre-existing internal work-item reference stripped from the README elicited-parameters paragraph.
|
|
17
27
|
|
|
18
|
-
## 1.0.1 (
|
|
28
|
+
## 1.0.1 (2026-09-09)
|
|
19
29
|
|
|
20
|
-
-
|
|
21
|
-
- Added AC-19104-2 (fan-out partial failure: failed tiles render error state with aria-live and retry control, shared refresh-stamp advances only after every tile has settled)
|
|
30
|
+
- Hardening cleanup: chain-consistency lint clean; added deliveredBy to every REQ, added ownerRef and disposition to every AC per section 7b, closed `primary-KPI` case drifts in AC-19107-2, ADR-2001 and the guide body to match the `primary-kpi` spelling owned by TAC-2001.responsibilities[0].
|
|
31
|
+
- Added AC-19104-2 (fan-out partial failure: failed tiles render error state with aria-live and retry control, shared refresh-stamp advances only after every tile has settled) on TAC-2002.responsibilities[3]. Added AC-19106-2 and AC-19106-3 (export success and rejection cases: valid blob/filename on the current slice, no download on rejection with an announced failure) on TAC-2003.interfaces[0]. Applying projects now have explicit acceptance criteria for the fan-out partial-failure and export success/rejection paths.
|
|
22
32
|
|
|
23
33
|
|
|
24
34
|
## 1.0.0 (2026-09-04)
|
|
25
35
|
|
|
26
|
-
-
|
|
27
|
-
- Ships `assets/guidance/dashboard-design.md`: eight sections (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) with five https-cited sources (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs). Each section names whether the rule hardens into an AC on this blueprint or stays operator guidance. The applying agent reads this asset at apply and the
|
|
36
|
+
- Initial shipped version of the shelf's application-dashboard blueprint. Five REQs (shell composition; primary-KPI top-left visual hierarchy on the F-scan across 1440, 1024 and 360; per-tile four-state contract with role region, aria-live polite and non-colour distinction; timeframe and filter chrome refetch fan-out with matching as-of stamp; export handle with format delegation to charts), seven USs binding runtime-observable ACs plus one on packaged-guidance adherence, three TACs (tile grid with CSS Grid position semantics and breakpoint reflow; timeframe picker and filter chrome with the fan-out contract; export handle with delegation to the application-charts render shell), three ADRs (primary-KPI kinds enum with elicited overrides; timeframe presets with recommendedDefault and elicited overrides plus auto-refresh off by default; export formats with recommendedDefault and elicited overrides). No new global topics.
|
|
37
|
+
- Ships `assets/guidance/dashboard-design.md`: eight sections (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) with five https-cited sources (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs). Each section names whether the rule hardens into an AC on this blueprint or stays operator guidance. The applying agent reads this asset at apply and the probe pack references it at ship.
|
|
28
38
|
- Ships `probe-packs/application-dashboard.pack.mjs`: three browser-verify checks anchored to blueprint AC ids, every check carrying a description field per spec section 9. `AC-19102-1` primary-KPI position by DOM order and CSS Grid position at 1440, 1024 and 360 (drives the new pack-browser `resize(width, height)` seam to each width). `AC-19104-1` timeframe refetch fan-out with matching boundary and as-of stamp (reads the request log from `window.__dashboardFetches` and reconciles with the `GET /__requests` endpoint). `AC-19103-1` per-tile four-state contract with role region, aria-live polite and non-colour distinction (drives `?tile=primary&state=<state>` for each of the four states). Third blueprint on the shelf that ships a Playwright probe pack under the runner extension.
|
|
29
|
-
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the
|
|
30
|
-
- Suggests the `logging` and `errorHandling` companions with the
|
|
39
|
+
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/` (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, with `?break=kpi-position`, `?break=fanout` and `?break=state-aria` query switches for the negative runs, `?tile=<id>&state=<state>` state pinning for the four-state check, and `?asof=<iso>` for a fixed shell as-of stamp.
|
|
40
|
+
- Suggests the `logging` and `errorHandling` companions with the shipped spec's reasons. `providesRoles` absent, leaf blueprint per the loader contract (an empty array is refused, an omitted field marks the blueprint as a leaf).
|
|
31
41
|
- Extends the pack-browser seam (`packages/rcf-lite/src/browser-verify/pack-browser.js`) with a `resize(width, height)` method: on the MCP route the method calls the pinned Playwright MCP's `browser_resize` tool; on the project route it calls `page.setViewportSize({ width, height })`. The next blueprints on the shelf that ship breakpoint-scoped visual ACs (notifications-in-app, admin-console) reuse the same seam.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Dashboard blueprint (v1.0.4)
|
|
2
2
|
|
|
3
|
-
Vendor-neutral analytics-dashboard contract for a rcf-lite application. Ships the shell composition, the primary-KPI visual hierarchy, the per-tile four-state contract, the timeframe and filter chrome refetch fan-out, and the export handle with format delegation to charts. Consumes the application-charts render shell (TAC-1901) for every rendered chart; references application-datatable in the packaged design guidance's "when a table beats a chart" section. Ships a packaged design-guidance asset under `assets/guidance/dashboard-design.md` and a Playwright probe pack under `probe-packs/application-dashboard.pack.mjs` whose three checks are the runtime gate the delivery-ci-workflows runner drives (section 5.3 of the
|
|
3
|
+
Vendor-neutral analytics-dashboard contract for a rcf-lite application. Ships the shell composition, the primary-KPI visual hierarchy, the per-tile four-state contract, the timeframe and filter chrome refetch fan-out, and the export handle with format delegation to charts. Consumes the application-charts render shell (TAC-1901) for every rendered chart; references application-datatable in the packaged design guidance's "when a table beats a chart" section. Ships a packaged design-guidance asset under `assets/guidance/dashboard-design.md` and a Playwright probe pack under `probe-packs/application-dashboard.pack.mjs` whose three checks are the runtime gate the delivery-ci-workflows runner drives (section 5.3 of the visual specification). No new global topics; suggests the `logging` and `errorHandling` companions. Ships a Playwright probe pack under the runner extension.
|
|
4
4
|
|
|
5
5
|
## Apply
|
|
6
6
|
|
|
@@ -29,7 +29,7 @@ Deliberately not contributed: a choice of chart engine (the charts blueprint's A
|
|
|
29
29
|
|
|
30
30
|
## The packaged design guidance
|
|
31
31
|
|
|
32
|
-
`assets/guidance/dashboard-design.md` is a shipped asset the applying agent reads at apply and the
|
|
32
|
+
`assets/guidance/dashboard-design.md` is a shipped asset the applying agent reads at apply and the probe pack references at ship. Eight sections cover the shipped surface rules:
|
|
33
33
|
|
|
34
34
|
1. Primary KPI placement (hardens into AC-19102-1)
|
|
35
35
|
2. Tile density and count limits (stays operator guidance)
|
|
@@ -87,15 +87,15 @@ Every dashboard surface renders the five shell regions (tile row, chart region,
|
|
|
87
87
|
Every runtime-observable AC that is not bound to a pack check appears here individually per the gate discipline (`blueprint-authoring-checklist.md` section 6.g): categories are not enough. The pack has three checks; every other runtime-observable AC on this blueprint is a mechanism-reach gap named below.
|
|
88
88
|
|
|
89
89
|
- **AC-19101-1 five-region shell composition**. The pack drives the primary-KPI region (AC-19102-1) and the timeframe region (AC-19104-1), which implies the shell renders at least those two, but the pack does not enumerate all five regions and their labels. A v1.1 minor bump could add a region-enumeration pre-check that walks `[data-region]` on the shell root.
|
|
90
|
-
- **AC-19101-2 chart region mounts through the charts shell**. The application-charts pack fires on the dashboard's chart route through its own `appliesTo` predicate; the dashboard's pack does not itself assert the chart-shell contract on the region. Project-side
|
|
90
|
+
- **AC-19101-2 chart region mounts through the charts shell**. The application-charts pack fires on the dashboard's chart route through its own `appliesTo` predicate; the dashboard's pack does not itself assert the chart-shell contract on the region. Project-side check is the current mechanism.
|
|
91
91
|
- **AC-19102-2 no-primary-KPI supersession fallback**. The pack asserts the primary KPI exists (AC-19102-1); the documentation-and-review contract on a surface with no primary KPI is not observable at runtime.
|
|
92
92
|
- **AC-19103-2 state-transition announcement**. The pack does not simulate the transition today (the runner has no synthetic-event seam beyond click / type / press). A v1.2 runner minor with an event-emit seam would close the class.
|
|
93
|
-
- **AC-19104-2 auto-refresh default and elicited interval**. The pack asserts `data-auto-refresh="off"` on the shell root at initial render (implied by the fixture); a runtime observation of the elicited-interval refresh cadence is not exercised. Project-side
|
|
93
|
+
- **AC-19104-2 auto-refresh default and elicited interval**. The pack asserts `data-auto-refresh="off"` on the shell root at initial render (implied by the fixture); a runtime observation of the elicited-interval refresh cadence is not exercised. Project-side check carries the residual.
|
|
94
94
|
- **AC-19105-1 filter chrome accessible controls**. The pack does not enumerate filter controls today. A v1.1 minor bump could add a filter-control enumeration check.
|
|
95
95
|
- **AC-19105-2 filter fan-out**. The pack asserts the timeframe fan-out (AC-19104-1); the filter-change fan-out is a mechanism-reach gap. A v1.1 minor bump could add a paired filter-change check driving the filter chip and reading the same request log.
|
|
96
96
|
- **AC-19106-1 export handle accessible format list**. The pack does not open the export list today. A v1.1 minor bump could add a check that activates the export button, reads the exposed listbox and asserts the format entries.
|
|
97
|
-
- **AC-19106-2 PNG-of-chart delegation**. The pack browser has no download-capture seam today, so the PNG delegation is proven at project-side
|
|
98
|
-
- **AC-19107-2 dashboard shape reflects guidance rules**. The pack asserts the specific attributes the fixture emits (primary-KPI kind, as-of stamp, auto-refresh default); a general check that a shipped surface honours the guidance's hardened rules is project-side
|
|
97
|
+
- **AC-19106-2 PNG-of-chart delegation**. The pack browser has no download-capture seam today, so the PNG delegation is proven at project-side check. A future runner minor would add a seam that intercepts the download stream and asserts the returned bytes are a PNG whose payload matches the rendered chart.
|
|
98
|
+
- **AC-19107-2 dashboard shape reflects guidance rules**. The pack asserts the specific attributes the fixture emits (primary-KPI kind, as-of stamp, auto-refresh default); a general check that a shipped surface honours the guidance's hardened rules is project-side check.
|
|
99
99
|
|
|
100
100
|
## The pack-browser resize seam extension
|
|
101
101
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Dashboard design guidance
|
|
2
2
|
|
|
3
|
-
A packaged asset shipped with the `application-dashboard` blueprint. Read at apply, referenced at project-side
|
|
3
|
+
A packaged asset shipped with the `application-dashboard` blueprint. Read at apply, referenced at project-side check, and cited from every REQ, ADR and pack check that anchors on a design rule. The applying agent honours the eight sections below. Where a section names an AC id, the rule is a runtime-observable AC on this blueprint (the ship gate refuses on failure). Where a section stays operator guidance, the applying agent honours it and the shipping surface is confirmed against the guidance at project-side check.
|
|
4
4
|
|
|
5
5
|
Sources are cited by URL at each section. Five bodies of work anchor this guidance:
|
|
6
6
|
|
|
@@ -14,7 +14,7 @@ Sources are cited by URL at each section. Five bodies of work anchor this guidan
|
|
|
14
14
|
|
|
15
15
|
The primary KPI is the reader's anchor. Place it top-left on every ratified breakpoint (1440, 1024, 360). NN/g's F-shaped-pattern reading research reports that the top-left region of a text-heavy layout is where a reader's eye lands first; that is the spot the anchor tile has to occupy. On a 360 phone layout the tile row reflows to one column and the primary KPI stays first in DOM order and top of the stack.
|
|
16
16
|
|
|
17
|
-
The primary KPI kind is one of five values (ADR-2001): `revenue`, `active-users`, `error-rate`, `throughput`, `custom`. A `custom` value carries a short operator name in `data-kpi-name`. A dashboard with no primary KPI fails project-side
|
|
17
|
+
The primary KPI kind is one of five values (ADR-2001): `revenue`, `active-users`, `error-rate`, `throughput`, `custom`. A `custom` value carries a short operator name in `data-kpi-name`. A dashboard with no primary KPI fails project-side check.
|
|
18
18
|
|
|
19
19
|
Sources:
|
|
20
20
|
- NN/g F-shaped pattern of reading: https://www.nngroup.com/articles/f-shaped-pattern-reading-web-content/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "application-dashboard",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"category": "application",
|
|
5
5
|
"suggestedCompanions": [
|
|
6
6
|
{
|
|
@@ -151,5 +151,6 @@
|
|
|
151
151
|
"elicited": true,
|
|
152
152
|
"standardsTraceClause": "GOV.UK Design System (download patterns); WCAG 1.3.1 (info and relationships)"
|
|
153
153
|
}
|
|
154
|
-
]
|
|
154
|
+
],
|
|
155
|
+
"updatedAt": "2026-09-11T16:04:17Z"
|
|
155
156
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"status": "accepted",
|
|
7
7
|
"title": "Elicit the primary KPI kind from a fixed enum (revenue, active-users, error-rate, throughput, custom)",
|
|
8
8
|
"context": "The primary KPI is the reader's anchor on the dashboard's first fixation. Every applying project already has a primary KPI in the business sense; the problem is that the surface's `data-kpi-kind` attribute either stays free-form (any string) and cross-project comparisons drift, or hard-picks one KPI at the shelf and forces every applying project to relabel. Neither option lands the runtime discipline the pack needs to prove the primary-kpi-top-left rule.",
|
|
9
|
-
"decision": "The primary-kpi kind is elicited at apply from a fixed enum: `revenue`, `active-users`, `error-rate`, `throughput`, or `custom`. The elicited value lands on the primary tile as `data-kpi-kind`; a `custom` choice carries a `data-kpi-name` attribute with the operator's own short name. The pack asserts the attribute value is one of the enum values (or `custom` with a `data-kpi-name`), the tile is top-left in DOM order and CSS Grid position at every
|
|
9
|
+
"decision": "The primary-kpi kind is elicited at apply from a fixed enum: `revenue`, `active-users`, `error-rate`, `throughput`, or `custom`. The elicited value lands on the primary tile as `data-kpi-kind`; a `custom` choice carries a `data-kpi-name` attribute with the operator's own short name. The pack asserts the attribute value is one of the enum values (or `custom` with a `data-kpi-name`), the tile is top-left in DOM order and CSS Grid position at every shipped breakpoint. The five enum values cover the shipped shelf's known cases (SaaS revenue dashboards, product-analytics active-users dashboards, SRE error-rate dashboards, throughput-focused ops dashboards, and the custom escape hatch); a new enum value moves the ADR to v1.1.0 with a shelf-wide check.",
|
|
10
10
|
"consequences": "Applying projects pick from a small, review-worthy set; the pack has a runtime-observable attribute to check; cross-project comparisons on a shelf-wide dashboard registry are trivial. The `custom` value keeps the escape hatch honest: a project with a KPI outside the five stays within the ADR while documenting its own name on `data-kpi-name`.",
|
|
11
11
|
"alternativesConsidered": [
|
|
12
12
|
{
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"status": "accepted",
|
|
7
7
|
"title": "Ship three timeframe presets by recommendedDefault with elicited overrides and auto-refresh off unless elicited",
|
|
8
8
|
"context": "Timeframe presets on a dashboard are the single most-touched control; the wrong default (a rolling 24-hour window on a monthly-cycle business) produces a dashboard that is silently wrong at every open. Operators often want their own presets (a fiscal-year window, a shift window). Auto-refresh is one of the most common accessibility and cost defects on shipped dashboards: an unattended refresh runs the fan-out on a hidden tab all day.",
|
|
9
|
-
"decision": "The blueprint ships three timeframe presets by recommendedDefault: `last-7-days`, `last-30-days`, and `quarter-to-date`. `last-7-days` is the ship default unless the operator elicits an override at apply. Operators supply their own preset set through the elicited override; missing presets are ignored, extra presets append to the shipped set. Auto-refresh is OFF by default: `data-auto-refresh` on the shell root reads `off`; an operator-elicited refresh interval sets it to the elicited seconds and the shell refetches on the same fan-out contract at that interval. A shell that ships auto-refresh on by default fails project-side
|
|
9
|
+
"decision": "The blueprint ships three timeframe presets by recommendedDefault: `last-7-days`, `last-30-days`, and `quarter-to-date`. `last-7-days` is the ship default unless the operator elicits an override at apply. Operators supply their own preset set through the elicited override; missing presets are ignored, extra presets append to the shipped set. Auto-refresh is OFF by default: `data-auto-refresh` on the shell root reads `off`; an operator-elicited refresh interval sets it to the elicited seconds and the shell refetches on the same fan-out contract at that interval. A shell that ships auto-refresh on by default fails project-side check.",
|
|
10
10
|
"consequences": "The applying project gets a safe timeframe default that matches the most common dashboard-glance case; operators with an unusual cycle (a fiscal-year business) elicit their own set. Auto-refresh stays off unless the operator explicitly turns it on with an interval, and the pack asserts the default state through `data-auto-refresh`.",
|
|
11
11
|
"alternativesConsidered": [
|
|
12
12
|
{
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// export-handle-formats probe for application-dashboard v1.0.9.
|
|
2
|
+
//
|
|
3
|
+
// AC-19106-1 (server-observable half): the export handle region
|
|
4
|
+
// carries a labelled button with aria-haspopup="listbox" AND a
|
|
5
|
+
// role="listbox" enumerating the applied formats. The fixture
|
|
6
|
+
// accepts a startServer({ exportFormats: [...] }) override so the
|
|
7
|
+
// probe DRIVES two distinct format sets and asserts the rendered
|
|
8
|
+
// listbox follows the input on each run. Browser-observable
|
|
9
|
+
// activation and focus-return are covered by the conformanceOnly
|
|
10
|
+
// limitation on the single row.
|
|
11
|
+
//
|
|
12
|
+
// anchorAcId: application-dashboard-AC-19106-1.
|
|
13
|
+
|
|
14
|
+
import { startFixture, evidenceFromResponse, conformanceOnlyResult } from './probe-utils.mjs';
|
|
15
|
+
|
|
16
|
+
export const anchorReqId = 'application-dashboard-REQ-005';
|
|
17
|
+
export const accountBound = false;
|
|
18
|
+
|
|
19
|
+
async function driveOne(startServer, formatsInput) {
|
|
20
|
+
const started = await startServer({ port: 0, exportFormats: formatsInput });
|
|
21
|
+
const baseUrl = `http://127.0.0.1:${started.port}`;
|
|
22
|
+
const close = () => new Promise((res, rej) => started.server.close((e) => (e ? rej(e) : res())));
|
|
23
|
+
try {
|
|
24
|
+
const res = await fetch(`${baseUrl}/`);
|
|
25
|
+
const body = await res.text();
|
|
26
|
+
const exportRegion = body.match(/<section[^>]+data-region="export-handle"[^>]*>([\s\S]*?)<\/section>/);
|
|
27
|
+
const inner = exportRegion ? exportRegion[1] : '';
|
|
28
|
+
const hasBtn = /<button[^>]+aria-haspopup="listbox"[^>]*>/.test(inner);
|
|
29
|
+
const listbox = /<ul[^>]+role="listbox"[^>]*>/.test(inner);
|
|
30
|
+
const formats = Array.from(inner.matchAll(/data-export-format="([^"]+)"/g)).map((m) => m[1]);
|
|
31
|
+
const followsInput = formats.length === formatsInput.length
|
|
32
|
+
&& formatsInput.every((f) => formats.includes(f))
|
|
33
|
+
&& formats.every((f) => formatsInput.includes(f));
|
|
34
|
+
return { res, body, hasBtn, listbox, formats, followsInput, close };
|
|
35
|
+
} catch (e) {
|
|
36
|
+
try { await close(); }
|
|
37
|
+
catch (closeErr) { throw new AggregateError([e, closeErr], 'probe body threw and teardown also threw'); }
|
|
38
|
+
throw e;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default async function runProbe() {
|
|
43
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
|
|
44
|
+
|
|
45
|
+
const results = [];
|
|
46
|
+
const shipped = ['csv', 'pdf', 'png-chart'];
|
|
47
|
+
const elicited = ['csv', 'xlsx', 'json', 'png-chart'];
|
|
48
|
+
const runA = await driveOne(startServer, shipped);
|
|
49
|
+
try {
|
|
50
|
+
const runB = await driveOne(startServer, elicited);
|
|
51
|
+
try {
|
|
52
|
+
const derived = runA.followsInput && runB.followsInput
|
|
53
|
+
&& JSON.stringify(runA.formats) !== JSON.stringify(runB.formats);
|
|
54
|
+
const pass = runA.res.status === 200 && runB.res.status === 200 && runA.hasBtn && runA.listbox && runB.hasBtn && runB.listbox && derived;
|
|
55
|
+
results.push(conformanceOnlyResult({
|
|
56
|
+
anchorAcId: 'application-dashboard-AC-19106-1',
|
|
57
|
+
anchorReqId: 'application-dashboard-REQ-005',
|
|
58
|
+
verdict: pass ? 'pass' : 'fail',
|
|
59
|
+
detail: `Given a rendered dashboard surface, the export handle - drove two distinct format sets: runA=[${runA.formats.join(',')}] runB=[${runB.formats.join(',')}]; listbox follows input (${derived})`,
|
|
60
|
+
evidence: evidenceFromResponse({
|
|
61
|
+
route: '/',
|
|
62
|
+
response: runB.res,
|
|
63
|
+
bodyText: runB.body,
|
|
64
|
+
extraFields: {
|
|
65
|
+
input: { runA: shipped, runB: elicited },
|
|
66
|
+
derived: { runAFormats: runA.formats, runBFormats: runB.formats, followsInput: derived, hasButtonA: runA.hasBtn, hasButtonB: runB.hasBtn },
|
|
67
|
+
altBodyExcerpt: runA.body.slice(0, 240),
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
limitation: 'application-dashboard-AC-19106-1: control activation and Escape/focus-return are browser-only',
|
|
71
|
+
}));
|
|
72
|
+
} finally { await runB.close(); }
|
|
73
|
+
} finally { await runA.close(); }
|
|
74
|
+
return { results };
|
|
75
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// four-tile-states probe for application-dashboard v1.0.9.
|
|
2
|
+
//
|
|
3
|
+
// Verifies AC-19103-1: every tile state (loading, empty, error,
|
|
4
|
+
// populated) is rendered on each of two named tiles. The probe
|
|
5
|
+
// drives ?tile=primary&state=<state> AND ?tile=active-users&state=<state>
|
|
6
|
+
// so each state is observed on two tiles (the
|
|
7
|
+
// varied input is the state and tile id, the derived output is the
|
|
8
|
+
// state attribute and cue on the correct tile's region).
|
|
9
|
+
//
|
|
10
|
+
// anchorAcId: application-dashboard-AC-19103-1.
|
|
11
|
+
|
|
12
|
+
import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
|
|
13
|
+
|
|
14
|
+
export const anchorReqId = 'application-dashboard-REQ-003';
|
|
15
|
+
export const accountBound = false;
|
|
16
|
+
|
|
17
|
+
const STATES = ['loading', 'empty', 'error', 'populated'];
|
|
18
|
+
const TILES = ['primary', 'active-users'];
|
|
19
|
+
|
|
20
|
+
function assertTileState({ body, tileId, state }) {
|
|
21
|
+
const articleRe = new RegExp(`<article[^>]+data-tile-id="${tileId}"[^>]*>([\\s\\S]*?)<\/article>`);
|
|
22
|
+
const article = body.match(articleRe);
|
|
23
|
+
if (!article) return { present: false, reason: `no article for ${tileId}` };
|
|
24
|
+
const inner = article[1];
|
|
25
|
+
const wrapperRe = /<div[^>]+role="region"[^>]+aria-live="polite"[^>]+data-tile-state="([^"]+)"[^>]+aria-label="([^"]+)"[^>]*>/;
|
|
26
|
+
const wrap = inner.match(wrapperRe);
|
|
27
|
+
if (!wrap) return { present: false, reason: 'inner region missing role/aria-live/data-tile-state/aria-label' };
|
|
28
|
+
const cueRe = new RegExp(`data-state-cue="${state}"`);
|
|
29
|
+
const hasCue = cueRe.test(inner);
|
|
30
|
+
return {
|
|
31
|
+
present: true,
|
|
32
|
+
stateAttr: wrap[1],
|
|
33
|
+
accessibleName: wrap[2],
|
|
34
|
+
hasCue,
|
|
35
|
+
matches: wrap[1] === state,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default async function runProbe() {
|
|
40
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
|
|
41
|
+
const fixture = await startFixture({ startServer, port: 0 });
|
|
42
|
+
try {
|
|
43
|
+
const results = [];
|
|
44
|
+
for (const tileId of TILES) {
|
|
45
|
+
for (const state of STATES) {
|
|
46
|
+
const res = await fetch(`${fixture.baseUrl}/?tile=${tileId}&state=${state}`);
|
|
47
|
+
const body = await res.text();
|
|
48
|
+
const observation = assertTileState({ body, tileId, state });
|
|
49
|
+
const pass = res.status === 200
|
|
50
|
+
&& observation.present
|
|
51
|
+
&& observation.matches
|
|
52
|
+
&& observation.hasCue
|
|
53
|
+
&& typeof observation.accessibleName === 'string' && observation.accessibleName.includes(state);
|
|
54
|
+
results.push({
|
|
55
|
+
anchorAcId: 'application-dashboard-AC-19103-1',
|
|
56
|
+
anchorReqId: 'application-dashboard-REQ-003',
|
|
57
|
+
verdict: pass ? 'pass' : 'fail',
|
|
58
|
+
detail: `Given a rendered tile in each of the - tile=${tileId} at state="${state}" carries role="region" aria-live="polite" data-tile-state="${observation.stateAttr}" data-state-cue="${state}" accessibleName="${observation.accessibleName}"`,
|
|
59
|
+
evidence: evidenceFromResponse({
|
|
60
|
+
route: `/?tile=${tileId}&state=${state}`,
|
|
61
|
+
response: res,
|
|
62
|
+
bodyText: body,
|
|
63
|
+
extraFields: {
|
|
64
|
+
input: { tileId, state },
|
|
65
|
+
derived: observation,
|
|
66
|
+
},
|
|
67
|
+
}),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { results };
|
|
72
|
+
} finally {
|
|
73
|
+
await fixture.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// primary-kpi-top-left probe for application-dashboard v1.0.9.
|
|
2
|
+
//
|
|
3
|
+
// AC-19102-1 requires computed layout at 1440/1024/360 viewports;
|
|
4
|
+
// that observation is browser-only and recorded as notObservableHere
|
|
5
|
+
// per the browser-only rule. The server-observable half - primary tile
|
|
6
|
+
// first in DOM order, inline grid-column-start:1 AND grid-row-start:1,
|
|
7
|
+
// data-kpi-kind in the ADR-2001 enum - remains a real evidence row.
|
|
8
|
+
//
|
|
9
|
+
// anchorAcId: application-dashboard-AC-19102-1.
|
|
10
|
+
|
|
11
|
+
import { startFixture, evidenceFromResponse, conformanceOnlyResult } from './probe-utils.mjs';
|
|
12
|
+
|
|
13
|
+
export const anchorReqId = 'application-dashboard-REQ-002';
|
|
14
|
+
export const accountBound = false;
|
|
15
|
+
|
|
16
|
+
const KPI_ENUM = ['revenue', 'active-users', 'error-rate', 'throughput', 'custom'];
|
|
17
|
+
|
|
18
|
+
export default async function runProbe() {
|
|
19
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
|
|
20
|
+
const fixture = await startFixture({ startServer, port: 0 });
|
|
21
|
+
try {
|
|
22
|
+
const results = [];
|
|
23
|
+
|
|
24
|
+
const okRes = await fetch(`${fixture.baseUrl}/`);
|
|
25
|
+
const okBody = await okRes.text();
|
|
26
|
+
const tileRowMatch = okBody.match(/<section[^>]+data-region="tile-row"[^>]*>([\s\S]*?)<\/section>/);
|
|
27
|
+
const firstArticle = tileRowMatch ? tileRowMatch[1].match(/<article[^>]*>/) : null;
|
|
28
|
+
const firstAttrs = firstArticle ? firstArticle[0] : '';
|
|
29
|
+
const isPrimaryFirst = /data-tile-role="primary-kpi"/.test(firstAttrs);
|
|
30
|
+
const hasColumnStart = /grid-column-start:1/.test(firstAttrs);
|
|
31
|
+
const hasRowStart = /grid-row-start:1/.test(firstAttrs);
|
|
32
|
+
const kindMatch = firstAttrs.match(/data-kpi-kind="([^"]+)"/);
|
|
33
|
+
const kindValue = kindMatch ? kindMatch[1] : null;
|
|
34
|
+
const kindOk = kindValue !== null && KPI_ENUM.includes(kindValue);
|
|
35
|
+
const okPass = okRes.status === 200 && isPrimaryFirst && hasColumnStart && hasRowStart && kindOk;
|
|
36
|
+
|
|
37
|
+
results.push(conformanceOnlyResult({
|
|
38
|
+
anchorAcId: 'application-dashboard-AC-19102-1',
|
|
39
|
+
anchorReqId: 'application-dashboard-REQ-002',
|
|
40
|
+
verdict: okPass ? 'pass' : 'fail',
|
|
41
|
+
detail: `Given a rendered dashboard surface at each of - primary tile first in DOM order with inline grid-column-start:1, grid-row-start:1, data-kpi-kind="${kindValue}" (server-observable half of AC-19102-1)`,
|
|
42
|
+
evidence: evidenceFromResponse({
|
|
43
|
+
route: '/',
|
|
44
|
+
response: okRes,
|
|
45
|
+
bodyText: okBody,
|
|
46
|
+
extraFields: {
|
|
47
|
+
input: { adr2001Enum: KPI_ENUM },
|
|
48
|
+
derived: { firstArticleAttrs: firstAttrs.slice(0, 240), primaryFirst: isPrimaryFirst, colStart: hasColumnStart, rowStart: hasRowStart, kindValue },
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
limitation: 'application-dashboard-AC-19102-1: computed CSS layout at 1440/1024/360 viewports is browser-only',
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
return { results };
|
|
55
|
+
} finally {
|
|
56
|
+
await fixture.close();
|
|
57
|
+
}
|
|
58
|
+
}
|