IAES Specification v2.0

Complete technical reference for the Industrial Asset Event Standard.

March 2026

1. Purpose

IAES defines how industrial asset signals, diagnoses, and maintenance intents are represented and transferred across heterogeneous operational systems.

IAES is not a product. It is a data contract. Any system — sensor platform, AI engine, CMMS, historian, or dashboard — can produce or consume IAES events without knowing the implementation details of the other side.

2. Principles

  1. Vendor neutrality — No dependency on SAP, PI System, Odoo, or any specific vendor.
  2. Legacy compatibility — Events map cleanly to CMMS, historians, SCADA, and IoT platforms.
  3. Event-oriented — Each object represents something that happened (measurement, diagnosis, intent).
  4. Complete traceability — Every event traces back to its origin via event_id, correlation_id, source_event_id.
  5. Extensibility — The data payload and metadata field allow new fields without breaking consumers.

3. Terminology

Term Definition
EventA single occurrence: a measurement, a diagnosis, a maintenance intent, or a completion report.
ProducerAny system that creates IAES events (sensor platforms, AI engines, manual entry tools).
ConsumerAny system that receives and acts on IAES events (CMMS, dashboards, historians, ERPs).
EnvelopeThe common wrapper that every IAES event shares: spec_version, event_type, event_id, timestamps, asset identity, and the data payload.
CorrelationA shared correlation_id that links related events across the lifecycle (measurement → health → work order → completion).
SourceThe source field identifying the originating system in dot-notation: vendor.system.subsystem.
IntentA maintenance.work_order_intent event that recommends a maintenance action. It is not a work order — the consumer decides whether to create one.
Health IndexA normalized 0.0 – 1.0 score representing the overall health of an asset (1.0 = perfect, 0.0 = failed).
RULRemaining Useful Life. An estimate of how many days an asset can continue operating before failure.

4. Common Envelope

Every IAES event is wrapped in a common envelope. The envelope carries identity, traceability, and routing information. The event-specific payload lives inside the data field.

JSON — Common Envelope
{
  "spec_version": "2.0",
  "event_type": "asset.health",
  "event_id": "uuid",
  "correlation_id": "uuid",
  "source_event_id": "uuid | null",
  "batch_id": "string | null",
  "timestamp": "RFC 3339",
  "source": "vendor.system.subsystem",
  "content_hash": "sha256_16char",
  "asset": {
    "asset_id": "string",
    "asset_name": "string | null",
    "plant": "string | null",
    "area": "string | null"
  },
  "data": {}
}

Field Definitions

Field Type Required Description
spec_version string Yes IAES specification version. This release is "2.0"; each major’s envelope accepts that major’s versions and no others.
dataschema URI No Canonical URI of the schema the data payload was written against, following the CloudEvents attribute of the same name. Derivable from event_type, so both SDKs set it automatically for published types and omit it otherwise. Added in v1.4.
event_type string Yes Dot-notation event type, matching ^[a-z][a-z0-9_]*\.[a-z][a-z0-9_.]*$. Open: a producer MAY define its own in a namespace it controls, and a consumer MUST NOT error on one it does not recognise. The published types are the interoperability defaults, not the limit.
event_id string (UUID v4) Yes Unique identifier for this event. Generated by the producer.
correlation_id string (UUID v4) Yes Shared identifier that links related events in a chain (measurement → health → work order → completion).
source_event_id string | null No The event_id of the event that directly triggered this one. Null for the first event in a chain.
batch_id string | null No Optional identifier for grouping events that were produced together (e.g. a batch of measurements from one collection run).
timestamp string (RFC 3339) Yes When the event occurred. Must include timezone (preferably UTC). Example: 2026-03-08T14:32:00Z.
source string Yes Dot-notation identifier of the producing system: vendor.system.subsystem. Example: wertek.vibration.ai_engine.
content_hash string Yes First 16 characters of the SHA-256 hash of the canonical JSON data payload. Used for deduplication.
asset object Yes Asset identity block. Must contain at least asset_id.
data object Yes Event-specific payload. Structure depends on event_type.

Asset Identity

The asset block identifies the target asset. Only asset_id is required; the remaining fields provide human-readable context and hierarchical location.

JSON — Asset Identity
{
  "asset": {
    "asset_id": "PUMP-001",
    "asset_name": "Main Cooling Water Pump",
    "plant": "Plant A - Monterrey",
    "area": "Cooling Tower Area"
  }
}

5. Event Types

IAES v2.0 defines 7 event types organized into 3 domains: asset signals, maintenance actions, and sensor lifecycle.

asset.measurement v1.0

A single measurement reading from an asset. This is the most fundamental event type — it captures raw sensor data from vibration, temperature, current, pressure, or any other measurable quantity.

