I kept typing during a save. Should the editor still say “Saved”?
You click Save, change one more sentence, then close the tab after seeing “Saved.” The last sentence is missing when you return. Let’s work through a fictional event-description editor. I would first define which content was actually saved, then connect that definition to messages, leaving the screen and changes from another tab.
A faster button response is not the real outcome
If the request is “Show the saved message sooner,” I would separate two promises: acknowledging a click and confirming that content has been retained. The goal here is to help someone decide what to do with their current input before leaving. Showing a premature success message faster would make the underlying problem worse.
Fix the reproduction order. At 10:00 the server holds the old copy. At 10:01 the user sends a first edit, types a second edit at 10:01:01, and receives confirmation for the first at 10:01:02. If only the first was stored, the screen must still show unsaved changes. This example covers a title and body; attachments and publication approval are outside its scope.
One screenshot cannot tell you where the mismatch started
I would ask engineering to line up the input at click time, the content actually sent, the server’s stored result and the input left on screen after the response. A write can succeed even when its response is lost. A toast and a server record answer different questions. Two fictional sentences are enough to reproduce this without collecting customer text in diagnostic logs.
List every path that can update the document, including another tab and an administration tool. That determines whether ordering within one screen is enough or whether another writer can overwrite it. Unknown API routes and database fields stay as questions for engineering, not invented entries in the specification.
Separate observations from questions still requiring evidence.
| Evidence | Question | Specification consequence |
|---|---|---|
| Input before and after click | Which snapshot was sent? | Separate submitted and current content |
| Server outcome | Could the write succeed without its response? | Outcome evidence and an Unknown state |
| Other tabs and tools | Who else can modify this document? | Version protection on every write path |
| Leaving and reopening | What can actually be restored? | Separate server drafts from in-tab input |
Define “saved” before adding autosave
An instant success toast or autosave may look like an obvious improvement. Autosave still has to handle typing during a pending response, though. For this small editor I would first choose explicit draft saving with honest state messages. Recovering content that was never explicitly saved after device termination would require a separate decision about autosave and retention.
MDN’s If-Match documentation describes conditional changes against a previously read server version. This adds a requirement beyond ordering the interface: version comparison and the write must happen atomically. Engineering can choose the mechanism, but every writing path must honor it to protect another person’s change.
Save frequency and accurate confirmation are separate concerns.
| Option | Benefit | Decision |
|---|---|---|
| Saved immediately after click | Fast feedback | Reject: no storage confirmation |
| Add autosave alone | Fewer explicit saves | Response and conflict rules still needed; later scope |
| Explicit save, snapshot check and conditional write | Traceable state and conflict handling | Selected; no promise to restore never-saved input after termination |
A response does not confirm everything now on the screen
Freeze the title and body sent by the Save action. Keep editing available while allowing only one in-flight save in this tab. Show Saving, and make clear that edits made afterwards are not part of that request. Match the response to both the document and this editing instance so that a response from an old screen cannot alter the current one.
After the matching request is confirmed stored, compare its content with the current input. Only a match allows Saved. If the second edit remains, retain that input and show unsaved changes even though the first edit succeeded. The newly confirmed server version may become the base for the next save; it does not make later typing saved. The user must save that later content and receive its confirmation.
A displayed save time should have an agreed server-confirmation meaning and timezone, rather than simply copying the click time from the device. Also say which snapshot it describes. Saved confirms this screen’s content at that moment; it does not mean another authorized writer cannot change the document afterwards.
Enter this branch only after confirming a write for the current document and editing instance.
Read the flow
- Does current input match the confirmed copy?
- Yes: Show Saved → Record confirmed copy, version and next action
- No: Show unsaved changes → Record confirmed copy, version and next action
A rejection and an unknown outcome need different actions
A confirmed validation rejection points to a field that needs correction. A timeout does not prove the write failed. In that case, show that the save result could not be confirmed and retain the input. Ask engineering what evidence can establish that request’s outcome, alongside the latest server copy. A single read is not proof that a still-pending write has finished.
If authoritative evidence confirms the current content, the screen can return to Saved. If the earlier request has ended without applying, the current input can be saved again. Without enough evidence, keep the outcome unknown. If another server version exists, compare it with the retained input and let the user choose the content to apply before a conditional save against that version. A further change requires another comparison, not an unconditional overwrite.
Fixed examples, not live server requests. Read the message together with the input that must remain.
Open the example
The first success response does not include the second edit. Retain it. Once the first request has ended, the current content can be saved.
Retain current input and offer an outcome check. Do not infer success or failure without evidence.
Reject the outdated version condition. Compare the latest server copy with retained input and require a content choice before saving again.
Identify the field and correction rule. Do not clear either title or body or restart the form.
An exit warning is only a supporting measure
For navigation within the app, check dirty, saving, unknown and conflict states before moving to a list or another document. Separate Stay from Leave. If Save and leave is offered, it must wait for a confirmed outcome and keep the person on the editor when the result is unknown or conflicting. Saving a draft must also remain distinct from publishing it.
Apply the same snapshot rule to Save and leave. Immediately before navigating, compare the current input with the server-confirmed saved copy, and navigate only if they match. If the user typed more after the request, the first success must leave the editor open, preserve that input and show unsaved changes. The user can choose Save and leave again for the latest content. Further edits during that request keep the editor open again. An explicit Discard changes choice is a separate navigation action.
MDN explains that beforeunload may not fire when a mobile user switches apps and later closes the browser. An exit warning therefore cannot guarantee recovery. This example does not persist input on the device, so it must not promise recovery of unsaved typing after force closing. Device storage would need its own decisions about shared devices, sensitive content, retention and deletion.
Do not communicate status only with a briefly colored dot. Following W3C’s status-message guidance, provide semantics that let assistive technology announce changes without stealing focus. Avoid moving the caret to Save after every write or repeating the whole status on every keystroke. QA still needs to check the supported browser and assistive-technology combinations.
Ask AI to find the missing order of events
I would give AI the fixed scope and event sequence, then ask which intervening event breaks the design. The useful output is not a long list of autosave features. The prompt below is an example. Compare any proposed missing state with the save-path inventory and the actual behavior engineering has confirmed.
Suppose a suggestion says to clear all unsaved markers after success. It has omitted later typing. Ask it to retain the text entered while waiting and rewrite the message. If a suggestion treats an exit warning as loss prevention, provide the mobile-termination counterexample and narrow that promise. These are hypothetical review examples, not a transcript of actual AI responses. Record the missing condition, revised wording and who must confirm it.
Replace the fictional conditions with safe examples appropriate to your service.
Review draft-saving states for a fictional event-description editor. Fixed scope: title and body only. Editing remains available during a save, but this tab sends only one save request at a time. Every writing path must compare the previously read server version before changing the document. Reproduction: 10:01 send first edit → 10:01:01 type a second edit → 10:01:02 receive success for the first. Do not label the current screen fully saved. Check additional typing, another tab, a missing response, navigation to another document and an expired login. Do not invent actual API routes, database fields or retention rules. Separate confirmed rejection, unknown outcome and version conflict. Browser exit warnings are supplementary and may not run when a mobile app is terminated. Return missing condition / retained input and message / available action / evidence and responsible role / reproduction and expected result. Separate assumptions from fixed conditions.
Give QA event order, not just a button to click
“Check Save” often produces only a normal success test. Specify when to pause a request, type again and release its response. Open the same server copy in two tabs and make the other tab save first. A disconnected network before application and a lost response after application are different test cases.
Keep expected and observed results separate. This table is an acceptance plan, not evidence that a live editor passed. Check all write paths, retained current input and the stored copy shown after reopening. A screenshot alone cannot demonstrate what the server committed.
Compare request content, stored result, current input and message.
| Sequence | Expected outcome | Evidence |
|---|---|---|
| Save, no more typing, success | Current input marked saved | Submitted copy and confirmation |
| Save first edit, type second, first success | Second edit retained and unsaved | Request/input/response ordering |
| Move to another document, old response arrives | Current document unchanged | Document and editing-instance match |
| Write commits, response is lost | Unknown, then evidence check; no assumed failure | Commit record and missing response |
| Read state while write is pending | Read alone does not prove completion | Processing state and final evidence |
| Two tabs read same copy, other tab saves first | Reject outdated write, retain input | Conditional-write result |
| Other tab changes during conflict comparison | Compare again after another mismatch | Comparison version and write condition |
| Confirmed title validation rejection | Retain input and show the relevant correction | Rejection rule and input |
| Save and leave while outcome unknown | No navigation before confirmation | Navigation conditions |
| Save and leave → type more → first request succeeds | Stay in editor; retain later input as unsaved; offer Save and leave again | Current input versus confirmed copy immediately before navigation |
| Mobile app termination | No guaranteed warning or unsaved recovery | Observations in supported environments |
Hand over the storage conditions with the messages
The planning document should explain why this changes, what saving covers and why autosave is outside this first scope. The specification connects each state to wording, retained input, actions and navigation. If engineering cannot provide outcome evidence in some cases, mark that recovery gap explicitly and use the same limit in QA and support documentation.
After release I would distinguish reproducible false-success states, reports of input lost during conflict recovery, and whether unknown outcomes resolve and how long that takes. Use those findings and the tolerated loss scope to revisit autosave. Log necessary request references and results rather than making the article body a default telemetry field.
Fill in confirmed save paths, outcome evidence, supported environments and owners.
Issue: confirming a draft save in an event-description editor Problem: the first save response marks the entire screen saved even though more text was entered while waiting. Purpose: distinguish confirmed content from current input, support departure decisions and prevent silent overwrites from another tab. Scope: fictional editor, title and body, explicit draft saving. Attachments, publication approval, live co-editing and persistent device drafts are excluded. Request: freeze the content sent when Save is pressed. Keep editing available, allow only one in-flight save per tab, and do not overlap a new save before the previous outcome is resolved. Success: require confirmation for the current document and editing instance, then compare the confirmed content with current input. Mark Saved only when they match. Later edits remain unsaved. Ignore responses for other documents or old editing instances. Version: atomically check the previously read server version and perform the write. Apply the same protection to every writer, including other tabs and admin tools. A confirmed earlier save supplies the base version for the next request without marking later typing saved. Unknown/rejected: a timeout does not prove failure. Retain input and check evidence for that request plus the latest server copy. One read does not prove a pending write has ended. Keep Unknown if evidence is insufficient. A confirmed rejection identifies the field or condition to correct. Conflict: retain local input while comparing with the latest server copy. Require an explicit content choice, then save against that version. Compare again if another change intervenes. No unconditional overwrite shortcut. Departure/accessibility: confirm internal navigation while dirty, saving, unknown or conflicting. Save and leave waits for confirmed success. Browser exit warnings do not guarantee recovery after force closing. Provide readable status text that assistive technology can announce without moving focus. Roles: planning defines scope/states/messages; engineering verifies all write paths and outcome evidence; QA controls response/order/race conditions; support distinguishes a confirmed copy from unknown results. Release evidence: path inventory, state specification, decision record, ordered QA results, supported browser/assistive-technology checks and support handoff. Log necessary request references, times and results rather than collecting article bodies by default. Limit: these are design and acceptance criteria. Fill actual integration results separately. Saved means this screen content was confirmed at that point; it does not prevent a later edit by another user. Save and leave: immediately before navigation, compare the latest input in the current document/editing instance with the server-confirmed saved copy. Later typing means the first success must not navigate: retain the input and its unsaved state. The user chooses Save and leave again and waits for confirmation of the latest content. Further typing keeps the editor open again. Explicit discarding is a separate action.
Download the engineering and QA handoff
Sources and example conditions
A fictional event-description editor based on MDN and W3C documents checked on 2026-09-27. Times, content snapshots and scope are example conditions. No private company data or invented personal work history or results are used. AI prompts and hypothetical responses are examples, not execution records. Document and visual checks are separate from real storage-server and assistive-technology integration testing. English and Chinese localize the same Korean case.