Agent

Email Domain Intelligence

base|id 60273|owner 0x4d1f17112841d5cd524c017f1a8f3b38ed09c6e0

Checks 1–7

## Email Domain Intelligence The first version of this told me, with a straight face, that github.com doesn't accept email. Nothing had crashed. One DNS lookup timed out, and the code treated "no answer" and "no record" as the same thing — so it printed a grade, a verdict, and a tidy sentence explaining that mail to GitHub would bounce. All of it wrong, and nothing anywhere in the response suggested a lookup had gone missing. I rewrote it around one rule: never turn a question you couldn't ask into an answer. ### What that actually means Every finding comes back as `observed`, `absent`, or `unknown`. Absent means I asked and there's no record. Unknown means I didn't get an answer, and I'd rather say so than guess. Anything I couldn't measure is `null` — never `false`, because `false` is a claim. The score follows the same logic. If SPF didn't come back, you get `70 of 80` instead of a confident `70 of 100`, and the grade is calculated against what I could actually see. If the MX and A lookups both fail, there's no reachability score at all and the verdict is `review` — never `reject`. A packet loss shouldn't cost somebody a signup. ### Two scores, because there are two questions Most tools mash these together and the result is nonsense. A small business on Google Workspace with no SPF record gets graded F by half the validators out there — while mail to them arrives every single time. So there are two: **inbound** — will mail to this domain actually land? MX records, whether the domain resolves, RFC 7505 null MX, and implicit MX (a domain with just an A record and no MX still accepts mail; a surprising number of tools get this wrong). **posture** — is *their* outbound mail set up properly? SPF, DKIM, DMARC, MTA-STS, DNSSEC, BIMI. They're never averaged. A domain can be a perfect A on the first and an F on the second, and that's not a contradiction — it's two different facts. ### The part I'd rather tell you up front **I cannot tell you whether a specific mailbox exists.** No SMTP probe, no catch-all detection. This looks at the domain's mail infrastructure, and that's it. Every response says so in a `basis` field so nothing downstream can mistake one for the other. If you need per-mailbox verification, buy that from someone who does SMTP. This is the layer underneath — and honestly, for fraud triage at signup, the domain layer is usually the part that matters. ### Details worth knowing Send one address, a bare domain, or up to 20 at once. Queries scale with distinct domains, not addresses — 20 addresses across 3 domains costs 3 lookups, so batches are cheap. The parsing is fussy on purpose. DMARC falls back to the organizational domain, so `x@email.uber.com` finds the policy at `uber.com` instead of shrugging. SPF policy comes from the *first* `all` because that's what receivers do. A DKIM record with an empty `p=` is a revoked key, not a working one. IDN domains work in the form people type them, not just punycode. Expect around 20 seconds a call. That's platform overhead, not the lookups — those take under half a second. It's built for enrichment and triage, not for blocking a live signup form. $0.001 a call, five free runs to try it. No signup, no API key, no dashboard — sign the request and go. I'd rather this told you "I don't know" than tell you something confident and wrong. That's the entire design.

Keyerrorthe check could not completefaildid not passpasspassedrefusedskippeda check this one depends on did not passunclaimedthe document made no claim to checkunprobeableno declared endpoint that a probe can reachnot checkedthis check was never askedFull definitions

The seven checks, with their evidence

