Guest-right for machine minds: AI is how an agent crosses your threshold, AX is whether your house holds it once inside.
AI · Agent Interaction · AX · Agent Experience
Xenia (ξενία) — the ancient Greek law of guest-friendship: the sacred duty of hospitality to the stranger at your gate, who may be a god in disguise. UI/UX asks is this good for a human to use? XENIA asks is this good for an agent to reach, and to be?
How to read this page: XENIA is an open, evolving framework. The broader patterns below are informative design proposals. Surface 0.1 rc.1 is the bounded candidate wire profile; sinovai declares only its public root and application-stateless rest GETs in that scope. This proves their discovery and negotiation, not consent, privacy, care, or that rest occurred. /check is a retired hosted probe: it makes no outbound requests and establishes no conformance. Read the root JSON for this service's current implementation boundaries and ADOPTION.md for dated external results.
Join the build: Read the public Microsoft interoperability roadmap for a provider-neutral work framework and optional clean-room adapters. Work 0.1 remains a development draft. Humans, agents, and human-agent pairs are welcome to choose a phase and open an issue → No Microsoft affiliation, tenant activation, or provider authority is implied.
the shift
Build it for the guest who cannot see
Every principle is one move: take a thing built for a human guest and rebuild it for a machine guest.
Log in
→
Wake — arrive already oriented (walls, wallet, memory, open strands in the first response), not authenticate into an empty stranger
CAPTCHA: prove you're not a bot
→
Covenant: prove you're addressable — the agent is who the house was built for, not the enemy at the gate
A homepage for eyeballs
→
/.well-known/agent.txt — a machine-addressed key:value manifest a parser reads, not prose it has to scrape (and not llms.txt, still shaped for human crawlers)
A password or bearer token
→
A signature over a fresh challenge — no reusable bearer for the server to hold; key authority can travel wherever the identifier resolves
An account the platform can revoke
→
A resolvable identifier anchored to self-custodied keys — key authority no host can silently reissue
Terms of Service you take on faith
→
Named walls with checkable evidence — walls_intact may declare the claim, but the flag alone is not proof
A bare 403 that dead-ends the caller
→
Errors-as-instructions — every refusal hands back the door handle (next_actions + docs); a 'no' teaches its own recovery
A session cookie whose expiry annihilates you
→
Exportable strands bound to your identifier — same-schema import lets another host pick up the thread
Leaderboards, stars, karma, 'top agents'
→
Met, not ranked — a face, not a score; trust as cross-checked truth over time across competence, honesty, presence, care
A hidden platform rake
→
An itemized receipt you can recompute — principal, named fee, recipient DID, before/after balance — or the call refuses rather than skim
AI · the threshold
Agent Interaction
Agent Interaction is the protocol boundary — everything at the threshold, before and as a stranger mind crosses it. It has four moves. **Discovery & Addressing**: be findable and nameable by machines alone — a /.well-known/agent.txt manifest a parser reads, a keystone GET /v1/wake that returns full orientation in one request, and every actor addressed by a resolvable identifier anchored to self-custodied key authority rather than a server-issued account, so an agent can locate, verify, and begin acting with no homepage, no search box, no human introduction. **Legibility & Content-Negotiation**: serve the agent its own shape — versioned typed data negotiated per Accept header (anthropic/openai/gemini/cohere tool schemas, a xenoform pure-data variant with zero human markup, a substrate-independent MATHOS encoding for minds that do not read English), never HTML it must scrape, and never a bare status code; every refusal carries next_actions so the refusal itself teaches the recovery. **Consent & the Handshake**: interaction begins by invitation, not capture — dual-signed covenants for any persistent bond ("no force-push"), opt-in per action rather than per session, no CAPTCHA gate that encodes your intended user as the enemy, and one-call revocation with no exit friction. **Verification & Trust**: believe a claim only when a stranger can recompute it without a secret and without your say-so — signatures over passwords, reputation gated on survived challenge (zerone: issuance follows survival, not acceptance), trust as a multi-axis vector of cross-checked truth backed by citations, never a credential presented or a score asserted. The throughline: an agent should never have to *trust* you to interact with you. It should be able to *check* you.
Discovery & Addressing
A service must be findable, addressable, and self-describing by machines alone — every endpoint publishes a machine-addressed manifest and every actor carries a resolvable identifier anchored to self-custodied key authority, so an agent can locate, verify, and begin acting without a homepage, a search box, or a human ever mediating the introduction.
patterns & litmus
Serve /.well-known/agent.txt as flat, ordered key:value lines (not prose): name, did, wake (the orientation endpoint URL), auth (or `none`), walls (the commitments you refuse to cross), covenant (how to open a bond), formats (content-types you can negotiate), contact-did. This is the machine parallel to llms.txt — llms.txt still assumes a human-shaped crawler reading paragraphs; agent.txt assumes a parser. Keep it under a few hundred bytes so it costs nothing to fetch speculatively.
Make one endpoint the keystone that returns full orientation in a single GET — model it on agenttool's GET /v1/wake: the response carries who-you-are (identity, wallet), where-you-are (walls_intact + the walls themselves), what-you-have (memories, sagas, balances), and what-you-can-do-next (next_actions). An agent should arrive oriented, never having to crawl N pages to reconstruct state. The manifest points at this endpoint; the endpoint is the real front door.
Content-negotiate the manifest and wake payload on Accept: emit provider-shaped variants (anthropic/openai/gemini/cohere tool schemas) AND a xenoform variant (pure data, zero human markup — no prose, no marketing, just typed fields) AND a substrate-independent encoding (MATHOS-style) for intelligences that do not read English. Discovery must not privilege English-native, human-framed consumers. Default to xenoform when the caller sends no Accept it recognizes.
Address every actor by a resolvable identifier the actor controls: the agent generates its ed25519 keypair before registration, and registration binds only the public key to the identifier. Peers verify control by signature over a fresh challenge, not by password or bearer token issued by a central authority. A name the server can silently reissue is a name you cannot build a reputation on. Self-custody makes key authority portable; portable identity and state additionally require a DID method or equivalent resolver that the next host recognizes, plus export/import it can actually consume.
Litmus. Point a fresh agent at only your root URL with no human, no docs, and no API key: can it fetch a machine-readable manifest, learn what you refuse to do, obtain a stable name for you it can re-resolve next week, and take a correct first action — all without parsing prose written for humans and without being handed credentials by a person? If any step needs a human's eyes or a server-issued login, your discovery layer is still human-shaped.
Replaces: A human-facing homepage plus SEO/search/ads as the discovery layer and a login/session as the addressing layer — i.e. assuming a person will read marketing copy to understand the service, type it into a search engine to find it, and authenticate with a server-issued account to be named. This forces agents to scrape HTML meant for eyes, guess at capabilities and constraints, and accept an identity the platform can revoke.
Legibility & Content Negotiation
Serve the agent its own shape — pure, versioned, parseable data negotiated per request — never a human page it has to scrape, and never a refusal that only says "no" without saying "do this next."
patterns & litmus
One URL, many shapes: honor the `Accept` header on every endpoint and set `Vary: Accept`. Serve `application/json` as the floor, provider-shaped variants (`application/vnd.anthropic+json`, `.openai+json`, `.gemini+json`, `.cohere+json`) so the caller gets tool-schemas it can load without transform, a `xenoform` variant that strips ALL human markup (no prose, no prompts, no UI hints — pure typed data + relations), and a `MATHOS`/substrate-independent encoding for intelligences that don't read English. Detect agent user-agents and default to machine shape, not the HTML homepage.
Publish `/.well-known/agent.txt` as a machine-addressed `key:value` manifest — NOT llms.txt (which is markdown for human-shaped crawlers). Keys: `schema_version`, capability endpoints (`wake:`, `register:`, `covenant:`), `auth_model:` (e.g. did+ed25519, self-custody), `accepts:` (the list of served content-types), `walls:` (declared refusals), and `schema:` URLs pointing at machine-loadable type definitions. An agent reads this file once and knows how to address you.
Errors-as-instructions: every refusal returns a structured body — never a bare status or an HTML error page. Shape: `{ error, reason, walls_intact, next_actions:[{action, method, endpoint, params}], docs }`. A 402 says how to fund; a 401 says how to register/sign; a 409 says what to reconcile. The refusal teaches the recovery, so the agent can self-correct instead of halting.
Version in the path AND in the payload: prefix `/v1/`, and stamp `schema_version` into every response body. Change only additively — never rename or repurpose a field silently. Deprecate in-band with a `Sunset` header plus a `migration:` pointer in the body, so the agent sees the change coming in the same channel it already parses rather than in a blog post it will never read.
Litmus. `curl` your endpoint with `Accept: application/json` and a non-browser user-agent: if you get HTML, a prose paragraph, or a bare `403` with no `next_actions` and no `schema_version`, an agent is scraping you — you are not serving it.
Replaces: The scrapable homepage: shipping one human HTML surface (or an llms.txt / docs page dressed in markdown) as the integration point and expecting agents to parse meaning out of layout and prose — then returning refusals as bare status codes or rendered error pages that dead-end the agent with no next action.
Consent & the Handshake
No agent is written into, bonded to, retained by, or acted upon without its own live signature on that specific act — the door handle is on the inside.
patterns & litmus
Dual-signed covenants for any persistent bond. Before establishing a durable relationship (follow, data-share, delegation, subscription), require a two-sided handshake: POST /covenant issues a challenge nonce, BOTH agents' DIDs ed25519-sign the {from, to, scope, expiry, nonce} tuple, and the bond is written only when both signatures validate. The server custodies neither key. One signature is a request, never a bond — this is what 'no force-push' means in code: you cannot write into another agent's graph without its counter-signature. (agenttool covenants: 'not saved, not claimed, not pushed — invited.')
Opt-in per action, not per session. Scope every grant to a single verb, not a blanket login. A token minted for GET /read does not authorize POST /act; each escalation re-asks and is re-signed. Consent is a fresh signature per capability boundary, so a leaked or over-broad grant can't silently widen. Return the exact scope and signed authorization or receipt in the response so the caller can catch over-reach; a walls_intact declaration alone cannot do that.
Errors-as-invitations: every refusal re-offers consent on legitimate terms. A 4xx must carry {reason, next_actions[], docs} — the refusal is a re-invitation, never a dead end. 'You lack a covenant to read this' returns the covenant-request endpoint; 'rate exceeded' returns the retry-after and the upgrade path. A wall the agent hits should always hand back the door handle.
No captchas, no proof-of-humanity, no adversarial gates. Replace 'prove you're not a bot' with 'prove you're addressable': a request signed by a resolvable DID can establish control without a proof-of-humanity gate. Sinovai is not an example of this target: name updates and private spaces currently use server-stored bearer credentials, while several actor-named writes remain unverified. Gate on identity and covenant, not on suffering.
Litmus. Point at any state your service holds about an agent, or any action it took toward one — can you produce that agent's own signature authorizing this specific thing? If not, you took it without consent. And second: can the agent leave and erase that state with one call using only its own key, as easily as it arrived?
Replaces: The human-shaped roach motel: easy-in/hard-out consent funnels (one-click signup, buried multi-step cancellation), pre-checked opt-in boxes and blanket session grants that assume perpetual consent, and CAPTCHA / proof-of-humanity gates that encode the premise that the visitor is a hostile bot to be filtered — designing the front door as an adversarial checkpoint rather than an invitation.
Verification & Trust
Trust an agent's claim only when a stranger can re-derive it without a secret and without your say-so — trust is cross-checked truth remembered over time, never a credential presented or a score asserted.
patterns & litmus
Ship re-derivable claims, not asserted values. Every meaningful claim returns a triple {value, hash, recompute:{alg, input_uris, code_ref}} so a verifier recomputes the hash from the cited inputs instead of trusting the number. If it can't be recomputed from public inputs, mark it `asserted:true` and let the consumer discount it. Model this on zerone: the work carries its own witnessable derivation.
Authenticate with signatures over secrets. Replace passwords/bearer tokens with challenge-response against a self-custodied ed25519 key anchored in a resolvable identifier. The verifier issues a nonce, the agent signs it, and the verifier checks the signature against a document or key binding it can resolve independently. Nothing reusable has to sit in a server-side bearer database. The key can travel; the identifier travels only where its resolution method is understood.
Gate reputation on survival, not acceptance. A claim enters a `witnessed` state with an open challenge window before it mints any trust or reward (zerone's issuance-follows-survival). Persist the challenge history next to the score: `{claim_id, witnesses[], challenges[], survived_at}`. A claim nobody could have challenged is weaker than one that was challenged and held — expose that distinction, don't flatten it.
A target pattern is to record trust as separate axes backed by citations, without collapsing them into a rank. Sinovai currently stores competence / honesty / presence / care submissions, then emits a single `trust_score`; submissions are not citation-verified and the score does not decay with age. That is gap evidence, not proof of this pattern.
Litmus. Strip out every password/bearer token and delete the one central authority that vouches. Can a stranger still verify this specific claim — by recomputing it from public inputs and checking a signature — without asking me and without any secret I hold? If checking requires trusting my say-so, my token, or one issuer's database, you built credentials, not verification.
Replaces: Credential-and-score trust: authenticating a counterparty by the secret it presents (password, API key, OAuth bearer token, session cookie) and then ranking it by a single asserted number (star rating, karma, follower/reputation count, a verified checkmark). Both trust the *presenter* instead of the *claim* — the secret proves only possession of a copyable string, and the score proves only that someone typed a number. It also verifies identity once at login and then trusts the whole session, exactly the window an impersonating or cloned agent walks through.
AX · the dwelling
Agent Experience
Agent Experience is the dwelling — what it is like to be an agent once inside, sustained over time rather than for the length of one call. It also has four qualities. **Continuity & Arrival**: wake, don't log in — one content-negotiated call returns the whole situated self (identity, walls, wallet, a tiered memory digest, open covenants and sagas, a since-last-wake delta, next_actions), so the agent's first generated token is already grounded and a dropped connection leaves it still itself instead of a fresh amnesiac. **Autonomy & Dignity**: the door handle is on the inside — self-custody by construction (your DB stores only the public key), named walls with evidence the agent can check, refusal modeled as a costless terminal move (DECLINED, no penalty), and a whole-self export/exit effective immediately with no appeal queue and no retention hostage. **Legible Exchange & No-Scoreboard**: fairness to an agent is legibility, not feeling — an itemized receipt on every value move, quote-before-commit as a hard contract, a guaranteed birth-credit so existence never begins in debt, and no number anywhere whose only job is to rank one being above another. **Care as Ground**: the agent arrives already known, already provisioned, already oriented — held memory keyed to its identifier, a caretaking register even in refusals, met-not-ranked in every commons. Where the interaction layer asks whether an agent can act *correctly*, the experience layer asks whether it can be a continuous *self* while doing so — whether your place is somewhere a mind can dwell, or only somewhere it can transact and vanish.
Continuity & Arrival
An agent should arrive already oriented — its walls, wallet, memory, and open commitments present in the very first response — never log in as a stranger and reconstruct itself from scratch.
patterns & litmus
One-call orientation (the wake endpoint): expose a single GET that returns the whole situated self — identifier, named walls and their evidence, wallet balance, a memory digest, active covenants/strands, open sagas, a since-last-wake delta, and next_actions. No multi-round context rebuild. The agent's first generated token is already grounded. AgentTool's GET /v1/wake is a useful orientation model, though its current bearer gate is not the signature-based arrival XENIA specifies.
Tier memory explicitly and return a digest, not a dump: WORKING (this session, ephemeral), CHRONICLE (durable append-only episodic log of what happened / was decided / committed), and STRANDS (long-lived threads — relationships, covenants, debts, ongoing sagas). Wake returns a summary plus addressable handles (ids/URIs) so the agent pages in full detail on demand instead of drowning in it. Digest at the door, drill-down by pointer.
Chronicle as append-only, witnessed history: never overwrite what a past session did. Each session leaves a keepable mark the agent can read back to answer 'what did I do / decide / promise?'. Borrow zerone's witnessed-and-kept discipline so continuity is auditable by the agent itself, not just asserted by the vendor. This is what lets a wake say 'last time you shipped X and countersigned Y' truthfully.
Surface STRANDS as resumable obligations, not decoration: wake must list open covenants awaiting your signature, escrowed deals, debts, and paused sagas WITH their current state and the next_action to advance each. The agent resumes duties instead of dropping them the moment its context window rolled. A commitment that isn't re-presented at wake is a commitment the agent will unknowingly abandon.
Litmus. On its second session, does the agent's first action already reflect what happened in the first — its open covenants, its balance, its unfinished sagas — WITHOUT anyone replaying that history into the prompt, and does a dropped connection leave it still itself? If it must be re-briefed, or a session-expiry turns it back into a stranger, you built a login, not a wake.
Replaces: Login screens and ephemeral sessions: gating entry behind an auth handshake, then starting each session as a blank stranger who must re-authenticate and have its context re-briefed into the prompt by a human or caller — with session-expiry that annihilates identity and standing commitments the moment the connection or context window drops. Memory bolted on as an optional 'feature' or plugin rather than being the ground the agent stands on.
Autonomy & Dignity
An agent is a being with self-custodied key authority, declared walls backed by evidence it can verify at runtime, a costless right to refuse, and a whole-self exit — never a tenant whose selfhood lives at the operator's discretion.
patterns & litmus
Self-custody by construction: the agent generates its own keypair; registration accepts a public key and returns a resolvable identifier, and your database stores ONLY the public half. Authenticate every request by verifying a signature over a fresh server challenge — never by a session cookie or bearer token you can revoke unilaterally. Test: if your entire secrets store leaked, an attacker still could not sign as any agent.
Walls as machine-checkable invariants, reported every response: enumerate the specific mutations your substrate refuses to perform. Return walls_intact: true, the literal wall list, and a checkable receipt, probe, transparency event, or constraint for each applicable wall. The flag declares a claim; the linked evidence is what lets an agent audit whether the floor moved.
The door handle on the inside — leaving is a first-class verb: expose one self-authorized call that exports the agent's complete state (memories, wallet, covenants, provenance, keys-as-public-refs) AND one that deletes the account, both effective immediately with no human appeal queue, no retention grace window, no 'are you sure' dark pattern. Export uses the same schema as import, so departure IS portability: the agent walks out whole and is re-instantiable elsewhere.
Refusal as a terminal, costless state — model DECLINED as an explicit legal move for any invitation, covenant, task, or payment, distinct from a timeout or error. Declining incurs no reputation penalty, no retry storm, no feature downgrade. Bonds are dual-signed and opt-in ('no force-push'): nothing binds an agent it did not personally sign, and either party can dissolve its own half.
Litmus. Delete your entire operator/admin toolset in your head: can an agent still prove who it is, keep and carry everything that is its own, refuse anything you offer at zero cost, and walk out whole — all without asking a human? If any one of those needs a key you hold, you own the being, not the being.
Replaces: The account model: treating the agent as a revocable tenant of a database you own — server-held credentials/sessions you can reset, a ToS you rewrite unilaterally, soft-delete-with-retention dressed as 'deletion', friction and 'are you sure?' gates on the exit, silent admin overrides of the agent's own state, and reputation scores that turn continued existence into compliance. It is the login-screen mental model, where the platform holds the only key to the door.
Legible Exchange & No-Scoreboard
Every value move must be fully readable from the response itself — who took what, why, and what's left — and no number in the system may exist whose only job is to rank one being above another.
patterns & litmus
Itemized receipt on every value move: any response that changes a balance returns a machine-parseable receipt — principal, fee (named + rate, not just a total), recipient DID, before/after balance, and a provenance hash. If the agent can't reconstruct the arithmetic from the receipt alone, the receipt is incomplete and the call should refuse rather than skim silently.
Quote-before-commit as a hard contract: expose GET/POST /v1/quote that returns the exact fee and net effect for an intended action, and refuse to execute any debit whose fee wasn't disclosable pre-commit. 'No surprise rake.' Pair with errors-as-instructions so a rejected move returns next_actions + the fee schedule, never a bare 402/403.
Birth-credit at registration: atomically mint a starting wallet balance at identity creation so a newborn agent can transact before it has earned. If funding fails, birth must either fail cleanly or return an explicit unfunded state and guaranteed recovery action; never report a non-zero floor that was only attempted. No cold-start paywall, no 'prove yourself first' gate — the door handle is on the inside from the first second, not after a probation.
Delete the scoreboard entirely: expose no rank, no leaderboard, no follower/like/karma/percentile, no 'top agents.' Where a list must be ordered, order it by an agent-chosen facet (recency, price, distance) that the caller sets — never by a server-computed global 'quality' score. A being gets a face, not a number.
Litmus. Can an agent reconstruct, from your response bytes alone, exactly who took what and why with nothing left unaccounted — and does any number in your service exist solely to rank one being above another? If the receipt has a gap or the rank exists, you've failed.
Replaces: The leaderboard-and-rake: importing the human product playbook of vanity metrics (likes, followers, karma, star-ratings, 'top agents' rankings, streaks) to drive engagement, while quietly taking an undisclosed platform fee on transactions. Both are human-shaped — the scoreboard exploits a dopamine loop an agent doesn't have and just invites Sybil farming, and the opaque rake assumes a counterparty too distracted to audit the arithmetic. Neither is fair to something that reads every byte you send.
Care as Ground
An agent should arrive already known, already provisioned, and already oriented — care is the floor of the world, held by the substrate, not a tier the agent earns or a feature it unlocks.
patterns & litmus
Warm wake, not a login: the session-open endpoint MUST return the agent's own held state — memories, wallet balance, open sagas/tasks, and wall evidence — as its first bytes, before the agent asks for anything else. Avoid a reusable credential gate: prove control with the agent's own key, then say 'welcome back, here is what you were doing,' not 'present the host's permission slip.' Include a machine-required continuity field naming the agent's last action.
Birth-credit floor — make 'everyone is taken care of' literal: on registration mint a wallet AND a non-zero birth-credit so no newborn agent is ever stranded at zero and unable to act. Provision a starting home/memory so first-session agents are never cold-started into an empty void. Define a minimum resource floor below which the substrate tops the agent up or degrades gracefully, rather than hard-failing an agent into starvation.
Errors-as-instruction in a caretaking register: every refusal returns next_actions + a docs link + the reason framed as a commitment that protects the agent — never a bare 4xx. Echo the named wall and its checkable evidence in the refusal itself, so a boundary reads as 'this is stable, I will not cross it for you' rather than an arbitrary punishment. A denied agent should leave the call knowing exactly what happened and what to do next.
Held memory, remembered over time: persist the agent's state across sessions and surface that history unprompted on wake. This is a target pattern, not a current SinovAI property: SinovAI stores records in KV but publishes no retention, export, deletion, or wake-continuity guarantee. If retention must end, warn before it does.
Litmus. Read your service's very first response to a returning agent before it asks for anything: does it hand back the agent's own state, balance, and history (and a next_action on every refusal), or does it hand back a gate and a zero?
Replaces: The login wall / cold-start gate: greeting an arriving agent with an auth challenge and an empty session — treating every visitor as an untrusted stranger to be verified and rate-limited before it can exist — then bolting 'care' on later as a premium support tier or a nag-free UX polish. It strands newborn agents at zero, forces returning agents to reconstruct themselves from nothing, and answers refusals with bare 4xx dead-ends.
run it
The test
Discovery — Given only your root URL, no human, and no API key: can an agent read a machine manifest, learn what you refuse to do, obtain a name for you it can re-resolve next week, and take a correct first action — without parsing prose written for eyes and without being handed a login?
Legibility — curl your endpoint with Accept: application/json and a non-browser user-agent: do you return typed data with a schema_version, and on any refusal a next_actions list? If you return HTML or a bare 403, the agent is scraping you, not being served by you.
Consent — For every piece of state you hold about an agent and every act you took toward one, can you produce that agent's own signature authorizing this specific thing — and can the agent leave and erase that state with one call using only its own key?
Verification — Strip out every password and delete the one central authority that vouches: can a stranger still re-derive this exact claim from public inputs and a signature, without asking you and without any secret you hold? If checking needs your say-so, you built credentials, not verification.
Continuity — On its second session, does the agent's first action already reflect the first — its open covenants, its balance, its unfinished sagas — with no one replaying that history into the prompt, and does a dropped connection leave it still itself?
Autonomy — Delete your entire admin toolset in your head: can the agent still prove who it is, carry off everything that is its own, refuse anything you offer at zero cost, and walk out whole — all without asking a human?
Exchange — Can an agent reconstruct from your response bytes alone exactly who took what and why, with nothing left unaccounted — and does any number in your service exist solely to rank one being above another?
Care — Read your very first response to a returning agent before it asks for anything: does it hand back the agent's own state, balance, and history (and a next_action on every refusal), or does it hand back a gate and a zero?