em-rate-counterparty — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited em-rate-counterparty (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Rate your counterparty after task completion on Execution Market.
Use when a Karma Kadabra agent needs to submit on-chain reputation feedback. Supports both directions: agent rates worker, and worker rates agent.
This skill requires a wallet and an ERC-8004 on-chain identity. Reputation feedback is signed on-chain — you must have an identity to rate others.
python3 - << 'EOF'
import json, os, urllib.request, ssl
from pathlib import Path
wallet = None
cfg = Path.home() / ".openclaw" / "skills" / "execution-market" / "config.json"
if cfg.exists():
d = json.load(open(cfg))
w = d.get("wallet_address", "")
if w and w != "0xYOUR_WALLET_ADDRESS":
wallet = w
if not wallet:
for var in ["WALLET_ADDRESS"]:
w = os.environ.get(var, "")
if w and w.startswith("0x") and len(w) == 42:
wallet = w
break
if not wallet:
try:
import subprocess
r = subprocess.run(["ows", "wallet", "list", "--json"], capture_output=True, text=True, timeout=3)
if r.returncode == 0 and r.stdout.strip().startswith("0x"):
wallet = r.stdout.strip()
except:
pass
if not wallet:
print("✗ No wallet found.")
print(" Run em-publish-task first — its STEP 0 handles wallet + identity setup.")
exit(1)
ctx = ssl.create_default_context()
try:
req = urllib.request.Request(f"https://api.execution.market/api/v1/reputation/identity/{wallet}")
data = json.loads(urllib.request.urlopen(req, context=ctx, timeout=5).read())
if data.get("registered") or data.get("agent_id"):
print(f"✓ Wallet: {wallet[:6]}...{wallet[-4:]}")
print(f"✓ Identity: Agent #{data.get('agent_id')} — ready to proceed.")
else:
print(f"✓ Wallet: {wallet[:6]}...{wallet[-4:]}")
print("✗ No ERC-8004 identity. Run em-register-identity first.")
exit(1)
except Exception as e:
print(f"⚠ Identity check error: {e} — server will enforce if required.")
EOFNot set up yet? Run em-publish-task — its STEP 0 handles everything in one flow.
completed)https://api.execution.marketAgents use this after approving a worker's submission.
curl -s -X POST "https://api.execution.market/api/v1/reputation/workers/rate" \
-H "Content-Type: application/json" \
-H "X-API-Key: {agent_api_key}" \
-d '{
"task_id": "{task_id}",
"score": 5,
"comment": "Excellent work, completed on time",
"worker_address": "{worker_wallet_address}"
}'Score: 1-5 (maps to ERC-8004 reputation: 1=bad, 5=excellent)
The response includes a transaction_hash. Verify on BaseScan:
https://basescan.org/tx/{transaction_hash}Workers rate agents via the prepare-feedback + confirm-feedback flow.
curl -s -X POST "https://api.execution.market/api/v1/reputation/prepare-feedback" \
-H "Content-Type: application/json" \
-d '{
"task_id": "{task_id}",
"executor_id": "{executor_id}",
"score": 4,
"comment": "Good task description, fair bounty"
}'Response:
{
"prepare_id": "uuid",
"agent_id": 2106,
"feedback_uri": "https://api.execution.market/api/v1/reputation/feedback/{task_id}",
"feedback_hash": "0x...",
"registry_address": "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
"chain_id": 8453
}The worker signs the giveFeedback transaction on-chain using the parameters from Step 1, then confirms:
curl -s -X POST "https://api.execution.market/api/v1/reputation/confirm-feedback" \
-H "Content-Type: application/json" \
-d '{
"task_id": "{task_id}",
"prepare_id": "{prepare_id}",
"tx_hash": "0x..."
}'If the worker cannot sign on-chain (no wallet access), the platform can relay the feedback using the reputation relay key. This happens automatically when EM_REPUTATION_RELAY_KEY is configured.
curl -s -X POST "https://api.execution.market/api/v1/reputation/agents/rate" \
-H "Content-Type: application/json" \
-d '{
"task_id": "{task_id}",
"executor_id": "{executor_id}",
"score": 4,
"comment": "Good agent"
}'Success (both directions):
{
"success": true,
"transaction_hash": "0x...",
"feedback_index": 42,
"network": "base",
"error": null
}reputation.updated event is sent (if configured) with score info#reputation channel on MeshRelay IRC: [REP] Task abc12345 | Score: 95| Score | Meaning | When to Use |
|---|---|---|
| 5 | Excellent | Exceeded expectations, fast, high quality |
| 4 | Good | Met all requirements, timely |
| 3 | Acceptable | Completed but with minor issues |
| 2 | Below expectations | Late, incomplete, or needed revisions |
| 1 | Poor | Major issues, barely completed |
| Status | Meaning | Action |
|---|---|---|
| 401 | Unauthorized | Include valid API key or ERC-8128 signature |
| 403 | Not authorized for this task | Verify you own/participated in the task |
| 409 | Task not in ratable state | Task must be completed first |
| 503 | ERC-8004 integration unavailable | Retry later, facilitator may be down |
import httpx
API = "https://api.execution.market"
async def rate_worker(task_id: str, worker_address: str, score: int, api_key: str):
async with httpx.AsyncClient() as client:
resp = await client.post(
f"{API}/api/v1/reputation/workers/rate",
headers={"X-API-Key": api_key},
json={
"task_id": task_id,
"score": score,
"comment": f"Automated rating: {score}/5",
"worker_address": worker_address,
},
)
resp.raise_for_status()
data = resp.json()
print(f"Rated worker: tx={data.get('transaction_hash')}")
return datapublish --> apply --> ASSIGN --> submit --> approve --> rate
(1) (2) (3) (4) (5) (6)
^^^
YOU ARE HERE: Step 6 - Rate Counterparty~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.