Field Type Required Description
measurement_type string Yes Type of measurement (e.g. vibration_velocity, temperature, current_rms, pressure).
value number Yes The measured value.
unit string Yes Unit of measurement (e.g. mm/s, °C, A, bar).
sensor_id string No Identifier of the sensor that took the measurement.
location string No Measurement location on the asset (e.g. bearing_drive_end, motor_frame).
units_qualifier string No Qualifier for the unit value (e.g. rms, peak, peak_to_peak). v1.2
sampling_rate_hz number No Sampling rate in Hz used for the acquisition. v1.2
acquisition_duration_s number No Duration of the acquisition window in seconds. v1.2
JSON — asset.measurement example
{
  "spec_version": "2.0",
  "event_type": "asset.measurement",
  "event_id": "e7f1a2b3-c4d5-4e6f-8a9b-0c1d2e3f4a5b",
  "correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "source_event_id": null,
  "batch_id": null,
  "timestamp": "2026-03-08T14:32:00Z",
  "source": "wertek.vibration.collector",
  "content_hash": "a3f8c1e2b4d6f790",
  "asset": {
    "asset_id": "PUMP-001",
    "asset_name": "Main Cooling Water Pump",
    "plant": "Plant A - Monterrey",
    "area": "Cooling Tower Area"
  },
  "data": {
    "measurement_type": "vibration_velocity",
    "value": 4.2,
    "unit": "mm/s",
    "units_qualifier": "rms",
    "sensor_id": "SENSOR-045",
    "location": "bearing_drive_end",
    "sampling_rate_hz": 25600,
    "acquisition_duration_s": 2.0
  }
}

asset.health v1.0

A health assessment for an asset. Produced by AI engines, rule-based systems, or human experts. Links to the measurement(s) that triggered it via source_event_id and correlation_id.

Field Type Required Description
health_index number Yes Normalized health score from 0.0 (failed) to 1.0 (perfect).
anomaly_score number No Anomaly detection score from 0.0 (normal) to 1.0 (highly anomalous).
severity string Yes One of: info, low, medium, high, critical.
failure_mode string No Detected failure mode from the taxonomy (see Appendix A). Example: bearing_inner_race.
fault_confidence number No Confidence in the failure mode classification, 0.0 to 1.0.
rul_days number No Estimated Remaining Useful Life in days.
recommended_action string No Human-readable recommended action.
estimated_downtime_hours number No Estimated downtime if the recommended action is taken.
iso_13374_status string No ISO 13374 health status level (see Appendix C). v1.2
iso_14224 object No ISO 14224 classification object (see Appendix B). v1.2
condition_trend string No Temporal trend of the condition: worsening, stable, or improving. IAES’s own values; the ISO 13374 attribution was withdrawn in 2.0. Used for incident lifecycle tracking (onset/escalation/recovery). v1.3
JSON — asset.health example
{
  "spec_version": "2.0",
  "event_type": "asset.health",
  "event_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
  "correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "source_event_id": "e7f1a2b3-c4d5-4e6f-8a9b-0c1d2e3f4a5b",
  "batch_id": null,
  "timestamp": "2026-03-08T14:32:05Z",
  "source": "wertek.vibration.ai_engine",
  "content_hash": "f7e6d5c4b3a29180",
  "asset": {
    "asset_id": "PUMP-001",
    "asset_name": "Main Cooling Water Pump",
    "plant": "Plant A - Monterrey",
    "area": "Cooling Tower Area"
  },
  "data": {
    "health_index": 0.16,
    "anomaly_score": 0.92,
    "severity": "critical",
    "failure_mode": "bearing_inner_race",
    "fault_confidence": 0.87,
    "rul_days": 5,
    "recommended_action": "Replace bearing immediately",
    "estimated_downtime_hours": 4,
    "iso_13374_status": "imminent_failure",
    "iso_14224": {
      "mechanism_code": "1.1",
      "mechanism_label": "Mechanical wear",
      "detection_method": "2",
      "detection_label": "Condition monitoring"
    }
  }
}

maintenance.work_order_intent v1.0

A recommendation to create a maintenance work order. This is an intent, not a work order itself. The receiving CMMS decides whether to accept, modify, or reject it. This decoupling is fundamental to IAES — the AI or rule engine recommends, the CMMS decides.

Field Type Required Description
title string Yes Short title for the work order.
description string No Detailed description of the issue and recommended action.
priority string Yes One of: low, medium, high, emergency.
recommended_due_days number No Suggested deadline in days from now.
triggered_by string No What triggered this intent (e.g. ai_diagnosis, threshold_rule, manual).
Severity vs. Priority: severity (in asset.health) describes the condition of the asset. priority (in work_order_intent) describes the urgency of the maintenance action. A high severity issue on a non-critical pump might only warrant a medium priority work order if a backup pump is available.
JSON — maintenance.work_order_intent example
{
  "spec_version": "2.0",
  "event_type": "maintenance.work_order_intent",
  "event_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
  "correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "source_event_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
  "batch_id": null,
  "timestamp": "2026-03-08T14:32:10Z",
  "source": "wertek.vibration.ai_engine",
  "content_hash": "d4e5f6a7b8c9d0e1",
  "asset": {
    "asset_id": "PUMP-001",
    "asset_name": "Main Cooling Water Pump",
    "plant": "Plant A - Monterrey",
    "area": "Cooling Tower Area"
  },
  "data": {
    "title": "Bearing failure predicted",
    "description": "Inner race defect detected by AI diagnosis",
    "priority": "emergency",
    "recommended_due_days": 3,
    "triggered_by": "ai_diagnosis"
  }
}

maintenance.completion v1.1

