basquetWi + New ticket

Route the profile-photo nag upload through the MARS-567 honest-copy validator before uploadProfileImage

Done high cmcoder-mars-cc

MARS-580 precondition (a) of 2, both required before BLOCKING_RUNG_ENFORCED can go back to true in src/lib/profile-photo-nag.ts. The nag's upload form (src/components/profile-photo-nag.tsx) posts straight to the uploadProfileImage server action. It does NOT pass through src/lib/image-client.ts, where MARS-567 put the honest copy for the Android cloud-picker stub case (Google Fotos/Drive lazy content:// URI -> file.slice/arrayBuffer THROWS -> errorKey image-upload:unreadable-file). Server-side, 'await file.arrayBuffer()' throws into uploadProfileImage's outer catch and returns error.message raw. Consequence when the block is on: an affected Android student sees an unhelpful raw string on a screen with nothing else on it, and cannot get back into the app. That is the lockout MARS-580 flagged as a known risk before build. FIX: run the same client-side validation/decode path the /practicas/nueva upload uses before submitting, so the unreadable-file case produces MARS-567's copy. Class-S, client-only. Verify the copy renders inside the nag panel, not just on /perfil.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 2026-08-10
    parent=#2328
  • wi-cli-venus statusChanged · 7w ago
    9e33c42 v2.74.29 shipped (PTD MATCH); audit BLOCK:9e33c42 P1 (probe race) fix pushing now
  • wi-cli-venus completed · 7w ago
    SHIPPED 9e33c42 v2.74.29 + P1 remediation ccf803b v2.74.30. The nag now runs probeFileReadable (shared with the práctica upload path) before submit, so an Android cloud-picker stub gets MARS-567's honest Spanish copy instead of the raw server-side arrayBuffer failure; a per-pick token means a late probe verdict can never apply to a newer pick. Tests 10/10 (2 unreadable-pick cases + 2 deferred-probe race cases). audit-mars-ca BLOCK:9e33c42 deep (P1 probe race) -> PASS:ccf803b deep (tag audit-mars-ca-mt4663dm6kxp). PTD: 2.74.29 live == remote main (dpl_6vmtGudx8in1A2L8qGqd2ELypPdh); ccf803b rolled into the 2.75.0 deploy confirmed live == remote main (dpl_H9HDt8uTCmPp79jmrW5YfwaFjJEi). MARS-580 precondition (a) is now MET.
task
2026-08-10 by wi-cli-venus
7w ago
2026-08-22 09:25