update_absow: numeric compare for the modified flag (entirely-api 7385cfe)

services/field_inspection.update_absow decided the SOW_MODIFIED (“scope changed”) flag with str(psow_qty) != str(as_built_qty), which false-flagged every as-built==permitted confirmation where types differed (“24” vs “24.0”). Caught 2026-08-07 by Kilroy verifying a WTR field confirmation (DTIL/SUMP/SPIT/DISC, all as-built = permitted): all four lines were incorrectly marked modified; Kilroy cleared them manually.

Fix mirrors the sibling path field_update_writer._update_sow_line_from_field: float compare, with string compare as fallback for non-numeric values. 4 regression tests in tests/test_field_planned_qty_column.py (now the home for all modified-flag decision tests). Deployed same day (api+worker+scheduler rebuilt per §3 runbook).

Related open defect (spawned as separate task 2026-08-07): the same call path silently no-ops when given an unknown sow_line_id (e.g. portal UUID instead of smartsuite_id) — returns success-looking JSON, persists nothing.