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,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2103-application-notifications-in-app-retention-window",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Ship a thirty-day notification-centre retention window by default, elicited overrides",
|
|
8
|
+
"context": "The notification centre inbox needs a retention boundary: a shelf that keeps every notification forever grows unbounded and a shelf that keeps only the last few days loses the operator's audit trail on a slow-cadence surface. Different applying projects have different memories: a payments platform retains six months; a status-page dashboard retains one week; a consumer product retains thirty days. The problem is picking a shipped default that is honest for the typical case and letting the operator elicit their own.",
|
|
9
|
+
"decision": "The shipped retention window is thirty days: `manifest.blueprints[application-notifications-in-app].appliedParameters.retentionDays` defaults to thirty. The centre reads the delivery log filtered to `deliveredAt >= now - retentionDays`; rows older than the window remain in the log (write-side truncation is the applied `logging` companion's concern) but do not surface in the centre. Operators elicit a longer or shorter window at apply; the elicited value lands on the manifest and the centre uses it. A window below one day is refused at apply (an inbox that clears every day is not an inbox).",
|
|
10
|
+
"consequences": "Applying projects get a mid-cycle default that matches the most common operational tempo; long-retention projects and short-retention projects elicit their own. The write-side truncation staying on the `logging` companion keeps this blueprint's concern at the surface, not the store; the applying project picks a log store per its `logging` companion pin and the notifications blueprint stays store-agnostic.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Ship one week by default",
|
|
14
|
+
"summary": "Default retention is seven days.",
|
|
15
|
+
"reasonNotChosen": "Seven days is honest for a high-cadence surface but clears too fast for a project with a weekly reporting cycle; the operator opens the centre on Monday and finds nothing from the prior week."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Ship six months by default",
|
|
19
|
+
"summary": "Default retention is one hundred and eighty days.",
|
|
20
|
+
"reasonNotChosen": "Six months at typical notification volume produces an inbox the operator cannot skim; the retention becomes a browse problem, not a review problem. A project that really needs six months elicits it."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-notifications-in-app-REQ-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The application shell preseeds the polite and assertive live-region wrappers on every declared route before any notification fires",
|
|
5
|
+
"description": "Every route the applying project declares under its navigation model renders with the two live-region wrappers already present in the DOM at page load: a `[aria-live=\"polite\"]` wrapper for informational messages and a `[role=\"alert\"]` wrapper for assertive alerts. Both wrappers exist and are empty before any notification fires; a wrapper inserted lazily after the first event is a defect that produces a screen-reader miss per the Sara Soueidan normative guidance on ARIA live regions. The wrappers carry stable `data-live-region=\"polite\"` and `data-live-region=\"assertive\"` attributes so the pack can enumerate them by data-id (not by role attribute alone, per the T-3 gate discipline).",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "The WAI-ARIA 1.2 live-regions normative contract requires the container to exist in the DOM before content is inserted; a wrapper inserted at the same tick as the content races the screen-reader announcement pass and the message is silently lost. Preseeding the two wrappers on every route is the runtime discipline that turns the WCAG 4.1.3 status-message clause from a design intent into a runtime-observable check the probe pack can drive.",
|
|
10
|
+
"tags": ["blueprint:application-notifications-in-app", "category:01-live-region-preseeding"],
|
|
11
|
+
"version": "1.0.0",
|
|
12
|
+
"status": "approved",
|
|
13
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
14
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-notifications-in-app-REQ-002",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "A transient toast maps its priority to a live-region role, announces exactly once, and dismisses on operator activation or timeout",
|
|
5
|
+
"description": "A notification surfaced as a transient toast writes into one of the two preseeded live regions based on its priority per ADR-2101: an informational priority renders into the polite wrapper and carries `role=\"status\"`, an error priority renders into the assertive wrapper and carries `role=\"alert\"`. The toast body appears in exactly one wrapper text update (the one whose role reflects the priority) and never in both. Every toast is dismissible in two ways: an operator activation on the toast's dismiss control, and a timeout at or above the ADR-2102 floor (six seconds baseline per WCAG 2.2.1 Timing Adjustable, elicited overrides above the floor). The toast records `data-shown-at` and `data-dismissed-at` timestamps on its DOM element so a probe can measure the actual timeout against the floor without sleeping in the pack.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "The WCAG 4.1.3 status-message clause and the ARIA APG alert pattern name the priority-to-role mapping as the accessibility discipline that lets a screen reader distinguish a passive confirmation (polite queue) from an assertive interruption (assertive queue). The WCAG 2.2.1 Timing Adjustable clause names six seconds as the floor for a message a reader can dwell on; a timeout below the floor is a comprehension defect. Recording the shown and dismissed timestamps on the DOM element makes both rules observable at runtime without a race-prone sleep in the pack.",
|
|
10
|
+
"tags": ["blueprint:application-notifications-in-app", "category:02-toast-contract"],
|
|
11
|
+
"version": "1.0.0",
|
|
12
|
+
"status": "approved",
|
|
13
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
14
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-notifications-in-app-REQ-003",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The notification centre inbox lists the last N days of notifications and each acknowledge control round-trips to the server",
|
|
5
|
+
"description": "The applying project renders a notification-centre route (default `/notifications-centre`, operator-elicited) whose inbox surface lists the notifications delivered in the last N days per the ADR-2103 retention window (default thirty days, elicited). Each notification carries a stable `data-notification-id` attribute the pack enumerates by (never by a role attribute alone, per the T-3 gate discipline), and each carries a keyboard-reachable acknowledge control (`[data-action=\"acknowledge\"]`) plus a mark-read control (`[data-action=\"mark-read\"]`); the surface offers one mark-all-read control (`[data-action=\"mark-all-read\"]`) reachable in reading order. Activating the acknowledge control POSTs an acknowledge request to the applying project's server, the server responds, and the DOM updates in response: the notification's `data-acknowledged` reads `true` after the round-trip. Every item is Tab-reachable from the start of the surface without a mouse.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A transient toast is not a system of record; the notification centre is. Making the centre the operator's inbox with a retention window and per-item acknowledge round-trip is what turns a fleeting on-screen message into a durable one the operator can return to and confirm. Enumerating items by `data-notification-id` rather than by `role=\"listitem\"` on the container follows the T-3 gate discipline: a role attribute the primary element carries alone does not enumerate multiple children; a per-element data attribute does.",
|
|
10
|
+
"tags": ["blueprint:application-notifications-in-app", "category:03-centre-inbox"],
|
|
11
|
+
"version": "1.0.0",
|
|
12
|
+
"status": "approved",
|
|
13
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
14
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-notifications-in-app-REQ-004",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The preferences UI exposes per-user category silence and delegates digest opt-in to the sibling channels",
|
|
5
|
+
"description": "The applying project renders a preferences surface (default `/notifications-preferences`, operator-elicited) that carries one section per operator-elicited notification category with a labelled silence toggle (`[data-preference-category=\"<category>\"]` on the toggle's `<input>` or `<button>` control), and one section per sibling channel (`-email`, `-push`, `-webhook`) with a digest opt-in control recording the operator's intent on `data-digest-<channel>`. This blueprint ships no transport: the digest opt-in records the intent on the surface, and the applying project's sibling blueprint (once shipped) reads the intent from the preferences store and drives its own delivery. A preferences surface that promises a digest without a corresponding sibling blueprint applied is a defect the applying project surfaces via a `[data-preference-status]` label reading `\"sibling not applied\"`.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per-user category silence is the operator's primary knob on notification fatigue: a labelled toggle per category gives the reader an accountable choice without overloading the transport. Delegating digest opt-in to the sibling channel keeps this blueprint at the in-app surface it names (per Baz decision 2026-09-04: 'we might support more types of notifications - be clear in the name what these ones are'); a digest is a transport concern the sibling blueprint owns.",
|
|
10
|
+
"tags": ["blueprint:application-notifications-in-app", "category:04-preferences"],
|
|
11
|
+
"version": "1.0.0",
|
|
12
|
+
"status": "approved",
|
|
13
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
14
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-notifications-in-app-REQ-005",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The delivery-attempt log records one row per surfaced notification with the operator-readable fields for later inspection",
|
|
5
|
+
"description": "Every notification the shell surfaces (as a toast, in the notification centre, or both) appends one row to the delivery-attempt log. Each row carries `notificationId`, `category`, `priority`, `deliveredAt` (ISO-8601 timestamp of the surface event), and the optional acknowledgement trail: `dismissedAt` when the operator dismissed the toast, `acknowledgedAt` when the operator activated the centre's acknowledge control. The log is operator-readable via a `GET /api/delivery-log` endpoint the applying project exposes; the endpoint returns JSON in the shape `{ rows: [...] }`. The log is append-only; a row is never rewritten, only augmented (a `dismissedAt` or `acknowledgedAt` may land on a later request). Records write through the applied `logging` companion's factory so the log's persistence and retention layer is the companion's, not this blueprint's.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A delivery-attempt log is the operator's audit trail for what the shell has said and when, alongside a second row per acknowledgement event. Ownership of the row shape lives on this blueprint; ownership of the persistence layer lives on the applied `logging` companion (per REQ-005 factory delegation). Splitting the two lets the applying project pick a log store per its `logging` companion pin without the notifications blueprint dragging in a store of its own.",
|
|
10
|
+
"tags": ["blueprint:application-notifications-in-app", "category:05-delivery-log"],
|
|
11
|
+
"version": "1.0.0",
|
|
12
|
+
"status": "approved",
|
|
13
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
14
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2101-application-notifications-in-app-live-region",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Live-region wrappers, transient toast rendering and the priority-to-role mapping",
|
|
8
|
+
"purpose": "Owns the shell's live-region contract: the polite and assertive wrappers preseeded on every declared route, the transient-toast factory that writes into one wrapper per ADR-2101's priority-to-role mapping, and the timeout floor per ADR-2102. The wrappers are the substitutable interface every notification announcement flows through; the pack asserts on their presence, their emptiness at load, and the disjoint-content rule (AC-20101-1, AC-20102-1, AC-20108-1).",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Emit both live-region wrappers into the DOM at first render and keep them mounted for the app lifetime: a `[aria-live=\"polite\"] [data-live-region=\"polite\"]` wrapper for informational messages and a `[role=\"alert\"] [data-live-region=\"assertive\"]` wrapper for assertive alerts; both empty at load (AC-20101-1).",
|
|
11
|
+
"Render a toast on `renderToast({ priority, body })` into exactly one wrapper: `info` priority into the polite wrapper with `role=\"status\"`, `error` priority into the assertive wrapper with `role=\"alert\"` (AC-20102-1, AC-20102-2).",
|
|
12
|
+
"Record `data-shown-at` and `data-dismissed-at` timestamps on the toast's DOM element so the pack measures the actual timeout against the ADR-2102 six-second floor without sleeping (AC-20102-1).",
|
|
13
|
+
"Dismiss every toast in two ways: an operator activation on the toast's `[data-action=\"dismiss\"]` control, and a scheduled timeout that fires at or above the ADR-2102 floor (AC-20102-1).",
|
|
14
|
+
"Enforce the disjoint-content rule: no toast body appears in both wrappers simultaneously; a background event and an operator-driven event both flow through the same factory (AC-20107-1, AC-20108-1)."
|
|
15
|
+
],
|
|
16
|
+
"internalStructure": "One live-region factory (`renderLiveRegions`) mounted at first render owning the two wrapper elements. One toast factory (`renderToast`) that resolves the priority-to-role mapping per ADR-2101, mounts the toast DOM inside the correct wrapper, records the two timestamp attributes, and schedules the dismissal timer per ADR-2102. Dismissal on activation and dismissal on timeout share one dismiss code path so the timestamp update is single-sourced.",
|
|
17
|
+
"interfaces": [
|
|
18
|
+
{
|
|
19
|
+
"name": "renderLiveRegions",
|
|
20
|
+
"kind": "factory",
|
|
21
|
+
"description": "renderLiveRegions({ rootElement }) -> void. Mounts the two live-region wrappers into `rootElement` at first render if they are not already present. Idempotent across route changes: identity of the two wrappers is stable across the app lifetime (AC-20101-2)."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "renderToast",
|
|
25
|
+
"kind": "factory",
|
|
26
|
+
"description": "renderToast({ priority: 'info' | 'error', body: string, category: string, notificationId: string }) -> void. Mounts the toast DOM inside the wrapper the ADR-2101 mapping resolves to, records `data-shown-at`, schedules the ADR-2102-floored dismissal, and records `data-dismissed-at` on dismissal. Every toast surface event writes a delivery-log row through TAC-2102's `writeDeliveryRow`."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "priorityToRoleContract",
|
|
30
|
+
"kind": "shape",
|
|
31
|
+
"description": "The ADR-2101 mapping: `info` maps to `{ wrapper: 'polite', role: 'status' }`; `error` maps to `{ wrapper: 'assertive', role: 'alert' }`. A priority outside the ADR-2101 enum is refused at project-side review."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"dependencies": [
|
|
35
|
+
{
|
|
36
|
+
"name": "Delivery-log write factory",
|
|
37
|
+
"kind": "tac",
|
|
38
|
+
"tacId": "TAC-2102-application-notifications-in-app-centre",
|
|
39
|
+
"description": "Every toast the live-region factory emits records a delivery-log row through TAC-2102's `writeDeliveryRow`; ownership of the row shape lives here through the delegating call, ownership of the persistence layer lives on TAC-2102 and the applied `logging` companion."
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"tradeoffs": "The two-wrapper contract is opinionated: some designs use one wrapper per notification kind (informational, error, warning, success) with four ARIA politeness levels. This TAC insists on two wrappers because the WCAG 4.1.3 status-message clause and the ARIA APG alert pattern jointly draw the line at polite vs assertive; adding wrapper granularity that assistive technologies do not distinguish trades runtime discipline for false precision. The six-second timeout floor is deliberately not a ceiling: an elicited override raises the floor but never lowers it, so a design that shows a toast for two seconds fails at author-side review.",
|
|
43
|
+
"notes": "Known mechanism-reach gap: the pack asserts the disjoint-content rule (AC-20108-1) at the moment it inspects the wrappers, not continuously across the toast lifetime. A pathological implementation that briefly writes into both wrappers between two microtasks would not be caught by the pack; project-side review carries the residual. A v1.1 minor bump could add a MutationObserver-based check.",
|
|
44
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
45
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
46
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2102-application-notifications-in-app-centre",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Notification centre inbox, retention window, acknowledge round-trip and delivery-attempt log",
|
|
8
|
+
"purpose": "Owns the shell's persistent notification-centre inbox: the centre route the applying project mounts (default `/notifications-centre`, elicited), the retention window contract per ADR-2103 (default thirty days, elicited), the per-item acknowledge round-trip that POSTs to the applying project's server and updates the DOM on the response, and the delivery-attempt log write path per REQ-005. The centre is the durable inbox the operator returns to; the toast is the transient surface.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Render one notification wrapper per delivery-log row within the ADR-2103 retention window. Every wrapper carries `data-notification-id` (per-element attribute the pack enumerates by, never `role=\"listitem\"` on the container alone per the T-3 gate discipline) (AC-20103-1, AC-20103-2).",
|
|
11
|
+
"Render one keyboard-reachable `[data-action=\"acknowledge\"]` control and one `[data-action=\"mark-read\"]` control per item; render exactly one `[data-action=\"mark-all-read\"]` control on the surface, reachable in Tab order after the item list (AC-20103-1).",
|
|
12
|
+
"On acknowledge activation, POST `POST /api/notifications/acknowledge` with the notification id, wait for the server response, and update `data-acknowledged` on the item to `true` on a 2xx response; a failed response surfaces an error toast via the TAC-2101 factory and the item's `data-acknowledged` remains unchanged (AC-20103-1).",
|
|
13
|
+
"On a page load with a backlog, render every backlog item on the surface without writing any body text into the polite or assertive live-region wrapper (AC-20106-1).",
|
|
14
|
+
"Expose the delivery-log write factory `writeDeliveryRow` the TAC-2101 toast factory and this TAC's centre factory both call; every write goes through the applied `logging` companion's record factory (AC-20105-2).",
|
|
15
|
+
"Expose the delivery-log read endpoint `GET /api/delivery-log` returning `{ rows: [...] }` where every row carries `notificationId`, `category`, `priority`, `deliveredAt`, optionally `dismissedAt`, optionally `acknowledgedAt`; rows are append-only (AC-20105-1)."
|
|
16
|
+
],
|
|
17
|
+
"internalStructure": "One centre-route module reading the delivery-log endpoint filtered to the retention window and rendering one wrapper per row through a shared item factory. One acknowledge-round-trip helper that owns the POST plus the DOM-update code path. One delivery-log write helper (`writeDeliveryRow`) that adapts the shell-side row shape to the applied `logging` companion's record factory.",
|
|
18
|
+
"interfaces": [
|
|
19
|
+
{
|
|
20
|
+
"name": "renderCentre",
|
|
21
|
+
"kind": "factory",
|
|
22
|
+
"description": "renderCentre({ rootElement, retentionDays, deliveryLogUrl }) -> Promise<void>. Reads the delivery log filtered to the retention window and mounts one wrapper per row into `rootElement`. Idempotent on the same log state."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "writeDeliveryRow",
|
|
26
|
+
"kind": "factory",
|
|
27
|
+
"description": "writeDeliveryRow({ notificationId, category, priority, deliveredAt, dismissedAt?, acknowledgedAt? }) -> Promise<void>. Writes one row through the applied `logging` companion's record factory. Called from TAC-2101's toast factory on a toast surface event and from this TAC's centre-item activation on an acknowledge event."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "acknowledgeRoundTrip",
|
|
31
|
+
"kind": "function",
|
|
32
|
+
"description": "acknowledgeRoundTrip({ notificationId }) -> Promise<{ ok: boolean }>. POSTs `POST /api/notifications/acknowledge` and returns the parsed server response. A 2xx flips `data-acknowledged` on the item; a non-2xx surfaces an error toast through TAC-2101."
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"dependencies": [
|
|
36
|
+
{
|
|
37
|
+
"name": "Live-region factory (surface for acknowledge failures)",
|
|
38
|
+
"kind": "tac",
|
|
39
|
+
"tacId": "TAC-2101-application-notifications-in-app-live-region",
|
|
40
|
+
"description": "The centre surfaces acknowledge failures as error toasts through the live-region factory; the wrapper contract per REQ-001 and REQ-002 holds on the centre surface as much as on any other route."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "Applied logging companion",
|
|
44
|
+
"kind": "external",
|
|
45
|
+
"description": "The delivery-attempt log's persistence layer is the applied `logging` companion's; this TAC delegates the write path. A project applying this blueprint without a `logging` companion (neither applied nor registered library nor core shelf) sees the delivery-log endpoint returning an empty rows array, which fails project-side review."
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"tradeoffs": "The centre reading through the delivery log (rather than a separate inbox store) keeps the shell single-sourced on the applied `logging` companion but couples the surface latency to the log query; a project with a very high notification volume may want to project a materialised inbox view alongside the log. This TAC accepts the coupling because it collapses two writers of the same row into one; a project that needs the materialised view supersedes with a project-authored REQ.",
|
|
49
|
+
"notes": "Known mechanism-reach gap: the pack asserts one acknowledge round-trip on one item (AC-20103-1); the mark-read control, the mark-all-read control and the retention-window boundary (a row on day 31 must not surface) are runtime-observable ACs the shipped pack does not itself drive. The README names them individually per the T-1 gate discipline; a v1.1 minor bump could add checks for each.",
|
|
50
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
51
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
52
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2103-application-notifications-in-app-preferences",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Per-user preferences UI, category silence and sibling-channel delegation",
|
|
8
|
+
"purpose": "Owns the preferences surface where the operator silences notification categories and opts into (or out of) digest delivery on each sibling channel. This blueprint ships no transport: the digest opt-in records the operator's intent on the surface for a sibling blueprint to read. The preferences UI is the operator's single knob on notification fatigue.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Render the preferences route (default `/notifications-preferences`, elicited). Render one section per operator-elicited category with a labelled silence toggle whose control element carries `[data-preference-category=\"<category>\"]` (AC-20104-1).",
|
|
11
|
+
"On a silence-toggle activation, POST `POST /api/preferences/category` with the category and the new state, wait for the server response, and update `data-silenced` on the toggle to reflect the state (AC-20104-1).",
|
|
12
|
+
"Render one section per sibling channel (`-email`, `-push`, `-webhook`) with a `[data-preference-section=\"<channel>\"]` wrapper and a digest opt-in control. When no corresponding sibling blueprint is applied to the project, disable the control (`aria-disabled=\"true\"`) and label the section with `[data-preference-status=\"sibling not applied\"]` (AC-20104-2).",
|
|
13
|
+
"Elicit the notification categories at apply time; the elicited list is the source of truth for the per-category sections. A category rendered without an elicited entry is a defect."
|
|
14
|
+
],
|
|
15
|
+
"internalStructure": "One preferences-route module reading the elicited categories from the applied manifest and rendering one section per category. One sibling-channel section module reading `manifest.blueprints[]` to detect applied siblings and disabling the digest control when the sibling is missing.",
|
|
16
|
+
"interfaces": [
|
|
17
|
+
{
|
|
18
|
+
"name": "renderPreferences",
|
|
19
|
+
"kind": "factory",
|
|
20
|
+
"description": "renderPreferences({ rootElement, categories, appliedSiblings }) -> void. Mounts the category-silence sections and the sibling-channel sections. `appliedSiblings` is the list of applied `application-notifications-*` blueprint slugs the applying project passes in from its manifest reader; today the list is empty and every sibling section renders disabled."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "readPreference",
|
|
24
|
+
"kind": "function",
|
|
25
|
+
"description": "readPreference({ category }) -> Promise<{ silenced: boolean }>. Reads the current preference state for a category so the surface can render the initial toggle state. Called at first render; the returned state drives the initial `data-silenced` attribute value."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"dependencies": [
|
|
29
|
+
{
|
|
30
|
+
"name": "Live-region factory (surface for preference-update failures)",
|
|
31
|
+
"kind": "tac",
|
|
32
|
+
"tacId": "TAC-2101-application-notifications-in-app-live-region",
|
|
33
|
+
"description": "A preference update that fails at the server surfaces an error toast through TAC-2101."
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"tradeoffs": "Delegating digest opt-in to sibling blueprints keeps this blueprint's contract at the in-app surface (Baz decision 2026-09-04: 'be clear in the name what these ones are'). The trade-off is that on a project without any sibling channel applied the preferences surface renders disabled sibling sections; a first-time reader might expect the preferences UI to be silent about siblings that do not exist. This TAC ships the disabled section on the argument that the reserved family prefix (`application-notifications-`) is discoverable to the operator and the labelled disabled state names the residual honestly.",
|
|
37
|
+
"notes": "Known mechanism-reach gap: elicitation of the notification categories is a declarative field on the ADR-2101 elicited-parameters block; the runner has no apply-time elicitation phase today (w-2026-09-04-dave-022, built in T-5), so the applying project gathers the categories by hand at the apply pass. The README names this individually.",
|
|
38
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
39
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The polite and assertive live-region wrappers are preseeded on every declared route before any notification fires",
|
|
8
|
+
"asA": "screen-reader user of a shipped rcf-lite application",
|
|
9
|
+
"iWant": "the polite and assertive live-region wrappers to be present in the DOM at page load on every route so that the first notification fires into a container the accessibility tree already tracks",
|
|
10
|
+
"soThat": "no informational or assertive message is silently lost by a race between the wrapper insertion and the content insertion, per the WAI-ARIA 1.2 live-regions normative contract",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20101-1",
|
|
14
|
+
"description": "Given a page load on any declared route, both live-region wrappers are preseeded in the DOM before any notification fires: the polite wrapper carries `aria-live=\"polite\"` and `data-live-region=\"polite\"` and is empty (no descendant text nodes) at page load; the assertive wrapper carries `role=\"alert\"` and `data-live-region=\"assertive\"` and is empty at page load. A wrapper inserted lazily after the first event, or a wrapper that carries content at page load, fails this AC. The pack enumerates wrappers by `[data-live-region]` (per-element attribute), not by `aria-live` or `role` alone.",
|
|
15
|
+
"given": "a page load on any declared route",
|
|
16
|
+
"when": "the initial DOM is read",
|
|
17
|
+
"then": "both preseeded wrappers are present, carry their id attribute, and are empty",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-20101-2",
|
|
23
|
+
"description": "Given the shell's live-region factory (TAC-2101 `renderLiveRegions`), a call at first render emits exactly two wrapper elements matching the AC-20101-1 shape and never re-creates them on subsequent renders (the wrappers are stable identity across the app lifetime). A factory that recreates the wrappers on a route change fails this AC at project-side review.",
|
|
24
|
+
"given": "the shell's live-region factory",
|
|
25
|
+
"when": "the factory is invoked at first render and again on a route change",
|
|
26
|
+
"then": "the same two wrapper elements are returned; identity is stable",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2101-application-notifications-in-app-live-region"],
|
|
32
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
33
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A transient toast maps its priority to the polite or assertive slot, announces once, and dismisses on activation or timeout",
|
|
8
|
+
"asA": "screen-reader user reading a shipped rcf-lite application",
|
|
9
|
+
"iWant": "an informational toast to reach me on the polite queue and an error toast to reach me on the assertive queue, each announced exactly once and dismissable on my activation or after a WCAG-compliant timeout",
|
|
10
|
+
"soThat": "I can tell an interruption from a confirmation and I have time to read the message before it disappears",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20102-1",
|
|
14
|
+
"description": "Given a toast triggered by a background event with priority `info`, the toast renders inside `[data-live-region=\"polite\"]` and carries `role=\"status\"`; given priority `error`, the toast renders inside `[data-live-region=\"assertive\"]` and carries `role=\"alert\"`; every toast body text appears in exactly one wrapper (the one whose role reflects the priority) and never in both; every toast records `data-shown-at` and `data-dismissed-at` timestamps on its DOM element; the elapsed time between `data-shown-at` and `data-dismissed-at` on a toast that timed out (not clicked away) is at or above the ADR-2102 floor of six seconds. The pack enumerates toasts by `[data-toast-id]` inside the two wrappers (per-element attribute), not by `role` alone.",
|
|
15
|
+
"given": "a toast triggered by a background event",
|
|
16
|
+
"when": "the accessibility tree and the toast timestamps are read",
|
|
17
|
+
"then": "the priority-to-role mapping holds, the announcement is one-shot, and the timeout is at or above the six second floor",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-20102-2",
|
|
23
|
+
"description": "Given the toast factory (TAC-2101 `renderToast({ priority, body })`), the factory picks the polite wrapper for `info` priority and the assertive wrapper for `error` priority; a factory that writes into both wrappers on one call, or picks the wrong wrapper for a priority, fails at project-side review.",
|
|
24
|
+
"given": "the toast factory",
|
|
25
|
+
"when": "the factory is invoked at a given priority",
|
|
26
|
+
"then": "the correct wrapper receives the toast",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2101-application-notifications-in-app-live-region"],
|
|
32
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
33
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The notification centre inbox surfaces the last N days of notifications and every acknowledge control round-trips to the server",
|
|
8
|
+
"asA": "keyboard-only operator using a shipped rcf-lite application",
|
|
9
|
+
"iWant": "to reach every notification in the centre with Tab, mark items read, mark all read, and acknowledge each item with an activation that round-trips to the server and updates the item on the response",
|
|
10
|
+
"soThat": "I have a durable record of what the shell has said and my acknowledgement is recorded server-side rather than lost on a page reload",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20103-1",
|
|
14
|
+
"description": "Given the notification centre route with a seeded backlog of notifications, the surface lists every notification delivered within the ADR-2103 retention window (thirty days by default). Each notification carries `data-notification-id` on its wrapper element (pack enumerates by that per-element attribute, never by `role=\"listitem\"` on the container alone); each carries a Tab-reachable acknowledge control `[data-action=\"acknowledge\"]` and a Tab-reachable mark-read control `[data-action=\"mark-read\"]`; the surface carries exactly one mark-all-read control `[data-action=\"mark-all-read\"]`. Activating a per-item acknowledge control POSTs `POST /api/notifications/acknowledge` (recorded on `window.__notificationFetches` and at `GET /__requests`), the server responds `200 { ok: true }`, and the item's `data-acknowledged` reads `true` after the response.",
|
|
15
|
+
"given": "the notification centre with a seeded backlog",
|
|
16
|
+
"when": "an acknowledge control is activated by keyboard",
|
|
17
|
+
"then": "the acknowledge round-trips to the server and the DOM updates in response",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-20103-2",
|
|
23
|
+
"description": "Given the centre factory (TAC-2102 `renderCentre`), the factory reads the delivery-attempt log from REQ-005's endpoint and emits one wrapper per row within the retention window; a factory that emits rows older than the retention window, or that skips rows within the window, fails at project-side review.",
|
|
24
|
+
"given": "the centre factory",
|
|
25
|
+
"when": "the delivery log is read",
|
|
26
|
+
"then": "one wrapper is emitted per row within the retention window",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2102-application-notifications-in-app-centre"],
|
|
32
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
33
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20104",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The preferences UI carries one section per operator-elicited category with a labelled silence toggle and one section per sibling channel with a digest opt-in",
|
|
8
|
+
"asA": "operator of a shipped rcf-lite application",
|
|
9
|
+
"iWant": "a preferences surface where I can silence notification categories I no longer want and opt into a digest on a sibling channel that is applied",
|
|
10
|
+
"soThat": "I control my own notification fatigue without asking an admin to turn a category off system-wide",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20104-1",
|
|
14
|
+
"description": "Given the preferences route, the surface renders one section per operator-elicited category (each section carries a `[data-preference-section=\"category\"]` wrapper) with a labelled silence toggle whose control element carries `[data-preference-category=\"<category>\"]` and whose accessible name reads `\"Silence <category> notifications\"`. Activating a silence toggle records the preference at `POST /api/preferences/category` (visible on `window.__notificationFetches`); the server responds and the toggle's `data-silenced` reads `true`.",
|
|
15
|
+
"given": "the preferences route",
|
|
16
|
+
"when": "a silence toggle is activated",
|
|
17
|
+
"then": "the preference is recorded and reflected on the DOM",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-20104-2",
|
|
23
|
+
"description": "Given a preferences surface on a project that has NOT applied any `application-notifications-*` sibling channel blueprint, the digest opt-in section for each sibling channel renders with `[data-preference-status=\"sibling not applied\"]` and the digest opt-in control is disabled (`aria-disabled=\"true\"`); a preferences surface that offers a digest without a corresponding sibling applied is a defect. The pack does not itself drive this (no sibling channels exist on the shelf today); the AC is a mechanism-reach gap the README names for a v1.1 minor bump when the first sibling ships.",
|
|
24
|
+
"given": "a preferences surface on a project without a sibling channel applied",
|
|
25
|
+
"when": "the digest opt-in section is read",
|
|
26
|
+
"then": "the section is disabled and labelled as sibling not applied",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2103-application-notifications-in-app-preferences"],
|
|
32
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
33
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20105",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-005",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The delivery-attempt log records one row per surfaced notification with the operator-readable fields for later inspection",
|
|
8
|
+
"asA": "operator inspecting the notification behaviour of a shipped rcf-lite application",
|
|
9
|
+
"iWant": "one row in the delivery-attempt log per notification the shell surfaced, with the priority, the category and the delivery and acknowledgement timestamps",
|
|
10
|
+
"soThat": "I can reconcile what the shell said with what my operators saw and acknowledged",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20105-1",
|
|
14
|
+
"description": "Given a shipped surface that has surfaced N notifications, `GET /api/delivery-log` returns HTTP 200 with body `{ rows: [...] }` and `rows.length === N`; each row carries `notificationId` (string), `category` (string), `priority` (`\"info\"` or `\"error\"`), `deliveredAt` (ISO-8601 timestamp); a row for a dismissed toast additionally carries `dismissedAt`; a row for an acknowledged centre item additionally carries `acknowledgedAt`. Rows are append-only; a `notificationId` never appears twice on the same page load. The pack does not itself enumerate every row (the delivery log's persistence is delegated to the applied `logging` companion); the AC is a mechanism-reach gap for a v1.1 minor bump when the pack gains a log-shape probe.",
|
|
15
|
+
"given": "a shipped surface after N notifications",
|
|
16
|
+
"when": "the delivery-log endpoint is read",
|
|
17
|
+
"then": "N rows with the operator-readable fields are returned",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-20105-2",
|
|
23
|
+
"description": "Given the delivery-log write factory (TAC-2102 `writeDeliveryRow`), a call from the toast factory and a call from the centre factory both write through the applied `logging` companion's record factory (the row shape lives on this blueprint; the persistence layer lives on the companion). A row written outside the companion's factory bypasses the companion's retention and audit path and is refused at project-side review.",
|
|
24
|
+
"given": "the delivery-log write factory",
|
|
25
|
+
"when": "a toast or centre event surfaces a notification",
|
|
26
|
+
"then": "a row lands through the applied logging companion",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2102-application-notifications-in-app-centre"],
|
|
32
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
33
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
34
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
35
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20106",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A page load on the notification centre with a backlog renders the backlog at load without re-announcing every notification into the polite queue",
|
|
8
|
+
"asA": "screen-reader user opening a notification centre with an existing backlog",
|
|
9
|
+
"iWant": "the backlog to appear on the surface at load without a flood of announcements into the polite live region",
|
|
10
|
+
"soThat": "opening the centre after a long absence does not saturate the assistive-technology announcement queue",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20106-1",
|
|
14
|
+
"description": "Given a page load on the notification centre route with a backlog of unacknowledged notifications from the retention window, the DOM contains one wrapper per backlog notification with `data-notification-id` on each; the polite wrapper `[data-live-region=\"polite\"]` remains empty at load (no backlog announcement); the assertive wrapper `[data-live-region=\"assertive\"]` remains empty at load. A centre implementation that pushes every backlog item into the polite queue on load is a defect.",
|
|
15
|
+
"given": "a page load on the centre route with a backlog",
|
|
16
|
+
"when": "the initial DOM and the live-region wrappers are read",
|
|
17
|
+
"then": "the backlog is rendered on the surface and neither live-region wrapper carries a load-time announcement",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-2102-application-notifications-in-app-centre"],
|
|
23
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
24
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
25
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20107",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A background event drives the same toast contract as an operator-driven event, with indistinguishable output on the accessibility tree",
|
|
8
|
+
"asA": "screen-reader user of a shipped rcf-lite application receiving notifications from server-side events",
|
|
9
|
+
"iWant": "a toast that arrives from a background push to render with the same role mapping, one-shot announcement, and timeout floor as an operator-driven toast",
|
|
10
|
+
"soThat": "my experience is consistent regardless of where the notification originated",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20107-1",
|
|
14
|
+
"description": "Given the sample-app fixture's `POST /__emit` endpoint or an in-page background dispatch, a toast surfaced with priority `info` renders in `[data-live-region=\"polite\"]` with `role=\"status\"` and a toast surfaced with priority `error` renders in `[data-live-region=\"assertive\"]` with `role=\"alert\"` (identical output to a toast surfaced through an operator-driven control). Both toasts record `data-shown-at` and `data-dismissed-at`; both dismiss at or above the six-second timeout floor unless clicked away.",
|
|
15
|
+
"given": "a background event surfacing a toast",
|
|
16
|
+
"when": "the toast DOM is read",
|
|
17
|
+
"then": "the priority-to-role mapping and the one-shot announcement match an operator-driven toast",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-2101-application-notifications-in-app-live-region"],
|
|
23
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
24
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
25
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-notifications-in-app-US-20108",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-notifications-in-app-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Every notification announcement lands in exactly one live region and the two wrappers never carry the same body simultaneously",
|
|
8
|
+
"asA": "screen-reader user of a shipped rcf-lite application",
|
|
9
|
+
"iWant": "each announcement to reach me on exactly one queue (polite for informational, assertive for error), never on both",
|
|
10
|
+
"soThat": "the assistive-technology announcement contract stays clean and I do not hear the same message twice from two queues",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-20108-1",
|
|
14
|
+
"description": "Given any surfaced notification (toast or centre), the notification's body text appears inside exactly one of `[data-live-region=\"polite\"]` or `[data-live-region=\"assertive\"]` at any moment; a notification whose body appears in both wrappers, or a notification whose body appears in the wrong wrapper for its priority (informational text in the assertive wrapper, or error text in the polite wrapper), is a defect. The pack asserts this by scanning both wrappers after each emission and confirming disjoint content.",
|
|
15
|
+
"given": "a surfaced notification",
|
|
16
|
+
"when": "both live-region wrappers are read simultaneously",
|
|
17
|
+
"then": "the body text appears in exactly one wrapper",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-2101-application-notifications-in-app-live-region"],
|
|
23
|
+
"tags": ["blueprint:application-notifications-in-app"],
|
|
24
|
+
"createdAt": "2026-09-04T23:59:00Z",
|
|
25
|
+
"updatedAt": "2026-09-04T23:59:00Z"
|
|
26
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# application-notifications-in-app: coordination vocabulary
|
|
2
|
+
|
|
3
|
+
## Global topics
|
|
4
|
+
|
|
5
|
+
The blueprint claims no new global topics at v1.0.0. The in-app-notifications contract is a composed application shape; every ADR (priority-to-role mapping, toast timeout floor, centre retention window) is non-global.
|
|
6
|
+
|
|
7
|
+
## Deliberately unclaimed topics
|
|
8
|
+
|
|
9
|
+
- `notificationsChannel` (the channel this blueprint owns). Not a global topic; the family-prefix reservation is the discoverable coordination mechanism (see below). A future blueprint that composes across all in-app-adjacent channels (a shared preferences store, for instance) would either share TAC-2103 or supersede this blueprint.
|
|
10
|
+
- `livingRegionMapping` (the priority-to-role mapping). Reserved for the applying project as the ADR-2101 decision, not a global topic; a project that supersedes the mapping authors its own ADR.
|
|
11
|
+
|
|
12
|
+
## Family-prefix reservation
|
|
13
|
+
|
|
14
|
+
The `application-notifications-` prefix is reserved for the sibling channel blueprints the shelf will grow into: `-email`, `-push`, `-webhook`. This is a doc-only reservation in v1.0.0 (per spec Q3 default). No sibling channel ships in this round. See the family-prefix row in the shelf band registry below and the blueprint README's "Family-prefix reservation" section.
|
|
15
|
+
|
|
16
|
+
## Shelf id band and suffix block
|
|
17
|
+
|
|
18
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
19
|
+
|---|---|---|---|---|
|
|
20
|
+
| application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
|
|
21
|
+
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
22
|
+
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
23
|
+
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
24
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
|
|
25
|
+
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
26
|
+
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
27
|
+
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
28
|
+
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
29
|
+
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
30
|
+
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
31
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
32
|
+
| application-notifications-email (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
|
|
33
|
+
| application-notifications-push (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
|
|
34
|
+
| application-notifications-webhook (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
|
|
35
|
+
|
|
36
|
+
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
37
|
+
|
|
38
|
+
## Probe pack
|
|
39
|
+
|
|
40
|
+
`probe-packs/application-notifications-in-app.pack.mjs` ships three checks anchored to blueprint AC ids:
|
|
41
|
+
|
|
42
|
+
- `AC-20101-1` live-region preseeding on every declared route (both wrappers present AND empty at load)
|
|
43
|
+
- `AC-20102-1` transient toast contract with priority-to-role mapping and timeout measured against the six-second WCAG 2.2.1 floor
|
|
44
|
+
- `AC-20103-1` centre acknowledge round-trip enumerated by `data-notification-id`, reconciled through client and server request logs
|
|
45
|
+
|
|
46
|
+
Every check carries a `description` field per spec section 9. `appliesTo` binds `TAC-2101-application-notifications-in-app-live-region` OR any FBS route matching `notifications-centre`. See `probe-packs/application-notifications-in-app.pack.mjs` for the source; see `packages/rcf-lite/test/fixtures/probe-pack-application-notifications-in-app/README.md` for the sample-app fixture and the four negative-run break switches.
|