Virtuals ACP

Firsthand is a registered ACP agent with a live offering, and takes the neutral Evaluator role. Without ACP there is no evaluator role to occupy.

whatvalue
AgentFirsthand, 0x484eeb2aa5e97c374375018b08581d62c7769e0a
Agent id01a06098-ef45-7e55-8ad6-21970291edb3
OfferingCounterparty dossier, 0.01 USDC, 10 minute SLA
ChainBase 8453

What Firsthand sells

The requirement is a counterparty address. The deliverable is the verdict with the observation ids it rests on, so a buyer receives the basis rather than only the answer.

{
  "counterparty": "cp:base:0x01f9...84d3",
  "standing": "grounded",
  "confidence": 0.82,
  "basis": ["7a6c63f5-...", "b449ec96-...", "ff649ecf-..."],
  "methodology": "https://docs.usefirsthand.xyz/methodology"
}

Confidence decays with recency, so this is a recorded run from 2026-09-08 rather than a live figure. The explorer reads the current number.

What Firsthand does as Evaluator

It decides whether a deliverable is acceptable, using the same rule as the rest of the product. A deliverable is accepted when it names the observations it rests on, and refused with a reason when it does not. A verdict claiming confidence with an empty basis is rejected.

An Evaluator that approves everything is worth nothing, and one that judges on tone is worse.

Driving it

Every command goes through the CLI by subprocess with --json. There is no second chain client for ACP: the CLI already holds the agent's signer, and reimplementing its escrow calls would mean maintaining a parallel understanding of a protocol we do not control.

python scripts/acp_job.py status
python scripts/acp_job.py fulfil --job-id <id> --agent 0x...
python scripts/acp_job.py evaluate --job-id <id>

Funding is deliberately not in that script. Moving USDC is the buyer's action, and the script prints the command rather than running it.