CARD PAO-2 (A3)  written 2026-09-26 00:42:35 -0700  -- BEFORE its first compile
unit: source/ai/path_obstacle_avoidance   base: HEAD 455dffad
observed: TU renames real_math.h's __inline normalize2d (-> normalize2d_inline) and adds a consumer-local
  prototype 'real normalize2d(real_vector2d *vector);' (protoscan NOT DEFINED HERE) so path_add_step calls it out
  of line.
evidence: J: _normalize2d DEF only action_charge (selected), REF out of line by 17 objects incl.
  path_obstacle_avoidance. R3-2 (owner Q1 YES, 3ee32a5c) removed actor_combat's identical
  '#define normalize2d normalize2d_inline' redirect; actor_combat keeps its out-of-line calls with the genuine
  header inline (VC7 inline gating declines normalize2d at those sites).
correction: delete the two #define/#undef normalize2d lines and the local prototype + its comment.
prediction: VC7 declines to inline the header normalize2d at path_add_step's single site (as January): the call
  stays 'call _normalize2d', path_add_step stays EXACT; our object newly defines the _normalize2d SELECT_ANY
  COMDAT, byte-identical to January's action_charge copy (surplus_identity IDENTICAL, provider_link PASS both
  orders).
alternative outcome: VC7 inlines it -> path_add_step changes (size/sha) -> the redirect is load-bearing ->
  F-P2 becomes an owner question (consumer-local prototype vs forced out-of-line call).
collateral risks: other rows change through C1/declaration effects; new surplus COMDAT must pass rule-42 checks.
decisive test: gate --all 24/24 and keyed_diff vs build/base: +1 symbol _normalize2d only.
