Context
By design there is no real-time collaborative editor; concurrent editing is
allowed and last-write-wins on verse saves is expected (field requirement). The
only guard is the presence warning banner shown to the 2nd+ user. The wiring
already exists: fluent-web useChapterPresence.ts → store presenceWarning →
header banner; API chapter-assignments/{id}/presence.
Scope (verify, fix only if needed)
- QA the banner fires for the 2nd user within one heartbeat, and clears when
the first leaves (DELETE on unload).
- First-editor race —
upsertAndQueryFirstEditor isn't serialized; if QA
shows flakiness, use a stronger isolation level / SELECT … FOR UPDATE.
- Presence-route authz (recommended) — presence routes skip
requireChapterAssignmentAccess, so any translator can probe presence for any
chapterAssignmentId (leaks editor identity across assignments). Align with
the editor-state routes' requireChapterAssignmentAccess(IS_PARTICIPANT).
Decision (Kasey, 2026-06-18)
There is a warning that should display to the 2nd+ user to access the drafting
page of a chapter.
Refs
Follow-up from the security/export audit (#194, PR #189).
Detail: docs/proposals/security-and-export-hardening/04-concurrent-editor-warning-qa.md.
Context
By design there is no real-time collaborative editor; concurrent editing is
allowed and last-write-wins on verse saves is expected (field requirement). The
only guard is the presence warning banner shown to the 2nd+ user. The wiring
already exists:
fluent-webuseChapterPresence.ts→ storepresenceWarning→header banner; API
chapter-assignments/{id}/presence.Scope (verify, fix only if needed)
the first leaves (DELETE on unload).
upsertAndQueryFirstEditorisn't serialized; if QAshows flakiness, use a stronger isolation level /
SELECT … FOR UPDATE.requireChapterAssignmentAccess, so any translator can probe presence for anychapterAssignmentId(leaks editor identity across assignments). Align withthe editor-state routes'
requireChapterAssignmentAccess(IS_PARTICIPANT).Decision (Kasey, 2026-06-18)
Refs
Follow-up from the security/export audit (#194, PR #189).
Detail:
docs/proposals/security-and-export-hardening/04-concurrent-editor-warning-qa.md.