Osyrin

The trust layer for agentic applications.

Agents are non-deterministic. Osyrin contains that non-determinism inside a compiler, a state machine, and a claims-based execution envelope—so you can deploy them where it actually matters.

Built to be deployable

Constrained by construction

Agent behaviour is defined in .osy—a purpose-built language with compile-time validation. If it doesn't satisfy the constraints, it doesn't compile.

Auditable by default

Every agent invocation runs inside a stateful machine with claim-based wait states, retry budgets, and a complete execution trace. Nothing is opaque.

Grounded by retrieval

Built-in RAG means agents reason over your data, not the model's training set—with the same compile-time validation as the rest of the workflow.

Yours to own

Bring your own LLM keys. Bring your own models. Develop with Claude Code, Cursor, or whatever fits. Osyrin is the substrate, not the silo.

A small .osy example. An agent classifies an expense against policy. If the agent's ClassifyExpense tool result resolves cleanly, the workflow transitions automatically. If it flags for review—or the agent fails repeatedly—the same workflow routes to a human, in the same state machine, with full audit trail.

workflow ExpenseReview:
  target:
    entity = Expense
    property = Status
    variable = input
  autoStart = true
  logic:
    waitstate Classifying:
      message = "Classifying expense against policy"
      on enter:
        askAgent ExpensePolicyAgent:
          entity: Expense = input
          message = "Classify this expense against company policy"
          completes:
            Decision = ClassifyExpense
        commit
      wait for:
        Decision:
          ttl = "30s"
          retries = 3
      on completed Approved:
        transition Approved
      on completed FlaggedForReview:
        transition ManualReview
      on exhausted:
        transition ManualReview

    waitstate ManualReview:
      message = "Awaiting manager decision"
      wait for:
        ManagerDecision:
          manual:
            options = Approved, Rejected
            dialog:
              view = RejectionReasonView
              entity = RejectionInput
              result:
                input.RejectionReason = Reason
          ttl = "48h"

    waitstate Approved:
      message = "Approved"
      terminal = complete

    waitstate Rejected:
      message = "Rejected"
      terminal = complete

Osyrin is not yet publicly available. Public access will be granted soon.

Questions or want to get in touch? Reach out at contact@osyrin.com.