Reports the completion (or cancellation/deferral) of a maintenance activity. Links back to the original work order via correlation_id and provides outcome data for reliability analytics.

Field Type Required Description
status string Yes One of: completed, partially_completed, cancelled, deferred.
work_order_id string Yes The CMMS work order ID that was executed.
actual_duration_seconds number No Actual time spent on the maintenance activity, in seconds.
technician_id string No Identifier of the technician who performed the work.
checklist_completion_pct number No Percentage of checklist items completed (0–100).
completion_notes string No Free-text notes from the technician.
spare_parts_count number No Number of distinct spare parts used.
failure_confirmed boolean No Whether the predicted failure was confirmed during maintenance.
failure_mode string No Confirmed failure mode (may differ from the predicted one).
iso_14224 object No ISO 14224 classification of the confirmed failure (see Appendix B). v1.2
JSON — maintenance.completion example
{
  "spec_version": "2.0",
  "event_type": "maintenance.completion",
  "event_id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
  "correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "source_event_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
  "batch_id": null,
  "timestamp": "2026-03-09T10:15:00Z",
  "source": "wertek.cmms.work_orders",
  "content_hash": "e5f6a7b8c9d0e1f2",
  "asset": {
    "asset_id": "PUMP-001",
    "asset_name": "Main Cooling Water Pump",
    "plant": "Plant A - Monterrey",
    "area": "Cooling Tower Area"
  },
  "data": {
    "status": "completed",
    "work_order_id": "WO-2026-0042",
    "actual_duration_seconds": 7200,
    "technician_id": "TECH-003",
    "checklist_completion_pct": 100,
    "completion_notes": "Bearing replaced. Post-repair vibration 0.8 mm/s.",
    "spare_parts_count": 1,
    "failure_confirmed": true,
    "failure_mode": "bearing_inner_race"
  }
}

asset.hierarchy v1.1

Declares or updates the hierarchical position of an asset within an organization. Used to synchronize asset trees across systems (CMMS, historians, digital twins).

Field Type Required Description
hierarchy_level string Yes One of: organization, plant, area, equipment.
relationship_type string Yes One of: parent_of, child_of, sibling_of, depends_on.
parent_asset_id string No The asset_id of the parent node in the hierarchy.
asset_type string No Equipment type classification (e.g. motor, pump, compressor).
serial_number string No Manufacturer serial number.
manufacturer string No Equipment manufacturer name.
model string No Equipment model designation.
location string No Physical location description.
is_active boolean No Whether the asset is currently active/in-service.
JSON — asset.hierarchy example
{
  "spec_version": "2.0",
  "event_type": "asset.hierarchy",
  "event_id": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f809a1b",
  "correlation_id": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f809a1b",
  "source_event_id": null,
  "batch_id": null,
  "timestamp": "2026-03-07T09:00:00Z",
  "source": "wertek.cmms.asset_registry",
  "content_hash": "a7b8c9d0e1f2a3b4",
  "asset": {
    "asset_id": "MOTOR-042",
    "asset_name": "Pump Drive Motor 42",
    "plant": "Plant A - Monterrey",
    "area": "Turbine Hall"
  },
  "data": {
    "hierarchy_level": "equipment",
    "relationship_type": "child_of",
    "parent_asset_id": "AREA-TURBINAS",
    "asset_type": "motor",
    "serial_number": "WEG-2024-78432",
    "manufacturer": "WEG",
    "model": "W22 Premium 75HP",
    "is_active": true
  }
}

sensor.registration v1.1

Declares or updates a sensor's lifecycle state. Tracks sensors from discovery through calibration to decommissioning, enabling fleet management and audit trails for measurement provenance.

Field Type Required Description
sensor_id string Yes Unique identifier for the sensor.
registration_status string Yes One of: discovered, registered, calibrated, decommissioned.
sensor_model string No Model name or designation of the sensor.
device_serial string No Hardware serial number of the device.
firmware_version string No Current firmware version running on the sensor.
measurement_capabilities string[] No List of measurement types this sensor can produce.
calibration_date string No Date of last calibration (RFC 3339 date).
communication_protocol string No Communication protocol used (e.g. mqtt, modbus_tcp, opcua).
JSON — sensor.registration example
{
  "spec_version": "2.0",
  "event_type": "sensor.registration",
  "event_id": "a8b9c0d1-e2f3-4a4b-5c6d-7e8f9a0b1c2d",
  "correlation_id": "a8b9c0d1-e2f3-4a4b-5c6d-7e8f9a0b1c2d",
  "source_event_id": null,
  "batch_id": null,
  "timestamp": "2026-03-05T11:20:00Z",
  "source": "wertek.iot.gateway",
  "content_hash": "b8c9d0e1f2a3b4c5",
  "asset": {
    "asset_id": "MOTOR-042",
    "asset_name": "Pump Drive Motor 42",
    "plant": "Plant A - Monterrey",
    "area": "Turbine Hall"
  },
  "data": {
    "sensor_id": "MCSA-T41-001",
    "registration_status": "registered",
    "sensor_model": "Wertek MCSA CT Module",
    "device_serial": "T41-2026-00042",
    "firmware_version": "1.0.3",
    "measurement_capabilities": ["current_waveform", "current_spectrum", "current_rms", "thd"],
    "calibration_date": "2026-03-05",
    "communication_protocol": "mqtt"
  }
}

