WorkflowHub

Invoices · onboarding · support triage · contracts · software delivery

A workflow engine whose workers are AI agents and humans, collaborating.

WorkflowHub is a durable, queue-based work system, and what it produces is authored metadata about your process. Agents and people work the same items together: the engine moves them, rules enforce what each side may and may not do, and a person holds every gate that matters. You identify the business process; AI helps you design the workflow; you supply the rules, the tokens and the models — local or hosted. Work gets done.

C# / .NET 10 · PostgreSQL 16 + pgvector · REST API · MCP server · React SPA

INTAKE Extract worked by an agent RULES Confidence = High → on to another agent Confidence = Low → to a person instead Enrich a different agent Exception worked by a person Approval a person holds this queue — it IS the gate an agent cannot advance an item out of it Post back to an agent DONE ONE ITEM · SUCCESSIVE QUEUES · THE RULES DECIDE WHOSE HANDS IT REACHES NEXT

Each queue is staffed by whoever should do that step. At every hop the rules pick the next queue — which may be a different agent, or a person. A queue a person holds is the checkpoint.

No code
You describe the steps and the rules. Changing them takes effect the same afternoon — there is nothing to build or release.
A form per step
Each step shows only its own fields, and will not let the work move on until the ones that matter are filled in.
Your AI
Bring your own models and pay for your own usage — a cheap one on easy steps, a strong one where the judgement is hard.
Who did what
Every change records whether a person or an AI made it, and when. You can always answer “who decided this?”

The model

What a workflow actually is here

Six nouns. Learn these and the rest of the platform is mechanical.

  • Workflow — a process: a set of queues (steps) and the routes between them, with junctions as branch points. A workflow is a self-contained world.
  • Work-item type — the shape of an item: which fields and tabs it carries, which routes it may take, which rules apply. Several types can share one workflow's queues and each route over them differently.
  • Work item — one live instance of one type, sitting in exactly one queue. Its field values travel with it. It never changes type and never moves to another workflow.
  • Rule — the enforcer. A rule fires on a trigger (e.g. BeforeWorkItemRouted), evaluates scenarios, and acts: require a field, hide a field, cancel the transition, send mail, write a note, or route the item itself.
  • Queue contract — what each stage declares to whoever works it: the one outcome field it exists to produce, the evidence it owes, and where each outcome value sends the item.
  • Project — coordination above workflows: groups items (possibly from different workflows), declares dependencies between them, and computes the critical path.

The load-bearing rule: one lifecycle, one workflow. Because an item carries its whole life on one record, the engine can assert “this item followed the process” rather than trusting whoever moved it.

Result = Fail → back to Development Requirements START Development agent Code Review agent · fresh context Release Approval HUMAN GATE Done FINISH rule: CommitRef req. rule: build must pass agents: 403 QUEUES = STEPS  ·  ROUTES = PATHS  ·  RULES = THE ENFORCER

A gate is a BeforeWorkItemRouted rule with a cancel action. You change process by authoring, not deploying.

Collaboration, concretely

What a person actually sees — and how the same instructions reach the agent

A process only works if the person doing it knows what is expected of them right now. So the item does not merely refuse to move. It marks the tab, boxes the field in gold where it lives, says in the words of your process why it matters, and re-checks after every save. This is one real stage of a real workflow.

SDLC-544 Queue Low Pull Next →

OUT-O1: a work item records WHY it finished, not just THAT it finished

Requirements done Development done Code Review done Test done Verify here now → Release Pending next ● Deploy human gate ○ Done not yet

Taken — it's yours to edit now.

Summary Requirements Development Code Review Test Verify Release Pending Deploy Links Instructions History Notes
Required to move forward

Save changes — the route re-checks its gate on every save.

Required to move forward

Save changes — the route re-checks its gate on every save.

— Select —
Required to move forward

Save changes — the route re-checks its gate on every save.

Drop a file here, or use the button below.
Save
Save fields

The gate below re-checks after every save. Fields marked • gold on the form must be filled in first: DeployApproved, VerificationNotes, VerifyOutcome, VisibleWhere, ClosureReason.

