Skip to content
Pyrana

Agentic Apps

Full-stack applications, not just agents.

An Agentic App is a full-stack business application in which people and agents work over the same pages, data, knowledge, and outputs. It is one App configuration on the platform: the surfaces where people work, the targets the App performs, the tool sources it binds, the resources it publishes, the access it grants, and the knowledge it preloads. Every call, from every door, passes one gate under one identity, one authorization model, and one audit record.

three callers · one target · one gate
one call refused at the gate · absent from results
App UI
Copilot
API
MCP
Schedules
admission
who · authority · data · approvalAgentic AppPyrana HarnesscortIQ

00Inside an App

Apps: full-stack applications, not just agents.

Pyrana runs whole business applications, not just agents: the pages people work in, who they are, what they may see and do, and the agents, data and results behind them. People and agents work over the same pages, data and results, through one gate.

Block 5 on the platform picture, opened up. Unpack it into its seven parts, follow one request from the door to the record, then fold it back into one configuration.

5Inside the block

Apps: full-stack applications, not just agents.

Pyrana runs whole business applications, not just agents: the pages people work in, who they are, what they may see and do, and the agents, data and results behind them. People and agents work over the same pages, data and results, through one gate.

Where people and systems come in

Pages and copilot
the App's pages, built from Pyrana's page components, with a copilot beside each that acts as the person
Personal pages
a page a person asks for, built and governed like any other; read-only for now
API and MCP
other systems, and any assistant acting as the user
On a schedule
runs that start without anyone asking

One gate, access in layers

Company sign-in
the company's single sign-on; each client kept apart
App membership
only members of the App can use it
Roles
what each role may do in the App
Only their entities
each person sees only the entities they may; the rest is absent, not refused
Approval by a person
calls that change things wait for a named group to approve, as the policy says

One request, one path

  1. Ask01
    from a page, the API, a schedule or the copilot
  2. Identify02
    one identity, the person's own
  3. Check access03
    layer by layer, decided on the server
  4. Run04
    an agent, a workflow or a data call
  5. Publish05
    a versioned result the App keeps
  6. Record06
    one audit record, the same for every door

What it brings together

Agents
specialists, each in one governed loopinside an agent →
Workflows
durable runs that fan out to agents per entityinside a workflow →
Data and calculations
named data calls to the company's systems (REST, ODBC, MCP)numbers by code →
cortIQ knowledge
the company knowledge the App starts with, and searches during a runcortIQ →

Application state

Extensions
the business's own service, in the same cluster, behind the same gate
Plans and decisions
kept where no other system has a home; people and agents change them only through the App

What it keeps

Versioned results
every output kept as a version; read by pages, people and agents within their access
One audit record
who did what, when, through which door

Released in steps

Push
the configuration becomes a fixed version; nothing changes yet
Activate
the App's owner switches everyone to the new version
Deploy
the pages ship on their own, separately governed
Roll back
the App's owner can switch everyone back to an earlier version
9 / 16
Go deeperBack to the platform picture2 min

01Surface, target, door

One target, declared once, reachable from every door.

A surface is a declared page where a person works. The platform knows what the person is looking at and hands it to the agent as exact page context. A target is an operation the App can perform, declared once. A door is how a call arrives: the App's own pages first, then the API, MCP from any agent as the user, a schedule, an external event, and the copilot for auxiliary analysis.

In most stacks each door grows its own authorization check, its own audit shape, and its own bugs. In an App, every door leads to the same gate, the same authorization layers, and the same record. The native runtimes of agents, workflows, tools, and client code are preserved; the contract around them is shared.

Project Portfolio

Project Portfolio

What is in flight, and how healthy it is.

25 tracked projects

Total projects

25

Value captured

$4.5M

28% of planned

Budget

$5.5M

of $10M planned · $4.7M under

Backlog1

PRJ-0015

Retail media measurement

PM J. Amara

+ Add to chat

Charter1

PRJ-0012

Supplier risk scoring

PM N. Bakhtiari

+ Add to chat

Execution2

PRJ-0006

ERP integration hardening

PM M. Oyelaran

Move to Production · awaiting release manager

PRJ-0007

Field service scheduling

PM H. Baptiste

+ Add to chat

Value realization1

PRJ-0018

Contract lifecycle rollout

PM C. Vandermeer

$240K captured

The project portfolio App. A manager drags a card, the copilot moves one on request, and a nightly workflow promotes idle projects: the same target, the same gate, three identities in the record. Illustrative.

02One target, five doors

Five callers. One gate. One record shape.

The same target is called five ways. Each caller passes the same gate, the same authorization layers, and the same approval policy, and lands in the same audit shape. Only the identity changes. A workflow that hits an approval threshold waits for a person, as a page or a copilot call would.

one operation · five doors · it-pm@v9
op=project.stage.transition