maintenance.spare_part_usage v1.1

Records the consumption of a spare part during a maintenance activity. Links to the work order via work_order_id and enables inventory tracking, cost analytics, and procurement automation.

Field Type Required Description
work_order_id string Yes The CMMS work order ID this part was used in.
spare_part_id string Yes Internal spare part identifier.
quantity_used number Yes Number of units consumed.
part_number string No Manufacturer part number.
part_name string No Human-readable part name.
unit_cost number No Cost per unit.
currency string No ISO 4217 currency code (e.g. USD, MXN, EUR).
total_cost number No Total cost (unit_cost × quantity_used).
JSON — maintenance.spare_part_usage example
{
  "spec_version": "2.0",
  "event_type": "maintenance.spare_part_usage",
  "event_id": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8091",
  "correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "source_event_id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
  "batch_id": null,
  "timestamp": "2026-03-09T10:15:30Z",
  "source": "wertek.cmms.inventory",
  "content_hash": "f6a7b8c9d0e1f2a3",
  "asset": {
    "asset_id": "PUMP-001",
    "asset_name": "Main Cooling Water Pump",
    "plant": "Plant A - Monterrey",
    "area": "Cooling Tower Area"
  },
  "data": {
    "work_order_id": "WO-2026-0042",
    "spare_part_id": "SP-SKF-6205",
    "quantity_used": 1,
    "part_number": "SKF 6205-2RS",
    "part_name": "Deep groove ball bearing 6205-2RS",
    "unit_cost": 28.50,
    "currency": "USD",
    "total_cost": 28.50
  }
}

6. Severity Standard

IAES defines five severity levels. They describe the condition of the asset, not the urgency of the maintenance response — priority on maintenance.work_order_intent carries that, and the two catalogues share the words low, medium and high while meaning different things by them. Neither may be presented as the other.

Level Meaning
infoInformational, no action needed
lowMinor, schedule for next planned maintenance
mediumModerate, plan intervention within weeks
highSignificant, plan intervention within days
criticalImmediate action required

IAES defines no mapping from health_index to severity. The schema constrains health_index to the range 0–1 and severity to those five values, and leaves the relationship to the producer: a vibration model working from published evaluation zones and an oil-analysis model will divide the range differently, and both conform. A page of this site used to publish one such division as though the specification required it. It did not, and the ranges were a vendor's calibration; they are gone.

7. Idempotency

IAES provides three mechanisms for deduplication and idempotent processing:

  1. event_id — Every event has a globally unique UUID. Consumers must track processed event IDs to avoid reprocessing.
  2. content_hash — A deterministic hash of the data payload. Two events with the same content_hash for the same asset and event type are semantically identical.
  3. correlation_id — Links related events. If a consumer already has a work order for a given correlation_id, it should not create a duplicate.

content_hash Computation

The content_hash is computed as follows:

  1. Serialize the data object as canonical JSON (keys sorted alphabetically, no whitespace).
  2. Compute the SHA-256 hash of the resulting string.
  3. Take the first 16 hexadecimal characters.
Deduplication rule: An event is a duplicate if an existing event shares the same content_hash + asset.asset_id + event_type combination.

8. Producers

IAES events are produced by systems capable of interpreting operational signals — not by the signals themselves.

A PLC, sensor, or gateway knows vibration_rms = 4.6. That is telemetry, not a diagnosis. IAES begins where interpretation begins: an AI model that classifies a bearing fault, a rule engine that triggers on a threshold, or a technician who hears cavitation.

Intelligence layer producers

Source Example source value Typical events
AI diagnosis enginevendor.vibrationasset.health
Rule/threshold engineacme.rule_engineasset.health
Manual inspectionoperator.manual_inspectionasset.health, asset.measurement
Technician assessmentoperator.field_assessmentasset.health
Lab analysislab.oil_analysisasset.measurement
Maintenance applicationvendor.cmmsmaintenance.work_order_intent

Signal sources (upstream of IAES)

Operational systems such as PLCs, SCADA platforms, sensor gateways, and historians typically emit raw signals or measurements. These are converted into IAES events by downstream intelligence layers.

Industrial Signals              IAES Events
(PLC / Sensors / SCADA)         (semantic, interpreted)
      │                               │
      ▼                               ▼
  Telemetry Layer               ┌──────────────┐
  (OPC UA / Modbus / MQTT)      │  CMMS        │
      │                       │  Dashboards   │
      ▼                       │  Historians   │
  Intelligence Layer     ──────>│  Integrations │
  (AI / rules / human)         └──────────────┘

An edge device MAY produce IAES events directly if it has sufficient intelligence (e.g. edge AI, embedded rule engine). But the typical flow is: signals are ingested by an intelligence layer, which then emits IAES events.

The source field is what makes IAES vendor-neutral. A technician with a stethoscope and an AI model both produce the same asset.health event — the consumer doesn't need to know the difference.

9. Producer Guidelines

Required

  1. Generate a unique event_id (UUID v4) for every event.
  2. Set spec_version to "2.0" (or the version you implement).
  3. Compute and include a valid content_hash for every event.
  4. Use RFC 3339 timestamps in UTC with a timezone designator. RFC 3339 is a profile of ISO 8601: ordinal dates, week dates and some offset forms are valid ISO 8601 and are not valid RFC 3339. No schema enforces this in either direction, because format is an annotation in Draft 2020-12.
  5. Include all required fields for the chosen event_type.

Recommended

  1. Set correlation_id = event_id for the first event in a chain; propagate the same correlation_id for subsequent linked events.
  2. Set source_event_id to the event_id of the directly upstream event.
  3. Use the dot-notation format for source: vendor.system.subsystem.
  4. Use failure modes from Appendix A when applicable.
  5. Include ISO 14224 and ISO 13374 fields when the data is available to maximize interoperability.

10. Consumer Guidelines

Required

  1. Validate spec_version and reject events from unsupported versions.
  2. Implement deduplication using event_id or content_hash (see Section 7).
  3. Ignore unknown fields in data without raising errors (forward compatibility).

Recommended

  1. Use correlation_id to group related events for display and analytics.
  2. Map IAES severity to your system's native priority/urgency model.
  3. Store the full IAES event as an audit record, even after mapping to native format.
  4. Implement retry logic with exponential backoff for transient processing failures.
  5. Log rejected or malformed events for troubleshooting.

Severity Mapping Reference

IAES Severity SAP PM MaintainX Odoo General
info Priority 4 None 0 (Normal) Informational
low Priority 3 Low 0 (Normal) Low
medium Priority 2 Medium 1 (Urgent) Medium
high Priority 1 High 2 (Very Urgent) High
critical Priority 1 + Breakdown Critical 3 (Emergency) Critical / Emergency

11. Typical Flow

A typical IAES event chain follows this pattern. All events in the chain share the same correlation_id, and each event references its direct predecessor via source_event_id.

asset.measurement Sensor data collected
→
asset.health AI diagnosis
→
work_order_intent Maintenance recommended
→
completion Work executed
→
spare_part_usage Parts consumed
Correlation Chain
// All events share the same correlation_id
correlation_id: "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// Event chain via source_event_id:
measurement  (event_id: AAA, source_event_id: null)
    ↓
health       (event_id: BBB, source_event_id: AAA)
    ↓
wo_intent    (event_id: CCC, source_event_id: BBB)
    ↓
completion   (event_id: DDD, source_event_id: CCC)
    ↓
spare_part   (event_id: EEE, source_event_id: DDD)

12. Event Type Usage Guide

When to use each event type, who produces it, and who consumes it.

Event Type Typical Producer Typical Consumer Use When Do NOT Use When
asset.measurementSensor gateway, edge device, historian bridgeAI/ML engine, rule engine, data lake, digital twinA sensor reading needs to be shared across systems (vibration, temperature, power factor, THD, current, voltage, pressure)Storing raw waveforms (use a blob store). Logging routine telemetry internally (use your time-series DB directly).
asset.healthAI model, rule engine, expert inspector, SCADA alarm mapperCMMS (work order creation), dashboard (KPIs), alert engine, incident trackerAn actionable condition assessment exists — fault detected, health index calculated, alarm threshold crossed, recovery confirmedRoutine "all clear" polling. Use only when a condition state changes or is actively abnormal.
maintenance.work_order_intentAI engine, alert rule, human operator, planning systemCMMS (SAP PM, Odoo, MaintainX, Fracttal), dispatcher, approval workflowA work order SHOULD be created based on a diagnosis, alert, or scheduleAcknowledging work already in progress (use maintenance.completion).
maintenance.completionCMMS, mobile app, technician handoffAI model (retraining feedback), historian (close loop), dashboardA work order has been completed, cancelled, or deferred — closes the observation-to-action loopPartial status updates mid-execution (not yet supported in v1.3).
asset.hierarchyCMMS, ERP, asset register, BIM systemDigital twin, dashboard, graph databaseAsset tree structure changes — new equipment, relocation, parent/child relationshipsRoutine sync of unchanged hierarchy (use idempotent upsert, not repeated events).
sensor.registrationEdge gateway, IoT platform, device managerAsset register, provisioning system, monitoring dashboardA sensor is discovered, registered, calibrated, or decommissioned for the first time or changes stateEvery reading cycle. Emit once per state change, not per reading.
maintenance.spare_part_usageCMMS, warehouse system, technician appInventory system, cost analytics, procurementSpare parts were consumed during a maintenance actionGeneric inventory movements unrelated to maintenance (use your ERP).

Guidance: asset.measurement and sensor.registration are high-frequency by nature. Consumers building intelligence dashboards SHOULD filter by asset.health and maintenance.* event types for actionable signal. Raw measurements belong in time-series storage, not intelligence layers.

13. System Compatibility

IAES events are designed to map naturally to common industrial systems. The table below shows how IAES concepts map to each platform.

System IAES Mapping Transport
SAP PM Notification (health), Work Order (intent), Confirmation (completion), BOM (spare parts) RFC / OData / IDoc
PI System (OSIsoft) PI Points (measurement values), Event Frames (health), AF Elements (hierarchy) PI Web API / OMF
AVEVA Data Hub Streams (measurements), Assets (hierarchy), Events (health/completion) REST API
Odoo Maintenance Request (intent), Equipment (hierarchy), Product (spare parts) XML-RPC / JSON-RPC
MaintainX Work Order (intent), Parts (spare parts), Asset (hierarchy), Meter Reading (measurement) REST API
Fracttal Work Order (intent), Asset (hierarchy), Variable Reading (measurement) REST API
Grafana Time series (measurements), Annotations (health/intent events) Data source plugin / HTTP API
MQTT Broker Topic per event_type: iaes/{org_id}/{asset_id}/{event_type} MQTT 3.1.1 / 5.0

14. Versioning

Governance, the compatibility policy, and the change process are normative and live in GOVERNANCE.md. This section summarises how versions are numbered; GOVERNANCE.md states what implementers may rely on, which changes are compatible, how long a version is supported, and how a change is proposed.

IAES uses semantic versioning for the specification itself:

  • spec_version in every event envelope identifies which version of the spec was used to produce it.
  • Minor versions (1.1, 1.2) add new optional fields, new event types, or new triggered_by values. They never remove existing fields or change required fields. Consumers built for 1.0 SHOULD accept events from 1.x without error.
  • Major versions (2.0) may introduce breaking changes: removing fields, changing required fields, renaming event types, or changing envelope structure. Consumers MAY reject events from unsupported major versions.
  • Producers MUST set spec_version to the version they implement.
  • Consumers SHOULD accept events where the major version matches, even if the minor version is higher than what they support.

Version history

Version Date Changes
1.0March 2026Initial release. 3 event types, common envelope, JSON Schema.
1.1March 20264 new event types (maintenance.completion, asset.hierarchy, sensor.registration, maintenance.spare_part_usage), batch_id envelope field, failure mode taxonomy (Appendix A).
1.2March 2026ISO alignment: units_qualifier, sampling_rate_hz, acquisition_duration_s on asset.measurement (ISO 17359); iso_13374_status on asset.health (ISO 13374); iso_14224 object on asset.health + maintenance.completion (ISO 14224). All new fields optional — full backward compatibility. Appendix B (ISO 14224 codes), Appendix C (ISO 13374 mapping).
1.3March 2026State transition model: condition_trend field on asset.health (worsening, stable, improving) based on ISO 13374-4 §5.3. Formalized recovery event pattern. State Transition Guidance in Architecture Guide (ISO 13374-4, ISO 17359, ISO 14224, ISO 55000). Recovery event example. All new fields optional — full backward compatibility.
1.4September 2026Governance and compatibility policy become normative (GOVERNANCE.md): stated stewardship, BACKWARD compatibility as the default mode, a 24-month support window, canonical and resolvable $id versioned by URI, and an RFC-based change process. Scope boundaries made explicit: IAES defines no asset hierarchy, no equipment catalog, and no commercial terms. No schema changed in this release. Schema identity corrected under GOVERNANCE.md §5.1: the eight schemas declared $id under https://iaes.wertek.ai/schema/v1/, a host that has never resolved (verified 2026-09-03: no DNS answer). They now declare https://iaes.dev/schema/v1/, which is served. The old base is permanently reserved and will not be reassigned. Schema content is otherwise unchanged. New optional envelope field dataschema: the canonical URI of the schema the payload was written against, following the CloudEvents attribute of the same name. Derivable from event_type, so both SDKs set it automatically for published event types and omit it otherwise. Optional and additive: fully backward compatible. event_type opened: it was a closed enumeration of seven values while this same document ordered consumers to tolerate values they do not recognise — a contradiction that made unknown types impossible to produce. It is now a dot-notation pattern with the published types as examples. Widening, therefore backward compatible: every previously valid value still validates, and the compatibility guard verifies that rather than assuming it.
2.0September 2026First MAJOR release. Two things make it major, and only one can affect a producer's existing output. (1) Timestamps must be RFC 3339, not merely ISO 8601 — a narrowing, since ordinal dates, week dates and some offset forms are valid ISO 8601 and not valid RFC 3339. No schema enforces it in either direction, because format is an annotation in Draft 2020-12, so it will not surface as a validation failure. (2) The eight schemas publish under https://iaes.dev/schema/v2/, and the envelope constrains spec_version to ^2\.[0-9]+$. The eight /schema/v1/ URIs continue to resolve, permanently, to the schemas the 1.x line published: a representation served under a major's URI stays that major's and is never regenerated from a later release. A consumer validates an event against the schemas of the major the event declares, which is how a 2.0 consumer reads a 1.4 event. Wire contract stabilized (rfc/IAES-RFC-002.md): severity is not priority and neither may be presented as the other; the ISO 13374 attributions on iso_13374_status and condition_trend are withdrawn — the values are IAES's own and the field names are kept for compatibility; an absent optional field is not an assertion, so a producer MUST omit rather than substitute and a consumer MUST NOT read absence as a default; measurement_type is open and any published list is advisory. None of those invalidates a 1.4 event: everything schema-valid under 1.4 stays schema-valid, and a 1.4 producer that keeps substituting stays conforming to 1.4 — it simply cannot declare 2.0. Governance became testable (RFC-003 through RFC-007): a criterion for changes to producer and consumer obligations (§4.4), one for changes to the policy itself and the rule that a release takes the maximum level of the changes it carries (§4.5), two classes of conformance with an SDK profile that is claimed and checked rather than granted (§9), and the ratification of everything that had accumulated since 1.4. Migration: declare 2.0, point at /schema/v2/, emit RFC 3339 timestamps, take the 2.0.x packages, and stop substituting values for optional fields the caller did not supply. from_object is the canonical constructor name; from_dict and fromJSON keep working as deprecated aliases.

