- Remove SendWithRefreshAsync method from AuthServiceBase (now dead code)
- Replace all 15 SendWithRefreshAsync call sites in 7 services with
direct Client.XxxAsync calls
- Remove unused using System.Net from AuthServiceBase
- Update AGENTS.md to document JwtTokenRefresher as the sole token
refresh mechanism
- JwtTokenRefresher: remove ForceLogout that was clearing auth on refresh
failure and redirecting to login. Instead return a synthetic 401 so the
service-layer handling can retry.
- AuthServiceBase: add LoginService property and SendWithRefreshAsync
helper — wraps any HTTP call, catches 401, refreshes token via
Reauthenticate(), updates DefaultRequestHeaders, retries once.
- JobsService: remove local SendWithRefreshAsync, use base class version.
- SettingsService, FoldersService: wrap GET calls with
SendWithRefreshAsync.
- LoginService: fix Logout to also clear LoggedUser.
Achieves 100% XML doc coverage on non-trivial types with CS1591
enforcement via Directory.Build.props.
Coverage by project:
- Butter: from 6.5% to 100% (DTOs, enums, MIME types)
- Lactose: from ~28% to 100% (controllers, services, repos, jobs, models)
- MilkStream.Client: from ~29% to 100% (all frontend services)
Uses <inheritdoc /> on repository implementations (interfaces
already documented) and full <summary>/<param>/<returns> tags
elsewhere. Enums include member-level docs.