Files
RuView/docs
ruv f604297ee8 feat(render): animated real-time heatfield + fal.ai trust boundary
Confirms and implements the users direction: assets/room_csi_composite.png
(a static matplotlib experiment blending a real signal_field grid onto
assets/room-style-1.png) becomes Layer 1s real continuous per-frame target.

- New heatfield.rs: bilinear-samples the real live signal_field grid
  (observed 20x20, [20,1,20]) each frame and screen-blends it onto the
  embedded room-style-1.png backdrop. Validated against live data: real
  pixel-level variation confirmed frame to frame (3202/147456 pixels
  changed between two frames ~1s apart, not a frozen composite).
- render_frame now uses the heatfield composite as the background whenever
  signal_field is present, falling back to the flat schematic otherwise
  (never fabricates a heat pattern that was not measured).
- Honesty fix: room-style-1.png already depicts its own illustrated person
  (decorative, not real pose data). Drawing the schematic stick-figure
  skeleton and room-bounds rectangle on top of it in an unrelated position
  risked a viewer confusing one figure for the other, or the schematic
  rectangle for real room bounds. Both are now suppressed on the heatfield
  backdrop; real per-node dots and real vitals bars are kept since they
  do not have that ambiguity. The schematic elements remain the whole
  visualization on the flat-fallback path.
- estimated_persons / signal_quality_score made serde-optional: the live
  server was observed to occasionally omit them, previously causing a real
  (correctly non-fabricating) fetch error on those frames.

Non-negotiable trust boundary, encoded in ADR-352 and at the type level:
fal.ai (generic model or the in-training ruforecast-visual-teacher LoRA)
may only ever return supplementary synthetic pixels. StyledFrame is
constrained to opaque image_bytes + call telemetry and must never gain a
field a caller could mistake for a measured/derived value (pose, vitals,
identity, confidence). The fal.ai clients endpoint is now parameterized
(FAL_MODEL_ENDPOINT / with_endpoint) so swapping in the trained
visual-teacher model id is a config change, not a code change.

Budget: default fal-cost-estimate-usd lowered from 0.02 to 0.01 per
team-lead direction (pessimistic end of the measured $0.003-0.01/call
range, biased so BudgetGuard fails safe against an underestimate).
2026-09-02 02:31:09 -04:00
..