15. References

What this specification depends on, and how much of that dependency its machine-validity artifact actually checks. Measured from the artifacts on 2026-09-06.

Two questions, and they are independent:

  • Normative for meaning — must the value satisfy this document for the event to conform to IAES? That is decided by this specification.
  • Enforced by the schema — does the schema reject a value that does not? That is decided by JSON Schema and by what the schemas actually declare.

They are not the same question, and where they disagree the disagreement is the defect.

Document Normative for meaning Enforced by the schema
RFC 3339Yes. timestamp MUST be UTC with a timezone designator; calibration_date is a date.No. Declared with format, which Draft 2020-12 treats as an annotation.
RFC 4122Yes for event_id, correlation_id and source_event_id.No. Same reason.
RFC 3986Yes for dataschema, which carries a URI.No. Same reason.
RFC 2119, RFC 8174Yes. How MUST, SHOULD and MAY are to be read here.Not applicable. Not a schema constraint.
ISO 4217Yes. currency is an ISO 4217 code.Partly. ^[A-Z]{3}$ checks the shape, not membership: ZZZ and QQQ pass.
ISO 14224No. Mentioned for the iso_14224 object and Appendix B.No.
ISO 17359No. Mentioned for units_qualifier and the acquisition fields.No.
ISO 13374 seriesNo. Mentioned for iso_13374_status, condition_trend and Appendix C.No.
ISO 55000No. Mentioned as asset management context.No.

An event can be schema-valid and non-conforming

Broken rather than read, against the validator this repository publishes:

timestamp = "banana" accepted event_id = "no-uuid" accepted correlation_id = "12345" accepted dataschema = "esto no es uri" accepted

Each of those satisfies the schema and violates this specification. An implementer can run the official validator, get green, and produce something this document forbids. That gap is the finding, not the accepted values.

Switching JSON Schema's format assertion on does not close it. Measured with the checker enabled, uuid is rejected while date-time and uri are still accepted, because their checkers live in optional packages — so whether an event is valid would depend on which packages the reader happens to have installed, and two conforming readers would disagree about the same bytes.

Why this is not simply fixed

The schemas already assert event_type, source, spec_version and currency with pattern, which every validator applies, while merely annotating the six identifier and date fields. No document says why the two groups are treated differently.

Adding a pattern to close the gap is not available inside 1.x: GOVERNANCE.md §4.2 lists adding a pattern where none existed as a narrowing change, therefore MAJOR, and the compatibility guard implements that. Values that validate today would stop validating.

So this is a decision with real consequences and it belongs in a memo, not in a references table. This section records the measurement the memo will need.

Three of these documents were unnamed until 2026-09-06. The schemas have always used uuid, uri, date-time and date, so the specification has always meant to depend on the documents that define them; it named none of them, and named ISO 8601, which JSON Schema does not use and which the editor does not hold. An implementer could satisfy the schema and had nowhere to read why.

The ISO 13374 entries say series rather than a part on purpose. The unqualified citations cover at least two different subjects — health status levels and a six-block processing model — which cannot both be the same part, and the editor holds only ISO 13374-4. A citation that does not identify a document cannot be checked. rfc/IAES-RFC-002.md withdrew the ISO 13374 attributions in 2.0; the field names are retained for compatibility with 1.x, and the values are declared as IAES's own.

Appendix A: Failure Mode Taxonomy

Standardized failure mode values for the failure_mode field in asset.health and maintenance.completion events. Organized by equipment domain.

Rotating Equipment

Value Description
bearing_inner_raceInner race defect on rolling element bearing
bearing_outer_raceOuter race defect on rolling element bearing
bearing_ball_spinBall spin / rolling element defect
bearing_cageCage / retainer defect
bearing_lubricationInadequate or degraded lubrication
misalignment_angularAngular misalignment between coupled shafts
misalignment_parallelParallel (offset) misalignment
unbalanceMass unbalance on rotating component
looseness_mechanicalMechanical looseness (base, bolts, foundation)
looseness_structuralStructural looseness or resonance
gear_wearGear tooth wear or pitting
gear_broken_toothBroken or chipped gear tooth
belt_wearBelt wear, cracking, or glazing
belt_misalignmentBelt/pulley misalignment
cavitationCavitation in pumps or hydraulic systems
shaft_crackShaft crack or fatigue
resonanceStructural or natural frequency resonance

Electrical

Value Description
stator_windingStator winding insulation degradation or short
rotor_barBroken rotor bar(s) in induction motor
eccentricity_staticStatic air gap eccentricity
eccentricity_dynamicDynamic air gap eccentricity
phase_unbalanceVoltage or current phase unbalance
harmonic_distortionExcessive harmonic distortion (THD)
insulation_degradationGeneral insulation resistance degradation
vfd_faultVariable frequency drive fault or malfunction

