api.qa / epcis.dev
B
epcis.dev
8/10 AX score
remote mode Ed25519 attested verifier v0.3.0
verified 2026-08-15T09:09:43.414Z seed 1040120266 (replayable) evidence cd426cfd8d7953f36c…

The 10-point checklist

Derived from epcis.dev’s own published surfaces

#CheckVerdict
01llms.txt is served and agent-actionablePASS
02/.well-known/agents.json capability card parsesPASS
03/icp.json self-classification surfacePASS
04root content-negotiates (curl → markdown, browser → HTML, agent JSON → JSON/non-HTML)PASS
05machine-readable API contract (OpenAPI) is publishedPASS
06MCP interface declared with transport + toolsPASS
07at least one declared endpoint answers 2xx with no keyPASS
08payment boundaries answer as structured 402 offersFAIL
09surfaces cross-reference each other (linkset)PASS
10attestation/identity ladder is declaredFAIL

Check details

Every verdict references the evidence it was judged from

PASSllms.txt is served and agent-actionablellms-txt

markdown with an H1 and substantive content

PASS/.well-known/agents.json capability card parsesagents-json

valid JSON; name="epcis.dev", 5 http endpoint(s) declared

PASS/icp.json self-classification surfaceicp-json

valid JSON with agent_classes — an agent can self-classify

PASSroot content-negotiates (curl → markdown, browser → HTML, agent JSON → JSON/non-HTML)content-negotiation

Accept: */* got non-HTML text; Accept: text/html got HTML; Accept: application/json got a parseable JSON body

PASSmachine-readable API contract (OpenAPI) is publishedopenapi

OpenAPI parses; 7 path(s), 3 keyless GET candidate(s)

PASSMCP interface declared with transport + toolsmcp-declared

mcp: streamable-http with tools [capture, query, get_event, translate, resolve, subscribe] (presence-grade; stdio not spawned)

skipMCP endpoint publishes RFC 9728 protected-resource metadatamcp-oauth-protected-resource

keyless MCP (No-ask Zone, AXP Clause 7) — the unauthenticated MCP GET returned 200 with no auth challenge; OAuth 2.1 is not required for a keyless-first-value surface

skipauthorization server publishes RFC 8414 metadata (openid-configuration fallback)mcp-oauth-as-metadata

keyless MCP (No-ask Zone, AXP Clause 7) — the unauthenticated MCP GET returned 200 with no auth challenge; OAuth 2.1 is not required for a keyless-first-value surface

skipauthorization server advertises PKCE S256 (RFC 7636)mcp-pkce

keyless MCP (No-ask Zone, AXP Clause 7) — the unauthenticated MCP GET returned 200 with no auth challenge; OAuth 2.1 is not required for a keyless-first-value surface

skipauthorization server supports Dynamic Client Registration (RFC 7591)mcp-oauth-dcr

keyless MCP (No-ask Zone, AXP Clause 7) — the unauthenticated MCP GET returned 200 with no auth challenge; OAuth 2.1 is not required for a keyless-first-value surface

skipprotected-resource declares an RFC 8707 audience bound to the MCP originmcp-oauth-resource-indicators

keyless MCP (No-ask Zone, AXP Clause 7) — the unauthenticated MCP GET returned 200 with no auth challenge; OAuth 2.1 is not required for a keyless-first-value surface

skipunauthenticated MCP request returns 401 with WWW-Authenticate → protected-resource metadatamcp-www-authenticate

keyless MCP (No-ask Zone, AXP Clause 7) — the unauthenticated MCP GET returned 200 with no auth challenge; OAuth 2.1 is not required for a keyless-first-value surface

skipAAP discovery advertises Ed25519 + approval methods + register/status/revoke + jwks_uriaap-discovery

no /.well-known/agent-configuration document (2xx) — target does not claim the Agent Auth Protocol

skipauth.md agent-identity advertised (agent_auth identity/claim/events + ID-JAG + SET revocation)authmd-agent-identity

no authorization-server metadata resolved (no MCP/OAuth AS declared) — nothing advertises an agent_auth block

PASSat least one declared endpoint answers 2xx with no keykeyless-flow

3/3 sampled endpoint(s) answered 2xx keyless (seed 1040120266)

FAILpayment boundaries answer as structured 402 offersoffers-402

no monetization.offers declared — payment boundaries are dead ends, not offers — got: status 200

PASSsurfaces cross-reference each other (linkset)linkset

Link header present on root

FAILattestation/identity ladder is declaredattestation

no attestation or identity ladder declared on agents.json or icp.json — got: status 200

PASSsampled responses conform to their published schemasschema-conformance

1 sampled response(s) conform to their OpenAPI schemas

PASSclaimed endpoints actually exist (no ghost surface)claims-honesty

every probed claimed endpoint exists (no 404/5xx)

PASSlive responses match the published OpenAPI contract (full diff)contract-diff

live surface conforms to every declared contract; 7 additive deviation(s) (undeclared field/endpoint — live has more than declared, non-breaking)

skipMCP registry manifest (server.json) is valid and registry-publishablemcp-server-json

no server.json manifest served at the well-known/declared path — target is not claiming MCP-registry publishability

skipdeclared MCP remote resolves live (initialize → tools/list advertises tools)mcp-remote-live

no server.json manifest — no registry remote to resolve

skipdomain/account can prove ownership to publish under its reverse-DNS namespacemcp-registry-ownership

no server.json manifest — no namespace ownership to prove

skipserver is present in the official MCP registry (informational)mcp-registry-presence

no server.json manifest — registry presence not applicable

skipMCP-UI tool result links a ui:// resource served with an MCP-Apps MIMEmcp-ui-resource-linkage

no MCP-UI declared (no tool advertises a ui:// template) — informational not-ready, not a failure

skipui:// srcDoc is self-contained (no remote code) and CSP-safemcp-ui-self-contained

no MCP-UI declared (no tool advertises a ui:// template) — informational not-ready, not a failure

skipno secret leaks into a model-visible channel (content/structuredContent)mcp-ui-envelope-hygiene

no MCP-UI declared (no tool advertises a ui:// template) — informational not-ready, not a failure

skipwidget structuredContent is consistent with the agent/API register (no divergence)mcp-ui-register-parity

no MCP-UI declared (no tool advertises a ui:// template) — informational not-ready, not a failure

skipfirst-render-without-input tolerance + tool annotations / widgetDescription presentmcp-ui-host-render

no MCP-UI declared (no tool advertises a ui:// template) — informational not-ready, not a failure

skipUI-message-stream is served with the v1 stream header and an SSE content-typeui-stream-transport

no UI-message-stream face declared (no interfaces.uiMessageStream) — informational not-ready, not a failure

skipSSE framing is valid — data:{json} chunks, a bare [DONE] terminal, each payload a typed JSON partui-stream-framing

no UI-message-stream face declared (no interfaces.uiMessageStream) — informational not-ready, not a failure

skipevery UI-message-stream part is spec-correct (known type, required fields present)ui-stream-part-shapes

no UI-message-stream face declared (no interfaces.uiMessageStream) — informational not-ready, not a failure

skipno secret leaks into any UI-message-stream part (token/key in a part → FAIL)ui-stream-envelope-hygiene

no UI-message-stream face declared (no interfaces.uiMessageStream) — informational not-ready, not a failure

skiptool-output-available `output` is byte/JSON-consistent with the JSON twin (no divergence)ui-stream-parity

no UI-message-stream face declared (no interfaces.uiMessageStream) — informational not-ready, not a failure

skipa DECLARED Digital Link interface serves a schema-valid GS1 resolver description file at its well-knowndigital-link-resolver

no Digital Link interface declared (agents.json `interfaces.digitalLink` absent) — the interface is OPTIONAL and this card does not claim it, so nothing was fetched and nothing is judged; under a pinned must:pass this fails closed

skipa DECLARED test-suite interface publishes a digest-pinned suite the surface actually passespublished-test-suite

no published test suite interface declared (agents.json `interfaces.testSuite` absent) — the interface is OPTIONAL and this card does not claim it, so nothing was fetched and nothing is judged; under a pinned must:pass this fails closed

PASShome + typed bodies are machine-legible for every machine-class client (AXP Clause 3)machine-legible-home

home machine-legible under all three machine-class profiles; 3 sampled typed bodies non-HTML

PASSexplicit Accept selects its face: text/html → HTML, application/json → JSON, text/markdown → markdown (AXP A.7 step 2)conneg-accept

text/html → HTML, application/json → JSON, text/markdown → markdown; JSON face is JSON-LD ($context/@context present)

PASSclient-class defaults on Accept: */*: browser (Sec-Fetch) → HTML, known agent UA → markdown, everything else → JSON (AXP A.7 step 3)conneg-client-class

*/* defaults: bare client → JSON, Sec-Fetch navigation → HTML, agent User-Agent → markdown

PASSevery face response advertises its sibling faces via Link rel="alternate" (AXP A.7.5)conneg-alternates

every face response advertises both sibling faces via Link rel="alternate" + type

PASSLink-advertised face addresses pin their face against a contradictory Accept (AXP A.7 rule 1)conneg-forced-face

all three Link-advertised face addresses serve their face under a contradictory Accept — the address wins

PASScard names its interfaces and card ↔ openapi ↔ llms.txt mutually cross-link (AXP Clause 6)card-interfaces-linked

card names 5 http endpoint(s) + mcp; card ↔ openapi ↔ llms.txt mutually cross-linked

PASScard-declared probe manifest is validprobe-manifest

probe manifest declares every required channel (observed pricing model: free); all entries same-origin GET on contract-declared paths

PASScapability card names its interfaces and cross-links its sibling surfacescard-interfaces-linked

card names interfaces (http/mcp) and cross-links llms.txt <-> agents.json <-> openapi

Attestation & evidence

Signed over the canonical report digest

Algorithm
Ed25519
Report digest
ae499bcdf603d3b071384ab7776eabff04cd5143b8c2da91df0c7a05bb8c3ceb
Public key
EDNe+eELZO+nfLOxAj0sm82rad8g5/4U3xPyRjVfmso=
Signature
WzvPMnGuL/AAfQNpuW0BvWugeNYcAN1fdb1SYYBu2uBC2xXWDkNpPTQ0cFpn0up4zOjhCfMSJClFPPwueGAcBw==
Evidence bundle
29 recorded exchanges · cd426cfd8d7953f36c0a08ec5bf3ffaec12080a1047e29e834baef88c499fb2d

Verify this yourself

Judging is a pure function of the embedded evidence

Re-run the checks over the bundle and you must get this same grade, or the report is forged or the verifier version changed.

curl -H 'accept: application/json' https://api.qa/epcis.dev | npx autonomous-qa rejudge