🐛 Bug: Concurrent edits silently overwrite work item descriptions (lost images/text)
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
Línea de trabajo
Start with IssueViewSet.partial_update in apps/api/plane/app/views/issue/base.py and the document type definition in apps/live/src/types/index.ts; trace how the editor autosaves descriptions and how page collaboration is handled. Compare the concurrency and collaboration options in the issue, then define how stale edits are detected or merged. Done means concurrent edits no longer silently discard another user's description content; verify with the two browser steps described above.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Is there an existing issue for this?
- I have searched the existing issues
Current behavior
When two people have the same work item open, the one who saves last silently overwrites what the other saved in the meantime, including newly added images. Nobody gets a warning and nothing is merged. The lost content only shows up in the description version history.
Why it happens
- The web editor autosaves the whole description with
PATCH /api/workspaces/<slug>/projects/<project_id>/issues/<id>/, sending{ "description_html": ... }. IssueViewSet.partial_update(apps/api/plane/app/views/issue/base.py) stores the receiveddescription_htmlas is. There is no version,updated_ator ETag check, so it is last-write-wins.- Work item descriptions are not collaborative. The live server only handles
project_pagedocuments (apps/live/src/types/index.ts:TDocumentTypes = "project_page"), so an open editor never receives other users' changes. Its next autosave writes its outdated copy back.
What we observed in production (self-hosted v1.4.2)
API logs with user ids, together with issue_description_versions, show this timeline on one work item (times in seconds, users A and B):
| t | event |
|---|---|
| 0 | B opens the work item (description has 4 images) |
| +9 s | A pastes a new image 6ef7e0ca… (asset upload + PATCH asset 204) |
| +11 s, +14 s | A's description autosaves (PATCH 204), image included |
| +69 s | B saves without having reloaded → 6ef7e0ca… is gone |
- The asset of the lost image was never deleted (
deleted_atis NULL, noDELETErequest). It was simply overwritten. - Earlier the same day, B's stale save also removed ~1,000 characters A had written a minute before (4,768 → 3,782 characters).
- In 3 weeks of logs we counted 26 saves made from a copy older than another user's latest save, on 7 work items. On one item, two users overwrote each other every few seconds for about a minute.
- The description history since 2025-08 contains more cases where an image added by one user disappeared after another user's save.
Steps to reproduce
- Open the same work item in two browsers as user A and user B.
- As A, add an image (or a paragraph) to the description and wait for the autosave.
- As B, without reloading, change anything in the description.
- Reload: A's image or paragraph is gone. The version history shows it existed in A's version.
Expected: A's change is kept (merged), or B is at least told that the description changed and is not allowed to silently overwrite it.
Possible directions
- Make work item descriptions collaborative through the live server, like pages (
description_binaryalready exists onIssue). This removes the problem at its root. - Optimistic concurrency as a smaller step: the client sends the version it started from (e.g.
updated_ator a hash ofdescription_html), the API returns 409 when it is outdated, and the editor refetches and reapplies the user's edit instead of overwriting. - Server-side merge as a stopgap. On our instance we now keep, per user and work item, the description the editor last loaded or saved. When the stored description changed since then, we apply the other users' changes onto the incoming HTML with a block-level 3-way merge (recursing into lists). If both sides changed the same block, both versions are kept. This has stopped the image loss for us. I'm happy to share the patch if it helps, but option 1 or 2 is clearly the better long-term fix.
Related: #9779 (realtime work-item updates for list/board views).
Environment
Production
Browser
Google Chrome
Variant
Self-hosted (Community)
Version
v1.4.2 (same logic on preview as of bab49bb)
- Lenguaje dominante
- TypeScript
- Estrellas
- 61.5k
- Forks
- 6.2k
- Merge medio
- 1 d 18 h
- PR fusionados (30 d)
- 79
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de makeplane/plane
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Missing optional chaining on actor_details and reaction_items in apps/space reactions and votesAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
makeplane/plane#10111 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
makeplane/plane#10082 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
[bug]: Email notifications show a broken avatar for users without a profile photoPosiblemente ocupada @gurnoorpannu la tomó hace 13 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
makeplane/plane#10009 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
🐛 Bug: Calendar work items cannot be opened on mobilePosiblemente ocupada @pennnnnnnnnn la tomó hace 15 días. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
Todos los issues de makeplane/plane
Issues similares
-
category::task code priority::normal
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
e0ipso/strikethroo#145 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 85/100
cocos/cocos-docs#3333 ·
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
RevenueCat/react-native-purchases#2079 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
RevenueCat/purchases-hybrid-common#2039 ·
Los mantenedores suelen responder en 1 día
-
agent-reported area/react bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día