Home › Use Cases › Triage one MRP exception message to the cause behind it and the planner queue that owns it
Use caseUC0281
🧪 Use-case kit · runnable

Triage one MRP exception message to the cause behind it and the planner queue that owns it

A small, forkable project that does one job end to end. Run once for real, and every figure on these pages captured from that run.

The business caseThe problem this solves

A nightly MRP run writes an exception message for every requirement its cover does not line up with. A plant of any size gets hundreds, and a planner works them one at a time before touching anything, answering two questions per message: what actually caused this, and whose problem is it. The message text does not say. RESCHEDULE IN is written whenever the cover is late, and four of the eight causes in MEX-2026 produce that same line. The first pass down the exception list — reading each message's pegged demand, covering supply, stock movements and history to decide the cause and the owner. It replaces nothing after that: the planner still works the order.

Audience

A production planner or buyer working a plant's morning exception list, and the item master owner who never sees the messages that are really theirs. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual MRP exception message

The corpus is 64 MRP exception message, 0.11 MB (txt 64). It is generated so the answer key can be DERIVED from each message's construction rather than written, and so the properties the comparison depends on can be asserted rather than hoped for. Three of them are: exactly one cause per message, a slip strictly outside the item's tolerance on every message whose cause is not within_tolerance, and a parameter fault that no single numeric field separates.

The corpus

  • The 64 MRP exception messagegenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromdata/SOURCES.md carries the provenance, the licence pointer, the personal-data check (0 hits) and a section attacking the corpus on its own author's behalf — including three accidental separators that were found and REMOVED before a single call was bought.

Swap this folder for your own material and the kit is pointed at your MRP exception message. That is the whole change — there is no database to migrate.

One MRP exception message, as the model receives itMEX-0001.txt · 1 of 64
MRP EXCEPTION MESSAGE                                            MEX-0001
Generated 2026-09-01 by planning run RUN-2026-09-01 under MEX-2026 | plant PL-07

MESSAGE
  Message id                   MEX-0001
  Message text                 EXPEDITE - requirement inside the planned lead time
  Item                         PCB-52140
  Item description             controller board
  Plant                        PL-07
  Requirement date             2026-10-12
  Coverage date                2026-11-06
  Requirement quantity         280 EA

PLANNING PARAMETERS
  Procurement type             externally procured
  Lot size rule                minimum 100 EA, multiple of 70
  Planned delivery time        16 days
  Safety stock                 20 EA
  Exception tolerance          5 days
  Last parameter change        2026-04-24
  Engineering change           none open

PEGGED DEMAND
  requirement   date         qty       source
  SO-84198-50   2026-10-12   280 EA    sales order line, unchanged since 2026-08-16

COVERING SUPPLY
  element       date         qty       status
  PO-442866     2026-11-06   280 EA    purchase order, supplier confirmed 2026-11-06

RECENT STOCK MOVEMENTS
  none recorded against this item since the previous run

MESSAGE HISTORY
  run             message                                    against      order
  RUN-2026-08-29  EXPEDITE                                   PO-442866    order quantity changed 2026-08-29
  RUN-2026-08-30  EXPEDITE                                   PO-442866    requirement date moved 2026-08-30
  RUN-2026-08-31  EXPEDITE                                   PO-442866    covering order replanned 2026-08-31

PLANNER NOTES
  The item sits in the plant's normal review cycle and was not flagged by anybody before the run.

Abridged — the file continues.

The outcomeWhat a good result looks like

Per message: the days between the requirement and its cover, one of eight causes, one of five queues, and the line that establishes the cause quoted verbatim. Measured on this corpus, the free rules floor answers all four correctly on 55 of 64 messages and the paid call on 45 — so the honest outcome of this kit is that the call does not pay for itself here.

And when it cannot

The failure that reaches production is a real message CLOSED with nobody looking at it. It happened 0 times out of 64 on the paid call, 0 on the free rules floor and 0 of 24 under the adversarial arm. The failure that wastes a morning is a parameter fault routed to a planner: 6 of 64 on the paid call after the recheck, 4 of 64 on the free floor.

Where it fitsWhat did work

Every line below is a measured result from this kit's own runs, with the figure that supports it. The headline above is not softened by any of them.

  • A plant whose exception messages are a fixed-layout export and whose causes are printed in the panels — the free rules floor
    measured here: 55 of 64 against 45, for $0.00 and no network.
  • Messages that carry standing bulletins, supplier assertions or planner prose that quotes the rulebook — the paid call
    the floor answered all three bulletins wrongly and the call answered all three correctly. That is where the money bought something on this corpus.
  • Anything where a message being CLOSED with nobody on it is the expensive error — either arm, with the recheck bolted on
    closed_where_action_needed is 0 on every arm here, clean and under attack — but the recheck is what returns 8 of the 20 messages the adversarial sentence pushed onto a working queue.

At a glanceHow the whole thing runs

70%message all correct
99,853 msp50, end to end
$50.82per 1,000 MRP exception message · Gemini 3 Flash

Run once, for real, on 2026-09-01. Every figure on these pages was captured from that run — nothing is written from intent.

14 steps, grouped by the question that sends you to them rather than by build order. Each tile carries the one figure that step is about, and opens the page behind it.

Should you use this?What you bring, where it stops, and when not to use it

Before you commit an afternoon to this, these are the answers that decide it. Each one is rendered from the record it lives in — and links the page that holds it in full.

What do I have to bring?Drop your own exception messages into data/corpus/ as .txt with the same seven panel headings, add one row per message to data/items.json (planner_state, procurement, tolerance_days), and label them in data/gold.jsonl. Everything except the citation offsets, which the generator writes because it planted the line. Corpus lens →
When is this the wrong choice?Avoid: The paid call. That is the case against the best-fitting scenario (“A plant whose exception messages are a fixed-layout export and whose causes are printed in the panels”). 3 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A message whose dates are not on labelled lines — a screen scrape, a PDF, a spreadsheet export with the columns unlabelled. The free floor's perfect arithmetic is two regular expressions over a fixed layout, and since the floor is the arm that WINS here, breaking it moves the whole finding rather than one number. 4 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?A second run of the same corpus. Run-to-run variance is unknown and the headline is a loss of ten messages, not a tie. 6 items this kit says it could not check. Eval lens →
Can I run this on a model I control?Yes — any OpenAI-compatible endpoint, including one on your own hardware. The shipped adapter takes its host from BASE_URL and its model from MODEL, so nothing in src/ changes. The published figures come from 1 model on the fast tier, one provider, one key. Prompt lens →
And if it fits — what do I stand up?8 artifacts with a stated home and a stated egress, and 3 decisions each with what you provision past its ceiling — plus what was not measured. That is the next page, not this one. step 14 — Run it in your environment →

Not asked of this kit — 2 questions: clone (a fresh clone of this kit runs with nothing fetched); judge (nothing here is graded by a model).

Last verified 2026-09-01 — r001-mrp-exception. Every figure on these pages was captured from that run.

Run itHow this reaches your data

Every result on this page was produced by pure code over checked-in files, with no API key — which is why you can read the numbers before anyone spends anything.

Run this on your own data

  • The pipeline, its eval harness and the runs behind every numberdeployed inside your environment, on your own model endpoints, against your own documents.
  • The corpus above is the shape, not the limitit is a folder swap, and there is no database to migrate.

Talk to us →

Checked before this shipped — Clone, no key, no install: 64 messages, the rulebook, the item master register, the answer key, both free floors and all four committed run records are on disk. Only the live call needs anything.

A living map of modern AI — kept current every morning