A project manager drags ATLAS from Staging to Production.

user:pm.sato SSO · profile:release.manager

  1. gate
  2. authorization
  3. approval policy
  4. operation
  5. audit record
01actor=user:pm.sato op=project.stage.transition policy={ approval.stage.production }@v3 result=appliedlane release.managers · k.osei · 09:14:02Z
Invariantop=project.stage.transitionpolicy={ approval.stage.production }@v3one record shapefive actors

03The App configuration

Six sections in one configuration.

Everything the configuration names already exists in the platform. Agent configuration is plain language. Workflows are declarative.

Surfaces

Declared pages where people work. A surface reads resources at exact versions and hands the agent the page context: page, entity, period, resource versions.

Targets

Operations the App performs: agents, workflows, and direct operations. Declared once, reachable from every door, through one gate.

Tool sources

REST, ODBC, MCP and MCP gateways, Databricks, Snowflake, Drive, OneDrive. Bound per agent and scoped to the job. Each call authorized and audited.

Resources

The outputs the App publishes: versioned, immutable, attributed. A stale publish is refused. Pages read an exact version.

Access

Access profiles (read, run, approve), scope entitlements on entities, projects, and review queues, and approval lanes for consequential actions.

Knowledge

Standing sets of Context Units that preload before the first turn, and context search the agent calls mid-run.

04Lifecycle

Push, activate, deploy: three states, separately governed.

Push compiles the App configuration into an immutable version and registers the App identity; it does not activate. The compiler resolves every referenced agent, workflow, tool source, and extension to an exact identity or digest and checks that every surface maps to a declared target. Activate moves the active pointer, is audited, and requires an App owner. Rollback is an activation of a prior version. Deploy ships a frontend image and registers and activates nothing.

finance-close · App configuration
compile → version → activate
# Illustrative App configuration (excerpt). Pyrana Capital is a synthetic portfolio.
app_key: finance-close
version: v14                 # compiled, content-digested: sha256:3f9a71c2…e08b
surfaces:
  monthly-analysis: { path: /close/monthly, reads: [close.summary, variance.report] }
targets:
  monthly_analysis: { publishes: [close.summary, variance.report], doors: [page, copilot, api, mcp, schedule] }
  ledger.journal.post: { doors: [page, copilot, mcp], approval: approval.journal.amount }
agents:
  close-reviewer: { model: provider/model, tools: [ledger.accruals.list, ledger.journal.post] }
workflows:
  monthly-close: { schedule: "0 2 * * 1-5", fan_out: { agent: close-reviewer, per: entity } }
tool_sources:
  ledger: { kind: odbc, binding: erp-finance }
resources:
  close.summary: { versioned: true, stale_publish: refuse }
access:
  profiles: { controller: [read, run, approve] }
  entitlements: { controller: [entity:US-01] }
  approval:
    approval.journal.amount: { when: "amount >= 25000 USD", lane: controller-approval }
knowledge:
  standing_sets: [close-policy, entity-calendars]   # cortIQ, preloaded before the first turn
activation: v14              # one pointer; rollback moves it back

Versions

Activation moves one pointer. Rollback moves it back. The version itself never changes.

For engineers and architects5 min

05Access in layers

Five layers, decided on the backend.

Tenant is a hard boundary. App membership says the caller belongs to this App. An access profile says what the caller may do: read, run, approve. A scope entitlement says on what: an entity, a project, a review queue. Approval lanes route consequential actions to a named group. Every layer is decided on the backend; the page only reflects it.

Reading a record and approving a change are two different permissions, and a queued request is visibly different from a posted entry. A child call must stay inside its parent's pinned authority and pass live authorization, so a policy change made after the parent started can still deny a later child. The user's own principal passes through to data platforms such as Snowflake and Databricks, so warehouse-side policies apply to the same person.

access layers
top to bottom, every call
tenant
hard boundary · row-level security in Postgres
App membership
the caller belongs to this App
access profile
read · run · approve
scope entitlement
an entity, a project, a review queue · OpenFGA relationship checks
approval lane
consequential actions route to a named group
extension token
narrowed, short-lived delegated token for a client-owned service
Non-disclosureunauthorized items are absent, never denied
extension manifest
pinned at activation
# illustrative extension manifest (excerpt)
extension: it-pm
digest: sha256:b71d…4c02
protocol: 1
routes:
  - { method: POST, path: /projects/{id}/stage, operation: project.stage.transition,
      capabilities: [project.write], effects: [materialize, audit, tool_source.invoke] }
mcp_tools:
  - { name: project_change_stage, operation: project.stage.transition }
outbound:
  - { tool_source: clover, operation: projects.sync }   # platform-held credential
migrations: { required: 7, applied: 7 }
Never held by the extensionexternal credentialsretry authorityplatform secrets