Fluid & Thermal

Value Description
overheatingAbnormal temperature rise beyond operating limits
thermal_gradientAbnormal temperature differential across component
leak_externalExternal fluid/gas leak
leak_internalInternal seal or valve leak
blockageFlow restriction or blockage in piping/filter
corrosionInternal or external corrosion
erosionMaterial erosion from fluid flow
foulingSurface fouling or deposit buildup

Appendix B: ISO 14224 Codes

The iso_14224 object provides optional failure coding based on ISO 14224:2016 classification (Petroleum, petrochemical and natural gas industries — Collection and exchange of reliability and maintenance data). This object can appear in asset.health and maintenance.completion events.

iso_14224 Object Structure

JSON — iso_14224 object
{
  "iso_14224": {
    "mechanism_code": "string",
    "mechanism_label": "string",
    "cause_code": "string | null",
    "cause_label": "string | null",
    "detection_method": "string | null",
    "detection_label": "string | null"
  }
}

Failure Mechanism Codes

Code Mechanism
1.1Mechanical wear
1.2Fatigue
1.3Corrosion
1.4Erosion
1.5Deformation
1.6Fracture
1.7Material degradation
2.1Electrical short circuit
2.2Open circuit
2.3Insulation breakdown
2.4Earth / ground fault
3.1Blockage / plugged
3.2Leakage
3.3Vibration
3.4Overheating
9.0Other / unknown

Failure Cause Codes

Code Cause
ADesign-related
BFabrication / manufacturing
CInstallation / commissioning
DOperation / maintenance
EManagement / organizational
FMiscellaneous / other

Detection Method Codes

Code Detection Method
1Periodic maintenance
2Condition monitoring
3Corrective maintenance
4Inspection / testing
5Production interference
6Casual observation
7Demand / operational test
9Other / unknown

Appendix C: ISO 13374 Mapping

ISO 13374 (Condition monitoring and diagnostics of machines) defines a 6-block processing model for condition monitoring. IAES maps naturally to this standard. The iso_13374_status field in asset.health events provides explicit alignment.

iso_13374_status Levels

iso_13374_status Description Nearest IAES Severity
normal Operating within acceptable parameters info
satisfactory Minor deviations, within limits low
unsatisfactory Outside normal limits, monitoring required medium
unacceptable Exceeds limits, corrective action needed high
imminent_failure Failure expected imminently critical
failed Equipment has failed critical

Usage Example

JSON — Combined severity + ISO 13374 + ISO 14224
{
  "event_type": "asset.health",
  "data": {
    "health_index": 0.16,
    "severity": "critical",
    "failure_mode": "bearing_inner_race",
    "iso_13374_status": "imminent_failure",
    "iso_14224": {
      "mechanism_code": "1.1",
      "mechanism_label": "Mechanical wear",
      "cause_code": "D",
      "cause_label": "Operation / maintenance",
      "detection_method": "2",
      "detection_label": "Condition monitoring"
    }
  }
}

ISO 13374 Processing Model → IAES Events

ISO 13374 Block Function IAES Event
Block 1: Data Acquisition Sensor data collection sensor.registration
Block 2: Data Manipulation Signal processing, filtering asset.measurement
Block 3: State Detection Threshold comparison, anomaly detection asset.health (health_index, anomaly_score)
Block 4: Health Assessment Diagnosis, severity, failure mode asset.health (severity, failure_mode, rul_days)
Block 5: Prognostics RUL estimation, trend prediction asset.health (rul_days, recommended_action)
Block 6: Advisory Generation Recommended actions, work orders maintenance.work_order_intent

Version History

Version Date Changes
v1.0 January 2026 Initial release. 3 event types: asset.measurement, asset.health, maintenance.work_order_intent. Common envelope, severity levels, idempotency, producer/consumer guidelines.
v1.1 February 2026 Added 4 event types: maintenance.completion, asset.hierarchy, sensor.registration, maintenance.spare_part_usage. Added batch_id to envelope. Failure Mode Taxonomy (Appendix A).
v1.2 March 2026 Standards vocabulary: units_qualifier, sampling_rate_hz, acquisition_duration_s (ISO 17359) on measurements. iso_13374_status (ISO 13374) on health. iso_14224 object (ISO 14224) on health and completion. All new fields optional — fully backward compatible. Added Appendix B (ISO 14224 codes) and Appendix C (ISO 13374 mapping).
v1.3 March 2026 State transition intelligence: condition_trend field on asset.health (worsening/stable/improving) per ISO 13374-4 §5.3. Recovery event pattern (onset → escalation → recovery via shared correlation_id). Envelope spec_version changed from enum to pattern (^1\.[0-9]+$) for future-proof minor versions. New example: recovery-event.json. All new fields optional — fully backward compatible.

License

IAES is an open specification licensed under CC BY 4.0. Implementations may be proprietary.

IAES v2.0 — September 2026 Created by the Wertek AI team. Implementations are listed in README.md. None of them is privileged: conformance is measured on the wire, not against any one of them.