fix(server): resolve adversarial review findings C1-C5, H1-H3, H5, M1-M2
Critical fixes:
- C1: FieldModel created with n_links=1 (single_link_config) so
feed_calibration/extract_perturbation no longer get DimensionMismatch
- C2: variance_explained now uses centered covariance trace (E[x²]-E[x]²)
matching mode_energies normalization
- C3: MP ratio uses total_obs = frames * links for consistent threshold
between calibration and runtime
- C4: Noise estimator filters to positive eigenvalues only, preventing
collapse to ~0 on rank-deficient matrices (p > n)
- C5: ESP32 paths gate total_persons on presence — empty room reports 0
High fixes:
- H1: Bounding box computed from observed keypoints only (confidence > 0),
preventing collapse from centroid-filled unobserved slots
- H2: fuse_or_fallback returns Option<usize> instead of sentinel 0,
eliminating type ambiguity between "fusion succeeded" and "zero people"
- H3: Monotonic epoch-relative timestamps replace wall-clock/Instant mixing,
preventing spurious TimestampMismatch on NTP steps
- H5: ndarray-linalg gated behind "eigenvalue" feature flag (default=on),
diagonal fallback used with --no-default-features
Moderate fixes:
- M1: calibration_start guards against replacing Fresh calibration
- M2: parse_node_positions logs warning for malformed entries
Co-Authored-By: claude-flow <ruv@ruv.net>