rcf-lite 0.20.0 → 0.22.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 +39 -0
- package/blueprints/application-account-settings/CHANGELOG.md +12 -0
- package/blueprints/application-account-settings/README.md +114 -0
- package/blueprints/application-account-settings/blueprint.json +234 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +20 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +20 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2603-application-account-settings-theme-persistence.json +20 -0
- package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +20 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +18 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +18 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +41 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +28 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +35 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +40 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +34 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +33 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +33 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +27 -0
- package/blueprints/application-account-settings/docs/topics.md +48 -0
- package/blueprints/application-account-settings/guide/application-account-settings.md +30 -0
- package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +246 -0
- package/blueprints/application-admin-console/CHANGELOG.md +11 -0
- package/blueprints/application-admin-console/README.md +98 -0
- package/blueprints/application-admin-console/blueprint.json +226 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +25 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2202-application-admin-console-baseline-roles.json +25 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +20 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +20 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +18 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +40 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +44 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2203-application-admin-console-permission-matrix.json +34 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +40 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +28 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +33 -0
- package/blueprints/application-admin-console/docs/topics.md +42 -0
- package/blueprints/application-admin-console/guide/application-admin-console.md +29 -0
- package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +182 -0
- package/blueprints/application-api-rest/docs/topics.md +13 -1
- package/blueprints/application-charts/CHANGELOG.md +12 -0
- package/blueprints/application-charts/README.md +73 -0
- package/blueprints/application-charts/blueprint.json +26 -0
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +25 -0
- package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +25 -0
- package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.json +25 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +15 -0
- package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +42 -0
- package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +40 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +35 -0
- package/blueprints/application-charts/docs/topics.md +44 -0
- package/blueprints/application-charts/guide/application-charts.md +44 -0
- package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +191 -0
- package/blueprints/application-dashboard/CHANGELOG.md +10 -0
- package/blueprints/application-dashboard/README.md +102 -0
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +124 -0
- package/blueprints/application-dashboard/blueprint.json +29 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +25 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +25 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.json +25 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-001.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +15 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +47 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +41 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +35 -0
- package/blueprints/application-dashboard/docs/topics.md +50 -0
- package/blueprints/application-dashboard/guide/application-dashboard.md +48 -0
- package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +231 -0
- package/blueprints/application-datatable/CHANGELOG.md +8 -0
- package/blueprints/application-datatable/README.md +43 -0
- package/blueprints/application-datatable/blueprint.json +33 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +25 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +20 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +20 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +20 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-001.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +15 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +50 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +39 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +28 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +44 -0
- package/blueprints/application-datatable/docs/topics.md +42 -0
- package/blueprints/application-datatable/guide/application-datatable.md +38 -0
- package/blueprints/application-datatable/probe-packs/application-datatable.pack.mjs +240 -0
- package/blueprints/application-empty-error-states/CHANGELOG.md +9 -0
- package/blueprints/application-empty-error-states/README.md +88 -0
- package/blueprints/application-empty-error-states/blueprint.json +119 -0
- package/blueprints/application-empty-error-states/contributions/adrs/adr-2301-application-empty-error-states-status-contract.json +25 -0
- package/blueprints/application-empty-error-states/contributions/adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json +25 -0
- package/blueprints/application-empty-error-states/contributions/adrs/adr-2303-application-empty-error-states-offline-strategy.json +25 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +18 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +18 -0
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +46 -0
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +36 -0
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +40 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +29 -0
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +29 -0
- package/blueprints/application-empty-error-states/docs/topics.md +53 -0
- package/blueprints/application-empty-error-states/guide/application-empty-error-states.md +50 -0
- package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +284 -0
- package/blueprints/application-error-handling/docs/topics.md +12 -0
- package/blueprints/application-file-upload/CHANGELOG.md +9 -0
- package/blueprints/application-file-upload/README.md +85 -0
- package/blueprints/application-file-upload/blueprint.json +114 -0
- package/blueprints/application-file-upload/contributions/adrs/adr-2401-application-file-upload-transport.json +25 -0
- package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +25 -0
- package/blueprints/application-file-upload/contributions/adrs/adr-2403-application-file-upload-virus-scan.json +25 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +18 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +18 -0
- package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +46 -0
- package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +47 -0
- package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +46 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +29 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +29 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +28 -0
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +28 -0
- package/blueprints/application-file-upload/docs/topics.md +58 -0
- package/blueprints/application-file-upload/guide/application-file-upload.md +48 -0
- package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +238 -0
- package/blueprints/application-forms-wizard/CHANGELOG.md +9 -0
- package/blueprints/application-forms-wizard/README.md +102 -0
- package/blueprints/application-forms-wizard/blueprint.json +120 -0
- package/blueprints/application-forms-wizard/contributions/adrs/adr-2501-application-forms-wizard-navigation.json +25 -0
- package/blueprints/application-forms-wizard/contributions/adrs/adr-2502-application-forms-wizard-save-and-return.json +25 -0
- package/blueprints/application-forms-wizard/contributions/adrs/adr-2503-application-forms-wizard-step-indicator.json +25 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +18 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +18 -0
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +46 -0
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +40 -0
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +40 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +29 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +29 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +28 -0
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +29 -0
- package/blueprints/application-forms-wizard/docs/topics.md +49 -0
- package/blueprints/application-forms-wizard/guide/application-forms-wizard.md +48 -0
- package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +233 -0
- package/blueprints/application-notifications-in-app/CHANGELOG.md +9 -0
- package/blueprints/application-notifications-in-app/README.md +80 -0
- package/blueprints/application-notifications-in-app/blueprint.json +30 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2102-application-notifications-in-app-toast-timeout-floor.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2103-application-notifications-in-app-retention-window.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +46 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +52 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +40 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +26 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +26 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +26 -0
- package/blueprints/application-notifications-in-app/docs/topics.md +46 -0
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +47 -0
- package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +328 -0
- package/blueprints/application-onboarding-tour/CHANGELOG.md +12 -0
- package/blueprints/application-onboarding-tour/README.md +77 -0
- package/blueprints/application-onboarding-tour/blueprint.json +164 -0
- package/blueprints/application-onboarding-tour/contributions/adrs/adr-2701-application-onboarding-tour-dismissal-policy.json +20 -0
- package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +20 -0
- package/blueprints/application-onboarding-tour/contributions/adrs/adr-2703-application-onboarding-tour-checklist-anchor.json +20 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +18 -0
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +41 -0
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +35 -0
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +34 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +27 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +27 -0
- package/blueprints/application-onboarding-tour/docs/topics.md +48 -0
- package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +59 -0
- package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +231 -0
- package/blueprints/application-spa/docs/topics.md +13 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +13 -1
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +13 -1
- package/blueprints/email-smtp-resend/docs/topics.md +13 -1
- package/blueprints/object-storage-s3/CHANGELOG.md +13 -0
- package/blueprints/object-storage-s3/README.md +108 -0
- package/blueprints/object-storage-s3/blueprint.json +72 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2901-object-storage-s3-adapter.json +30 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2902-object-storage-s3-presigned-ttl-floor.json +25 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2903-object-storage-s3-multipart-threshold.json +25 -0
- package/blueprints/object-storage-s3/contributions/adrs/adr-2904-object-storage-s3-contract.json +25 -0
- package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +103 -0
- package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +43 -0
- package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +84 -0
- package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +101 -0
- package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +85 -0
- package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +84 -0
- package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +64 -0
- package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +10 -0
- package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +7 -0
- package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +4 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +18 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +18 -0
- package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +57 -0
- package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +36 -0
- package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +36 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +43 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +25 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +34 -0
- package/blueprints/object-storage-s3/docs/topics.md +62 -0
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +207 -0
- package/blueprints/observability-essentials/docs/topics.md +13 -1
- package/blueprints/observability-logging/CHANGELOG.md +9 -0
- package/blueprints/observability-logging/README.md +4 -1
- package/blueprints/observability-logging/blueprint.json +114 -21
- package/blueprints/observability-logging/docs/topics.md +12 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +13 -1
- package/blueprints/persistence-data-d1/docs/topics.md +13 -1
- package/blueprints/persistence-data-postgres/CHANGELOG.md +12 -0
- package/blueprints/persistence-data-postgres/README.md +101 -0
- package/blueprints/persistence-data-postgres/blueprint.json +80 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +30 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2802-persistence-data-postgres-migration-shape.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2803-persistence-data-postgres-runner-mode.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2804-persistence-data-postgres-recovery.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +56 -0
- package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +75 -0
- package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +56 -0
- package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +186 -0
- package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +76 -0
- package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +173 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-facade-round-trip.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-migration-apply.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-pool-posture-smoke.mjs +9 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-prepared-statement-scan.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-recovery-restore-round-trip.mjs +9 -0
- package/blueprints/persistence-data-postgres/contributions/probes/run-transaction-atomicity.mjs +10 -0
- package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +79 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +18 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +58 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +40 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +35 -0
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +40 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +34 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +25 -0
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +25 -0
- package/blueprints/persistence-data-postgres/docs/topics.md +64 -0
- package/blueprints/persistence-data-postgres/guide/persistence-data-postgres.md +172 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +13 -1
- package/blueprints/security-auth-clerk/CHANGELOG.md +9 -0
- package/blueprints/security-auth-clerk/README.md +3 -0
- package/blueprints/security-auth-clerk/blueprint.json +147 -29
- package/blueprints/security-auth-clerk/docs/topics.md +13 -1
- package/blueprints/security-auth-keycloak/CHANGELOG.md +9 -0
- package/blueprints/security-auth-keycloak/README.md +3 -0
- package/blueprints/security-auth-keycloak/blueprint.json +182 -36
- package/blueprints/security-auth-keycloak/docs/topics.md +13 -1
- package/blueprints/security-auth-magic-link/CHANGELOG.md +9 -0
- package/blueprints/security-auth-magic-link/README.md +3 -0
- package/blueprints/security-auth-magic-link/blueprint.json +159 -32
- package/blueprints/security-auth-magic-link/docs/topics.md +13 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +9 -0
- package/blueprints/security-auth-oauth2/README.md +3 -0
- package/blueprints/security-auth-oauth2/blueprint.json +158 -31
- package/blueprints/security-auth-oauth2/docs/topics.md +13 -1
- package/blueprints/security-secrets-management/CHANGELOG.md +11 -0
- package/blueprints/security-secrets-management/blueprint.json +2 -1
- package/blueprints/security-secrets-management/docs/topics.md +13 -1
- package/fixtures/canary-manifest.json +9 -9
- package/package.json +2 -2
- package/rcf/code-nodes/cn-106.json +13 -0
- package/rcf/code-nodes/cn-107.json +14 -0
- package/rcf/code-nodes/cn-108.json +13 -0
- package/rcf/code-nodes/cn-109.json +12 -0
- package/rcf/code-nodes/cn-110.json +12 -0
- package/rcf/code-nodes/cn-111.json +14 -0
- package/rcf/code-nodes/cn-112.json +14 -0
- package/rcf/code-nodes/cn-113.json +12 -0
- package/rcf/code-nodes/cn-114.json +13 -0
- package/rcf/code-nodes/cn-115.json +13 -0
- package/rcf/code-nodes/cn-116.json +12 -0
- package/rcf/code-nodes/cn-117.json +13 -0
- package/rcf/code-nodes/cn-118.json +13 -0
- package/rcf/code-nodes/cn-119.json +13 -0
- package/rcf/code-nodes/cn-120.json +13 -0
- package/rcf/code-nodes/cn-121.json +12 -0
- package/rcf/code-nodes/cn-122.json +12 -0
- package/rcf/code-nodes/cn-123.json +13 -0
- package/rcf/code-nodes/cn-124.json +13 -0
- package/rcf/code-nodes/cn-125.json +13 -0
- package/rcf/code-nodes/cn-126.json +13 -0
- package/rcf/code-nodes/cn-127.json +12 -0
- package/rcf/code-nodes/cn-128.json +14 -0
- package/rcf/code-nodes/cn-129.json +14 -0
- package/rcf/code-nodes/cn-130.json +14 -0
- package/rcf/code-nodes/cn-131.json +15 -0
- package/rcf/code-nodes/cn-132.json +12 -0
- package/rcf/code-nodes/cn-133.json +13 -0
- package/rcf/code-nodes/cn-134.json +13 -0
- package/rcf/code-nodes/cn-135.json +12 -0
- package/rcf/code-nodes/cn-136.json +13 -0
- package/rcf/code-nodes/cn-137.json +13 -0
- package/rcf/code-nodes/cn-138.json +12 -0
- package/rcf/code-nodes/cn-139.json +12 -0
- package/rcf/code-nodes/cn-140.json +13 -0
- package/rcf/code-nodes/cn-141.json +13 -0
- package/rcf/code-nodes/cn-142.json +12 -0
- package/rcf/code-nodes/cn-143.json +13 -0
- package/rcf/code-nodes/cn-144.json +13 -0
- package/rcf/code-nodes/cn-145.json +12 -0
- package/rcf/code-nodes/cn-146.json +12 -0
- package/rcf/code-nodes/cn-147.json +13 -0
- package/rcf/code-nodes/cn-148.json +13 -0
- package/rcf/code-nodes/cn-149.json +12 -0
- package/rcf/code-nodes/cn-150.json +13 -0
- package/rcf/code-nodes/cn-151.json +13 -0
- package/rcf/code-nodes/cn-152.json +12 -0
- package/rcf/code-nodes/cn-153.json +12 -0
- package/rcf/code-nodes/cn-154.json +13 -0
- package/rcf/code-nodes/cn-155.json +14 -0
- package/rcf/code-nodes/cn-156.json +13 -0
- package/rcf/code-nodes/cn-157.json +13 -0
- package/rcf/code-nodes/cn-158.json +12 -0
- package/rcf/code-nodes/cn-159.json +13 -0
- package/rcf/code-nodes/cn-160.json +12 -0
- package/rcf/code-nodes/cn-161.json +12 -0
- package/rcf/code-nodes/cn-162.json +13 -0
- package/rcf/code-nodes/cn-163.json +12 -0
- package/rcf/code-nodes/cn-164.json +13 -0
- package/rcf/code-nodes/cn-165.json +12 -0
- package/rcf/code-nodes/cn-166.json +12 -0
- package/rcf/code-nodes/cn-167.json +12 -0
- package/rcf/code-nodes/cn-168.json +12 -0
- package/rcf/code-nodes/cn-169.json +12 -0
- package/rcf/code-nodes/cn-170.json +12 -0
- package/rcf/code-nodes/cn-171.json +12 -0
- package/rcf/code-nodes/cn-172.json +12 -0
- package/rcf/code-nodes/cn-173.json +12 -0
- package/rcf/code-nodes/cn-174.json +12 -0
- package/rcf/code-nodes/cn-175.json +13 -0
- package/rcf/code-nodes/cn-176.json +12 -0
- package/rcf/code-nodes/cn-177.json +12 -0
- package/rcf/code-nodes/cn-178.json +12 -0
- package/rcf/code-nodes/cn-179.json +12 -0
- package/rcf/code-nodes/cn-180.json +13 -0
- package/rcf/code-nodes/cn-181.json +12 -0
- package/rcf/code-nodes/cn-182.json +13 -0
- package/rcf/code-nodes/cn-183.json +12 -0
- package/rcf/code-nodes/cn-184.json +13 -0
- package/rcf/code-nodes/cn-185.json +12 -0
- package/rcf/code-nodes/cn-186.json +12 -0
- package/rcf/code-nodes/cn-200.json +14 -0
- package/rcf/code-nodes/cn-201.json +13 -0
- package/rcf/code-nodes/cn-202.json +14 -0
- package/rcf/code-nodes/cn-203.json +14 -0
- package/rcf/code-nodes/cn-204.json +13 -0
- package/rcf/code-nodes/cn-205.json +14 -0
- package/rcf/fbs/fbs-036.json +22 -0
- package/rcf/fbs/fbs-037.json +19 -0
- package/rcf/fbs/fbs-038.json +19 -0
- package/rcf/fbs/fbs-039.json +21 -0
- package/rcf/fbs/fbs-040.json +20 -0
- package/rcf/fbs/fbs-041.json +13 -0
- package/rcf/fbs/fbs-042.json +13 -0
- package/rcf/fbs/fbs-043.json +23 -0
- package/rcf/fbs/fbs-044.json +23 -0
- package/rcf/fbs/fbs-045.json +23 -0
- package/rcf/fbs/fbs-046.json +24 -0
- package/rcf/fbs/fbs-047.json +24 -0
- package/rcf/fbs/fbs-060.json +22 -0
- package/rcf/fbs/fbs-061.json +20 -0
- package/rcf/requirements/req-017.json +18 -0
- package/rcf/requirements/req-018.json +18 -0
- package/rcf/requirements/req-019.json +38 -0
- package/rcf/requirements/req-020.json +13 -0
- package/rcf/requirements/req-021.json +13 -0
- package/rcf/requirements/req-022.json +13 -0
- package/rcf/requirements/req-023.json +14 -0
- package/rcf/requirements/req-024.json +69 -0
- package/rcf/requirements/req-025.json +59 -0
- package/rcf/requirements/req-026.json +154 -0
- package/rcf/requirements/req-027.json +33 -0
- package/rcf/requirements/req-028.json +13 -0
- package/rcf/requirements/req-040.json +13 -0
- package/rcf/requirements/req-041.json +125 -0
- package/rcf/test-suites/ts-046.json +78 -0
- package/rcf/test-suites/ts-047.json +54 -0
- package/rcf/test-suites/ts-048.json +54 -0
- package/rcf/test-suites/ts-049.json +70 -0
- package/rcf/test-suites/ts-050.json +69 -0
- package/rcf/test-suites/ts-051.json +22 -0
- package/rcf/test-suites/ts-052.json +20 -0
- package/rcf/test-suites/ts-053.json +70 -0
- package/rcf/test-suites/ts-054.json +70 -0
- package/rcf/test-suites/ts-055.json +77 -0
- package/rcf/test-suites/ts-056.json +78 -0
- package/rcf/test-suites/ts-057.json +78 -0
- package/rcf/test-suites/ts-070.json +62 -0
- package/rcf/test-suites/ts-071.json +62 -0
- package/rcf/user-stories/us-1701.json +56 -0
- package/rcf/user-stories/us-1801.json +40 -0
- package/rcf/user-stories/us-1901.json +40 -0
- package/rcf/user-stories/us-2001.json +50 -0
- package/rcf/user-stories/us-2101.json +45 -0
- package/rcf/user-stories/us-2201.json +60 -0
- package/rcf/user-stories/us-2301.json +51 -0
- package/rcf/user-stories/us-2401.json +62 -0
- package/rcf/user-stories/us-2501.json +58 -0
- package/rcf/user-stories/us-2601.json +51 -0
- package/rcf/user-stories/us-2701.json +55 -0
- package/rcf/user-stories/us-2801.json +55 -0
- package/rcf/user-stories/us-4001.json +69 -0
- package/rcf/user-stories/us-4101.json +69 -0
- package/releases/releases.yaml +21 -1
- package/src/blueprint/apply.js +107 -1
- package/src/blueprint/capabilities.js +357 -0
- package/src/blueprint/loader.js +247 -0
- package/src/browser-verify/boot.js +180 -0
- package/src/browser-verify/index.js +13 -0
- package/src/browser-verify/manifest-writer.js +31 -6
- package/src/browser-verify/pack-browser.js +294 -0
- package/src/browser-verify/pack-loader.js +176 -0
- package/src/browser-verify/pack-runner.js +193 -0
- package/src/browser-verify/pack-schema.js +155 -0
- package/src/browser-verify/runner.js +24 -1
- package/src/cli/blueprint.js +99 -0
- package/src/cli/browser-verify.js +147 -7
- package/src/core/errors/index.js +7 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-forms-wizard-US-24107",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-forms-wizard-REQ-005",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The in-progress forms list surfaces every wizard the operator has started but not yet submitted with a resume link back to the task-list",
|
|
8
|
+
"asA": "operator returning to the application with more than one wizard on the go",
|
|
9
|
+
"iWant": "an index surface listing every wizard I have started but not submitted, each with the wizard title, the step I was on and a resume link",
|
|
10
|
+
"soThat": "I can walk back into the one I meant to finish without hunting through the navigation",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-24107-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given at least one draft persisted per REQ-005, /in-progress renders [data-surface=\"in-progress-list\"] with one [data-wizard-row] per draft carrying the wizard title, the step slug the operator was on and a [data-recovery=\"resume\"] link whose href routes back to the wizard's task-list surface. The row count matches the number of drafts held in the draft store."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2503-application-forms-wizard-draft-store"
|
|
21
|
+
],
|
|
22
|
+
"tags": [
|
|
23
|
+
"blueprint:application-forms-wizard",
|
|
24
|
+
"case:in-progress-list"
|
|
25
|
+
],
|
|
26
|
+
"createdAt": "2026-09-06T18:00:00Z",
|
|
27
|
+
"updatedAt": "2026-09-06T18:00:00Z"
|
|
28
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-forms-wizard-US-24108",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-forms-wizard-REQ-005",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "When no drafts are held the in-progress list surface delegates to the application-empty-error-states empty-list state and offers a create-affordance back to a fresh wizard",
|
|
8
|
+
"asA": "operator returning to the application with no wizards in flight",
|
|
9
|
+
"iWant": "the in-progress list to render the empty-list surface from the empty-and-error-states sibling with a control that starts a fresh wizard",
|
|
10
|
+
"soThat": "the empty case reads consistently with every other empty listing in the application and I have one obvious next action",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-24108-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given zero drafts in the draft store, /in-progress renders [data-surface=\"empty-list\"] (the empty-list wrapper contributed by application-empty-error-states) with a [data-recovery=\"create\"] control whose href routes to the first step of a fresh wizard. The pack asserts the wrapper and the control are present on the honest render and refuses when either is missing."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2503-application-forms-wizard-draft-store"
|
|
21
|
+
],
|
|
22
|
+
"tags": [
|
|
23
|
+
"blueprint:application-forms-wizard",
|
|
24
|
+
"case:no-in-progress-forms-empty-state",
|
|
25
|
+
"consumes:application-empty-error-states"
|
|
26
|
+
],
|
|
27
|
+
"createdAt": "2026-09-06T18:00:00Z",
|
|
28
|
+
"updatedAt": "2026-09-06T18:00:00Z"
|
|
29
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# application-forms-wizard: coordination vocabulary
|
|
2
|
+
|
|
3
|
+
## Global topics
|
|
4
|
+
|
|
5
|
+
The blueprint claims no new global topics at v1.0.0. Every ADR (navigation posture, save-and-return transport, step-indicator shape) is non-global.
|
|
6
|
+
|
|
7
|
+
## Deliberately unclaimed topics
|
|
8
|
+
|
|
9
|
+
- `formsEngine` (the validation and field-component engine). Reserved for `application-spa` which owns the engine via TAC-205; this blueprint reads the engine through TAC-2502 and adds the wizard-shell contract on top.
|
|
10
|
+
- `draftSyncEngine` (a shared sync engine across UI and persistence blueprints). Reserved for a future `application-draft-sync` v1.0.0 if three or more consumer blueprints start elicitizing the same cross-tab or server-side sync shape.
|
|
11
|
+
- `emptyStateWrapper` (the DOM shape of the empty-list wrapper). Reserved for `application-empty-error-states` which owns it via TAC-2301; this blueprint delegates the no-in-progress empty case to the sibling and does not re-claim the wrapper.
|
|
12
|
+
|
|
13
|
+
## Shelf id band and suffix block
|
|
14
|
+
|
|
15
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
16
|
+
|---|---|---|---|---|
|
|
17
|
+
| application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
|
|
18
|
+
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
19
|
+
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
20
|
+
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
21
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
|
|
22
|
+
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
23
|
+
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
24
|
+
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
25
|
+
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
26
|
+
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
27
|
+
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
28
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorage` |
|
|
29
|
+
|
|
30
|
+
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
31
|
+
|
|
32
|
+
## Composition with application-spa
|
|
33
|
+
|
|
34
|
+
`application-spa` REQ-006 ships the forms-engine (TAC-205) and the field-component library. Applying this blueprint alongside `application-spa` composes cleanly: SPA holds the engine and the field components; this blueprint holds the wizard shell, the task-list, the error-summary contract, the summary review and the save-and-return draft store. No `scope: "global"` ADR conflict.
|
|
35
|
+
|
|
36
|
+
## Composition with application-empty-error-states
|
|
37
|
+
|
|
38
|
+
The `no-in-progress-forms` case on the /in-progress list surface delegates to the sibling's `empty-list` state (`[data-surface="empty-list"]` with a `[data-recovery="create"]` control). Per the sibling's `docs/topics.md`: SPA holds the tab-title convention, the component contracts and the state-visual tokens; this sibling holds the state list, the recovery-action router and the runtime enforcement pack. This blueprint's TAC-2503 reads that state on the zero-drafts branch and does not re-claim the wrapper.
|
|
39
|
+
|
|
40
|
+
## Probe pack
|
|
41
|
+
|
|
42
|
+
`probe-packs/application-forms-wizard.pack.mjs` ships four surface-observable checks anchored to blueprint AC ids, one per core contract:
|
|
43
|
+
|
|
44
|
+
- `AC-24101-1` task-list (per-step state from {Cannot start yet, Not started, In progress, Completed}, ARIA progressbar wrapper, ordered step enumeration)
|
|
45
|
+
- `AC-24103-1` error-summary (top-of-page summary, skip links per failed field, aria-invalid on the field, aria-describedby to the field-level error message, focus to summary heading)
|
|
46
|
+
- `AC-24104-1` summary-review (summary-list rows per step, Change link per row, answer retention across an edit-and-save round-trip)
|
|
47
|
+
- `AC-24105-1` save-and-return (server-draft-table transport POST/GET round-trip, client-local-buffer transport localStorage write with a sync tick)
|
|
48
|
+
|
|
49
|
+
The pack applies to any FBS binding `TAC-2501-application-forms-wizard-task-list` or whose navModel routes name an operator-configured wizard-route path (matching `/(task-list|step|summary|in-progress|wizard)`). See `packages/rcf-lite/docs/blueprint-authoring.md` section 8c for the pack authoring rules.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# application-forms-wizard: operator guide
|
|
2
|
+
|
|
3
|
+
## When to reach for it
|
|
4
|
+
|
|
5
|
+
Your project ships a workflow whose completion spans two or more surfaces the operator moves between with save points in between: a signup or onboarding flow, a checkout, an account setup, a compliance-heavy submission, an application review. You want the GOV.UK-vocabulary task-list up front (Cannot start yet, Not started, In progress, Completed) so the operator sees where they are at a glance, the per-step validation timing on-blur then on-change so the messages behave predictably, the top-of-page error summary with skip links so a screen-reader user hears the failures in order, the summary review with row-level change and answer retention so the operator can revise before submit, and the save-and-return draft store so a closed tab or a lost network does not force them to start again.
|
|
6
|
+
|
|
7
|
+
## The four contracts
|
|
8
|
+
|
|
9
|
+
- **Task-list contract (REQ-001).** Every step is enumerated with a state from the closed vocabulary. The ARIA progressbar wrapper carries the completion count.
|
|
10
|
+
- **Validation timing (REQ-002).** On-blur before first submit, on-change after first failure, full pass on submit. Delegates to the SPA blueprint's forms-engine TAC-205.
|
|
11
|
+
- **Error-summary contract (REQ-003).** Top-of-page summary, skip links per failed field, aria-invalid on the field, focus to summary heading on submit failure.
|
|
12
|
+
- **Summary-review contract (REQ-004).** Summary-list rows per step, Change link per row, answer retention on save.
|
|
13
|
+
- **Save-and-return contract (REQ-005).** Server-side draft table or client-side local buffer with a per-write sync tick. The pack refuses to ship if neither is wired.
|
|
14
|
+
|
|
15
|
+
## When NOT to reach for it
|
|
16
|
+
|
|
17
|
+
Your workflow is a single-page form the operator fills in one go with no cross-step dependencies. A wizard shell adds mechanism without payoff; a single-step submit with the same forms-engine and the same error-summary reads better.
|
|
18
|
+
|
|
19
|
+
Your workflow is a linear questionnaire where every step is optional and the operator can jump anywhere at any time. Consider the free-navigation branch (ADR-2501) or an alternative surface that does not enumerate completion states.
|
|
20
|
+
|
|
21
|
+
Your workflow ships without any draft store because every submission is single-session (a payment authorisation with a strict short expiry, say). The blueprint refuses to apply without a transport; either wire one or pick a different surface.
|
|
22
|
+
|
|
23
|
+
## What stays your call
|
|
24
|
+
|
|
25
|
+
- The step manifest (elicited at apply time). The blueprint ships an example three-step manifest on the fixture; your project supplies its own.
|
|
26
|
+
- The step-indicator shape (task-list, ARIA progressbar-only, breadcrumb; ADR-2503).
|
|
27
|
+
- The linear-vs-free navigation posture (ADR-2501). The default is linear.
|
|
28
|
+
- The save-and-return transport (server-draft-table, client-local-buffer; ADR-2502). No default is committed.
|
|
29
|
+
- The visual design of each surface. The blueprint contributes WHAT surfaces under WHAT condition; the palette, spacing and typography are your design system's call.
|
|
30
|
+
- The per-field validation rules (which fields are required, format constraints). The blueprint contributes the timing rule and the summary shape; the field-level rules are your project's call, wired through the SPA forms-engine.
|
|
31
|
+
|
|
32
|
+
## What a good outcome looks like
|
|
33
|
+
|
|
34
|
+
The pack fires on every FBS whose surface renders a wizard task-list or a wizard step, and every check returns `pass` on the honest render and `fail` on the corresponding break switch. Your operator walks the task-list, sees the completion states in order, blur-triggers validation without being interrupted mid-typing, and on submit failure lands on the error summary with the failed fields in order. On summary review the operator revises one answer without losing the rest and submits with confidence. On network loss or a closed tab the draft persists and the operator picks up where they left off.
|
|
35
|
+
|
|
36
|
+
## Mechanism-reach gaps
|
|
37
|
+
|
|
38
|
+
The blueprint README lists the runtime-observable ACs the pack does NOT bind directly. Every gap is a candidate for a v1.1.0 minor bump extending the pack. Combine with `application-spa` to inherit the forms-engine and the field-component library, and with `application-empty-error-states` for the no-in-progress empty case.
|
|
39
|
+
|
|
40
|
+
## Promotion signals
|
|
41
|
+
|
|
42
|
+
- A wizard state past the four closed strings recurs across three or more consumer wizards (a Skipped or Locked state, say). Candidate: a v1.1.0 minor bump extending REQ-001's state enum.
|
|
43
|
+
- The save-and-return contract wants a shared sync engine across a persistence blueprint and this UI blueprint. Candidate: a dedicated `application-draft-sync` blueprint absorbing the transport.
|
|
44
|
+
- The step-indicator enum wants a per-step count element outside the task-list. Candidate: a v1.1.0 minor bump extending ADR-2503's shape enum.
|
|
45
|
+
|
|
46
|
+
## Costs to be honest about
|
|
47
|
+
|
|
48
|
+
A three-step wizard is a couple of days of project-side wiring per framework even after adopting the TACs. The pack is Playwright-first, so a project without a running dev server at gate time cannot fire it. The save-and-return contract's server branch needs a persistence adapter; the local branch needs a serialisation shape agreed with the forms-engine and a per-project namespacing rule for shared devices.
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// application-forms-wizard probe pack (v1.0.0).
|
|
2
|
+
//
|
|
3
|
+
// Four surface-observable checks, one per core contract, anchored
|
|
4
|
+
// to the blueprint's contributed AC ids:
|
|
5
|
+
// AC-24101-1 task-list (per-step state from the GOV.UK vocabulary,
|
|
6
|
+
// ARIA progressbar wrapper)
|
|
7
|
+
// AC-24103-1 error-summary (top-of-page summary, skip links,
|
|
8
|
+
// aria-invalid on the field, focus to summary heading)
|
|
9
|
+
// AC-24104-1 summary-review (summary-list rows, Change links,
|
|
10
|
+
// answer retention across an edit-and-save round-trip)
|
|
11
|
+
// AC-24105-1 save-and-return (server-draft POST/GET round-trip on
|
|
12
|
+
// ?draft-store=server, localStorage write plus sync tick
|
|
13
|
+
// on ?draft-store=local; the ?draft-store=none branch
|
|
14
|
+
// proves the missing-transport refusal on the fixture)
|
|
15
|
+
//
|
|
16
|
+
// Every check drives the real Playwright browser the T-0 runner
|
|
17
|
+
// injects. URLs are composed by the withUrl(runtimeUrl, path)
|
|
18
|
+
// helper per the round 3 T-3 fix train; no bare string
|
|
19
|
+
// concatenation.
|
|
20
|
+
//
|
|
21
|
+
// Sample-app fixture:
|
|
22
|
+
// packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/
|
|
23
|
+
// Fixture ships four routes (/task-list, /step/<n>, /summary,
|
|
24
|
+
// /in-progress) plus query switches (?draft-store=server|local|none,
|
|
25
|
+
// ?nav=linear|free, ?step=<n>) and break switches
|
|
26
|
+
// (?break=task-list-vocab, ?break=no-summary, ?break=no-retain,
|
|
27
|
+
// ?break=no-draft) so the negative runs can be driven from a
|
|
28
|
+
// single boot.
|
|
29
|
+
|
|
30
|
+
function withUrl(runtimeUrl, path) {
|
|
31
|
+
return new URL(path, runtimeUrl).toString();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// GOV.UK task-list vocabulary (closed enum, v1.0.0). A fifth state
|
|
35
|
+
// is a v1.1.0 minor bump.
|
|
36
|
+
const TASK_LIST_STATES = ['Cannot start yet', 'Not started', 'In progress', 'Completed'];
|
|
37
|
+
|
|
38
|
+
export default {
|
|
39
|
+
packName: 'application-forms-wizard',
|
|
40
|
+
version: '1.0.0',
|
|
41
|
+
blueprintSlug: 'application-forms-wizard',
|
|
42
|
+
// Applies to any FBS that realises the task-list TAC or whose
|
|
43
|
+
// navModel routes name an operator-configured wizard path.
|
|
44
|
+
// References BOTH tacIds AND route per the loader source-scan
|
|
45
|
+
// rule (T-0 AC-1701-3, cross-check with authoring standard 8c).
|
|
46
|
+
appliesTo: ({ fbs }) => {
|
|
47
|
+
const routes = fbs?.designStage?.navModel?.routes ?? [];
|
|
48
|
+
const tacIds = fbs?.contextRequirements?.tacIds ?? [];
|
|
49
|
+
if (tacIds.includes('TAC-2501-application-forms-wizard-task-list')) return true;
|
|
50
|
+
return routes.some((r) => typeof r?.path === 'string' && /\/(?:task-list|step|summary|in-progress|wizard)(\/|$|\?)/.test(r.path));
|
|
51
|
+
},
|
|
52
|
+
boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
|
|
53
|
+
checks: [
|
|
54
|
+
{
|
|
55
|
+
id: 'AC-24101-1',
|
|
56
|
+
severity: 'block',
|
|
57
|
+
description: 'task-list surface renders every step with a data-step-state from the closed GOV.UK vocabulary {Cannot start yet, Not started, In progress, Completed}, wraps them in an ARIA progressbar with aria-valuenow, aria-valuemax and aria-valuetext, and enumerates the step slugs in the manifest order (per WCAG 2.2 SC 2.4.6 Headings and Labels).',
|
|
58
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
59
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
60
|
+
await browser.goto(withUrl(runtimeUrl, '/task-list'));
|
|
61
|
+
const dom = await browser.evaluate(() => {
|
|
62
|
+
const region = document.querySelector('[data-surface="task-list"]');
|
|
63
|
+
if (!region) return { present: false };
|
|
64
|
+
const progressbar = region.querySelector('[role="progressbar"]');
|
|
65
|
+
const rows = Array.from(region.querySelectorAll('[data-step-slug]'));
|
|
66
|
+
return {
|
|
67
|
+
present: true,
|
|
68
|
+
hasProgressbar: !!progressbar,
|
|
69
|
+
valueNow: progressbar ? progressbar.getAttribute('aria-valuenow') : null,
|
|
70
|
+
valueMax: progressbar ? progressbar.getAttribute('aria-valuemax') : null,
|
|
71
|
+
valueText: progressbar ? progressbar.getAttribute('aria-valuetext') : null,
|
|
72
|
+
rows: rows.map((r) => ({ slug: r.getAttribute('data-step-slug'), state: r.getAttribute('data-step-state') })),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
if (!dom.present) return { verdict: 'fail', detail: 'task-list region [data-surface="task-list"] not found' };
|
|
76
|
+
if (!dom.hasProgressbar) return { verdict: 'fail', detail: 'task-list region missing [role="progressbar"] wrapper' };
|
|
77
|
+
if (!dom.valueNow || !dom.valueMax || !dom.valueText) {
|
|
78
|
+
return { verdict: 'fail', detail: `progressbar missing aria attributes: valuenow=${JSON.stringify(dom.valueNow)} valuemax=${JSON.stringify(dom.valueMax)} valuetext=${JSON.stringify(dom.valueText)}` };
|
|
79
|
+
}
|
|
80
|
+
if (dom.rows.length < 2) return { verdict: 'fail', detail: `task-list rows must number at least 2; got ${dom.rows.length}` };
|
|
81
|
+
const closedStates = ['Cannot start yet', 'Not started', 'In progress', 'Completed'];
|
|
82
|
+
const badRow = dom.rows.find((r) => !r.slug || !closedStates.includes(r.state));
|
|
83
|
+
if (badRow) return { verdict: 'fail', detail: `task-list row outside the closed GOV.UK vocabulary: ${JSON.stringify(badRow)}` };
|
|
84
|
+
return { verdict: 'pass', detail: `rows=${dom.rows.length} progressbar=${JSON.stringify({ now: dom.valueNow, max: dom.valueMax, text: dom.valueText })}` };
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: 'AC-24103-1',
|
|
89
|
+
severity: 'block',
|
|
90
|
+
description: 'On submit refusal the step renders [data-surface="error-summary"] with a heading, one anchor per failed field whose href points at the field id, every failed field carries aria-invalid="true" and aria-describedby referencing its per-field error message, and focus lands on the summary heading (per WCAG 2.2 SC 3.3.1 Error Identification and SC 3.3.3 Error Suggestion).',
|
|
91
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
92
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
93
|
+
// The fixture step 2 route pre-renders the error summary shape
|
|
94
|
+
// on ?refused=1 so the pack can read the DOM without driving
|
|
95
|
+
// the submit click through the browser transport.
|
|
96
|
+
await browser.goto(withUrl(runtimeUrl, '/step/2?refused=1'));
|
|
97
|
+
const dom = await browser.evaluate(() => {
|
|
98
|
+
const region = document.querySelector('[data-surface="error-summary"]');
|
|
99
|
+
if (!region) return { present: false };
|
|
100
|
+
const heading = region.querySelector('h2, [role="heading"]');
|
|
101
|
+
const anchors = Array.from(region.querySelectorAll('a[href^="#"]'));
|
|
102
|
+
const anchorHrefs = anchors.map((a) => a.getAttribute('href'));
|
|
103
|
+
const invalidFields = Array.from(document.querySelectorAll('[aria-invalid="true"]'));
|
|
104
|
+
const describedFields = invalidFields.map((f) => ({
|
|
105
|
+
id: f.id,
|
|
106
|
+
describedBy: f.getAttribute('aria-describedby'),
|
|
107
|
+
messagePresent: f.getAttribute('aria-describedby')
|
|
108
|
+
? !!document.getElementById(f.getAttribute('aria-describedby'))
|
|
109
|
+
: false,
|
|
110
|
+
}));
|
|
111
|
+
const activeSelector = document.activeElement
|
|
112
|
+
? [document.activeElement.tagName.toLowerCase(), document.activeElement.getAttribute('data-role') || document.activeElement.id || ''].filter(Boolean).join('#')
|
|
113
|
+
: null;
|
|
114
|
+
return {
|
|
115
|
+
present: true,
|
|
116
|
+
headingText: heading ? heading.textContent.trim() : null,
|
|
117
|
+
anchorHrefs,
|
|
118
|
+
invalidFields: describedFields,
|
|
119
|
+
activeSelector,
|
|
120
|
+
activeIsHeading: !!(document.activeElement && heading && document.activeElement === heading),
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
if (!dom.present) return { verdict: 'fail', detail: 'error-summary region [data-surface="error-summary"] not found' };
|
|
124
|
+
if (!dom.headingText) return { verdict: 'fail', detail: 'error-summary region missing heading' };
|
|
125
|
+
if (dom.anchorHrefs.length < 1) return { verdict: 'fail', detail: 'error-summary region carries no skip links' };
|
|
126
|
+
if (dom.invalidFields.length < 1) return { verdict: 'fail', detail: 'no fields carry aria-invalid="true" on submit refusal' };
|
|
127
|
+
const unbound = dom.invalidFields.find((f) => !f.describedBy || !f.messagePresent);
|
|
128
|
+
if (unbound) return { verdict: 'fail', detail: `field ${JSON.stringify(unbound.id)} missing aria-describedby or its message: ${JSON.stringify(unbound)}` };
|
|
129
|
+
if (!dom.activeIsHeading) return { verdict: 'fail', detail: `focus did not land on the summary heading; activeSelector=${JSON.stringify(dom.activeSelector)}` };
|
|
130
|
+
return { verdict: 'pass', detail: `anchors=${dom.anchorHrefs.length} invalidFields=${dom.invalidFields.length} heading=${JSON.stringify(dom.headingText)}` };
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: 'AC-24104-1',
|
|
135
|
+
severity: 'block',
|
|
136
|
+
description: 'summary-review surface renders one [data-summary-list-section] per step with a <dl> holding [data-summary-row] entries, every row exposes a [data-recovery="change"] link, and after following one Change link and saving a new value the other rows retain their original values verbatim (per WCAG 2.2 SC 3.3.4 Error Prevention).',
|
|
137
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
138
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
139
|
+
// The fixture seeds three steps of answers on ?seed=complete
|
|
140
|
+
// so /summary renders fully populated for the pack.
|
|
141
|
+
await browser.goto(withUrl(runtimeUrl, '/summary?seed=complete'));
|
|
142
|
+
const before = await browser.evaluate(() => {
|
|
143
|
+
const region = document.querySelector('[data-surface="summary-review"]');
|
|
144
|
+
if (!region) return { present: false };
|
|
145
|
+
const sections = Array.from(region.querySelectorAll('[data-summary-list-section]'));
|
|
146
|
+
const rows = Array.from(region.querySelectorAll('[data-summary-row]'));
|
|
147
|
+
const rowSnapshot = rows.map((r) => {
|
|
148
|
+
const dt = r.querySelector('dt');
|
|
149
|
+
const dd = r.querySelector('dd');
|
|
150
|
+
const change = r.querySelector('[data-recovery="change"]');
|
|
151
|
+
return {
|
|
152
|
+
label: dt ? dt.textContent.trim() : null,
|
|
153
|
+
value: dd ? dd.textContent.trim() : null,
|
|
154
|
+
hasChange: !!change,
|
|
155
|
+
slug: r.getAttribute('data-field-slug') || null,
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
return { present: true, sectionCount: sections.length, rows: rowSnapshot };
|
|
159
|
+
});
|
|
160
|
+
if (!before.present) return { verdict: 'fail', detail: 'summary-review region [data-surface="summary-review"] not found' };
|
|
161
|
+
if (before.sectionCount < 1) return { verdict: 'fail', detail: 'summary-review carries zero [data-summary-list-section] blocks' };
|
|
162
|
+
if (before.rows.length < 1) return { verdict: 'fail', detail: 'summary-review carries zero [data-summary-row] entries' };
|
|
163
|
+
const rowMissingChange = before.rows.find((r) => !r.hasChange);
|
|
164
|
+
if (rowMissingChange) return { verdict: 'fail', detail: `summary-review row missing [data-recovery="change"] link: ${JSON.stringify(rowMissingChange)}` };
|
|
165
|
+
// Drive the edit-and-save round-trip via the fixture's
|
|
166
|
+
// synthetic ?edit=<slug>&value=<new> query on /summary so the
|
|
167
|
+
// browser transport does not require a full form submit path.
|
|
168
|
+
const editTarget = before.rows[0];
|
|
169
|
+
if (!editTarget.slug) return { verdict: 'fail', detail: 'first summary row is missing [data-field-slug]; the fixture must expose the slug for the round-trip' };
|
|
170
|
+
const newValue = `edited-value-${Date.now()}`;
|
|
171
|
+
await browser.goto(withUrl(runtimeUrl, `/summary?seed=complete&edit=${encodeURIComponent(editTarget.slug)}&value=${encodeURIComponent(newValue)}`));
|
|
172
|
+
const after = await browser.evaluate(() => {
|
|
173
|
+
const region = document.querySelector('[data-surface="summary-review"]');
|
|
174
|
+
const rows = Array.from(region.querySelectorAll('[data-summary-row]'));
|
|
175
|
+
return rows.map((r) => {
|
|
176
|
+
const dd = r.querySelector('dd');
|
|
177
|
+
return {
|
|
178
|
+
slug: r.getAttribute('data-field-slug') || null,
|
|
179
|
+
value: dd ? dd.textContent.trim() : null,
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
const editedAfter = after.find((r) => r.slug === editTarget.slug);
|
|
184
|
+
if (!editedAfter || editedAfter.value !== newValue) {
|
|
185
|
+
return { verdict: 'fail', detail: `edited row did not update to the new value; expected ${JSON.stringify(newValue)}, got ${JSON.stringify(editedAfter && editedAfter.value)}` };
|
|
186
|
+
}
|
|
187
|
+
const drifted = before.rows.filter((r) => r.slug && r.slug !== editTarget.slug).find((r) => {
|
|
188
|
+
const afterRow = after.find((a) => a.slug === r.slug);
|
|
189
|
+
return !afterRow || afterRow.value !== r.value;
|
|
190
|
+
});
|
|
191
|
+
if (drifted) return { verdict: 'fail', detail: `an unedited row changed value across the edit-and-save round-trip: ${JSON.stringify(drifted)}` };
|
|
192
|
+
return { verdict: 'pass', detail: `sections=${before.sectionCount} rows=${before.rows.length} editedSlug=${JSON.stringify(editTarget.slug)}` };
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: 'AC-24105-1',
|
|
197
|
+
severity: 'block',
|
|
198
|
+
description: 'save-and-return contract ships either the server-side draft table (?draft-store=server issues POST /drafts on advance and GET /drafts returns the persisted answer) or the client-side local buffer (?draft-store=local writes to window.localStorage and renders [data-sync-tick] carrying an ISO-8601 timestamp on every write). The ?draft-store=none branch refuses at severity block (per WCAG 2.2 SC 3.3.7 Redundant Entry).',
|
|
199
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
200
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
201
|
+
// The fixture pre-drives the write on /step/1 boot so the
|
|
202
|
+
// pack can inspect the persisted state without simulating a
|
|
203
|
+
// form submit through the browser transport.
|
|
204
|
+
await browser.goto(withUrl(runtimeUrl, '/step/1?draft-store=server&preseed=1'));
|
|
205
|
+
const server = await browser.evaluate(async () => {
|
|
206
|
+
const res = await fetch('/drafts');
|
|
207
|
+
const body = res.ok ? await res.json() : null;
|
|
208
|
+
return { status: res.status, body };
|
|
209
|
+
});
|
|
210
|
+
if (server.status !== 200 || !server.body || typeof server.body !== 'object') {
|
|
211
|
+
return { verdict: 'fail', detail: `server-draft GET /drafts did not return a JSON body: status=${server.status} body=${JSON.stringify(server.body)}` };
|
|
212
|
+
}
|
|
213
|
+
const persistedFields = server.body.fields;
|
|
214
|
+
if (!persistedFields || Object.keys(persistedFields).length < 1) {
|
|
215
|
+
return { verdict: 'fail', detail: `server-draft body carries no persisted fields: ${JSON.stringify(server.body)}` };
|
|
216
|
+
}
|
|
217
|
+
await browser.goto(withUrl(runtimeUrl, '/step/1?draft-store=local&preseed=1'));
|
|
218
|
+
const local = await browser.evaluate(() => {
|
|
219
|
+
const keys = Object.keys(window.localStorage).filter((k) => k.startsWith('draft:application-forms-wizard:'));
|
|
220
|
+
const tick = document.querySelector('[data-sync-tick]');
|
|
221
|
+
return { keys, tickText: tick ? tick.getAttribute('data-sync-tick') || tick.textContent.trim() : null };
|
|
222
|
+
});
|
|
223
|
+
if (local.keys.length < 1) {
|
|
224
|
+
return { verdict: 'fail', detail: `client-local localStorage did not carry a namespaced draft key: keys=${JSON.stringify(local.keys)}` };
|
|
225
|
+
}
|
|
226
|
+
if (!local.tickText || !/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(local.tickText)) {
|
|
227
|
+
return { verdict: 'fail', detail: `client-local [data-sync-tick] missing or not ISO-8601: ${JSON.stringify(local.tickText)}` };
|
|
228
|
+
}
|
|
229
|
+
return { verdict: 'pass', detail: `serverPersistedFields=${JSON.stringify(Object.keys(persistedFields))} localKeys=${local.keys.length} tick=${JSON.stringify(local.tickText)}` };
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
],
|
|
233
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# application-notifications-in-app CHANGELOG
|
|
2
|
+
|
|
3
|
+
## 1.0.0 (visual round T-4, spec 2026-09-04)
|
|
4
|
+
|
|
5
|
+
- First ratified version of the shelf's application-notifications-in-app blueprint. Five REQs (live-region preseeding on every declared route; transient toast contract with priority-to-role mapping, one-shot announcement and timeout floor; notification centre inbox with retention and acknowledge round-trip; per-user preferences UI with category silence and sibling delegation; delivery-attempt log with operator-readable rows), eight USs binding runtime-observable ACs plus three cross-cutting cases (page load with backlog, background event, disjoint-content contract), three TACs (live-region wrappers with the toast factory; centre inbox with retention and acknowledge round-trip; preferences UI with sibling delegation), three ADRs (priority-to-role mapping polite/status vs assertive/alert per WCAG 4.1.3 and the ARIA APG alert pattern; six-second toast timeout floor per WCAG 2.2.1 with elicited overrides above the floor; thirty-day centre retention window with elicited overrides). No new global topics.
|
|
6
|
+
- Reserves the `application-notifications-` family prefix for the sibling channel blueprints the shelf will grow into (`-email`, `-push`, `-webhook`) as a doc-only reservation on the blueprint README and every applying blueprint's `docs/topics.md` shelf band registry per Baz decision 2026-09-04 ("we might support more types of notifications - be clear in the name what these ones are").
|
|
7
|
+
- Ships `probe-packs/application-notifications-in-app.pack.mjs`: three browser-verify checks anchored to blueprint AC ids, every check carrying a description field per spec section 9. `AC-20101-1` live-region preseeded on every declared route (wrappers present AND empty at load, enumerated by `[data-live-region]`). `AC-20102-1` transient toast contract with priority-to-role mapping and timeout measured against the ADR-2102 six-second floor via `data-shown-at`/`data-dismissed-at` timestamps (no six-second sleep in the pack; bounded polling). `AC-20103-1` centre acknowledge round-trip enumerated by `data-notification-id` (per-element attribute per T-3 gate discipline), reconciled through both `window.__notificationFetches` and the server-side request log. Fourth blueprint on the shelf that ships a Playwright probe pack under the T-0 runner extension.
|
|
8
|
+
- Ships a sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-notifications-in-app/` (dependency-free Node HTTP server) so the pack can be probed at the shelf's own gate; the fixture is the golden the gate reviewer drives, with `?break=preseed`, `?break=role`, `?break=timeout` and `?break=ack` query switches for the negative runs. Three routes (`/`, `/notifications-centre`, `/notifications-preferences`); every route preseeds both live-region wrappers.
|
|
9
|
+
- Suggests the `logging` and `errorHandling` companions with the ratified spec's reasons. `providesRoles` absent, leaf blueprint per the loader contract (an empty array is refused, an omitted field marks the blueprint as a leaf).
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Notifications in-app blueprint (v1.0.0)
|
|
2
|
+
|
|
3
|
+
Vendor-neutral in-app-notifications contract for a rcf-lite application. Ships the live-region preseeding discipline (polite and assertive wrappers present in the DOM before any notification fires per the WAI-ARIA 1.2 normative reference), the transient toast contract with priority-to-role mapping (info to polite/status, error to assertive/alert per WCAG 4.1.3 and the ARIA APG alert pattern), the WCAG 2.2.1 six-second toast timeout floor with operator-elicited overrides above the floor, the notification centre inbox with a thirty-day retention window and a per-item acknowledge round-trip enumerated by `data-notification-id`, the per-user preferences UI with category silence and sibling-channel digest delegation, and the delivery-attempt log write path. Ships a Playwright probe pack under `probe-packs/application-notifications-in-app.pack.mjs` whose three checks are the runtime gate the delivery-ci-workflows runner drives (visual round spec 2026-09-04, section 5.4). No new global topics; suggests the `logging` and `errorHandling` companions. Fourth blueprint on the shelf that ships a Playwright probe pack under the T-0 runner extension.
|
|
4
|
+
|
|
5
|
+
## Apply
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
rcf define blueprint add <path-to>/blueprints/application-notifications-in-app
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Applies namespaced contributions into the project tree and records `manifest.blueprints[]`. Consumes the `logging` and `errorHandling` companions when they resolve to an applied provider or a registered library; falls back to the shelf providers otherwise.
|
|
12
|
+
|
|
13
|
+
## Anatomy
|
|
14
|
+
|
|
15
|
+
| Piece | Where | What |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, `suggestedCompanions: [{ logging }, { errorHandling }]`, `providesRoles` absent (leaf blueprint), 19 contributions in the 20xxx US band and 21xx ADR/TAC block |
|
|
18
|
+
| Doc set | `contributions/` | 5 REQs, 8 USs, 3 TACs, 3 ADRs, schema-valid and namespaced |
|
|
19
|
+
| Probe pack | `probe-packs/application-notifications-in-app.pack.mjs` | Three browser-verify checks anchored to blueprint AC ids: `AC-20101-1` live-region preseeding on every declared route (wrappers present AND empty at load); `AC-20102-1` transient toast contract with priority-to-role mapping and timeout measured against the ADR-2102 floor via `data-shown-at`/`data-dismissed-at`; `AC-20103-1` centre acknowledge round-trip enumerated by `data-notification-id` |
|
|
20
|
+
| Guide | `guide/application-notifications-in-app.md` | Operator-facing: when to reach, when not, mechanism-reach gaps |
|
|
21
|
+
| Coordination vocabulary | `docs/topics.md` | Shelf id band registry update; no new global topics claimed; the family-prefix reservation row |
|
|
22
|
+
|
|
23
|
+
## What it contributes, and what it deliberately does not
|
|
24
|
+
|
|
25
|
+
Contributed: REQ, US (with inline ACs), TAC, ADR, plus one shipped probe pack. Adherence is expressed as ACs; the blueprint ships no notifications-framework source and no test files (the probe pack drives the real browser against the applying project's own runtime).
|
|
26
|
+
|
|
27
|
+
Deliberately not contributed: any transport (email, push, webhook). The in-app slug is the discriminator per Baz decision 2026-09-04: "we might support more types of notifications - be clear in the name what these ones are". Sibling channel blueprints ship their own transport contracts under the reserved `application-notifications-` family prefix.
|
|
28
|
+
|
|
29
|
+
## Family-prefix reservation
|
|
30
|
+
|
|
31
|
+
The `application-notifications-` prefix is reserved for the sibling in-app-adjacent channels the shelf will grow into:
|
|
32
|
+
|
|
33
|
+
- `application-notifications-email`: server-to-user notifications through the applied `email-smtp-resend` companion (or a paired email provider). Owns the email-transport dedupe semantics and the delivery-attempt log rows for the email channel.
|
|
34
|
+
- `application-notifications-push`: Web Push and platform APN/FCM notifications. Owns the subscription lifecycle and the platform-token store.
|
|
35
|
+
- `application-notifications-webhook`: outbound HTTP notifications to operator-configured endpoints. Owns the delivery-retry semantics and the endpoint registry.
|
|
36
|
+
|
|
37
|
+
The reservation is doc-only in v1.0.0 (per spec Q3 default): the family prefix is named in this README and in every shipped blueprint's `docs/topics.md` shelf band registry as a reserved-slot row. No sibling channel ships in this round. Any future PR that proposes a name outside the family (`application-alerts-email`, `application-messages-push`) reads against this reservation and stops at author-side review.
|
|
38
|
+
|
|
39
|
+
Digest opt-in on the preferences UI is elicited on the sibling channel, not here: the preferences UI carries a disabled section per sibling channel that is not yet applied, labelled `data-preference-status="sibling not applied"`. When the sibling ships and the applying project applies it, that sibling's own blueprint reads the operator's preference state and drives the digest transport.
|
|
40
|
+
|
|
41
|
+
## Quality bar
|
|
42
|
+
|
|
43
|
+
Every route the applying project ships renders with both live-region wrappers preseeded in the DOM before any notification fires (`[aria-live="polite"] [data-live-region="polite"]` and `[role="alert"] [data-live-region="assertive"]`), both empty at page load. Every toast writes into exactly one wrapper based on its priority (info to polite as `role="status"`, error to assertive as `role="alert"`) and records `data-shown-at` and `data-dismissed-at` timestamps a probe can measure the timeout against without sleeping in the pack. Every toast timeout is at or above the WCAG 2.2.1 six-second floor. The notification centre lists notifications inside the ADR-2103 retention window, every item enumerated by `data-notification-id`, every acknowledge control Tab-reachable and round-tripping to `POST /api/notifications/acknowledge` with the DOM updating on the response.
|
|
44
|
+
|
|
45
|
+
## Known mechanism-reach gaps
|
|
46
|
+
|
|
47
|
+
Every runtime-observable AC that is not bound to a pack check appears here individually per the T-1 gate discipline (`blueprint-authoring-checklist.md` section 6.g): categories are not enough. The pack has three checks; every other runtime-observable AC on this blueprint is a mechanism-reach gap named below.
|
|
48
|
+
|
|
49
|
+
- **AC-20101-2 live-region factory identity stable across route changes**. The pack asserts the wrappers are preseeded on every declared route (AC-20101-1); it does not assert the two wrappers are the same DOM nodes across route changes (a factory that recreates the wrappers on route change passes AC-20101-1 but fails AC-20101-2). A v1.1 minor bump could persist a `data-live-region-id` on each wrapper and assert identity across a `browser.click` on a nav link.
|
|
50
|
+
- **AC-20102-2 toast factory library-scope shape**. The pack drives the runtime toast surface (AC-20102-1); the library-scope AC on the factory's own signature is a project-side review concern.
|
|
51
|
+
- **AC-20103-2 centre factory reads through the delivery-log endpoint**. The pack drives the item enumeration and the acknowledge round-trip (AC-20103-1); the library-scope AC on the factory's own delivery-log read is a project-side review concern.
|
|
52
|
+
- **AC-20104-1 preferences category silence**. The preferences surface renders per-category toggles but the pack does not itself activate a silence toggle and assert the round-trip today. A v1.1 minor bump could add a preferences-round-trip check paralleling AC-20103-1.
|
|
53
|
+
- **AC-20104-2 sibling-channel digest section disabled when no sibling applied**. The fixture renders the disabled sections and the pack could inspect them, but the AC's real bite is when a sibling channel ships and the disabled state must lift; this class stays a v1.1 minor bump candidate for when the first sibling ships.
|
|
54
|
+
- **AC-20105-1 delivery-log endpoint shape**. The pack does not enumerate every row on the log (the delivery-log's persistence is delegated to the applied `logging` companion). A v1.1 minor bump could add a log-shape probe that reads `/api/delivery-log`, asserts the row shape and confirms append-only order.
|
|
55
|
+
- **AC-20105-2 delivery-log writes through the applied logging companion factory**. The pack does not inspect the companion's factory today. A v1.1 minor bump could add a companion-boundary check reading a marker the applying project stamps on companion-authored rows.
|
|
56
|
+
- **AC-20106-1 page load with backlog does not saturate the polite queue**. The pack does not itself count polite-queue emissions at load. A v1.1 minor bump could add a MutationObserver-based check that counts inserts into the polite wrapper during the first render tick.
|
|
57
|
+
- **AC-20107-1 background event indistinguishable from operator-driven event**. The pack fires the operator-driven variant (AC-20102-1); a background-event dispatch through `POST /__emit` on the fixture would exercise the same code path and reach the same DOM shape.
|
|
58
|
+
- **AC-20108-1 disjoint content between wrappers**. The pack asserts the disjoint-content rule at the moment it inspects the wrappers, not continuously across the toast lifetime. TAC-2101 notes name this residual; a v1.1 minor bump could add a MutationObserver-based check.
|
|
59
|
+
- **AC-2101-6 family-prefix reservation is documented on the shelf**. This is a doc-observable AC (the reservation paragraph exists in this README and the shelf registry rows). Not runtime-observable; not a mechanism-reach gap in the same sense but named for completeness.
|
|
60
|
+
|
|
61
|
+
## Elicited parameters (ADR-2101 through ADR-2103 and REQ notes)
|
|
62
|
+
|
|
63
|
+
The applying project elicits these at apply; the declarative ADR shape (`elicited: true`) records the intent on the manifest. The runner has no apply-time elicitation phase today (w-2026-09-04-dave-022, built in T-5); accept the declarative shape and gather the operator's answers by hand during the apply pass.
|
|
64
|
+
|
|
65
|
+
- **Toast timeout floor** (ADR-2102): six seconds baseline per WCAG 2.2.1; operator elicits an override above the floor (twelve seconds, thirty seconds); the elicited value lands on `manifest.blueprints[application-notifications-in-app].appliedParameters.toastTimeoutSeconds`. A value below six is refused at apply.
|
|
66
|
+
- **Notification categories** (REQ-004): the operator's category list (payment, security, product, and any project-specific categories). The preferences UI renders one section per elicited category.
|
|
67
|
+
- **Centre retention window** (ADR-2103): thirty days by default; operator elicits an override. Below one day refused at apply.
|
|
68
|
+
- **Notification centre route path** (REQ-003 note): `/notifications-centre` by default; operator elicits an override for a bespoke route.
|
|
69
|
+
- **Digest transports** (REQ-004 note): elicited on the sibling channel blueprint at its apply, not here. This blueprint ships the preferences UI's disabled sibling section only.
|
|
70
|
+
|
|
71
|
+
## Standards trace
|
|
72
|
+
|
|
73
|
+
WCAG 4.1.3 Status Messages on the live-region contract (REQ-001, ADR-2101). ARIA APG alert pattern on the assertive slot (ADR-2101). WCAG 2.2.1 Timing Adjustable on the toast timeout floor (ADR-2102). WAI-ARIA 1.2 live regions normative reference (Sara Soueidan's guidance is the shipped project-side citation on the preseeding contract; the standards trace holds against the WAI-ARIA specification directly). `standardsTraceClause` on each ADR carries the primary clause or pattern id.
|
|
74
|
+
|
|
75
|
+
## Consumers and dependencies
|
|
76
|
+
|
|
77
|
+
- Consumes the applied `logging` companion (or the shelf provider `observability-logging`) for the delivery-attempt log write path (REQ-005, TAC-2102) and every acknowledge round-trip record. A project without a `logging` companion applied sees the delivery-log endpoint returning an empty rows array, which fails project-side review.
|
|
78
|
+
- Consumes the applied `errorHandling` companion (or the shelf provider `application-error-handling`) for the assertive-slot alert's internal error record when an acknowledge round-trip fails at the server.
|
|
79
|
+
- Reserves the `application-notifications-` family prefix for sibling channel blueprints (see above).
|
|
80
|
+
- Reuses the T-3 pack-browser `resize(width, height)` seam only for future minor bumps; v1.0.0 does not exercise breakpoint reflow in the pack.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "application-notifications-in-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"category": "application",
|
|
5
|
+
"suggestedCompanions": [
|
|
6
|
+
{ "role": "logging", "reason": "Every acknowledge round-trip and every delivery-attempt row is written through the applied logger; a logging companion supplies the factory the notification centre, the toast surface and the delivery-attempt log write records against." },
|
|
7
|
+
{ "role": "errorHandling", "reason": "The assertive-slot alert routes an internal error record whose error envelope conforms to the applied error contract; an errorHandling companion supplies the record factory and the surface boundary the alert toast renders through." }
|
|
8
|
+
],
|
|
9
|
+
"contributions": [
|
|
10
|
+
{ "id": "application-notifications-in-app-REQ-001", "kind": "req", "path": "requirements/application-notifications-in-app-req-001.json" },
|
|
11
|
+
{ "id": "application-notifications-in-app-REQ-002", "kind": "req", "path": "requirements/application-notifications-in-app-req-002.json" },
|
|
12
|
+
{ "id": "application-notifications-in-app-REQ-003", "kind": "req", "path": "requirements/application-notifications-in-app-req-003.json" },
|
|
13
|
+
{ "id": "application-notifications-in-app-REQ-004", "kind": "req", "path": "requirements/application-notifications-in-app-req-004.json" },
|
|
14
|
+
{ "id": "application-notifications-in-app-REQ-005", "kind": "req", "path": "requirements/application-notifications-in-app-req-005.json" },
|
|
15
|
+
{ "id": "application-notifications-in-app-US-20101", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20101.json" },
|
|
16
|
+
{ "id": "application-notifications-in-app-US-20102", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20102.json" },
|
|
17
|
+
{ "id": "application-notifications-in-app-US-20103", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20103.json" },
|
|
18
|
+
{ "id": "application-notifications-in-app-US-20104", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20104.json" },
|
|
19
|
+
{ "id": "application-notifications-in-app-US-20105", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20105.json" },
|
|
20
|
+
{ "id": "application-notifications-in-app-US-20106", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20106.json" },
|
|
21
|
+
{ "id": "application-notifications-in-app-US-20107", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20107.json" },
|
|
22
|
+
{ "id": "application-notifications-in-app-US-20108", "kind": "us", "path": "user-stories/application-notifications-in-app-us-20108.json" },
|
|
23
|
+
{ "id": "TAC-2101-application-notifications-in-app-live-region", "kind": "tac", "path": "tacs/tac-2101-application-notifications-in-app-live-region.json" },
|
|
24
|
+
{ "id": "TAC-2102-application-notifications-in-app-centre", "kind": "tac", "path": "tacs/tac-2102-application-notifications-in-app-centre.json" },
|
|
25
|
+
{ "id": "TAC-2103-application-notifications-in-app-preferences", "kind": "tac", "path": "tacs/tac-2103-application-notifications-in-app-preferences.json" },
|
|
26
|
+
{ "id": "ADR-2101-application-notifications-in-app-live-region-role-mapping", "kind": "adr", "path": "adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json", "recommendedDefault": true, "elicited": false, "standardsTraceClause": "WCAG 4.1.3 (Status Messages); ARIA APG alert pattern" },
|
|
27
|
+
{ "id": "ADR-2102-application-notifications-in-app-toast-timeout-floor", "kind": "adr", "path": "adrs/adr-2102-application-notifications-in-app-toast-timeout-floor.json", "recommendedDefault": true, "elicited": true, "standardsTraceClause": "WCAG 2.2.1 (Timing Adjustable)" },
|
|
28
|
+
{ "id": "ADR-2103-application-notifications-in-app-retention-window", "kind": "adr", "path": "adrs/adr-2103-application-notifications-in-app-retention-window.json", "recommendedDefault": true, "elicited": true, "standardsTraceClause": "generic enterprise practice" }
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2101-application-notifications-in-app-live-region-role-mapping",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Map toast priority to live-region wrapper and ARIA role from a fixed two-value enum: info to polite plus status, error to assertive plus alert",
|
|
8
|
+
"context": "A transient toast needs to reach a screen reader on the queue that matches the reader's attention regime: an informational confirmation belongs on the polite queue, an error interruption belongs on the assertive queue. Free-form role assignment lets a well-meaning implementation route an error into the polite wrapper (the reader misses the interruption) or route an informational message into the assertive wrapper (the reader is interrupted for a confirmation). The WCAG 4.1.3 Status Messages clause and the ARIA APG alert pattern name the correct mapping; the problem is turning that guidance into a runtime discipline the pack can drive.",
|
|
9
|
+
"decision": "Toast priority is a two-value enum: `info` and `error`. `info` renders inside the polite wrapper (`[aria-live=\"polite\"] [data-live-region=\"polite\"]`) and carries `role=\"status\"` on the toast element. `error` renders inside the assertive wrapper (`[role=\"alert\"] [data-live-region=\"assertive\"]`) and carries `role=\"alert\"` on the toast element. A priority outside the enum is refused at project-side review. The pack asserts the priority-to-role mapping on both branches and asserts the disjoint-content rule (a body text in exactly one wrapper).",
|
|
10
|
+
"consequences": "Every toast maps to a queue readers already understand; the reader hears an interruption exactly when the application asserts one. The two-value enum is honest about the shipped shelf's known cases; a third priority (`warning`) would land as a v1.1 minor bump with a shelf-wide review because it changes the role vocabulary. The disjoint-content rule keeps a double-post defect visible at ship rather than at incident.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Free-form priority string with implicit role mapping",
|
|
14
|
+
"summary": "Any string as priority; the toast factory picks a role based on a runtime rule.",
|
|
15
|
+
"reasonNotChosen": "Runtime string-to-role rules drift across implementations; the pack cannot usefully assert the mapping without a fixed enum. Free-form is honest about being unspecified but abdicates the accessibility discipline the ADR exists to codify."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Three-value enum with a warning priority",
|
|
19
|
+
"summary": "info, warning, error; warning uses `role=\"status\"` on the polite queue with a distinct visual cue.",
|
|
20
|
+
"reasonNotChosen": "The ARIA vocabulary does not include a warning-specific role that assistive technologies distinguish; a warning on the polite queue is indistinguishable at the assistive-technology layer from an info. The visual-cue distinction is real but does not warrant an ADR-level split at v1.0.0."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2102-application-notifications-in-app-toast-timeout-floor",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Ship a six-second toast timeout floor per WCAG 2.2.1 Timing Adjustable, with elicited overrides above the floor",
|
|
8
|
+
"context": "A transient toast that disappears too quickly is a comprehension defect: a reader with a screen reader, a reader with a motor impairment or a reader distracted for two seconds by another task cannot recover the message. The WCAG 2.2.1 Timing Adjustable clause names six seconds as the baseline dwell time for a message the reader must read; below that, the shipped surface fails the clause. On the other hand, an operator on a dashboard with a very high notification volume might want a longer dwell time (twelve seconds, thirty seconds) so an errant page reload does not clear the reader's context.",
|
|
9
|
+
"decision": "The shipped toast timeout floor is six seconds. The applying project may elicit a longer dwell time at apply; the elicited value is recorded in `manifest.blueprints[application-notifications-in-app].appliedParameters.toastTimeoutSeconds`. A value below six seconds is refused at apply (elicitation rejects it with a message naming the clause). The pack measures the actual dismissal timestamp against the shell root's `data-toast-timeout-floor-seconds` attribute (defaulting to six on the shipped fixture, overrideable by the elicited value) and refuses if any toast dismissed by timeout carries an elapsed time below the recorded floor.",
|
|
10
|
+
"consequences": "Every shipped surface passes the WCAG 2.2.1 clause at the shipped default. Operators with a real need for a longer dwell time set the elicited value and the pack asserts against the raised floor. The refusal at apply of a value below six seconds keeps the accessibility invariant honest at every project.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "No floor, one project-level default",
|
|
14
|
+
"summary": "The applying project picks any timeout; the pack does not assert a floor.",
|
|
15
|
+
"reasonNotChosen": "The WCAG 2.2.1 clause is the whole point; a blueprint that ships without asserting the floor lets a project ship a two-second toast and pass the ship gate. Not shipping the floor is not shipping the discipline."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Ship four seconds by default, elicit an override",
|
|
19
|
+
"summary": "Match the commercial-toast default (four seconds); operators elicit six or more.",
|
|
20
|
+
"reasonNotChosen": "Four seconds does not clear WCAG 2.2.1 for a reader who is not looking directly at the screen when the toast fires. Shipping below the clause and hoping operators elicit above it is a defect posture."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
25
|
+
}
|