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.