Parent: #197
Found during review of merged PRs #212-#223 before #211 pilot.
Problem
The cartoon cut export/upload flow can leave the UI in an incorrect state or hide failures.
Observed in app/web/components/CutListPanel.tsx and LetteringEditor.tsx:
LetteringEditor export saves finalImagePath / exportedAt on the backend, but the parent CutListPanel does not reload cuts on successful export or close. The cut can still appear as "Clean ready" and Upload & Generate can remain disabled until a manual reload or unrelated save.
- Export can be run with unsaved overlay edits. The final image contains local overlay state, but
cuts.json may not persist those overlays unless the user separately clicks Save.
Upload & Generate silently continues on failed asset fetch, failed upload, or failed set-uploaded, then generates markdown anyway. The response warnings are not surfaced in that path.
This makes #211 pilot unreliable because the user may think cuts are exported/uploaded when the canonical cut state or generated markdown says otherwise.
Scope
- After successful export, refresh the selected cut / cuts file state in the UI.
- Ensure export either persists current overlays first or clearly requires/surfaces unsaved overlay state before export. Prefer a single user action that leaves
cuts.json consistent with the exported image.
- Make
Upload & Generate fail visibly if any cut upload step fails. Do not silently skip failed cuts.
- Read and display
generate-markdown warnings after Upload & Generate.
- Keep existing PlotLink upload endpoint usage unchanged. Do not add new PlotLink APIs.
Acceptance Criteria
- Exporting a cut updates UI status to lettered without requiring app refresh.
- Exported final image and saved overlay state cannot diverge silently.
- Upload failures show a user-visible error with the failed cut id.
- Markdown generation warnings are shown after upload/generate.
Upload & Generate only reports success when all required final images are uploaded and recorded in cuts.json.
- Regression tests cover export state refresh, unsaved overlay/export behavior, and failed upload visibility.
Public Safety
This is a public repo. Do not include secrets, API keys, wallet private keys, mnemonics, auth tokens, OWS vault internals, private story drafts, full Claude session IDs, or sensitive local paths in issues, PRs, logs, docs, tests, or examples.
Parent: #197
Found during review of merged PRs #212-#223 before #211 pilot.
Problem
The cartoon cut export/upload flow can leave the UI in an incorrect state or hide failures.
Observed in
app/web/components/CutListPanel.tsxandLetteringEditor.tsx:LetteringEditorexport savesfinalImagePath/exportedAton the backend, but the parentCutListPaneldoes not reload cuts on successful export or close. The cut can still appear as "Clean ready" andUpload & Generatecan remain disabled until a manual reload or unrelated save.cuts.jsonmay not persist those overlays unless the user separately clicks Save.Upload & Generatesilently continues on failed asset fetch, failed upload, or failedset-uploaded, then generates markdown anyway. The response warnings are not surfaced in that path.This makes #211 pilot unreliable because the user may think cuts are exported/uploaded when the canonical cut state or generated markdown says otherwise.
Scope
cuts.jsonconsistent with the exported image.Upload & Generatefail visibly if any cut upload step fails. Do not silently skip failed cuts.generate-markdownwarnings afterUpload & Generate.Acceptance Criteria
Upload & Generateonly reports success when all required final images are uploaded and recorded incuts.json.Public Safety
This is a public repo. Do not include secrets, API keys, wallet private keys, mnemonics, auth tokens, OWS vault internals, private story drafts, full Claude session IDs, or sensitive local paths in issues, PRs, logs, docs, tests, or examples.