Skip to content

Engineering2025-11-18

The integration nobody documented

Every legacy platform has interfaces that appear in no diagram and no register. Here is how we find them before cutover finds them for us — and why the interface diagram is the last place to look.

Author
Halvard Bruun
Published
18 NOV 2025
Read
4 MIN
Ref
E92B5B

Nordvik Bank's interface register listed nineteen integrations. We found twenty-three. The four extras had been running since 2011, two of them carried genuine customer impact, and one was a file that a finance analyst's machine collected over SFTP every Tuesday at 06:40 and pasted into a regulatory return.

None of this is unusual. It is the default condition of any platform older than its documentation process. The register records the integrations that went through governance; the estate contains the integrations that got built.

Look at behaviour, not at diagrams

Discovery has to be evidence-led, because the artefacts you would naturally trust are exactly the ones that omit the problem. We run five parallel sweeps, and each finds a class the others miss.

SweepWhat it findsWhat it misses
Database session and object accessLive readers and writers, including humans with sqlplusAnything dormant during the window
Firewall and load-balancer rulesPermitted paths, including long-dead onesTraffic inside the same subnet
Scheduler and cron inventoryBatch producers and consumers, file dropsAd-hoc and manually triggered jobs
Egress and DNS logsOutbound calls to third partiesInbound pulls from other teams
Credential and grant auditService accounts that exist for a reasonShared accounts used by several systems

Note the recurring gap: everything time-boxed misses whatever did not run during the box. That is why the sweep has to cover a full business cycle. Quarter-end and year-end jobs are precisely the ones that are undocumented, high-impact, and invisible in a two-week discovery.

Start with who touches the data

The cheapest high-yield query is against the database itself. On Oracle, sampled session history tells you which programs, hosts and users actually touched the schema you are about to move.

-- Real consumers of the POLICY schema, by evidence rather than by register.
-- Caution: AWR retention defaults to 8 days. Snapshot this to a permanent
-- table nightly for a full quarter before you trust the absence of a caller.
select
    s.program,
    s.module,
    s.machine,
    s.user_id,
    count(*)                as samples,
    count(distinct trunc(s.sample_time)) as active_days,
    min(s.sample_time)      as first_seen,
    max(s.sample_time)      as last_seen
from   dba_hist_active_sess_history s
join   dba_objects o
       on o.object_id = s.current_obj#
where  o.owner = 'POLICY'
and    s.sample_time > sysdate - 90
group  by s.program, s.module, s.machine, s.user_id
order  by samples desc;

Two columns do the work. machine names hosts that no architecture diagram mentions, which is how we found a reporting box under someone's desk in a regional office. active_days separates a genuine daily integration from a one-off investigation, so you are not chasing a DBA who ran a count last March.

Classify before you panic

Not every undocumented interface deserves remediation. We sort them into four buckets, and the ratio at Nordvik was roughly 40 / 30 / 20 / 10.

  • Retire. Nobody consumes the output. Prove it by switching it off in a controlled window and waiting a full business cycle. Silence is the evidence.
  • Replace. Real dependency, poor mechanism. The Tuesday SFTP file became a read-only API with the same fields and the same schedule, because changing the consumer's habit was out of scope and did not need to be in it.
  • Reproduce. Real dependency, acceptable mechanism, no owner willing to change. Recreate it exactly on the target, byte-identical output included, and log it as debt with a review date.
  • Escalate. Real dependency, real risk, no owner at all. These need a name against them before cutover, and finding that name is a management task, not an engineering one.

The manoeuvre that catches the rest

Sweeps will not find everything, so the last step is deliberate: run the legacy system and the target side by side, then start darkening the legacy interfaces one at a time on a published schedule, keeping each one restorable within minutes.

Announce it. Broadly. The most reliable discovery instrument ever built is a colleague noticing their report is empty, and it is far better for that to happen on a Tuesday morning in a controlled window than at 03:00 on cutover night, when the person who knows why the file matters is asleep and the rollback decision belongs to someone who has never heard of it.

We budget eleven weeks for interface discovery and darkening on a platform of this age. It has never once been wasted time, and on two programmes it was the difference between a cutover and a rollback.

Written by

Halvard Bruun

Contributor

Share

Related notes

All notes
  • 01Engineering

    Reading a COBOL codebase you did not write

    The programs are the last thing to read. Start with the job control and the copybooks, because that is where forty years of business rules were actually written down.

    Legacy5 MIN
  • 02Reliability

    Cutover rehearsals, and why we do six

    A 412-step runbook took 19 hours on its first rehearsal against a 9-hour window. By the sixth it took 6 hours 40. The rehearsals were not practice — each one was designed to fail differently.

    Cutover5 MIN
  • 03Engineering

    What a mainframe migration actually costs

    The build is about a third of it. Here is the real shape of a nine-month core banking migration budget, line by line, including the three lines nobody quotes for.

    Migration · Mainframe5 MIN