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,177 @@
|
|
|
1
|
+
// Shared helpers for application-dashboard probes.
|
|
2
|
+
//
|
|
3
|
+
// The engine under probe is the sample-app fixture at
|
|
4
|
+
// packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js. The
|
|
5
|
+
// fixture stamps an x-fixture-request-id header on every response as
|
|
6
|
+
// part of its own request pipeline (no probe-side monkey-patch), so
|
|
7
|
+
// the identifier the probe records is the identifier the engine
|
|
8
|
+
// itself issued. Probes call the fixture over real HTTP via node's
|
|
9
|
+
// fetch, vary inputs, assert derived outputs, and record the
|
|
10
|
+
// request-id, status, body excerpt, the varied input and the derived
|
|
11
|
+
// output as evidence on every result row.
|
|
12
|
+
// No account-bound branch: the engine is a local fixture, not a
|
|
13
|
+
// third-party account, so no CI_HAS_* gate is invented. Every env
|
|
14
|
+
// var this pack reads is declared on the fixture README.
|
|
15
|
+
|
|
16
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
17
|
+
import { dirname, resolve } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
|
|
20
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
export const PROJECT_ROOT = resolve(HERE, '..', '..', '..', '..');
|
|
22
|
+
export const FIXTURE_DIR = resolve(PROJECT_ROOT, 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard');
|
|
23
|
+
export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/application-dashboard');
|
|
24
|
+
|
|
25
|
+
export const DEFAULT_PORT = 0;
|
|
26
|
+
|
|
27
|
+
export function aggregate(results) {
|
|
28
|
+
if (!Array.isArray(results) || results.length === 0) return 'fail';
|
|
29
|
+
if (results.some((r) => r.verdict === 'fail')) return 'fail';
|
|
30
|
+
if (results.some((r) => r.verdict === 'warn')) return 'warn';
|
|
31
|
+
return 'pass';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Empty results never pass: a synthesised row is emitted with an actionable detail and its
|
|
35
|
+
// own evidence object recording the empty condition so the row is
|
|
36
|
+
// not a naked verdict scalar.
|
|
37
|
+
export function normaliseResults(results) {
|
|
38
|
+
if (!Array.isArray(results) || results.length === 0) {
|
|
39
|
+
return [{
|
|
40
|
+
anchorReqId: 'unknown',
|
|
41
|
+
verdict: 'fail',
|
|
42
|
+
detail: 'no checks ran',
|
|
43
|
+
evidence: {
|
|
44
|
+
reason: 'empty-results',
|
|
45
|
+
route: 'n/a',
|
|
46
|
+
status: 0,
|
|
47
|
+
xFixtureRequestId: null,
|
|
48
|
+
bodyExcerpt: '',
|
|
49
|
+
},
|
|
50
|
+
}];
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function writeReport({ probeName, engine, results, extra }) {
|
|
56
|
+
await mkdir(REPORT_DIR, { recursive: true });
|
|
57
|
+
const report = {
|
|
58
|
+
slug: 'application-dashboard',
|
|
59
|
+
probeName,
|
|
60
|
+
runAt: new Date().toISOString(),
|
|
61
|
+
engine,
|
|
62
|
+
results,
|
|
63
|
+
aggregateVerdict: aggregate(results),
|
|
64
|
+
...(extra ?? {}),
|
|
65
|
+
};
|
|
66
|
+
const path = resolve(REPORT_DIR, `${probeName}.json`);
|
|
67
|
+
await writeFile(path, JSON.stringify(report, null, 2) + '\n', 'utf8');
|
|
68
|
+
return { report, path };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Starts the fixture on an ephemeral port (or PROBE_PORT when set)
|
|
72
|
+
// and returns { server, port, baseUrl, close }. The close helper
|
|
73
|
+
// rejects when the underlying close callback carries an error;
|
|
74
|
+
// swallowing a teardown error would hide a boundary failure.
|
|
75
|
+
export async function startFixture({ startServer, port } = {}) {
|
|
76
|
+
const resolvedPort = typeof port === 'number'
|
|
77
|
+
? port
|
|
78
|
+
: Number(process.env.PROBE_PORT ?? DEFAULT_PORT);
|
|
79
|
+
const started = await startServer({ port: resolvedPort });
|
|
80
|
+
return {
|
|
81
|
+
server: started.server,
|
|
82
|
+
port: started.port,
|
|
83
|
+
baseUrl: `http://127.0.0.1:${started.port}`,
|
|
84
|
+
close: () => new Promise((res, rej) => started.server.close((err) => {
|
|
85
|
+
if (err) rej(err);
|
|
86
|
+
else res();
|
|
87
|
+
})),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Reads a distinctive slice of a response body: the first N chars
|
|
92
|
+
// so the report carries a body excerpt alongside the header id.
|
|
93
|
+
export function bodyExcerpt(text, max = 240) {
|
|
94
|
+
if (text == null) return '';
|
|
95
|
+
const s = typeof text === 'string' ? text : String(text);
|
|
96
|
+
return s.length > max ? s.slice(0, max) + '...' : s;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Records the positive-evidence shape on a probe result. Every row
|
|
100
|
+
// carries route, status, the request id the fixture stamped, and a
|
|
101
|
+
// body excerpt; the caller may extend the object with the varied
|
|
102
|
+
// input and the derived output for that row.
|
|
103
|
+
export function evidenceFromResponse({ route, response, bodyText, extraFields }) {
|
|
104
|
+
return {
|
|
105
|
+
route,
|
|
106
|
+
status: response.status,
|
|
107
|
+
xFixtureRequestId: response.headers.get('x-fixture-request-id') || null,
|
|
108
|
+
bodyExcerpt: bodyExcerpt(bodyText),
|
|
109
|
+
...(extraFields ?? {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export async function runShim(probeName, engine, mainFn) {
|
|
114
|
+
try {
|
|
115
|
+
const outcome = (await mainFn()) ?? { results: [] };
|
|
116
|
+
const { results, extra } = outcome;
|
|
117
|
+
const { report, path } = await writeReport({ probeName, engine, results: normaliseResults(results), extra });
|
|
118
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
119
|
+
process.stdout.write(`report written to ${path}\n`);
|
|
120
|
+
if (report.aggregateVerdict !== 'pass') process.exitCode = 1;
|
|
121
|
+
} catch (err) {
|
|
122
|
+
const results = [{
|
|
123
|
+
anchorReqId: 'unknown',
|
|
124
|
+
verdict: 'fail',
|
|
125
|
+
detail: `probe threw: ${err && err.message ? err.message : String(err)}`,
|
|
126
|
+
evidence: {
|
|
127
|
+
reason: 'probe-threw',
|
|
128
|
+
route: 'n/a',
|
|
129
|
+
status: 0,
|
|
130
|
+
xFixtureRequestId: null,
|
|
131
|
+
bodyExcerpt: err && err.stack ? String(err.stack).slice(0, 240) : '',
|
|
132
|
+
},
|
|
133
|
+
}];
|
|
134
|
+
const { report, path } = await writeReport({ probeName, engine, results });
|
|
135
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
136
|
+
process.stderr.write(`probe error: ${err && err.stack ? err.stack : String(err)}\n`);
|
|
137
|
+
process.stderr.write(`report written to ${path}\n`);
|
|
138
|
+
process.exitCode = 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Browser-observable properties are AMBER on the shelf by ruling.
|
|
143
|
+
// A row that names such a property is recorded as notObservableHere
|
|
144
|
+
// carrying an object with the AC id and a reason; the tally script
|
|
145
|
+
// reads notObservableHere.ac to accept the row.
|
|
146
|
+
export function notObservableHereResult({ ac, anchorAcId, detail, reason, evidence } = {}) {
|
|
147
|
+
// A notObservableHere row anchors nothing else: no anchorAcId,
|
|
148
|
+
// no anchorReqId - only notObservableHere.ac.
|
|
149
|
+
const acId = ac || anchorAcId;
|
|
150
|
+
return {
|
|
151
|
+
verdict: 'pass',
|
|
152
|
+
notObservableHere: {
|
|
153
|
+
ac: acId,
|
|
154
|
+
reason: reason || 'not observable on server-side probe pack; needs a browser-driven runner',
|
|
155
|
+
},
|
|
156
|
+
detail: detail || 'not observable on server-side probe pack',
|
|
157
|
+
evidence: {
|
|
158
|
+
reason: reason || 'not observable here; needs a browser-driven probe runner',
|
|
159
|
+
...(evidence || {}),
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// A row that keeps a real observation but records that the
|
|
165
|
+
// observation only covers part of an AC uses conformanceOnly +
|
|
166
|
+
// limitation carrying the AC id and the property not observed.
|
|
167
|
+
export function conformanceOnlyResult({ anchorAcId, anchorReqId, verdict, detail, evidence, limitation }) {
|
|
168
|
+
return {
|
|
169
|
+
...(anchorAcId ? { anchorAcId } : {}),
|
|
170
|
+
...(anchorReqId ? { anchorReqId } : {}),
|
|
171
|
+
verdict: verdict || 'pass',
|
|
172
|
+
conformanceOnly: true,
|
|
173
|
+
limitation: limitation || 'browser-observable property not asserted from the server-side probe',
|
|
174
|
+
detail,
|
|
175
|
+
evidence,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './export-handle-formats.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
|
|
4
|
+
runShim('export-handle-formats', engine, runProbe);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './four-tile-states.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
|
|
4
|
+
runShim('four-tile-states', engine, runProbe);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './primary-kpi-top-left.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
|
|
4
|
+
runShim('primary-kpi-top-left', engine, runProbe);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import runProbe from './shell-five-regions.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
|
|
4
|
+
runShim('shell-five-regions', engine, runProbe);
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// shell-five-regions probe for application-dashboard v1.0.9.
|
|
2
|
+
//
|
|
3
|
+
// AC-19101-1: the DOM carries five labelled role="region" elements.
|
|
4
|
+
// The fixture accepts a startServer({ regions: [...] }) override, so
|
|
5
|
+
// the probe DRIVES two distinct region sets and asserts the
|
|
6
|
+
// rendered DOM follows each input (derived, not
|
|
7
|
+
// fixed inventory).
|
|
8
|
+
//
|
|
9
|
+
// anchorAcId: application-dashboard-AC-19101-1.
|
|
10
|
+
|
|
11
|
+
import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
|
|
12
|
+
|
|
13
|
+
const FULL_SET = ['tile-row', 'chart-region', 'filter-chrome', 'timeframe-picker', 'export-handle'];
|
|
14
|
+
const REDUCED_SET = ['tile-row', 'timeframe-picker', 'export-handle'];
|
|
15
|
+
|
|
16
|
+
function scrapeRegions(body) {
|
|
17
|
+
const sectionRe = /<section\b([^>]*)>/g;
|
|
18
|
+
const regions = [];
|
|
19
|
+
let match;
|
|
20
|
+
while ((match = sectionRe.exec(body)) !== null) {
|
|
21
|
+
const attrs = match[1];
|
|
22
|
+
if (!/role="region"/.test(attrs)) continue;
|
|
23
|
+
const labelMatch = attrs.match(/aria-label="([^"]+)"/);
|
|
24
|
+
const dataRegionMatch = attrs.match(/data-region="([^"]+)"/);
|
|
25
|
+
regions.push({
|
|
26
|
+
ariaLabel: labelMatch ? labelMatch[1] : null,
|
|
27
|
+
dataRegion: dataRegionMatch ? dataRegionMatch[1] : null,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return regions;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function driveOne(startServer, regionsInput, expected) {
|
|
34
|
+
const fixture = await new Promise((resolve, reject) => {
|
|
35
|
+
startServer({ port: 0, regions: regionsInput }).then((started) => {
|
|
36
|
+
resolve({ server: started.server, port: started.port, baseUrl: `http://127.0.0.1:${started.port}`, close: () => new Promise((r, rj) => started.server.close((e) => (e ? rj(e) : r()))) });
|
|
37
|
+
}).catch(reject);
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
const res = await fetch(`${fixture.baseUrl}/`);
|
|
41
|
+
const body = await res.text();
|
|
42
|
+
const regions = scrapeRegions(body);
|
|
43
|
+
const dataRegionsFound = regions.map((r) => r.dataRegion).filter(Boolean);
|
|
44
|
+
// Only count REAL known-content regions (skip shell-root wrapper if present).
|
|
45
|
+
const contentRegions = dataRegionsFound.filter((r) => r !== 'shell-root');
|
|
46
|
+
const matchesInput = contentRegions.length === expected.length
|
|
47
|
+
&& expected.every((r) => contentRegions.includes(r))
|
|
48
|
+
&& contentRegions.every((r) => expected.includes(r));
|
|
49
|
+
return { res, body, regions, dataRegionsFound, contentRegions, matchesInput, fixture };
|
|
50
|
+
} finally {
|
|
51
|
+
await fixture.close();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const anchorReqId = 'application-dashboard-REQ-001';
|
|
56
|
+
export const accountBound = false;
|
|
57
|
+
|
|
58
|
+
export default async function runProbe() {
|
|
59
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
|
|
60
|
+
|
|
61
|
+
const results = [];
|
|
62
|
+
const runFull = await driveOne(startServer, FULL_SET, FULL_SET);
|
|
63
|
+
const runReduced = await driveOne(startServer, REDUCED_SET, REDUCED_SET);
|
|
64
|
+
const derivedFromInput = runFull.matchesInput && runReduced.matchesInput
|
|
65
|
+
&& JSON.stringify(runFull.contentRegions) !== JSON.stringify(runReduced.contentRegions);
|
|
66
|
+
const labelsUniqueFull = new Set(runFull.regions.map((r) => r.ariaLabel).filter(Boolean)).size === runFull.regions.length;
|
|
67
|
+
const allLabelledFull = runFull.regions.every((r) => typeof r.ariaLabel === 'string' && r.ariaLabel.length > 0);
|
|
68
|
+
const pass = runFull.res.status === 200 && runReduced.res.status === 200
|
|
69
|
+
&& derivedFromInput && labelsUniqueFull && allLabelledFull && runFull.contentRegions.length === 5;
|
|
70
|
+
|
|
71
|
+
results.push({
|
|
72
|
+
anchorAcId: 'application-dashboard-AC-19101-1',
|
|
73
|
+
verdict: pass ? 'pass' : 'fail',
|
|
74
|
+
detail: `Given a rendered dashboard surface, the DOM carries - drove two distinct region sets: full=[${runFull.contentRegions.join(',')}] reduced=[${runReduced.contentRegions.join(',')}]; regions follow the input (${derivedFromInput}); five labels unique in the full run (${labelsUniqueFull})`,
|
|
75
|
+
evidence: evidenceFromResponse({
|
|
76
|
+
route: '/',
|
|
77
|
+
response: runFull.res,
|
|
78
|
+
bodyText: runFull.body,
|
|
79
|
+
extraFields: {
|
|
80
|
+
input: { runFull: FULL_SET, runReduced: REDUCED_SET },
|
|
81
|
+
derived: {
|
|
82
|
+
fullContentRegions: runFull.contentRegions,
|
|
83
|
+
reducedContentRegions: runReduced.contentRegions,
|
|
84
|
+
derivedFromInput,
|
|
85
|
+
fullLabelsUnique: labelsUniqueFull,
|
|
86
|
+
fullAllLabelled: allLabelledFull,
|
|
87
|
+
},
|
|
88
|
+
altBodyExcerpt: runReduced.body.slice(0, 240),
|
|
89
|
+
},
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
return { results };
|
|
93
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"reqId": "application-dashboard-REQ-002",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
4
|
"title": "The primary KPI tile sits top-left in DOM order and in CSS Grid position across the ratified breakpoints",
|
|
5
|
-
"description": "The tile row's primary KPI carries a top-left placement the reader reaches first, on the NN/g F-scan of the surface, at every
|
|
5
|
+
"description": "The tile row's primary KPI carries a top-left placement the reader reaches first, on the NN/g F-scan of the surface, at every shipped breakpoint (1440, 1024, 360). At 1440 and 1024 the primary KPI is the first tile in DOM order and its computed CSS Grid column-start is 1 and row-start is 1; at 360 the tile row reflows to one column and the primary KPI is the first tile in DOM order and its row-start is 1. The tile carries a `data-tile-role=\"primary-kpi\"` attribute and a `data-kpi-kind` attribute whose value is one of the ADR-2001 enum values (revenue, active-users, error-rate, throughput, custom). A dashboard that ships no primary KPI tile fails this REQ at project-side check; a dashboard whose primary KPI is not top-left at any of the three breakpoints fails the pack check AC-19102-1. When the elicited `primary-kpi-kind` is `custom` the tile also carries a `data-kpi-name` attribute whose value is the operator-elicited `primary-kpi-custom-name` short name.",
|
|
6
6
|
"category": "functional",
|
|
7
7
|
"domain": "application",
|
|
8
8
|
"priority": "must",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"reqId": "application-dashboard-REQ-003",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
4
|
"title": "Every tile honours a four-state contract with distinct visuals, role region, aria-live polite, and non-colour distinction",
|
|
5
|
-
"description": "Every tile on the shell renders one of four states at any moment: loading, empty, error, populated. Each state carries a distinct visual (a skeleton stripe or spinner for loading, a labelled empty-state block for empty, a labelled error block with the recorded reason for error, and the actual metric for populated). Each tile wraps its content in `role=\"region\"` with an `aria-live=\"polite\"` announcer that reads the state transition on change. The state distinction combines a visual cue and a text label (non-colour distinction, WCAG 1.4.1): the state's visual is not colour-only, and the state's accessible name reads `<tile title>, <state>` on entry. A tile that renders no visible state (a blank tile) fails REQ-003 at project-side
|
|
5
|
+
"description": "Every tile on the shell renders one of four states at any moment: loading, empty, error, populated. Each state carries a distinct visual (a skeleton stripe or spinner for loading, a labelled empty-state block for empty, a labelled error block with the recorded reason for error, and the actual metric for populated). Each tile wraps its content in `role=\"region\"` with an `aria-live=\"polite\"` announcer that reads the state transition on change. The state distinction combines a visual cue and a text label (non-colour distinction, WCAG 1.4.1): the state's visual is not colour-only, and the state's accessible name reads `<tile title>, <state>` on entry. A tile that renders no visible state (a blank tile) fails REQ-003 at project-side check; a tile that carries state-only through colour fails the pack check AC-19103-1.",
|
|
6
6
|
"category": "functional",
|
|
7
7
|
"domain": "application",
|
|
8
8
|
"priority": "must",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"purpose": "Owns the shell's timeframe picker and filter chrome, and the refetch fan-out contract: a preset change or a filter change issues one refetch per tile and one per rendered chart, every fetch carrying the same boundary and the same preset name, and once the batch has returned the shell updates one `data-as-of` attribute the tiles inherit. The fan-out contract is the substitutable interface the pack asserts on (AC-19104-1).",
|
|
9
9
|
"responsibilities": [
|
|
10
10
|
"Render the timeframe picker as an accessible list of presets (labelled `<button>` elements or a `<select>`) with a keyboard-reachable default from ADR-2002 (`last-7-days` unless elicited) (AC-19104-1).",
|
|
11
|
-
"Render filter chrome as labelled interactive elements (chips, dropdowns, text inputs) keyboard-reachable in reading order before the tile row; a hover-only control is refused at project-side
|
|
11
|
+
"Render filter chrome as labelled interactive elements (chips, dropdowns, text inputs) keyboard-reachable in reading order before the tile row; a hover-only control is refused at project-side check (AC-19105-1).",
|
|
12
12
|
"On a preset change or a filter change, issue one refetch per tile and one per rendered chart; every fetch carries the same `from` and `to` boundary, the same `preset` name and the same active-filters set (AC-19104-1, AC-19105-2).",
|
|
13
13
|
"Update one `data-as-of` attribute on the shell root once every fetch has returned (or the timeout has elapsed) and propagate the same value to every tile's `data-as-of` attribute (AC-19104-1).",
|
|
14
14
|
"Expose a request log on `window.__dashboardFetches` (an append-only array of `{ from, to, preset, filters, tileId, chartId, at }` records) so the pack can read every fetch after each preset change (AC-19104-1)."
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"description": "PNG-of-chart export generation delegates to the charts shell; the dashboard export handle carries no PNG generator of its own."
|
|
29
29
|
}
|
|
30
30
|
],
|
|
31
|
-
"tradeoffs": "The three shipped formats (CSV, PDF, PNG-of-chart) cover the common dashboard export cases; ADR-2003's elicited override handles SVG, XLSX and any operator-specific format. The delegation to the charts shell means a project that ships a bespoke chart engine outside the render shell needs a PNG output path of its own; the export handle names the residual under project-side
|
|
32
|
-
"notes": "Known mechanism-reach gap: the pack browser has no download-capture seam today, so AC-19106-2 (PNG delegation) is proven at project-side
|
|
31
|
+
"tradeoffs": "The three shipped formats (CSV, PDF, PNG-of-chart) cover the common dashboard export cases; ADR-2003's elicited override handles SVG, XLSX and any operator-specific format. The delegation to the charts shell means a project that ships a bespoke chart engine outside the render shell needs a PNG output path of its own; the export handle names the residual under project-side check.",
|
|
32
|
+
"notes": "Known mechanism-reach gap: the pack browser has no download-capture seam today, so AC-19106-2 (PNG delegation) is proven at project-side check, not through the shipped pack. The README names it individually.",
|
|
33
33
|
"createdAt": "2026-09-04T22:10:00Z",
|
|
34
34
|
"updatedAt": "2026-09-04T22:10:00Z"
|
|
35
35
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19101-2",
|
|
24
|
-
"description": "Given the shell's chart region, the rendered chart mounts through the application-charts render shell (TAC-1901): the chart region contains at least one `section.chartRegion[role=\"region\"]` element carrying the shape the application-charts pack asserts on (an `svg.chartSvg` and a paired `<table>` element in the same landmark). A chart region that renders a chart outside the render shell fails project-side
|
|
24
|
+
"description": "Given the shell's chart region, the rendered chart mounts through the application-charts render shell (TAC-1901): the chart region contains at least one `section.chartRegion[role=\"region\"]` element carrying the shape the application-charts pack asserts on (an `svg.chartSvg` and a paired `<table>` element in the same landmark). A chart region that renders a chart outside the render shell fails project-side check.",
|
|
25
25
|
"given": "the rendered chart region",
|
|
26
26
|
"when": "the mount seam is inspected",
|
|
27
27
|
"then": "the chart mounts through the application-charts render shell",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"id": "AC-19101-3",
|
|
34
|
-
"description": "Given a rendered dashboard surface, when a required region is omitted from the DOM (no export handle, no filter chrome, no timeframe picker), the surface either supersedes REQ-001 with a project-authored REQ documenting the omission (the pack looks up the sidecar `rcf/blueprints/application-dashboard.applied.json` for a `supersedes` entry) or renders the region as an empty labelled `role=\"region\"` element the pack can inspect; a silent omission fails project-side
|
|
34
|
+
"description": "Given a rendered dashboard surface, when a required region is omitted from the DOM (no export handle, no filter chrome, no timeframe picker), the surface either supersedes REQ-001 with a project-authored REQ documenting the omission (the pack looks up the sidecar `rcf/blueprints/application-dashboard.applied.json` for a `supersedes` entry) or renders the region as an empty labelled `role=\"region\"` element the pack can inspect; a silent omission fails project-side check.",
|
|
35
35
|
"given": "a rendered dashboard surface with a missing region and no documented supersedes entry",
|
|
36
36
|
"when": "the pack inspects the shell",
|
|
37
37
|
"then": "the surface fails the region-count check; the applying project must either supersede REQ-001 with a documented reason or render the region as an empty labelled role=region element",
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19102-2",
|
|
24
|
-
"description": "Given a rendered dashboard surface with no primary KPI tile, the surface either supersedes REQ-002 with a project-authored REQ documenting the omission or fails project-side
|
|
24
|
+
"description": "Given a rendered dashboard surface with no primary KPI tile, the surface either supersedes REQ-002 with a project-authored REQ documenting the omission or fails project-side check. This case is a documentation contract; the pack asserts the primary KPI tile exists (AC-19102-1) but does not itself enforce the fallback path.",
|
|
25
25
|
"given": "a rendered dashboard with no primary KPI tile",
|
|
26
26
|
"when": "the surface is reviewed",
|
|
27
|
-
"then": "the surface supersedes REQ-002 with a project-authored REQ or fails
|
|
27
|
+
"then": "the surface supersedes REQ-002 with a project-authored REQ or fails the check",
|
|
28
28
|
"testable": true,
|
|
29
29
|
"scope": "library",
|
|
30
30
|
"disposition": "fixed"
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19103-2",
|
|
24
|
-
"description": "Given a tile transitioning between states (loading to populated, populated to error) at runtime, the tile's `aria-live=\"polite\"` region announces the new state's accessible name to the assistive tech; the announcement text reads `<tile title>, <new state>` and the visual cue changes in the same paint. This AC is a runtime-observable behaviour on state transition; the pack does not simulate the transition today (the runner has no synthetic-event seam beyond click/type/press), so the AC is proven at project-side
|
|
24
|
+
"description": "Given a tile transitioning between states (loading to populated, populated to error) at runtime, the tile's `aria-live=\"polite\"` region announces the new state's accessible name to the assistive tech; the announcement text reads `<tile title>, <new state>` and the visual cue changes in the same paint. This AC is a runtime-observable behaviour on state transition; the pack does not simulate the transition today (the runner has no synthetic-event seam beyond click/type/press), so the AC is proven at project-side check and the README names the transition-observation gap under known mechanism-reach gaps.",
|
|
25
25
|
"given": "a tile transitioning between states",
|
|
26
26
|
"when": "the transition renders",
|
|
27
27
|
"then": "the aria-live polite region announces the new state's accessible name and the visual cue changes",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19104-2",
|
|
24
|
-
"description": "Given a rendered dashboard with an operator-elicited auto-refresh interval (ADR-2002), the shell refetches on the same fan-out contract at the interval: every tile refetches with the same from/to/preset, the as-of stamp updates on the shell root and every tile. When no auto-refresh interval is elicited, the shell does not refresh unattended (a dashboard that refreshes every ten seconds without an operator opt-in is a defect). The pack asserts the initial default is auto-refresh off through a `data-auto-refresh` attribute on the shell root; a fixture whose default is on fails project-side
|
|
24
|
+
"description": "Given a rendered dashboard with an operator-elicited auto-refresh interval (ADR-2002), the shell refetches on the same fan-out contract at the interval: every tile refetches with the same from/to/preset, the as-of stamp updates on the shell root and every tile. When no auto-refresh interval is elicited, the shell does not refresh unattended (a dashboard that refreshes every ten seconds without an operator opt-in is a defect). The pack asserts the initial default is auto-refresh off through a `data-auto-refresh` attribute on the shell root; a fixture whose default is on fails project-side check. Applying agent sets: the elicited auto-refresh interval value in seconds (ADR-2002) or the explicit off default, recorded on the manifest and reflected on the shell root as `data-auto-refresh`.",
|
|
25
25
|
"given": "a rendered dashboard with or without an elicited auto-refresh interval",
|
|
26
26
|
"when": "the shell renders",
|
|
27
27
|
"then": "auto-refresh is off unless the interval is elicited; refreshes follow the same fan-out contract",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"acceptanceCriteria": [
|
|
12
12
|
{
|
|
13
13
|
"id": "AC-19105-1",
|
|
14
|
-
"description": "Given a rendered dashboard surface with filter chrome, every filter control (chip, dropdown, search input) is a labelled interactive element (a `<button>`, a `<select>` or an `<input>`) with an accessible name; the controls are keyboard-reachable in reading order before the tile row; the operator's active filter selection is reflected on the shell as a `data-active-filters` attribute the pack can read. A filter chrome that ships hover-only controls (a hover-reveal menu on a mouseover element) fails project-side
|
|
14
|
+
"description": "Given a rendered dashboard surface with filter chrome, every filter control (chip, dropdown, search input) is a labelled interactive element (a `<button>`, a `<select>` or an `<input>`) with an accessible name; the controls are keyboard-reachable in reading order before the tile row; the operator's active filter selection is reflected on the shell as a `data-active-filters` attribute the pack can read. A filter chrome that ships hover-only controls (a hover-reveal menu on a mouseover element) fails project-side check.",
|
|
15
15
|
"given": "a rendered dashboard with filter chrome",
|
|
16
16
|
"when": "the accessibility tree is read",
|
|
17
17
|
"then": "every filter control is a labelled interactive element keyboard-reachable in reading order",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"acceptanceCriteria": [
|
|
12
12
|
{
|
|
13
13
|
"id": "AC-19106-1",
|
|
14
|
-
"description": "Given a rendered dashboard surface, the export handle region contains one labelled `<button>` (accessible name reads `Export` or an operator-configured equivalent) that on activation exposes a keyboard-reachable list of formats (a menu, a listbox or a set of `<button>` elements). The rendered format list carries at least the three shipped formats (CSV, PDF, PNG-of-chart) unless ADR-2003's elicited override replaces the set; every format entry carries a `data-export-format` attribute whose value is one of `csv`, `pdf`, `png-chart` or the elicited value. Escape closes the list and returns focus to the export button. Hover-only export dropdowns fail project-side
|
|
14
|
+
"description": "Given a rendered dashboard surface, the export handle region contains one labelled `<button>` (accessible name reads `Export` or an operator-configured equivalent) that on activation exposes a keyboard-reachable list of formats (a menu, a listbox or a set of `<button>` elements). The rendered format list carries at least the three shipped formats (CSV, PDF, PNG-of-chart) unless ADR-2003's elicited override replaces the set; every format entry carries a `data-export-format` attribute whose value is one of `csv`, `pdf`, `png-chart` or the elicited value. Escape closes the list and returns focus to the export button. Hover-only export dropdowns fail project-side check. Applying agent sets: the export-button accessible name (default `Export` or the operator-configured equivalent), the export-format list (default `csv`, `pdf`, `png-chart` or the ADR-2003 elicited override) and the `data-export-format` values the format entries carry.",
|
|
15
15
|
"given": "a rendered dashboard with an export handle",
|
|
16
16
|
"when": "the operator activates the export button",
|
|
17
17
|
"then": "an accessible format list opens with the shipped formats, keyboard-reachable, closable on Escape",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19106-2",
|
|
24
|
-
"description": "Given a PNG-of-chart export selection, the export handle delegates the PNG generation to the application-charts render shell (TAC-1901): the handle names the chart the operator picked from the chart region (a `data-chart-id` reference on the format entry, or a runtime prompt asking which chart) and the charts shell owns the PNG output. A dashboard shell that ships its own PNG generator inside the dashboard code fails project-side
|
|
24
|
+
"description": "Given a PNG-of-chart export selection, the export handle delegates the PNG generation to the application-charts render shell (TAC-1901): the handle names the chart the operator picked from the chart region (a `data-chart-id` reference on the format entry, or a runtime prompt asking which chart) and the charts shell owns the PNG output. A dashboard shell that ships its own PNG generator inside the dashboard code fails project-side check. This AC is a project-side contract; the pack does not exercise the PNG generation today (no download-capture seam on the pack browser), and the README names the delegation-observation gap under known mechanism-reach gaps. Applying agent sets: the chart-selection mechanism the export handle uses for PNG-of-chart (the `data-chart-id` reference on the format entry, or a runtime prompt naming the chart the operator picked) and the application-charts render-shell mount point the shell delegates to.",
|
|
25
25
|
"given": "a PNG-of-chart export selection",
|
|
26
26
|
"when": "the export handle activates",
|
|
27
27
|
"then": "PNG generation delegates to the application-charts render shell",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"acceptanceCriteria": [
|
|
12
12
|
{
|
|
13
13
|
"id": "AC-19107-1",
|
|
14
|
-
"description": "The blueprint ships an operator-and-agent-readable design-guidance file at `assets/guidance/dashboard-design.md` covering the eight sections named in spec 5.3.1 (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns). Each section names whether the rule hardens into an AC on this blueprint (the section names the AC id) or stays operator guidance the applying agent honours at project-side
|
|
14
|
+
"description": "The blueprint ships an operator-and-agent-readable design-guidance file at `assets/guidance/dashboard-design.md` covering the eight sections named in spec 5.3.1 (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns). Each section names whether the rule hardens into an AC on this blueprint (the section names the AC id) or stays operator guidance the applying agent honours at project-side check. The file cites at least five https:// sources from the five named source families (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs). The applying agent confirms the file is present on the applied blueprint source path recorded on `manifest.blueprints[].source` and takes no substitution at project apply time.",
|
|
15
15
|
"given": "the shipped blueprint",
|
|
16
16
|
"when": "the applying agent reads assets/guidance/dashboard-design.md",
|
|
17
17
|
"then": "the eight sections and the five https citations are present and each section names AC or guidance",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "AC-19107-2",
|
|
24
|
-
"description": "The dashboard shell's runtime shape reflects the rules the guidance hardens into ACs: the primary-kpi kind is one of the ADR-2001 enum values (asserted through `data-kpi-kind` on the primary tile; guidance section 1 hardens into AC-19102-1); the shell renders an `as of <ISO-8601>` stamp (guidance section 7 hardens into AC-19104-1); auto-refresh is off unless the elicited interval is set (guidance section 7 hardens into AC-19104-2). A shipped surface that violates any of these rules fails the corresponding pack check or project-side
|
|
24
|
+
"description": "The dashboard shell's runtime shape reflects the rules the guidance hardens into ACs: the primary-kpi kind is one of the ADR-2001 enum values (asserted through `data-kpi-kind` on the primary tile; guidance section 1 hardens into AC-19102-1); the shell renders an `as of <ISO-8601>` stamp (guidance section 7 hardens into AC-19104-1); auto-refresh is off unless the elicited interval is set (guidance section 7 hardens into AC-19104-2). A shipped surface that violates any of these rules fails the corresponding pack check or project-side check. Applying agent sets: the primary-kpi kind value from the ADR-2001 enum (`revenue`, `active-users`, `error-rate`, `throughput`, or `custom` with a `data-kpi-name`), the auto-refresh interval or the off default, and the tile-inventory slot mapping the shell renders.",
|
|
25
25
|
"given": "a rendered dashboard shell",
|
|
26
26
|
"when": "the shell is inspected against the guidance's hardened rules",
|
|
27
27
|
"then": "the shape honours the primary-kpi kind, the as-of stamp and the auto-refresh default",
|
|
@@ -63,10 +63,10 @@
|
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
"id": "AC-19107-5",
|
|
66
|
-
"description": "Given an applying project that ships a surface deviating from a
|
|
66
|
+
"description": "Given an applying project that ships a surface deviating from a shipped rule (a primary KPI placed top-right for cultural reasons, a tile density above the guidance cap), the deviation is documented on the project's own README under CALLS MADE with the guidance section quoted verbatim and the project's reason; a deviation without a documented CALLS MADE entry fails project-side check. Applying agent sets: the CALLS MADE entry text (the shipped guidance section quoted verbatim and the project's reason for deviating), the project's superseding REQ id, and the specific deviation named (for example the primary-kpi placement or the tile-density limit).",
|
|
67
67
|
"given": "an applying project surface deviating from a ratified guidance rule",
|
|
68
|
-
"when": "the
|
|
69
|
-
"then": "the deviation is documented with the guidance section quoted verbatim and the project's reason; an undocumented deviation fails
|
|
68
|
+
"when": "the check inspects the project's CALLS MADE section",
|
|
69
|
+
"then": "the deviation is documented with the guidance section quoted verbatim and the project's reason; an undocumented deviation fails the check",
|
|
70
70
|
"testable": true,
|
|
71
71
|
"scope": "unclassified",
|
|
72
72
|
"disposition": "template"
|
|
@@ -56,6 +56,6 @@ Every check carries a `description` field per spec section 9. `appliesTo` binds
|
|
|
56
56
|
|
|
57
57
|
## Consumers and dependencies
|
|
58
58
|
|
|
59
|
-
- Consumes `application-charts
|
|
60
|
-
- References `application-datatable`
|
|
59
|
+
- Consumes `application-charts`: the chart region on every dashboard surface mounts through the application-charts render shell (TAC-1901). The dashboard pack does not duplicate the chart-accessibility ACs; the charts pack fires on the dashboard's chart route through its own applicability predicate.
|
|
60
|
+
- References `application-datatable` in the packaged design guidance's section 6 ("when a table beats a chart"). A dashboard whose data really wants a records table applies the datatable blueprint instead of overloading the tile row.
|
|
61
61
|
- Extends the pack-browser seam with a `resize(width, height)` method; every blueprint after this one that ships a breakpoint-scoped visual AC reuses the seam.
|
|
@@ -37,7 +37,7 @@ Every dashboard surface renders the five labelled regions. The primary KPI tile
|
|
|
37
37
|
|
|
38
38
|
## Common gotchas
|
|
39
39
|
|
|
40
|
-
- The primary KPI is a fixed enum (five values plus `custom` with a name). A free-form `data-kpi-kind` is refused at project-side
|
|
40
|
+
- The primary KPI is a fixed enum (five values plus `custom` with a name). A free-form `data-kpi-kind` is refused at project-side check.
|
|
41
41
|
- The as-of stamp lives on the shell root and every tile carries the same value. A tile whose stamp drifts is a defect.
|
|
42
42
|
- Auto-refresh is off unless the operator opted in with an interval. A dashboard that refreshes every 30 seconds without an opt-in is a common accessibility and cost defect.
|
|
43
43
|
- The export handle carries no PNG generator of its own. PNG-of-chart delegates to the application-charts render shell; a project that ships a chart engine outside the render shell either supersedes the delegation or loses the PNG affordance.
|
|
@@ -45,4 +45,4 @@ Every dashboard surface renders the five labelled regions. The primary KPI tile
|
|
|
45
45
|
|
|
46
46
|
## Cost honesty
|
|
47
47
|
|
|
48
|
-
Shipping this blueprint costs the project a design pass on the tile inventory (which tile is the primary KPI, how many supporting tiles) and an operator conversation on the timeframe and export sets. It buys the accessibility contract on every tile, the fan-out contract on every timeframe change, the packaged design guidance the applying agent reads at apply, and the probe pack that refuses ship on a broken tile grid or a drifted fan-out. The
|
|
48
|
+
Shipping this blueprint costs the project a design pass on the tile inventory (which tile is the primary KPI, how many supporting tiles) and an operator conversation on the timeframe and export sets. It buys the accessibility contract on every tile, the fan-out contract on every timeframe change, the packaged design guidance the applying agent reads at apply, and the probe pack that refuses ship on a broken tile grid or a drifted fan-out. The probe pack runs green against the sample-app fixture and the applying project's own dashboard surface is reviewed against the packaged guidance's eight sections.
|
|
@@ -1,29 +1,39 @@
|
|
|
1
1
|
# application-datatable CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 1.0.9 - 2026-09-11
|
|
4
|
+
|
|
5
|
+
- Adds a contributions/probes pack meeting rule 7d.
|
|
6
|
+
- Probes: apg-table-shape, sort-adapter-round-trip, search-adapter-round-trip, four-states-regions.
|
|
7
|
+
- Arrow-key cell focus (AC-17107-5) is a browser-only property and is recorded as notObservableHere with the shipped AC id and reason; the row anchors nothing else.
|
|
8
|
+
- Sort/search adapters observe the server round trip; the DOM click / typing halves are conformanceOnly + limitation naming the AC id and the browser property.
|
|
9
|
+
- No-results uses a non-empty filter and checks the no-filter negative case.
|
|
10
|
+
- Anatomy test pin bumped to 1.0.9.
|
|
11
|
+
|
|
12
|
+
|
|
3
13
|
## 1.0.4 - 2026-09-10
|
|
4
14
|
|
|
5
|
-
|
|
15
|
+
Template-AC fill-in clauses on AC-17101-3, AC-17102-1, AC-17108-2, AC-17108-3, AC-17109-1 and AC-17109-3 now enumerate the specific applying-project substitutions (column-id set, query-adapter endpoint and debounce, elicited query-adapter mode, applied default page size, elicited selection-persistence value, accessible-copy text near the bulk-action control) in place of the earlier generic phrasing, so applying projects have precise values to fill in. TAC-1802 owns the `sort=<column>:<asc|desc>` grammar and the fixed `pageSize` query-parameter name; TAC-1803-application-datatable-selection-model patch-bumped to 1.0.2 with the `data-selection-persistence` marker on the bulk-action region added to responsibilities[3] and referenced from AC-17109-3. Datatable README and guide shipped prose neutralised: the dated visual-specification reference and the residual mechanism-reach gap parenthetical have been dropped from the README, and the dashboard-blueprint mention has been rewritten in the guide.
|
|
6
16
|
|
|
7
17
|
|
|
8
18
|
## 1.0.3 (register-sweep patch, 2026-09-10)
|
|
9
19
|
|
|
10
20
|
- Register: neutral wording in shipped prose (no capability change).
|
|
11
21
|
|
|
12
|
-
## 1.0.2 (
|
|
22
|
+
## 1.0.2 (2026-09-09)
|
|
13
23
|
|
|
14
24
|
- Adds top-level elicits[] block on blueprint.json declaring the four apply-time answers (query-adapter-mode, url-state-strategy, page-size, selection-persistence); each option value backed by a must REQ description with a runtime clause per section 7c. REQ-001 gains a page-size 25 default clause; REQ-002 gains url-query / session-scoped URL-state clause; REQ-004 gains per-page / cross-page selection-persistence clause. capabilities[] not declared: leaf blueprint (no consumer requiresAppliedCapabilities on the shelf references a datatable capability).
|
|
15
|
-
-
|
|
25
|
+
- Register-and-citation sweep 2026-09-10: vendorCitation added to eight fixed ACs whose assertions rest on W3C facts: AC-17104-3 (WCAG 2.4.3 focus-order), AC-17104-6 (ARIA APG dialog-modal pattern), AC-17105-2 (WCAG 1.4.1 use-of-color), AC-17106-4 (WCAG 2.5.7 dragging-movements), AC-17107-2 (WCAG 4.1.2 name-role-value), AC-17107-3 (WCAG 1.3.1 info-and-relationships), AC-17107-4 (ARIA APG table pattern), AC-17107-5 (ARIA APG grid pattern); each citation carries verifiedOn 2026-09-09.
|
|
16
26
|
- Adds refusal-path ACs to US-17104 (bulk-action max-cap refusal, dialog Cancel focus return, focus trap), US-17106 (drag-only refusal, hidden-column orphan cells, hidden column with active sort/filter), US-17107 (read-only role=grid refusal, role=grid arrow navigation, mixed-interactive shell pattern), US-17108 (session-scoped no-URL contract, invalid-URL rejection, history.replaceState per micro-change), US-17109 (dialog aria-describedby total count, filter narrows presentation not selection, Clear selection control). Every story now at the 7a floor (4-6 ACs per story, 46 ACs total on the blueprint).
|
|
17
27
|
|
|
18
|
-
## 1.0.1 (
|
|
28
|
+
## 1.0.1 (2026-09-09)
|
|
19
29
|
|
|
20
|
-
-
|
|
21
|
-
- Added AC-17101-4, AC-17102-4, AC-17103-4 and AC-17105-4 (loading indicator clears, announced error region replaces the pending state, last successful rows retained)
|
|
30
|
+
- Hardening cleanup: chain-consistency lint clean at baseline; added deliveredBy to every REQ, added ownerRef and disposition to every AC per section 7b.
|
|
31
|
+
- Added AC-17101-4, AC-17102-4, AC-17103-4 and AC-17105-4 (loading indicator clears, announced error region replaces the pending state, last successful rows retained) on TAC-1802.internalStructure for sort, filter, pagination and URL-state page requests that reject, so applying projects have explicit acceptance criteria for the four request-reject paths.
|
|
22
32
|
|
|
23
33
|
|
|
24
34
|
## 1.0.0 (2026-09-04)
|
|
25
35
|
|
|
26
|
-
-
|
|
36
|
+
- Initial shipped version of the shelf's datatable blueprint. Six REQs (table shell, sort semantics, filter chrome, selection and bulk actions, empty / loading / error / no-results states, column visibility / reorder / resize), nine USs binding 27 runtime-observable ACs, three TACs (shell, query adapter, selection model), four ADRs (pattern choice, URL state, page size, selection persistence). No new global topics.
|
|
27
37
|
- Ships `probe-packs/application-datatable.pack.mjs`: six browser-verify checks anchored to AC-17101-1, AC-17102-1, AC-17103-2, AC-17104-3, AC-17105-1, AC-17106-1. First blueprint on the shelf that ships a Playwright probe pack under the runner extension.
|
|
28
|
-
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-datatable/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the
|
|
29
|
-
- Suggests the `logging` and `errorHandling` companions with the
|
|
38
|
+
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-datatable/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the probe pack drives.
|
|
39
|
+
- Suggests the `logging` and `errorHandling` companions with the shipped spec's reasons.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Datatable blueprint (v1.0.4)
|
|
2
2
|
|
|
3
|
-
Vendor-neutral datatable contract for a rcf-lite application. Ships the ARIA APG table / grid pattern choice (per interactivity), the sort / filter / paginate discipline, the selection model with a bulk-action confirmation dialog, the four-state region contract (empty / loading / error / no-results), and a non-drag keyboard path for column visibility / reorder / resize. Ships a Playwright probe pack under `probe-packs/application-datatable.pack.mjs` whose six checks are the runtime gate the delivery-ci-workflows runner drives (section 5 of the
|
|
3
|
+
Vendor-neutral datatable contract for a rcf-lite application. Ships the ARIA APG table / grid pattern choice (per interactivity), the sort / filter / paginate discipline, the selection model with a bulk-action confirmation dialog, the four-state region contract (empty / loading / error / no-results), and a non-drag keyboard path for column visibility / reorder / resize. Ships a Playwright probe pack under `probe-packs/application-datatable.pack.mjs` whose six checks are the runtime gate the delivery-ci-workflows runner drives (section 5 of the visual specification). No new global topics; suggests the `logging` and `errorHandling` companions.
|
|
4
4
|
|
|
5
5
|
## Apply
|
|
6
6
|
|
|
@@ -34,7 +34,7 @@ The pack fires ONLY when its `appliesTo` returns true; a project whose FBS does
|
|
|
34
34
|
|
|
35
35
|
## Quality bar
|
|
36
36
|
|
|
37
|
-
Table or grid ARIA APG pattern per interactivity (ADR-1801); sortable columns keyboard-reachable with `aria-sort` announcing direction; text filter carrying `q` into the query adapter with per-column dropdowns composing deterministically; pagination controls with an `aria-live=\"polite\"` region reading `Page N of M`; selection model with per-row toggles and a page-level toggle; bulk actions opening a dialog under ARIA APG dialog-modal (`role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby`, `aria-describedby`, focus return to the originating row on close); four distinct states in `role=\"region\"` with `aria-live=\"polite\"`; non-colour distinction on every state (WCAG 1.4.1); URL-state serialisation of sort, filter and page as the recommended default (ADR-1802); default page size 25 elicitable at apply (ADR-1803); selection persistence elicited (ADR-1804); non-drag keyboard alternative for column visibility, reorder and resize (WCAG 2.5.7). Every bar is carried by ACs in the doc set
|
|
37
|
+
Table or grid ARIA APG pattern per interactivity (ADR-1801); sortable columns keyboard-reachable with `aria-sort` announcing direction; text filter carrying `q` into the query adapter with per-column dropdowns composing deterministically; pagination controls with an `aria-live=\"polite\"` region reading `Page N of M`; selection model with per-row toggles and a page-level toggle; bulk actions opening a dialog under ARIA APG dialog-modal (`role=\"dialog\"`, `aria-modal=\"true\"`, `aria-labelledby`, `aria-describedby`, focus return to the originating row on close); four distinct states in `role=\"region\"` with `aria-live=\"polite\"`; non-colour distinction on every state (WCAG 1.4.1); URL-state serialisation of sort, filter and page as the recommended default (ADR-1802); default page size 25 elicitable at apply (ADR-1803); selection persistence elicited (ADR-1804); non-drag keyboard alternative for column visibility, reorder and resize (WCAG 2.5.7). Every bar is carried by ACs in the doc set. Browser-observable bars are covered by the shipped Playwright pack. On the server-side probe pack: AC-17107-5 (arrow-key cell focus) is recorded as `notObservableHere`; AC-17107-1 is anchored positively on the returned grid/header markup; AC-17101-1 and AC-17102-1 are anchored on the server round trip and marked `conformanceOnly` with a limitation naming that the corresponding DOM interaction half is browser-only.
|
|
38
38
|
|
|
39
39
|
## Known mechanism-reach gaps
|
|
40
40
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "application-datatable",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"category": "application",
|
|
5
5
|
"suggestedCompanions": [
|
|
6
6
|
{
|
|
@@ -171,5 +171,6 @@
|
|
|
171
171
|
"elicited": true,
|
|
172
172
|
"standardsTraceClause": "generic enterprise practice"
|
|
173
173
|
}
|
|
174
|
-
]
|
|
174
|
+
],
|
|
175
|
+
"updatedAt": "2026-09-11T16:04:17Z"
|
|
175
176
|
}
|