§01  /  The execution layer

Machines are fast.Judgment is slow.Run both.

One layer for workflows, agents and the people who sign off on them. Author on a canvas or in Python. Pause for a human - four minutes or four weeks - and resume exactly where you stopped, with the whole run signed.

Python + visualMCP both waysDurable HITLAudit by construction
run_01JX7 · refund_authorizationPaused
agent.run · claude-sonnetspan 05/08
Tokens8.2k / 40k
Cost$0.019 / $0.50
Iterations17 / 25
Wall-clock02:14 / 05:00
human.approval#finance
2d 04:12:07
durable pause · expires in 4d 19h
4 budgets enforcedrecursive rolluptenant acme
Trace · 8 spansEXECUTING00:00.0hmac signed
trigger.webhookreceived0.42s
ocr.extract_invoice14 fields1.90s
ai.classify_intentrefund · 0.940.82s
human.approvalawaiting ops · slack2d 04h
agent.run · sonnet4 tools · $0.0193.21s
saas.stripe_refund€248.000.61s
notify.slack#finance0.20s
audit.commitsigned0.08s
Span0s2s4s- durable pause -6s8s10s
✓ approved · ops@acme · slack · 2d 04h 12minsert-only ledger · 8 entries
70+typed activities
custom on request
11+categories
new ones on request
4agent budgets
engine-enforced
99.98%control-plane uptime
trailing 90 days
§02  /  Three actors

Software, agents and people -
on the same ledger.

Most platforms pick one: deterministic pipelines that can't reason, agent frameworks that can't be audited, ticket queues that can't execute. Lyhnis runs all three as first-class spans in one durable run - same retry semantics, same budgets, same signed record.

Workflows

Three views. One definition.

Canvas for the ops team, JSON for review, Python for engineering. Not three products - three renderings of the same graph, on the same engine.

CanvasJSONPython
@workflow(name="refund_authorization")
def refund_authorization(invoice):
    doc = ocr.extract(invoice, schema="invoice.v2")
    if doc.total > 200:
        human.approval(to="#finance", expires="7d", escalate="cfo")
    result = agent.run("sonnet", tools=[refund_tool, ledger_mcp], budget="0.50usd")
    return stripe.refund(doc, note=result.summary)
  • 0170+ typed activities across 11 categories
  • 02Retry, parallel and branch enforced by the engine
  • 03Durable across restarts, deploys and days
Explore the platform →
Agents

Both directions of MCP.

External agents call your workflows as tools. Your workflows call external MCP servers as tools. The author defines the vocabulary - the agent may only speak it.

Claudeexternal agentinboundprocess_refundyour workflow
agent.runinside a workflowoutboundStripe MCPexternal tool
  • 01Per-tenant MCP server, JWT-bridge auth
  • 02Four budgets, recursive rollup
  • 03Sub-workflows-as-tools as the safety primitive
See agents →
Humans

Approval where it counts.

Drop a gate on any step. Approvers answer from wherever they already are, and the run wakes with actor, channel and source already recorded.

human.approvalpaused · 48h
Slackinteractive
Microsoft Teamsadaptive card
Emailthreaded
Magic-linkno login
  • 01Pause for minutes, days or weeks - durably
  • 02Expiry, escalation and quorum per gate
  • 03Every decision attributable to a person
Human-in-the-loop →
Composition

Nest it. Budget it. Ship it.

A workflow is a tool. A tool is a workflow. Nest them as deep as your problem needs - parent budgets roll up every nested agent's spend, every sub-workflow's tokens and every external call into one number per run.

process_refundroot · 8 spans
  └ verify_identitysub-workflow
    └ agent.runhaiku · 2.1k tok
  └ ledger_mcp.postexternal tool
rollup$0.021 · depth 3 / 3
§03  /  Vocabulary

A dialect that ships
with the engine.

Every activity is typed, retried, budgeted and logged before you write a line. Compose them, wrap them, or author your own - new activities and whole new categories get added on request.

Browse the catalog →
§04  /  The hard part

A workflow that waits three days is still running.

Everything interesting about enterprise automation happens in the gap - between the machine finishing and the human deciding. Most engines lose that gap: a retry storm, an expired token, a queue drained on deploy. Lyhnis treats the pause as state. Restart the workers, ship a release, go home for the weekend; the run is exactly where you left it, and the resume is signed.

run_01JX7 · span 04/08Paused
2d 04:12:07
elapsed in human.approval · expires in 4d 19h
gate#finance · 2 approvers
workersrestarted 3× since pause
releases2 deploys, run untouched
on resumeactor · channel · source
Durable state

The pause lives in the engine's store - not in a worker's memory or a sleeping thread.

Any channel

Slack, Teams, email or a magic-link on a phone. The gate doesn't care which one answers.

Policies

Expiry, escalation, quorum and step-up auth, declared per gate by the author.

Attribution

Who approved, from where, at what second - written to the ledger, not to a log line.

§05  /  The record

Audit by construction,
not by screenshot.

One insert-only ledger for the whole execution layer. Every span - agent, human or system - signed, timestamped and tagged with its resolution source. Auditors get one row per answer, and they can export the lot.

TimeOperationActorResolutionCost / detailState
14:32:08.114saas.stripe_refundAgentsonnet · tool #4$0.019 · 8.2k toksuccess
14:31:55.802human.approvalHumanops@acme · slackpaused 2d 04happroved
14:30:12.376ai.classify_intentAgenthaiku · schema v2$0.002 · 2.1k toksuccess
14:29:01.940db.postgres_querySystempg_prod · attempt 2backoff 1.4sretried
14:27:33.508webhook.deliverSystemhmac-sha256204 · 61mssuccess
14:27:12.001ocr.extract_invoiceSysteminvoice.v2 · 14 fields1 page · 1.9ssuccess
Insert-only · append & sign · no update pathExport: CSV · JSONL · S3 sinkRead the docs →
§06  /  Operations

Authoring is half
the platform.

The other half is the room you sit in on a bad afternoon: what ran, what it sent, what it produced, and which file came from where.

Monitoring

Every run, every metric.

Volume, success rate, P95, queue depth and worker health - per activity and per tenant, Prometheus-backed, alertable anywhere.

runs 90d1,247
p952.4s
success99.8%
workers28 / 28
Communications

Every message it sent.

Slack, Teams, email, Telegram - recipient, delivery state, content preview and a jump back to the exact step that sent it.

email · 2 rcptdelivered
slack · #financedelivered
teams · opsdelivered
telegram · oncallretrying
ms mail · legaldelivered
Files & lineage

Where the artifact came from.

Uploads, sources, artifacts, datasets and templates - each tied to its uploader, its workflow and the activity that touched it.

invoice.pdfupload → ocr
data.jsonemitted
sheet.xlsxused by 3
report.pdfartifact
archive.zipproduced
§07  /  Posture

Compliance is a
build constraint here.

Not a page in a trust centre written after the fact. Isolation, encryption, attribution and step-up auth are properties of the engine - which is why the audit is a query rather than a project.

01

Data protection

EU or US residency per tenant, a DPA on request, and a published subprocessor list. Deletion is a request, not a support ticket.

EU residencyDPASubprocessors
02

Authentication

MFA via TOTP or recovery codes, SSO over SAML and OIDC, step-up challenge on destructive actions.

MFASSOStep-up
03

Isolation & secrets

Per-tenant data and storage boundaries. Credentials encrypted at rest with Fernet, scoped per tenant, never in logs.

FernetPer-tenant
04

Auditability

Insert-only ledger with signed entries, actor typing and resolution source. Immutable and exportable.

Insert-onlySigned
Full security posture →
§08  /  Record

We ship weekly and
write it down.

The four most recent additions. Built in public, documented as we go - the changelog is the roadmap's receipt.

v2.3726 May 2026

Outbound MCP credentials

Workflows can call external MCP servers as tools. New MCP_OAUTH credential type, Fernet-encrypted and tenant-scoped; agent.run accepts server URLs in its tools list.

Feature
v2.3612 May 2026

Sub-workflows as tools

Agents can invoke other workflows as typed tools. The author defines the vocabulary; validation, HITL gates and audit are wired in at the workflow boundary.

Feature
v2.3528 Apr 2026

Recursive cost rollup for agent.run

Parent budgets now include every nested agent's spend, every sub-workflow's tokens and every external tool call. One number per run, top to bottom.

Improvement
v2.3414 Apr 2026

Communications

Every message a workflow sends, captured with recipient, delivery status, preview and a jump-back to the sending step.

Feature
Built in publicFull changelog →
§09  /  Begin

First workflow running in ten minutes. Either door.

For engineers

Install the SDK.

Author in Python, test locally, deploy to the same engine the canvas uses.

$pip install lyhnis
Read the docs →
For operations

Open the canvas.

Drag activities, place your approval gates, hit run. No local setup, same execution layer.

Book a demo →Book a walkthrough
See the platform tour →
Lyhnis - Automate. Orchestrate. Elevate.