Discovery Extension
The discovery object carries the OASF skills and domains of an artifact on their own, without a record around them, so that other formats can embed them as an extension. A consumer can then search those artifacts by skill and domain with the same vocabulary as OASF records.
Payload
| Attribute | Requirement | Description |
|---|---|---|
schema_version |
required | The OASF version the payload conforms to. |
skills |
required | Skill references (name and/or id), as in a record. |
domains |
recommended | Domain references (name and/or id), as in a record. |
{
"schema_version": "1.1.0",
"skills": [{"name": "software_engineering/code_debugging/error_handling", "id": 60602}],
"domains": [{"name": "technology/networking/network_security", "id": 10305}]
}
A payload validates on its own like any other schema object, for example
through POST /api/validate/object/discovery on the
OASF server.
An unknown skill or domain fails with the same error as inside a record.
Extension Identifier
Each host format names the extension in the form it expects:
- A2A Agent Card: the URI
<schema_url>/<version>/objects/discoveryon the OASF schema server the payload validates against, for examplehttps://schema.oasf.outshift.com/1.1.0/objects/discovery. A server running locally works the same way. A2A identifies an extension by a URI and recommends hosting the extension's specification at it; this URI is the object's page on the schema server. Consumers recognize the extension by the/objects/discoverypath on a schema server they are configured to accept. - AI Catalog: the reverse-DNS key
org.agntcy.oasf.discovery.v1. AI Catalog entries are long-lived, so the key does not depend on where the schema is hosted.
In both formats the payload is the same, and its schema_version is the
version that counts; a version in the A2A URI is informational.
The reverse-DNS key is permanent: once artifacts carry it, it is not renamed.
A change to the payload that is not backward compatible gets a new key, such
as org.agntcy.oasf.discovery.v2.
Embedding
The payload is the same in every host format. Only its placement differs, because each host format fixes how an extension is wrapped: the payload goes, unchanged, into the slot that the host format reserves for extension data.
| Host format | Identifier | Where the payload goes |
|---|---|---|
| A2A Agent Card | uri of an AgentExtension, set to the URI |
params of that extension |
| AI Catalog | key of the entry's extensions map, set to the reverse-DNS |
value of that key |
A2A Agent Card
In an A2A Agent Card, the
payload is the params of an AgentExtension in capabilities.extensions:
{
"capabilities": {
"extensions": [
{
"uri": "https://schema.oasf.outshift.com/1.1.0/objects/discovery",
"description": "OASF skills and domains",
"params": {
"schema_version": "1.1.0",
"skills": [{"name": "software_engineering/code_debugging/error_handling", "id": 60602}],
"domains": [{"name": "technology/networking/network_security", "id": 10305}]
}
}
]
}
}
AI Catalog Entry
In an AI Catalog entry, the payload is the value
of the key in the entry's extensions map:
{
"specVersion": "1.0",
"entries": [
{
"identifier": "urn:example:agents:network-debugger",
"type": "application/a2a-agent-card+json",
"version": "1.0.0",
"url": "https://agents.example.com/network-debugger/.well-known/agent-card.json",
"extensions": {
"org.agntcy.oasf.discovery.v1": {
"schema_version": "1.1.0",
"skills": [{"name": "software_engineering/code_debugging/error_handling", "id": 60602}],
"domains": [{"name": "technology/networking/network_security", "id": 10305}]
}
}
}
]
}