Follow-ups from the repeater administrators review that are real but not urgent, all in lib/services/meshcore/connection.dart unless noted:
_endAdminCommand() in every admin command's finally is unconditional. In the one window the identical(...) guards exist for (a call parked on the sign gate, then abortPendingAdmin() freeing the slot, then a second call), the first call's unwind clears _adminCommandInFlight under the second. A slot token would close it. The session's busy flag keeps a third caller out today.
_binaryResponseTag is set after the SENT await. On TCP or USB serial, two frames decoded from one read arrive one microtask apart, so a BINARY_RESPONSE could in theory land before the tag and be logged as unsolicited, ending in a clean timeout. Seconds separate them in practice; worth a comment, not code.
resetPath and addContact share _adminOkCompleter. A straggler OK after a resetPath timeout could resolve a later addContact early.
ContactRecord does not assert publicKey.length == 32 or outPath.length == 64; a bad length mis-frames the add and the substring(0, 8) in the log line throws.
- Untested paths: a malformed CONTACT frame being skipped, unsolicited CONTACTS_START / CONTACT drops, the short-SENT admin
FormatException, dispose after SENT while awaiting a reply, and ClaimModule.run / NeighboursModule.run.
AppStateProvider still has its own private _hexToBytes for the portal nonce now that repeater_admin_models.dart exports a strict public one.
_TargetedDeps carries both hasRepeaters and repeaterCount; one is enough.
DEVELOPMENT.md: the provider bullet says passwords are "never sent"; they are sent to the repeater over the mesh, just never to the server. Say so.
Follow-ups from the repeater administrators review that are real but not urgent, all in
lib/services/meshcore/connection.dartunless noted:_endAdminCommand()in every admin command'sfinallyis unconditional. In the one window theidentical(...)guards exist for (a call parked on the sign gate, thenabortPendingAdmin()freeing the slot, then a second call), the first call's unwind clears_adminCommandInFlightunder the second. A slot token would close it. The session'sbusyflag keeps a third caller out today._binaryResponseTagis set after the SENT await. On TCP or USB serial, two frames decoded from one read arrive one microtask apart, so a BINARY_RESPONSE could in theory land before the tag and be logged as unsolicited, ending in a clean timeout. Seconds separate them in practice; worth a comment, not code.resetPathandaddContactshare_adminOkCompleter. A straggler OK after aresetPathtimeout could resolve a lateraddContactearly.ContactRecorddoes not assertpublicKey.length == 32oroutPath.length == 64; a bad length mis-frames the add and thesubstring(0, 8)in the log line throws.FormatException, dispose after SENT while awaiting a reply, andClaimModule.run/NeighboursModule.run.AppStateProviderstill has its own private_hexToBytesfor the portal nonce now thatrepeater_admin_models.dartexports a strict public one._TargetedDepscarries bothhasRepeatersandrepeaterCount; one is enough.DEVELOPMENT.md: the provider bullet says passwords are "never sent"; they are sent to the repeater over the mesh, just never to the server. Say so.