Each signature comes from a distinct key at a distinct domain. A relying party verifying both cannot be fooled by either alone. The principal cannot clear its own transactions; the evaluator cannot grant itself a mandate.
Three tiers of enforcement maturity — a gradient from live on real money to the moment a mandate declares a rule to when live state feeds the evaluator. Signatures on both credentials verify against published DID documents at bitcoinsingularity.ai and observerprotocol.org, independent of Solana. The ALLOW settled on-chain (slot 428476359, finalized). The DENY blocked before /swap was called; no lamports moved.
OP enforcement is rail-agnostic by design. Jupiter was the first execution surface we built and proven against; adapting to a different rail is adapter work, not architecture work. The choice was deliberate:
Rule verified against supplied state. The rule is built and enforces correctly against the evaluator's 8-rule pipeline. Live position feeding (mark-to-market, P&L aggregation) is in development. This section is not live-enforced.
{
"ruleType": "drawdown",
"ruleField": "dailyDrawdownCap",
"currentValue": 7.2,
"proposedValue": 5,
"message": "Daily drawdown of 7.2% has reached the 5% cap
(24h window, type: percent). No further orders
permitted until the window resets."
}
Both DID documents are static files at their respective domains.
Neither step touches api.observerprotocol.org.
Verification requires only curl and python3.
What this establishes, precisely: that the signature on each credential is sound against the key its
issuer publishes. That is a real check and it needs nothing from us. It is not verification of the
credential as a whole — one of the two is a PolicyEvaluationCredential, and no verifier exists for
that type in the published engine, the hosted service, or the schema set. Checking a signature and verifying a
credential are different operations, and only the first is available here.
curl -s https://bitcoinsingularity.ai/.well-known/did.json \
| python3 -c "
import json, sys
doc = json.load(sys.stdin)
k = next(v for v in doc['verificationMethod'] if '#key-1' in v['id'])
am = doc.get('assertionMethod', [])
print('id: ', k['id'])
print('type: ', k.get('type',''))
print('in assertionMethod:', k['id'] in am or any('#key-1' in str(x) for x in am))
print('key: ', k.get('publicKeyMultibase','')[:40], '...')
"curl -s https://observerprotocol.org/.well-known/did.json \
| python3 -c "
import json, sys
doc = json.load(sys.stdin)
k = next(v for v in doc['verificationMethod'] if '#key-3' in v['id'])
am = doc.get('assertionMethod', [])
print('id: ', k['id'])
print('type: ', k.get('type',''))
print('in assertionMethod:', k['id'] in am or any('#key-3' in str(x) for x in am))
print('key: ', k.get('publicKeyMultibase','')[:40], '...')
"authorizationLevel: policy without the authorizationConfig.policy that level requires, so our own verifier denies it: [schema] structure: authorizationLevel policy requires authorizationConfig.policy. It is typed DelegationCredential where every other delegation on this site is an ObserverDelegationCredential. It carries no credentialStatus, and it pins schema v2.2 while v2.7 is the current one.delegationCredentialHash 3e8abc4b, so substituting the current mandate would break the binding this section exists to demonstrate. The hash check below establishes that the two are the same document. That is the only claim being made about it here. The register carries the same status at registry.html.curl -s https://observerprotocol.org/credentials/maxi-0001-trading-mandate.json \
| python3 -c "
import json, sys, hashlib
c = json.load(sys.stdin)
print('issuer: ', c['issuer'])
print('vm: ', c['proof']['verificationMethod'])
print('suite: ', c['proof']['cryptosuite'])
m = c['credentialSubject']['tradingMandate']
print('cap: ', m['maxNotionalPerOrder'], m['unit'])
print('venues: ', len(m.get('allowedVenues',[])), 'venues')
print('drawdown:', 'dailyDrawdownCap' in m)
# Verify credential hash matches the eval credential's recorded hash
no_proof = {k:v for k,v in c.items() if k != 'proof'}
jcs = json.dumps(no_proof, sort_keys=True, separators=(',',':')).encode()
h = hashlib.sha256(jcs).hexdigest()
expected = '3e8abc4b19bdf58a479fd128f96f922d1db0165681940fd57685cfe925665745'
print('hash match:', h == expected, '(', h[:16], '...' ,')')
"