Split out of #298 (the rest of that audit is superseded by the v3 redesign). Two residual UI gaps, verified against the current tree:
-
Per-file error state and per-file retry. Retry/Resume is run-level only (packages/react/src/components/FileList.tsx footer). No component renders a per-file FAILED state: FileRow, FilePreview, and FileHero track only SUCCESSFUL / UPLOADING / PROCESSING. The plumbing already exists and is unused by the UI: core.retry(fileId) (packages/core/src/core.ts:701) and retryUpload(fileId) (packages/react/src/hooks/useUploaderController.ts:507). Rendering a failed badge + retry affordance per file is UI-only work, but lands as a cross-framework batch (React canon first, five ports, parity-fixture regen).
-
Compact list row hides its progress bar at 0%. ProgressBar itself renders whenever the run is active (ProgressBar.tsx:29), and FileHero / FilePreview / FileList use it unconditionally — but FileRow.tsx:166 still gates on {!!progress && …}, so the compact row shows nothing until the first byte moves. One-line fix plus the same gate check in the other frameworks' row templates.
Both are 3.2 candidates alongside the existing cross-framework batch (credit-link target-size, DriveAuthFallback pending state, etc.).
Split out of #298 (the rest of that audit is superseded by the v3 redesign). Two residual UI gaps, verified against the current tree:
Per-file error state and per-file retry. Retry/Resume is run-level only (
packages/react/src/components/FileList.tsxfooter). No component renders a per-fileFAILEDstate:FileRow,FilePreview, andFileHerotrack onlySUCCESSFUL/UPLOADING/PROCESSING. The plumbing already exists and is unused by the UI:core.retry(fileId)(packages/core/src/core.ts:701) andretryUpload(fileId)(packages/react/src/hooks/useUploaderController.ts:507). Rendering a failed badge + retry affordance per file is UI-only work, but lands as a cross-framework batch (React canon first, five ports, parity-fixture regen).Compact list row hides its progress bar at 0%.
ProgressBaritself renders whenever the run is active (ProgressBar.tsx:29), andFileHero/FilePreview/FileListuse it unconditionally — butFileRow.tsx:166still gates on{!!progress && …}, so the compact row shows nothing until the first byte moves. One-line fix plus the same gate check in the other frameworks' row templates.Both are 3.2 candidates alongside the existing cross-framework batch (credit-link target-size, DriveAuthFallback pending state, etc.).