Skip to content

2026-09-27 · WekeyLab AI · Planning work archive

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.

Save-path inventory

Separate observations from questions still requiring evidence.

Save-path inventory
EvidenceQuestionSpecification consequence
Input before and after clickWhich snapshot was sent?Separate submitted and current content
Server outcomeCould the write succeed without its response?Outcome evidence and an Unknown state
Other tabs and toolsWho else can modify this document?Version protection on every write path
Leaving and reopeningWhat 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.

Alternatives and the selected scope

Save frequency and accurate confirmation are separate concerns.

Alternatives and the selected scope
OptionBenefitDecision
Saved immediately after clickFast feedbackReject: no storage confirmation
Add autosave aloneFewer explicit savesResponse and conflict rules still needed; later scope
Explicit save, snapshot check and conditional writeTraceable state and conflict handlingSelected; 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.

Display after a confirmed save

Enter this branch only after confirming a write for the current document and editing instance.

Display after a confirmed saveEnter this branch only after confirming a write for the current document and editing instance.Does current inputmatch the confirmedcopy?YesShow SavedNoShow unsaved changesRecord confirmed copy, versionand next action
Read the flow
  1. 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.

One Save button, different next steps

Fixed examples, not live server requests. Read the message together with the input that must remain.

Open the example
You have unsaved changes

The first success response does not include the second edit. Retain it. Once the first request has ended, the current content can be saved.

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.

Prompt for missing save states

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.

Ordered acceptance cases

Compare request content, stored result, current input and message.

Ordered acceptance cases
SequenceExpected outcomeEvidence
Save, no more typing, successCurrent input marked savedSubmitted copy and confirmation
Save first edit, type second, first successSecond edit retained and unsavedRequest/input/response ordering
Move to another document, old response arrivesCurrent document unchangedDocument and editing-instance match
Write commits, response is lostUnknown, then evidence check; no assumed failureCommit record and missing response
Read state while write is pendingRead alone does not prove completionProcessing state and final evidence
Two tabs read same copy, other tab saves firstReject outdated write, retain inputConditional-write result
Other tab changes during conflict comparisonCompare again after another mismatchComparison version and write condition
Confirmed title validation rejectionRetain input and show the relevant correctionRejection rule and input
Save and leave while outcome unknownNo navigation before confirmationNavigation conditions
Save and leave → type more → first request succeedsStay in editor; retain later input as unsaved; offer Save and leave againCurrent input versus confirmed copy immediately before navigation
Mobile app terminationNo guaranteed warning or unsaved recoveryObservations 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.

Engineering, QA and support handoff

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.

MDN — Window: beforeunload event

MDN — If-Match header

W3C WAI — Understanding Status Messages