The signal is not a precondition.
The signal goes
A back room, a storm, a province with one bar. The app does not ask.
The class carries on
Attendance and scores are written to the device as they are taken. The record exists before anything is sent.
It arrives exactly once
Everything pending goes up in one transaction when a connection returns. A retry after a timeout produces the same result, never a second copy.