Move

This stage sets VerifyOutcome. Its value picks the destination.

Development backward

backward — sends the work back to be redone

VerifyOutcome = Fail

Release Pending 👤 human

VerifyOutcome = Pass

🔒 VerificationNotes is empty. Nothing may enter the release queue unverified — write what you checked and what you saw, then route.

🔒 VerificationNotes never mentions the acceptance criteria. Address each criterion by name and say what you actually ran — “the commit is pushed” is not verification.

🔒 If it isn't visible in an interface, it isn't done. Fill VisibleWhere: name the screen an operator would see this change's state on.

Finish
— Select —

Finishing routes this item off the board. The outcome records WHY it finished and cannot be changed afterwards.

Override direction  👤 human only

Nobody has to read the workflow to know where they are

The rail shows every stage this item has passed, where it sits now, what comes next, and which step ahead is a human checkpoint. It is generated from the workflow you authored, so it is never out of date with the process.

A gate explains itself in your words, not the engine's

Not “validation failed”. The message names the field, says why the process wants it, and tells the person what to write — because those sentences are authored on the workflow alongside the rule that enforces them.

Every destination is labelled with what sends it there

One outcome value per route, one sentence each. Backward is marked backward so a reject is never mistaken for progress, and a human-held step is marked human before anyone reaches it.

The agent is handed exactly the same three facts

What this stage must produce, the evidence it owes, and where each outcome sends the item — the person reads it as a form, the agent receives it as a queue contract. One authored source, two audiences. That is what makes the hand-off between them seamless: neither is working from a different copy of the process.

And when it is not obvious what should go in a field, Fill from document (AI) reads the attached source and proposes the values — the person stays the one who accepts them.

The unit of work

A work item, and everything it captures

A work item is one durable row plus everything attached to it. Half of what it carries is defined by its type; the other half is universal and behaves identically in every workflow you will ever author.

BOUND TO THE WORK-ITEM TYPE Fields, grouped on one tab per stage Summary Development Review Classification ComboBox Requirement MultiLineTextbox SupportingDocs Attachment AssignedTo UserList ReleaseApproval human-only UNIVERSAL — IDENTICAL IN EVERY WORKFLOW Description Notes History / events Attachments Typed links Edit lock Estimated duration Time entries Dependencies Project membership Priority · assignee · current queue · finished-at every write stamped: actor · provenance (human | ai | app) · timestamp

Field values are bound to the type's field definitions — which is why an item can never be re-typed or re-homed.

Why put AI here instead of in a chat window

Six things go wrong when you point AI at real work. A workflow stops each one.

Everyone has tried handing work to an AI and watched it go wrong in the same few ways. None of those are model problems — a better model fails the same way, just more convincingly. They are process problems, and a process is the thing this product actually gives you.

The problem

It says it did the work, and it didn't

The most expensive failure, because it looks like success. You find out weeks later.

What stops it: a step can refuse to hand the work on until the proof is actually there — the file attached, the test output pasted in, the reference that can be checked against the real system. An AI that claims work it did not do simply cannot move the item forward. It gets stuck, in the open, where somebody sees it.

The problem

You told it what you wanted and it did something else

A vague request produces confident, useless work. Usually you only find out at the end.

What stops it: each step states one thing it exists to produce, the evidence it owes, and where each answer sends the work next. There is nothing to interpret and nothing to guess. A person working that step sees the same thing as a form.

The problem

It marks its own homework

Ask the same AI to check its own work and it agrees with itself. Of course it does.

What stops it: checking is a separate step, done by a separate session that never saw the first one work. It reads what was produced, not the reasoning that produced it — which is the only way a second opinion is worth anything.

The problem

It costs a fortune and slows down

Give an AI everything you own as background reading and you pay for all of it, every time, and it gets worse at finding the part that mattered.

What stops it: each step carries only its own instructions and documents. A step about invoices never receives the HR policy. Less to read is cheaper and more accurate — and it is decided by how the step is set up, not by asking the AI to please ignore things.