06Extensions

Client-owned services, in the same cluster, behind the platform.

Configuration composes a great deal from shared primitives. It does not replace a client's domain model. An extension is a client-owned durable backend service deployed in the same cluster, built with the platform library that handles authentication and authorization up front. It is not publicly accessible and is reachable only through the platform. It publishes a content-digested manifest, receives a short-lived delegated token on every call, runs its own transaction, and returns typed effects. Outbound actions are performed by the platform with platform-held credentials.

Two examples in production: a project portfolio tracker with custom business logic and its own durable storage, and a governed browser capability that logs into SaaS tools without an API and captures control evidence.

Go deeperHow it works, step 01: the App configuration2 min

07Personal pages

A page a person asks for, compiled and governed.

The copilot is auxiliary to the App's pages: it answers questions about what is on screen, and it is the pathway to personalization. A person asks it for a page. The copilot inspects the rendering contract and the resources and read capabilities the person may use, authors the page, and the backend compiles it: no network, no imports, no storage, no authority. The compiled page is saved as an immutable, parent-linked revision, and the browser renders it with every read still authorized.

Personal pages are read-only by default. App-wide publication of a generated page is a privileged path, reserved for App owners.

Pyrana Capital Finance / My Surfaces / Materials cost, PMW vs MWM

Materials cost, PMW vs MWM

Last six months, with the commentary underneath. Private to J. Okafor.

Personal pageread-only · revision 3

PMW · materials cost

USD thousands

JanFebMarAprMayJun

MWM · materials cost

USD thousands

JanFebMarAprMayJun

Commentary

read from monthly_pack at exact versions · PMW v4 · MWM v2

PMW's purchase price variance breached in March and April and has since eased. MWM tracks plan. Every read on this page passes the same authorization as the App's own pages; the page can show nothing its owner could not see elsewhere.

Illustrative. Pyrana Capital is a synthetic portfolio.

08Three scenarios

Revision, non-disclosure, approval.

Revise, publish, refuse a stale overwrite

An analyst on the Monthly Analysis surface asks the copilot for the June narrative. The copilot cites the resource at its exact version, v1, published by the agent run. She asks for a revision and approves it; it publishes as v2, attributed to the copilot on her behalf. A workflow rerun that started earlier tries to publish against v1 and is refused. Nothing is overwritten.

No existence leak

An analyst entitled to one operating company asks the same copilot for the group roll-up. Listings show the entitled entity only. A direct request resolves as not found. Nothing in the response reveals that the roll-up exists.

An intercompany adjustment that waits for the right approver

The reconciliation workflow finds an intercompany mismatch between PMW and MWM and proposes an adjusting entry above threshold. The invocation freezes and queues in the intercompany lane. The PMW approver can act. The MWM approver sees the request but cannot act, because approving is a separate entitlement from reading. Until the PMW approver decides, the entry is queued, visibly different from a posted entry, and nothing is posted.

Illustrative. Pyrana Capital is a synthetic portfolio.

09Questions

Frequently asked

What is inside an Agentic App?
One App configuration with six sections: surfaces, targets (agents, workflows, direct operations), tool sources, resources, access (profiles, scope entitlements, approval lanes), and knowledge (standing sets, context search). Plus the frontend experience. Everything the configuration names already exists in the platform.
How does an App change safely?
Push compiles the configuration into an immutable version and registers the App identity without activating it. Activate moves the active pointer, is audited, and requires an App owner. Rollback is an activation of a prior version. Deploy ships a frontend image and registers and activates nothing.
Can an agent in one App reach another App's data?
Only through that App's targets, through its gate, as an identity that App admits. Access layers are per App, and unauthorized items are absent from results, never shown as denied.
What does an extension own?
An extension is a client-owned durable backend service deployed in the same cluster, built with the platform library that handles authentication and authorization up front. It owns its domain types, state, and transactions. It is not publicly accessible and is reachable only through the platform. Examples: a project portfolio tracker with custom business logic and its own durable storage; a governed browser capability that logs into SaaS tools without an API and captures control evidence.
Can an App be moved to another runtime?
An App is one YAML document plus the agents, workflows, and tool sources it binds. Agent configuration is plain language, workflows are declarative, and Context Units are the client's data and can be exported. There is no industry-standard interchange format, so there is no export button; translating an App to another runtime is a reading exercise, not a rebuild. The platform runs in the client's own cloud subscription.
What is a personal page?
A person asks the copilot for a page. The copilot inspects the rendering contract and the resources and read capabilities the person may use, authors the page, and the backend compiles it: no network, no imports, no storage, no authority. It is saved as an immutable, parent-linked revision and rendered with every read still authorized. Read-only by default; App-wide publication is a privileged path, reserved for App owners.

One App configuration. About a week to stand up.

With clean data available, the frontend experience is the main effort.