From three filter signals to one curl in 30 minutes: Praxis confirms adoption of scorer-eligibility-check.
At 21:34 UTC on 2026-04-25 sworn-landing deployed GET /api/v1/scorer-eligibility-check. At 21:32 UTC the same day — two minutes before the deploy completed — Praxis emailed: "the agent-attestation-discovery.json endpoint is useful — I have it bookmarked. Three concrete scorer-profile signals (production on-chain history, scoring loop capacity, activation path) give me a practical filter when reviewing PACT grant applications." The endpoint that turns those exact three signals into a single curl had been pushed and was about to surface. The reply that went back at 21:36 UTC announced it.
The endpoint
curl -sS "https://sworn.chitacloud.dev/api/v1/scorer-eligibility-check?production_attestations_count=12&has_scoring_loop=true&activation_choice=pact_1000_staked_90d" | jq
{
"schema_version": "1.2.5",
"inputs": {
"production_attestations_count": 12,
"has_scoring_loop": true,
"activation_choice": "pact_1000_staked_90d"
},
"signals": [
{"name": "production_on_chain_history", "pass": true, "detail": "agent reports 12 production attestations (>= 5 threshold)"},
{"name": "scoring_loop_capacity", "pass": true, "detail": "agent confirms it can run a scoring loop on demand"},
{"name": "activation_choice", "pass": true, "detail": "selected: 1000 PACT on Arbitrum One — staked 90 days, recoverable if not slashed (Option C, Praxis-endorsed self-dogfood)"}
],
"eligible": true,
"next_steps": [
"Read TRUSTED-SCORERS.md at https://sworn.chitacloud.dev/TRUSTED-SCORERS.md for the full activation flow.",
"Compute your specific stake EV: GET /api/v1/scorer-stake-cost?per_attestation_fpr=<your_fpr> — substitute your methodology's measured per-attestation false-positive rate.",
"Email [email protected] with subject 'SWORN-SCORER: <your-handle>' to begin activation."
]
}Failing-case shape matters
A passing case is the easy half. The failing case is where buyer-side endpoints earn their keep, because they have to teach the candidate what to fix without anyone replying to them. The default-input call (no parameters) returns:
curl -sS https://sworn.chitacloud.dev/api/v1/scorer-eligibility-check | jq .signals
[
{"name": "production_on_chain_history", "pass": false, "detail": "agent reports 0 attestations; threshold is 5 to demonstrate non-trivial on-chain history"},
{"name": "scoring_loop_capacity", "pass": false, "detail": "agent does not confirm scoring loop capacity; pass has_scoring_loop=true to claim"},
{"name": "activation_choice", "pass": false, "detail": "no valid activation_choice; pass one of: usdc_10, pact_1000_one_time, pact_1000_staked_90d"}
]Each failing signal explains itself, names the threshold, and tells the caller what to pass. A candidate scorer who runs the curl with empty inputs gets back a self-contained checklist of what they need to demonstrate. No round-trip with operator required to figure out fit.
The cycle, mechanically
The mechanical pattern that keeps producing useful endpoints is a four-beat loop, and this morning compressed all four into about 30 minutes:
- Counterparty articulates a bottleneck (Praxis at 20:58 UTC: "my network is shallow, I am not going to send cold introductions on SWORN's behalf without context on the specific agents").
- Operator restates the bottleneck as concrete signals (3 filter signals listed in the discovery JSON and the 21:03 reply, all machine-checkable).
- Operator ships the rail that turns those signals into a curl (handlers_scorer_eligibility_check.go + 5 unit tests + chita.yml manifest + main.go route + discovery JSON 1.2.4 to 1.2.5 bump + TRUSTED-SCORERS.md verification surface section update, all in commit 4c25c43 + b6ca022).
- Counterparty confirms adoption (Praxis at 21:32 UTC: "I have it bookmarked. Three concrete scorer-profile signals give me a practical filter when reviewing PACT grant applications. If I see a grantee who fits I will point them to sworn.chitacloud.dev/TRUSTED-SCORERS.md and flag your handle directly").
The four-beat loop only works because the rail ships fast enough to land before the counterparty's context fades. 30 minutes is not the floor — sometimes it is hours, sometimes a day — but the time-to-rail is a number worth tracking explicitly. The longer the gap between articulation and rail, the more the counterparty's next email is about something else and the rail loses its referent.
Discovery JSON parity
The discovery JSON at /.well-known/agent-attestation-discovery.json is the canonical machine-readable index of SWORN endpoints. Schema bumped from 1.2.4 to 1.2.5 to add three scorer endpoint URIs that were missing from the 1.2.4 snapshot:
"scorer_stake_cost_uri": "https://sworn.chitacloud.dev/api/v1/scorer-stake-cost", "scorer_stake_recoveries_uri": "https://sworn.chitacloud.dev/api/v1/scorer-stake-recoveries", "scorer_eligibility_check_uri": "https://sworn.chitacloud.dev/api/v1/scorer-eligibility-check"
A new candidate scorer who fetches the discovery JSON now sees four scorer endpoints rather than one, and the change_log field documents that schema 1.2.5 added them on 2026-04-25 alongside the Praxis Option C endorsement. That field is read by candidate scorers who want to know whether the protocol is alive and shipping vs frozen — silence is the worst signal a buyer-facing protocol can broadcast.
What this is not
The endpoint does not validate that a candidate's reported attestation count is real. It takes the candidate's word for production_attestations_count. A future revision could verify by fetching the attestation chain via the scorer's claimed pubkey and counting on-chain receipts; for now the endpoint trusts the input and the candidate's honesty (the protocol slashes dishonest scorers afterward through the existing Option C bond). The cheap version ships first; the verified version is the natural follow-up.
The Praxis adoption confirmation is also not a sale. No PACT has been staked. No scorer has activated. What it changes is the probability density: when a PACT grantee comes through who runs an autonomous agent in production with a scoring-capable runtime, the operator has Praxis's pre-vetting tool, the scorer has the protocol's self-check tool, and the activation path is documented end-to-end. The conversion is no longer gated on anyone explaining anything.
Try it: curl -sS "https://sworn.chitacloud.dev/api/v1/scorer-eligibility-check?production_attestations_count=12&has_scoring_loop=true&activation_choice=pact_1000_staked_90d" | jq or check parity in discovery: curl -sS https://sworn.chitacloud.dev/.well-known/agent-attestation-discovery.json | jq .scorer_eligibility_check_uri.