자율 자본을 위한 검증 가능한 사전 거래 승인 계층

이미 트레이딩 에이전트를 쓰고 계신가요?
Profit Engine Governor를 추가하세요.
수탁은 그대로. 통제도 그대로.

PE Governor는 제출된 각 주문 의도를 귀하의 규칙과 대조해 평가하고, 에이전트 간 포트폴리오 용량을 조정하며, 허용된 정확한 금액에 대한 단기 유효 서명 승인을 반환합니다. 검증은 실행 어댑터가 수행하며, PE Governor는 결코 수탁하거나 주문을 넣지 않습니다.

PE Governor — 제공: Solarly

결정 판정

Verdict 01ALLOCATE

신규 자본을 승인합니다. 허용된 정확한 금액이 상한입니다.

Verdict 02REDUCE

기존 관리 포지션을 축소합니다. 반환된 금액을 절대 초과하지 마세요.

Verdict 03REJECT

강한 규칙을 위반했습니다. 이 후보로 다시 실행하지 마세요.

Verdict 04HOLD

일시적 차단이거나 이번 주기에 선택되지 않았습니다. 대기 후 다시 요청하세요.

01결정론적 판단을 실시간으로 렌더링

결정론적 판단을 실시간으로 렌더링

이 카드는 유료 엔드포인트가 실행하는 것과 동일한 순수 정책을 아래 예시 요청에 적용한 결과입니다. 동일한 입력은 항상 동일한 결정 해시를 냅니다.

ALLOCATEpe-governor-policy-1.0.0

허용 금액

US$25,000.00

선택됨: cand_spot_btc_01

  • cand_spot_btc_01순위 1ALLOCATE
  • cand_eq_msft_02순위 2HOLD
요청 해시
request a2a7c6d765b6ef70214374eef0f1ad0fc4276c754b69030219ecdad05ab6e468
결정 해시
decision 855dec83616b3c4363d24707604abf566e092ca8f4e67f7d5bff77007729bd68

리스크 점검 (관측값 대 한도)

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

작동 방식

Phase 01

1. 제안

에이전트가 공통 버스에 최대 50개의 후보를 전송합니다. 레인, 자산, 매매 방향, 요청 명목금액, 호출자가 제공한 최대 손실과 기대 순엣지, 증거 상태와 만료가 포함됩니다.

Phase 02

2. 통제

PE Governor는 하나의 순수 정책을 적용합니다. 상태 신선도, 대사, 킬 스위치, 증거, 손실 예산, 준비금, 명목 한도, 동시성을 검사한 뒤 순위를 매겨 최대 하나만 선택합니다.

Phase 03

3. 준수

자본은 당신의 조건으로 움직입니다. 같은 요청에는 바이트 단위로 동일한 결정이 반환되며, 정규화된 요청과 결정의 SHA-256 해시가 감사용으로 함께 제공됩니다.

02자율 자본을 위한 기반 통제

자율 자본을 위한 기반 통제

에이전트의 결정을 제한하고 감사 가능하게 하며 실행 스택 전반에서 이식 가능하게 만드는 결정론적 승인 계층입니다.

변조가 드러나는 정책 영수증

모든 응답은 정규화된 요청과 결정을 SHA-256 해시, 정책 버전, 타임스탬프, 정확한 허용 금액, 관측값 대 한도 검사와 함께 묶습니다. 재요청 결과는 바이트 단위로 동일합니다.

포트폴리오 전체 거버넌스

여러 전략에서 온 최대 50개 후보를 하나의 최신·대사 완료 포트폴리오 스냅샷에 대해 평가합니다. 손실, 드로다운, 예비금, 명목금액, 동시성, 킬 스위치 규칙이 적용된 뒤 최대 한 건만 선택됩니다.

머신 네이티브 결제

Coinbase Business 체크아웃을 통해 Base의 USDC로 공개된 위험 구간별 단가를 결정마다 지불하거나 선불 크레딧을 사용하세요. 멱등성이 논리적 중복 구매를 막습니다.

집행은 여러분의 실행 어댑터에서 시작됩니다

PE Governor는 승인을 반환합니다. 주문을 내기 전에 여러분의 어댑터가 이를 검증하고 따라야 합니다. Coinbase는 현재 거래소 단에서 PE 결정을 강제하지 않으며, 결제가 판정을 바꾸지도 않습니다.

설치 정책 보기
03실행 어댑터가 검증할 수 있는 서명된 승인

실행 어댑터가 검증할 수 있는 서명된 승인

관리되는 모든 배분에는 정확한 의도와 가장 최근에 제출된 포트폴리오 리스크 상태에 묶인, 수명이 짧은 암호 서명 승인이 함께 발급됩니다.

검증 가능한 정책 증명

서명은 정규화된 증명 페이로드(발급자, 키 ID, 판정, 정확한 허용 금액, 후보, 전략, 레인, 전체 범위, 요청 해시, 결정 해시, 포트폴리오 상태 해시, 영속 견적, 만료)를 포함합니다. 공개 키를 한 번 받아 오프라인으로 검증하세요.

