AI end-to-end
for business operators
Describe it in plain language. The Cascade planner builds the plan, durable agents run it, eval grades it, the loop improves it.
Agents decide the flow.
Agents run it as real operations — governed, durable, improving by pull request.
The brain is a git repo you own. The engine — durable runtime, one human approval queue, 130+ tools over MCP, graded self-improvement — is inherited, not built. Self-hosted: your repo, your keys.
# revenue-recovery
run #4127 · triggered
- pull the week’s failed payments
stripe.payments.list — 47 found
- retry each one, safely
pod killed mid-retry
resumed the same turn — 41 recovered, settled exactly once durable
- anything over $500 — ask finance first
paused — one approval card → @finance
approved governed
- post the recovery summary
posted to #revenue
- improve this playbook from what happened
PR #214 edits this file — graded 0.94, merged self-improving
You wrote six lines. The engine did the rest — and every mechanism it used is proven below, with the file behind it.
Hosted platforms
Run agents on their infra, their model, their console.
Omnislash
Your repo, your policy gate, any vendor’s agents.
The agent-OS wave
Runs anything, governed by nothing.
Refunds, pricing exceptions, incident response — the knowledge that today lives in fragments and in people. Omnislash keeps it as a living, versioned map the engine can read and act on, kept current without anyone curating it. Memory is searched and injected before every turn, so an agent acts on what the company knows, not on what fit in one prompt.
Those four folders are not a metaphor for a UI — they are the UI. Here is the same brain as the engine renders it: what it remembers, the jobs it knows how to run, the skills it discovered, and the schedule it keeps.
Same seven screens, same build, in a pocket — the brain is readable from a phone because a company’s knowledge is consulted where the question is asked, not where the desk is.
Most “make your knowledge executable” tools stop at the skills file. The harder question is the one only production asks: how does an agent run it safely against real systems? Omnislash answers it — capability grants with TTL, a human queue on every risky action, a per-run sandbox, and a definition-of-done check on the output. The knowledge is the easy half; the safe execution underneath is the half that’s already built. See the mechanisms →
Same relationship a Next.js app has to its platform: the brain — markdown prompts, capability declarations, planner methods, one omnislash.config.ts — is yours, diffable and self-hosted. Everything else you inherit, not build: every mechanism this page goes on to prove, plus the stack that’s normally a 12-month project. No queue wiring, no Postgres schema, no Restate handler, no retry logic, no dashboard.
you wrote
2 files · diffable · yours
you inherited — did not write
Data & execution
Observability
Operations
the stack that’s normally a 12-month project — ships with the engine
2 authored 22 inherited — the 12-month project 1 : 11
None of that is a roadmap. Here is the inherited half as it actually renders — the health page, the doctor, the shell, the model fabric, the integrations, the tool registry, the capability set, the environment and the settings, on the build this page was written against.
The brain is the part that’s yours. The engine is the part you’d hate to build — and it’s already built, by one person, running in production.
receipt · brain-example/constitution/Scenarios/Engineering/daily-documentation-sync.scenario.md · docs/replay.md (record & replay any run at zero token cost)
Autonomy is only safe if you can intervene, so intervention is a first-class mechanism on both ends. Take the wheel: step into any live agent’s conversation while it works, steer it with messages, and hand control back — no cancelling, no restart, the session keeps its context. Or let go: a Boss Agent resolves the queue by policy — auto-approving low-risk grants, routing questions to specialists, escalating only what truly needs you. And wherever you sit on the dial, everything lands in an operational record you own — every action attributed to its agent, run and cost, every trace replayable, on your infrastructure, next to your data.
Step into a live run, steer it by chat, hand control back. No cancel-and-restart — the session keeps its context.
You approve the risky steps. Everything else just runs.
A Boss Agent works the queue by policy — approves low-risk, routes questions, escalates only what truly needs you.
Most frameworks give you one lever: cancel. Step away and the run is unsupervised; step in and you lose everything it did. Here both moves are non-destructive — you can drop from full manual to full autonomous and back without ever throwing away work in flight.
The wheel and the boss are the same primitive seen from two ends: one durable conversation you can always reach into, and a queue an agent can clear when you’d rather it didn’t reach you at all.
The record has an outside edge. When a run makes something a person should actually read — a report, an audit trail, a diff — the agent doesn’t paste it into a chat and hope. It publishes the file and hands back a URL: one link, revocable, expiring when you said, operator-only if you asked. The link outlives the run that made it.
One rule there looks paranoid until you see the attack it closes. A publication may change its bytes, never its file type — otherwise whoever holds a link to a rendered report could turn that same trusted URL into an arbitrary page on your own domain.
every artifact a run produced, content-addressed and publishable
It’s not a dashboard you check after the fact — it’s the operational surface the agents run inside, mobile-ready, because the approval that unblocks a 3am run shouldn’t wait for you to reach a laptop. Agents do the work. You own the audit trail, the policy, the data, and the repo.
AI end-to-end handles 80–90% of operations. The rest eventually need more predictability than autonomy gives. Most platforms force an all-or-nothing choice; Omnislash gives you a dial per workflow — keep the easy 90% AI-managed, and pull the mission-critical ones down to a locked blueprint or hand-written code, on the same runtime, same agents, same governance.
for business operators
Describe it in plain language. The Cascade planner builds the plan, durable agents run it, eval grades it, the loop improves it.
Agents decide the flow.
for power users, analysts
Let AI draft the plan, then freeze it: export the blueprint, edit tasks and DoD, lock phases. Deterministic — no re-planning per run.
AI drafts, you freeze the structure.
for software engineers
Write a typed Restate pipeline in TypeScript. Every step, branch and error handler is code; agents are called as typed steps, not autonomous actors.
You own the flow; agents run steps.
describe & run → lock the blueprint → engineer it — per workflow, not per account
| platform | tier 1 | tier 2 | tier 3 |
|---|---|---|---|
| n8n · Zapier · Make | — | visual | — |
| LangGraph · CrewAI | yes | — | partial |
| Temporal · Restate | — | — | yes |
| Omnislash | yes | yes | yes |
Most platforms are built for exactly one of these tiers; Omnislash spans all three, with a path between them. A Tier-3 pipeline isn’t a separate product — it inherits the entire runtime: the same agents, eval, memory, tools, HITL and scheduler the AI tiers use, called as typed steps.
You never outgrow it — you escalate into it.
all three tiers land in the same run list, graded the same way
Two of these didn’t start in the column they’re standing in — they were escalated a tier, one workflow at a time, on the same instance. The other 61 never moved, and nothing had to be migrated for them.
Machine-readable interfaces — catalogs, APIs, MCPs — are what let an agent work without a person driving. Omnislash ships that surface both ways: the engine’s 130+ tools are discoverable and callable by any agent over MCP, and the same declarative pattern makes your own product agent-ready — declare it in config, the engine provisions and governs it.
The surface
what an agent finds when it looks
Headless OAuth
the redirect becomes a consent card
The card above is drawn. The real one is photographed below it. The full machinery — HMAC state, replay guards, one-shot PKCE, per-issuer DCR locks — is one tab away: Headless OAuth →
ways in
ways out
None of that surface is a diagram of an intention. Every tool an agent can call is a row with a declared capability, a risk level and a HITL policy — and every call it makes lands in the statistics beside it.
Most automation is an open loop: it runs, and a human checks later. Here the loop closes on the record — every action lands in one searchable activity stream and a real control plane, and a failed check branches a recovery agent that patches the plan and resumes. And when the engine edits its own playbook, the edit arrives as a pull request. The lesson is a file in your repo; the improvement is a diff. Here is one.
the diff — PR #214, off the run at the top of this page
constitution/Scenarios/Finance/revenue-recovery.scenario.md
The verdict is advisory. Merging is a button only you press — and so is the revert.
the fence — self-improvement can’t game its score
Every proposal that survives the fence queues up in one backlog . The rubric fence and its cited receipts are one tab away — Self-improvement →
The ring is a diagram of something already running. Here is one lap of it on the record: the run list, a run in flight, its tasks, what it cost, the grade it earned, the change it proposed about itself, and the backlog that change lands in.
Eleven mechanisms a skeptical staff engineer would want to see before trusting an agent with production. Each names the failure in your vocabulary, the exact primitive that fixes it, and a test you could re-run. Use the index to jump.
One of them no lab will ship: the labs each orchestrate their own agents. Omnislash runs all of them — claude, codex, opencode, API models — under one policy gate, with cross-harness fallover mid-task. Model fabric → What each one costs a turn →
Durability · the failure every framework ships
A HITL wait in most frameworks is a blocking thread or a from-scratch rehydrate, so a crash mid-wait loses the turn. Here the entire session is one Restate virtual-object invocation, keyed by agentId: it owns the prepare, the subprocess turns and a multi-day human pause, suspended at zero compute while still holding its exclusive per-key lock. It journals the resume handle via ctx.set before ringing the lifecycle bell, and a finally clears it on every exit — so single-writer ordering, callback identity and exactly-once settlement fall out of the live invocation for free, not rebuilt across a rehydrate.
receipt · agent-vo.ts:639-666 (ctx.set before the bell) · real-Restate test agent-vo.integration.ts:508-595 asserts exactly-once settlement across a kill.
Durability · the bug only production shows you
The agent row still reads idle — current_invocation_id is projected only after the virtual object grabs its per-key lock. So control here never trusts the read model: stop, liveness and the HITL barrier all query Restate’s sys_invocation over SQL, which is ground truth. Two details prove this was learned in production, not whiteboarded: Restate serves binary Arrow IPC unless you ask for JSON, and a finished invocation lingers ~24h as completed — so the orphan reconciler filters status != 'completed' and re-verifies each run individually. A stale batch read can never mass-false-resume.
receipt · restate-client.ts:481-495,:274-311 · AgentController.ts:489-522.
Governance · the rogue-agent fear, as a database problem
A framework without a shared HITL ledger — which is nearly all of them — raises N prompts for N callers needing sign-off, by construction. Omnislash collapses them with one Postgres upsert — ON CONFLICT (dedup_key) WHERE status='pending', first-writer detected via xmax=0 — keyed on [subject, scenario, sorted-caps] with the producer omitted, so a pipeline, an agent and a workflow converge on one card. One approval fans back out to an awakeable, a paused virtual object and a workflow FSM, each wake idempotent. The decision is CAS-committed to Postgres before the grant is issued; die in that gap and a 15s reconcile sweep replays it — the human is never re-asked.
receipt · grant-dedup.integration.ts:34-158 · validateApprovalActions.ts:111-124 (forged-button rejection).
Isolation · “cool demo” → “I’d run it on my prod”
The Claude and Codex SDKs spawn their CLI internally and expose exactly one knob — an executable-path override — so the engine points it at a bwrap shim that execs the real jail: --ro-bind / / --proc /proc --unshare-pid --unshare-ipc --die-with-parent. It binds the per-run git checkout over /app/brain so every absolute path still resolves, and binds the artifacts root RW at its own sibling absolute path — so the agent’s declared output reaches the validator while a write to /app/brain stays trapped in a throwaway clone. The boot gate probes the exact namespace combo and refuses to start if it can’t actually jail.
receipt · bwrap-claude.sh:41-58 (verbatim argv) · artifactsTopology.integration.ts:115-161 (real-bwrap containment test).
Model fabric · the outage every subscription team has lived
resilience4j and opossum are in-process and threshold-only — every worker re-discovers the same dead upstream and burns its own retry budget. Omnislash turns the provider’s own wall-clock-with-timezone recovery string into an absolute instant (regex + Intl.DateTimeFormat) and an atomic Redis-Lua breaker pins the harness open until exactly that moment — the first worker to hit the wall makes every other process fast-skip it. The runtime itself is one string in one TEXT column. And when a chain falls over mid-task, the partial tool-use transcript is rebuilt from your own Postgres into vendor-neutral markdown that tells the successor: read this, do not redo committed work.
receipt · redisCircuitBreaker.integration.ts:210-214 · handoff.ts:92-102.
Model fabric · the bill nothing else in your stack itemises
A turn opens with a prefix — the tool array, the system prompt, the memory envelope — that is paid on every single turn and never shrinks. A context-window meter shows one total for the last turn and cannot attribute a byte of it. Omnislash itemises that prefix per role by assembling the real prompt rather than a description of one, then names the lever rather than the number: this role’s skills catalog is a sixth of its prefix, give it a focus list. Two figures are never conflated — what is actually on the wire on turn one, and what is priced but deferred behind tool search. And the difference between harnesses is the part only a multi-vendor runtime can see at all: of the three the engine drives, exactly one hides tool schemas behind a search tool, so the same brain config that is a rounding error on one is tens of thousands of tokens a turn on another. Anything the report knows exists but could not price is counted unmeasured, never as zero — the total is an admitted lower bound, not a number that quietly omits the thing you opened it to check.
receipt · mcp-wire.ts:164 (the deferring-harness list is one entry long), :232 · thresholds.ts:14-42 (every judgement number, with the rationale beside it) · estimate.ts:28-31 (two chars-per-token buckets, ≈±15%, marked ≈ on every surface) · docs/context-budget.md.
Planning · the silent corruption one-shot planners ship
So one-shot planners ship a plausible, broken plan the moment the LLM silently drops task-3 while mapping capabilities. Omnislash plans in up to 11 independently schema-constrained hops, and every enrichment merge runs assertTaskCoverage — diffing the stage’s task IDs against the live set and throwing with the exact missing ID, one targeted re-prompt, then escalate. Each stage snapshots to Redis before the LLM call, so killing the worker at stage 7 resumes at stage 8 with zero re-spent tokens. The final-review stage critiques the real assembled blueprint, but its output schema has no add-task or delete-task field — the worst self-review failure mode is impossible by construction.
receipt · stageSchemas.ts:311-340 (the 5-field review whitelist) · buildPipeline.ts:71 (coverage assertion).
Isolation · live edit vs pull request, decided at the git layer
The brain stays live: on the default rung an agent writes straight into the running checkout and a sync daemon commits and pushes — the agent never pushes. What makes that safe is that the daemon commits exactly a declared push surface and nothing else, so a write outside it is not merely “not hot”, it is never persisted — the container is writable, the write succeeds, and it vanishes on the next recreate. That silent loss is now a boot-time failure. A path in the set must be a directory, because a sparse-checkout anchor never matches a blob and a file there would lose every write. Two classes are forbidden outright, for blast radius rather than boot order: docker/ — an agent that can commit a compose override can mount the docker socket into its own container — and .github, where an edit is arbitrary code on the runner. Everything else is cold, and a live agent that needs one delegates to a rung that commits and opens a PR.
receipt · brain-paths.ts:114-145 (the forbidden set, split structural vs blast radius) · project.ts:721-773 (the directory assertion, and the second door through contentRoots) · docs/agent-isolation.md (the ladder, and what each declaration site actually does).
Self-improvement · autonomous, because it’s fenced
Before any self-improvement PR is validated, the worker runs gh pr diff --name-only and closes it — marking the improvement failed — if any changed path falls under constitution/Evaluation/ or constitution/Improvement/. The optimizer physically cannot edit the eval methods or improver prompts it’s graded by. Surviving edits face a measured A/B: rerun the scenario as N challengers over historical inputs the improver never saw, adopt only on a strict majority scoring ≥ baseline (ties and dead runs count as regressed), and on regression auto-open a mechanical revert PR. A regressed edit also distills a “do NOT retry this mutation” lesson into vector memory.
receipt · protectedPaths.ts:11-21 (the fence) · validationVerdict.ts:15-39 (strict-majority verdict). Designed against DGM Appendix H + METR reward-hacking reports.
Depth · the protocol most frameworks skip
Most agent frameworks treat MCP servers as no-auth or static bearer tokens. Omnislash implements the MCP SDK’s OAuthClientProvider so the official auth() orchestrator runs the full RFC 9728 / 8414 / 7591 / 7636 / 8707 flow unchanged — except redirectToAuthorization() doesn’t redirect a browser, it mints a durable oauth_consent row a human approves later from Telegram. The protocol scars prove someone got bitten by the real spec: HMAC-signed stateless state, a SET-NX replay guard, a GETDEL one-shot PKCE, a per-issuer DCR lock, and an RFC 7009 revoke if the token-persist fails. That consent card is the same hitl_interactions row as every other human pause.
receipt · mcp-oauth-provider.ts:148,:419-477,:303-371 · oauth-state.ts:119-189.
Depth · the capability that needs a fence, not a disclaimer
Connect a bot to Telegram Business and the engine runs turns on messages from the private chats you chose, replying on your behalf with no bot chrome at all: no status cards, no keyboards, no typing indicator, no reactions — one plain message. A failed turn is silent for the other person: no error bubble, nothing appended to a half-streamed answer; you get one plain note in your own control DM, and approval cards reroute there too. The connection id is a credential, never identity — the platform rotates it whenever you edit the connection — so state is keyed on (chat, bot, owner) and survives a disconnect and a rotation. The agent reads the real history through MTProto, including messages from before the bot existed that the Bot API can never see, and that is exactly why the fence exists: under a business chat every MTProto call is pinned to that one conversation. An account-wide tool, another chat’s id, or an explicitly named account is refused permanently. A counterpart-facing agent must not become a window into your whole account.
receipt · helpers.ts:239-262 (the scope refusals, verbatim) · telegram-error.ts:35 (classified permanent, not retryable) · businessFailureNotice.ts (you get the failure, they don’t) · docs/secretary-mode.md.
A headless browser for agents, prompt-injection defense, transcription failover, multilingual memory, a database browser, service discovery — the surface is enormous because it’s years of plumbing you’d otherwise build. Focus a category below; everything else steps back.
116
capabilities · shipped, not roadmap
The unglamorous half of that list, photographed — the boss run, both roster layouts, the cost controls, the artifact store, the raw event log, the environment and the settings page.
Still not the whole list — the exhaustive inventory lives in docs/features.md, and every screen of the control plane is one click away . Bring me one operation →
Pick one operation that should run itself. Tell me what it is, who owns it today, and where it breaks. I'll map it to a brain and a scenario and walk you through how it runs — durable through a crash, gated at every permission, graded against a definition of done. I build these, and I built the runtime they run on.
Prefer to dig in first? See the packages & image
Send me the one operation: what it is, who owns it today, and where it breaks. It comes straight to me — I read every one and reply myself.
Talk to me about your operation