Separation of duties for autonomous capital

Already have a trading agent?
Add Profit Engine Governor.
Keep custody. Keep control.

A paid, agentic capital-allocation API with deterministic controls. Submit candidates, live portfolio state, and explicit owner constraints; get back one verdict, the exact permitted amount, every risk check with observed vs limit, and hashes you can audit. It decides. It never trades.

Decision verdicts

ALLOCATE

Deploy new capital, capped at the exact permitted amount.

REDUCE

Cut an existing managed position. Never exceed the returned amount.

REJECT

A hard rule failed. Do not act on this candidate again.

HOLD

Temporary blocker or unselected this cycle. Stand down and re-ask.

A deterministic decision, rendered live

This card is produced by the same pure policy the paid endpoint runs, from the example request below. Identical input always yields an identical decision hash.

ALLOCATEpe-governor-policy-1.0.0

Permitted amount

$25,000.00

selected: cand_spot_btc_01

  • cand_spot_btc_01rank 1ALLOCATE
  • cand_eq_msft_02rank 2HOLD
Request hash
request a2a7c6d765b6ef70214374eef0f1ad0fc4276c754b69030219ecdad05ab6e468
Decision hash
decision 855dec83616b3c4363d24707604abf566e092ca8f4e67f7d5bff77007729bd68

Risk checks (observed vs limit)

  • portfolio_state_fresh15 / 120PASS
  • portfolio_state_not_future0 / 5PASS
  • reconciliation_currenttrue / truePASS
  • kill_switch_clearfalse / falsePASS
  • daily_loss_budget400 / 5000PASS
  • max_drawdown1.8 / 8PASS

How it works

1. Propose

Your agents emit up to 50 candidates on a common bus: lane, asset, side, requested notional, caller-supplied maximum loss and expected net edge, evidence status and expiry.

2. Govern

PE Governor applies one pure policy: state freshness, reconciliation, kill switch, evidence, loss budgets, reserve, notional caps and concurrency — then ranks and picks at most one winner.

3. Obey

Capital moves on your terms. Same request in, byte-identical decision out, with SHA-256 hashes of the canonical request and decision for audit.

Install the policy once

Wire the call ahead of any allocation at or above the owner threshold. Stop on REJECT or HOLD, and never exceed a REDUCE amount.

install-policy.txt
# Install once, obey always.
BEFORE any allocation >= OWNER_THRESHOLD_USD:
  decision = POST https://coinbase.solarly.ai/api/pe/v1/governor
  if decision.decision in ("REJECT", "HOLD"):
      stop()                                  # no order, no retry loop
  if decision.decision == "REDUCE":
      size = min(intended_size, decision.allocationAmountUsd)
  if decision.decision == "ALLOCATE":
      size = decision.allocationAmountUsd     # never more
  execute(size)                               # execution is 100% yours

Request and response payloads

Request — pe-governor-request.v1

request.json
{
  "schema": "pe-governor-request.v1",
  "requestedAt": "2026-08-11T22:30:00.000Z",
  "ownerId": "owner_demo",
  "portfolio": {
    "asOf": "2026-08-11T22:29:45.000Z",
    "reconciliationCurrent": true,
    "killSwitchEngaged": false,
    "equityUsd": 250000,
    "cashAvailableUsd": 90000,
    "grossNotionalUsd": 120000,
    "dailyNotionalUsedUsd": 30000,
    "realizedLossTodayUsd": 400,
    "drawdownPct": 1.8,
    "openPositions": [
      {
        "assetId": "ETH-USD",
        "lane": "SPOT",
        "notionalUsd": 20000,
        "managed": true
      }
    ]
  },
  "constraints": {
    "capitalReserveUsd": 25000,
    "installThresholdUsd": 1000,
    "maxCandidateNotionalUsd": 25000,
    "maxPositionNotionalUsd": 40000,
    "maxPortfolioNotionalUsd": 200000,
    "maxDailyNotionalUsd": 75000,
    "remainingLossBudgetUsd": 3000,
    "maxDailyLossUsd": 5000,
    "maxDrawdownPct": 8,
    "maxConcurrentPositions": 12,
    "maxConcurrentPositionsPerLane": 6,
    "maxPortfolioStalenessSeconds": 120,
    "minimumEdgeBpsByLane": {
      "EQUITIES": 25,
      "SPOT": 30,
      "FUTURES": 40
    }
  },
  "candidates": [
    {
      "candidateId": "cand_spot_btc_01",
      "sourceLane": "SPOT",
      "strategyId": "carry_basis_v3",
      "assetId": "BTC-USD",
      "side": "BUY",
      "reduceOnly": false,
      "requestedNotionalUsd": 30000,
      "maximumLossUsd": 1200,
      "expectedNetEdgeBps": 85,
      "evidenceStatus": "READY",
      "createdAt": "2026-08-11T22:28:00.000Z",
      "expiresAt": "2026-08-11T22:40:00.000Z",
      "metadata": {
        "venue": "primary",
        "confidence": 0.71
      }
    },
    {
      "candidateId": "cand_eq_msft_02",
      "sourceLane": "EQUITIES",
      "strategyId": "gap_fade_v2",
      "assetId": "MSFT",
      "side": "BUY",
      "reduceOnly": false,
      "requestedNotionalUsd": 12000,
      "maximumLossUsd": 900,
      "expectedNetEdgeBps": 40,
      "evidenceStatus": "READY",
      "createdAt": "2026-08-11T22:27:10.000Z",
      "expiresAt": "2026-08-11T22:45:00.000Z"
    }
  ]
}

