Lima Backbone Exceptions

Every row that fails a rule gets an owner and a deadline.

Incoming data is split into valid rows and exception rows. Valid rows continue to the load. Each exception row is kept with its full context, sent to the person who owns that kind of problem, and put back into the pipeline once it is fixed.

OTIF NIGHTLY RUN · SHOWCASE ESTATE · 841K ROWS IN 4M 12SIncoming rows841KSAP + WMS, joined841K rows inRules on every rowhard rule: rejectedsoft rule: flaggedand continuesValid rows840,782continue to the loadCertified viewv_otif_daily5 golden tests · lineageException rows218every field kept, with the ruleRouted to ownersSC Ops ManagerData Steward · MDM teamFixedat the source orin the pipelineREPLAY AFTER THE FIX · THE ROW RE-ENTERS THE PIPELINE AT THE STEP IT LEFT, PASSES THE RULE AND LOADS
The OTIF nightly run on the showcase estate: 841K rows in, 840,782 valid rows to the certified view, 218 exception rows to their owners, in 4m 12s. Both sides keep lineage, and the two counts add up to the incoming total.
3.4 h → seconds
routing time, from email lists to rules
showcase estate
1,248
open exceptions: 18 High, 841 Medium, 389 Low
showcase estate
218
exceptions from 841K rows in 4m 12s
showcase estate · OTIF nightly
180 ms
for a three-rule chain, end to end
showcase estate
0
manual triage
showcase estate
What it does

What an exception is

A row that fails a rule becomes an exception record. The record is kept, given an owner, and replayed once the row is fixed.

An exception is a row that fails a rule. A rule is a condition every row is checked against, such as a quantity of zero or more, or a plant code that exists in the plant table. Incoming data is therefore two sets: the valid rows, which passed every rule, and the exception rows, which failed one. Both sets are stored with lineage, the record of which tables each row was built from.

An exception record keeps everything the owner needs to fix it. The five items below are stored with every exception, whether the row came from SAP, from Oracle, from the warehouse system or from a file.

Every field of the rowThe original row as it arrived, with every column, so the owner sees exactly what the source sent.
The rule it failedThe rule’s name, the condition, and the value that failed it.
The run it came fromThe pipeline, the run and the step, so the row can be replayed from that step.
The source systemSAP, Oracle, the warehouse system or a file, with the table and the key.
Its lineageThe tables the row was built from, captured as the pipeline ran.
Two kinds of rule

Hard rules and soft rules

A rule is hard or soft. The kind decides whether a failing row is rejected or flagged.

Kind of ruleWhat happens to a row that fails itWhere the row goesExamples
Hard ruleThe row is rejected from the load and becomes an exception record.The exception table, with the full row, the rule and the run. The valid rows load as usual.A negative quantity. A plant code that is missing from the plant table. A delivery date before the order date.
Soft ruleThe row is flagged and continues to the load. An exception record is created for the owner.The target, with a flag on the row, plus the exception table.A phone number in a format other than the international standard. A description with trailing spaces.
Passes every ruleThe row is valid.The target and the certified view, counted in the control totals.840,782 of the 841K rows in the OTIF nightly run.

Choose a hard rule when a wrong value would make the result wrong, such as a negative quantity in a delivery measure. Choose a soft rule when the row is usable and the owner should see the problem, such as a phone number in a non-standard format. Each validation operator on the canvas can be set either way. The validation operators →

Routing

How an exception is routed, step by step

Six steps take a row from the rule that failed it to the owner who fixes it and back into the pipeline.

The rule assigns a type and a severityEach rule names the type of exception it raises, such as an OTIF breach or a duplicate customer, and a severity: High, Medium or Low.
The routing table names the ownerOne row of the table maps each type and severity to a person or a queue. The OTIF breach at High goes to the SC Ops Manager; the duplicate customer goes to the MDM team.
The owner is notified with the row and its contextThe message carries the row, the rule, the run and the lineage, with a link to the exception hub. It goes by email, Slack or Teams, as the owner prefers.
Two clocks startAn acknowledge-by time and a resolve-by time, both from the routing table. The escalation section below shows what happens when either passes.
The fix is madeAt the source, such as a corrected plant code in SAP or Oracle, or in the pipeline, such as a transform that standardises the format.
The row is replayedThe fixed row re-enters the pipeline at the step it left, passes the rule and loads. The exception closes with a link to the loaded row.

Routing is a table. Each row maps one exception type and one severity to an owner, an acknowledge-by time and a resolve-by time. On the showcase estate the table has six rows, shown below.

Before the table, exceptions on the showcase estate went to email distribution lists and took 3.4 hours on average to reach a person who could act. With the table, each exception reaches its owner in seconds, and manual triage is 0.

The table is configuration. The business owner of each exception type maintains their row, and changes are promoted from development to staging to production through the same approval gates as any other change. SC stands for supply chain; MDM stands for master data management, the team that keeps customer and material records consistent.

