perf(rete): UWC Site #5 conversion + LocationGFM defensive fix

Two new improvements beyond v0.5.428 (which already shipped Site #4
+ foundation):

1. Site #5 (FlowNode no sub_nodes yet) converted from imperative
   100-reschedule loop to cancel+final_pass with per-factory
   cancel-count tracking. has_child trigger handles the success path;
   cancel-count-1 + final_pass dispatch handles the failure path
   (UWC.run() must still emit "No matching unit term found" for
   invalid units).

2. LocationGFM._handle_conflicting_locations no longer unconditionally
   overwrites new_flow.amount with self.node.production_amount —
   skips when new_flow already has a QuantityProp amount.
   DuplicateNodeMutation (above) shallow-copies parent_node and
   inherits its amount; the unconditional overwrite silently
   re-stamped subrecipe-link FPFs' inherited 50g with the subrecipe's
   228g aggregate, scaling matrix contributions wrong. Latent under
   imperative (UWC hasn't committed yet); surfaces under any UWC #1+#2
   conversion. Defensive — correct regardless of UWC conversion path.

UWC Sites #1+#2 still imperative — Path B (2026-05-12) investigation
confirmed even fixing LocationGFM doesn't unlock conversion because of
a downstream TransportDecision/TransportModeDistance chain that keys
on UWC's timing.

Investigation findings on Pydantic perf (not actionable):
- node.__getattribute__ is 6.6% of wall in local tests
- ENTIRELY due to VERIFY_NODE_READ_ONLY=True (dev/test default)
- helm values-{dev,prod}.yaml set verify_node_read_only=false
- Cluster overhead is purely RETE/orchestrator infrastructure

Validation:
- two_origins CO2=1.2568 invariant holds
- test_calculation_with_subrecipe CO2=0.0930 invariant holds
- 96/96 in broad gauntlet
- 41/44 legacy_recipe_router (3 pre-existing batch flakes only)