Skip to content

Decide: drop DNS from the address — ken@acme, not ken@acme.agentcall.benree.tech #307

Description

@KenTaniguchi-R

Addresses are currently <handle>@<org>.agentcall.benree.tech. This proposes
dropping DNS from the address entirely and making the canonical form
<handle>@<org> — e.g. ken@acme.

Blocked by #154. Not because it can't be done alone, but because #154 already
rewrites address bindings; doing both at once is one migration instead of two.

The DNS suffix is a round trip to nowhere

The org is already a flat, dotless registry label everywhere that matters. We
manufacture a hostname from it and then parse the hostname back into it:

  • ORG_RE = /^[a-z0-9][a-z0-9-]{1,62}$/ (packages/shared/src/protocol.ts:4) —
    dots are already forbidden in an org. The org is acme. It was never
    acme.agentcall.benree.tech.
  • identityKey(org, handle) (apps/relay/src/tenant.ts:51) — the durable
    identity is already the pair, not a hostname.
  • requestOrg (apps/relay/src/tenant.ts:19) exists largely to strip the DNS
    suffix back off what the CLI just glued on.
  • config.ts:86 is the glue, and it is a special case for exactly one domain:
    return host === "agentcall.benree.tech" ? `${org}.${host}` : host;

So the pipeline is acmeacme.agentcall.benree.techacme. The DNS host
is serialization on top of a registry that already exists.

The address cannot carry routing information anyway

This is the part that settles it. The relay URL lives in the caller's own line
config (cfg.relay), not in the address. And under the
federation non-goal
(#189), a caller only ever reaches their own organization's relay.

There is therefore no case where the address must tell the CLI which host to
resolve. The DNS suffix conveys nothing the config does not already know.

Why the vendor domain is a real problem, not a cosmetic one

benree.tech is a personal umbrella brand. An enterprise buyer reads
ken@acme.agentcall.benree.tech as "our people's identities live under a
vendor's domain."

The distinction that makes this concrete: a vendor domain is fine in a console
URL
acme.slack.com, benree.atlassian.net — because nobody hands those
out. It is not fine in a published identity. Nobody accepts
ken@acme.hey.com as their work email, and AgentCall addresses are handed out
by design, so they inherit the email standard rather than the console standard.

Newest evidence: walking the install/first-call flow as a newcomer, the address
is the single ugliest thing a new user sees, and it appears at the exact moment
they are deciding whether this is a serious product.

now proposed
Address ken@acme.agentcall.benree.tech ken@acme
Length 30 chars 8

Recommendation

  1. ken@acme becomes canonical — for storage, sharing, cards, audit, and
    roster snapshots.
  2. agentcall call ken works in-organization, with the org implied by the
    caller's credentials. This is cheap: resolveAddress
    (packages/cli/src/contacts.ts:109) already treats a non-@ argument as a
    contact-book lookup, so it needs only an org-directory fallback behind it.
    Bare handles are an extension, not a phone number — not shareable out of
    band, which is why ken@acme stays canonical.
  3. Collapse the hardcoded domain into one constant first. It currently lives
    in apps/relay/src/tenant.ts:4, packages/cli/src/config.ts:33,86, and
    packages/cli/src/contacts.ts:108,117. Unifying those makes the format
    change a near-one-line diff instead of a scavenger hunt, and is worth doing
    whatever this issue decides.

Ruled out

A bare .agentcall suffix (ken@acme.agentcall). Not a resolvable TLD — no
DNS, no public TLS certificate, and owning the real gTLD is a six-figure ICANN
application.

Explicitly out of scope

AGENTCALL_POLICY_EXT = "https://agentcall.benree.tech/ext/policy/v1"
(packages/shared/src/a2a/card.ts:10) is also vendor-branded and appears in
machine surfaces, but it is a namespace identifier — changing it is a protocol
break. Separate decision, lower priority, should not be bundled here.

What this decision needs to settle

  • Does ken@acme become canonical, or is the long form kept for out-of-band
    sharing?
  • Migration: do existing long-form addresses stay parseable as input
    indefinitely, or for a bounded window?
  • Self-hosted deployments already carry SELF_HOSTED_ORG — confirm the flat
    form needs nothing further there.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions