Skip to content

feat(robot-mcp): add robot inspection MCP server and CouchDB asset profiles#370

Open
AnandMayank wants to merge 3 commits into
IBM:mainfrom
AnandMayank:robot-mcp
Open

feat(robot-mcp): add robot inspection MCP server and CouchDB asset profiles#370
AnandMayank wants to merge 3 commits into
IBM:mainfrom
AnandMayank:robot-mcp

Conversation

@AnandMayank

@AnandMayank AnandMayank commented Jun 14, 2026

Copy link
Copy Markdown

This PR adds a robot inspection extension to AssetOpsBench, enabling agents to
physically verify industrial assets before committing maintenance decisions.

CouchDB profile layer (src/couchdb/):

  • profile:{asset_id} documents in the iot DB for each known asset, with
    8 robot-specific fields: physical_location, gauge_value (hidden ground
    truth), gauge_range, gauge_path, never_read, reading_consistency,
    sensor_physical_gap, panel_stuck
  • Profile docs omit asset_id — existing IoT Mango queries are unaffected
  • seed_robot_profiles.py — idempotent seeding (--dry-run / --verify)
  • schema_robot_fields.json — field reference with gauge_value constraint

Robot MCP server (src/servers/robot/):

  • 6 tools: navigate_to, safety_gate_check, open_panel, read_gauge,
    commit_reading, check_wo_similarity
  • open_panel() reads panel_stuck: bool from CouchDB profile (deterministic)
  • read_gauge() applies Gaussian noise scaled by reading_consistency from
    profile; gauge_value is used internally and never returned to the agent
  • commit_reading() enforces a minimum of 3 readings before committing

Critical invariant: gauge_value is never exposed in any tool response —
confirmed by test_gauge_value_protection.py (7 checks across all 6 tools).

Tests: 35 passed (live-DB integration tests), 0 failed.

…ofiles

CouchDB profile layer (src/couchdb/):
- New profile:{asset_id} documents in the iot DB for 4 assets
  (Chiller 6, Metro Pump 1, Hydraulic Pump 1, Motor 01)
- 9 robot-specific fields per profile; docs omit asset_id so existing
  IoT Mango queries are completely unaffected
- seed_robot_profiles.py with --dry-run / --verify flags
- schema_robot_fields.json field reference and gauge_value constraint doc

Robot MCP server (src/servers/robot/):
- 8 tools: navigate_to, safety_gate_check, open_panel, read_gauge,
  check_human_presence, commit_reading, check_wo_similarity, detect_anomaly
- PhysicalStateSimulator: seeded (seed=42), deterministic, state in memory
- MultiReadingVerifier: score = 0.35*C + 0.35*A + 0.30*H, N>=3 hard gate,
  sensor-freeze gate, sensor-physical and historical outlier annotations
- historical_outlier uses 3-level severity spectrum (60% mild / 25% medium /
  15% severe) with gap-based formulas guaranteeing H range by construction
- gauge_value never returned to agent; enforced by double-guard confirmed
  by test_gauge_value_protection.py (10 checks)
- robot-mcp-server entry point added to pyproject.toml
- "robot" key added to DEFAULT_SERVER_PATHS in src/agent/runner.py

Tests: 66 robot tests pass; pre-existing IoT tests unaffected.
Signed-off-by: AnandMayank <anandmayank698@gmail.com>
@DhavalRepo18

Copy link
Copy Markdown
Collaborator

@AnandMayank We will review in two days and give you feedback.

…sumer

- Delete PhysicalStateSimulator, MultiReadingVerifier, test_verifier.py
- open_panel() is now deterministic: reads panel_stuck bool from CouchDB profile
- read_gauge() uses inline noise from reading_consistency profile field
- commit_reading() simplified to N>=3 gate only, no scoring logic
- Remove check_human_presence() and detect_anomaly() tools (6 tools remain)
- Profile schema: 8 fields — gauge_path + panel_stuck replace
  real_gauge_images / panel_stuck_prob / human_present
- Fix autouse conftest fixture to reset _rng (not deleted _simulator._rng)
- Update FastMCP instructions string to reflect current tool set

Signed-off-by: AnandMayank <anandmayank698@gmail.com>
@AnandMayank

Copy link
Copy Markdown
Author

@DhavalRepo18 I have made some of the changes now it should be good for review !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants