新規資本を認可します。許可された正確な金額が上限です。
自律的な資本のための検証可能な事前トレード認可レイヤー
すでにトレーディングエージェントをお持ちですか?
Profit Engine Governor を追加。
カストディはそのまま。コントロールもそのまま。
PE Governor は送信された各注文意図をあなたのルールと照合し、エージェント間でポートフォリオのキャパシティを調整し、許可された正確な金額に対する短時間有効の署名付き認可を返します。検証はあなたの実行系が行います。PE Governor が資産を保管したり注文を出すことはありません。
PE Governor(提供:Solarly)
判定の種類
既存の管理ポジションを縮小します。返された金額を超えないでください。
ハードルールに違反しました。この候補で再度実行しないでください。
一時的な阻害要因、またはこのサイクルで未選択です。待機して再度問い合わせてください。
決定論的な判断をライブで描画
このカードは、有料エンドポイントが実行するのと同じ純粋なポリシーを、下記のサンプルリクエストに適用した結果です。同一の入力は常に同一の決定ハッシュを返します。
許可額
$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 は単一の純粋なポリシーを適用します。状態の鮮度、照合、キルスイッチ、エビデンス、損失予算、準備金、ノーショナル上限、同時実行数を検査し、順位付けして最大1件だけを選びます。
3. 遵守
資本はあなたの条件で動きます。同じリクエストからバイト単位で同一の判断が返り、正規化リクエストと判断の SHA-256 ハッシュが監査用に付きます。
自律的な資本のための基盤的コントロール
エージェントの判断を境界づけ、監査可能にし、実行スタック間で持ち運べるようにする決定論的な認可レイヤーです。
改ざんが分かるポリシー・レシート
すべての応答は、正規化リクエストと決定を SHA-256 ハッシュ、ポリシーバージョン、タイムスタンプ、正確な許可金額、実測値と上限の各チェックで結び付けます。再取得はバイト単位で同一です。
ポートフォリオ全体のガバナンス
複数戦略からの最大 50 件の候補を、1 つの新鮮で照合済みのポートフォリオ・スナップショットに対して評価します。損失、ドローダウン、準備金、名目額、同時実行数、キルスイッチの各ルールを適用したうえで、最大 1 件だけが選ばれます。
機械ネイティブな支払い
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 + 冪等キー
1つの論理リクエストをアトミックに確保します。
- Step 02
402 と x402 URL
Coinbase のチェックアウトが正確に1つ作成されます。
- Step 03
処理中は 202
同じキーとチェックアウトIDで再試行します。
- Step 04
COMPLETED
ポーリングが COMPLETED の checkout を確認します。署名付き Webhook による確認は、設定されている場合に利用できます。
- 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. 署名付き認可は、どのポリシー判断が発行されたかを証明するものです。コンプライアンス証明書、引受判断、オンチェーン証明、取引所の承認ではありません。