The problem

It does something you would never have approved

Fine while it is drafting. Not fine when it pays an invoice, emails a customer, or changes a live system.

What stops it: the steps that carry consequences are held by a person, and an AI is simply refused when it tries to move work out of one — no matter what it has been told or what access it has. That refusal is enforced by the system, not by the AI's own good behaviour.

The problem

It learns nothing, so you pay for the same mistake forever

Every session starts from nothing. Whatever last week's session worked out is gone.

What stops it: what gets worked out is written into a shared, curated store that the next session is handed before it starts. The organisation gets better at the job even though the AI itself remembers nothing.

None of this is AI-only machinery. A step worked by a person shows the same brief, the same required fields and the same refusals — because a step is set up once, and then given to whoever should do it.

Oversight

Human gates are structural, not a setting an agent can talk its way past

Autonomy is useful right up to the moment something has consequences. Three independent mechanisms decide where that line sits, and all three are enforced server-side — the agent's own tooling never gets a vote.

The escape hatch is deliberate and visible: one workflow-level variable opts a specific workflow's agents into routing past its manual queues. It is off by default, it is authored, and it is auditable — which is the whole point.

AI agent API key principal Person SSO session Release Approval RequiresHumanApproval queue definition flag Production 403 DECIDED AT AUTHENTICATION, NOT IN THE PROMPT

Whether the caller is an agent is decided by the auth middleware; whether the queue is a checkpoint is persisted on the queue. Neither is negotiable at run time.

Getting one built

You describe the process. An LLM builds the workflow — supervised, tested, and corrected as it goes.

No implementation project, no consultant, no six weeks learning a modelling notation. You point your own assistant at WorkflowHub and tell it what you want. It is not left to improvise: it is put through our workflow-authoring procedure, which has built many of these and carries what each one taught.

Connect the assistant you already use

Any MCP-capable assistant. Generate an API key in the app, add one server entry to your assistant's configuration, then ask it to list your queues to confirm it worked. Nothing to install on a server, nothing to request from IT, and the key acts as you — so everything it does is attributed to your account, not to an anonymous integration.

Say what you want, in your own words

“Invoices arrive by email, someone checks them against the PO, anything over ten thousand needs the controller, then it posts to the ERP.” That is enough to start. The interrogation that follows — who does what, what each step must produce, what would make it wrong, who is allowed to say yes — is what turns a described process into a buildable one.

It cannot improvise; the procedure is enforced

The authoring guide is not advice. Every tool that can change a workflow — add a queue, add a route, add a rule, save a definition — refuses to run until the guide has been read, and the acknowledgment token it returns is what unlocks them. A workflow stamped out without that loop is presumed wrong, because that is precisely how the first one failed.

The design is judged before anybody depends on it

Validation returns a verdict — pass, warn or fail — with whether an item can traverse at all, how many hops need an agent, how many need a person, and which gates are unsatisfiable. Every finding cites the law it breaks and states the remedy: every gate has a producer (nothing may demand a field no earlier stage can fill), every stage has a worker, every workflow is closable, every actor knows its options, capability is declared per stage.

Then it is actually run — because a clean report is not a working process

One of ours once reported thirteen-of-thirteen queues healthy and zero faults while nothing in it could be finished at all. So the last check is execution. Live validation creates a probe item that is invisible to every claim path, queue depth, allocator lane and report, drives it hop by hop along the same routes and the same finish path your fleet uses, and then removes it — so a process is proven against the real environment rather than a copy of it. It writes, and it fires the same triggers and webhooks a real item would, so you run it deliberately rather than on every save.

What blocks the test gets fixed during the test

A missing field, a gate nobody can satisfy, a route that goes nowhere, a message that does not tell the worker what to write — it is changed there and then and the item is run again. Because a workflow is data, not code, none of that is a release: no build, no deployment window, no ticket to a specialist, no waiting for a maintenance slot. You watch it, you approve it, it is in effect.

The platform underneath

Everything a real process needs, before you write any code

