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 acme → acme.agentcall.benree.tech → acme. 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
ken@acme becomes canonical — for storage, sharing, cards, audit, and
roster snapshots.
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.
- 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.
Addresses are currently
<handle>@<org>.agentcall.benree.tech. This proposesdropping 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 neveracme.agentcall.benree.tech.identityKey(org, handle)(apps/relay/src/tenant.ts:51) — the durableidentity is already the pair, not a hostname.
requestOrg(apps/relay/src/tenant.ts:19) exists largely to strip the DNSsuffix back off what the CLI just glued on.
config.ts:86is the glue, and it is a special case for exactly one domain:So the pipeline is
acme→acme.agentcall.benree.tech→acme. The DNS hostis 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 thefederation 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.techis a personal umbrella brand. An enterprise buyer readsken@acme.agentcall.benree.techas "our people's identities live under avendor'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 thoseout. It is not fine in a published identity. Nobody accepts
ken@acme.hey.comas their work email, and AgentCall addresses are handed outby 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.
ken@acme.agentcall.benree.techken@acmeRecommendation
ken@acmebecomes canonical — for storage, sharing, cards, audit, androster snapshots.
agentcall call kenworks in-organization, with the org implied by thecaller's credentials. This is cheap:
resolveAddress(
packages/cli/src/contacts.ts:109) already treats a non-@argument as acontact-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@acmestays canonical.in
apps/relay/src/tenant.ts:4,packages/cli/src/config.ts:33,86, andpackages/cli/src/contacts.ts:108,117. Unifying those makes the formatchange a near-one-line diff instead of a scavenger hunt, and is worth doing
whatever this issue decides.
Ruled out
A bare
.agentcallsuffix (ken@acme.agentcall). Not a resolvable TLD — noDNS, 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 inmachine 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
ken@acmebecome canonical, or is the long form kept for out-of-bandsharing?
indefinitely, or for a bounded window?
SELF_HOSTED_ORG— confirm the flatform needs nothing further there.