Problem or outcome
When two contributors edit the same daily draft, the revision contract refuses the losing save as stale_save and the workspace visibly reloads the winning content — correct per ADR 0008 (one working copy, never a silent overwrite). But the losing writer's divergent text is simply gone from the screen at that point. Anything they had typed since the winning save exists nowhere they can reach, which turns an honest concurrency refusal into lost work.
Outcome: after a stale-save reload, the refused buffer stays available read-only — for example a collapsed "Your unsaved text from before the reload" section per edited field, copyable, discarded on navigation. The writer merges by hand; the system never merges.
Scope
Acceptance criteria
Low priority — a usability nicety on a correct contract, noted during the Milestone 3 slice-3 review.
Related roadmap, decisions, or issues
Problem or outcome
When two contributors edit the same daily draft, the revision contract refuses the losing save as
stale_saveand the workspace visibly reloads the winning content — correct per ADR 0008 (one working copy, never a silent overwrite). But the losing writer's divergent text is simply gone from the screen at that point. Anything they had typed since the winning save exists nowhere they can reach, which turns an honest concurrency refusal into lost work.Outcome: after a stale-save reload, the refused buffer stays available read-only — for example a collapsed "Your unsaved text from before the reload" section per edited field, copyable, discarded on navigation. The writer merges by hand; the system never merges.
Scope
web/src/routes/drafts/[id]/+page.svelte); no service, API, or schema changeAcceptance criteria
Low priority — a usability nicety on a correct contract, noted during the Milestone 3 slice-3 review.
Related roadmap, decisions, or issues