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,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "persistence-data-postgres",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"category": "persistence",
|
|
5
|
+
"capabilities": ["relationalStore"],
|
|
6
|
+
"suggestedCompanions": [
|
|
7
|
+
{
|
|
8
|
+
"role": "logging",
|
|
9
|
+
"reason": "Every migration apply, every scheduled export completion, and every transaction rollback writes a request-scoped log line; a logging companion supplies the factory the pipeline calls."
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"role": "errorHandling",
|
|
13
|
+
"reason": "A migration failure, a constraint violation, or a pool exhaustion constructs an internal error record; an error-handling companion supplies the record factory and the boundary."
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"contributions": [
|
|
17
|
+
{ "id": "persistence-data-postgres-REQ-001", "kind": "req", "path": "requirements/persistence-data-postgres-req-001.json" },
|
|
18
|
+
{ "id": "persistence-data-postgres-REQ-002", "kind": "req", "path": "requirements/persistence-data-postgres-req-002.json" },
|
|
19
|
+
{ "id": "persistence-data-postgres-REQ-003", "kind": "req", "path": "requirements/persistence-data-postgres-req-003.json" },
|
|
20
|
+
{ "id": "persistence-data-postgres-REQ-004", "kind": "req", "path": "requirements/persistence-data-postgres-req-004.json" },
|
|
21
|
+
{ "id": "persistence-data-postgres-REQ-005", "kind": "req", "path": "requirements/persistence-data-postgres-req-005.json" },
|
|
22
|
+
{ "id": "persistence-data-postgres-REQ-006", "kind": "req", "path": "requirements/persistence-data-postgres-req-006.json" },
|
|
23
|
+
{ "id": "persistence-data-postgres-REQ-007", "kind": "req", "path": "requirements/persistence-data-postgres-req-007.json" },
|
|
24
|
+
{ "id": "persistence-data-postgres-US-27101", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27101.json" },
|
|
25
|
+
{ "id": "persistence-data-postgres-US-27102", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27102.json" },
|
|
26
|
+
{ "id": "persistence-data-postgres-US-27103", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27103.json" },
|
|
27
|
+
{ "id": "persistence-data-postgres-US-27104", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27104.json" },
|
|
28
|
+
{ "id": "persistence-data-postgres-US-27105", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27105.json" },
|
|
29
|
+
{ "id": "persistence-data-postgres-US-27106", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27106.json" },
|
|
30
|
+
{ "id": "persistence-data-postgres-US-27107", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27107.json" },
|
|
31
|
+
{ "id": "persistence-data-postgres-US-27108", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27108.json" },
|
|
32
|
+
{ "id": "persistence-data-postgres-US-27109", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27109.json" },
|
|
33
|
+
{ "id": "persistence-data-postgres-US-27110", "kind": "us", "path": "user-stories/persistence-data-postgres-us-27110.json" },
|
|
34
|
+
{ "id": "TAC-2801-persistence-data-postgres-facade", "kind": "tac", "path": "tacs/tac-2801-persistence-data-postgres-facade.json" },
|
|
35
|
+
{ "id": "TAC-2802-persistence-data-postgres-migration-runner", "kind": "tac", "path": "tacs/tac-2802-persistence-data-postgres-migration-runner.json" },
|
|
36
|
+
{ "id": "TAC-2803-persistence-data-postgres-transaction-helper", "kind": "tac", "path": "tacs/tac-2803-persistence-data-postgres-transaction-helper.json" },
|
|
37
|
+
{ "id": "TAC-2804-persistence-data-postgres-recovery-runner", "kind": "tac", "path": "tacs/tac-2804-persistence-data-postgres-recovery-runner.json" },
|
|
38
|
+
{
|
|
39
|
+
"id": "ADR-2801-persistence-data-postgres-driver",
|
|
40
|
+
"kind": "adr",
|
|
41
|
+
"path": "adrs/adr-2801-persistence-data-postgres-driver.json",
|
|
42
|
+
"scope": "global",
|
|
43
|
+
"topic": "persistenceStore",
|
|
44
|
+
"recommendedDefault": true,
|
|
45
|
+
"elicited": true,
|
|
46
|
+
"standardsTraceClause": "node-postgres parameterised-queries contract"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "ADR-2802-persistence-data-postgres-migration-shape",
|
|
50
|
+
"kind": "adr",
|
|
51
|
+
"path": "adrs/adr-2802-persistence-data-postgres-migration-shape.json",
|
|
52
|
+
"scope": "global",
|
|
53
|
+
"topic": "migrationDiscipline",
|
|
54
|
+
"recommendedDefault": true,
|
|
55
|
+
"elicited": true,
|
|
56
|
+
"standardsTraceClause": "generic enterprise practice"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "ADR-2803-persistence-data-postgres-runner-mode",
|
|
60
|
+
"kind": "adr",
|
|
61
|
+
"path": "adrs/adr-2803-persistence-data-postgres-runner-mode.json",
|
|
62
|
+
"elicited": true,
|
|
63
|
+
"standardsTraceClause": "generic enterprise practice"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "ADR-2804-persistence-data-postgres-recovery",
|
|
67
|
+
"kind": "adr",
|
|
68
|
+
"path": "adrs/adr-2804-persistence-data-postgres-recovery.json",
|
|
69
|
+
"elicited": true,
|
|
70
|
+
"standardsTraceClause": "generic enterprise practice"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "ADR-2805-persistence-data-postgres-connection-pool-posture",
|
|
74
|
+
"kind": "adr",
|
|
75
|
+
"path": "adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json",
|
|
76
|
+
"elicited": true,
|
|
77
|
+
"standardsTraceClause": "generic enterprise practice"
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2801-persistence-data-postgres-driver",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "The pg client (node-postgres) as the shipped v1.0.0 driver; a round-6 Hyperdrive adapter slots in at v1.1.0 without a facade re-shape",
|
|
8
|
+
"context": "A project deploying Postgres on a Node target has two mainstream driver choices: pg (node-postgres, the callback-and-pool oriented reference driver on npm) and postgres.js (a promise-first alternative with a compact API surface). Both speak the Postgres wire protocol; both support parameterised queries; both are actively maintained. The round-6 Cloudflare-line proposal reserves a Hyperdrive-in-front adapter that wraps pg with Cloudflare's connection-pool and query-cache surface. The v1.0.0 facade design has to hold the driver reference opaque at the facade boundary so the round-6 adapter slots in as an additive minor without a facade re-shape.",
|
|
9
|
+
"decision": "The shipped v1.0.0 driver is pg (node-postgres) with a long-lived pg.Pool held inside the facade module (or a request-scoped pool on request-scoped container targets per ADR-2805). Every pg.query call passes a static string literal as its first argument and supplies parameters as an array bound to $1, $2, ... $N per the node-postgres parameterised-queries contract at https://node-postgres.com/features/queries. The driver reference inside the facade is OPAQUE at this ADR: the facade imports pg and any consumer or adapter that wants to swap the driver (postgres.js, a Hyperdrive-wrapped pg via the round-6 v1.1.0 adapter, an ORM sitting inside the facade) replaces the import here without touching the outward interface. Alternative drivers are elicited at apply time under the adapter parameter; the v1.0.0 shipped default is pg with recommendedDefault true.",
|
|
10
|
+
"consequences": "The project inherits the pg driver's mature parameterised-query surface, its pool implementation with configurable size and idle-timeout, and its clean rejection propagation for constraint violations and connection errors. The Round-6 Hyperdrive adapter (Cloudflare's pg-driver-compatible connection-pool and query-cache surface per https://developers.cloudflare.com/hyperdrive/) slots in as a v1.1.0 minor bump that swaps the import at the facade boundary; no outward-interface change, no AC moves. Projects that want postgres.js instead pass adapter=postgresjs at apply time; the facade's outward interface is preserved. Projects that want an ORM (Kysely, Drizzle, Prisma) sitting inside the facade wire the ORM inside the facade against the same pg.Pool the shipped default holds; the outward interface is preserved. Standards trace clause: node-postgres parameterised-queries contract at https://node-postgres.com/features/queries.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "postgres.js as the shipped default",
|
|
14
|
+
"summary": "Ship postgres.js as the v1.0.0 default driver, elicit pg as the alternative.",
|
|
15
|
+
"reasonNotChosen": "postgres.js is a fine driver but has a smaller ecosystem and the round-6 Hyperdrive adapter targets pg specifically per Cloudflare's Hyperdrive docs. Shipping pg first keeps the round-6 slot clean; postgres.js remains available via the elicit."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Bless one ORM (Kysely or Drizzle) as the shipped surface",
|
|
19
|
+
"summary": "Ship Kysely or Drizzle as the v1.0.0 default; the facade wraps the ORM, not pg.",
|
|
20
|
+
"reasonNotChosen": "ORMs sit above pg and are an operator choice on top of the driver, not a substitute for it. Blessing one ORM as default pushes the shelf into a maintenance stance on a tool it does not build; the facade contract is orm-neutral so a project may drop an ORM inside the facade without moving any AC."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Hyperdrive as the shipped v1.0.0 driver",
|
|
24
|
+
"summary": "Ship Hyperdrive-wrapped pg as the v1.0.0 default.",
|
|
25
|
+
"reasonNotChosen": "Hyperdrive is a Cloudflare-account-bound service and the round-5 spec ruling 5 (Baz decision 8) places Postgres as the local-first blueprint. Making Hyperdrive the default would force every project to bind to a Cloudflare account before applying the blueprint. Round 6 lands Hyperdrive as a v1.1.0 minor adapter behind an elicit, keeping local-first at v1.0.0."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"createdAt": "2026-09-06T15:47:00.000Z",
|
|
29
|
+
"updatedAt": "2026-09-06T15:47:00.000Z"
|
|
30
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2802-persistence-data-postgres-migration-shape",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Numbered forward-only .sql migration files; one file one transaction; migration runner tool elicited",
|
|
8
|
+
"context": "The Postgres ecosystem has multiple migration tools (node-pg-migrate, sqitch, flyway, prisma migrate, drizzle-kit, knex migrations). Each imposes a different filename convention, a different bookkeeping strategy, and a different transaction shape. Blessing one blocks projects that already carry another; blessing none diffuses the shape across the shelf.",
|
|
9
|
+
"decision": "The shipped discipline is numbered forward-only .sql migration files under an elicited migrations directory (default ./migrations/). Each filename begins with a monotonically increasing integer that is unique across the directory (001_..., 002_..., 003_...); the file body is engine-native SQL. The in-tree runner applies each file inside its own transaction (BEGIN, run the file body, COMMIT on success or ROLLBACK on error); the runner records applied filenames in a schema_version bookkeeping table it maintains inside the same database. There are no down migrations; a rollback is a new numbered file inverting the earlier change. Which runner tool the project reaches for is elicited on this ADR (bespoke Node runner shipped in the fixture, node-pg-migrate, sqitch, flyway); recommendedDefault is the bespoke Node runner because it holds the fewest opinions and reads the migrations directory directly.",
|
|
10
|
+
"consequences": "The project gets a portable migration shape any Postgres client can apply (a plain .sql file with a leading integer). One file one transaction bounds the rollback surface cleanly but forbids atomic schema changes spanning two files; projects combine multi-step changes into one file. Numbered forward-only means the deploy pipeline's rollback story is a new migration, not a down step; the deploy runbook names this. Refusing to bless a runner tool keeps the shelf out of a maintenance stance; the operator picks whichever tool their team already carries and points it at the same directory. Standards trace clause: generic enterprise practice.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Bless node-pg-migrate as the shipped runner",
|
|
14
|
+
"summary": "Ship node-pg-migrate as the v1.0.0 default; the applying project inherits its filename convention, its bookkeeping table shape, and its up/down direction.",
|
|
15
|
+
"reasonNotChosen": "node-pg-migrate is a fine tool but its filename convention differs from sqitch and flyway; blessing it forces a project already on sqitch to migrate their catalogue. The discipline (numbered forward-only, one file one transaction) is what carries between tools; blessing the discipline and eliciting the tool is cheaper for the operator."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Allow bidirectional migrations (up and down)",
|
|
19
|
+
"summary": "Ship the migration shape as pairs of .sql files (001_up.sql, 001_down.sql); the runner applies up in order and down in reverse.",
|
|
20
|
+
"reasonNotChosen": "Down migrations are a lie in production. Rolling back a shipped schema change with a down migration is safe only when the change did not add data-carrying columns or drop constraints in a way the down cannot invert. Forward-only migrations make the rollback path explicit (a new numbered file); the operator writes what actually inverts the change rather than trusting a mechanical down."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-06T15:47:00.000Z",
|
|
24
|
+
"updatedAt": "2026-09-06T15:47:00.000Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2803-persistence-data-postgres-runner-mode",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Migration runner mode: atBoot on long-lived Node, ciStep on Workers-adjacent or container-scheduled targets; elicited",
|
|
8
|
+
"context": "A long-lived Node process can run migrations at boot before opening the first request; a Workers-adjacent or serverless target cannot because the boot happens per invocation and does not amortise the migration cost. A container platform running warm instances behaves like long-lived Node but a fresh-per-request container behaves like Workers.",
|
|
9
|
+
"decision": "The migration runner mode is elicited: atBoot (the facade invokes the runner on process start before opening the first query) or ciStep (the CI pipeline invokes the runner as a deploy step before promoting the artefact). Default atBoot for long-lived Node targets; default ciStep for Workers-adjacent, request-scoped container, or Hyperdrive-fronted (round-6) targets. The applying project answers the elicit at apply time; the sidecar records the answer.",
|
|
10
|
+
"consequences": "Long-lived Node targets get zero-config migrations that run before the first request; the operator sees the migrationsApplied event in the process log and knows the schema advanced. Workers-adjacent targets get a CI-step that runs against the deploy target's own connection before the artefact promotes; the operator sees the runner's stdout in the CI log. A project moving from long-lived Node to Workers-adjacent updates the elicit and re-applies; no code moves. Standards trace clause: generic enterprise practice.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Always atBoot",
|
|
14
|
+
"summary": "Ship atBoot as the only mode; the operator schedules a boot on the CI runner for ciStep-like behaviour.",
|
|
15
|
+
"reasonNotChosen": "A Workers-adjacent deploy has no long-lived boot event to hang the runner on; the operator would have to build a boot shim just to run migrations, which is the ciStep in disguise. Eliciting the mode is cheaper."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Always ciStep",
|
|
19
|
+
"summary": "Ship ciStep as the only mode; a long-lived Node process reads schema_version at boot and refuses to open if it is behind.",
|
|
20
|
+
"reasonNotChosen": "Local development on long-lived Node loses zero-config migrations; every developer has to invoke the CI step by hand. atBoot as the default for long-lived Node keeps the developer flow ergonomic."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-06T15:47:00.000Z",
|
|
24
|
+
"updatedAt": "2026-09-06T15:47:00.000Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2804-persistence-data-postgres-recovery",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Two-path recovery: scheduled pg_dump artefact PLUS vendor point-in-time recovery, both required, cadence elicited",
|
|
8
|
+
"context": "A shipped Postgres project has to survive two failure classes: a corrupted or lost cluster (a managed-Postgres outage, a self-managed disk failure, a bad DBA operation) and a data-integrity incident an operator wants to unwind by minutes or hours (a bug that deleted rows, a bad migration a rollback file cannot invert). pg_dump gives a portable off-cluster artefact; vendor PITR (a managed cluster's window, a self-managed cluster's WAL-archive posture) gives fine-grained restore points. Neither alone covers both failure classes.",
|
|
9
|
+
"decision": "The shipped recovery model requires both paths: (a) a scheduled pg_dump runner (TAC-2804) writes an artefact to the elicited destination on an elicited cadence, and (b) the deploy target's own point-in-time recovery is enabled with an elicited PITR window (a managed cluster's retention setting; a self-managed cluster's WAL-archive retention). Neither path is optional; a project that answers off to either fails the ADR's apply-time check. A recovery drill (US-27110) periodically primes a fresh Postgres from the artefact and compares row-count and checksum against the source; the drill's cadence is elicited.",
|
|
10
|
+
"consequences": "The project survives both failure classes: a portable off-cluster artefact for cluster loss and a fine-grained PITR window for data-integrity incidents. Storage cost is two-path (artefact bytes off-cluster plus WAL retention on-cluster); the operator sizes both per RTO/RPO. The drill catches artefact-shape drift (a pg_dump on a new engine version producing a different plain-format shape) before an incident forces a live restore. Standards trace clause: generic enterprise practice.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "pg_dump only",
|
|
14
|
+
"summary": "Ship pg_dump as the sole recovery path; skip vendor PITR.",
|
|
15
|
+
"reasonNotChosen": "A pg_dump artefact taken hourly can lose up to 59 minutes of writes; an operator restoring after a bad migration loses everything committed between the last dump and the incident. PITR bounds that loss to the WAL-shipping cadence."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "PITR only",
|
|
19
|
+
"summary": "Rely on the deploy target's own PITR window; skip the pg_dump runner.",
|
|
20
|
+
"reasonNotChosen": "PITR does not survive cluster loss: if the managed cluster is gone, the retention window is gone with it. A portable off-cluster artefact is what carries across cluster loss."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-06T15:47:00.000Z",
|
|
24
|
+
"updatedAt": "2026-09-06T15:47:00.000Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-2805-persistence-data-postgres-connection-pool-posture",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Connection-pool posture per deploy target: long-lived pool on Node, request-scoped pool on container, delegated to Hyperdrive on Workers-adjacent (v1.1.0)",
|
|
8
|
+
"context": "Postgres has real connection cost per open (TCP handshake, TLS negotiation, authentication, role setup). A long-lived Node process wants one pool per process amortising that cost across every request. A request-scoped container platform (a serverless-container target spinning fresh instances per request) cannot hold a long-lived pool because the instance dies at request end; each instance opens a pool for its request budget. A Workers-adjacent target via the round-6 Hyperdrive v1.1.0 adapter delegates the pool entirely to Cloudflare's Hyperdrive-managed pool.",
|
|
9
|
+
"decision": "The pool posture is elicited per deploy target: longLivedNode (default: long-lived pg.Pool for the process lifetime), requestScopedContainer (a pool sized to the request budget, disposed at request end), or hyperdriveManaged (reserved for the round-6 v1.1.0 adapter). The shipped defaults per posture: longLivedNode pool size 10 with idleTimeoutMillis 30000 and connectionTimeoutMillis 5000 (matching pg's own defaults); requestScopedContainer pool size 2 with idleTimeoutMillis 5000 and connectionTimeoutMillis 3000; hyperdriveManaged inherits Hyperdrive's own pool settings and holds no Node-side pool. Every default is overridable by the operator via elicited pool-config fields at apply time.",
|
|
10
|
+
"consequences": "The project gets the pool posture appropriate to its deploy target without a code change: a longLivedNode app on Kubernetes and a longLivedNode app on a self-managed VM share the same shipped default; a requestScopedContainer app on a serverless-container platform gets a small per-request pool; a round-6 Workers app inherits Hyperdrive's pool. The pool-posture-smoke probe drives twenty concurrent queries at pool size 5 and asserts no timeout; the probe does not impose a sizing formula so operator overrides are safe. Standards trace clause: generic enterprise practice.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "One pool posture (longLivedNode) for every target",
|
|
14
|
+
"summary": "Ship the long-lived pool as the only posture; a request-scoped container platform holds the pool for the instance lifetime.",
|
|
15
|
+
"reasonNotChosen": "A fresh-per-request container that holds a long-lived pool re-pays the connection cost on every instance. Sizing the pool for a request-scoped instance is different from sizing it for a long-lived process; conflating them under one default surprises the operator."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Delegate every pool to Hyperdrive from v1.0.0",
|
|
19
|
+
"summary": "Ship Hyperdrive as the pool manager for every target.",
|
|
20
|
+
"reasonNotChosen": "Hyperdrive is a Cloudflare-account-bound service; forcing every project to bind to Cloudflare before applying the blueprint conflicts with the local-first posture (round-5 spec ruling 5, Baz decision 8). Round 6 lands Hyperdrive as an elicit for the operator who wants it."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"createdAt": "2026-09-06T15:47:00.000Z",
|
|
24
|
+
"updatedAt": "2026-09-06T15:47:00.000Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Facade round-trip probe.
|
|
3
|
+
*
|
|
4
|
+
* Opens the fixture's facade against a running postgres:17-alpine
|
|
5
|
+
* container, drives a put-and-get through the named domain verbs,
|
|
6
|
+
* asserts facadeReady fires on the injected event sink and the
|
|
7
|
+
* round-trip returns the row written.
|
|
8
|
+
*
|
|
9
|
+
* Anchors AC-27101-1 (facade opens on boot and facadeReady fires with
|
|
10
|
+
* the database name).
|
|
11
|
+
*
|
|
12
|
+
* Cleans up: TRUNCATE users on exit; closes the pool.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { createStore, connectionUrlFromEnv } from '../../../../packages/rcf-lite/test/fixtures/infra-postgres/src/store.mjs';
|
|
16
|
+
|
|
17
|
+
export default async function runProbe() {
|
|
18
|
+
const events = [];
|
|
19
|
+
const store = createStore({
|
|
20
|
+
connectionUrl: connectionUrlFromEnv(),
|
|
21
|
+
onEvent: (e) => events.push(e),
|
|
22
|
+
});
|
|
23
|
+
const results = [];
|
|
24
|
+
try {
|
|
25
|
+
await store.ready();
|
|
26
|
+
// Ensure a clean users table for this probe run
|
|
27
|
+
const pool = store.getPool();
|
|
28
|
+
await pool.query('CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE, created_at TIMESTAMPTZ NOT NULL DEFAULT now())');
|
|
29
|
+
await pool.query('TRUNCATE users');
|
|
30
|
+
const facadeReadyFired = events.some((e) => e.event === 'facadeReady');
|
|
31
|
+
const facadeReadyDbName = facadeReadyFired ? events.find((e) => e.event === 'facadeReady').databaseName : null;
|
|
32
|
+
results.push({
|
|
33
|
+
anchorAcId: 'AC-27101-1',
|
|
34
|
+
verdict: facadeReadyFired && facadeReadyDbName === 'rcf_test' ? 'pass' : 'fail',
|
|
35
|
+
detail: facadeReadyFired
|
|
36
|
+
? `facadeReady fired with databaseName=${facadeReadyDbName}`
|
|
37
|
+
: 'facadeReady did not fire before first query',
|
|
38
|
+
});
|
|
39
|
+
const id = await store.createUser('probe-facade-round-trip', 'facade-round-trip@rcf.test');
|
|
40
|
+
const row = await store.getUserById(id);
|
|
41
|
+
const roundTripPass = row && row.id === id && row.name === 'probe-facade-round-trip';
|
|
42
|
+
results.push({
|
|
43
|
+
anchorAcId: 'AC-27101-1',
|
|
44
|
+
verdict: roundTripPass ? 'pass' : 'fail',
|
|
45
|
+
detail: roundTripPass
|
|
46
|
+
? `round-trip put id=${id} and got name=${row.name}`
|
|
47
|
+
: `round-trip failed: id=${id}, row=${JSON.stringify(row)}`,
|
|
48
|
+
});
|
|
49
|
+
} finally {
|
|
50
|
+
try {
|
|
51
|
+
await store.getPool().query('TRUNCATE users');
|
|
52
|
+
} catch { /* ignore */ }
|
|
53
|
+
await store.close();
|
|
54
|
+
}
|
|
55
|
+
return results;
|
|
56
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration apply probe.
|
|
3
|
+
*
|
|
4
|
+
* Drops any prior schema (users, schema_version) from the fixture's
|
|
5
|
+
* Postgres, invokes the fixture's migration runner, and asserts every
|
|
6
|
+
* migration applied inside its own transaction, migrationsApplied fires
|
|
7
|
+
* with the filename list, and the schema_version bookkeeping table
|
|
8
|
+
* records three rows.
|
|
9
|
+
*
|
|
10
|
+
* Anchors AC-27102-1 (three forward-only .sql migrations apply one file
|
|
11
|
+
* one transaction; migrationsApplied fires with the filename list).
|
|
12
|
+
*
|
|
13
|
+
* Cleans up: leaves the applied schema for downstream probes.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { applyAll } from '../../../../packages/rcf-lite/test/fixtures/infra-postgres/src/migrate.mjs';
|
|
17
|
+
import { createStore, connectionUrlFromEnv } from '../../../../packages/rcf-lite/test/fixtures/infra-postgres/src/store.mjs';
|
|
18
|
+
|
|
19
|
+
async function resetSchema(url) {
|
|
20
|
+
const store = createStore({ connectionUrl: url });
|
|
21
|
+
try {
|
|
22
|
+
await store.ready();
|
|
23
|
+
const pool = store.getPool();
|
|
24
|
+
await pool.query('DROP TABLE IF EXISTS users CASCADE');
|
|
25
|
+
await pool.query('DROP TABLE IF EXISTS schema_version CASCADE');
|
|
26
|
+
} finally {
|
|
27
|
+
await store.close();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default async function runProbe() {
|
|
32
|
+
const url = connectionUrlFromEnv();
|
|
33
|
+
await resetSchema(url);
|
|
34
|
+
const events = [];
|
|
35
|
+
const { applied } = await applyAll({
|
|
36
|
+
connectionUrl: url,
|
|
37
|
+
onEvent: (e) => events.push(e),
|
|
38
|
+
});
|
|
39
|
+
const results = [];
|
|
40
|
+
const expected = ['001_create_users.sql', '002_add_email_unique.sql', '003_add_created_at.sql'];
|
|
41
|
+
const listsEqual = applied.length === expected.length
|
|
42
|
+
&& expected.every((f, i) => applied[i] === f);
|
|
43
|
+
results.push({
|
|
44
|
+
anchorAcId: 'AC-27102-1',
|
|
45
|
+
verdict: listsEqual ? 'pass' : 'fail',
|
|
46
|
+
detail: `applied=${JSON.stringify(applied)} expected=${JSON.stringify(expected)}`,
|
|
47
|
+
});
|
|
48
|
+
const migratedEvent = events.find((e) => e.event === 'migrationsApplied');
|
|
49
|
+
const eventFiredCorrectly = migratedEvent
|
|
50
|
+
&& Array.isArray(migratedEvent.applied)
|
|
51
|
+
&& migratedEvent.applied.length === expected.length;
|
|
52
|
+
results.push({
|
|
53
|
+
anchorAcId: 'AC-27102-1',
|
|
54
|
+
verdict: eventFiredCorrectly ? 'pass' : 'fail',
|
|
55
|
+
detail: eventFiredCorrectly
|
|
56
|
+
? `migrationsApplied fired with applied=${JSON.stringify(migratedEvent.applied)}`
|
|
57
|
+
: `migrationsApplied event missing or wrong shape; events=${JSON.stringify(events)}`,
|
|
58
|
+
});
|
|
59
|
+
// Read schema_version to confirm rows count = 3
|
|
60
|
+
const store = createStore({ connectionUrl: url });
|
|
61
|
+
try {
|
|
62
|
+
await store.ready();
|
|
63
|
+
const pool = store.getPool();
|
|
64
|
+
const r = await pool.query('SELECT count(*)::int AS n FROM schema_version');
|
|
65
|
+
const versionRowsPass = r.rows[0].n === 3;
|
|
66
|
+
results.push({
|
|
67
|
+
anchorAcId: 'AC-27102-1',
|
|
68
|
+
verdict: versionRowsPass ? 'pass' : 'fail',
|
|
69
|
+
detail: `schema_version rows=${r.rows[0].n} (expected 3, i.e. schema_version advanced to 3)`,
|
|
70
|
+
});
|
|
71
|
+
} finally {
|
|
72
|
+
await store.close();
|
|
73
|
+
}
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pool posture smoke probe.
|
|
3
|
+
*
|
|
4
|
+
* Opens two facade instances against the same postgres:17-alpine
|
|
5
|
+
* container each configured at pool size 5, dispatches twenty
|
|
6
|
+
* concurrent SELECT queries across the two facades, asserts all
|
|
7
|
+
* twenty return with no timeout inside the shipped
|
|
8
|
+
* connectionTimeoutMillis budget.
|
|
9
|
+
*
|
|
10
|
+
* Anchors AC-27106-1.
|
|
11
|
+
*
|
|
12
|
+
* Cleans up: closes both pools.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { createStore, connectionUrlFromEnv } from '../../../../packages/rcf-lite/test/fixtures/infra-postgres/src/store.mjs';
|
|
16
|
+
|
|
17
|
+
export default async function runProbe() {
|
|
18
|
+
const url = connectionUrlFromEnv();
|
|
19
|
+
const storeA = createStore({ connectionUrl: url, poolConfig: { max: 5 } });
|
|
20
|
+
const storeB = createStore({ connectionUrl: url, poolConfig: { max: 5 } });
|
|
21
|
+
const results = [];
|
|
22
|
+
try {
|
|
23
|
+
await Promise.all([storeA.ready(), storeB.ready()]);
|
|
24
|
+
const started = Date.now();
|
|
25
|
+
const promises = [];
|
|
26
|
+
for (let i = 0; i < 10; i++) {
|
|
27
|
+
promises.push(storeA.getPool().query('SELECT $1::int AS n, pg_sleep(0.05)', [i]));
|
|
28
|
+
promises.push(storeB.getPool().query('SELECT $1::int AS n, pg_sleep(0.05)', [10 + i]));
|
|
29
|
+
}
|
|
30
|
+
const settled = await Promise.allSettled(promises);
|
|
31
|
+
const elapsed = Date.now() - started;
|
|
32
|
+
const succeeded = settled.filter((s) => s.status === 'fulfilled').length;
|
|
33
|
+
const failed = settled.filter((s) => s.status === 'rejected').length;
|
|
34
|
+
results.push({
|
|
35
|
+
anchorAcId: 'AC-27106-1',
|
|
36
|
+
verdict: succeeded === 20 && failed === 0 ? 'pass' : 'fail',
|
|
37
|
+
detail: `20 concurrent queries dispatched across two pool-size-5 facades; ${succeeded} returned, ${failed} rejected, wall-clock ${elapsed}ms`,
|
|
38
|
+
});
|
|
39
|
+
// Observed max concurrent in-use per pool must be <= configured pool size
|
|
40
|
+
// pg's pg.Pool exposes totalCount / idleCount / waitingCount; peak in-use ~ totalCount - idleCount.
|
|
41
|
+
const poolA = storeA.getPool();
|
|
42
|
+
const poolB = storeB.getPool();
|
|
43
|
+
const maxA = poolA.options && poolA.options.max;
|
|
44
|
+
const maxB = poolB.options && poolB.options.max;
|
|
45
|
+
const inUseCap = maxA === 5 && maxB === 5;
|
|
46
|
+
results.push({
|
|
47
|
+
anchorAcId: 'AC-27106-1',
|
|
48
|
+
verdict: inUseCap ? 'pass' : 'fail',
|
|
49
|
+
detail: `pool.options.max on both facades: A=${maxA}, B=${maxB} (each configured to 5)`,
|
|
50
|
+
});
|
|
51
|
+
} finally {
|
|
52
|
+
await storeA.close();
|
|
53
|
+
await storeB.close();
|
|
54
|
+
}
|
|
55
|
+
return results;
|
|
56
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prepared-statement scan probe.
|
|
3
|
+
*
|
|
4
|
+
* Walks every .js / .mjs / .ts file under the applied fixture's facade
|
|
5
|
+
* directory (packages/rcf-lite/test/fixtures/infra-postgres/src/) and
|
|
6
|
+
* asserts every .query(...) call's first argument is a static string
|
|
7
|
+
* literal (single or double-quoted string, or a backtick template
|
|
8
|
+
* literal with no ${...} expressions).
|
|
9
|
+
*
|
|
10
|
+
* Anchors AC-27103-1 (prepared-statement discipline).
|
|
11
|
+
*
|
|
12
|
+
* The scan is a hand-rolled tokenising walker, not a full AST parser:
|
|
13
|
+
* this avoids adding acorn or babel as a rcf-lite dependency (round-5
|
|
14
|
+
* spec section 5.5, brief section 4). The tokeniser handles strings,
|
|
15
|
+
* template literals, comments, and nested parentheses. Runs
|
|
16
|
+
* build-observable; the facade-round-trip probe carries the runtime
|
|
17
|
+
* observable that the surface actually works.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
21
|
+
import { join, resolve, dirname } from 'node:path';
|
|
22
|
+
import { fileURLToPath } from 'node:url';
|
|
23
|
+
|
|
24
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
25
|
+
const FACADE_DIR = resolve(HERE, '..', '..', '..', '..', 'packages/rcf-lite/test/fixtures/infra-postgres/src');
|
|
26
|
+
|
|
27
|
+
async function walk(dir) {
|
|
28
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
29
|
+
const files = [];
|
|
30
|
+
for (const e of entries) {
|
|
31
|
+
if (e.isDirectory()) {
|
|
32
|
+
files.push(...(await walk(join(dir, e.name))));
|
|
33
|
+
} else if (e.isFile() && /\.(mjs|js|ts)$/.test(e.name)) {
|
|
34
|
+
files.push(join(dir, e.name));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return files;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Strip block and line comments from source. Simple stripper: preserves
|
|
42
|
+
* string bodies (in ' " and `) so `/* not a comment *\/` inside a string
|
|
43
|
+
* survives. Good enough for the discipline scan.
|
|
44
|
+
*/
|
|
45
|
+
function stripCommentsPreserveStrings(src) {
|
|
46
|
+
const out = [];
|
|
47
|
+
let i = 0;
|
|
48
|
+
while (i < src.length) {
|
|
49
|
+
const c = src[i];
|
|
50
|
+
const c2 = src[i + 1];
|
|
51
|
+
if (c === '/' && c2 === '/') {
|
|
52
|
+
while (i < src.length && src[i] !== '\n') i++;
|
|
53
|
+
out.push(' ');
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (c === '/' && c2 === '*') {
|
|
57
|
+
i += 2;
|
|
58
|
+
while (i < src.length && !(src[i] === '*' && src[i + 1] === '/')) i++;
|
|
59
|
+
i += 2;
|
|
60
|
+
out.push(' ');
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (c === "'" || c === '"') {
|
|
64
|
+
const q = c;
|
|
65
|
+
out.push(c);
|
|
66
|
+
i++;
|
|
67
|
+
while (i < src.length && src[i] !== q) {
|
|
68
|
+
if (src[i] === '\\' && i + 1 < src.length) {
|
|
69
|
+
out.push(src[i], src[i + 1]);
|
|
70
|
+
i += 2;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
out.push(src[i]);
|
|
74
|
+
i++;
|
|
75
|
+
}
|
|
76
|
+
if (i < src.length) {
|
|
77
|
+
out.push(src[i]);
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (c === '`') {
|
|
83
|
+
out.push(c);
|
|
84
|
+
i++;
|
|
85
|
+
while (i < src.length && src[i] !== '`') {
|
|
86
|
+
if (src[i] === '\\' && i + 1 < src.length) {
|
|
87
|
+
out.push(src[i], src[i + 1]);
|
|
88
|
+
i += 2;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (src[i] === '$' && src[i + 1] === '{') {
|
|
92
|
+
out.push(src[i], src[i + 1]);
|
|
93
|
+
i += 2;
|
|
94
|
+
let depth = 1;
|
|
95
|
+
while (i < src.length && depth > 0) {
|
|
96
|
+
if (src[i] === '{') depth++;
|
|
97
|
+
else if (src[i] === '}') depth--;
|
|
98
|
+
out.push(src[i]);
|
|
99
|
+
i++;
|
|
100
|
+
}
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
out.push(src[i]);
|
|
104
|
+
i++;
|
|
105
|
+
}
|
|
106
|
+
if (i < src.length) {
|
|
107
|
+
out.push(src[i]);
|
|
108
|
+
i++;
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
out.push(c);
|
|
113
|
+
i++;
|
|
114
|
+
}
|
|
115
|
+
return out.join('');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Find every .query(...) call site and classify its first argument.
|
|
120
|
+
* Returns [{ line, firstArgKind }] where firstArgKind is 'stringLiteral',
|
|
121
|
+
* 'templateStatic', 'templateWithExpression', 'stringConcat', or
|
|
122
|
+
* 'other'.
|
|
123
|
+
*/
|
|
124
|
+
function scanQueryCalls(src) {
|
|
125
|
+
const cleaned = stripCommentsPreserveStrings(src);
|
|
126
|
+
const calls = [];
|
|
127
|
+
const rx = /\.query\s*\(/g;
|
|
128
|
+
let m;
|
|
129
|
+
while ((m = rx.exec(cleaned)) !== null) {
|
|
130
|
+
const start = m.index + m[0].length;
|
|
131
|
+
const line = cleaned.slice(0, start).split('\n').length;
|
|
132
|
+
// Find the first argument by scanning forward, respecting parens/braces/strings
|
|
133
|
+
let i = start;
|
|
134
|
+
while (i < cleaned.length && /\s/.test(cleaned[i])) i++;
|
|
135
|
+
const first = cleaned[i];
|
|
136
|
+
if (first === "'" || first === '"') {
|
|
137
|
+
calls.push({ line, firstArgKind: 'stringLiteral', preview: cleaned.slice(i, i + 60) });
|
|
138
|
+
} else if (first === '`') {
|
|
139
|
+
// Check if backtick body has ${...}
|
|
140
|
+
let j = i + 1;
|
|
141
|
+
let hasExpr = false;
|
|
142
|
+
while (j < cleaned.length && cleaned[j] !== '`') {
|
|
143
|
+
if (cleaned[j] === '$' && cleaned[j + 1] === '{') { hasExpr = true; break; }
|
|
144
|
+
if (cleaned[j] === '\\') j++;
|
|
145
|
+
j++;
|
|
146
|
+
}
|
|
147
|
+
calls.push({ line, firstArgKind: hasExpr ? 'templateWithExpression' : 'templateStatic', preview: cleaned.slice(i, i + 60) });
|
|
148
|
+
} else if (/[A-Za-z_$]/.test(first)) {
|
|
149
|
+
// Identifier or expression: could be a variable holding a static string, but that defeats the scan discipline
|
|
150
|
+
calls.push({ line, firstArgKind: 'other', preview: cleaned.slice(i, i + 60) });
|
|
151
|
+
} else {
|
|
152
|
+
calls.push({ line, firstArgKind: 'other', preview: cleaned.slice(i, i + 60) });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return calls;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export default async function runProbe() {
|
|
159
|
+
const files = await walk(FACADE_DIR);
|
|
160
|
+
const results = [];
|
|
161
|
+
const violations = [];
|
|
162
|
+
let totalCalls = 0;
|
|
163
|
+
for (const file of files) {
|
|
164
|
+
const src = await readFile(file, 'utf8');
|
|
165
|
+
const calls = scanQueryCalls(src);
|
|
166
|
+
for (const c of calls) {
|
|
167
|
+
totalCalls++;
|
|
168
|
+
if (c.firstArgKind === 'templateWithExpression' || c.firstArgKind === 'stringConcat') {
|
|
169
|
+
violations.push({ file, ...c });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
results.push({
|
|
174
|
+
anchorAcId: 'AC-27103-1',
|
|
175
|
+
verdict: violations.length === 0 ? 'pass' : 'fail',
|
|
176
|
+
detail: violations.length === 0
|
|
177
|
+
? `${totalCalls} .query call sites scanned across ${files.length} facade file(s); every first argument is a static string literal or a template with no expressions`
|
|
178
|
+
: `${violations.length} violation(s): ${JSON.stringify(violations)}`,
|
|
179
|
+
});
|
|
180
|
+
results.push({
|
|
181
|
+
anchorAcId: 'AC-27103-1',
|
|
182
|
+
verdict: totalCalls >= 5 ? 'pass' : 'warn',
|
|
183
|
+
detail: `total .query call sites scanned: ${totalCalls} (minimum 5 to consider the facade meaningfully covered by this scan)`,
|
|
184
|
+
});
|
|
185
|
+
return results;
|
|
186
|
+
}
|