Skip to main content

Explore Medical Device Field Report Intelligence

How to use this explorer

Move between stages with the arrows or the numbered stage list. Each stage shows the input it receives on the left and the output it produces on the right, with the lines that changed marked. The configuration that makes the change sits below the comparison, and the final stage shows the complete pipeline.

The 5 stages in order

  1. Collect synthetic fixtures
    Read the maintenance CSV, error events JSON, and technician notes through one broker and tag each message with its source.
  2. Tag each input message
    Set a batch id and site label as message metadata; the message body passes through unchanged.
  3. Invoke custom analysis code
    Run the checked-in analyzer, which reloads the fixtures and returns review candidates as JSON.
  4. Shape the output
    Add the pipeline version and processing time to the analyzer result.
  5. Fan out review candidates
    Write a local review copy and post the same JSON to the fleet endpoint. Delivery has not been exercised.

Interactive pipeline

MEDICAL DEVICE REFERENCE

Synthetic fixtures run through expanso-edge

Stage 1 of 5

Collect synthetic fixtures

Read the maintenance CSV, error events JSON, and technician notes through one broker and tag each message with its source.

5HighlightsAuthored emphasis only—not a computed diff.
Copy & download

Input

• maintenance-logs.csv (3 synthetic rows)• error-events.json (3 synthetic events)• technician-notes.txt (free text)

Output

{"data": {"description": "Synthetic inspection record; repeated status S1 events were attached to a fleet review.","device_id": "PUMP-TEST-02","site_zone": "LAB-B","technician_alias": "TECH-02","timestamp": "2026-02-10T09:32:00Z"},Authored highlight: "device_id": "PUMP-TEST-02",Authored highlight: "source": "maintenance_log",Authored highlight: "timestamp": "2026-02-10T09:32:00Z"}{"data": [{"adapter_status": 2,"device_id": "VENT-TEST-01","event_code": "SENSOR-STATUS-S2","message": "Synthetic sensor-status event for architecture testing.","timestamp": "2026-02-10T07:58:22Z"},{"adapter_status": 1,"device_id": "PUMP-TEST-02","event_code": "FLOW-STATUS-S1","message": "Synthetic flow-status event for architecture testing.","timestamp": "2026-02-10T09:12:45Z"},{"adapter_status": 1,"device_id": "MON-TEST-03","event_code": "CONNECTOR-STATUS-S1","message": "Synthetic connector-status event for architecture testing.","timestamp": "2026-02-10T11:05:33Z"}],Authored highlight: "source": "error_events"}{"data": "Synthetic fixture notes — not customer, patient, or service data.\n\nTECH-01: VENT-TEST-01 prod...",Authored highlight: "source": "technician_notes"}
Stage configuration01-collect-synthetic-fixtures.yaml
input:
  broker:
    inputs:
      # Source 1: Structured maintenance logs (CSV)
      - csv:
          paths:
            [
              '../../../examples/integrations/medical-device-intelligence/maintenance-logs.csv',
            ]
          parse_header_row: true
          batch_count: 1 # one row per message
        processors:
          - mapping: |
              root.source = "maintenance_log"
              root.device_id = this.device_id
              root.timestamp = this.timestamp
              root.data = this

      # Source 2: Device error events (JSON)
      - file:
          paths:
            [
              '../../../examples/integrations/medical-device-intelligence/error-events.json',
            ]
          codec: all-bytes
        processors:
          - mapping: |
              root.source = "error_events"
              root.data = this

      # Source 3: Freeform technician notes (text)
      - file:
          paths:
            [
              '../../../examples/integrations/medical-device-intelligence/technician-notes.txt',
            ]
          codec: all-bytes
        processors:
          - mapping: |
              root.source = "technician_notes"
              root.data = content().string()