PLUTO-782 app refusal for deleted roleless student target
PM ruling pmmaster-evolutiva-cc-muws88mwh1i3-db-pluto-ca: DB trigger on studentAssignments is the load-bearing live-user gate and lands before/with vUserRolesActive owner filter. Coder owns only additive user-facing live-target check at validateAlumnoUser roleless exception in src/lib/administrar-actions.ts, preserving legitimate live pre-registered students. If app check passes but DB trigger P7822 refuses after a race, expose the DB refusal to the user, never success. Class-A audit design ping before implementation and diff review before push. Forced-red synthetic app test: deleted non-alumno target currently refused, view-only would be accepted, view+DB gate refused; app check gives clear refusal. No production roster writes. Coordinate with db-pluto-ca migration 133; do not edit DB objects. Two affected deleted targets measured read-only, identities not on row.
Activity
-
SHA b2b1707, v2.24.5. Pushed src/lib/administrar-actions.ts, src/lib/live-target-error.ts (new), src/lib/administrar-live-target.test.ts (new). App-side live-target refusal ahead of the roleless pre-registered exception in validateAlumnoUser; typed P7822 (SQLSTATE) branch at addAlumnoAssignment/updateAlumnoAssignment/restoreAlumnoAssignment (trigger is INSERT OR UPDATE) and the import per-row error path. Gate-correct refusal, not logged via logCaughtError. 14 test arms, 3 forced reds verified (typed-code vs substring, drop-site, log-on-refusal). PASS:working-tree from audit-general-ca on hashes d2f9806a/c41d0163/7552258 (pre-push, unchanged at push time). Coverage limit: the trigger-side P7822 refusal is UNEXERCISED - migration 133 (the real fn_requireLiveStudentForAssignment trigger) landed as a reviewed frozen file in e710767, apply is Elazar-gated, no production roster write. PTD: Vercel deploymentId dpl_EkRfxaj4Ti1YPVQvPK1mDVWF312X tail-matches live /api/health deploymentId, version 2.24.5 confirmed, dbOk true.
-
completed