@@ -476,6 +476,27 @@ REGISTER_TYPE(cpu_usage, float, false)
476476REGISTER_TYPE (memory_usage, uint32_t , false )
477477REGISTER_TYPE (num_procs, uint32_t , false )
478478REGISTER_TYPE (agent_description, std::reference_wrapper<const std::string>, false )
479+ // Deployment metadata, self-reported once at agent-node creation (see AgentInfoAPI). Feeds the
480+ // "mind" node network view: agent_cmd/agent_cwd are the launch command + working dir read from
481+ // /proc/self, agent_config is the raw contents of the etc/config passed on the command line.
482+ REGISTER_TYPE (agent_cmd, std::reference_wrapper<const std::string>, false )
483+ REGISTER_TYPE (agent_cwd, std::reference_wrapper<const std::string>, false )
484+ REGISTER_TYPE (agent_config, std::reference_wrapper<const std::string>, false )
485+ // Process id of the agent (getpid). Lets the mind network view attribute each loopback TCP
486+ // connection to the exact client agent (inode→pid→agent), i.e. per-connection bandwidth.
487+ REGISTER_TYPE (agent_pid, std::uint32_t , false )
488+ // Live health of the agent, self-reported on every state transition (see rc::AgentStatePublisher).
489+ // Two independent axes: the generated GRAFCET/QStateMachine step the agent is executing, and the
490+ // agent-presence lifecycle (are its required peers there?). They are NOT redundant: an agent parked
491+ // in on_waiting_loop waiting for peers still reports FSM "Compute". The publisher also derives a
492+ // worst-wins `color` from the pair so any graph viewer paints the agent node without duplicating
493+ // the mapping.
494+ REGISTER_TYPE (agent_fsm_state, std::string, false ) /* Initialize | Compute | Emergency | Restore */
495+ REGISTER_TYPE (agent_presence_state, std::string, false ) /* Waiting | Operating | Degraded */
496+ // Live media-plane throughput (bytes/s) the producer (SensorMediaPublisher) writes onto a sensor's
497+ // descriptor node. The heavy frames travel over zero-copy DDS shared memory, invisible to packet
498+ // capture, so this self-reported figure is the only way the mind view can show real media bandwidth.
499+ REGISTER_TYPE (media_bps, float , false )
479500
480501
481502/*
@@ -573,6 +594,44 @@ REGISTER_TYPE(grid_occupancy_var, std::reference_wrapper<const std::vector<floa
573594REGISTER_TYPE (grid_field_meta, std::reference_wrapper<const std::vector<float >>, false ) // [xmin,ymin,cell,w,h]
574595
575596
597+ // ── table-concept VOXEL MEMORY + active-perception ROI channel (written by table_concept) ──────
598+ // Registered 2026-07-21 so table_scene_graph.cpp can use the TYPE-ATTRIBUTED setters instead of the
599+ // runtime_checked_* string form (see CLAUDE.md). table_voxel_bank_pts / table_roi_offset are [x,y,z]-
600+ // and [ox,oy]-packed float arrays; the ROI + detection scalars drive the controller's lock-on search
601+ // via common/affordance_protocol (its attr_scalar() coerces int/float/bool alike).
602+ // WIRE-TYPE WARNING for whoever edits these next: an attribute's registered type is part of its CONTRACT
603+ // with every consumer. table_detection_alive was int 0/1 until 2026-07-21; flipping it to bool without
604+ // migrating the readers made room_concept throw "INT is not selected, selected is BOOL" at runtime,
605+ // because it read the raw attrs map with Attribute::dec(). Both readers now use the TYPE-ATTRIBUTED
606+ // getter (get_attrib_by_name<table_detection_alive_att>), so a future type change is a COMPILE error
607+ // there instead of a runtime throw. Never change a registered type without migrating every reader.
608+ REGISTER_TYPE (table_voxel_bank_pts, std::reference_wrapper<const std::vector<float >>, false ) // [x,y,z]×N
609+ REGISTER_TYPE (table_roi_offset, std::reference_wrapper<const std::vector<float >>, false ) // [ox,oy] ∈[-1,1]
610+ REGISTER_TYPE (table_roi_fill, float , false ) // projected extent frac
611+ REGISTER_TYPE (table_roi_valid, bool , false ) // projects in front of cam
612+ REGISTER_TYPE (table_detection_alive, bool , false ) // YOLO firing here
613+ REGISTER_TYPE (table_detection_confidence, float , false ) // last mask confidence
614+ REGISTER_TYPE (table_frames_since_detection, int , false ) // cycles since fresh mask
615+
616+ // ── chair-concept / cabinet-concept: same voxel-memory + ROI channel as table-concept above ────
617+ // These agents are copies of the table_concept pattern and carry the identical interface, so they get
618+ // the identical types. Readers are common/affordance_protocol (attr_scalar coerces int/float/bool), and
619+ // no consumer reads them with a raw Attribute accessor — verified 2026-07-21 before choosing bool.
620+ REGISTER_TYPE (chair_voxel_bank_pts, std::reference_wrapper<const std::vector<float >>, false ) // [x,y,z]xN
621+ REGISTER_TYPE (chair_roi_offset, std::reference_wrapper<const std::vector<float >>, false ) // [ox,oy]
622+ REGISTER_TYPE (chair_roi_fill, float , false )
623+ REGISTER_TYPE (chair_roi_valid, bool , false )
624+ REGISTER_TYPE (chair_detection_alive, bool , false )
625+ REGISTER_TYPE (chair_detection_confidence, float , false )
626+ REGISTER_TYPE (chair_frames_since_detection, int , false )
627+ REGISTER_TYPE (cabinet_voxel_bank_pts, std::reference_wrapper<const std::vector<float >>, false ) // [x,y,z]xN
628+ REGISTER_TYPE (cabinet_roi_offset, std::reference_wrapper<const std::vector<float >>, false ) // [ox,oy]
629+ REGISTER_TYPE (cabinet_roi_fill, float , false )
630+ REGISTER_TYPE (cabinet_roi_valid, bool , false )
631+ REGISTER_TYPE (cabinet_detection_alive, bool , false )
632+ REGISTER_TYPE (cabinet_detection_confidence, float , false )
633+ REGISTER_TYPE (cabinet_frames_since_detection, int , false )
634+
576635// ── table-concept inference outputs (written by table-concept) ────────────────────────────────
577636REGISTER_TYPE (free_energy, float , false )
578637REGISTER_TYPE (model_stable, bool , false )
0 commit comments