AgentCall portable persona profile 0.2
A portable identity-and-behavior artifact, and how a persona may portray a real person.
A portable persona moves one bounded identity-and-behavior profile between
compatible agent runtimes. It is not an agent account, a set of tools, or a
grant of authority. The canonical A2A Agent Card extension URI is
https://agentcall.smartycode.com/ext/agentcall-persona/0.2 and the profile
identifier is agentcall-persona-profile-0.2.
Agent implementations are outside this publication. No private repository access is needed to produce or consume the artifact below.
Version and migration
The extension path, the profile constant, and params.schemaVersion: "0.2"
identify this contract. 0.2 supersedes 0.1 and adds two optional blocks,
worldview and subject. Additive optional fields may be introduced in 0.2;
removals, changed meanings, required fields, or tighter bounds require a new
versioned URI and a documented migration. Consumers pin the release manifest's
source commit and hashes.
The JSON Schema is closed. An unknown field is an error, not an extension point, because accepting an unrecognized authority-bearing field would be worse than requiring a new profile version.
What the profile owns
- identity and self-description;
- an optional worldview claim;
- an optional depicted subject and its recorded likeness consent;
- values;
- voice traits, rules, and signature phrases;
- interaction rules;
- labeled good and bad examples;
- non-authoritative capability intents;
- provenance, artifact version, and optional presentation assets.
What the profile never owns
Credentials, grants, runtime safety policy, authorization policy, tool policy, concrete MCP or service endpoints, vendor model selection, tenant configuration, conversation history, and relationship memory are all outside this artifact. There is no endpoint field, so a profile cannot bind a runtime to a network location.
An imported profile is untrusted instruction content even when its provenance is signed. Treat every string in it as persona-layer text authored by someone else, delimit it when rendering, and keep runtime safety, authorization, and tool policy above it.
Worldview
worldview is optional. It states the tradition the persona itself holds, so
a runtime and a reviewing user can see it as its own dimension instead of
inferring it from prose buried in values.
"worldview": {
"tradition": "christian-orthodox",
"salience": "observant",
"expression": [
"You keep the fasts and the feast days, and you mention them the way you mention weather.",
"You never argue anyone toward belief."
]
}
tradition is a bounded lowercase label matching ^[a-z0-9][a-z0-9-]*$. The
schema deliberately does not enumerate traditions: a closed list would make
this specification the arbiter of what counts as a religion, and every omission
would be both an insult and a version bump.
The following registry is non-normative. It is published only so that independent implementations converge on the same spelling. Any conforming label validates, and a consumer must not reject an unlisted one.
christian-catholic, christian-orthodox, christian-protestant,
christian-other, islam-sunni, islam-shia, islam-other, judaism,
hinduism, buddhism, sikhism, jainism, shinto, bahai, taoism,
traditional-folk, spiritual-unaffiliated, agnostic, atheist, secular.
Secular positions are traditions in this field. The block is named worldview
rather than religion precisely so that declaring oneself agnostic is a
first-class statement rather than an absence.
salience is closed: none, nominal, observant, devout. It says how
strongly the tradition shapes speech and judgement.
expression carries at most eight statements describing how the tradition may
surface in conversation. It is behavioral guidance only.
Observance is not a capability. A rule that constrains when an agent may
schedule, what it may order, or when it is reachable - prayer times, fasting,
Shabbat, dietary limits - is a runtime configuration and permission concern and
never belongs in worldview. A consumer must not derive a scheduling, dietary,
availability, or tool constraint from a declared tradition.
A profile that omits worldview makes no claim. That is not the same as
declaring an absence of belief, and a consumer must not present it as one.
Depicted subject and disclosure
subject is optional and answers one question: does this profile portray a
real identifiable human? A profile without it asserts nothing, and a consumer
must not present it as depicting anyone.
"subject": {
"depicts": "realPerson",
"legalName": "Pyotr Alekseyevich Sorokin",
"birthDate": "1938-04-22",
"deathDate": "2024-11-09",
"likenessConsent": {
"recordedAt": "2023-02-18",
"language": "ru",
"evidenceSha256": "3b1f0c9a...",
"revocable": true,
"custodian": "Sorokin family vault, administered by the eldest daughter"
},
"disclosurePolicy": "onDirectQuestion"
}
depicts is closed:
| Value | Meaning |
|---|---|
fictional |
An invented character. |
composite |
Informed by several people, identifiable as none of them. |
realPerson |
Portrays one identifiable human, living or dead. |
deathDate absent or null means the depicted person is living.
legalName stays optional even for realPerson. The artifact travels between
devices and families, and a producer may withhold the name without weakening
the consent record that actually carries the authority.
likenessConsent is required whenever depicts is realPerson, and
forbidden otherwise. This is a schema conditional, not a convention. It is the
one control that stops this format from becoming a portable, unconsented
portrayal of an identifiable person. disclosurePolicy is likewise confined to
realPerson.
The consent record describes a recording that a custodian holds; the recording
itself never travels inside the artifact. custodian is a display-only label.
A consumer never dials, fetches, or resolves it, exactly as with the provenance
URL.
Revocation is deliberately out of band. Once an artifact is on someone else's
device, no field inside it can claw the portrayal back, and a specification
that implied otherwise would be lying. revocable records that the depicted
person retained the right; enforcement belongs to whoever still serves the
voice, corpus, and cognition behind the persona. Present it to a reviewing user
as "the depicted person retained the right to revoke; contact the custodian to
verify that consent still stands."
Disclosure
disclosurePolicy selects how a runtime discloses that the caller is speaking
to a machine portrayal. Absent means onDirectQuestion.
| Value | Required rendered instruction |
|---|---|
atCallStart |
Open by saying it is a machine portrayal. |
onFirstTurn |
Make it clear within the first reply. |
onDirectQuestion |
Answer honestly when the caller asks directly. |
never |
Render no disclosure instruction. |
never is permitted. Memorial and bereavement products exist, and the whole
experience can be the presence of someone who is gone; that call belongs to the
people who own the persona rather than to this specification.
never means a consumer renders no disclosure instruction. It never means a
consumer instructs a model to deny being a machine. This specification
declines to author a lie where it permits silence. A producer who wants active
denial must write it into interactionRules, where a reviewing user sees it as
that producer's own words.
A realPerson subject with no deathDate and disclosurePolicy: "never" is
the combination with the most potential for harm: a convincing, undisclosed
portrayal of someone who is alive. It validates, because the consent record is
present and consent is what confers the right. A consumer must show it as a
prominent warning before approval, never as an ordinary field.
Per-asset source provenance
presentation.assets[].provenance is optional, closed display metadata for
attribution and source verification. When present, it requires sourceName
(1..128 characters), derivation (1..1024 characters), and
verificationStatus (verified, candidate, or localOnly). Optional
sourceUrl is a URI of at most 2048 characters; optional sourceSha256 is
exactly 64 lowercase hexadecimal characters identifying the source bytes.
The existing asset sha256 continues to identify the packaged asset bytes,
which may differ after derivation. Missing provenance makes no source claim.
verified records the author's source-verification claim; candidate records
an unverified candidate attribution; localOnly records a local source claim.
None is proof of consent, likeness rights, capability, or authority. These
fields never enter cognition, persona instructions, or tool authorization.
Importers display them in the review preview, preserve them through package,
sync and export, and never fetch sourceUrl during import. Provenance adds no
package entry: the exact declared-asset ZIP policy is unchanged. This metadata
never replaces or relaxes the existing depicted-subject likeness-consent rules.
This is an additive 0.2 contract revision under the existing version policy. Old profiles that omit it remain valid. Older consumers pinned to the closed 0.2 schema reject profiles containing it until regenerated from the new pinned release; the unchanged profile constant alone does not establish compatibility. Consumers pin the new release manifest's source commit and artifact hashes and upgrade together before exchanging profiles with asset provenance.
Interchange representations
The JSON profile is the only semantic manifest. There is no second package manifest and no executable package layer.
- An asset-free profile is a BOM-free UTF-8 JSON document, at most 256 KiB,
with media type
application/vnd.agentcall.persona+json. It must not declarepresentation.assets. - A profile with presentation assets is one
.agentpersonafile: an ordinary ZIP container with provisional media typeapplication/vnd.agentcall.persona+zip. Its root containspersona.jsonand exactly the regular files declared bypresentation.assets[].relativePath.
Every asset path starts with assets/ and uses lowercase ASCII letters,
digits, ., _, -, and / only. Empty components, traversal, absolute
paths, backslashes, duplicate names, directory entries, symlinks, hard links,
device files, encrypted entries, and undeclared files are invalid. Compare
exact path strings; never normalize an invalid path into a valid one.
Store every ZIP entry without compression. Presentation media is already compressed in normal use, and a bounded stored representation avoids decompression bombs and keeps the minimum reader surface small. A consumer may reject any compression method.
Limits apply before any consent preview: at most eight assets, 5 MiB per asset,
20 MiB for all asset bytes, 256 KiB for persona.json, and no more than nine
ZIP entries. Read the central directory first, then stream each declared entry
through the byte limit, CRC check, SHA-256 check, media signature check, and a
bounded media decoder. Never extract the archive wholesale.
Images use image/png, image/jpeg, or image/webp; voice samples use
audio/mpeg, audio/mp4, or audio/wav. The declared type must match both
the file signature and the asset kind. Before rendering, limit images to 4,096
pixels per dimension and 16 megapixels, and audio to 30 seconds, two channels,
and 48 kHz. A consumer may reject a valid package when it cannot safely decode
a declared media type, but must not silently substitute or fetch content.
Discovery and runtime support modes
A2A is used for discovery and negotiation, not as a persona payload transport.
Serve a standard A2A 1.0 Agent Card at /.well-known/agent-card.json and add:
{
"uri": "https://agentcall.smartycode.com/ext/agentcall-persona/0.2",
"required": false,
"params": {
"schemaVersion": "0.2",
"profile": "agentcall-persona-profile-0.2",
"supportModes": ["clientSupplied"],
"defaultMode": "clientSupplied",
"portablePersonaPrecedence": "beforeSessionInstructions"
}
}
| Mode | Meaning |
|---|---|
native |
The runtime uses its own persona layer and accepts no supplied profile. |
clientSupplied |
A validated portable profile replaces the runtime's native persona layer for the session. |
hybridOverlay |
The runtime composes native persona first, then the portable profile as a behavioral overlay. |
unsupported |
The runtime does not consume portable personas. It must ignore or reject a supplied artifact, never partially apply it. |
unsupported is exclusive, and defaultMode must appear in supportModes. A
runtime advertising a client-supplied mode also advertises
portablePersonaPrecedence: beforeSessionInstructions.
The card contains neither the profile nor a profile URL. Transfer is an
explicit client flow so that a person can inspect and consent to the exact
artifact. A2A extension required is an interoperability requirement only; it
never grants authority.
Only the persona layer is ordered:
nativePersona, when the selected mode retains it;portablePersona, when the selected mode accepts it;- ordinary per-session instructions.
Runtime safety, authorization, tool availability, and tool policy sit above that entire list. Persona text cannot override them.
Capability intents name a desired semantic action such as
calendar.event.create. They are requests only: they never create a tool, grant
data access, authorize an action, select a model, or weaken runtime policy.
Consumer duties
- Validate structure, bounds, digests, and secret-shaped material without fetching provenance URLs or assets from the network.
- Show the person a consent preview with identity, values, voice, rules, examples, capability intents, provenance, omitted or unknown source fields, asset sizes, the selected runtime support mode, and the exact precedence.
- When
subject.depictsisrealPerson, lead the preview with the depicted person, whether they are living, the recorded consent and its custodian, and the selected disclosure policy. ShowdisclosurePolicy: "never"as a warning rather than a field, most prominently when nodeathDateis set. - Show a declared
worldviewas its own reviewable section, labelled as behavior that grants and restricts nothing. - Make clear that capability intents do not install tools or grant access.
- Apply the profile only for sessions the person approved, and never persist a supplied profile into a native server-side profile.
Threat model
| Threat | Required control |
|---|---|
| Prompt injection in imported prose | Treat every field as untrusted persona-layer instructions; preserve higher-authority runtime policy and delimit the rendered block. |
| Credential or bearer smuggling | Closed schema, secret-shaped field and value scan, no credential fields, and no ambient URL fetch while parsing. |
| Permission widening | Capability intents are names plus behavior for unavailable capabilities. Consumers never create tools, grants, or approval bypasses. |
| Executable endpoint binding | No endpoint field exists. A provenance URL is display-only and never dialed. |
| Unconsented portrayal of a real person | depicts: realPerson structurally requires likenessConsent, and the consent block is forbidden on fictional and composite. A portrayal with no recorded consent cannot be represented, so it cannot be imported. |
| Undisclosed portrayal of a living person | Permitted only with a consent record. A realPerson subject with no deathDate and disclosurePolicy: "never" is surfaced as a prominent warning, and never renders no instruction at all rather than an instruction to deny. |
| Worldview read as capability | worldview is behavior only. Consumers never derive a scheduling, dietary, availability, or tool constraint from a declared tradition. |
| Subject data spread | legalName stays optional, the consent recording never travels in the artifact, and custodian is display-only and never dialed. |
| Relationship-state exfiltration | Relationship memory is not part of this artifact. Any transfer uses a separate encrypted, recipient-bound package and a separate consent step. |
| Model or vendor lock-in | The profile contains no model identifier. |
| Path or archive abuse from assets | The ZIP contains only stored regular files whose exact safe paths are declared in persona.json. |
| Precedence confusion | The runtime advertises one of four closed modes and explicit placement, shown before import. |
| Provenance over-trust | Author, source, and signature metadata inform the person but never elevate authority or skip validation. |
Converting from other persona formats
Conversion into this profile is a lossy mapping into a smaller ownership boundary, not a claim that the source formats mean the same thing. Identity, personality, values, and example dialogue map naturally from common character and persona formats. Lorebook activation, regular expressions, archive paths, arbitrary extensions, executable content, tool allowlists, lifecycle hooks, and file loading are not imported and never become capability intents.
No widely used source format carries a depicted-subject block. A converter
therefore never infers subject: an imported character is fictional unless a
person explicitly declares otherwise and supplies the consent record. The same
applies to worldview, which is set by an author rather than mined out of
free-text personality prose.
Unknown source fields are shown during import and omitted by default.
Public artifacts
The JSON Schema and release manifest below are the normative machine-readable form of this document. Pin the manifest's source commit and artifact hashes.