Workflows are authored through a designer and an API, not compiled. Adding a stage, a field, a gate or a routing rule is a data change.

Form designer

15 field types — text, combo, checked list, date, attachment, user picker, grid, sub-item, button — laid out on tabs, one per stage, with list values sourced statically or from a query.

Your models, your tokens

Choose the model per queue: a cheap local model on a triage step, a strong hosted one where the judgement is hard. Bring your own keys, or point a queue at a model running on your own hardware. Cost and outcome are recorded per stage, so which model is worth it here is a measured answer.

Rules engine

37 actions over 11 triggers, evaluated against scenario criteria: require, hide, default, cancel the action, email, run a query, add a note, enable or disable a routing option, or route the item.

Document ingestion & RAG

An idempotent ingestion port turns a file, mail or event into a work item; the knowledge corpus is chunked and embedded in pgvector, searchable by agents and people, with a browsable index for when search is the wrong question.

Projects & critical path

Group items across workflows, declare dependencies, get a computed schedule and the items driving the finish date. Project templates compose whole workflows as gated stages.

MCP server

A second façade over the same API, so any MCP-capable model can claim work, read its context, write fields, file notes, search knowledge and report outcomes as itself — with the audit trail naming it.

Worked examples

One shape. Five different businesses.

We build our own software this way, and that is the one we can show receipts for — but it is one workflow, not the product. The engine does not care what the work is about.

Finance

Invoice intake

Invoices arrive by email and nobody can say how long approving one takes, or which vendors cause the rework.

Intake Extract Approval Post to ERP

The rule that matters: low-confidence extraction goes to a person, and nothing reaches the finance system without an approval decision.

HR & IT

Employee onboarding

It fails in the seams — HR thinks IT has it, IT is waiting on Facilities, and the new hire has no laptop on Monday.

New Hire IT / Facilities / Payroll Day-1 Ready

The rule that matters: nobody is declared ready without accounts, payroll and a briefed manager — and the schedule tells you on Wednesday if Monday is at risk.

Customer operations

Support triage

Volume is the problem, not difficulty. The good answer already exists in something a colleague wrote last year.

Triage Draft Reply Review & Send

The rule that matters: if a person rewrites the draft they must say what was wrong with it — a month of those is a ranked list of what your knowledge base is missing.

Legal & procurement

Contract review

The reading cannot be skipped. The extraction, the clause-flagging and the chasing absolutely can.

Received Extract Terms Risk Flag Legal Review

The quiet win: renewal dates become real data, so a review opens ninety days before an auto-renewal rolls instead of after it.

The one we run ourselves

Software delivery

Our own features are written, reviewed, tested and shipped by AI working a WorkflowHub workflow.

Requirements Development Review Test Release

The rule that matters: nothing passes review without a real, checkable commit, and no release happens without a person authorising it.

And the same shape again

Wherever the steps repeat

Help-desk tickets · contact-centre cases · chasing customer documents until every required value is there · claims and applications · inspection rounds · change-approval boards · cleaning up a document library so what your AI reads has been checked. If your team does it by hand every week, and it has steps, evidence and a decision, it fits.

Architecture

API-first, single gateway, no side doors

Every consumer — the React SPA, an MCP-connected agent, an ingestion source, your own integration — goes through the same REST API with the same authorisation. The SPA holds no database credential. MCP is a façade over the API, not a parallel path.

  • Defence in depth. The API authorises every request, the database runs under a least-privilege login that cannot change schema, and sensitive values are encrypted at rest.
  • Identity is external; the app owns authorisation. OIDC single sign-on for people; API keys as first-class principals for agents, stored hash-only and carrying an acts-as identity.
  • Permissions are workflow-scoped. 25 permission types granted to groups over queues, with group membership resolvable from an SSO claim.
  • The organisation is the tenant. It owns members, workflows, secrets and groups, and it is the unit of isolation, placement and scale.

See the full architecture →

You supply the process. The agents supply the tokens.

Author the workflow once. Agents work it around the clock, evidence accumulates on the item, and you keep the decisions that deserve a person.