The routing table on the showcase estate

Exception typeSeverityRouted toAcknowledge byResolve by
OTIF breachHighSC Ops Manager4 h24 h
OTIF breachMediumSC Analyst queue8 h48 h
Stock-out riskHighProcurement and Supply Chain1 h8 h
Country-code errorMediumData Steward24 h72 h
Duplicate customerMediumMDM team72 h7 d
Price varianceLowFinance24 h5 d
Escalation

Escalation

One exception on the showcase estate, EXC-0001, from the moment it was raised to the executive alert.

10:18
EXC-0001 is raisedAn OTIF breach for a key account, severity High. The routing table assigns it to the SC Ops Manager: acknowledge within 4 hours, resolve within 24 hours. Both clocks start.
10:28
Email to the ownerThe exception reaches the owner by email with the row, the rule that failed, the lineage and a link to the exception hub.
12:18
Slack reminder, still unacknowledgedTwo hours in, the owner has yet to acknowledge. A reminder lands in Slack and the clock keeps counting.
14:18
The 4-hour limit passes; escalated to the SC DirectorThe exception moves one level up the reporting line with the same row, the same context and the time already spent visible.
+24 h
The 24-hour deadline; CPO alertIf the resolve-by time passes, the CPO (chief procurement officer) is alerted. Every move is recorded against the same exception id.

An unanswered exception moves up the reporting line at each missed clock. The acknowledge-by time and the resolve-by time come from the routing table; when either passes, the exception goes to the next person up with its full context and the time already spent.

The reminders use the channels people already watch. A quality anomaly reaches Slack #data-ops 340 ms after a rule fails; a projected miss of a deadline pages PagerDuty; a change in certification status opens a ServiceNow record; a resolved anomaly is announced in Slack.

Each level is a named person or queue, up to the executive at the top of that reporting line, so every open exception has an owner at every moment.

Rule chains

Rules that build on each other

A rule can pass its result to the next rule. The last rule in the chain can raise the exception and prepare the fix.

RULE-021days of supply below the limitRULE-022no purchase order covers itRULE-023High exception to the buyerPO-DRAFT-9901draft order, buyer approvesthree rules in the rules engine · 180 ms end to end · the draft waits for the buyer · showcase estate
Three rules on the showcase estate. Each rule passes its result to the next, so the exception that reaches the buyer is the conclusion of all three: the material is short, there is no cover on order, and a draft order is ready to approve.
RULE-021 · days of supply below the limitA material’s projected days of supply, the number of days the stock on hand will last, falls below the limit set for it. The rule passes the material on to the next rule.
RULE-022 · open purchase order checkThe rule looks for an open purchase order that covers the gap. It finds that none does, so the chain continues. A covering order would have ended the chain here.
RULE-023 · High exception and a draft purchase orderThe rule raises a High exception to the buyer and creates a draft purchase order, PO-DRAFT-9901, in the ERP that owns purchasing. An ERP is the system that holds orders, stock, materials and finance. The buyer approves or rejects the draft. The chain takes 180 ms end to end.

A rule can pass its result to another rule. The second rule then adds a check the first one lacked, and the exception that reaches the owner carries the conclusion of the whole chain.

The draft order is created in whichever ERP owns purchasing, through that system’s released interface: BAPI transactions on SAP, open interface tables and public APIs on Oracle. A BAPI is a function SAP publishes for reading or writing one business object. Every write carries a unique key, so a retry cannot create a duplicate, and the ERP’s confirmation is captured. How write-back works →

Rules run in batch on the run window, such as the OTIF rule every night, or on a single row as it lands, such as the stock-out chain above.

Quality gates

When a whole batch is the problem: quality gates

A rule applied to a whole batch holds the batch and pauses the pipeline until the batch is fixed.

Some problems belong to a whole batch. On the showcase estate, a certification rule required the customer phone field, KNA1.TELF1 in SAP, to be in the international E.164 format: a plus sign, the country code and the number, with no spaces. Only 38% of the rows passed. Routing the other 62% of a customer table to a steward one row at a time would help nobody, so the rule works as a quality gate: it holds the batch and the pipeline pauses at its checkpoint. How a paused pipeline resumes →

The gate shows the steward three ways to fix the batch, each with its estimated coverage after the fix. The steward picks one on the canvas, the batch is replayed, and the certification proceeds. All three are showcase examples.

Normalise at ingest

A transform at ingest puts each number into the E.164 format, using the customer’s country code in KNA1.LAND1 to add the dialling prefix. Estimated coverage after the fix: 94%. This is a suggested fix with its estimated coverage.

Enrich from Oracle

Missing or invalid numbers are filled from the Oracle table AR_CONTACTS, which holds 71% of the missing numbers. Estimated coverage after the fix: about 87%.

Exclude the field from scope

TELF1 is taken out of the certified scope. The view certifies on the fields that pass, and the phone numbers stay in the source table as they are.

Fixing the cause

Fix the cause once

