# Two-editor shared-record test worksheet Companion guide: https://www.overskill.com/learn/test-shared-record-edits Purpose: decide and test how one request retains independent edits and exposes conflicting edits. This worksheet uses fictional R-014. The companion browser rehearsal is local only; its results do not verify your app's server, permissions or simultaneous transactions. ## 1. Freeze the policy | Policy | This exercise | Your app's reviewed choice | | --- | --- | --- | | Identity | One immutable ID, R-014 | | | Fields | Exactly title, date-only due, owner label | | | Empty string | Explicitly clear the field | | | Missing or null | Reject; no partial save | | | Equality | Exact strings; no trimming or case folding | | | Field limits | Title 100 and owner 60 UTF-16 code units; due empty or valid YYYY-MM-DD in 2020–2100 | | | Direct save | Require current authorization, existing ID, expected version; accept whole record or reject whole record | | | Accepted version | Increment once, including a no-change save | | | Real conflict | Person chooses current or proposed; no automatic text concatenation | | | Third edit | Reject old proposal, keep draft, compare again, ask for fresh conflict choices | | | Deleted record | Stale save cannot recreate | | | Real concurrency | Server checks expected version atomically with write; test separately | | Four rules, first match wins: current=proposed → agreement; proposed=original → keep current; current=original → use proposed; otherwise conflict. A conflict has no default choice. No export or resolved save until all conflicts have a choice. ## 2. Record the test environment - App/version/URL: - Date and test owner: - Fictional workspace/record ID: - Session A identity and permission: - Session B identity and permission: - Permission/deletion test controller: - Where accepted record/version evidence will be retained: - Where a rejected save's draft will be observed: - Cases unavailable and why: Use authorized test accounts. Do not put real client data or credentials in this worksheet or an exported example. A local role switch is not permission evidence. ## 3. Independent changes: answer key Reset each editor to R-014 version 7: Workshop landing page / 2026-11-10 / Alex. | Step | Action | Expected current record | Evidence / actual result | | --- | --- | --- | --- | | 1 | A proposes due 2026-11-12; B proposes title Kite workshop landing page | Still v7; editing alone does not save | | | 2 | A saves using expected v7 | v8: Workshop landing page / 2026-11-12 / Alex | | | 3 | B tries full save using expected v7 | Rejected, still v8; B title stays in draft | | | 4 | B compares original/current/proposed | Proposal targets v8, with Kite workshop landing page / 2026-11-12 / Alex; current stays v8 | | | 5 | Inspect/export proposal before saving | JSON says fictional=true, saved_to_server=false; no current mutation | | | 6 | B saves resolved values using expected v8 | v9: Kite workshop landing page / 2026-11-12 / Alex | | | 7 | Repeat the old v8 save | Rejected; stays v9; no duplicate version increment | | The example JSON is available at https://www.overskill.com/learn/resources/shared-edit-example.json. It records step 4, not a live save. Copy and download should contain the same UTF-8 text, including final newline. There is no JSON import action. ## 4. Competing changes and a third edit Start each row as a separate reset unless stated otherwise. | Case | Setup/action | Expected result | Pass / fail / untested and evidence | | --- | --- | --- | --- | | Same result | A and B both change due from Nov 10 to Nov 12; A saves first | B's stale full save rejects; comparison says agreement on Nov 12, no conflict | | | Different result | A changes due to Nov 12; B changes due to Nov 14; A saves first | Conflict; blank choice blocks resolved save/export | | | Choose current | In different-result case, B explicitly chooses current | Resolved date Nov 12; save v8 → v9 | | | Choose proposed | Separate reset; B explicitly chooses proposed | Resolved date Nov 14; save v8 → v9 | | | Third edit | Follow independent case through step 4. Reopen A from current; A changes owner to Sam and saves | Current v9; old v8 proposal unusable; B draft retained | | | Fresh comparison | Continue third edit | Proposal targets v9: Kite workshop landing page / Nov 12 / Sam | | | Fresh save | Save that v9 resolution | v10 with those three values | | | Changed B draft | Edit B after comparing or exporting | Clear old proposal/export; compare again before resolved save | | | Cleared choice | Choose a conflict value then return to blank | Incomplete; prior export cleared and save/export unavailable | | ## 5. Failure and data-safety cases | Case | Expected result | Pass / fail / untested and evidence | | --- | --- | --- | | B edit permission revoked after comparison | Reject save/export regardless of version; do not modify current record | | | Current record deleted after comparison | Reject; no implicit recreation | | | One editor clears title/date/owner to empty string | Show (empty); treat as explicit proposed values | | | Missing field, extra field, null, invalid date or oversized string | Reject whole save without partial mutation | | | Retry accepted direct request with old expected version | Reject without another increment | | | Accepted no-change save | Increment once under this declared policy | | | Original/current/proposed contains HTML-like text | Display text, not executable markup | | | No permission but correct version | Denial still wins | | | Different workspace/account requests record | Real server denies at read/list/search/export/mutation boundaries | | | Two real requests race from the same expected version | Exactly one accepted write; the other rejected or explicitly re-compared; no silent overwrite | | | Tampered comparison basis | Real server applies its trusted basis/authorization policy; local model alone cannot prove authenticity | | The real server cases require implementation and authorized two-session testing. Browser-only success must remain labeled local rehearsal. ## 6. Blank field comparison Record ID: ____ Original version: ____ Compared current version: ____ | Field | Original | Current | Proposed | First matching rule | Explicit conflict choice, if needed | Resolved value | | --- | --- | --- | --- | --- | --- | --- | | Title | | | | | | | | Due | | | | | | | | Owner | | | | | | | - Rechecked expected version at write: - Rechecked current authorization at write: - Save result and accepted version: - Rejected attempt leaves current unchanged: - Unsaved draft retained: - Next owner/action for a failed or untested case: ## 7. Navigation and export checks Enter nondefault values first. Same-article contents links and browser Back/Forward between sections should keep the work. A real page exit, reload or explicit Reset should discard it according to the stated retention policy. Check these in the integrated app, not just the standalone model. Compare the visible JSON, clipboard and saved file bytes. An export represents the compared proposal; it does not save the record. Keep the readable fallback if a device blocks clipboard or download. Confirm old export links are cleared after relevant edits, deletion or revoked permission. Revisit prepared brief text before using it: changing the rehearsal does not silently rewrite an already edited brief.