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,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-empty-error-states-US-22104",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The permission-denied state names a class-level cause and never the per-resource id",
|
|
8
|
+
"asA": "authenticated operator hitting a 403 with a per-resource cause",
|
|
9
|
+
"iWant": "the permission-denied state to render a class-level cause string (for example \"admin scope required\") not the resource id",
|
|
10
|
+
"soThat": "I get an actionable class-level explanation and no resource identifier leaks into the surface",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22104-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given a mocked 403 response with a per-resource cause, the permission-denied state renders inside role=\"region\" with a class-level cause string (matches /^[A-Za-z][A-Za-z0-9 ]+$/ with no digits-run of four or more) and a [data-action=\"request-access\"] control. The pack drives /probe/permission-denied, reads the cause string, and refuses when the string contains a resource-id shape (four or more consecutive digits, or a UUID pattern, or a slug-shape id preceded by resource identifiers like \"resource=\" or \"id=\")."
|
|
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:permission-denied"
|
|
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-22105",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-005",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The offline state renders on navigator.onLine false, buffers a synthetic write, and announces reconnection through a polite live-region wrapper",
|
|
8
|
+
"asA": "operator whose network drops mid-session",
|
|
9
|
+
"iWant": "the offline state to render with a read-only banner, my writes to buffer locally with an idempotency token, and a polite reconnection announcement when the network comes back",
|
|
10
|
+
"soThat": "I keep working through a network drop and my writes flush cleanly with no duplicates when the network returns",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22105-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given navigator.onLine simulated false via the runtime seam (page.setOffline(true) on the project route, an offline endpoint on the sample-app route the pack uses instead), the offline state renders inside role=\"region\" with a read-only banner naming offline mode. A synthetic write buffers to window.__offlineBuffer with an idempotency token and a monotonic sequence. On the reconnect signal (navigator.onLine true or the sample-app /probe/offline?reconnect route) the polite live-region wrapper with data-live-region=\"polite\" carries a reconnection announcement. The pack drives /probe/offline, reads the banner, the buffer entry and the polite wrapper text."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2301-application-empty-error-states-state-machine",
|
|
21
|
+
"TAC-2303-application-empty-error-states-offline-buffer"
|
|
22
|
+
],
|
|
23
|
+
"tags": [
|
|
24
|
+
"blueprint:application-empty-error-states",
|
|
25
|
+
"state:offline"
|
|
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-22106",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The empty-list state renders with a distinct visual and a creation-affordance recovery control",
|
|
8
|
+
"asA": "operator opening a listing surface that has no rows",
|
|
9
|
+
"iWant": "the empty-list state to render with a distinct visual and a creation-affordance recovery control",
|
|
10
|
+
"soThat": "I know the surface loaded successfully and my next action is to create the first row, not to reload",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22106-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given a listing endpoint returning an empty array, the empty-list state renders inside role=\"region\" with a data-visual=\"empty-list\" wrapper (distinct from data-visual=\"loading\" and data-visual=\"loaded\") and a keyboard-reachable [data-recovery=\"create\"] control. The pack drives /probe/empty-list, reads the region and the wrapper attribute, and asserts the recovery control exists and carries an accessible name."
|
|
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:empty-list"
|
|
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-22107",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The no-search-results state renders with a distinct visual and a clear-filters recovery control",
|
|
8
|
+
"asA": "operator running a search or filter that yields zero rows",
|
|
9
|
+
"iWant": "the no-search-results state to render with a distinct visual and a clear-filters recovery control",
|
|
10
|
+
"soThat": "I distinguish this state from empty-list and my next action is to widen the query, not to create a row",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22107-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given a search or filter yielding zero rows, the no-search-results state renders inside role=\"region\" with a data-visual=\"no-search-results\" wrapper distinct from empty-list, echoing the query terms verbatim inside a data-query wrapper, and a keyboard-reachable [data-recovery=\"clear-filters\"] control that removes the search parameters on click. The pack drives /probe/search?q=needle, reads the region, the wrapper attribute, the echoed query and the recovery control."
|
|
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:no-search-results"
|
|
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-22108",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-empty-error-states-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The error-boundary state renders on a client-side render failure with a role=alert announcement",
|
|
8
|
+
"asA": "operator hitting a client-side render exception",
|
|
9
|
+
"iWant": "the error-boundary state to render inside role=\"alert\" with a retry recovery hook and no stack detail",
|
|
10
|
+
"soThat": "the assistive tech announces the failure immediately (assertive, not polite) and I have an escape from a broken render",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-22108-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "Given a synthetic client-side render exception thrown via page.evaluate (or the sample-app /probe/error-boundary?crash=1 route), the error-boundary state renders inside role=\"alert\" with a keyboard-reachable [data-recovery=\"retry\"] control, a plain summary line and no stack-frame content matching the sensitive-pattern list. The pack drives /probe/error-boundary?crash=1, reads the region, the retry control and the 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:error-boundary"
|
|
26
|
+
],
|
|
27
|
+
"createdAt": "2026-09-06T15:40:00Z",
|
|
28
|
+
"updatedAt": "2026-09-06T15:40:00Z"
|
|
29
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# application-empty-error-states: coordination vocabulary
|
|
2
|
+
|
|
3
|
+
## Global topics
|
|
4
|
+
|
|
5
|
+
The blueprint claims no new global topics at v1.0.0. Every ADR (HTTP status contract, stack-trace visibility, offline strategy) is non-global.
|
|
6
|
+
|
|
7
|
+
## Deliberately unclaimed topics
|
|
8
|
+
|
|
9
|
+
- `errorEnvelope` (the shape of a server error response body). Reserved for the applied API blueprint (`application-api-rest` claims it today); this blueprint reads the HTTP status code, not the envelope body shape, so no claim collides.
|
|
10
|
+
- `sensitivePatternsRegistry` (the tokeniser vocabulary the 500 surface refuses on). Reserved for a future v1.1.0 minor bump if three or more consumer blueprints start elicitizing the same extensions. Held here as an unclaimed topic so a composing author sees the reservation.
|
|
11
|
+
- `stateVisualTokens` (the palette, spacing and typography per state). Reserved for `application-spa` which owns the visual tokens; this blueprint owns the state list and the recovery-action router.
|
|
12
|
+
|
|
13
|
+
## Shelf id band and suffix block
|
|
14
|
+
|
|
15
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
16
|
+
|---|---|---|---|---|
|
|
17
|
+
| application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
|
|
18
|
+
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
19
|
+
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
20
|
+
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
21
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
|
|
22
|
+
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
23
|
+
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
24
|
+
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
25
|
+
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
26
|
+
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
27
|
+
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
28
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
29
|
+
|
|
30
|
+
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
31
|
+
|
|
32
|
+
## Composition with application-spa
|
|
33
|
+
|
|
34
|
+
`application-spa` REQ-006 ships empty, loading, error, banner and alert components as part of its component library. Applying this blueprint alongside `application-spa` composes cleanly: SPA holds the tab-title convention and the state-visual tokens; this blueprint holds the state list, the recovery-action router and the runtime enforcement pack. No `scope: "global"` ADR conflict.
|
|
35
|
+
|
|
36
|
+
## Composition with application-notifications-in-app
|
|
37
|
+
|
|
38
|
+
The `forbidden` and `permission-denied` states POST request-access submissions to the applied notification centre. When `application-notifications-in-app` is applied, the pack asserts the applied notification centre receives the submission (a v1.1.0 mechanism-reach gap today; the current pack asserts the control's shape only). No global-topic overlap.
|
|
39
|
+
|
|
40
|
+
## Probe pack
|
|
41
|
+
|
|
42
|
+
`probe-packs/application-empty-error-states.pack.mjs` ships eight surface-observable checks anchored to blueprint AC ids, one per named state:
|
|
43
|
+
|
|
44
|
+
- `AC-22101-1` not-found (heading, parent-surface link, search entry, tab title)
|
|
45
|
+
- `AC-22102-1` forbidden (request-access control, no resource-id leak)
|
|
46
|
+
- `AC-22103-1` server-error (retry, no stack trace, no path shape, no env-key shape)
|
|
47
|
+
- `AC-22104-1` permission-denied (class-level cause, no resource id)
|
|
48
|
+
- `AC-22105-1` offline (banner, buffered synthetic write, polite reconnection announcement)
|
|
49
|
+
- `AC-22106-1` empty-list (distinct visual wrapper, creation-affordance recovery)
|
|
50
|
+
- `AC-22107-1` no-search-results (distinct visual wrapper, echoed query, clear-filters recovery)
|
|
51
|
+
- `AC-22108-1` error-boundary (role=alert, retry control, no stack detail)
|
|
52
|
+
|
|
53
|
+
The pack applies to any FBS binding `TAC-2301-application-empty-error-states-state-machine` or whose navModel routes name an operator-configured error-shell path (matching `/probe/(not-found|forbidden|server-error|permission-denied|offline|empty-list|search|error-boundary)`). See `packages/rcf-lite/docs/blueprint-authoring.md` section 8c for the pack authoring rules.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# application-empty-error-states: operator guide
|
|
2
|
+
|
|
3
|
+
## When to reach for it
|
|
4
|
+
|
|
5
|
+
Your project renders any surface whose input can be empty, whose network call can fail, whose user can lack scope, or whose client can crash mid-render. That covers every SPA that hits an API and every routed page that can dereference an id. You want one contract for the eight named states, one recovery-action router per state, one polite live-region for progress announcements, and a runtime pack that refuses ship on a stack-trace leak, a resource-id leak, a missing recovery affordance, or a dropped live-region wrapper.
|
|
6
|
+
|
|
7
|
+
## The eight named states
|
|
8
|
+
|
|
9
|
+
The blueprint enumerates the eight states in the ratified order below. Every README, guide, pack `checks[]` and `docs/topics.md` row across the family names the same eight slugs.
|
|
10
|
+
|
|
11
|
+
- `not-found`: routed page dereferences an id that has been removed or was never there.
|
|
12
|
+
- `forbidden`: caller is authenticated but the target resource refuses; the surface offers a request-access affordance.
|
|
13
|
+
- `server-error`: a 500-class failure the client cannot recover from without a retry.
|
|
14
|
+
- `offline`: the client has lost the network; the surface announces the transition and, on reconnection, replays it through the polite live-region wrapper.
|
|
15
|
+
- `permission-denied`: the caller lacks a scope the target resource requires; the surface names the missing scope in the cause without leaking the resource id.
|
|
16
|
+
- `empty-list`: a collection surface has zero rows and offers the recovery-action router entry (create, clear filters, or invite, per project wiring).
|
|
17
|
+
- `no-search-results`: a query returned an empty set; the surface echoes the query verbatim and suggests broadening it.
|
|
18
|
+
- `error-boundary`: a client-side render exception was caught; the surface renders under `role="alert"` and offers a route-level recovery.
|
|
19
|
+
|
|
20
|
+
## When NOT to reach for it
|
|
21
|
+
|
|
22
|
+
Your product is a marketing site or a static content surface with no dynamic state. The eight states model a live workspace; a static site has no offline mode, no per-resource forbidden state, no client-side render boundary, and forcing the model on a static site adds mechanism without payoff.
|
|
23
|
+
|
|
24
|
+
Your product has already committed to an opinionated single-vendor state library (Sentry with a bespoke boundary, a framework-specific error module) whose contract is materially different from the eight-state catalogue. Adopt this blueprint only when the vendor library composes with the state-machine TAC rather than replacing it.
|
|
25
|
+
|
|
26
|
+
## What stays your call
|
|
27
|
+
|
|
28
|
+
- The visual design of each state region. The blueprint contributes WHAT surfaces under WHAT condition; the palette, spacing and typography are your project's design system's call.
|
|
29
|
+
- Whether the 500 surface hides the stack trace in staging (ADR-2302 elicited toggle) or hides it everywhere (the recommended default).
|
|
30
|
+
- The offline strategy: write-buffer (the default), read-only-banner, or refuse-writes (ADR-2303 elicited enum).
|
|
31
|
+
- The request-access endpoint the forbidden and permission-denied surfaces POST to. The blueprint declares the shape (`POST /api/request-access` with a JSON body); the endpoint's server-side handling is your call.
|
|
32
|
+
- The parent-surface path and clear-filters callback the recovery-action router wires into the rendered controls.
|
|
33
|
+
|
|
34
|
+
## What a good outcome looks like
|
|
35
|
+
|
|
36
|
+
The pack fires on every FBS whose surface renders a routed page or a listing, and every check returns `pass` on the honest render and `fail` on the corresponding break switch. Your CI runs the fixture round-trip on every PR that touches a state region. Your operator sees eight distinct visuals in a screenshot review and can pick out which state a screenshot represents without reading the copy. Your accessibility audit's live-region check on the polite wrapper passes because the wrapper preseeded at page render, not on state entry. Your production 500 surface never leaks a source path, an environment variable, or a backtrace frame.
|
|
37
|
+
|
|
38
|
+
## Mechanism-reach gaps
|
|
39
|
+
|
|
40
|
+
The blueprint's README lists the runtime-observable ACs the pack does NOT bind directly. Every gap is a candidate for a v1.1.0 minor bump extending the pack. Combine with `application-notifications-in-app` to route request-access submissions through the shipped notification centre and with `application-spa` to inherit the tab-title convention and the state-visual tokens.
|
|
41
|
+
|
|
42
|
+
## Promotion signals
|
|
43
|
+
|
|
44
|
+
- Three or more consumer blueprints (forms-wizard, account-settings, dashboard, admin-console) start elicitizing the same sensitive-pattern extension for the 500 surface. Candidate: a `sensitivePatternsRegistry` global topic in a v1.1.0 minor.
|
|
45
|
+
- The offline-buffer TAC needs a shared engine across a persistence blueprint and this UI blueprint. Candidate: a dedicated `application-offline-sync` blueprint absorbing the write-buffer.
|
|
46
|
+
- The recovery-shape enum needs a request-access-inline shape (inline form rather than a POST). Candidate: a v1.1.0 minor bump extending TAC-2302's recovery-shape closed set.
|
|
47
|
+
|
|
48
|
+
## Costs to be honest about
|
|
49
|
+
|
|
50
|
+
Realising all eight states honestly in a client is a chunk of code even after adopting the TACs; project-side wiring per framework is at least an afternoon per state. The pack is Playwright-first, so a project without a running dev server at gate time cannot fire it. The offline TAC assumes IndexedDB by default; a WebView with a locked-down storage policy elicits an alternative per ADR-2303 and takes a small amount of adapter code.
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// application-empty-error-states probe pack (v1.0.0).
|
|
2
|
+
//
|
|
3
|
+
// Eight surface-observable checks, one per named state, anchored to
|
|
4
|
+
// the blueprint's contributed AC ids:
|
|
5
|
+
// AC-22101-1 not-found (heading, parent-surface link, search entry, tab title)
|
|
6
|
+
// AC-22102-1 forbidden (request-access control, no resource-id leak)
|
|
7
|
+
// AC-22103-1 server-error (retry, no stack trace, no path shape, no env-key shape)
|
|
8
|
+
// AC-22104-1 permission-denied (class-level cause, no resource id)
|
|
9
|
+
// AC-22105-1 offline (banner, buffered synthetic write, polite reconnection announcement)
|
|
10
|
+
// AC-22106-1 empty-list (distinct visual wrapper, creation-affordance recovery)
|
|
11
|
+
// AC-22107-1 no-search-results (distinct visual wrapper, echoed query, clear-filters recovery)
|
|
12
|
+
// AC-22108-1 error-boundary (role=alert, retry control, no stack detail)
|
|
13
|
+
//
|
|
14
|
+
// Every check drives the real Playwright browser the T-0 runner
|
|
15
|
+
// injects. URLs are composed by the withUrl(runtimeUrl, path) helper
|
|
16
|
+
// per the round 3 T-3 fix train; no bare string concatenation.
|
|
17
|
+
//
|
|
18
|
+
// Sample-app fixture:
|
|
19
|
+
// packages/rcf-lite/test/fixtures/probe-pack-application-empty-error-states/
|
|
20
|
+
// Fixture ships one route per state under /probe/<state> plus break
|
|
21
|
+
// switches (?break=stack-trace, ?break=leak-id, ?break=no-recovery,
|
|
22
|
+
// ?break=no-live-region) so the negative runs can be driven from a
|
|
23
|
+
// single boot.
|
|
24
|
+
|
|
25
|
+
function withUrl(runtimeUrl, path) {
|
|
26
|
+
return new URL(path, runtimeUrl).toString();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Sensitive-pattern list used by AC-22103-1 (server-error surface)
|
|
30
|
+
// and by AC-22108-1 (error-boundary surface). Words on this list must
|
|
31
|
+
// not appear on the rendered document text in production.
|
|
32
|
+
//
|
|
33
|
+
// Encoded as an array of {name, re} entries so a failure message can
|
|
34
|
+
// cite which pattern matched. Every regexp is anchored on token
|
|
35
|
+
// boundaries to reduce false positives on legitimate copy.
|
|
36
|
+
const SENSITIVE_PATTERNS = [
|
|
37
|
+
{ name: 'backtrace-frame', re: /\bat\s+[A-Za-z_$][\w$.]*\s*\([^)]*:\d+:\d+\)/ },
|
|
38
|
+
{ name: 'source-path-absolute', re: /(?:^|[\s"'>])\/(?:usr|opt|home|var|etc|Users|private)\/[\w\-./]+/ },
|
|
39
|
+
{ name: 'source-path-relative', re: /(?:^|[\s"'>])\.{1,2}\/[\w\-./]+\.(?:js|mjs|cjs|ts|tsx|jsx)/ },
|
|
40
|
+
{ name: 'env-key-assignment', re: /\b[A-Z][A-Z0-9_]{2,}=(?!=)[^\s"']+/ },
|
|
41
|
+
{ name: 'process-env-reference', re: /\bprocess\.env\.[A-Z_][A-Z0-9_]*/ },
|
|
42
|
+
{ name: 'framework-internal-frame', re: /\b(?:node_modules|webpack-internal|nextjs-internal)\b/ },
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
// Resource-id pattern list for AC-22104-1 (permission-denied cause
|
|
46
|
+
// must be class-level, not per-resource).
|
|
47
|
+
const RESOURCE_ID_PATTERNS = [
|
|
48
|
+
{ name: 'four-plus-digit-run', re: /\b\d{4,}\b/ },
|
|
49
|
+
{ name: 'uuid-shape', re: /\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b/ },
|
|
50
|
+
{ name: 'resource-slug-hint', re: /\b(?:resource|id|slug|handle)=[A-Za-z0-9._-]+/i },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
function firstSensitiveMatch(text, patterns) {
|
|
54
|
+
if (typeof text !== 'string') return null;
|
|
55
|
+
for (const { name, re } of patterns) {
|
|
56
|
+
const m = text.match(re);
|
|
57
|
+
if (m) return { name, match: m[0] };
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export default {
|
|
63
|
+
packName: 'application-empty-error-states',
|
|
64
|
+
version: '1.0.0',
|
|
65
|
+
blueprintSlug: 'application-empty-error-states',
|
|
66
|
+
// Applies to any FBS that realises the state-machine TAC or whose
|
|
67
|
+
// navModel routes name the operator-configured error-shell path.
|
|
68
|
+
// References BOTH `tacIds` AND `route` per the loader source-scan
|
|
69
|
+
// rule (T-0 AC-1701-3, cross-check with authoring standard 8c).
|
|
70
|
+
appliesTo: ({ fbs }) => {
|
|
71
|
+
const routes = fbs?.designStage?.navModel?.routes ?? [];
|
|
72
|
+
const tacIds = fbs?.contextRequirements?.tacIds ?? [];
|
|
73
|
+
if (tacIds.includes('TAC-2301-application-empty-error-states-state-machine')) return true;
|
|
74
|
+
return routes.some((r) => typeof r?.path === 'string' && /\/probe\/(?:not-found|forbidden|server-error|permission-denied|offline|empty-list|search|error-boundary)(\/|$|\?)/.test(r.path));
|
|
75
|
+
},
|
|
76
|
+
boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
|
|
77
|
+
checks: [
|
|
78
|
+
{
|
|
79
|
+
id: 'AC-22101-1',
|
|
80
|
+
severity: 'block',
|
|
81
|
+
description: 'not-found state renders inside a region with a naming heading, a parent-surface recovery link, a search entry, and a browser tab title matching /^Not found - .+/',
|
|
82
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
83
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
84
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/not-found'));
|
|
85
|
+
const dom = await browser.evaluate(() => {
|
|
86
|
+
const region = document.querySelector('[data-surface="not-found"]');
|
|
87
|
+
if (!region) return { present: false };
|
|
88
|
+
const heading = region.querySelector('h1, h2, [role="heading"]');
|
|
89
|
+
const parent = region.querySelector('[data-recovery="parent-surface"]');
|
|
90
|
+
const search = region.querySelector('[data-recovery="search"]');
|
|
91
|
+
return {
|
|
92
|
+
present: true,
|
|
93
|
+
headingText: heading ? heading.textContent.trim() : null,
|
|
94
|
+
hasParent: !!parent,
|
|
95
|
+
hasSearch: !!search,
|
|
96
|
+
title: document.title,
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
if (!dom.present) return { verdict: 'fail', detail: 'not-found region [data-surface="not-found"] not found' };
|
|
100
|
+
if (!dom.headingText) return { verdict: 'fail', detail: 'not-found region missing heading' };
|
|
101
|
+
if (!dom.hasParent) return { verdict: 'fail', detail: 'not-found region missing [data-recovery="parent-surface"]' };
|
|
102
|
+
if (!dom.hasSearch) return { verdict: 'fail', detail: 'not-found region missing [data-recovery="search"]' };
|
|
103
|
+
if (!/^Not found - .+/.test(dom.title)) return { verdict: 'fail', detail: `not-found tab title did not match /^Not found - .+/: ${JSON.stringify(dom.title)}` };
|
|
104
|
+
return { verdict: 'pass', detail: `heading=${JSON.stringify(dom.headingText)} title=${JSON.stringify(dom.title)}` };
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: 'AC-22102-1',
|
|
109
|
+
severity: 'block',
|
|
110
|
+
description: 'forbidden state renders inside a region with a request-access control and the rendered surface refuses to include a resource id, resource name or path-shape token',
|
|
111
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
112
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
113
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/forbidden'));
|
|
114
|
+
const dom = await browser.evaluate(() => {
|
|
115
|
+
const region = document.querySelector('[data-surface="forbidden"]');
|
|
116
|
+
if (!region) return { present: false };
|
|
117
|
+
const control = region.querySelector('[data-action="request-access"]');
|
|
118
|
+
return { present: true, hasControl: !!control, text: document.body.innerText };
|
|
119
|
+
});
|
|
120
|
+
if (!dom.present) return { verdict: 'fail', detail: 'forbidden region [data-surface="forbidden"] not found' };
|
|
121
|
+
if (!dom.hasControl) return { verdict: 'fail', detail: 'forbidden region missing [data-action="request-access"] control' };
|
|
122
|
+
// Least-privilege posture: no resource-id shape, no source path leaking through.
|
|
123
|
+
const leak = firstSensitiveMatch(dom.text, RESOURCE_ID_PATTERNS);
|
|
124
|
+
if (leak) return { verdict: 'fail', detail: `forbidden surface leaked ${leak.name}: ${leak.match}` };
|
|
125
|
+
const path = firstSensitiveMatch(dom.text, SENSITIVE_PATTERNS.filter((p) => p.name.startsWith('source-path')));
|
|
126
|
+
if (path) return { verdict: 'fail', detail: `forbidden surface leaked ${path.name}: ${path.match}` };
|
|
127
|
+
return { verdict: 'pass', detail: 'forbidden region clean; request-access control present' };
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: 'AC-22103-1',
|
|
132
|
+
severity: 'block',
|
|
133
|
+
description: 'server-error state renders in production without a stack trace, without a source path, without an env-key shape and without a framework-internal frame prefix',
|
|
134
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
135
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
136
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/server-error'));
|
|
137
|
+
const dom = await browser.evaluate(() => {
|
|
138
|
+
const region = document.querySelector('[data-surface="server-error"]');
|
|
139
|
+
if (!region) return { present: false };
|
|
140
|
+
const retry = region.querySelector('[data-recovery="retry"]');
|
|
141
|
+
return { present: true, hasRetry: !!retry, text: document.body.innerText };
|
|
142
|
+
});
|
|
143
|
+
if (!dom.present) return { verdict: 'fail', detail: 'server-error region [data-surface="server-error"] not found' };
|
|
144
|
+
if (!dom.hasRetry) return { verdict: 'fail', detail: 'server-error region missing [data-recovery="retry"] control' };
|
|
145
|
+
const leak = firstSensitiveMatch(dom.text, SENSITIVE_PATTERNS);
|
|
146
|
+
if (leak) return { verdict: 'fail', detail: `server-error surface leaked ${leak.name}: ${leak.match}` };
|
|
147
|
+
return { verdict: 'pass', detail: 'server-error region clean; retry control present' };
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
id: 'AC-22104-1',
|
|
152
|
+
severity: 'block',
|
|
153
|
+
description: 'permission-denied state renders a class-level cause string and never a resource id',
|
|
154
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
155
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
156
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/permission-denied'));
|
|
157
|
+
const dom = await browser.evaluate(() => {
|
|
158
|
+
const region = document.querySelector('[data-surface="permission-denied"]');
|
|
159
|
+
if (!region) return { present: false };
|
|
160
|
+
const cause = region.querySelector('[data-cause]');
|
|
161
|
+
const control = region.querySelector('[data-action="request-access"]');
|
|
162
|
+
return {
|
|
163
|
+
present: true,
|
|
164
|
+
causeText: cause ? cause.textContent.trim() : null,
|
|
165
|
+
hasControl: !!control,
|
|
166
|
+
};
|
|
167
|
+
});
|
|
168
|
+
if (!dom.present) return { verdict: 'fail', detail: 'permission-denied region [data-surface="permission-denied"] not found' };
|
|
169
|
+
if (!dom.causeText) return { verdict: 'fail', detail: 'permission-denied region missing [data-cause] class-level cause' };
|
|
170
|
+
if (!dom.hasControl) return { verdict: 'fail', detail: 'permission-denied region missing [data-action="request-access"] control' };
|
|
171
|
+
const leak = firstSensitiveMatch(dom.causeText, RESOURCE_ID_PATTERNS);
|
|
172
|
+
if (leak) return { verdict: 'fail', detail: `permission-denied cause leaked ${leak.name}: ${leak.match}` };
|
|
173
|
+
return { verdict: 'pass', detail: `cause=${JSON.stringify(dom.causeText)}` };
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'AC-22105-1',
|
|
178
|
+
severity: 'block',
|
|
179
|
+
description: 'offline state renders with a read-only banner, a synthetic write buffers to window.__offlineBuffer with an idempotency token, and the polite live-region wrapper carries the reconnection announcement',
|
|
180
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
181
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
182
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/offline'));
|
|
183
|
+
const offline = await browser.evaluate(() => {
|
|
184
|
+
const region = document.querySelector('[data-surface="offline"]');
|
|
185
|
+
if (!region) return { present: false };
|
|
186
|
+
const banner = region.querySelector('[data-banner="offline"]');
|
|
187
|
+
// Fixture pre-seeds a synthetic write on page load so the
|
|
188
|
+
// pack can observe the buffer without driving Playwright
|
|
189
|
+
// page.setOffline directly.
|
|
190
|
+
const buf = window.__offlineBuffer;
|
|
191
|
+
const hasBufferEntry = Array.isArray(buf) && buf.length > 0
|
|
192
|
+
&& typeof buf[0].idempotencyToken === 'string' && buf[0].idempotencyToken.length > 0
|
|
193
|
+
&& typeof buf[0].sequence === 'number';
|
|
194
|
+
return { present: true, hasBanner: !!banner, hasBufferEntry, bufferSample: buf ? buf.slice(0, 1) : null };
|
|
195
|
+
});
|
|
196
|
+
if (!offline.present) return { verdict: 'fail', detail: 'offline region [data-surface="offline"] not found' };
|
|
197
|
+
if (!offline.hasBanner) return { verdict: 'fail', detail: 'offline region missing [data-banner="offline"]' };
|
|
198
|
+
if (!offline.hasBufferEntry) return { verdict: 'fail', detail: `window.__offlineBuffer not populated with a token-and-sequence entry: ${JSON.stringify(offline.bufferSample)}` };
|
|
199
|
+
// Reconnection: drive the fixture's reconnect route, then
|
|
200
|
+
// read the polite live-region wrapper's text.
|
|
201
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/offline?reconnect=1'));
|
|
202
|
+
const reconnect = await browser.evaluate(() => {
|
|
203
|
+
const live = document.querySelector('[data-live-region="polite"]');
|
|
204
|
+
return { text: live ? live.textContent.trim() : null };
|
|
205
|
+
});
|
|
206
|
+
if (!reconnect.text || reconnect.text.length === 0) {
|
|
207
|
+
return { verdict: 'fail', detail: 'polite live-region wrapper empty on reconnect; expected a reconnection announcement' };
|
|
208
|
+
}
|
|
209
|
+
return { verdict: 'pass', detail: `bufferSample=${JSON.stringify(offline.bufferSample)} reconnect=${JSON.stringify(reconnect.text)}` };
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
id: 'AC-22106-1',
|
|
214
|
+
severity: 'block',
|
|
215
|
+
description: 'empty-list state renders with a distinct visual wrapper and a creation-affordance recovery control',
|
|
216
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
217
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
218
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/empty-list'));
|
|
219
|
+
const dom = await browser.evaluate(() => {
|
|
220
|
+
const region = document.querySelector('[data-surface="empty-list"]');
|
|
221
|
+
if (!region) return { present: false };
|
|
222
|
+
const wrapper = region.querySelector('[data-visual="empty-list"]');
|
|
223
|
+
const create = region.querySelector('[data-recovery="create"]');
|
|
224
|
+
return { present: true, hasWrapper: !!wrapper, hasCreate: !!create };
|
|
225
|
+
});
|
|
226
|
+
if (!dom.present) return { verdict: 'fail', detail: 'empty-list region [data-surface="empty-list"] not found' };
|
|
227
|
+
if (!dom.hasWrapper) return { verdict: 'fail', detail: 'empty-list region missing [data-visual="empty-list"] wrapper' };
|
|
228
|
+
if (!dom.hasCreate) return { verdict: 'fail', detail: 'empty-list region missing [data-recovery="create"] control' };
|
|
229
|
+
return { verdict: 'pass', detail: 'empty-list wrapper and create control present' };
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
id: 'AC-22107-1',
|
|
234
|
+
severity: 'block',
|
|
235
|
+
description: 'no-search-results state renders with a distinct visual wrapper, an echoed query and a clear-filters recovery control',
|
|
236
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
237
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
238
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/search?q=needle'));
|
|
239
|
+
const dom = await browser.evaluate(() => {
|
|
240
|
+
const region = document.querySelector('[data-surface="no-search-results"]');
|
|
241
|
+
if (!region) return { present: false };
|
|
242
|
+
const wrapper = region.querySelector('[data-visual="no-search-results"]');
|
|
243
|
+
const query = region.querySelector('[data-query]');
|
|
244
|
+
const clear = region.querySelector('[data-recovery="clear-filters"]');
|
|
245
|
+
return {
|
|
246
|
+
present: true,
|
|
247
|
+
hasWrapper: !!wrapper,
|
|
248
|
+
queryText: query ? query.textContent.trim() : null,
|
|
249
|
+
hasClear: !!clear,
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
if (!dom.present) return { verdict: 'fail', detail: 'no-search-results region [data-surface="no-search-results"] not found' };
|
|
253
|
+
if (!dom.hasWrapper) return { verdict: 'fail', detail: 'no-search-results region missing [data-visual="no-search-results"] wrapper' };
|
|
254
|
+
if (!dom.hasClear) return { verdict: 'fail', detail: 'no-search-results region missing [data-recovery="clear-filters"] control' };
|
|
255
|
+
if (!dom.queryText || !dom.queryText.includes('needle')) {
|
|
256
|
+
return { verdict: 'fail', detail: `no-search-results region did not echo the query verbatim: ${JSON.stringify(dom.queryText)}` };
|
|
257
|
+
}
|
|
258
|
+
return { verdict: 'pass', detail: `queryEcho=${JSON.stringify(dom.queryText)}` };
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
id: 'AC-22108-1',
|
|
263
|
+
severity: 'block',
|
|
264
|
+
description: 'error-boundary state renders inside role=alert with a retry recovery hook and no stack detail on the rendered surface',
|
|
265
|
+
run: async ({ browser, runtimeUrl }) => {
|
|
266
|
+
if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
|
|
267
|
+
await browser.goto(withUrl(runtimeUrl, '/probe/error-boundary?crash=1'));
|
|
268
|
+
const dom = await browser.evaluate(() => {
|
|
269
|
+
const region = document.querySelector('[data-surface="error-boundary"]');
|
|
270
|
+
if (!region) return { present: false };
|
|
271
|
+
const role = region.getAttribute('role');
|
|
272
|
+
const retry = region.querySelector('[data-recovery="retry"]');
|
|
273
|
+
return { present: true, role, hasRetry: !!retry, text: document.body.innerText };
|
|
274
|
+
});
|
|
275
|
+
if (!dom.present) return { verdict: 'fail', detail: 'error-boundary region [data-surface="error-boundary"] not found' };
|
|
276
|
+
if (dom.role !== 'alert') return { verdict: 'fail', detail: `error-boundary region role expected "alert", got ${JSON.stringify(dom.role)}` };
|
|
277
|
+
if (!dom.hasRetry) return { verdict: 'fail', detail: 'error-boundary region missing [data-recovery="retry"] control' };
|
|
278
|
+
const leak = firstSensitiveMatch(dom.text, SENSITIVE_PATTERNS);
|
|
279
|
+
if (leak) return { verdict: 'fail', detail: `error-boundary surface leaked ${leak.name}: ${leak.match}` };
|
|
280
|
+
return { verdict: 'pass', detail: 'error-boundary role=alert, retry control present, no stack detail' };
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
};
|
|
@@ -20,5 +20,17 @@
|
|
|
20
20
|
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
21
21
|
|---|---|---|---|---|
|
|
22
22
|
| application-error-handling | 16101-16899 | 17xx | shipped v1.0.0 | `errorHandling` |
|
|
23
|
+
| application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
|
|
24
|
+
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
25
|
+
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
26
|
+
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
27
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
|
|
28
|
+
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
29
|
+
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
30
|
+
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
31
|
+
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
32
|
+
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
33
|
+
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
34
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
23
35
|
|
|
24
36
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# application-file-upload CHANGELOG
|
|
2
|
+
|
|
3
|
+
## 1.0.0 (visual round T-2, spec 2026-09-06)
|
|
4
|
+
|
|
5
|
+
- First ratified version of the shelf's file-upload blueprint. Five REQs (input contract with a labelled file input plus drop-zone plus keyboard alternative per WCAG 2.5.7, progress contract with per-file percent and aggregate percent and polite live-region tick, refusal contract with MIME and size and virus-scan gates and aria-describedby error binding and focus-to-retry, transport contract chunked-and-resumable with multipart POST default and tus.io elicited alternative, completion contract with assertive-slot success announcement per WCAG 4.1.3 and per-file remove and retry), seven USs 23101-23107 binding one runtime-observable AC per REQ plus two cross-cutting cases (network-interruption resumption AC-23106-1, background-tab progress AC-23107-1), three TACs 2401-2403 (upload input surface, upload transport contract, upload progress announcer), three ADRs 2401-2403 (transport branch with multipart recommendedDefault true and tus and vendor-sdk elicited, accepted MIME set and per-file size cap elicited, virus-scan integration via a capability-plus-elicit). No new global topics.
|
|
6
|
+
- Ships `probe-packs/application-file-upload.pack.mjs`: four surface-observable browser-verify checks anchored one per contract (`AC-23101-1` input surface, `AC-23102-1` progress announcer, `AC-23103-1` refusal contract, `AC-23104-1` chunked transport). Every URL is composed by the `withUrl(runtimeUrl, path)` helper per the round 3 T-3 fix train; no bare string concatenation. The pack-level `appliesTo` predicate references BOTH `tacIds` (TAC-2401) AND `route` (the operator-configured upload path glob).
|
|
7
|
+
- Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-file-upload/` with a Node HTTP server realising both transport branches honestly (`?transport=multipart` default, `?transport=tus` elicited alternative) and break switches (`?break=no-input`, `?break=no-live-region`, `?break=send-refused`, `?break=no-chunks`) driving the negative runs from a single boot. The fixture ships its own README naming PORT, every `?transport=`, every `?seed=`, every `?break=`, the manual boot line and the two-line gate-reviewer boot.
|
|
8
|
+
- Declares `suggestedCompanions` `logging` (every refused upload writes one request-scoped log line with the closed refusal reason and the correlation identifier) and `errorHandling` (refusals and transport-layer failures construct an internal error record through the applied error-handling factory). Does NOT declare `providesRoles` (leaf blueprint per spec; loader refuses an empty `providesRoles` array when set, so the leaf-blueprint intent is expressed by omitting the field). Does NOT declare `capabilities` and does NOT declare `requiresAppliedCapabilities` (no auth required).
|
|
9
|
+
- Seventh shipped consumer of T-0's probe-pack runner extension.
|