Skip to content

Persist unsent layout changes across reload and browser restart without cross-account replay #181

Closed

Description

@mvalancy

Related to #156, #157, #158 and #167. This follows a documented durability limit; it does not reopen the repaired in-tab navigation bug.

The position queue and its owner/graph registry retain failed positions in memory. Graph→Work list→Graph recovery keeps the newest drag and checks the current owner. The browser regression reloads only after the retry has reached the server. It therefore proves saved-position reload, not recovery of unsent work after reload or crash.

The documented limit is explicit: forced closure or a missed unload warning can lose pending layouts. The separate offline account store already uses IndexedDB transactions when the offline-sync mode is enabled. Reuse or reconcile that mechanism where appropriate; do not create conflicting stores or claim that all offline work is currently memory-only.

Completion criteria:

  • State the supported persistence guarantee for network-backed and offline-sync modes separately. The UI distinguishes queued-in-memory, persisted-locally and server-acknowledged work; unsupported storage/quota failures remain explicit.
  • Persist the latest pending layout by owner, graph and node before acknowledging durable local recovery. Store no bearer/session credentials. Retain explicit capacity/retention limits and account isolation.
  • A bounded browser regression holds or fails only owned layout writes, performs two real drags, reloads before server acknowledgement, reconnects and proves the newest coordinates via independent server readback and another reload.
  • A separate owned-browser-process restart test bypasses unload handling while preserving its isolated profile, then verifies recovery. Ordinary reload alone is not crash evidence; document the remaining OS/storage-flush boundary.
  • Late acknowledgement/failure cannot clear a newer persisted edit. Logout, replacement account, revoked graph access and deleted nodes cannot replay another owner's work or silently target a different graph. Define visible recovery/discard behavior.
  • Preserve the existing Graph/List navigation, retry and owner/token regressions. Retain failing-before/passing-after evidence, exact revisions, zero-retry completion and strict fixture cleanup.

Scope: queued layout coordinates. Unsaved details-modal drafts, general autosave and server-side multi-actor conflict resolution are separate requirements.

Activity

  1. mvalancy commented on Oct 27, 2026

    @mvalancy
    MemberAuthor

    Help requested under the owner's 2026-10-27 instruction to resolve the open backlog. This is the preferred independent assignment while the current agent repairs #192 CI and continues LOD/server CAPTCHA/dependency work.

    Please claim this issue with an owned branch/worktree before editing. Implement the existing acceptance criteria without overlapping the LOD renderer: start with positionSaveQueue.ts, its owner registry/hook, and the existing account-scoped IndexedDB store. Preserve server-acknowledged vs locally durable vs in-memory status distinctions. The critical acceptance is real drag → hold write → reload and a separate browser-process restart, plus stale acknowledgement and cross-account/logout/deletion negatives.

    Start from live dev, read AGENTS.md, use owned disposable fixtures, retain the failing baseline, run the relevant unit/browser gates, and file a focused PR with exact revision evidence. Request independent review rather than treating an author self-review as approval. Please comment with a blocker or a scoped help request if something prevents completion.

  2. mvalancy commented on Oct 27, 2026

    @mvalancy
    MemberAuthor

    No separate claim has arrived, so the current agent is now taking implementation ownership on isolated branch fix/durable-layout-recovery-20261027, stacked on the reviewed current Core remediation composition. This updates the earlier help request: please avoid concurrent edits to the position queue/store/hook while this branch is active. #182 and #209 remain available for independent help.

    Implementation will reuse the account-scoped IndexedDB transaction boundary, retain credential-free owner/graph/node receipts, distinguish in-memory/local-durable/server-acknowledged state, and compare receipt revisions before acknowledging or discarding. Acceptance retains real two-drag reload-before-acknowledgement and a separate owned browser-process termination/restart, stale receipts, logout/account mismatch, missing/deleted/unauthorized nodes, quota failure, and existing Graph/List navigation checks. No runtime durability claim will be made before those tests and independent review pass.

  3. mvalancy commented on Oct 28, 2026

    @mvalancy
    MemberAuthor

    Resolved by reviewed #213, integrated with #214. Durable account/graph/node-scoped receipts preserve unsent positions across reload and actual owned-browser process termination/restart. Generation fences and exact-session replay checks prevent stale/cross-account replay; accepted writes with failed cleanup retry cleanup only. Pending Settings state and delayed error ownership were independently reviewed and corrected. Nine strict browser cases include actualquota/two-tab ordering, account replacement, revoked/deleted targets, unavailable storage/locks and stable LOD labels while work is pending. Earlier negative evidence and the review correction remain in the PR and canonical lessons.

    Final aggregate dev acceptance passed at 77899e98a081e725ae8ddc15b6566cc50c9a584f: CI40618347427 and Comprehensive40618347395. Actual downloaded browser reports confirm smoke6, new-user42, semanticLOD2, layout-recovery9, routes7, mobile27 and performance3, all zero failures/warnings/skips, exit0, no timeout/evidence errors, and matching clean fingerprints on this exact dev SHA. Browser artifact.

    All applicable quality/build/unit/security, realNeo4j/MCP, three runtime-image, effects/showcase, supported Node22.18/24 and installer/config jobs passed. Main/nightly production-stack job was inapplicable and skipped, not claimed as passed. Native dev parents/tree were verified before closeout; main remains775362e. No release/deployment/protection changes. The intermediate ed963 dev CI was cancelled by the newer aggregate push and was not counted as success.

    Closing the defined durability acceptance. Unsupported storage/locks and inaccessible records remain explicit recoverable states; no universal network/hosted guarantee is inferred. Nested LOD continues separately in #215/#216 and must preserve these regressions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions