Zenith · Automation

A rule engine that can't say which rule fired is a mood.

Zenith's automation is written to be read before it is trusted. Decision tables answer in rows you can point at. Workflows publish as frozen, numbered versions, and a run in flight finishes under the rules it started with. Templates name every placeholder they could not fill. And where the engine does not run something yet, the screen says so on its face.

Bilingual EN / FR · Multi-site · WCAG 2.2 AA
First match wins
And the answer names the row that decided it, by position
Versioned like law
A published workflow is frozen, and a run finishes under the rules it started with
13 named errors
Every structural check points at its own node — “workflow invalid” is a product giving up
EN · FR
Every label, hint, empty state and refusal, in both languages
What you author

Six things a person writes down

Automation earns its keep in the months after somebody sets it up, when a different person has to work out why it did what it did. Every surface here is built for that second conversation rather than the first afternoon.

01

Decision tables

Rules in rows, read top to bottom. The first row whose conditions all hold decides, and later rows are not consulted — which is what makes the table auditable.

02

Workflows

A visual graph of nine node kinds — start, process, approval, decision, assignment, automation, notification, wait, end — each with a step key like P2 or D1 that stays stable once assigned.

03

Notification templates

The words the automation sends, owned by administrators rather than developers, in English and French from the first keystroke.

04

The inbox

What the system had to say to you — rendered at send time against the registers as they stood, so each entry is a record rather than a live query that rewrites itself.

05

Versions

Publishing takes a frozen, numbered snapshot and leaves the draft exactly as it was. Publishing is a snapshot, not a hand-off.

06

Simulation

Ask a table what it would decide, and walk a graph with sample inputs — before either is trusted with real traffic.

Decision tables

“Why did this request come out Urgent?”

That question deserves exactly one answer, and a decision table is the shape that gives it: rows read top to bottom, the first whose conditions all hold decides, and the decision names the row that made it. Rules a planner can read without a programmer, and argue with without a meeting.

  • The answer names its row — “decided by row 2”, or “no row matched, the default answered”, or plainly “no decision” when there is neither.
  • Order is the rule, so moving a row is a decision — rows move with arrows rather than drag-and-hope, because the order is the meaning.
  • A new row matches everything — visibly too broad, so it gets edited rather than quietly forgotten in the middle of the table.
  • Answers come from a closed set — a row cannot invent an outcome nobody listed, which is how “Urgent” and “urgent” stop being two priorities.
Versioned like law

An approval that started under v1 finishes under v1

Changing the rules mid-flight is how an approval nobody gave gets recorded as given. So a workflow is two things sharing a name: a draft, which is the one editable head, and a list of versions, each frozen at the moment it was published. The editor only ever touches the draft; a run only ever references a version number.

  • Publishing touches no run — the new version is written and the list of runs is not touched at all, so the guarantee is structural rather than a promise somebody made in a code review.
  • The pin is on the row — “Published v2 · 2 still running on v1” is the rule said as a fact, where the person deciding whether to publish will read it.
  • Publishing an unchanged draft is refused — a version that changes nothing is version-number inflation, and the next person reading “v7” deserves to believe seven decisions were made.
  • A retry re-runs the same step on the same pinned version — never a newer one, which is the single thing an automation must never improvise.
Before it can publish

“Workflow invalid” is a product giving up

Thirteen structural checks run against the draft graph, and every finding points at the node that failed it, in a sentence. Errors block publishing. Warnings do not — because the difference between “this cannot work” and “this will probably annoy somebody” is worth keeping.

  • An approval with no approver cannot publish — that is not a workflow with a gap; it is a gate propped open that reads as a gate.
  • One doorway — two Start nodes is two claims about where the process begins, and a runtime could only ever honour one of them silently.
  • Every decision output is labelled — a diagram that cannot say what routes where is a picture rather than a design.
  • Deleting a node takes its connectors with it — a wire to nowhere is worse than a missing box.
The words it sends

A notification that guesses teaches everyone to distrust every notification

A template is edited by an administrator and read by a fitter at two in the morning, and between them sits a renderer. When a placeholder cannot be resolved — mistyped, or asking for a field the event does not carry — the honest options are to say so or to guess. Zenith says so, by name, before the template is ever used.

  • Unresolved placeholders stay visible in the text — left as {{approver.name}} rather than silently blanked, so nobody ships a sentence with a hole in it.
  • The preview renders against real records — the author sees “Standby generator will not start on test”, not {{workOrder.summary}}. That is the difference between checking a template and believing one.
  • Each event offers a closed set of tokens — what a work order can offer, what a stock alert can offer, listed rather than guessed at from memory.
  • English and French from the first keystroke — subject and body are per-locale fields, not a translation pass bolted on after somebody complains.
Where the line is

What runs, and what is written down

Automation is the part of a maintenance system most often sold as finished and delivered as a diagram. Zenith draws the line where its own code draws it: what a person authors is built and checkable today, and what runs unattended belongs to the server phase — with every screen that touches it saying so on its face rather than in a footnote.

Said out loud, on the screen

The product tells you where it stops

Most automation modules are bought on a demo of the designer and discovered in month four. This one prints the boundary at the foot of the page it applies to — so the question “does this actually run?” is answered before the purchase order, not after it.

  • The simulator is subjunctive on purpose — nothing is created, sent or reserved, and every note it writes begins with the word would.
  • The instances screen carries its own hatch — “the engine that runs steps for real is the server's half” sits under the table, permanently, not in a release note.
  • The transport is missing, not the model — the inbox is already the delivery surface, rendered and timestamped; when the dispatcher lands it sends through that same door.
  • Nothing is dressed up as finished — an automation step that does nothing yet is an error that blocks publishing, not a box that quietly sits there looking capable.
And the rest of it

Everything around the rule

Seven things to watch for

A work order raised, completed or closed; a request submitted; a condition alert fired; stock below reorder; a purchase order issued. A closed list on purpose — an event is a contract, not a free-text wish.

Step IDs people can say out loud

P1, D2, A1 — numbered within the workflow and stable once assigned, so a conversation about “the second approval” has a name both people recognise.

The algorithm, drawn honestly

A start pill for the trigger, a diamond for each gate with its “no” running off to Stop, a box for each step that does work. Branches the engine cannot take are not drawn — a nicer picture of a different product helps nobody.

Reading is a timestamp

Not a flag. “When did they see it?” is the question every notification post-mortem asks — and reading twice is refused, because the first timestamp is the fact.

Failures carry their reason

A failure without one is not a failure, it is a mystery — so the reason is required, and it sits on the row next to the run that stopped.

Words owned by people

Templates are edited by administrators, not shipped in a build. Rename anything in your vocabulary and every heading follows — never what a filter matches on.

A version always means a decision

An unchanged draft cannot be published, so a version number is never inflated by somebody clicking to be sure.

Loops are reported, not run

The simulator walks the graph and stops the moment it re-enters a node it has already visited, naming it — rather than spinning quietly on somebody's behalf.

Two languages, all the way down

Every label, hint, empty state, blocker and refusal exists in English and French — including the sentence that tells you a workflow cannot publish yet.

Enterprise foundations

Automation you can hand over

The person who set up your automation will leave. Everything here is built for the person who inherits it — the one who has to explain, five years on, why the system did what it did on a Tuesday nobody remembers.

Authored, then frozen

A draft is edited freely; a version is a snapshot nothing can reach back and change, and every run names the version it is living under.

Refusals name their own step

Nothing is rejected as “invalid”. Every blocker says which step, which field and what is missing, so the fix is obvious rather than a hunt.

Bilingual by birth

Full en-CA / fr-CA parity on every screen, hint, empty state and refusal — plurals handled properly, not by concatenation.

Accessible to everyone

WCAG 2.2 AA as a build rule: real tab semantics, states announced in words, and focus that moves to the field an error refers to.

Designed around ISO 55000 · Asset management EN 13306 · Maintenance terms WCAG 2.2 AA
Questions people actually ask

Before you book the demo

Can it send a report out every Monday morning?
Reports on a recurring pattern are the Report Scheduler's job, and it does exactly that — captured configuration, a daily, weekly, monthly or yearly pattern, and delivery by email from a background worker on your server. What the automation module has no time-based triggers for is workflows and rules: every one of its seven triggers is an event, something that happened in a register. There is no “four hours after this step” and no recurring workflow, and those arrive with the server phase.
Does it send email?
Notifications are delivered to an in-app inbox today, rendered at send time and stamped when they are read. Email and SMS delivery are the server's half — and the model for them is already done: templates carry a channel, subjects and bodies exist in both languages, and the inbox is the delivery surface. What is missing is the transport, not the design. When the dispatcher lands, it sends through the same door.
Can a rule fire automatically on live traffic?
Decision tables are authored, simulated and argued about today; firing on live traffic is server-phase work. That order is deliberate. The table is the part that has to be right first — a rule engine that cannot say which rule fired is a mood, and a table nobody has interrogated is a rule nobody should be running against real requests.
What can a workflow watch for?
Seven register events: a work order raised, completed or closed; a service request submitted; a condition alert fired; stock falling below reorder; a purchase order issued. The list is closed on purpose — an event is a contract with whatever emits it, not a free-text wish, and a workflow watching for something nothing emits is a workflow that never runs and never says why.
What happens to running approvals when we change a workflow?
Nothing at all, and that is the point. A run carries the version number it started under, and publishing writes a new version without touching the list of runs. An approval that began under v1 finishes under v1's rules — because changing the rules mid-flight is exactly how an approval nobody gave gets recorded as given.
Is there SLA tracking and escalation?
Not yet. SLA definitions can be attached to an approval step in the designer, and the validator will warn you when one has none — “it can wait forever quietly” — but the SLA engine itself is server phase. There are no countdowns, no escalation after N hours and no automatic reminders in this build. The warning exists precisely so nobody assumes otherwise while designing.
Can we branch, or run two paths at once?
Branch, yes: a decision node needs at least two output paths and every one of them must be labelled, or the workflow will not publish. Parallel paths and loops are not supported — a loop is detected and reported by name rather than run. The older linear runtime underneath is one lane, and the algorithm diagram draws it that way on purpose: a picture of branches the engine cannot take would be a nicer picture of a different product.
Can a step be assigned to a specific person?
Steps are assigned to a group — a functional group or an approval role — rather than to an individual, and a process step with no group attached raises a warning: “nobody's queue will hold it”. Per-person assignment, together with approve, reject and reassign, belongs to the runtime that lands with the server phase.
What stops a half-built workflow going live?
A publish gate with named blockers. An approval that names no approver, a decision with fewer than two outputs, an unlabelled path, a notification with no template, an automation step that does nothing yet, a node nothing can reach, a node with no way out — each one is an error that points at its own node and refuses. A gate propped open reads as a gate, which is the specific failure this prevents.
Can we test a workflow before publishing it?
Yes, and the test is deliberately powerless. The simulator walks the draft with sample inputs and reports the path a record would take and what each step would do — every note beginning with the word “would”. Nothing is created, sent or reserved. It is the sentence a designer needs before daring to publish, rather than a dry run with side effects.
Who owns the wording of a notification?
You do. Templates are edited by administrators rather than shipped in a build, with subject and body held separately for English and French. Each event publishes the tokens it can offer — a work order's code and summary, an alert's meter and reading, a part's available quantity — and the preview renders against real records, so an author reads the actual sentence a technician will get at two in the morning.
How does this fit with the rest of Zenith?
The definitions live in the platform layer, not inside the automation screens, so work orders, purchasing and maintenance plans can all reference a workflow, a rule or a template without any module importing another. It is the same separation that lets a machine's page show its condition rules without the asset module ever learning what a condition rule is — and it is why adding an event or a source later is additive rather than structural.
See it on a rule you already argue about

Bring the rule nobody can explain.

Every organization has one — the priority that gets set by a rule somebody wrote in 2019, or the approval that fires for reasons three people describe three different ways. Write it down as a table with us, and we'll ask it what it would decide, in front of you, and it will name the row that answered.

Zenith · Automation Part of the Zenith maintenance & asset operations platform