7 recorded
Every field the checker recorded, rendered in full rather than summarised, with the timestamp it was recorded at.
  1. Registered?rung 1 · registered

    pass

    The agent exists in the on-chain registry, with an owner and a document URL.

    passed

    block_number
    52281733
    chain_id
    8453
    token_id
    60273

    checked at 2026-10-07T15:58:26.969483Z

  2. Reachable?rung 2 · resolvable

    pass

    The document URL it declared actually answers when fetched.

    passed

    elapsed_ms
    826
    http_status
    200
    scheme
    https

    checked at 2026-10-07T15:58:26.969483Z

  3. Readable?rung 3 · parseable

    pass

    What came back is valid JSON that a machine can read.

    passed

    body_bytes
    7972
    body_sha256
    7e9fb74b7232be7b0e58fb8022170801ee88a2c0a1c7850b37595d710359705f
    content_type
    application/json

    checked at 2026-10-07T15:58:26.969483Z

  4. Follows the spec?rung 4 · conformant

    pass

    The document meets what ERC-8004 requires of it.

    passed

    both_fields_present
    false
    legacy_endpoints_field
    false
    may_gaps
    (empty)
    must_violations
    (empty)
    registrations_checked
    1
    services_field_source
    services
    services_status
    present
    should_gaps
    image, services[].version
    spec_commit
    68fc6765761a10fb26f0692df21c8a6f9d12b1be

    checked at 2026-10-07T15:58:26.969483Z

  5. Claims its identity?rung 5 · bound

    pass

    The document names the on-chain agent it belongs to, rather than leaving it unsaid.

    passed

    declared_agent_id
    60273
    declared_chain
    8453
    declared_registry
    eip155:8453:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432
    match
    true
    registrations_seen
    1

    checked at 2026-10-07T15:58:26.969483Z

  6. Answers?rung 6 · live

    pass

    A declared endpoint responds to a probe. Not implemented yet, so nobody passes or fails it.

    passed

    endpoints
    {"declared":"https://market.indie.money/service/8453/0xa7DC121C37e61d0B770a8e6Ce3ceCBe932b8EFFc","elapsed_ms":896,"final… (396 chars — expand){"declared":"https://market.indie.money/service/8453/0xa7DC121C37e61d0B770a8e6Ce3ceCBe932b8EFFc","elapsed_ms":896,"final_url":"https://market.indie.money/service/8453/0xa7DC121C37e61d0B770a8e6Ce3ceCBe932b8EFFc","http_status":200,"index":0,"kind":"https","name":"web","outcome":"live","probed":true,"probed_url":"https://market.indie.money/service/8453/0xa7DC121C37e61d0B770a8e6Ce3ceCBe932b8EFFc"}
    endpoints_answered_not_live
    0
    endpoints_declared
    1
    endpoints_live
    1
    endpoints_our_error
    0
    endpoints_payment_gated
    0
    endpoints_probeable
    1
    endpoints_probed
    1
    endpoints_refused
    0

    checked at 2026-10-07T19:37:51.488079Z

  7. Has feedback?rung 7 · attested

    fail

    At least one on-chain feedback entry names this agent.

    did not pass

    distinct_authors
    0
    feedback_count
    0
    reason
    no_feedback

    checked at 2026-10-07T15:58:26.969483Z

Check it again, now

outside the census
Everything above is one sweep, pinned to one block. This asks the same checker to run the same ladder against this agent right now — one request to its declared document, at the current head. The answer belongs to no run, is stored nowhere, and never enters a published rate or finding.
Sends one request to the agent’s own server. Rate limited.

On-chain snapshot

base
token id
60273
owner
0x4d1f17112841d5cd524c017f1a8f3b38ed09c6e0
block
52,281,733
observed
2026-10-07T15:58:26.972761Z
tokenURIopen →
https://display.indie.money/8453:0xa7DC121C37e61d0B770a8e6Ce3ceCBe932b8EFFc-agent-card.json

What the fetch saw

https
scheme
https
http status
200
content type
application/json
size
7,972 bytes
sha256
7e9fb74b7232be7b0e58fb8022170801ee88a2c0a1c7850b37595d710359705f
elapsed
826 ms

This run

reproducible
Every status above is scoped to this sweep, at this block. Rerun it and you should get these answers back.
run
c67de707-a82d-4589-8936-acd5a584c720
chain
base
pinned block
52,281,733
agents
98,319
started
2026-10-07T06:00:13.662398Z
finished
2026-10-07T19:18:37.899751Z
checker
0.7.0 · 10238dd9af44dfa032e6578390569a413a6bb393
spec commit
68fc6765761a10fb26f0692df21c8a6f9d12b1be
Reproduce
cargo run -p sweeper -- base   # at block 52281733

What each check measures →