v0.9 · preview
Get started

Quickstart

Go from an empty account to a live operator that takes a real, governed action, then read the receipt that proves what it did. Five steps, about ten minutes. You can run the whole thing against a sandbox connector first, so no live system is ever touched until you say so.

5 steps ~10 minutes Needs Node 20+ No new hardware
i
Before you begin

You need an email address and a terminal with Node 20 or newer. Everything below uses the sandbox by default, the model proposes and the executor disposes exactly as in production, but actions run against a simulated system so you can watch the full loop safely.

1

Create an account

Create a workspace from the Marketplace or with the CLI. A workspace is your tenant, its data is provably walled off from every other tenant from the first row written. Grab an API key from Settings → API keys and export it so the CLI and SDK can use it.

bash
# export the API key from Settings → API keys
export FIBRIC_API_KEY="sk_live_…"
export FIBRIC_WORKSPACE="acme-ops"
!
Keep keys out of source

Store the key in your shell profile or a secrets manager, never commit it. A key is scoped to one workspace and can be rotated from the dashboard at any time.

2

Install the CLI and SDK

The CLI drives your workspace from the terminal; the SDK is how you define operators and connectors in code. Install both, then confirm the CLI can reach your workspace.

bash
# global CLI + project SDK
npm install -g @fibric/cli
npm install @fibric/sdk

# confirm the CLI sees your workspace
fibric whoami
$ fibric whoami workspace acme-ops tenant_id t_8f2a…c901 (walled off) plan preview ✓ authenticated
3

Connect your first system

A connector plugs Fibric into a system you already run and is built on MCP. For the quickstart, connect the sandbox order system, it speaks the same capability interface a real order system would, so nothing about the rest of the quickstart changes when you later swap it for the real thing.

bash
# browse what is installable, then add the sandbox order system
fibric connectors search orders
fibric connectors add sandbox-orders --as orders

# confirm the capabilities it now exposes
fibric capabilities ls
$ fibric capabilities ls CAPABILITY CONNECTOR STATUS orders.read sandbox-orders ready orders.hold sandbox-orders ready orders.notify sandbox-orders ready

Notice that you bound the connector to the role orders. Operators ask for the capability orders.hold, not for a vendor by name. That indirection is what makes swapping one order system for another a config change rather than a rewrite.

4

Define an operator and a guardrail

An operator is a named AI worker that senses through connectors, reasons with a base model, and proposes action. It never acts directly. A guardrail is the policy your deterministic executor enforces before any proposed action runs, fail-closed, so anything the policy does not explicitly allow is refused.

Create operator.ts. This operator watches orders and proposes a hold on any order that will miss its ship date.

operator.ts
import { defineOperator } from "@fibric/sdk";

export default defineOperator({
  name: "ship-risk",
  // what the operator is allowed to ask for
  capabilities: ["orders.read", "orders.hold", "orders.notify"],
  goal: "Hold any open order that will not ship on time, and notify the owner.",

  async sense(ctx) {
    return ctx.orders.read({ status: "open" });
  },

  // the model REASONS over what it sensed and PROPOSES a plan.
  // it returns proposed actions, it never executes them itself.
  async reason(ctx, orders) {
    return ctx.propose(orders
      .filter(o => o.willMissShipDate)
      .map(o => ({ capability: "orders.hold", args: { id: o.id } })));
  },
});

Now the guardrail. Policy is the deterministic half of the loop, it disposes of what the model proposes. This one allows holds and notifications but caps how many orders a single run can touch, so a runaway plan is structurally impossible.

policy.yaml
# fail-closed: anything not allowed here is refused
version: 1
allow:
  - orders.hold
  - orders.notify
limits:
  orders.hold:
    max_per_run: 25      # cap the blast radius of any one run
    single_flight: by_order_id   # one in-flight action per entity
require_receipt: true

Deploy the operator and attach the policy in one command.

bash
fibric operators deploy ./operator.ts --policy ./policy.yaml
!
The model proposes, the executor disposes

Even if the model proposed something reckless, the deterministic executor checks every proposed action against this policy before it runs. No policy match means no action. There is no path for the model to act around the guardrail.

5

Watch it act, then read the receipt

Run the operator once and tail its receipts. Each receipt is the immutable record of one action: what was proposed, the policy decision, and the outcome. This is what makes everything Fibric did logged and explainable after the fact.

bash
# run the operator once, then stream its receipts
fibric operators run ship-risk --once
fibric receipts tail --operator ship-risk
$ fibric operators run ship-risk --once sensed 42 open orders reasoned 3 at risk → proposed 3 holds disposed policy allow · within limit (3/25) · single-flight ok acted 3 holds placed, 3 owners notified $ fibric receipts tail --operator ship-risk receipt rc_5b21 order SO-10884 orders.hold applied policy=allow idem=ok receipt rc_5b22 order SO-10901 orders.hold applied policy=allow idem=ok receipt rc_5b23 order SO-10912 orders.hold applied policy=allow idem=ok

Open any receipt to see the full record, the envelope that triggered it, the proposed plan, the policy evaluation, and the idempotency key that guarantees the same action is never applied twice.

bash
fibric receipts show rc_5b21 --json
json
{
  "receipt_id": "rc_5b21",
  "tenant_id": "t_8f2a…c901",
  "operator": "ship-risk",
  "capability": "orders.hold",
  "proposed_by": "model",
  "policy": { "decision": "allow", "rule": "orders.hold" },
  "idempotency_key": "ship-risk:SO-10884:hold",
  "outcome": "applied",
  "at": "2026-06-14T09:02:11Z"
}

What just happened

You ran the full Fibric loop. The operator sensed through a connector, reasoned over what it saw and proposed a plan, and the deterministic executor disposed of that plan against your fail-closed policy, applying each action once, idempotently, and leaving a receipt for every step. That is exactly the shape a production operation runs in, the only thing that changes is you swap the sandbox connector for a real one.

!
Go live

Replace sandbox-orders with the real connector for your order system, bound to the same orders role, and your operator and policy work unchanged. That is capability over connector in practice.

Next steps