Phase 3: individual defense assignments with invite codes
- progress V5 defense_sessions: per student+lab individual task (md), status
machine waiting -> started -> ready, one-time 6-digit codes
- 30-min timer with server-side lazy expiry (syncTimeouts: started->ready by
timeout), countdown JS on student page
- admin: assign task dialog (+prefill existing via data-md), CSV import
(studentNo;task, \n for newlines) resolved via identity students,
issue/reset code buttons, defense status column
- student: code entry form (code hidden until start), assignment md,
'Готов к сдаче', waiting-for-teacher note
- gateway: /api/v1/defenses,/api/v1/defenses/** routes
- web api client + admin/student controllers wired