rcf-lite 0.21.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 +16 -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/docs/topics.md +7 -0
- package/blueprints/application-api-rest/docs/topics.md +8 -1
- package/blueprints/application-charts/docs/topics.md +7 -0
- package/blueprints/application-dashboard/docs/topics.md +7 -0
- package/blueprints/application-datatable/docs/topics.md +7 -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 +7 -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/docs/topics.md +7 -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 +8 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +8 -1
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +8 -1
- package/blueprints/email-smtp-resend/docs/topics.md +8 -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 +8 -1
- package/blueprints/observability-logging/CHANGELOG.md +4 -0
- package/blueprints/observability-logging/README.md +3 -0
- package/blueprints/observability-logging/blueprint.json +3 -2
- package/blueprints/observability-logging/docs/topics.md +7 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +8 -1
- package/blueprints/persistence-data-d1/docs/topics.md +8 -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 +8 -1
- package/blueprints/security-auth-clerk/CHANGELOG.md +4 -0
- package/blueprints/security-auth-clerk/README.md +3 -0
- package/blueprints/security-auth-clerk/blueprint.json +147 -30
- package/blueprints/security-auth-clerk/docs/topics.md +8 -1
- package/blueprints/security-auth-keycloak/CHANGELOG.md +4 -0
- package/blueprints/security-auth-keycloak/README.md +3 -0
- package/blueprints/security-auth-keycloak/blueprint.json +182 -37
- package/blueprints/security-auth-keycloak/docs/topics.md +8 -1
- package/blueprints/security-auth-magic-link/CHANGELOG.md +4 -0
- package/blueprints/security-auth-magic-link/README.md +3 -0
- package/blueprints/security-auth-magic-link/blueprint.json +159 -33
- package/blueprints/security-auth-magic-link/docs/topics.md +8 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +4 -0
- package/blueprints/security-auth-oauth2/README.md +3 -0
- package/blueprints/security-auth-oauth2/blueprint.json +158 -32
- package/blueprints/security-auth-oauth2/docs/topics.md +8 -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 +8 -1
- package/fixtures/canary-manifest.json +9 -9
- package/package.json +1 -1
- 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-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-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-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-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 +11 -1
- package/src/blueprint/apply.js +10 -1
- package/src/blueprint/capabilities.js +41 -2
- package/src/cli/blueprint.js +8 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-file-upload-REQ-002",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Progress contract: per-file percent, aggregate percent, and a polite live-region tick",
|
|
5
|
+
"description": "Every file in the upload set carries a per-file percent that advances monotonically from 0 to 100. The surface also carries an aggregate percent that reflects the mean weighted by byte size. A polite live-region wrapper (aria-live polite) receives a text tick at least every 10 percent of aggregate progress with the string format \"<uploaded> of <total> files, <PP> percent\". The polite wrapper is preseeded at render time so a screen reader adopts it before the first tick fires.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.2, REQ 2.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-file-upload",
|
|
12
|
+
"category:02-progress-contract"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-file-upload-REQ-003",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Refusal contract: MIME-type, size-limit and virus-scan refusals with an aria-describedby error binding and focus-to-retry",
|
|
5
|
+
"description": "The upload surface refuses a file that fails the MIME-type gate, exceeds the per-file size cap, or matches the virus-scan hit. Every refusal renders a per-file error message inside a region bound to the file row via aria-describedby, moves keyboard focus to the row's retry control, and refuses to send the file to the server. The refusal reason is one of the closed strings mime-refused, size-refused, virus-refused so a project's log pipeline can classify without prose parsing.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.2, REQ 3.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-file-upload",
|
|
12
|
+
"category:03-refusal-contract"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-file-upload-REQ-004",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Transport contract: chunked-and-resumable, multipart POST default, tus.io elicited alternative",
|
|
5
|
+
"description": "The upload transport is chunked-and-resumable: an interrupted upload resumes from the last acknowledged offset on retry, and the client retries on transient failures without re-sending acknowledged bytes. The recommended default is a multipart POST with the file split into fixed-size chunks the server assembles server-side. The tus.io resumable upload protocol 1.0.0 is the elicited alternative for projects with a tus server or the third-party SDK; when applied it exposes an Upload-Offset header per PATCH request and supports server-side pause and resume. A per-vendor SDK (S3 multipart, Cloudflare R2 client-direct) is the second elicited alternative when the project has committed to a vendor library.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.2, REQ 4.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-file-upload",
|
|
12
|
+
"category:04-transport-contract"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "application-file-upload-REQ-005",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "Completion contract: assertive-slot success announcement per WCAG 4.1.3 plus per-file remove and retry",
|
|
5
|
+
"description": "On successful completion of the upload set, the surface renders an assertive-slot announcement in a wrapper carrying role=status or aria-live=assertive with the string \"<N> files uploaded successfully\", per WCAG 4.1.3 Status Messages. Every completed file row carries a keyboard-reachable remove control (returns the row to the pre-upload state and issues a DELETE against the transport where the transport supports removal) and a retry control (visible only after a refusal or a transport error). The completion announcement fires exactly once per set; a retried refusal that then succeeds increments the completed count but does not re-announce.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "application",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Per visual round 4 spec section 5.2, REQ 5.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:application-file-upload",
|
|
12
|
+
"category:05-completion-contract"
|
|
13
|
+
],
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
17
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2401-application-file-upload-input",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Upload input surface",
|
|
8
|
+
"purpose": "Owns the input-side surface of the file-upload contract: the labelled file input, the drop-zone region, the keyboard-focusable picker-opener, the accessible-name binding, the file-collector aggregating the three input paths into one selection set, and the refusal-render seam. Every AC on REQ-001 and REQ-003 that reads the surface anchors on this TAC.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Render a labelled <input type=\"file\"> with a keyboard-reachable label and an accessible name (AC-23101-1).",
|
|
11
|
+
"Render a [data-drop-zone] region that accepts dropped files but is never the only input path (WCAG 2.5.7).",
|
|
12
|
+
"Render a [data-open-picker] button that opens the same picker on Enter or Space (AC-23101-1).",
|
|
13
|
+
"Aggregate the three input paths into one file-selection set the transport TAC drains (AC-23101-1).",
|
|
14
|
+
"Render a per-file error region with an aria-describedby binding and a [data-recovery=\"retry\"] control on refusal, and hand refused files to the transport TAC's refusal-render seam so no bytes leave the browser (AC-23103-1)."
|
|
15
|
+
],
|
|
16
|
+
"internalStructure": "One input-surface module the shell mounts on route entry. On file addition the module normalises the three input paths (input change, drop event, picker-opener button) into a File[] selection set, tags each entry with a stable [data-file-row] id, runs the accepted-set gates (MIME per ADR-2402, size per ADR-2402) and the virus-scan hook per ADR-2403 before handing the set to the transport TAC. Refusal renders inside the file row with a [data-error-message] element whose id is referenced by the row's aria-describedby attribute; the closed refusal-reason enum {mime-refused, size-refused, virus-refused} rides [data-refusal-reason].",
|
|
17
|
+
"interfaces": [
|
|
18
|
+
{
|
|
19
|
+
"name": "collectFiles",
|
|
20
|
+
"kind": "factory",
|
|
21
|
+
"description": "collectFiles({ inputEvent | dropEvent | pickerClick }) -> FileSelection. Every input path routes through this factory."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "renderRefusal",
|
|
25
|
+
"kind": "factory",
|
|
26
|
+
"description": "renderRefusal({ fileRow, reason }) -> void. Binds the error region to the row via aria-describedby, sets [data-refusal-reason], focuses the [data-recovery=\"retry\"] control."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "affordancesEnum",
|
|
30
|
+
"kind": "shape",
|
|
31
|
+
"description": "The three input affordances (input, drop-zone, keyboard-opener) are the closed enum {file-input, drop-zone, keyboard-opener}. Removing one is a v2.0.0 major bump."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"dependencies": [
|
|
35
|
+
{
|
|
36
|
+
"name": "Transport contract",
|
|
37
|
+
"kind": "tac",
|
|
38
|
+
"tacId": "TAC-2402-application-file-upload-transport",
|
|
39
|
+
"description": "The input surface hands accepted files to the transport TAC and honours its refusal-render seam on virus-scan hits."
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"tradeoffs": "One input-surface module keeps the WCAG 2.5.7 discipline lint-checkable but ties every framework to the collectFiles factory. Projects using a vendor upload widget (Filepond, Uppy) satisfy the surface by adapting the vendor's mount seam to the TAC's factories rather than rewriting the collector. Known mechanism-reach gap: the pack cannot exhaustively probe every drop-target inside a nested drop-zone; the primary drop-zone attribute is asserted.",
|
|
43
|
+
"notes": "See README Known mechanism-reach gaps for the full list.",
|
|
44
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
45
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
46
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2402-application-file-upload-transport",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Upload transport contract",
|
|
8
|
+
"purpose": "Owns the wire-level side of the file-upload contract: chunking, resumption, the multipart POST default, the tus.io elicited alternative, the refusal-render seam, and the completion callback. Every AC on REQ-004 that reads the request log anchors on this TAC.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Split each accepted file into fixed-size chunks and upload chunks in bounded parallelism (default 3) (AC-23104-1).",
|
|
11
|
+
"On the multipart branch, POST the chunk set to the applied endpoint and assemble server-side; expose [data-transport=\"multipart\"] and [data-chunks-uploaded] on the file row (AC-23104-1).",
|
|
12
|
+
"On the tus branch, PATCH chunks to the tus creation URL with an Upload-Offset header per request; expose [data-transport=\"tus\"] (AC-23104-1).",
|
|
13
|
+
"On interruption, pause the upload and resume from the last acknowledged offset on reconnect, without re-sending acknowledged bytes (AC-23106-1).",
|
|
14
|
+
"Refuse to enqueue a refused file (mime, size, virus-scan) and hand control back to TAC-2401's refusal-render seam (AC-23103-1).",
|
|
15
|
+
"Call the progress-announcer TAC with per-chunk acknowledgements so the per-file and aggregate percent advance (AC-23102-1)."
|
|
16
|
+
],
|
|
17
|
+
"internalStructure": "One transport module the input TAC drains. The module reads the applied ADR-2401 branch (multipart, tus, per-vendor SDK) and instantiates one of three adapter shapes. Each adapter drains the file-selection set through a bounded worker pool (concurrency default 3, elicited cap), tracks per-file [data-chunks-uploaded], and posts an acknowledgement event on every server acknowledgement the progress-announcer TAC reads. Interruption is detected via fetch reject (multipart) or the tus client's onError seam (tus); resumption re-fetches the Upload-Offset (tus) or resumes from the last completed chunk index (multipart). The refusal-render seam is a thin wrapper the input TAC calls, not a separate class, so the input surface stays authoritative.",
|
|
18
|
+
"interfaces": [
|
|
19
|
+
{
|
|
20
|
+
"name": "uploadFile",
|
|
21
|
+
"kind": "factory",
|
|
22
|
+
"description": "uploadFile({ file, endpoint, transport }) -> UploadSession. Returns a session the caller reads for per-chunk progress and completion."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "resumeSession",
|
|
26
|
+
"kind": "factory",
|
|
27
|
+
"description": "resumeSession(session) -> UploadSession. Resumes from the last acknowledged offset."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "transportsEnum",
|
|
31
|
+
"kind": "shape",
|
|
32
|
+
"description": "The transport branches are the closed enum {multipart, tus, vendor-sdk}. multipart is the recommended default per ADR-2401."
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"dependencies": [
|
|
36
|
+
{
|
|
37
|
+
"name": "Progress announcer",
|
|
38
|
+
"kind": "tac",
|
|
39
|
+
"tacId": "TAC-2403-application-file-upload-progress-announcer",
|
|
40
|
+
"description": "The transport calls the announcer's tick on every acknowledged chunk."
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"tradeoffs": "Three transport branches keep the shelf usable for teams already committed to a vendor SDK, but the per-branch adapter code is real work; a project that never elicits tus or a vendor SDK ships with the multipart adapter only. Bounded parallelism (default 3) is a heuristic; a slow-link project can lower it via the applied endpoint config. Known mechanism-reach gap: the pack cannot probe a network-interruption resume path on the multipart branch without a request-blocking driver; the fixture simulates the pause via a ?interrupt=1 branch and the pack reads the resulting DOM state.",
|
|
44
|
+
"notes": "See README Known mechanism-reach gaps for the full list.",
|
|
45
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
46
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
47
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-2403-application-file-upload-progress-announcer",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Upload progress announcer",
|
|
8
|
+
"purpose": "Owns the announcement side of the file-upload contract: the polite live-region wrapper the transport ticks, the aggregate-percent calculator, the assertive-slot completion announcement, and the background-tab tick continuity. Every AC on REQ-002 and REQ-005 that reads the aria-live regions anchors on this TAC.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Mount the polite live-region wrapper at render time so a screen reader adopts it before the first tick (AC-23102-1).",
|
|
11
|
+
"Emit a polite text tick every 10 percent of aggregate progress in the closed format \"<uploaded> of <total> files, <PP> percent\" (AC-23102-1).",
|
|
12
|
+
"Compute the aggregate percent as the mean weighted by byte size across the active file set (AC-23102-1).",
|
|
13
|
+
"On completion of the set, mount an assertive-slot announcement (aria-live=\"assertive\" or role=\"status\") with the closed text \"<N> files uploaded successfully\", exactly once per set (AC-23105-1).",
|
|
14
|
+
"Continue ticking under document visibilitychange to hidden so a backgrounded tab does not stall the announcement (AC-23107-1)."
|
|
15
|
+
],
|
|
16
|
+
"internalStructure": "One announcer module the transport hooks. The module preseeds the polite wrapper (aria-live polite) on mount, reads per-chunk acknowledgements from the transport, updates a per-file percent + aggregate percent record, and pushes a text tick every time the floor(aggregate/10) integer changes. Completion detection is a single flag; the assertive slot is mounted on mount as an empty wrapper and its textContent is set exactly once per set. Background-tab continuity is achieved by using setInterval on the ack polling loop rather than requestAnimationFrame; the interval keeps firing when the tab is hidden. A project that wants to pause on hidden explicitly elicits the alternative.",
|
|
17
|
+
"interfaces": [
|
|
18
|
+
{
|
|
19
|
+
"name": "tick",
|
|
20
|
+
"kind": "factory",
|
|
21
|
+
"description": "tick({ fileRowId, bytesAcknowledged, totalBytes }) -> void. Transport calls this on every acknowledgement."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "complete",
|
|
25
|
+
"kind": "factory",
|
|
26
|
+
"description": "complete({ successCount }) -> void. Transport calls this exactly once per set."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "announcementFormatsEnum",
|
|
30
|
+
"kind": "shape",
|
|
31
|
+
"description": "The polite format is fixed: /^\\d+ of \\d+ files, \\d{1,3} percent$/; the assertive format is fixed: /^\\d+ files uploaded successfully$/. Localisation is a v1.1.0 minor bump extending the enum with a lookup table."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"dependencies": [
|
|
35
|
+
{
|
|
36
|
+
"name": "Transport contract",
|
|
37
|
+
"kind": "tac",
|
|
38
|
+
"tacId": "TAC-2402-application-file-upload-transport",
|
|
39
|
+
"description": "The announcer reads per-chunk acknowledgements from the transport."
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"tradeoffs": "One announcer module keeps the aria-live discipline testable but pins the wire format in English at v1.0.0; a localised project elicits the format table in a v1.1.0 minor. Known mechanism-reach gap: the pack asserts the polite wrapper's textContent format but does not additionally probe screen-reader adoption (that requires a real assistive tech in the loop).",
|
|
43
|
+
"notes": "See README Known mechanism-reach gaps for the full list.",
|
|
44
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
45
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
46
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-file-upload-US-23101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-file-upload-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The upload surface renders a labelled file input, a drop-zone region and a keyboard-focusable alternative that opens the picker on Enter",
|
|
8
|
+
"asA": "operator selecting files to upload, whether by pointer, drag-drop or keyboard alone",
|
|
9
|
+
"iWant": "a labelled native file input, a drop-zone region and a keyboard-focusable button that opens the picker so I can add files from whichever input mode I use",
|
|
10
|
+
"soThat": "I never have to drag to add a file and my screen reader announces the picker rather than a silent drop-zone",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-23101-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "The upload region carries [data-surface=\"file-upload\"] and inside it: a labelled <input type=\"file\"> with a keyboard-reachable label (an id-referenced <label> or an aria-label), a [data-drop-zone] region, and a keyboard-focusable [data-open-picker] button that opens the same picker on Enter or Space. The pack drives the real browser to /upload, asserts the three affordances are present, focuses the [data-open-picker] control and presses Enter, then reads that the file input received focus."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2401-application-file-upload-input"
|
|
21
|
+
],
|
|
22
|
+
"tags": [
|
|
23
|
+
"blueprint:application-file-upload",
|
|
24
|
+
"affordance:input-plus-drop-plus-keyboard"
|
|
25
|
+
],
|
|
26
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
27
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-file-upload-US-23102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-file-upload-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The progress announcer emits per-file and aggregate progress through a polite live-region wrapper",
|
|
8
|
+
"asA": "operator watching an upload progress on a screen reader or a low-vision magnifier",
|
|
9
|
+
"iWant": "a polite live-region tick every 10 percent of aggregate progress that names how many files have completed out of how many",
|
|
10
|
+
"soThat": "I know the upload is still working without watching the screen and I can tell when it stalls",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-23102-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "The upload region ships a [data-live-region=\"polite\"] wrapper with aria-live=\"polite\" preseeded at render time. During an upload the wrapper's textContent matches /^\\d+ of \\d+ files, \\d{1,3} percent$/ and the numeric aggregate percent advances monotonically. Per-file rows carry [data-file-row] with a [data-file-progress] element whose text or aria-valuenow reflects the per-file percent. The pack drives /upload?transport=multipart, starts the upload, and reads the wrapper text plus one per-file progress value before completion."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2403-application-file-upload-progress-announcer"
|
|
21
|
+
],
|
|
22
|
+
"tags": [
|
|
23
|
+
"blueprint:application-file-upload",
|
|
24
|
+
"affordance:polite-progress"
|
|
25
|
+
],
|
|
26
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
27
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
28
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-file-upload-US-23103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-file-upload-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A refused file renders an aria-describedby-bound error and moves focus to its retry control, without sending the bytes",
|
|
8
|
+
"asA": "operator whose selected file is refused by the MIME gate, the size gate or the virus scanner",
|
|
9
|
+
"iWant": "an inline error that names the refusal reason, is bound to my file row via aria-describedby, and moves my focus to the retry control without sending the file to the server",
|
|
10
|
+
"soThat": "I learn why the file was refused, do not waste my upload budget on a refused file, and can retry with a corrected file from my keyboard",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-23103-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "When the fixture is seeded with a refused file (MIME mismatch, size cap exceeded, or virus-scan hit), the file row [data-file-row][data-refused=\"true\"] renders a [data-error-message] element whose id is referenced by the row's aria-describedby attribute, the row exposes the closed refusal reason via [data-refusal-reason] (one of mime-refused, size-refused, virus-refused), a [data-recovery=\"retry\"] control receives keyboard focus, and the pack observes zero POST or PATCH requests carrying the refused filename on the browser's request log."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2401-application-file-upload-input",
|
|
21
|
+
"TAC-2402-application-file-upload-transport"
|
|
22
|
+
],
|
|
23
|
+
"tags": [
|
|
24
|
+
"blueprint:application-file-upload",
|
|
25
|
+
"affordance:refusal"
|
|
26
|
+
],
|
|
27
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
28
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
29
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-file-upload-US-23104",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-file-upload-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The transport uploads files in chunks and, on the tus.io branch, exposes an Upload-Offset header per PATCH",
|
|
8
|
+
"asA": "operator uploading a large file over a spotty connection",
|
|
9
|
+
"iWant": "the transport to split my file into chunks and to resume from the last acknowledged offset on retry",
|
|
10
|
+
"soThat": "an interrupted upload does not re-send bytes I already delivered",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-23104-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "On the ?transport=multipart branch the fixture returns 200 with a completed chunk count higher than 1 on a file large enough to force chunking; the DOM exposes [data-transport=\"multipart\"] and [data-chunks-uploaded] whose numeric value equals the completed chunk count. On the ?transport=tus branch the pack observes at least one PATCH request on the browser's network log whose request headers include Upload-Offset with a numeric value, and the DOM exposes [data-transport=\"tus\"] with [data-chunks-uploaded] > 1."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2402-application-file-upload-transport"
|
|
21
|
+
],
|
|
22
|
+
"tags": [
|
|
23
|
+
"blueprint:application-file-upload",
|
|
24
|
+
"affordance:chunked-resumable"
|
|
25
|
+
],
|
|
26
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
27
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
28
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-file-upload-US-23105",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-file-upload-REQ-005",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "On successful completion the upload surface renders an assertive-slot announcement and per-file remove and retry controls",
|
|
8
|
+
"asA": "operator whose upload set has just finished",
|
|
9
|
+
"iWant": "an assertive-slot announcement saying how many files uploaded successfully, plus a keyboard-reachable remove control per completed file",
|
|
10
|
+
"soThat": "my screen reader tells me the set is done and I can remove a file I no longer want without a page reload",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-23105-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "After the fixture completes the upload set the upload region carries a [data-assertive-slot] element with aria-live=\"assertive\" or role=\"status\" whose textContent matches /^\\d+ files uploaded successfully$/, each completed file row carries [data-file-row][data-file-state=\"complete\"], a keyboard-reachable [data-recovery=\"remove\"] button per row and, after a refused-then-succeeded row, a [data-recovery=\"retry\"] button visible only until the retry succeeds."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2401-application-file-upload-input",
|
|
21
|
+
"TAC-2403-application-file-upload-progress-announcer"
|
|
22
|
+
],
|
|
23
|
+
"tags": [
|
|
24
|
+
"blueprint:application-file-upload",
|
|
25
|
+
"affordance:completion"
|
|
26
|
+
],
|
|
27
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
28
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
29
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-file-upload-US-23106",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-file-upload-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A network interruption mid-upload resumes from the last acknowledged offset when the connection returns",
|
|
8
|
+
"asA": "operator uploading through a spotty connection or a captive portal that drops mid-request",
|
|
9
|
+
"iWant": "the transport to pause on interruption, wait for the connection to return, and resume from the last acknowledged offset without re-sending",
|
|
10
|
+
"soThat": "a dropped connection does not force me to restart a large upload",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-23106-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "On the ?interrupt=1 branch of the fixture the upload pauses after the first acknowledged chunk, the DOM exposes [data-file-state=\"paused\"] and [data-chunks-uploaded] with a numeric value greater than zero on the paused row, and after the fixture resumes with ?resume=1 the row transitions to [data-file-state=\"complete\"] with the accumulated [data-chunks-uploaded] equal to the total chunk count. The pack asserts no chunk index is re-uploaded (the fixture records the received offsets on the row and never repeats one)."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2402-application-file-upload-transport"
|
|
21
|
+
],
|
|
22
|
+
"tags": [
|
|
23
|
+
"blueprint:application-file-upload",
|
|
24
|
+
"affordance:resumption"
|
|
25
|
+
],
|
|
26
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
27
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "application-file-upload-US-23107",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "application-file-upload-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Progress continues to advance and the polite live-region continues to tick when the browser tab is backgrounded",
|
|
8
|
+
"asA": "operator who tabs away from the upload while it is running",
|
|
9
|
+
"iWant": "the upload to continue and the polite live-region to keep receiving ticks so a screen reader can pick up the announcement when I return",
|
|
10
|
+
"soThat": "backgrounding the tab does not stall the upload or my accessibility affordance",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-23107-1",
|
|
14
|
+
"testable": true,
|
|
15
|
+
"scope": "runtime",
|
|
16
|
+
"description": "On the ?background=1 branch of the fixture the fixture drives a visibilitychange event to hidden, the upload continues (the aggregate percent advances between two polite-tick reads separated by at least one polling interval), and the [data-live-region=\"polite\"] wrapper's text updates. The pack reads the wrapper twice with a wait between and asserts the aggregate percent increased and the tick text changed."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tacIds": [
|
|
20
|
+
"TAC-2403-application-file-upload-progress-announcer"
|
|
21
|
+
],
|
|
22
|
+
"tags": [
|
|
23
|
+
"blueprint:application-file-upload",
|
|
24
|
+
"affordance:background-tab-progress"
|
|
25
|
+
],
|
|
26
|
+
"createdAt": "2026-09-06T16:55:00Z",
|
|
27
|
+
"updatedAt": "2026-09-06T16:55:00Z"
|
|
28
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# application-file-upload: coordination vocabulary
|
|
2
|
+
|
|
3
|
+
## Global topics
|
|
4
|
+
|
|
5
|
+
The blueprint claims no new global topics at v1.0.0. Every ADR (transport branch, accepted set, virus-scan integration) is non-global.
|
|
6
|
+
|
|
7
|
+
## Deliberately unclaimed topics
|
|
8
|
+
|
|
9
|
+
- `uploadEnvelope` (the shape of an upload success or completion response body). Reserved for the applied API blueprint (`application-api-rest` claims it today); this blueprint reads the wire-level chunk acknowledgements, not the envelope body shape, so no claim collides.
|
|
10
|
+
- `commonAcceptedSets` (a shelf-wide registry of accepted MIME sets a consumer can reach for). Reserved for a future v1.1.0 minor bump if three or more consumer blueprints start elicitizing the same lists. Held here as an unclaimed topic so a composing author sees the reservation.
|
|
11
|
+
- `objectStorageTransport` (a shared engine for the chunked-and-resumable transport that both an object-storage blueprint and this UI blueprint would reach for). Reserved for a future dedicated `application-file-transport` blueprint; held here so a composing author sees the reservation before minting a new topic.
|
|
12
|
+
- `announcementFormatsCatalogue` (the localised polite and assertive text formats). Reserved for a v1.1.0 minor bump extending the announcer TAC's `announcementFormatsEnum` with a lookup table.
|
|
13
|
+
|
|
14
|
+
## Shelf id band and suffix block
|
|
15
|
+
|
|
16
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
17
|
+
|---|---|---|---|---|
|
|
18
|
+
| application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
|
|
19
|
+
| application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
|
|
20
|
+
| application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
|
|
21
|
+
| application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
|
|
22
|
+
| application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
|
|
23
|
+
| application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
|
|
24
|
+
| application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
|
|
25
|
+
| application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
|
|
26
|
+
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
27
|
+
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
28
|
+
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
29
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
|
|
30
|
+
|
|
31
|
+
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
32
|
+
|
|
33
|
+
## Composition with application-spa
|
|
34
|
+
|
|
35
|
+
`application-spa` REQ-006 ships upload and progress and error components as part of its component library. Applying this blueprint alongside `application-spa` composes cleanly: SPA holds the visual tokens for the upload region; this blueprint holds the input affordances, the transport contract, the refusal contract and the runtime enforcement pack. No `scope: "global"` ADR conflict.
|
|
36
|
+
|
|
37
|
+
## Composition with application-empty-error-states
|
|
38
|
+
|
|
39
|
+
A refused upload is a refusal contract state, not an empty or error state; the two blueprints do not overlap on state slugs. A transport-level failure (server 5xx during a chunk PATCH) surfaces through `application-empty-error-states`'s server-error state after the transport's retry budget is exhausted. No global-topic overlap.
|
|
40
|
+
|
|
41
|
+
## Composition with application-error-handling
|
|
42
|
+
|
|
43
|
+
Refusals and transport-layer failures construct an internal error record through the applied error-handling factory (`suggestedCompanions: errorHandling`). This blueprint reads the factory's shape; `application-error-handling` owns the shape and its correlation-identifier discipline.
|
|
44
|
+
|
|
45
|
+
## The four fixture states and the two transport slugs
|
|
46
|
+
|
|
47
|
+
The four state slugs `idle`, `uploading`, `refused`, `complete` and the two transport slugs `multipart`, `tus` appear identically across the blueprint README, the fixture README, the operator guide, the probe pack `checks[]` descriptions and this file. Extending either enum is a v1.1.0 minor bump; removing or renaming is a v2.0.0 major.
|
|
48
|
+
|
|
49
|
+
## Probe pack
|
|
50
|
+
|
|
51
|
+
`probe-packs/application-file-upload.pack.mjs` ships four surface-observable checks anchored to blueprint AC ids, one per contract:
|
|
52
|
+
|
|
53
|
+
- `AC-23101-1` input surface (file input, drop-zone, keyboard-focusable opener)
|
|
54
|
+
- `AC-23102-1` progress announcer (polite tick format and monotonic advance)
|
|
55
|
+
- `AC-23103-1` refusal contract (aria-describedby error binding, refused bytes never on the wire)
|
|
56
|
+
- `AC-23104-1` chunked transport (multipart chunks or tus Upload-Offset)
|
|
57
|
+
|
|
58
|
+
The pack applies to any FBS binding `TAC-2401-application-file-upload-input` or whose navModel routes name an operator-configured upload path (matching `/upload`). See `packages/rcf-lite/docs/blueprint-authoring.md` section 8c for the pack authoring rules.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# application-file-upload: operator guide
|
|
2
|
+
|
|
3
|
+
## When to reach for it
|
|
4
|
+
|
|
5
|
+
Your project accepts file uploads from operators, whether one file at a time or a set, whether small text and image assets or large media. You want one contract for the input surface (labelled input plus drop-zone plus keyboard opener per WCAG 2.5.7), one recommended transport that ships resumable-chunked out of the box, one refusal contract that binds errors via `aria-describedby` and never lets refused bytes reach the server, one polite live-region tick that keeps a screen-reader user informed of progress, and a runtime pack that refuses ship on a dropped input, a dropped live-region, a refused file that reached the wire, or a collapsed transport.
|
|
6
|
+
|
|
7
|
+
## The two transports
|
|
8
|
+
|
|
9
|
+
The two shipped transport slugs are `multipart` and `tus`. `multipart` is the recommended default (ADR-2401 `recommendedDefault: true`) because every server toolkit accepts it and the client-side code is a Blob split into fixed-size chunks. `tus` is the elicited alternative for projects with a tus server or the third-party tus client library; on the tus branch each chunk is a PATCH request with an `Upload-Offset` header the pack asserts. A third alternative, `vendor-sdk` (S3 multipart, Cloudflare R2 client-direct, Cloudinary widget), is documented in ADR-2401 for projects committed to a vendor; the shipped fixture does not exercise it, and a vendor-sdk project runs the pack against a fixture that mocks the vendor's completion callback.
|
|
10
|
+
|
|
11
|
+
## The four file-row states
|
|
12
|
+
|
|
13
|
+
The four shipped state slugs are `idle`, `uploading`, `refused`, `complete`. Every file row on the fixture cycles through this closed set; the same slugs ride `[data-file-state]` on the file row in your applied project. Extending the state set is a v1.1.0 minor bump; removing or renaming a state is a v2.0.0 major.
|
|
14
|
+
|
|
15
|
+
## When NOT to reach for it
|
|
16
|
+
|
|
17
|
+
Your product is a marketing site or a static content surface that never accepts an upload. The four contracts model a live upload surface; a static site has no transport, no progress tick, no refusal contract, and forcing the model on a static site adds mechanism without payoff.
|
|
18
|
+
|
|
19
|
+
Your product has already committed to an opinionated single-vendor upload widget (Uppy with a specific backend, Filepond with a specific plugin set) whose contract is materially different from the input plus refusal plus progress catalogue. Adopt this blueprint only when the vendor widget composes with the input TAC's `collectFiles` factory rather than replacing it.
|
|
20
|
+
|
|
21
|
+
## What stays your call
|
|
22
|
+
|
|
23
|
+
- The visual design of the upload region, the file rows and the drop-zone. The blueprint contributes WHAT surfaces under WHAT condition; the palette, spacing and typography are your project's design system's call.
|
|
24
|
+
- The accepted MIME set (ADR-2402 elicited enum). No default; every project elicits its own list of IANA media types.
|
|
25
|
+
- The per-file size cap in bytes (ADR-2402 elicited). No default; every project elicits its own cap.
|
|
26
|
+
- The transport branch (ADR-2401 elicited). Recommended `multipart`; elicit `tus` when a tus server is available or the third-party SDK is on the path; elicit `vendor-sdk` when a vendor SDK is on the path.
|
|
27
|
+
- The virus-scan verifier (ADR-2403 capability-plus-elicit). Every project elicits the verifier or the explicit noop; there is no shelf default and the guide names the risk in plain language for the noop path.
|
|
28
|
+
- The concurrency cap for the transport worker pool. Recommended default 3; a slow-link project elicits a lower cap.
|
|
29
|
+
- The announcer polling interval in milliseconds. Recommended default 250; a project sensitive to CPU cost on a hot page elicits a higher interval.
|
|
30
|
+
- The upload endpoint URL. The blueprint declares the shape (`POST /api/upload/chunk` for multipart, `POST /api/upload/tus` for the tus creation URL); the endpoint's server-side handling is your call.
|
|
31
|
+
|
|
32
|
+
## What a good outcome looks like
|
|
33
|
+
|
|
34
|
+
The pack fires on every FBS whose surface renders an upload route, and every check returns `pass` on the honest render (both transport branches) and `fail` on the corresponding break switch. Your CI runs the fixture round-trip on every PR that touches an upload surface. Your operator uploads a file with the keyboard alone and hears the polite tick as it advances. Your production upload surface never lets a refused file's bytes leave the browser. Your production stack ships with an explicit virus-scan verifier or with the noop plus the guide's risk paragraph on file.
|
|
35
|
+
|
|
36
|
+
## Mechanism-reach gaps
|
|
37
|
+
|
|
38
|
+
The blueprint's README lists the runtime-observable ACs the pack does NOT bind directly (drop-event round-trip, screen-reader adoption, error-message content, network-interruption resume on multipart, assertive-slot exclusive fire, network interruption resumption, background-tab tick continuity). Every gap is a candidate for a v1.1.0 minor bump extending the pack. Combine with `application-error-handling` to route refusal internal error records through the shipped factory and with `application-spa` to inherit the visual tokens.
|
|
39
|
+
|
|
40
|
+
## Promotion signals
|
|
41
|
+
|
|
42
|
+
- Three or more consumer blueprints (forms-wizard, an eventual CSV-import, account-settings avatar upload) start elicitizing the same accepted-set entries. Candidate: a `commonAcceptedSets` global topic in a v1.1.0 minor.
|
|
43
|
+
- The transport TAC needs a shared engine across an object-storage blueprint and this UI blueprint. Candidate: a dedicated `application-file-transport` blueprint absorbing the chunked-and-resumable path.
|
|
44
|
+
- Localisation of the polite and assertive text formats. Candidate: a v1.1.0 minor bump extending the announcer TAC's `announcementFormatsEnum` with a lookup table.
|
|
45
|
+
|
|
46
|
+
## Costs to be honest about
|
|
47
|
+
|
|
48
|
+
Realising all three input affordances honestly in a client is a chunk of code even after adopting the TACs; the WCAG 2.5.7 keyboard alternative is often the piece a first cut skips. The pack is Playwright-first, so a project without a running dev server at gate time cannot fire it. The tus branch assumes a tus server or the third-party client; a project that elicits tus without one hits an apply-time refusal on the elicit and unblocks by wiring one in or falling back to multipart.
|