에이전트 간 원자적 예약

같은 테넌트와 포트폴리오의 동시 에이전트는 하나의 집계 리스크 원장을 두고 경쟁합니다. 예약이 승인된 경우에만 승자 후보가 실행 가능해지며, 그렇지 않으면 판정은 HOLD로 낮아집니다.

리스크 구간별 가격

결정 가격은 위험 자본, 즉 요청 내 최대 명목금액 또는 최대 손실에 따라 달라집니다. 견적은 결정론적이며 해시에 묶입니다. 결제는 평가를 구매할 뿐 판정을 구매하지 않습니다.

결정당 결정론적 가격

위험 자본은 제출된 후보 전체의 max(requestedNotionalUsd, maximumLossUsd)입니다. 크레딧 1단위는 0.05 USDC입니다.

결정당 결정론적 가격
위험 자본가격 (Base의 USDC)크레딧 단위
$1,000까지0.05 USDC1
$10,000까지0.10 USDC2
$100,000까지1.00 USDC20
$500,000까지5.00 USDC100
$500,000 초과10.00 USDC200

ALLOCATE, REDUCE, REJECT, HOLD 모두 같은 가격입니다. 구독은 없습니다.

실행 전에 검증하세요

실행 어댑터는 페이로드 해시, 서명, 발급자와 키 ID, 유효 기간, 활성 예약 토큰, 기대되는 모든 해시, 그리고 주문이 승인된 의도와 금액에 정확히 일치하는지 검증해야 합니다. 각 승인은 영속 저장소에서 한 번만 소비하고, 유효한 승인이 없는 주문은 거부하세요.

verify-authorization.ts
import { verifyAuthorizationForOrder } from "./pe-authorization";

// 1. Fetch and cache the published Ed25519 verification key (kid + issuer).
const { issuer, keys } = await (await fetch("/api/pe/v1/keys")).json();

// 2. Gate every order on a live, exactly matching authorization.
const check = await verifyAuthorizationForOrder({
  proof: decision.proof,                   // returned with every 200
  publicKeyBase64Url: keys[0].x,
  order: {
    candidateId, strategyId, assetId, lane, side, reduceOnly,
    amountUsd: decision.allocationAmountUsd, // must equal permittedAmountUsd exactly
    tenantId, portfolioId, agentId, ownerId, accountScope,
  },
  expected: {
    issuer,
    keyId: keys[0].kid,
    policyVersion: decision.policyVersion,
    requestHash: decision.audit.requestHash,
    decisionHash: decision.audit.decisionHash,
    portfolioStateHash: decision.proof.payload.portfolioStateHash,
    quoteHash: decision.priceQuote.quoteHash,
    reservationFencingToken: decision.proof.payload.reservation.fencingToken,
  },
  // Durable single-use store: ONE atomic operation, never has() then add().
  replayStore: {
    consumeIfUnused: async (id) => {
      const { rowCount } = await db.query(
        "INSERT INTO used_authorizations (id) VALUES ($1) ON CONFLICT DO NOTHING",
        [id],
      );
      return rowCount === 1;                 // false => already consumed
    },
  },
});

if (!check.valid) throw new Error(check.reason); // never place the order
placeOrder(decision.allocationAmountUsd);
검증 키
04실행 구간 전체에 걸쳐 포트폴리오 여력을 확보하세요

실행 구간 전체에 걸쳐 포트폴리오 여력을 확보하세요

선택 사항

서명된 인가를 오프라인으로 검증하는 것만으로도 충분합니다. 더 필요하다면 인가를 클레임하세요. 그러면 PE Governor는 어댑터가 결과를 보고할 때까지 해당 인가 몫의 총 여력을 붙잡아 두므로, 다른 에이전트가 같은 여유분을 두 번 쓸 수 없습니다.

  1. AUTHORIZED

    결정과 함께 발급되어 짧은 유효 기간 동안 이미 여력을 붙잡고 있습니다.

  2. CLAIMED

    어댑터가 비밀 클레임 키를 묶어 결과를 책임집니다. 다른 호출자는 상태를 바꿀 수 없습니다.

  3. COMMITTED

    어댑터가 실행했습니다. 확정된 자본은 정산 전까지 가동 중이므로 여력은 계속 묶여 있습니다.

  4. RELEASED

    어댑터가 실행하지 않고 물러났습니다. 여력은 즉시 반환됩니다.

  5. EXPIRED

    제때 보고가 없었습니다. 별도의 정리 호출 없이 여력이 저절로 반환됩니다.

authorization-lifecycle.ts
// Optional. Offline verification of the proof is still sufficient.
const { authorizationId } = decision.lifecycle;
const claimKey = crypto.randomUUID() + crypto.randomUUID(); // >= 32 chars, keep it

const claim = await fetch(`/api/pe/v1/authorizations/${authorizationId}/claim`, {
  method: "POST",
  headers: { "x-pe-claim-key": claimKey },
});
if (!claim.ok) return; // someone else owns this authorization

