§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.