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
package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "object-storage-s3-REQ-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "One facade module is the sole reader of the S3 client and opens on boot",
|
|
5
|
+
"description": "The application accesses object storage through a single facade module in the project's source tree that is the ONLY module in the tree that imports the S3 client (either @aws-sdk/client-s3 on Node targets or aws4fetch on Workers targets per ADR-2901). Every other module that touches object storage imports the facade and calls its named domain verbs; no other module holds the raw S3 client, an S3Client instance, or an aws4fetch AwsClient instance. On process boot, the facade opens the client against the elicited endpoint URL and bucket name, and once the first successful ready-check completes, emits a facadeReady lifecycle event carrying endpoint host and bucket name. The endpoint URL (a Cloudflare R2 URL, an AWS S3 URL, a MinIO URL, or any S3-compatible remote) and the bucket name are elicited at apply time.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "object-storage",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A single facade is what turns the raw S3 client surface into an application-side surface with domain-shaped verbs. Multiple call sites reaching into the client directly produces a codebase where the endpoint, the credential-pair discipline, the event-emission discipline, and the multipart-threshold posture are all diffused across the tree. One facade means one place to test, one place to swap adapters (the Workers-side aws4fetch adapter slots in here without moving any AC), and one place where the object-storage code paths are discoverable.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:object-storage-s3",
|
|
12
|
+
"category:01-facade"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
17
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
18
|
+
}
|
package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "object-storage-s3-REQ-002",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Put, get, delete, list contract on typed keys",
|
|
5
|
+
"description": "The facade exposes named domain verbs (putObject, getObject, deleteObject, listObjects) that take a typed key (a project-defined key namespace, not a raw string on the public surface where a typed alternative fits), a content-type string on put, and return either the object body (get), a boolean success (put, delete), or a paginated key listing (list). Every read and write goes through the S3 client's public request surface; no facade verb accepts a raw request object or a general-purpose passthrough from consumer code. The put verb emits objectPut with key, size, contentType, timestamp; the delete verb emits objectDeleted with key, timestamp.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "object-storage",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Typed named domain verbs make the object-storage boundary auditable: consumer call sites are enumerable, and swapping the underlying adapter or endpoint has one place to change. A raw-request-passthrough on the public surface defeats the sole-reader discipline REQ-001 pins.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:object-storage-s3",
|
|
12
|
+
"category:02-put-get-delete-list"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
17
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
18
|
+
}
|
package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "object-storage-s3-REQ-003",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Presigned-URL contract with bounded TTL",
|
|
5
|
+
"description": "The facade exposes a presignGetUrl verb that issues a presigned URL for GET against an existing key with a bounded TTL: default 15 minutes per ADR-2902, floor 1 minute, ceiling elicited by the operator with no shipped default. A presignedIssued lifecycle event fires with key, ttl (seconds), and timestamp on every issue. The URL is signed at the client edge with the applied credentials; a fetch of the URL within TTL returns the object body, and a fetch after TTL returns 403 or the storage-side 403-equivalent (MinIO returns 403 with an XML AccessDenied body; the R2 shape matches). No presigned PUT is shipped on the v1.0.0 surface; the multipart-upload path (REQ-004) is the shipped write-side above the threshold.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "object-storage",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A presigned URL is the standard mechanism for delegating read access to an object without handing out credentials. A bounded TTL is generic enterprise practice: too-short and legitimate readers miss the window, too-long and a leaked URL is a persistent breach. 15 minutes as the default matches the AWS SDK default; the 1-minute floor is a defensive against copy-paste ADRs.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:object-storage-s3",
|
|
12
|
+
"category:03-presigned-url"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
17
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
18
|
+
}
|
package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "object-storage-s3-REQ-004",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Multipart-upload contract above an elicited threshold",
|
|
5
|
+
"description": "For payloads above the elicited threshold (default 8 MiB per ADR-2903), the facade's put path switches transparently to multipart-upload: initiate multipart upload, part-upload each chunk with a stable part number and returned ETag, complete-multipart-upload with the ordered part list. A part-upload failure aborts the in-flight upload (AbortMultipartUpload) before propagating the error; leaving an incomplete multipart upload behind is not the shipped path. On completion the objectPut lifecycle event fires with the final total size. Multipart re-upload semantics (per the R2 doc, a re-upload to the same part number replaces the previous with loss-on-fail) is a documented gotcha named in the README; the multipart-upload probe asserts an end-to-end round-trip of at least 10 MiB.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "object-storage",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "S3-shape storage caps single-put at 5 GiB; multipart is the required path for larger objects and the pragmatic path above ~8 MiB where the AWS SDK's own multi-part-transferer switches by default. Shipping the multipart-upload as a facade concern (not a consumer concern) keeps consumer code shape-stable across payload sizes.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:object-storage-s3",
|
|
12
|
+
"category:04-multipart"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
17
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
18
|
+
}
|
package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "object-storage-s3-REQ-005",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Lifecycle events at four moments with metadata-only fields",
|
|
5
|
+
"description": "The facade emits four lifecycle events on the injected event sink: facadeReady (endpoint host, bucket name, timestamp), objectPut (key, size, contentType, timestamp), objectDeleted (key, timestamp), presignedIssued (key, ttl, timestamp). No event record carries object body bytes, no body checksum, no user id fields beyond what appears in the key itself, no PII drawn from the object body, and no adapter internal state. The event sink is a synchronous callback the operator wires; the facade never invokes it with domain-row values or authentication tokens. TAC-2903 realises the event-sink contract; the event-secrecy probe asserts field-level whitelist compliance against a PII fixture.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "object-storage",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "The event sink is the observability seam the applied logger and error-handling companions bind to. A leak of object body or PII through the event sink defeats every downstream redaction the logger applies. The metadata-only rule is the field-level whitelist the event-secrecy probe enforces.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:object-storage-s3",
|
|
12
|
+
"category:05-lifecycle-events"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
17
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
18
|
+
}
|
package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "object-storage-s3-REQ-006",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Credential-pair discipline via security-secrets-management; refuses composition without",
|
|
5
|
+
"description": "The credential pair (accessKeyId, secretAccessKey) required to sign S3 requests is a secretRef value delegated to security-secrets-management: an opaque string agreed between object-storage-s3 and security-secrets-management naming the secret entry, never the credential value itself. The apply verb refuses composition on a project that has NOT applied security-secrets-management with exit code 3 and the stable message id object-storage-s3-no-secrets on stderr, per infra round 5 spec section 5.2 (Baz decision 6). The refusal names the required predecessor blueprint (security-secrets-management) and the override flag (--allow-no-secrets-yet). The override records a note on the applied blueprint's source.notes so rcf define validate can later flag the surface as not-yet-activated. The compose-test path checks the pair through the applied secrets facade before the object-store facade opens.",
|
|
6
|
+
"category": "security",
|
|
7
|
+
"domain": "object-storage",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A project that skips secrets-management and hardcodes the credential pair defeats the discipline; the compose-time refusal is the mechanism that makes the discipline reach through the mechanism-reach principle. The override records a note, not a bypass, so the operator later reconciles.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:object-storage-s3",
|
|
12
|
+
"category:06-credentials"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
17
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
18
|
+
}
|
package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2901-object-storage-s3-facade",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Object-storage S3 facade",
|
|
8
|
+
"purpose": "The single project-side module that imports the S3 client (either @aws-sdk/client-s3 on Node targets or aws4fetch on Workers targets per ADR-2901), exposes narrow named domain verbs to consumer code (putObject, getObject, deleteObject, listObjects, presignGetUrl), delegates payloads above the ADR-2903 threshold to the multipart-uploader (TAC-2902), and emits structured lifecycle events to the event sink (TAC-2903). Consumers never destructure the S3 client outside this module; the facade is the one place the vendor surface lives. The adapter reference is opaque at this boundary so a Workers-side aws4fetch adapter or a future adapter (a GCS shim, an Azure Blob shim) slots in without a facade re-shape.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Open the S3 client on boot against the elicited endpoint URL and bucket name; hold no other reference to the S3 vendor surface; export no symbol that leaks the raw client (AC-28101-1, AC-28101-2).",
|
|
11
|
+
"Expose named domain verbs (putObject, getObject, deleteObject, listObjects, presignGetUrl) as named exports with typed parameters; refuse a raw-request passthrough on the public surface (AC-28102-1, AC-28102-2, AC-28102-3).",
|
|
12
|
+
"Route payloads above the elicited ADR-2903 threshold through the multipart uploader (TAC-2902); on part-upload failure, AbortMultipartUpload before propagating the error (AC-28104-1, AC-28104-2).",
|
|
13
|
+
"Issue presigned GET URLs with a bounded TTL (floor 1 minute, default 15 minutes per ADR-2902, ceiling elicited); emit presignedIssued on the sink (AC-28103-1).",
|
|
14
|
+
"Emit facadeReady exactly once per facade instance on the injected event sink with endpointHost and bucketName; serialise pre-ready consumer verbs behind the ready-check (AC-28101-1).",
|
|
15
|
+
"Consume the credential pair as an opaque secretRef through the applied security-secrets-management surface; never accept a plain-value credential on the public surface (AC-28106-1, AC-28106-2)."
|
|
16
|
+
],
|
|
17
|
+
"internalStructure": "One module exporting a createObjectStore({ endpointUrl, bucket, credentialsRef, adapter, multipartThresholdBytes, defaultPresignTtlSeconds, onEvent }) factory returning an ObjectStore whose methods are the named domain verbs. The S3 client import lives at the top of this module; the factory captures a client instance keyed to the elicited endpoint and bucket, wires the sink, and hands back closures. Consumers destructure the verbs they need at their top level and hold the facade reference for the process lifetime.",
|
|
18
|
+
"interfaces": [
|
|
19
|
+
{
|
|
20
|
+
"name": "createObjectStore",
|
|
21
|
+
"kind": "factory",
|
|
22
|
+
"description": "createObjectStore({ endpointUrl, bucket, credentialsRef, adapter, multipartThresholdBytes, defaultPresignTtlSeconds, onEvent }) -> ObjectStore. The sole entry point every consumer calls. Opens the S3 client against endpointUrl and bucket; wires the sink; hands back an ObjectStore whose methods are the named domain verbs."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "onEvent",
|
|
26
|
+
"kind": "callback",
|
|
27
|
+
"description": "Structured-event sink invoked with { event, ts, ... } for facadeReady, objectPut, objectDeleted, presignedIssued events. Never invoked with object body values or credential material."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "store.verbs",
|
|
31
|
+
"kind": "read-write-api",
|
|
32
|
+
"description": "The named domain verbs the facade exposes: putObject(key, contentType, body), getObject(key), deleteObject(key), listObjects(prefix, continuationToken), presignGetUrl(key, ttlSeconds)."
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"dependencies": [
|
|
36
|
+
{
|
|
37
|
+
"name": "Multipart uploader",
|
|
38
|
+
"kind": "tac",
|
|
39
|
+
"tacId": "TAC-2902-object-storage-s3-multipart-uploader",
|
|
40
|
+
"description": "The helper the facade delegates to for payloads above the ADR-2903 threshold; handles initiate, part-upload, complete-multipart-upload, abort-on-error."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "Event sink",
|
|
44
|
+
"kind": "tac",
|
|
45
|
+
"tacId": "TAC-2903-object-storage-s3-event-sink",
|
|
46
|
+
"description": "The lifecycle-event sink contract the facade emits through with metadata-only field discipline."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "Credential pair via security-secrets-management",
|
|
50
|
+
"kind": "external",
|
|
51
|
+
"description": "The applied security-secrets-management blueprint supplies the credential pair as an opaque secretRef the facade dereferences at boot; the compose-test path refuses composition when the predecessor is not applied."
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"tradeoffs": "The facade holds a single client instance per bucket at v1.0.0; a project needing multiple buckets creates multiple facade instances. The adapter reference is opaque at ADR-2901 so a future aws4fetch adapter or GCS/Azure shim slots in as a per-target module swap; the outward interface stays unchanged.",
|
|
55
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
56
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
57
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2902-object-storage-s3-multipart-uploader",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Multipart uploader",
|
|
8
|
+
"purpose": "The helper the facade delegates to for payloads above the ADR-2903 threshold. Wraps CreateMultipartUpload, UploadPart (one per chunk), CompleteMultipartUpload, and AbortMultipartUpload on error into a single put verb the facade calls. Holds the multipart-upload id and part list in memory for the duration of the upload; guarantees an Abort on any thrown error before propagating the rejection, so no orphan in-flight upload remains on the bucket.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Chunk the payload into fixed-size parts sized to the ADR-2903 threshold (default 8 MiB) with a final smaller-tail part if applicable (AC-28104-1).",
|
|
11
|
+
"Issue CreateMultipartUpload against the bucket and key; capture the returned UploadId (AC-28104-1).",
|
|
12
|
+
"Issue UploadPart for each chunk with a stable one-based PartNumber and stream the ETag responses into the part list (AC-28104-1).",
|
|
13
|
+
"On any UploadPart failure, issue AbortMultipartUpload with the captured UploadId before propagating the error to the caller; the abort is best-effort but is always attempted (AC-28104-2).",
|
|
14
|
+
"On successful upload of every part, issue CompleteMultipartUpload with the ordered part list; the get after complete returns the payload at full size (AC-28104-1).",
|
|
15
|
+
"Emit no lifecycle events itself; the outer facade owns event emission on completion (AC-28104-1)."
|
|
16
|
+
],
|
|
17
|
+
"internalStructure": "One module exporting a putMultipart({ client, bucket, key, contentType, body, partSizeBytes }) async function. The function iterates the payload in partSizeBytes chunks, awaits UploadPart per chunk, and awaits CompleteMultipartUpload on success or AbortMultipartUpload on any thrown error. The UploadId and part-etag list are held in local scope; no state escapes across concurrent uploads.",
|
|
18
|
+
"interfaces": [
|
|
19
|
+
{
|
|
20
|
+
"name": "putMultipart",
|
|
21
|
+
"kind": "function",
|
|
22
|
+
"description": "putMultipart({ client, bucket, key, contentType, body, partSizeBytes }) -> Promise<{size, etag}>. Throws on any part-upload failure after AbortMultipartUpload attempts to clean up."
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"dependencies": [
|
|
26
|
+
{
|
|
27
|
+
"name": "Facade",
|
|
28
|
+
"kind": "tac",
|
|
29
|
+
"tacId": "TAC-2901-object-storage-s3-facade",
|
|
30
|
+
"description": "The facade owns the S3 client instance and the elicited bucket; it passes both to the multipart uploader on invocation and owns event emission after completion."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"tradeoffs": "The uploader holds the full payload in memory chunk-by-chunk at v1.0.0; a streaming-source variant lands as a v1.1 minor when a project needs it. The abort on part-upload failure is best-effort per the R2 doc semantics (re-uploads to the same part number replace the previous with loss-on-fail); the README names the gotcha.",
|
|
34
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
35
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
36
|
+
}
|
package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2903-object-storage-s3-event-sink",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Lifecycle event sink",
|
|
8
|
+
"purpose": "The lifecycle-event sink contract the facade emits through, with a fixed metadata-only field discipline. Consumers wire the sink as a synchronous callback; the facade never invokes the sink with object body values, credential material, or PII fields drawn from the object body. The event-secrecy probe (AC-28105-1) asserts the whitelist against a PII fixture.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Emit facadeReady exactly once per facade instance with { event, ts, endpointHost, bucketName } (AC-28101-1).",
|
|
11
|
+
"Emit objectPut on every successful put (single-part or multipart) with { event, ts, key, size, contentType } (AC-28102-1, AC-28104-1).",
|
|
12
|
+
"Emit objectDeleted on every successful delete with { event, ts, key } (AC-28102-2).",
|
|
13
|
+
"Emit presignedIssued on every presign with { event, ts, key, ttl } (AC-28103-1).",
|
|
14
|
+
"Never carry a body bytes field, a body checksum field, a userId field, a ssn field, an email field, or any string drawn from the object body itself (AC-28105-1).",
|
|
15
|
+
"Be synchronous and idempotent from the sink caller side; the facade does not await the sink return value."
|
|
16
|
+
],
|
|
17
|
+
"internalStructure": "A callback function type onEvent(record) invoked by the facade with a minimum-shape record. Records are plain objects with only the whitelisted fields; the facade never spreads an S3 client response or an internal buffer into a record. The event-secrecy probe walks every field name and every field value on every emitted record.",
|
|
18
|
+
"interfaces": [
|
|
19
|
+
{
|
|
20
|
+
"name": "onEvent",
|
|
21
|
+
"kind": "callback",
|
|
22
|
+
"description": "onEvent(record: {event: 'facadeReady' | 'objectPut' | 'objectDeleted' | 'presignedIssued', ts: number, [k: string]: any}) -> void. Consumers pass the callback to createObjectStore; the facade calls it synchronously at the moment of the event."
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"dependencies": [
|
|
26
|
+
{
|
|
27
|
+
"name": "Facade",
|
|
28
|
+
"kind": "tac",
|
|
29
|
+
"tacId": "TAC-2901-object-storage-s3-facade",
|
|
30
|
+
"description": "The facade owns the sink invocation; the sink itself is a caller-supplied callback with no dependencies of its own."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"tradeoffs": "The whitelist is defined in prose and enforced by probe rather than by a schema, at v1.0.0. A rcf-schemas minor may promote the event-record shape into a shared schema; the round-2 amendment posture (deferred to two-consumer agreement) applies.",
|
|
34
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
35
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
36
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "One facade module opens the S3 client on boot and emits facadeReady with endpoint host and bucket name",
|
|
8
|
+
"asA": "developer whose service needs S3-shape object storage behind a swappable boundary",
|
|
9
|
+
"iWant": "one facade module to hold the S3 client and expose named domain verbs, with a facadeReady lifecycle event on the first successful ready-check",
|
|
10
|
+
"soThat": "the boundary between my domain and the S3 vendor surface is the only place that has to move when the adapter changes, and boot ordering is observable via the event",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28101-1",
|
|
14
|
+
"description": "On process boot, the facade opens an S3 client against the elicited endpoint URL and bucket name; once the first successful ready-check (a HeadBucket or equivalent metadata call) returns, a facadeReady event fires on the injected event sink with a payload containing endpoint host and bucket name.",
|
|
15
|
+
"given": "a Node process with the facade module imported and its factory invoked",
|
|
16
|
+
"when": "the process boots and the facade's ready-check returns",
|
|
17
|
+
"then": "a facadeReady event fires on the injected event sink with a payload containing endpointHost and bucketName, and the client is ready to accept verbs; the facade exposes named domain verbs and does not re-export the raw S3 client",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-28101-2",
|
|
23
|
+
"description": "Exactly one source-tree module inside the facade directory imports the S3 client (@aws-sdk/client-s3 or aws4fetch per ADR-2901); every other module that touches object storage imports the facade and calls its named domain verbs, verified by a targeted grep on the applied fixture.",
|
|
24
|
+
"given": "the applied project's source tree after apply",
|
|
25
|
+
"when": "grep 'from \\'@aws-sdk/client-s3\\'' or 'from \\'aws4fetch\\'' walks the tree outside the facade directory",
|
|
26
|
+
"then": "no match is found outside the facade directory; the facade's public surface exports named domain verbs only, no raw S3 client reference",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2901-object-storage-s3-facade"],
|
|
32
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
33
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
34
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The facade puts, gets, deletes and lists on typed keys with byte-equal round-trip",
|
|
8
|
+
"asA": "developer storing user uploads and generated artefacts as S3-shape objects",
|
|
9
|
+
"iWant": "put, get, delete, list verbs on the facade that round-trip bytes without corruption and emit lifecycle events",
|
|
10
|
+
"soThat": "my consumer code stays vendor-neutral above the facade and observability wires cleanly",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28102-1",
|
|
14
|
+
"description": "Given a putObject through the facade for a known key, a stable content-type, and a 1 KiB payload, when a subsequent getObject reads the key, then the returned bytes equal the put bytes and the content-type header matches; an objectPut lifecycle event fires with key, size=1024, contentType, timestamp.",
|
|
15
|
+
"given": "the facade opened against a running S3-compatible engine and a bucket that exists",
|
|
16
|
+
"when": "putObject(key, contentType='application/octet-stream', body=<1 KiB Buffer>) then getObject(key)",
|
|
17
|
+
"then": "the returned body's byte length equals 1024 and the returned content-type equals application/octet-stream; the events list captured on the sink contains an objectPut record with matching key, size 1024, contentType, timestamp; no body bytes appear in any event record",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-28102-2",
|
|
23
|
+
"description": "Given a deleteObject through the facade for a known key that exists, when the delete returns, then a getObject on the same key returns a not-found error (S3 NoSuchKey or the storage-side 404-equivalent); an objectDeleted event fires with the key and timestamp.",
|
|
24
|
+
"given": "an object previously put through the facade",
|
|
25
|
+
"when": "deleteObject(key) followed by getObject(key)",
|
|
26
|
+
"then": "the getObject rejects with a not-found shape (NoSuchKey on S3/R2/MinIO); an objectDeleted event fires on the sink with matching key and timestamp",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-28102-3",
|
|
32
|
+
"description": "Given at least three objects put under a common key prefix, when listObjects(prefix) is called, then the returned page contains every put key at or under the prefix and a boolean isTruncated indicating whether more pages exist.",
|
|
33
|
+
"given": "three keys previously put under prefix probe/list/",
|
|
34
|
+
"when": "listObjects(prefix='probe/list/')",
|
|
35
|
+
"then": "the returned keys include every put key with matching prefix, and the paginated envelope carries an isTruncated boolean",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"tacIds": ["TAC-2901-object-storage-s3-facade"],
|
|
41
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
42
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
43
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The facade issues presigned GET URLs with bounded TTL; a fetch within TTL returns 200 and after TTL returns 403",
|
|
8
|
+
"asA": "developer handing delegated read access to a browser client",
|
|
9
|
+
"iWant": "presignGetUrl on the facade with a bounded TTL and a lifecycle event on issue",
|
|
10
|
+
"soThat": "the browser fetches the object directly from the storage endpoint without holding my credentials, and my logs can bind to the issue event",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28103-1",
|
|
14
|
+
"description": "Given a presignGetUrl call with ttl=60 seconds for a known key, when the returned URL is fetched with Node built-in fetch within TTL, then the response status is 200 and the body bytes equal the object bytes; when the same URL is fetched after ttl+2 seconds, the response status is 403 (S3-shape AccessDenied) or the storage-side 403-equivalent; a presignedIssued event fires on the sink with key, ttl=60, timestamp.",
|
|
15
|
+
"given": "an object previously put through the facade and the facade opened",
|
|
16
|
+
"when": "presignGetUrl(key, ttl=60) then fetch(url) immediately, then wait ttl+2 seconds and fetch(url) again",
|
|
17
|
+
"then": "first fetch returns 200 with body bytes equal to the put payload; second fetch returns 403; the events list contains a presignedIssued record with key, ttl=60, timestamp; no URL or credential material appears in any event record",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-2901-object-storage-s3-facade"],
|
|
23
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
24
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
25
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28104",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The facade multipart-uploads payloads above the elicited threshold and rounds-trip byte-equal",
|
|
8
|
+
"asA": "developer uploading large payloads (attachments, generated reports, backups)",
|
|
9
|
+
"iWant": "the facade to switch to multipart upload above the elicited threshold, and to abort in-flight multipart on failure",
|
|
10
|
+
"soThat": "my consumer code stays shape-stable across sizes and I do not leave orphan multipart uploads behind",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28104-1",
|
|
14
|
+
"description": "Given the elicited multipart threshold at 8 MiB (ADR-2903 default), when putObject is called with a 10 MiB payload, then the facade switches to multipart-upload (initiate, part-upload, complete), the get returns byte-equal 10485760 bytes back, and an objectPut event fires with size 10485760 and timestamp.",
|
|
15
|
+
"given": "the facade opened against a running S3-compatible engine, threshold=8 MiB",
|
|
16
|
+
"when": "putObject(key, contentType, body=<10 MiB Buffer>) then getObject(key)",
|
|
17
|
+
"then": "the getObject returns a body of exact size 10485760 with byte equality to the put payload; the events list contains one objectPut record with size=10485760; no ListMultipartUploads on the bucket surfaces an in-flight upload after completion",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-28104-2",
|
|
23
|
+
"description": "Given a simulated part-upload failure mid-multipart (SIMULATE_PART_UPLOAD_FAIL fixture switch), when putObject is called with a 10 MiB payload, then the facade issues AbortMultipartUpload before propagating the error, and a subsequent ListMultipartUploads on the bucket surfaces zero in-flight uploads for the key.",
|
|
24
|
+
"given": "the facade opened, threshold=8 MiB, SIMULATE_PART_UPLOAD_FAIL=true",
|
|
25
|
+
"when": "putObject(key, contentType, body=<10 MiB Buffer>) rejects mid-upload",
|
|
26
|
+
"then": "the rejection propagates to the caller; a probe-side ListMultipartUploads(prefix=key) returns zero uploads; no completed object appears at key",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2902-object-storage-s3-multipart-uploader"],
|
|
32
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
33
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
34
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28105",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-005",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Lifecycle event records carry metadata only; no body, no user id, no PII",
|
|
8
|
+
"asA": "operator wiring the logger and error-handling companions to the object-storage facade",
|
|
9
|
+
"iWant": "every lifecycle event record to carry a fixed metadata-only shape",
|
|
10
|
+
"soThat": "downstream loggers cannot leak object body bytes, user ids, or PII drawn from the object body",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28105-1",
|
|
14
|
+
"description": "Given a lifecycle-event spy attached to the sink, when put, get, delete, and presign verbs run against a PII fixture (key users/1234/passport.jpg, body carrying the PII fixture text), then every event record on the sink carries only fields from the whitelist {event, key, size, contentType, ttl, timestamp, endpointHost, bucketName}; no field name matches userId or ssn or dob or email; no field value contains the PII fixture body text; no field value contains any part of the object body bytes.",
|
|
15
|
+
"given": "the facade opened, a spy on the event sink, a PII fixture body PII-FIXTURE-DO-NOT-LOG",
|
|
16
|
+
"when": "putObject(users/1234/passport.jpg, image/jpeg, <body containing PII-FIXTURE-DO-NOT-LOG>), then getObject, then presignGetUrl, then deleteObject",
|
|
17
|
+
"then": "every event record on the sink has keys drawn from the whitelist above; no event value contains the string PII-FIXTURE-DO-NOT-LOG; no event value contains a userId, ssn, dob, or email field; the key users/1234/passport.jpg appears on records as the key field only (not decomposed into userId)",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-2903-object-storage-s3-event-sink"],
|
|
23
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
24
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
25
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28106",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-006",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Apply-time refusal on a project without security-secrets-management, with a stable message id and an override flag",
|
|
8
|
+
"asA": "operator preventing hardcoded credential pairs on a new project",
|
|
9
|
+
"iWant": "rcf define blueprint add object-storage-s3 to refuse composition when security-secrets-management is not applied",
|
|
10
|
+
"soThat": "credential storage is disciplined by default and the override is an explicit note the operator later reconciles",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28106-1",
|
|
14
|
+
"description": "Given a fresh scratch project with no security-secrets-management applied, when rcf define blueprint add ./blueprints/object-storage-s3 runs, then the command exits 3 and stderr contains the stable message id object-storage-s3-no-secrets, the required predecessor blueprint name security-secrets-management, and the override flag --allow-no-secrets-yet; the scratch project's rcf tree does not carry object-storage-s3 contributions after the refusal.",
|
|
15
|
+
"given": "a fresh rcf init scratch project with no security-secrets-management applied",
|
|
16
|
+
"when": "rcf define blueprint add ./blueprints/object-storage-s3 runs against the scratch project",
|
|
17
|
+
"then": "the command exits 3; stderr contains the string object-storage-s3-no-secrets; stderr names security-secrets-management and the --allow-no-secrets-yet flag; the scratch tree has zero object-storage-s3 requirements after the refusal",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-28106-2",
|
|
23
|
+
"description": "Given the same fresh scratch project, when rcf define blueprint add ./blueprints/object-storage-s3 --allow-no-secrets-yet runs, then the command exits 0, the contributions land on the scratch tree, and the applied manifest records a source.notes entry naming the missing predecessor for later reconciliation.",
|
|
24
|
+
"given": "a fresh rcf init scratch project with no security-secrets-management applied",
|
|
25
|
+
"when": "rcf define blueprint add ./blueprints/object-storage-s3 --allow-no-secrets-yet runs against the scratch project",
|
|
26
|
+
"then": "the command exits 0; the applied manifest entry for object-storage-s3 carries a source.notes string naming the security-secrets-management predecessor and the --allow-no-secrets-yet override; the contributions land on disk",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2901-object-storage-s3-facade"],
|
|
32
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
33
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
34
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28107",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Round-trip against MinIO in the shared sample-app fixture; five local probes pass end-to-end",
|
|
8
|
+
"asA": "gate reviewer running the ship gate for object-storage-s3 in CI",
|
|
9
|
+
"iWant": "the five local Node-only probes to pass against a real MinIO container brought up from the shared infra-s3-and-queue fixture",
|
|
10
|
+
"soThat": "every runtime-observable AC has a live-engine verdict on file at ship time",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28107-1",
|
|
14
|
+
"description": "Given docker compose up -d minio from packages/rcf-lite/test/fixtures/infra-s3-and-queue/, when each of the five run-<probe>.mjs shims runs in sequence (facade-round-trip, put-get-round-trip, presigned-url, multipart-upload, event-secrecy), then each shim exits 0 and writes .rcf/reports/blueprints/object-storage-s3/<probe>.json with aggregateVerdict pass; every result carries an anchorAcId matching a contributed AC id on the blueprint.",
|
|
15
|
+
"given": "the shared fixture with docker compose up -d minio running and MinIO healthy on port 9000",
|
|
16
|
+
"when": "run-facade-round-trip.mjs, run-put-get-round-trip.mjs, run-presigned-url.mjs, run-multipart-upload.mjs, run-event-secrecy.mjs run in sequence",
|
|
17
|
+
"then": "each shim exits 0; each per-blueprint report at .rcf/reports/blueprints/object-storage-s3/<probe>.json carries aggregateVerdict pass; every result carries an anchorAcId matching a contributed AC id",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-28107-2",
|
|
23
|
+
"description": "Given the shared fixture, when each of the four wired induced-failure switches is set (SIMULATE_MINIO_DOWN, SIMULATE_403_ON_GET, SIMULATE_PART_UPLOAD_FAIL, SIMULATE_PRESIGN_MALFORMED) and the paired probe runs, then that probe's aggregate verdict flips from pass to fail on the AC anchored to the observation the switch corrupts.",
|
|
24
|
+
"given": "the shared fixture with MinIO running",
|
|
25
|
+
"when": "each induced-failure switch is set in turn and the paired probe runs",
|
|
26
|
+
"then": "the paired probe exits non-zero and the aggregate verdict lands as fail on the anchored AC; the fixture README documents the paired switch and probe for each of the four wired switches",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2901-object-storage-s3-facade", "TAC-2902-object-storage-s3-multipart-uploader", "TAC-2903-object-storage-s3-event-sink"],
|
|
32
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
33
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
34
|
+
}
|
package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "object-storage-s3-US-28108",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "object-storage-s3-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "R2 real-account smoke as an accountBound probe that skips cleanly without CI_HAS_CLOUDFLARE_ACCOUNT",
|
|
8
|
+
"asA": "gate reviewer running the ship gate without a Cloudflare-account CI secret",
|
|
9
|
+
"iWant": "r2-real-account-smoke to record accountBoundSkipped:true with verdict pass when CI_HAS_CLOUDFLARE_ACCOUNT is unset, and to run a real round-trip against R2 when it is set",
|
|
10
|
+
"soThat": "the gate stays green on contributors without a Cloudflare account and still proves the R2 adapter on a bound runner",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-28108-1",
|
|
14
|
+
"description": "Given CI_HAS_CLOUDFLARE_ACCOUNT is unset, when the r2-real-account-smoke.mjs shim runs, then the shim exits 0 and writes a per-blueprint report with one result carrying verdict pass, detail accountBound: skipped (no CI_HAS_CLOUDFLARE_ACCOUNT), and accountBoundSkipped: true; aggregateVerdict is pass.",
|
|
15
|
+
"given": "the environment with CI_HAS_CLOUDFLARE_ACCOUNT unset",
|
|
16
|
+
"when": "node blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs runs",
|
|
17
|
+
"then": "the shim exits 0; the report at .rcf/reports/blueprints/object-storage-s3/r2-real-account-smoke.json carries aggregateVerdict pass and a single result with accountBoundSkipped true",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-28108-2",
|
|
23
|
+
"description": "Given CI_HAS_CLOUDFLARE_ACCOUNT set alongside a real R2 endpoint URL, bucket name, and credential pair (all from security-secrets-management), when the r2-real-account-smoke.mjs shim runs, then the facade opens against the R2 bucket, puts a 1 KiB payload, gets it back byte-equal, deletes the temporary object on exit, and the report carries aggregateVerdict pass with accountBoundSkipped absent or false.",
|
|
24
|
+
"given": "the environment with CI_HAS_CLOUDFLARE_ACCOUNT set and R2 credentials wired via security-secrets-management",
|
|
25
|
+
"when": "node blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs runs",
|
|
26
|
+
"then": "the shim exits 0; the temporary object is deleted after the round-trip; the report carries aggregateVerdict pass and no accountBoundSkipped:true field",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-2901-object-storage-s3-facade"],
|
|
32
|
+
"createdAt": "2026-09-06T18:00:00.000Z",
|
|
33
|
+
"updatedAt": "2026-09-06T18:00:00.000Z"
|
|
34
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# object-storage-s3 blueprint coordination vocabulary
|
|
2
|
+
|
|
3
|
+
This file is the object-storage-s3 half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.4.4 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
|
|
4
|
+
|
|
5
|
+
## Global ADR topics this blueprint contributes (exact strings)
|
|
6
|
+
|
|
7
|
+
| Topic string | object-storage-s3 contribution | Origin | Composition note |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
| `objectStorageContract` | ADR-2904-object-storage-s3-contract | Minted by this blueprint. Names the wire-shape contract for object storage; the shipped answer is the AWS S3 API (per https://developers.cloudflare.com/r2/api/s3/api/ Cloudflare R2 is S3-compatible and per https://docs.min.io/community/minio-object-store/administration/object-management/object-lifecycle-management.html MinIO derives from the same shape). | The one project-wide decision on the wire-shape contract for object storage. A future non-S3-shape sibling (`object-storage-native-gcs`, `object-storage-native-azure`) would contribute the same topic string with a different answer, forcing a DELIBERATE conflict the operator resolves with a project-level ADR |
|
|
10
|
+
|
|
11
|
+
The object-storage-s3 blueprint claims one global topic. Every other contribution is scope-local (ADR-2901 adapter, ADR-2902 presigned TTL floor, ADR-2903 multipart threshold do not contribute global topics; a composing blueprint that holds an opinion on any of them authors its own project-level ADR).
|
|
12
|
+
|
|
13
|
+
Rules for new topics: lower camel case, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer.
|
|
14
|
+
|
|
15
|
+
## Id number bands (registry bootstrap)
|
|
16
|
+
|
|
17
|
+
This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
|
|
18
|
+
|
|
19
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
20
|
+
|---|---|---|---|---|
|
|
21
|
+
| application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
|
|
22
|
+
| application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
|
|
23
|
+
| security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
|
|
24
|
+
| email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
|
|
25
|
+
| hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
|
|
26
|
+
| persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
27
|
+
| delivery-ci-workflows | 6101-6899 | 7xx | shipped v2.0.0 (renamed from ci-pipeline) | `ciGates`, `strictCoverageGate`, `releaseArtefacts` |
|
|
28
|
+
| observability-essentials | 7101-7899 | 8xx | shipped v2.0.0 | `statusPageContract` |
|
|
29
|
+
| security-secrets-management | 8101-8899 | 9xx | shipped v1.0.1 | `secretsSource` |
|
|
30
|
+
| security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
|
|
31
|
+
| security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
|
|
32
|
+
| security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
|
|
33
|
+
| deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
|
|
34
|
+
| persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
35
|
+
| observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.1.0 | `healthProbes`, `readinessSemantics` |
|
|
36
|
+
| observability-logging | 15101-15899 | 16xx | shipped v1.0.0 | `logging` |
|
|
37
|
+
| application-error-handling | 16101-16899 | 17xx | shipped v1.0.0 | `errorHandling` |
|
|
38
|
+
| application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
|
|
39
|
+
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
40
|
+
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
41
|
+
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
42
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
|
|
43
|
+
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
44
|
+
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
45
|
+
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
46
|
+
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
47
|
+
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
48
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
49
|
+
|
|
50
|
+
US 28101-28108 sit at the LOW end of the 28101-28899 band on purpose (watchpost run-4 lesson). A project-side story mechanically derived from an object-storage-s3 REQ id into the number 28110 would collide against a shipped US-28110; band headroom (28109-28899) leaves that space.
|
|
51
|
+
|
|
52
|
+
ADR/TAC suffixes for this blueprint use the 2901-2999 block, continuing the shelf pattern.
|
|
53
|
+
|
|
54
|
+
## Shared expectations for future composing blueprints
|
|
55
|
+
|
|
56
|
+
- Reuse `objectStorageContract` exactly as spelled here when your blueprint holds an opinion on the wire-shape contract for object storage; contribute your own scope:global ADR on that string and let composition surface the pairing.
|
|
57
|
+
- A future `object-storage-native-gcs` or `object-storage-native-azure` sibling mints on demand; it composes on `security-secrets-management` for its own credential pair (same discipline as this blueprint) and conflicts by design on `objectStorageContract`.
|
|
58
|
+
- Consumer blueprints storing large binary payloads (uploads, attachments, generated reports) read the `objectStorage` capability declared on `blueprint.json` per section 6a of `blueprint-authoring.md`.
|
|
59
|
+
|
|
60
|
+
## Deliberate-conflict statement
|
|
61
|
+
|
|
62
|
+
This blueprint's ADR-2904 on `objectStorageContract` is a first shipped answer to a topic that will conflict, by design, with future non-S3-shape siblings. Applying `object-storage-s3` alongside a hypothetical `object-storage-native-gcs` raises one `globalAdrTopic` conflict the operator resolves via one of the four documented resolutions per topic (adopt one, keep the existing one, author a project-level supersede ADR, or `--resolve <topic>=project:<ADR-id>` on the add).
|