Polymr
Workflow engine

Six kinds of signal. One decision to act.

This is the part of Polymr that decides whether anything happens. A noisy stream of supplier emails, ERP updates, scheduled jobs, file drops, portal polls, and operator clicks all lands in the same place. Related signals are held briefly so they get acted on together. Two checks run before anything fires (are the facts current, are the rules satisfied), and only then does a signal become a workflow run with a name on it.

Six lines of signal all land in one place.

Six kinds of signal feed into one place. When several related signals land at once (the same vendor, the same item) they are held briefly so Polymr can act on the combined result instead of each one separately. The signals that survive get two checks: are the facts they reference still current, and are the rules satisfied. Anything that clears both becomes a workflow run, handed to the workflow that owns the action. The board below is what those runs look like in the product: four columns for the four stages, active runs as cards, each one carrying the item it is driving and who is on it.

app.polymr.tech/flow

Workflow board · live

4 stages · 11 active runs · live as of 09:42

Polymr ERP
Intake3
PMR-4031
email parse · Acme
awaiting confirmAP
DWG-PMR-4406-v3
CAD revision
parsedMC
EDI-855-22418
EDI ack
queuedSY
Plan2
PMR-4031
re-explode · MRP run
computingJR
PMR-CN-44
shortage cover
short -160JR
Execute4
WO-1124
cure line · W22
in runLR
WO-1126
mix line · W23
stagedLR
PO-84179
receive · 280 ea
+ 9d slipAP
WO-1131
pack · W22
in runLR
Review2
RFQ-4821
award · V-218
buyer signAP
CN-1187
revision impact
2 of 4 chainSM

Wait for the related signals to settle, then act on the combined result.

We do not just put a uniform delay on everything. Instead, Polymr holds a signal open briefly, watches for related signals on the same item (the same vendor and item for a purchasing action, the same PO line for a write-back), and combines them in one of three ways: keep the latest, add the quantities, or merge field by field. The rule for which way to combine is part of the workflow itself, written in code and reviewed alongside it.

A vendor that sends three revised quotes in thirty seconds produces one action when the window closes, carrying the latest version. No race to the queue. No quiet last-one-wins. The audit row records each one that was folded in, so a buyer asking why a particular revision did not survive gets a clear answer.

Six kinds of signal. One wait. Two checks. One action.

The diagram below names every step. Signals on the left, the wait-and-check column in the middle, the action on the right. A signal that fails a check writes an audit row and stops; one held back by a rule sits in a holding slot and gets re-checked on the next pass.

Six event sources
  • Inbox parse
    email + PDF
  • ERP CDC
    logical replication
  • Cron
    schedule fire
  • File drop
    SFTP / S3
  • Portal poll
    scrape diff
  • Manual
    console
Debounce + guards (in order)
  • 01
    Debounce window

    Per-key fold across a fixed window so duplicate events collapse to one envelope before any work runs.

  • 02a
    Context guard

    Hard preconditions read from context (item active, vendor approved, no pending revision). Refuses without running reasoning.

  • 02b
    Policy hold

    Soft budget check against in-flight dispatch counters. Holds briefly when a downstream system is saturated; never silently drops.

One dispatch
Dispatcher

One envelope leaves with a routing decision, an idempotency key, and the cited guards already on it.

workflow: procurement
.award_quote
key: V-218.PMR-4031
Refused on a guard, the envelope writes an audit row and stops. Held on policy, it sits in a holding slot and re-evaluates next tick.zero double-fires . zero silent drops
Illustrative shape. The wait-and-combine step is kept per customer; a noisy source never starves the others.

Check the facts first. Check the rules second.

The check runs in two parts, not one. First, Polymr looks up the specific fields the workflow needs from the shared picture of the plant. If any of those fields are stale or missing, the signal is rejected and never even gets to the rules check. Second, the rules check compares the signal against the compute and write budgets. If Polymr is already at its limit for that destination system, the signal waits instead of racing in and tripping a rate limit.

Splitting the check in two is what lets every refusal come with a specific reason. A refusal tells you which check refused, which field it was looking at, and which limit was hit. Most "why did it not fire?" investigations end here, in one click from the debug screen.