frontend-patterns/research/candidates/LocalDraftState.md

54 lines
2.7 KiB
Markdown
Raw Normal View History

---
title: Local Draft State
status: draft
maturity: hypothesis
families: [affordance, mutation]
scales: [L6]
admission: research-candidate-only
---
# Local Draft State
Context: editing a shared server-validated record. Problem: a refresh or rejected
write can destroy unfinished intent. Responsiveness and recoverability compete with
state complexity and privacy.
Proposed solution: keep base observation, editable proposal and current server
observation distinct. Where access and retention policy permits, rejection preserves
the proposal; refreshed data prompts comparison instead of replacing input. Access
revocation may instead require clearing content. Export is a separate permission,
not an automatic recovery fallback. Explicit discard clears the draft. Define
whether navigation or restart persistence is required rather than implying it.
Consequences: review is possible after rejection, but stale drafts and sensitive data
need lifetime rules. Binding inputs directly to a refreshed cache is simpler when
there is no unfinished work; durable local authority is a different requirement.
Evidence: T01/T02 motivate rejection recovery; T05 illustrates local submission data.
None verifies this complete draft lifecycle in a deployed frontend. Exact known uses
and recurrence: unknown. Hypothesis only.
Proposed connection: supports recovery from [Version-Checked Mutation](VersionCheckedMutation.md).
T01–T05 refer to [TransactionalEvidenceExpansion](../reviews/TransactionalEvidenceExpansion.md).
Connections are research proposals, not admitted graph edges.
Reasoning exercise: [VC-01](../walkthroughs/VC01-TransactionalAdministration.md).
## Implementation evidence update — 2026-09-25
[Frontend recovery review](../reviews/FrontendRecoveryImplementations.md) R01/R03
locates Zulip and Element draft storage/restoration at exact commits. These are two
partial known uses of unsent-intent separation, not confirmation of the entire
base/draft/current merge contract. Full-pattern recurrence remains unknown.
A composer may hand submitted content to a separate pending record. Preserve the
recoverable intent across that handoff; do not require the input box to stay filled.
## Executed application-update path — 2026-09-26
[Reload follow-up](../reviews/ActivationConflictsAndReload.md) recovers text and a base
marker across a same-tab reload, supports declining an update, and refuses progress
on injected storage failure or schema mismatch. It reads edits made during asynchronous
preflight and rechecks schema after navigation. Explicit discard clears stale stored
content too. These are synthetic policy mechanisms, not permission to persist restricted
data or guarantees for native unload, device failure, multiple tabs or remote outcomes.