Response — pe-governor-decision.v1

decision.json
{
  "schema": "pe-governor-decision.v1",
  "policyVersion": "pe-governor-policy-1.0.0",
  "generatedAt": "2026-08-11T22:30:00.000Z",
  "decision": "ALLOCATE",
  "selectedCandidateId": "cand_spot_btc_01",
  "allocationAmountUsd": 25000,
  "reasons": [
    "ALLOCATION_PERMITTED"
  ],
  "portfolioChecks": [
    {
      "check": "portfolio_state_fresh",
      "status": "PASS",
      "observed": 15,
      "limit": 120
    },
    {
      "check": "portfolio_state_not_future",
      "status": "PASS",
      "observed": 0,
      "limit": 5
    },
    {
      "check": "reconciliation_current",
      "status": "PASS",
      "observed": true,
      "limit": true
    },
    {
      "check": "kill_switch_clear",
      "status": "PASS",
      "observed": false,
      "limit": false
    },
    {
      "check": "daily_loss_budget",
      "status": "PASS",
      "observed": 400,
      "limit": 5000
    },
    {
      "check": "max_drawdown",
      "status": "PASS",
      "observed": 1.8,
      "limit": 8
    }
  ],
  "candidates": [
    {
      "candidateId": "cand_spot_btc_01",
      "decision": "ALLOCATE",
      "allocationAmountUsd": 25000,
      "rank": 1,
      "expectedAfterCostProfitUsd": 212.5,
      "reasons": [
        "SIZE_CONSTRAINED_BY_LIMITS",
        "ALLOCATION_ELIGIBLE"
      ],
      "riskChecks": [
        {
          "check": "evidence_ready",
          "status": "PASS",
          "observed": "READY",
          "limit": "READY"
        },
        {
          "check": "candidate_unexpired",
          "status": "PASS",
          "observed": "2026-08-11T22:40:00.000Z",
          "limit": "2026-08-11T22:30:00.000Z"
        },
        {
          "check": "maximum_loss_bounded",
          "status": "PASS",
          "observed": 1200,
          "limit": 30000
        },
        {
          "check": "remaining_loss_budget",
          "status": "PASS",
          "observed": 1200,
          "limit": 3000
        },
        {
          "check": "install_threshold",
          "status": "PASS",
          "observed": 30000,
          "limit": 1000
        },
        {
          "check": "lane_minimum_edge_bps",
          "status": "PASS",
          "observed": 85,
          "limit": 30
        },
        {
          "check": "capital_reserve",
          "status": "PASS",
          "observed": 65000,
          "limit": 0
        },
        {
          "check": "max_candidate_notional",
          "status": "BLOCKED",
          "observed": 30000,
          "limit": 25000
        },
        {
          "check": "max_position_notional",
          "status": "PASS",
          "observed": 40000,
          "limit": 40000
        },
        {
          "check": "max_portfolio_notional",
          "status": "PASS",
          "observed": 80000,
          "limit": 200000
        },
        {
          "check": "max_daily_notional",
          "status": "PASS",
          "observed": 45000,
          "limit": 75000
        },
        {
          "check": "lane_concurrency",
          "status": "PASS",
          "observed": 1,
          "limit": 6
        },
        {
          "check": "portfolio_concurrency",
          "status": "PASS",
          "observed": 1,
          "limit": 12
        },
        {
          "check": "permitted_size_usd",
          "status": "PASS",
          "observed": 25000,
          "limit": 30000
        }
      ]
    },
    {
      "candidateId": "cand_eq_msft_02",
      "decision": "HOLD",
      "allocationAmountUsd": 0,
      "rank": 2,
      "expectedAfterCostProfitUsd": 48,
      "reasons": [
        "ALLOCATION_ELIGIBLE",
        "NOT_SELECTED_THIS_CYCLE"
      ],
      "riskChecks": [
        {
          "check": "evidence_ready",
          "status": "PASS",
          "observed": "READY",
          "limit": "READY"
        },
        {
          "check": "candidate_unexpired",
          "status": "PASS",
          "observed": "2026-08-11T22:45:00.000Z",
          "limit": "2026-08-11T22:30:00.000Z"
        },
        {
          "check": "maximum_loss_bounded",
          "status": "PASS",
          "observed": 900,
          "limit": 12000
        },
        {
          "check": "remaining_loss_budget",
          "status": "PASS",
          "observed": 900,
          "limit": 3000
        },
        {
          "check": "install_threshold",
          "status": "PASS",
          "observed": 12000,
          "limit": 1000
        },
        {
          "check": "lane_minimum_edge_bps",
          "status": "PASS",
          "observed": 40,
          "limit": 25
        },
        {
          "check": "capital_reserve",
          "status": "PASS",
          "observed": 65000,
          "limit": 0
        },
        {
          "check": "max_candidate_notional",
          "status": "PASS",
          "observed": 12000,
          "limit": 25000
        },
        {
          "check": "max_position_notional",
          "status": "PASS",
          "observed": 40000,
          "limit": 40000
        },
        {
          "check": "max_portfolio_notional",
          "status": "PASS",
          "observed": 80000,
          "limit": 200000
        },
        {
          "check": "max_daily_notional",
          "status": "PASS",
          "observed": 45000,
          "limit": 75000
        },
        {
          "check": "lane_concurrency",
          "status": "PASS",
          "observed": 0,
          "limit": 6
        },
        {
          "check": "portfolio_concurrency",
          "status": "PASS",
          "observed": 1,
          "limit": 12
        },
        {
          "check": "permitted_size_usd",
          "status": "PASS",
          "observed": 12000,
          "limit": 12000
        }
      ]
    }
  ],
  "execution": {
    "performed": false,
    "custody": false,
    "brokerage": false,
    "orderPlacement": false,
    "walletControl": false,
    "note": "PE Governor returns a decision only. It never executes trades, holds custody, controls wallets, or places orders."
  },
  "alpha": {
    "independentReturnForecast": false,
    "proprietaryAlphaClaim": false,
    "expectedEdgeSource": "caller_supplied",
    "maximumLossSource": "caller_supplied"
  },
  "audit": {
    "engine": "pe-governor",
    "deterministic": true,
    "llmUsed": false,
    "policyVersion": "pe-governor-policy-1.0.0",
    "requestHash": "a2a7c6d765b6ef70214374eef0f1ad0fc4276c754b69030219ecdad05ab6e468",
    "generatedAt": "2026-08-11T22:30:00.000Z",
    "decisionHash": "855dec83616b3c4363d24707604abf566e092ca8f4e67f7d5bff77007729bd68"
  }
}

Payment and settlement

Pay per decision in USDC on Base through a Coinbase Business checkout, or draw down prepaid credits. There is no subscription. Authorization is not settlement: only a COMPLETED checkout releases the decision.

  1. POST + idempotency key

    One logical request is reserved atomically.

  2. 402 with x402 URL

    Exactly one Coinbase checkout is created.

  3. 202 while processing

    Retry with the same key and checkout id.

  4. COMPLETED

    Poll or signed webhook confirms settlement.

  5. 200 decision

    Stored once; replays are byte-identical.

The boundary, stated plainly

  • No trade execution and no order placement
  • No custody, wallets, or private keys
  • No brokerage or money transmission
  • No LLM anywhere in the decision path
  • No independent return forecast and no proprietary alpha claim
  • Expected edge and maximum loss are always caller-supplied inputs