Co-authored-by: Jeffrey Smith <jasafpro@gmail.com> Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
3.8 KiB
Workflow Engine — Design
The workflow engine provides multi-stage, form-driven processes with team validation, SLA enforcement, and public entry. Workflows are kernel primitives; workflow surfaces (admin UI, public landing pages) are extension packages.
Core Concepts
Workflow Definition
A workflow is a named process template owned by a team. Each workflow defines an ordered list of stages that instances progress through.
| Field | Description |
|---|---|
name |
Human-readable workflow name |
slug |
URL-safe identifier (unique per scope) |
scope |
Owning team or org |
stages |
Ordered list of stage definitions |
entry_mode |
internal (authenticated users) or public_link (landing page) |
sla_hours |
Optional SLA deadline for instance completion |
Stage Types
Each stage has a mode that determines how participants interact:
| Mode | Behavior |
|---|---|
form_only |
Structured form submission. Stage advances when form is complete. |
form_chat |
Form plus threaded discussion. Useful for review with comments. |
review |
Approval/rejection gate. Designated reviewers must sign off. |
custom |
Delegates entirely to a surface package. Enables extension-driven UIs. |
Stages declare an assignee_mode (individual, team, role-based) and optional
form schemas (JSON Schema validated at submission time).
Workflow Instances
An instance is a running execution of a workflow definition. It tracks:
- Current stage index and overall status (
active,completed,cancelled,stale) - Per-stage completion records with timestamps and actor IDs
- Form data submitted at each stage
- Assignment and claim history
Instances use optimistic locking (claimed_by + claimed_at) to prevent
concurrent stage advancement. A claim expires after a configurable timeout.
Multi-Party Validation (Signoff Table)
The workflow_signoffs table enables multi-party approval gates:
| Column | Purpose |
|---|---|
instance_id |
Which instance |
stage_index |
Which stage requires signoff |
user_id |
Who signed |
decision |
approved or rejected |
comment |
Optional rationale |
signed_at |
Timestamp |
The engine checks signoff requirements before advancing past a review stage.
Requirements are configurable: unanimous, majority, or N-of-M.
SLA Scanner + Staleness Sweep
Two periodic background jobs maintain workflow health:
SLA Scanner — Runs on a configurable interval. Identifies instances that have
exceeded their workflow's sla_hours deadline. Fires a workflow.sla.breached
event (consumed by notification extensions or triggers).
Staleness Sweep — Identifies instances that have been idle (no stage
advancement) beyond a configurable threshold. Marks them as stale and fires
workflow.instance.stale. Stale instances can be resumed or cancelled.
Both jobs are distributed-safe: all cluster nodes run them, but operations are idempotent (UPDATE with WHERE guards).
Public Entry
Workflows with entry_mode: public_link are accessible at:
/w/:scope/:slug
The landing page renders the first stage's form without requiring authentication. On submission, the kernel creates an instance and stores the form data. Subsequent stages may require authentication depending on their assignee configuration.
Public entry enables use cases like intake forms, support requests, and application submissions where the initiator is external.
Extension Points
- Surface packages provide workflow admin UIs and participant views
- Trigger extensions can react to workflow events (
instance.created,stage.advanced,sla.breached,instance.completed) - Custom stage mode delegates rendering and advancement logic entirely to an extension, enabling arbitrary UIs within a workflow stage