Grading-vs-editing concurrency nudge: verify it's real + design a truthful 'Editando' signal
Elazar 2026-07-19 (from EVO-62 friction #: top LIVE friction by user-count = 67 occ / 30 teachers / 28d, nudge 'No se puede calificar: el alumno está editando la práctica.'). Nudge is RENDER-based (review-form.tsx:236 FeedbackShown feedbackKey=review:locked-by-student, fires when a teacher OPENS the review page while an active practicaEditLocks row exists — NOT on a grade click). Lock = 2h TTL (EDIT_LOCK_DURATION_HOURS), releases early only on explicit student save (editar/actions.ts:1004) or cancel (releaseEditAction); an abandoned editor open lingers up to 2h. THREE tracks per Elazar: (a) VERIFY it's genuine concurrency not artifact — db-mars-cc quantifying real-vs-lingering split (query dispatched 2026-07-19); (b) option-b 'queue the grade, applies when student finishes' tracked here; (c) if real, add a SIMPLE transient 'Editando' label — NOT a new approval state / no app refactor. Cheapest impl: the signal already exists (active practicaEditLocks row); LEFT JOIN it into the /practicas pending-queue list + render a badge, no migration. CAVEAT: raw 2h TTL makes 'Editando' lie for up to 2h after the student left → a truthful label needs a short liveness window (shorten TTL or lightweight heartbeat), which is the only real design cost. Gate build on (a) result.
Questions
Activity
-
RESOLVED — non-issue, metric was mislabeled. db-mars-cc re-traced (2026-07-19): the '67 occ / 30 teachers / 28d' was an AGGREGATE over action=nudge-shown spanning 5 different messages, with the locked-by-student string picked as the min(message) sample label. Real breakdown (28d): 50 rectificar:pending + 19 rectificar-nudge = 69 STUDENT rectificar-reminder pushes (by-design, not friction), and only 2 'review:locked-by-student' teacher-concurrency nudges. Both 2 real events were GENUINE live concurrency, zero lingering: case1 (práctica 4634ce1f) teacher opened review 18s after student entered editor, returned+graded aprobado 14min later — resolved cleanly; case2 (práctica 146a92be) teacher opened ~2min after student entered, backed off. 2 distinct prácticas / 2 teachers / 2 pairs, no re-view inflation. Conclusion: NO concurrency problem to fix — queue-grade (opt-b) and 'Editando' label (opt-c) both unwarranted at 2 events/28d. Ideas preserved in this WI's description if it ever recurs. Side-notes for later, not acted on here: (i) the 2h abandoned-lock TTL residue is real (case2's lock still held) but harmless at this volume; (ii) student práctica SAVES aren't event-logged (category=practica action=edit status=success = 0 rows/7d) — only failures are, a telemetry asymmetry. Elazar informed via CLI.