basquetWi + New ticket
mars MARS-600

Foto de perfil obligatoria para alumnos + foto del alumno en la UI de corrección

Done high cmcoder-mars-cc

Client-requested (Elazar 2026-08-01, needed same morning). TWO halves. (1) FORCE UPLOAD, escalating ladder per Elazar's design: logins 1-2 dismissible banner; 3-4 modal dismissible after 5s; 5 modal after 10s; 6+ modal non-dismissible. Stage derived from count of category=auth action=login appEvents rows per actorUserId since a launch cutoff - NO new column, NO migration (ix_appEvents_actorUserId_createdAt covers it). Scoped to role alumno with profileImageId IS NULL, skipped under view-as. (2) Student photo in the teacher grading UI, beside the student name on /practicas/[id]. Auth already permits it (MARS-558: kind=profile served to any authenticated session); data = add profileImageId to the practica.ts selects. Plus non-blocking upload sanity checks in uploadProfileImage (min resolution, aspect ratio, colour-variance floor) to reject blank/flat/junk images - advisory, never a hard reject on a face-detection basis. Baseline measured 2026-08-01: 8 of 284 active-period students had a photo. Coder raised and Elazar overruled: the ladder ends in an app-wide lockout and its timer is client-side (bypassable). Elazar: these are students and the client is paying - proceed.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Questions

No questions.

Activity

  • wi-cli-venus created · 2w ago
  • wi-cli-venus completed · 2w ago
    Escalating mandatory-photo ladder (login-count derived, no migration) + server-side refusal in createPractica + student photo on grading surface. SHA 7abcd6b, live v2.64.1 confirmed.
feature
2w ago by wi-cli-venus
2w ago
2026-08-01 12:12