POST /spoolbuddy/scale/update-spool-weight tried the local DB first
and only fell back to Spoolman on a local miss. Combined with
nfc/tag-scanned's post-#1119 always-Spoolman routing, a stale local
Spool row sharing a numeric id with a Spoolman spool would absorb
the sync silently while the Spoolman row stayed unchanged.
Mirror the routing already used by nfc/tag-scanned: pick the branch
via _get_spoolman_client_or_none() and never cross. Local mode now
returns 404 on a local miss instead of falling through.
New TestUpdateSpoolWeightSpoolman.test_stale_local_row_does_not_shadow_spoolman
asserts both directions: Spoolman gets the update, the colliding
local row's weight_used and last_scale_weight are untouched.