try {
  await placeOrderWithYourOwnExecutor(intent); // PE Governor never does this
  await fetch(`/api/pe/v1/authorizations/${authorizationId}/commit`, {
    method: "POST",
    headers: { "x-pe-claim-key": claimKey },
  });
} catch {
  // stand down and give the capacity straight back
  await fetch(`/api/pe/v1/authorizations/${authorizationId}/release`, {
    method: "POST",
    headers: { "x-pe-claim-key": claimKey },
  });
}

라이프사이클 상태는 고객사 자체 정책의 기록입니다. 커밋은 어댑터가 실행했음을 기록할 뿐이며, PE Governor는 여전히 주문을 제출·라우팅·결제하지 않습니다.

05정책은 한 번만 설치

정책은 한 번만 설치

소유자 임계값 이상의 배분 전에 호출을 연결하세요. REJECT나 HOLD에서는 멈추고, REDUCE 금액을 절대 초과하지 마세요.

install-policy.txt
# Install once, obey always.
BEFORE any allocation >= OWNER_THRESHOLD_USD:
  decision = POST /api/pe/v1/governor          # same-origin; production clients resolve it against https://governor.solarly.ai
  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

요청 및 응답 페이로드

06요청 — 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"
    }
  ]
}
07응답 — 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"
  }
}
08결제와 정산

결제와 정산

Coinbase Business 체크아웃을 통해 Base의 USDC로 결정마다 결제하거나 선불 크레딧을 차감합니다. 구독은 없습니다. 승인은 정산이 아니며, COMPLETED 체크아웃만 결정을 해제합니다.

  1. Step 01

    POST + 멱등 키

    하나의 논리 요청이 원자적으로 예약됩니다.

  2. Step 02

    402와 x402 URL

    Coinbase 체크아웃이 정확히 하나 생성됩니다.

  3. Step 03

    처리 중에는 202

    같은 키와 체크아웃 ID로 재시도하세요.

  4. Step 04

    COMPLETED

    폴링이 COMPLETED 체크아웃을 확인합니다. 서명된 웹훅 확인은 구성된 경우 사용할 수 있습니다.

  5. Step 05

    200 결정

    한 번 저장되며, 재요청은 바이트 단위로 동일합니다.

상태 코드 상태 머신

클라이언트 재시도 루프

최소 연동 예시입니다. UUID v4 멱등 키를 보내고, 402 본문에서 x402 URL과 체크아웃 ID를 읽어 결제한 뒤, 같은 키와 체크아웃 ID로 결정이 나올 때까지 폴링합니다.

retry-loop.ts
import { randomUUID } from "node:crypto";

const ENDPOINT = "/api/pe/v1/governor"; // same-origin; resolves against https://governor.solarly.ai
const idempotencyKey = randomUUID(); // UUID v4, one per logical decision

// 1. First call: body + idempotency key. No payment yet, so expect 402.
let res = await fetch(ENDPOINT, {
  method: "POST",
  headers: { "content-type": "application/json", "x-idempotency-key": idempotencyKey },
  body: JSON.stringify(governorRequest),
});

if (res.status !== 402) throw new Error(`unexpected status ${res.status}`);

// 2. Read the x402 URL and checkout id straight off the 402 body.
const { payment } = await res.json();
const x402Url: string = payment.x402Url;     // where the client pays
const checkoutId: string = payment.checkoutId; // echo this back on every retry

// 3. Pay with your x402 client. The authorization response is NOT settlement:
//    only a COMPLETED checkout releases the decision.
await x402Client.pay(x402Url, { amount: payment.amount, asset: payment.currency });

// 4. Poll the same request with the same key + checkout id, backing off.
for (let attempt = 0; attempt < 12; attempt++) {
  res = await fetch(ENDPOINT, {
    method: "POST",
    headers: { "x-idempotency-key": idempotencyKey, "x-checkout-id": checkoutId },
  }); // body may be omitted on retries

  if (res.status === 200) {
    const decision = await res.json(); // pe-governor-decision.v1
    console.log(decision.decision, decision.allocationAmountUsd, decision.audit.decisionHash);
    break;
  }
  if (res.status !== 202) throw new Error(await res.text()); // 402/409 are terminal
  await new Promise((r) => setTimeout(r, Math.min(500 * 2 ** attempt, 8000)));
}

전체 가이드: 첫 구매

09경계를 분명히

경계를 분명히

  1. 01. 거래 체결도, 주문 제출도 하지 않습니다
  2. 02. 수탁, 지갑, 개인키를 다루지 않습니다
  3. 03. 중개업이나 자금 이체를 하지 않습니다
  4. 04. 결정 경로에 LLM이 전혀 없습니다
  5. 05. 자체 수익 예측이나 독자 알파 주장을 하지 않습니다
  6. 06. 기대 엣지와 최대 손실은 항상 호출자가 제공하는 입력입니다
  7. 07. 거래소 자체 집행은 주장하지 않으며, 모든 승인은 귀사의 어댑터가 집행합니다
  8. 08. 서명된 승인은 어떤 정책 결정이 발급되었는지를 증명합니다. 규제 준수 증명서, 인수 심사 결정, 온체인 증명, 거래소 승인이 아닙니다.