6 min read

Moving an interface estate from Cloverleaf to InterSystems IRIS for Health

An engine migration is judged by one question: did every message come out the same? A checklist for proving message fidelity before cutover.

Engine migrations get planned like software upgrades and fail like data migrations. The new engine works. The interfaces mostly work. Then a lab result arrives with a different escape sequence, or an ADT feed that used to be filtered starts flooding a downstream system, and the go-live turns into a week of patching.

I have moved an HL7 interface estate from Cloverleaf to InterSystems IRIS for Health with full message-fidelity validation, and worked across Cloverleaf, Corepoint, Mirth Connect, Rhapsody and OpenLink environments. The engines differ. The discipline that makes a migration boring does not.

Inventory what the old engine really does

The interface list is never the full list. Years of production leave behavior in places nobody documents: a TCL proc that rewrites a field for one receiving system, a filter added during an incident, an acknowledgment timeout tuned by hand.

  • Export every thread, route and transformation, and walk each one: inbound connection, filters, transformations, outbound connections, acknowledgment handling, retries and errors.
  • Write the implicit rules down as explicit ones: which messages are dropped on purpose, which fields are defaulted, which segments are reordered.
  • Note what the receiving systems depend on that is in no specification, such as field lengths, delimiters, and the order repeating segments arrive in.

Rebuild for the new engine, not a line-by-line port

IRIS for Health has its own model: business services, processes and operations, with DTL transformations and routing rules. Porting Cloverleaf logic one for one produces something that runs, but that nobody on the new team can maintain.

  • Keep one transformation per real difference between systems, and share the common normalization.
  • Move the rules that were hidden in code into routing rules and lookup tables that analysts can read.

Prove fidelity message by message

The acceptance test for an engine migration is simple to state: for the same input, the new engine must send the same output, or a deliberate and documented difference. The most reliable way to test it is to run both engines on the same traffic.

  • Capture a representative set of real messages for every interface and trigger event, including the odd ones: long notes, repeating OBX groups, escaped characters, fields that are empty but present.
  • Send the same inputs through the old and new paths and compare the outbound messages field by field, not by eye.
  • Classify every difference as a defect or an accepted change, and have the receiving system's owner sign off on the accepted ones.
  • Test acknowledgments and error paths too. A migration that only tests the happy path moves its failures into production.

Cut over one interface family at a time

Parallel running is the safety net. Move a family of interfaces together, such as every outbound result feed to one system, watch message counts and queue depths on both sides, and keep the old route ready to take traffic back until the counts have matched long enough to trust.

An engine migration is done when every interface has a fidelity report, not when the new engine is running.

Investors and consultants can book an hour through Office Hours. Teams with an interface to get right can pick a time directly.