One fix at the source or at ingest corrects every open record that failed on the same field.

Most exceptions share a cause. When the same field is fixed at the source, or by one transform at ingest, all 1,248 open records that failed on it are corrected at the next run. The steward fixes the field once, and the replay picks up every affected row.

Corrected master data that belongs in the source goes back through write-back. On the showcase estate a country-code standardisation was written back to Oracle ERP, confirmed by the ERP and reconciled at the end of the run.

Each rule tracks its hit rate, so you can see a problem shrinking. RULE-018 on the showcase estate has 11.8M evaluations, 0.036% exceptions and a trend of −22%. The table on the right lists the batch rule runs on the showcase estate with the rows each one evaluated.

Batch rule runs on the showcase estate

Batch rule runRows evaluatedResultTime
OTIF nightly841K218 exceptions4m 12s
Duplicate customer weekly482K96 pairs—
Retention monthly22.4M441 flagged—
Price variance daily48K12 exceptions—
Replay

Replay after the fix

A fixed row finishes the run it started, and the exception closes with a link to the loaded row.

Replay puts a fixed row where it was going. The row re-enters the pipeline at the step it left, passes the rule, loads, and the exception closes with a link to the loaded row. A full reload of the batch is therefore rare.

Replay works the same way for a single row fixed by its owner and for a whole batch fixed at a quality gate. In both cases the control totals show the valid count rising and the exception count falling, with the two still adding up to the incoming total.

The fixed row re-enters the pipelineIt enters at the step it left, which the exception record names, so the steps before it are left alone.
It passes the ruleThe row runs through the same rules as every other row. A row that fails again becomes a new exception with the same id and the history of the first.
It loadsThe row lands in the target with the same lineage as the rows that passed the first time. The control totals update: valid rows up, exception rows down, incoming rows unchanged.
The exception closesThe exception record closes with a link from the exception to the loaded row. A certified view that went back to draft is certified again when its golden tests pass on the replayed data.
Where this sits

Step four of the six.

Step six sends results back to the system they came from, and that system confirms each write.
Any source.Any target.Any pattern.Any volume.Priced by capacity.HOW THE ENGINE SCALES → /platform/backbone/scale
Terms on this page

Plain meanings.

Exception recordA row that failed a rule, kept with every field of the original row, the rule it failed, the run it came from, its source system and its lineage. It has an owner and two clocks.
Hard ruleA rule whose failing rows are rejected from the load and kept as exception records.
Soft ruleA rule whose failing rows are flagged and continue to the load, with an exception record for the owner.
Quality gateA rule applied to a whole batch. When the batch fails, the gate holds the batch and the pipeline pauses at its checkpoint until the batch is fixed.
Routing tableThe table that maps each exception type and severity to an owner, an acknowledge-by time and a resolve-by time.
EscalationMoving an exception one level up the reporting line when an acknowledge-by or resolve-by time passes, with its full context and the time already spent.
ReplayRunning a fixed row through the pipeline again from the step it left, so that it passes the rule and loads, and the exception closes.
E.164The international format for phone numbers: a plus sign, the country code and the number, with no spaces.
LineageThe record of which tables each row or table was built from, captured as the pipeline runs.
Questions

Asked before the first rule.

Does a rejected row ever get deleted?

A rejected row is kept as an exception record with every field of the original row, the rule it failed, the run it came from and its source system. It stays until it is fixed and replayed, and the closed exception keeps a link to the loaded row. The valid count and the exception count always add up to the incoming count.

Who decides the owners?

The business owner of each exception type, through the routing table. Each row of the table maps an exception type and a severity to a person or a queue, an acknowledge-by time and a resolve-by time. The table is version-controlled and promoted from development to staging to production through approval gates, like any other change.

What if the owner is on leave?

The clocks keep running and the escalation path takes over. When the acknowledge-by time passes, the exception moves one level up the reporting line with its full context, as EXC-0001 did at 14:18. For types where several people can act, the routing table names a queue as the owner, such as the SC Analyst queue for a Medium OTIF breach.

Can a rule create something in SAP or Oracle?

Yes, as a draft for a person to approve. RULE-023 on the showcase estate creates a draft purchase order in the ERP that owns purchasing, through that system’s released interface: BAPI transactions on SAP, open interface tables and public APIs on Oracle. The buyer approves the draft. Every write carries a unique key, is confirmed by the ERP and is reconciled at the end of the run.

How do we see whether a problem is getting better?

Each rule tracks its hit rate: the number of evaluations, the share that raised an exception, and the trend. RULE-018 on the showcase estate has 11.8M evaluations, 0.036% exceptions and a trend of −22%. The exception hub shows the open count by severity, 18 High, 841 Medium and 389 Low on the showcase estate, and each batch run lists the rows it evaluated and the exceptions it raised.

See exceptions routed on your data.

One source, one rule set, one routing table: exceptions with owners, clocks and a replay path on your own data, then the four-week first load with control totals at the end.