신규 자본을 승인합니다. 허용된 정확한 금액이 상한입니다.
자율 자본을 위한 검증 가능한 사전 거래 승인 계층
이미 트레이딩 에이전트를 쓰고 계신가요?
Profit Engine Governor를 추가하세요.
수탁은 그대로. 통제도 그대로.
PE Governor는 제출된 각 주문 의도를 귀하의 규칙과 대조해 평가하고, 에이전트 간 포트폴리오 용량을 조정하며, 허용된 정확한 금액에 대한 단기 유효 서명 승인을 반환합니다. 검증은 실행 어댑터가 수행하며, PE Governor는 결코 수탁하거나 주문을 넣지 않습니다.
PE Governor — 제공: Solarly
결정 판정
기존 관리 포지션을 축소합니다. 반환된 금액을 절대 초과하지 마세요.
강한 규칙을 위반했습니다. 이 후보로 다시 실행하지 마세요.
일시적 차단이거나 이번 주기에 선택되지 않았습니다. 대기 후 다시 요청하세요.
결정론적 판단을 실시간으로 렌더링
이 카드는 유료 엔드포인트가 실행하는 것과 동일한 순수 정책을 아래 예시 요청에 적용한 결과입니다. 동일한 입력은 항상 동일한 결정 해시를 냅니다.
허용 금액
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
작동 방식
1. 제안
에이전트가 공통 버스에 최대 50개의 후보를 전송합니다. 레인, 자산, 매매 방향, 요청 명목금액, 호출자가 제공한 최대 손실과 기대 순엣지, 증거 상태와 만료가 포함됩니다.
2. 통제
PE Governor는 하나의 순수 정책을 적용합니다. 상태 신선도, 대사, 킬 스위치, 증거, 손실 예산, 준비금, 명목 한도, 동시성을 검사한 뒤 순위를 매겨 최대 하나만 선택합니다.
3. 준수
자본은 당신의 조건으로 움직입니다. 같은 요청에는 바이트 단위로 동일한 결정이 반환되며, 정규화된 요청과 결정의 SHA-256 해시가 감사용으로 함께 제공됩니다.
자율 자본을 위한 기반 통제
에이전트의 결정을 제한하고 감사 가능하게 하며 실행 스택 전반에서 이식 가능하게 만드는 결정론적 승인 계층입니다.
변조가 드러나는 정책 영수증
모든 응답은 정규화된 요청과 결정을 SHA-256 해시, 정책 버전, 타임스탬프, 정확한 허용 금액, 관측값 대 한도 검사와 함께 묶습니다. 재요청 결과는 바이트 단위로 동일합니다.
포트폴리오 전체 거버넌스
여러 전략에서 온 최대 50개 후보를 하나의 최신·대사 완료 포트폴리오 스냅샷에 대해 평가합니다. 손실, 드로다운, 예비금, 명목금액, 동시성, 킬 스위치 규칙이 적용된 뒤 최대 한 건만 선택됩니다.
머신 네이티브 결제
Coinbase Business 체크아웃을 통해 Base의 USDC로 공개된 위험 구간별 단가를 결정마다 지불하거나 선불 크레딧을 사용하세요. 멱등성이 논리적 중복 구매를 막습니다.
집행은 여러분의 실행 어댑터에서 시작됩니다
PE Governor는 승인을 반환합니다. 주문을 내기 전에 여러분의 어댑터가 이를 검증하고 따라야 합니다. Coinbase는 현재 거래소 단에서 PE 결정을 강제하지 않으며, 결제가 판정을 바꾸지도 않습니다.
설치 정책 보기실행 어댑터가 검증할 수 있는 서명된 승인
관리되는 모든 배분에는 정확한 의도와 가장 최근에 제출된 포트폴리오 리스크 상태에 묶인, 수명이 짧은 암호 서명 승인이 함께 발급됩니다.
검증 가능한 정책 증명
서명은 정규화된 증명 페이로드(발급자, 키 ID, 판정, 정확한 허용 금액, 후보, 전략, 레인, 전체 범위, 요청 해시, 결정 해시, 포트폴리오 상태 해시, 영속 견적, 만료)를 포함합니다. 공개 키를 한 번 받아 오프라인으로 검증하세요.
에이전트 간 원자적 예약
같은 테넌트와 포트폴리오의 동시 에이전트는 하나의 집계 리스크 원장을 두고 경쟁합니다. 예약이 승인된 경우에만 승자 후보가 실행 가능해지며, 그렇지 않으면 판정은 HOLD로 낮아집니다.
리스크 구간별 가격
결정 가격은 위험 자본, 즉 요청 내 최대 명목금액 또는 최대 손실에 따라 달라집니다. 견적은 결정론적이며 해시에 묶입니다. 결제는 평가를 구매할 뿐 판정을 구매하지 않습니다.
결정당 결정론적 가격
위험 자본은 제출된 후보 전체의 max(requestedNotionalUsd, maximumLossUsd)입니다. 크레딧 1단위는 0.05 USDC입니다.
| 위험 자본 | 가격 (Base의 USDC) | 크레딧 단위 |
|---|---|---|
| $1,000까지 | 0.05 USDC | 1 |
| $10,000까지 | 0.10 USDC | 2 |
| $100,000까지 | 1.00 USDC | 20 |
| $500,000까지 | 5.00 USDC | 100 |
| $500,000 초과 | 10.00 USDC | 200 |
ALLOCATE, REDUCE, REJECT, HOLD 모두 같은 가격입니다. 구독은 없습니다.
실행 전에 검증하세요
실행 어댑터는 페이로드 해시, 서명, 발급자와 키 ID, 유효 기간, 활성 예약 토큰, 기대되는 모든 해시, 그리고 주문이 승인된 의도와 금액에 정확히 일치하는지 검증해야 합니다. 각 승인은 영속 저장소에서 한 번만 소비하고, 유효한 승인이 없는 주문은 거부하세요.
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);실행 구간 전체에 걸쳐 포트폴리오 여력을 확보하세요
선택 사항서명된 인가를 오프라인으로 검증하는 것만으로도 충분합니다. 더 필요하다면 인가를 클레임하세요. 그러면 PE Governor는 어댑터가 결과를 보고할 때까지 해당 인가 몫의 총 여력을 붙잡아 두므로, 다른 에이전트가 같은 여유분을 두 번 쓸 수 없습니다.
AUTHORIZED
결정과 함께 발급되어 짧은 유효 기간 동안 이미 여력을 붙잡고 있습니다.
CLAIMED
어댑터가 비밀 클레임 키를 묶어 결과를 책임집니다. 다른 호출자는 상태를 바꿀 수 없습니다.
COMMITTED
어댑터가 실행했습니다. 확정된 자본은 정산 전까지 가동 중이므로 여력은 계속 묶여 있습니다.
RELEASED
어댑터가 실행하지 않고 물러났습니다. 여력은 즉시 반환됩니다.
EXPIRED
제때 보고가 없었습니다. 별도의 정리 호출 없이 여력이 저절로 반환됩니다.
// 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는 여전히 주문을 제출·라우팅·결제하지 않습니다.
정책은 한 번만 설치
소유자 임계값 이상의 배분 전에 호출을 연결하세요. REJECT나 HOLD에서는 멈추고, REDUCE 금액을 절대 초과하지 마세요.
# 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요청 및 응답 페이로드
{
"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"
}
]
}{
"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"
}
}결제와 정산
Coinbase Business 체크아웃을 통해 Base의 USDC로 결정마다 결제하거나 선불 크레딧을 차감합니다. 구독은 없습니다. 승인은 정산이 아니며, COMPLETED 체크아웃만 결정을 해제합니다.
- Step 01
POST + 멱등 키
하나의 논리 요청이 원자적으로 예약됩니다.
- Step 02
402와 x402 URL
Coinbase 체크아웃이 정확히 하나 생성됩니다.
- Step 03
처리 중에는 202
같은 키와 체크아웃 ID로 재시도하세요.
- Step 04
COMPLETED
폴링이 COMPLETED 체크아웃을 확인합니다. 서명된 웹훅 확인은 구성된 경우 사용할 수 있습니다.
- Step 05
200 결정
한 번 저장되며, 재요청은 바이트 단위로 동일합니다.
상태 코드 상태 머신
POST /api/pe/v1/governor (X-Idempotency-Key: uuid-v4)
|
v
402 Payment Required --payment.x402Url--> client pays the checkout
| |
|<---- retry: same key + X-Checkout-Id ------+
v
202 Accepted checkout ACTIVE / PROCESSING --> back off, retry
|
v
checkout COMPLETED (polling; signed webhook when configured)
|
v
200 OK pe-governor-decision.v1, stored once, replays byte-identical클라이언트 재시도 루프
최소 연동 예시입니다. UUID v4 멱등 키를 보내고, 402 본문에서 x402 URL과 체크아웃 ID를 읽어 결제한 뒤, 같은 키와 체크아웃 ID로 결정이 나올 때까지 폴링합니다.
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)));
}경계를 분명히
- 01. 거래 체결도, 주문 제출도 하지 않습니다
- 02. 수탁, 지갑, 개인키를 다루지 않습니다
- 03. 중개업이나 자금 이체를 하지 않습니다
- 04. 결정 경로에 LLM이 전혀 없습니다
- 05. 자체 수익 예측이나 독자 알파 주장을 하지 않습니다
- 06. 기대 엣지와 최대 손실은 항상 호출자가 제공하는 입력입니다
- 07. 거래소 자체 집행은 주장하지 않으며, 모든 승인은 귀사의 어댑터가 집행합니다
- 08. 서명된 승인은 어떤 정책 결정이 발급되었는지를 증명합니다. 규제 준수 증명서, 인수 심사 결정, 온체인 증명, 거래소 승인이 아닙니다.