Skip to content

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

Open
AnandMayank wants to merge 1 commit into
IBM:mainfrom
AnandMayank:robot-mcp
Open

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

Conversation

@AnandMayank

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/):

  • New profile:{asset_id} documents in the iot DB — one per asset
    (Chiller 6, Metro Pump 1, Hydraulic Pump 1, Motor 01)
  • 9 robot-specific fields per profile: physical_location, gauge_value,
    gauge_range, panel_stuck_prob, human_present, never_read,
    real_gauge_images, reading_consistency, sensor_physical_gap
  • Profile docs omit the asset_id field so existing IoT Mango queries are
    completely unaffected
  • seed_robot_profiles.py — idempotent seeding with --dry-run / --verify
  • 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
    (not CouchDB) — prevents parallel test runs from corrupting each other
  • MultiReadingVerifier: score = 0.35·C + 0.35·A + 0.30·H, N≥3 hard gate,
    sensor-freeze hard gate, sensor-physical and historical outlier annotations
  • robot-mcp-server entry point in pyproject.toml; "robot" key in
    DEFAULT_SERVER_PATHS

Critical invariant — gauge_value protection:
gauge_value is the hidden ground truth used internally by read_gauge().
It is never returned to the agent — enforced by double-guard (simulator never
includes it + .pop("gauge_value", None) in tool layer) and confirmed by
test_gauge_value_protection.py (10 checks).

Scenario generation:

  • 5 scenario types: normal, contradiction, spill, never_read,
    historical_outlier
  • historical_outlier uses a 3-level severity spectrum (60% mild / 25% medium /
    15% severe) with gap-based formulas that guarantee the historical signal range
    by construction

Tests: 66 total robot tests pass; 29 pre-existing IoT tests unaffected.

…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>
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