- jobs.node column (migration) written at dispatch: placement was held only
in runner memory, so every job rendered as the primary and busy remotes
showed idle in fluxgod
- sysinfo.nodes_detail() joins running jobs on jobs.node; legacy NULL rows
still credit the primary. gpu_pool() now derives busy from the inflight
counters instead of the dead busy key (set once at load, never updated)
- /api/nodes endpoint exposing the per-machine view
- local pool node named after its host (m3ultra), not "local"
- /api/assets?parent_job= filter actually filters now (was accepted and
silently ignored; callers got the whole table)
- tests/test_node_reporting.py: 8 framework-free checks incl. the captured
/api/nodes contract fluxgod consumes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>