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,88 @@
|
|
|
1
|
+
# Empty and error states blueprint (v1.0.0)
|
|
2
|
+
|
|
3
|
+
Vendor-neutral empty-and-error-states contract for an rcf-lite application. Ships eight named states, one contract per state: `not-found` (404), `forbidden` (403), `server-error` (500), `offline`, `permission-denied` (403 with a per-resource cause), `empty-list`, `no-search-results`, `error-boundary` (client-side render failure). Each state carries a machine-readable status, a distinct visual, a `role="region"` accessible name, one recovery-action shape from a closed enum, and a polite live-region wrapper for progress and reconnection announcements. Ships a Playwright probe pack under `probe-packs/application-empty-error-states.pack.mjs` whose eight checks each anchor one named state, refuse on the corresponding break switch, and fire against the sample-app fixture on the shelf gate.
|
|
4
|
+
|
|
5
|
+
## Apply
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
rcf define blueprint add <path-to>/blueprints/application-empty-error-states
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Applies 19 contributions (5 REQs, 8 USs, 3 TACs, 3 ADRs) cleanly on any fresh init project. No `requiresAppliedCapabilities`, no auth prerequisite, no elicited-only parameters that block the apply; the two elicits (`ADR-2302` stack-trace visibility and `ADR-2303` offline strategy) carry recommended defaults so the apply proceeds silently and the project can revisit the elicited answers later.
|
|
12
|
+
|
|
13
|
+
## Anatomy
|
|
14
|
+
|
|
15
|
+
| Piece | Where | What |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, `suggestedCompanions: [logging, errorHandling]`, 19 contributions in the 23xx / 22xxx band |
|
|
18
|
+
| Doc set | `contributions/` | 5 REQs, 8 USs (8 runtime-observable ACs), 3 TACs, 3 ADRs |
|
|
19
|
+
| Probe pack | `probe-packs/application-empty-error-states.pack.mjs` | Eight surface-observable browser-verify checks, one per named state |
|
|
20
|
+
| Guide | `guide/application-empty-error-states.md` | Operator-facing: when to reach, when not, mechanism-reach gaps |
|
|
21
|
+
| Coordination vocabulary | `docs/topics.md` | Shelf id band registry update; no new global topics claimed |
|
|
22
|
+
| Sample-app fixture | `packages/rcf-lite/test/fixtures/probe-pack-application-empty-error-states/` | Dependency-free Node HTTP server the pack is probed against on the shelf gate |
|
|
23
|
+
|
|
24
|
+
## The eight named states
|
|
25
|
+
|
|
26
|
+
| State | HTTP status | Recovery shape(s) | Announcement | Region wrapper |
|
|
27
|
+
|---|---|---|---|---|
|
|
28
|
+
| `not-found` | 404 | `parent-surface` + `search` | polite live-region | `[data-surface="not-found"]` |
|
|
29
|
+
| `forbidden` | 403 (no per-resource cause) | `request-access` | polite live-region | `[data-surface="forbidden"]` |
|
|
30
|
+
| `server-error` | 5xx | `retry` | polite live-region | `[data-surface="server-error"]` |
|
|
31
|
+
| `permission-denied` | 403 (class-level cause) | `request-access` | polite live-region | `[data-surface="permission-denied"]` |
|
|
32
|
+
| `offline` | (no HTTP; `navigator.onLine` false) | `retry` (implicit on reconnection) | polite live-region for reconnection | `[data-surface="offline"]` |
|
|
33
|
+
| `empty-list` | 200 (empty array on a listing endpoint) | `create` | polite live-region | `[data-surface="empty-list"]` |
|
|
34
|
+
| `no-search-results` | 200 (empty array on a search endpoint) | `clear-filters` | polite live-region | `[data-surface="no-search-results"]` |
|
|
35
|
+
| `error-boundary` | (no HTTP; caught client-side render exception) | `retry` | `role="alert"` (assertive) | `[data-surface="error-boundary"]` |
|
|
36
|
+
|
|
37
|
+
The eight-state enum is closed at v1.0.0. A ninth state is a v1.1.0 minor bump; a state removed or renamed is a v2.0.0 major.
|
|
38
|
+
|
|
39
|
+
## Recovery-action router
|
|
40
|
+
|
|
41
|
+
The closed set of recovery shapes: `parent-surface`, `search`, `request-access`, `retry`, `create`, `clear-filters`, `no-recovery`. Every rendered state carries at least one. The router refuses to render a state without a legitimate shape; a bare state region without any recovery is a build defect the pack catches.
|
|
42
|
+
|
|
43
|
+
## Offline strategy
|
|
44
|
+
|
|
45
|
+
`ADR-2303` commits to `write-buffer` as the default (IndexedDB, idempotency token per write, monotonic sequence, flush in sequence on reconnection with server-side dedupe). Elicited alternatives: `read-only-banner` and `refuse-writes`. All three shapes render the offline region and the polite reconnection announcement per REQ-005; the difference is only whether writes queue, disable or refuse.
|
|
46
|
+
|
|
47
|
+
## Elicited parameters
|
|
48
|
+
|
|
49
|
+
- **States in scope for v1.** Default: all eight. A project that has not yet shipped offline mode can elicit a reduced set; the pack skips checks whose state is out of scope on that project.
|
|
50
|
+
- **Recovery-action targets per state.** Default: the router's built-ins (parent-surface, search, request-access, retry, create, clear-filters). Projects override the endpoint paths and callbacks per FBS.
|
|
51
|
+
- **Stack-trace visibility in production.** Default: true (hidden). `ADR-2302` elicits an override for staging.
|
|
52
|
+
- **Offline strategy.** Default: `write-buffer`. `ADR-2303` elicits `read-only-banner` or `refuse-writes`.
|
|
53
|
+
|
|
54
|
+
## The one runtime gate
|
|
55
|
+
|
|
56
|
+
`probe-packs/application-empty-error-states.pack.mjs` ships eight checks the `rcf verify browser` runner invokes on any FBS whose surface binds `TAC-2301-application-empty-error-states-state-machine` or whose nav model routes name an operator-configured error-shell path. Each check drives the real Playwright browser the runner provisions, reads the accessibility tree and the DOM, and returns a verdict. URLs are composed by the `withUrl(runtimeUrl, path)` helper per the round 3 T-3 fix train; no bare string concatenation.
|
|
57
|
+
|
|
58
|
+
## Quality bar
|
|
59
|
+
|
|
60
|
+
WCAG 2.2 AA on every state region: 3.3.1 Error Identification (every error state names the error class in the heading), 2.4.6 Headings and Labels (every region carries a heading and an accessible name), 3.2.4 Consistent Identification (every recovery control carries the same `data-recovery` attribute across states), 4.1.3 Status Messages (every progress and reconnection announcement fires through the polite live-region wrapper), 3.3.3 Error Suggestion (the recovery-action prose names the next action, not just the error). HTTP semantics per RFC 9110 for the status-code contract (ADR-2301). ARIA APG alert pattern on `error-boundary`. `standardsTrace` on the blueprint is empty (this is a general-enterprise-practice blueprint); each ADR contribution carries `standardsTraceClause` naming the clause it implements.
|
|
61
|
+
|
|
62
|
+
The 500 surface is a CSP-shape enforcement. `AC-22103-1` reads the rendered surface, tokenises against a bundled sensitive-pattern list (backtrace-frame prefix, source-path shape, environment-variable key shape, framework-internal frame prefix, `process.env.NAME` reference), and refuses when any pattern matches.
|
|
63
|
+
|
|
64
|
+
## Known mechanism-reach gaps
|
|
65
|
+
|
|
66
|
+
Runtime-observable ACs the pack does NOT bind directly (checklist section 6.g), listed individually per AC id:
|
|
67
|
+
|
|
68
|
+
- **AC-22101-1 keyboard-focus-on-recovery.** The pack asserts the parent-surface link and the search entry exist and carry the correct `data-recovery` attribute; it does NOT additionally probe that keyboard focus lands on the recovery control on state entry. A v1.1.0 minor bump can drive the browser's accessibility tree and assert focus placement.
|
|
69
|
+
- **AC-22102-1 request-access transport round-trip.** The pack asserts the `[data-action="request-access"]` control exists; it does NOT additionally exercise the POST round-trip and assert the applied notification centre receives the submission. A v1.1.0 minor bump can invoke the click path and inspect the network request log.
|
|
70
|
+
- **AC-22103-1 non-production staging branch.** The pack drives the production branch (`?break=stack-trace` is the negative run for the production posture); the elicited staging-visible branch (`ADR-2302`) is present on the fixture through the same break switch but the pack does not additionally probe the staging-legitimate render.
|
|
71
|
+
- **AC-22104-1 cause-string vocabulary registry.** The pack asserts the class-level cause is present and refuses when a resource-id shape appears; it does NOT additionally cross-check the cause string against a project-side vocabulary registry. A v1.1.0 minor bump can read a project-declared vocabulary file and diff.
|
|
72
|
+
- **AC-22105-1 write-buffer flush order.** The pack asserts a synthetic buffered write is enumerable on `window.__offlineBuffer` and that the polite reconnection announcement fires; it does NOT additionally probe that a multi-entry buffer flushes in sequence with per-entry retry counters. A v1.1.0 minor bump can seed a multi-entry buffer and drive the flush loop.
|
|
73
|
+
- **AC-22106-1 empty-list distinction from loading.** The pack asserts the `[data-visual="empty-list"]` wrapper is present; it does NOT additionally probe that the wrapper is distinct from `[data-visual="loading"]` and `[data-visual="loaded"]` on the same route. A v1.1.0 minor bump can drive the loading branch and diff the wrapper attributes.
|
|
74
|
+
- **AC-22107-1 clear-filters callback shape.** The pack asserts the `[data-recovery="clear-filters"]` control exists and echoes the query; it does NOT additionally exercise the callback and assert the search parameters are removed from the URL. A v1.1.0 minor bump can drive the click path and inspect the resulting URL.
|
|
75
|
+
- **AC-22108-1 boundary retry re-mounts the component.** The pack asserts the `role="alert"` region and the retry control exist; it does NOT additionally probe that the retry re-mounts the crashed component subtree. A v1.1.0 minor bump can drive the click path and inspect the DOM diff.
|
|
76
|
+
|
|
77
|
+
## Companions
|
|
78
|
+
|
|
79
|
+
`suggestedCompanions` declares `logging` (every rendered error state writes one request-scoped log line with the correlation identifier the applied logger factory returns) and `errorHandling` (the error-boundary state constructs an internal error record from the caught exception through the applied error-handling factory). Neither is required to apply the blueprint; a project without a logging companion still ships every state region, it just does not emit a per-state log line.
|
|
80
|
+
|
|
81
|
+
## Consumers
|
|
82
|
+
|
|
83
|
+
- `application-forms-wizard` (T-3 of this round) consumes the empty-list state as its "no in-progress forms" surface; the wizard's empty branch delegates to this blueprint's TAC-2301 state machine.
|
|
84
|
+
- `application-account-settings` (T-4 of this round) consumes the access-denied path (forbidden and permission-denied) for its scope-gated settings sections and the empty-list state for its empty-history surfaces.
|
|
85
|
+
|
|
86
|
+
## Composition with application-spa
|
|
87
|
+
|
|
88
|
+
`application-spa` REQ-006 ships empty, loading, error, banner and alert components as part of its component library. This blueprint composes with SPA; the topic-ownership boundary lives in `docs/topics.md`. SPA owns the tab-title convention and the state-visual tokens; this sibling owns the state list, the recovery-action router and the runtime enforcement pack.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "application-empty-error-states",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"category": "application",
|
|
5
|
+
"suggestedCompanions": [
|
|
6
|
+
{
|
|
7
|
+
"role": "logging",
|
|
8
|
+
"reason": "Every rendered error state writes one request-scoped log line with the correlation identifier; a logging companion supplies the factory the pipeline calls."
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"role": "errorHandling",
|
|
12
|
+
"reason": "The error-boundary state constructs an internal error record from the caught exception; an error-handling companion supplies the factory and the boundary."
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"contributions": [
|
|
16
|
+
{
|
|
17
|
+
"id": "application-empty-error-states-REQ-001",
|
|
18
|
+
"kind": "req",
|
|
19
|
+
"path": "requirements/application-empty-error-states-req-001.json"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "application-empty-error-states-REQ-002",
|
|
23
|
+
"kind": "req",
|
|
24
|
+
"path": "requirements/application-empty-error-states-req-002.json"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "application-empty-error-states-REQ-003",
|
|
28
|
+
"kind": "req",
|
|
29
|
+
"path": "requirements/application-empty-error-states-req-003.json"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "application-empty-error-states-REQ-004",
|
|
33
|
+
"kind": "req",
|
|
34
|
+
"path": "requirements/application-empty-error-states-req-004.json"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "application-empty-error-states-REQ-005",
|
|
38
|
+
"kind": "req",
|
|
39
|
+
"path": "requirements/application-empty-error-states-req-005.json"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "application-empty-error-states-US-22101",
|
|
43
|
+
"kind": "us",
|
|
44
|
+
"path": "user-stories/application-empty-error-states-us-22101.json"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "application-empty-error-states-US-22102",
|
|
48
|
+
"kind": "us",
|
|
49
|
+
"path": "user-stories/application-empty-error-states-us-22102.json"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "application-empty-error-states-US-22103",
|
|
53
|
+
"kind": "us",
|
|
54
|
+
"path": "user-stories/application-empty-error-states-us-22103.json"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "application-empty-error-states-US-22104",
|
|
58
|
+
"kind": "us",
|
|
59
|
+
"path": "user-stories/application-empty-error-states-us-22104.json"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "application-empty-error-states-US-22105",
|
|
63
|
+
"kind": "us",
|
|
64
|
+
"path": "user-stories/application-empty-error-states-us-22105.json"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "application-empty-error-states-US-22106",
|
|
68
|
+
"kind": "us",
|
|
69
|
+
"path": "user-stories/application-empty-error-states-us-22106.json"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "application-empty-error-states-US-22107",
|
|
73
|
+
"kind": "us",
|
|
74
|
+
"path": "user-stories/application-empty-error-states-us-22107.json"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "application-empty-error-states-US-22108",
|
|
78
|
+
"kind": "us",
|
|
79
|
+
"path": "user-stories/application-empty-error-states-us-22108.json"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "TAC-2301-application-empty-error-states-state-machine",
|
|
83
|
+
"kind": "tac",
|
|
84
|
+
"path": "tacs/tac-2301-application-empty-error-states-state-machine.json"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "TAC-2302-application-empty-error-states-recovery-router",
|
|
88
|
+
"kind": "tac",
|
|
89
|
+
"path": "tacs/tac-2302-application-empty-error-states-recovery-router.json"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "TAC-2303-application-empty-error-states-offline-buffer",
|
|
93
|
+
"kind": "tac",
|
|
94
|
+
"path": "tacs/tac-2303-application-empty-error-states-offline-buffer.json"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "ADR-2301-application-empty-error-states-status-contract",
|
|
98
|
+
"kind": "adr",
|
|
99
|
+
"path": "adrs/adr-2301-application-empty-error-states-status-contract.json",
|
|
100
|
+
"recommendedDefault": true,
|
|
101
|
+
"standardsTraceClause": "RFC 9110"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "ADR-2302-application-empty-error-states-stack-trace-visibility",
|
|
105
|
+
"kind": "adr",
|
|
106
|
+
"path": "adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json",
|
|
107
|
+
"recommendedDefault": true,
|
|
108
|
+
"elicited": true,
|
|
109
|
+
"standardsTraceClause": "OWASP ASVS V7 error handling"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"id": "ADR-2303-application-empty-error-states-offline-strategy",
|
|
113
|
+
"kind": "adr",
|
|
114
|
+
"path": "adrs/adr-2303-application-empty-error-states-offline-strategy.json",
|
|
115
|
+
"elicited": true,
|
|
116
|
+
"standardsTraceClause": "generic enterprise practice"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2301-application-empty-error-states-status-contract",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "HTTP status to rendered state mapping follows RFC 9110 semantics",
|
|
8
|
+
"context": "The blueprint dispatches states from HTTP responses. There are three plausible mappings from status to rendered state: honour RFC 9110 semantics verbatim (404 to not-found, 403 to forbidden, 5xx to server-error, empty 200 to empty-list or no-search-results depending on the endpoint kind); collapse all client errors into a single generic client-error state; or lean on a bespoke response-body flag the server includes to name the state. The first is the least-surprising choice for a shelf blueprint whose surfaces will be composed with vendor libraries that emit plain HTTP; the second loses the affordances (parent-surface link on 404, request-access on 403) that make the state useful; the third couples the client tightly to a server contract the shelf does not otherwise mint.",
|
|
9
|
+
"decision": "Adopt RFC 9110 semantics verbatim as the state-machine's status mapping. 404 dispatches not-found; 403 dispatches forbidden by default and permission-denied when the response body carries a class-level cause string; 5xx dispatches server-error. An empty 200 response body on a listing endpoint dispatches empty-list; an empty 200 on a search endpoint (identified by a q query parameter or an FBS-declared search route) dispatches no-search-results. This mapping is the recommendedDefault per the ADR contribution field.",
|
|
10
|
+
"consequences": "Projects composing REST APIs that already answer RFC 9110 status codes get the state dispatch for free. Projects using an RPC-style API layer must wrap their transport in a small adapter that raises the plain status code. The state machine remains stable across vendor libraries (fetch, axios, tRPC clients, GraphQL error-code conventions that project the transport-level status) because the contract is on the status number the machine reads, not on a bespoke body flag.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Collapse client errors into one generic state",
|
|
14
|
+
"summary": "Route every 4xx into a single client-error state with a generic recovery.",
|
|
15
|
+
"reasonNotChosen": "Loses the four recovery-shape specialisations (parent-surface on 404, request-access on 403, retry on 5xx, clear-filters on no-search-results) that make the state actionable and forces every recovery through a generic retry."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Bespoke response-body state-name field",
|
|
19
|
+
"summary": "Require every response body to carry a stateName string the machine reads.",
|
|
20
|
+
"reasonNotChosen": "Couples the shelf blueprint tightly to a server contract the shelf does not otherwise mint; a vendor library returning plain HTTP would be unsupported by default."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
24
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2302-application-empty-error-states-stack-trace-visibility",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "The server-error state hides stack traces, source paths and environment-variable keys in production",
|
|
8
|
+
"context": "The 5xx state is the most tempting surface for a debug leak because a stack trace is the first thing a developer would like on-screen when something breaks. In production the same surface is a probing target for an attacker: a stack trace names framework versions and internal frame layouts; a source path names filesystem structure; an environment-variable key shape names the deploy environment's configuration surface. Staging environments legitimately want the debug detail; production does not.",
|
|
9
|
+
"decision": "In production the server-error state renders a plain summary line and a retry recovery hook only. The rendered surface refuses any word matching the sensitive-pattern list: backtrace-frame prefixes (\"at <fn>(<file>:<line>:<col>)\" and variants), source paths (leading /, ./, ../), environment-variable key shape (NAME= or process.env.NAME references), and framework-internal frame prefixes. In non-production environments (staging, local) the elicited stack-trace-visible parameter may flip the guard off; the pack still fires on staging so a leak that reaches production is caught before ship. recommendedDefault is true; elicited is true so the operator can flip the guard for staging or for a build that renders the debug region behind a role gate.",
|
|
10
|
+
"consequences": "Projects on the recommended default get the least-privilege posture with no configuration. Projects that want a debug region in staging author the elicited toggle and add a role-gated debug region behind an operator scope. The pack fires on both branches with the appropriate expectation. A production build that ships with the toggle flipped on refuses the ship gate through this pack's AC-22103-1.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Always render the stack trace",
|
|
14
|
+
"summary": "Ship the full stack trace in every environment, on the theory that the operator will see it before an attacker does.",
|
|
15
|
+
"reasonNotChosen": "In practice an attacker triggers 5xx surfaces at will (bad payloads, malformed routes); the stack trace ships to their browser too. The debug value in production is negligible compared to the leak."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Server-side redaction only",
|
|
19
|
+
"summary": "Rely on the server to strip the stack trace before it reaches the client.",
|
|
20
|
+
"reasonNotChosen": "The client-side error boundary also renders 5xx surfaces from caught JS exceptions that never touched the server; a server-side redactor cannot cover the client boundary."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
24
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2303-application-empty-error-states-offline-strategy",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Offline strategy is write-buffer by default with elicited alternatives for read-only-banner and refuse-writes",
|
|
8
|
+
"context": "Applications differ on what they want to do while offline. A note-taking application wants a write-buffer so the operator keeps working. A financial application wants to refuse writes altogether because a queued write against stale server state is worse than a hard fail. A dashboard application wants a read-only banner and refuses writes silently. There is no single sensible default; the shelf blueprint commits to one and elicits the two alternatives.",
|
|
9
|
+
"decision": "Default is write-buffer per TAC-2303: writes queue to IndexedDB with an idempotency token and flush on reconnection with server-side dedupe. Elicited alternatives are read-only-banner (the surface renders a banner and every write control disables) and refuse-writes (every write attempt fails locally with a clear message; nothing queues). The elicited answer lives on the applied-blueprint sidecar and the state machine reads it on offline entry. elicited is true; recommendedDefault stays false because the choice is genuinely per-project.",
|
|
10
|
+
"consequences": "Projects that want the write-buffer get the default with no configuration; the pack drives an offline probe and asserts window.__offlineBuffer is populated. Projects electing read-only-banner get a simpler UI at the cost of losing the operator's in-flight writes. Projects electing refuse-writes get the strictest posture with the clearest failure mode. All three shapes render the offline region and the polite reconnection announcement per REQ-005; the difference is only whether writes queue, disable or refuse.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Force refuse-writes as the default",
|
|
14
|
+
"summary": "Refuse every offline write locally; no buffer; no queue.",
|
|
15
|
+
"reasonNotChosen": "Loses the operator's in-flight work every time the network drops for a few seconds; the most common failure mode (transient loss) becomes the most painful."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Server-side sync engine",
|
|
19
|
+
"summary": "Ship a CRDT or event-sourced sync engine as part of this blueprint.",
|
|
20
|
+
"reasonNotChosen": "Outside the shelf blueprint's scope (this is a UI-state blueprint, not a persistence blueprint); belongs to a future persistence-sync-engine blueprint if the shelf grows one."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
24
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-empty-error-states-REQ-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "State catalogue: the eight named empty and error states, each with a machine-readable status and a distinct visual",
|
|
5
|
+
"description": "The application realises eight named empty and error states, one contract per state: not-found (HTTP 404 on an unknown resource), forbidden (HTTP 403 on an authenticated principal without scope), server-error (HTTP 5xx on an internal failure), offline (navigator.onLine false), permission-denied (HTTP 403 with a per-resource cause), empty-list (a listing endpoint returned an empty array), no-search-results (a search or filter yielded zero rows), error-boundary (a client-side render exception caught by the SPA boundary). Each state carries a machine-readable status (statusCode for HTTP-triggered states, a well-known token for client-triggered states) and a distinct visual so a screenshot review reader can tell them apart at a glance. Vendor-neutral: the blueprint contributes WHAT surfaces under WHAT condition, not the visual design.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.1, REQ 1.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-empty-error-states",
|
|
12
|
+
"category:01-state-catalogue"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-empty-error-states-REQ-002",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Recovery-action contract per state: parent-surface link, search entry, request-access flow, retry hook",
|
|
5
|
+
"description": "Every rendered state carries at least one recovery action. The recovery-action router maps each named state to one of a fixed four action shapes: parent-surface (a link back up the resource hierarchy, used by not-found and empty-list), search (a search entry, used by not-found and no-search-results), request-access (a POST to a well-known request-access endpoint the applied notification centre can surface, used by forbidden and permission-denied), retry (a client-side re-issue of the failed operation, used by server-error and offline). The router refuses to render a state without a recovery action; a state whose applied surface has no legitimate recovery renders an explicit no-recovery notice with the reason.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.1, REQ 2.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-empty-error-states",
|
|
12
|
+
"category:02-recovery-router"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-empty-error-states-REQ-003",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Announcement contract: role region per state, aria-live polite for progress and reconnection, screen-reader traversal order",
|
|
5
|
+
"description": "Every rendered state region carries role=\"region\" with an accessible name naming the state (WCAG 2.4.6 Headings and Labels). Progress announcements (retry attempt, reconnection to server) fire through an aria-live=\"polite\" live-region wrapper (WCAG 4.1.3 Status Messages). Screen-reader traversal order is: state heading first, then the recovery action, then any secondary detail; keyboard focus lands on the recovery control on state entry so a keyboard user reaches recovery in one tab. The error-boundary state announces via role=\"alert\" (assertive) rather than polite because the client render failed and the operator has no context.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.1, REQ 3.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-empty-error-states",
|
|
12
|
+
"category:03-announcement"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-empty-error-states-REQ-004",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Server-error surface: no stack trace in production, no resource-id leak on forbidden per least-privilege posture",
|
|
5
|
+
"description": "The server-error (5xx) state renders in production mode without a stack trace, without a source file path, without any environment-variable key shape (VARNAME=value or process.env.NAME references), and without any framework internal frame prefix. The pack refuses when any word in a bundled sensitive-pattern list matches the rendered surface (path-shape strings, backtrace-frame prefixes, environment-variable key shape). The forbidden (403) and permission-denied (403 with cause) states render without the resource id, without the resource name and without the server-side path so a principal without scope cannot infer resource existence from the error surface. A staging environment override is available via ADR-2302 elicitation.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.1, REQ 4. Second risk clause in the round-4 spec calls for a CSP-shape enforcement on the 500 surface.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-empty-error-states",
|
|
12
|
+
"category:04-least-privilege"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-empty-error-states-REQ-005",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Offline state: write-buffer contract, navigator.onLine reconnection announcement, per-write reconciliation semantics",
|
|
5
|
+
"description": "When navigator.onLine reports false the offline state renders with a read-only banner naming the offline mode. Queued writes buffer to an applied local buffer (IndexedDB by default, an elicited alternative per ADR-2303) with an idempotency token per write, a serialised payload, and a monotonically increasing sequence. On reconnection (navigator.onLine true) the offline state announces through the polite live-region wrapper the applied notifications-in-app blueprint has preseeded; queued writes flush in sequence, each with the same idempotency token so a server-side dedupe rejects a re-issue. Per-write reconciliation semantics: on flush success the surface clears the buffer entry; on flush failure the entry is retained with a retry counter and the surface renders a per-write error banner.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.1, REQ 5.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-empty-error-states",
|
|
12
|
+
"category:05-offline"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2301-application-empty-error-states-state-machine",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Empty and error state machine",
|
|
8
|
+
"purpose": "Owns the mapping from an FBS surface render (a routed page, a listing surface, a search surface, a client-side render) to the eight named empty and error states and from each state to a recovery-action shape. Reads the runtime signals (HTTP status code, response body shape, navigator.onLine, caught render exception) and dispatches the correct state region plus the correct recovery shape. Every AC in this blueprint anchors on this TAC.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Map HTTP 404 to not-found, 403 to forbidden or permission-denied (see internalStructure), 5xx to server-error, and empty-array response bodies to empty-list or no-search-results (see internalStructure) (AC-22101-1 through AC-22104-1, AC-22106-1, AC-22107-1).",
|
|
11
|
+
"Map navigator.onLine false to offline and the reconnect signal to the polite reconnection announcement (AC-22105-1).",
|
|
12
|
+
"Map a caught client-side render exception to error-boundary announced through role=\"alert\" (AC-22108-1).",
|
|
13
|
+
"Delegate every recovery action to the recovery-action router (TAC-2302) and every offline buffer operation to the offline-buffer TAC (TAC-2303)."
|
|
14
|
+
],
|
|
15
|
+
"internalStructure": "One state-machine module the shell mounts on route entry. On response, the machine reads the HTTP status code plus the response body shape: a 403 with a per-resource cause routes to permission-denied, a bare 403 routes to forbidden; a 200 with an empty array on a search endpoint (route carries a q query parameter) routes to no-search-results, a 200 with an empty array on a listing endpoint routes to empty-list. On navigator.onLine transitions the machine dispatches offline entry and reconnection through the polite live-region wrapper. On a caught render exception (the SPA error boundary) the machine dispatches error-boundary through the assertive alert wrapper. Every dispatch writes the state name into the rendered region as an accessible name and delegates the recovery action to the recovery router. The framework is not prescribed; the machines interfaces are what the project realises against React, Vue, Svelte or vanilla DOM.",
|
|
16
|
+
"interfaces": [
|
|
17
|
+
{
|
|
18
|
+
"name": "renderState",
|
|
19
|
+
"kind": "factory",
|
|
20
|
+
"description": "renderState({ statusCode, responseBody, route, onLine, caughtException }) -> { stateName, recoveryShape, regionProps }. The project supplies the runtime signals; the machine returns the state name, the recovery shape the router will realise, and the region props (role, aria-live level, accessible name)."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "statesEnum",
|
|
24
|
+
"kind": "shape",
|
|
25
|
+
"description": "The eight named states are the closed enum { not-found, forbidden, server-error, offline, permission-denied, empty-list, no-search-results, error-boundary }. A ninth state is a blueprint minor bump (see CHANGELOG)."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"dependencies": [
|
|
29
|
+
{
|
|
30
|
+
"name": "Recovery-action router",
|
|
31
|
+
"kind": "tac",
|
|
32
|
+
"tacId": "TAC-2302-application-empty-error-states-recovery-router",
|
|
33
|
+
"description": "The state machine hands every rendered state's recovery shape to the router."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "Offline write-buffer",
|
|
37
|
+
"kind": "tac",
|
|
38
|
+
"tacId": "TAC-2303-application-empty-error-states-offline-buffer",
|
|
39
|
+
"description": "The offline entry dispatches through the write-buffer TAC."
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"tradeoffs": "One state-machine module keeps the mapping deterministic and lint-checkable but ties every state to a runtime signal the project must expose. Projects that route through a framework's own boundary primitive (React error boundary, Vue errorCaptured) wire the machine into that primitive rather than replacing it. Known mechanism-reach gap: the machine cannot prove keyboard focus lands on the recovery control in every framework's rendering; the pack asserts the control is reachable, project-side smoke tests supplement.",
|
|
43
|
+
"notes": "See README Known mechanism-reach gaps for the full list.",
|
|
44
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
45
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
46
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2302-application-empty-error-states-recovery-router",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Recovery-action router",
|
|
8
|
+
"purpose": "Owns the mapping from a state's recovery shape (parent-surface, search, request-access, retry, create, clear-filters) to a concrete rendered control on the state region. The router is the second layer under the state machine; every state that renders passes its recovery shape through the router.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Realise the parent-surface shape as a link with data-recovery=\"parent-surface\" whose href points to the FBS-declared parent path (AC-22101-1, AC-22106-1 when the empty-list has a parent).",
|
|
11
|
+
"Realise the search shape as a search entry with data-recovery=\"search\" (AC-22101-1, AC-22107-1).",
|
|
12
|
+
"Realise the request-access shape as a button with data-action=\"request-access\" that POSTs to the FBS-configured request-access endpoint (AC-22102-1, AC-22104-1).",
|
|
13
|
+
"Realise the retry shape as a button with data-recovery=\"retry\" that re-issues the failed operation (AC-22103-1, AC-22105-1, AC-22108-1).",
|
|
14
|
+
"Realise the create shape as a link or button with data-recovery=\"create\" (AC-22106-1) and the clear-filters shape as a button with data-recovery=\"clear-filters\" (AC-22107-1)."
|
|
15
|
+
],
|
|
16
|
+
"internalStructure": "One router module the state machine hands each state's recovery shape. The router reads the FBS-configured parent path, request-access endpoint and clear-filters callback and constructs the rendered control. Refuses to render a state without a legitimate recovery shape (an authored no-recovery notice is a legitimate shape; a bare state region without any recovery is a build defect).",
|
|
17
|
+
"interfaces": [
|
|
18
|
+
{
|
|
19
|
+
"name": "renderRecovery",
|
|
20
|
+
"kind": "factory",
|
|
21
|
+
"description": "renderRecovery({ shape, config }) -> { element, dataRecoveryAttr, dataActionAttr }. shape is one of parent-surface, search, request-access, retry, create, clear-filters, no-recovery. config carries the FBS-declared paths and callbacks the router needs."
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"dependencies": [
|
|
25
|
+
{
|
|
26
|
+
"name": "State machine",
|
|
27
|
+
"kind": "tac",
|
|
28
|
+
"tacId": "TAC-2301-application-empty-error-states-state-machine",
|
|
29
|
+
"description": "The router runs downstream of the state machine's dispatch."
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"tradeoffs": "A closed set of recovery shapes keeps the state matrix testable but constrains projects that want a bespoke recovery flow to compose a wider shape as no-recovery with a project-side custom region. A future v1.1.0 minor bump can add a request-access-inline shape (inline form rather than a POST) when demand warrants.",
|
|
33
|
+
"notes": "The recovery-shape enum is closed at v1: parent-surface, search, request-access, retry, create, clear-filters, no-recovery. A new shape is a blueprint minor bump.",
|
|
34
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
35
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
36
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2303-application-empty-error-states-offline-buffer",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Offline write-buffer",
|
|
8
|
+
"purpose": "Owns the buffering and reconciliation contract for writes attempted while navigator.onLine is false. Every buffered write carries an idempotency token, a serialised payload and a monotonic sequence; on reconnection the buffer flushes in sequence and the server dedupes on the idempotency token.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Persist every buffered write to the applied local buffer (IndexedDB by default per ADR-2303, an elicited alternative for projects that need it) with an idempotency token, serialised payload and sequence (AC-22105-1).",
|
|
11
|
+
"Expose window.__offlineBuffer as a read-only enumeration for the pack and for project-side smoke tests (AC-22105-1).",
|
|
12
|
+
"Announce buffered-write count changes through the polite live-region wrapper on entry and on reconnection (AC-22105-1 via TAC-2301).",
|
|
13
|
+
"On reconnection, flush the buffer in sequence, retain the entry on flush failure with a retry counter, and clear the entry on flush success."
|
|
14
|
+
],
|
|
15
|
+
"internalStructure": "One buffer module the state machine invokes on offline entry and exit. The buffer wraps the applied storage engine (default IndexedDB via a small adapter interface, elicited alternatives per ADR-2303) with a serialise/deserialise pair and a monotonic counter. The reconciliation loop is idempotent: replaying the flush against the same buffer produces the same server-side effect.",
|
|
16
|
+
"interfaces": [
|
|
17
|
+
{
|
|
18
|
+
"name": "bufferWrite",
|
|
19
|
+
"kind": "factory",
|
|
20
|
+
"description": "bufferWrite({ payload, idempotencyToken }) -> { sequence }. Persists the write, returns the sequence assigned. The idempotency token is caller-supplied so the server-side dedupe key is stable across retries."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "flushBuffer",
|
|
24
|
+
"kind": "factory",
|
|
25
|
+
"description": "flushBuffer({ onSuccess, onFailure }) -> { flushed, retained }. Called on reconnection; iterates the buffer in sequence, calling onSuccess or onFailure per entry."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"dependencies": [
|
|
29
|
+
{
|
|
30
|
+
"name": "State machine",
|
|
31
|
+
"kind": "tac",
|
|
32
|
+
"tacId": "TAC-2301-application-empty-error-states-state-machine",
|
|
33
|
+
"description": "The state machine dispatches offline entry and reconnection into this buffer."
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"tradeoffs": "IndexedDB by default is available in every modern browser but requires the applied surface to run in a browser context (not a WebView with a locked-down storage policy). Projects on a stripped WebView elicit an alternative via ADR-2303. Retention semantics on flush failure are per-write; a global give-up threshold is a project-side concern and not part of the v1 contract.",
|
|
37
|
+
"notes": "The buffer is a runtime-observable contract; the pack drives an offline probe with a synthetic write and asserts window.__offlineBuffer is populated.",
|
|
38
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
39
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-empty-error-states-US-22101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The not-found state renders with a naming heading, a parent-surface recovery link, a search entry and a tab title carrying the state name",
|
|
8
|
+
"asA": "operator following a stale or mistyped link into the application",
|
|
9
|
+
"iWant": "the not-found state to render with a heading naming the missing resource kind, a recovery link back up to the parent surface and a search entry, and a tab title reading Not found - <app>",
|
|
10
|
+
"soThat": "I can name the resource I asked for, walk back up the resource hierarchy or search for the right one, and my browser tab distinguishes this state from the loaded surface",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22101-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given a 404 response on a route the SPA declares, the not-found state renders inside a role=\"region\" with an accessible name naming the missing resource kind, a keyboard-reachable recovery link to the parent surface with data-recovery=\"parent-surface\", a search entry with data-recovery=\"search\", and the browser tab title matches /^Not found - .+/. The pack drives the real browser to /probe/not-found and reads all four surface tokens."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2301-application-empty-error-states-state-machine",
|
|
21
|
+
"TAC-2302-application-empty-error-states-recovery-router"
|
|
22
|
+
],
|
|
23
|
+
"tags": [
|
|
24
|
+
"blueprint:application-empty-error-states",
|
|
25
|
+
"state:not-found"
|
|
26
|
+
],
|
|
27
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
28
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-empty-error-states-US-22102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The forbidden state renders with a request-access control and refuses to surface a resource id, resource name or path shape",
|
|
8
|
+
"asA": "authenticated operator without scope on a resource",
|
|
9
|
+
"iWant": "the forbidden state to render with a request-access control routing to the applied notification centre and no resource-identifying content on the rendered surface",
|
|
10
|
+
"soThat": "I have a legitimate recovery path and I cannot infer the existence of a resource I am not authorised to see",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22102-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given a 403 response, the forbidden state renders inside role=\"region\" with a keyboard-reachable [data-action=\"request-access\"] control that POSTs to /api/request-access. The rendered surface does NOT contain any word matching the sensitive-pattern list (resource id shape, resource name shape, path-shape strings starting with /). The pack drives /probe/forbidden and reads the region, the control, and the full document text for pattern hits."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2301-application-empty-error-states-state-machine",
|
|
21
|
+
"TAC-2302-application-empty-error-states-recovery-router"
|
|
22
|
+
],
|
|
23
|
+
"tags": [
|
|
24
|
+
"blueprint:application-empty-error-states",
|
|
25
|
+
"state:forbidden"
|
|
26
|
+
],
|
|
27
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
28
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-empty-error-states-US-22103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The server-error state renders in production without a stack trace, without a source path and without an environment-variable key shape",
|
|
8
|
+
"asA": "operator hitting an internal failure",
|
|
9
|
+
"iWant": "the 5xx state to render a plain summary with a retry recovery hook and no server implementation detail",
|
|
10
|
+
"soThat": "I get a legible failure without a leak that would help an attacker probe the server",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22103-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given a mocked 500 response, the server-error state renders inside role=\"region\" with a keyboard-reachable [data-recovery=\"retry\"] control; the rendered surface does NOT contain any word matching the sensitive-pattern list (backtrace-frame prefix like \"at \" plus function name plus file colon line, a source path starting with / or ./ or ../, an environment-variable key shape NAME= or process.env.NAME, or a framework-internal frame prefix). The pack drives /probe/server-error and greps the document text against the pattern list."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2301-application-empty-error-states-state-machine",
|
|
21
|
+
"TAC-2302-application-empty-error-states-recovery-router"
|
|
22
|
+
],
|
|
23
|
+
"tags": [
|
|
24
|
+
"blueprint:application-empty-error-states",
|
|
25
|
+
"state:server-error"
|
|
26
|
+
],
|
|
27
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
28
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
29
|
+
}
|