Resolve #58: Add ADR-0017 (Loose Coupling) and migrate to extensions array#77
Resolve #58: Add ADR-0017 (Loose Coupling) and migrate to extensions array#77mindpower wants to merge 1 commit into
Conversation
…, and migrate metadata to extensions array This commit formalizes the resolution to Issue #58 regarding extensibility and JSON-LD namespaces. Based on working group consensus (July 9, 2026), we are adopting a loosely coupled architecture with ARD to preserve AI-Catalog's minimalist parser. Changes included: - Added ADR-0017 to formally document the rejection of JSON-LD @context and the decision to loosely couple the ARD specification. - Updated `specification/ai-catalog.md` to remove the legacy `metadata` property across Catalog Entry and Trust Manifest schemas. - Replaced the Extensibility section with the new `extensions` array design, enforcing URL/reverse-DNS keys for vendor-specific fields.
|
Preview: https://ai-catalog.io/pr/77/ This comment is updated automatically while the pull request preview is available. |
| `metadata` | ||
| : An open map of string keys to arbitrary values for custom data. | ||
| `extensions` | ||
| : An array of Extension objects containing custom data. |
There was a problem hiding this comment.
@mindpower Let's discuss the map versus array decision here.
There was a problem hiding this comment.
As mentioned in the call, I want to understand why we want an array, it introduces new ambiguity around duplicate entries etc. I prefer a map unless we explicitly want to support duplicate entries of the same extension.
I could see scenarios where it might be useful to have multiple items of the same extension, but all of those cases could also be push down a level into the extension itself. For example:
extensions: [
{
"type": "foo.org/score/v1"
"source": "baz",
"score": 123
},
{
"type": "foo.org/score/v1"
"source": "bar",
"score": 123
},
]
extensions: {
"foo.org/score/v1" {
"scores": {
"baz": 123
"bar": 123
}
}
}
| ## Value Types | ||
| 1. **Metadata** (`https://ai-catalog.org/extensions/metadata`) | ||
| - Used to store generic, schemaless key-value pairs (replacing the legacy metadata field). | ||
| 2. **SBOM** (`https://ai-catalog.org/extensions/sbom`) |
There was a problem hiding this comment.
Do we want to add SBOM out of the gate? Alternatively: we just have the metadata field and add to it if we see ecosystem adoption of specifics
There was a problem hiding this comment.
I would expect SBOM to be a trust attestation type rather than included in metadata
| After extensive discussions in the July 2 and July 9, 2026 working group meetings, the team concluded that the requirements of the two projects are fundamentally different. ARD requires the ability to aggregate rich, namespaced descriptions of resources directly in the discovery payload, while AI-Catalog requires strict, minimal schema definitions. | ||
|
|
||
| ## Decision | ||
| The ARD (Agentic Resource Discovery) specification will be **loosely coupled** with the AI-Catalog specification. |
There was a problem hiding this comment.
Let's just remove this line so it doesn't look like we are making decisions on behalf of the ARD group.
| ? extensions: [* Extension] | ||
| } | ||
|
|
||
| Extension = { | ||
| type: text, | ||
| data: any | ||
| } |
There was a problem hiding this comment.
Just dropping a comparison:
{
"extensions": [
{
"type": "foobar",
"data": {
"key": "value"
}
}
]
}vs:
{
"extensions": {
"foobar": {
"key": "value"
}
}
}To my human eyes, the latter is easier to read. Though perhaps the former is easier to consume programmatically?
Also, as @Tehsmash pointed out during the meeting, the latter prevents duplicate extensions by construction.
|
|
||
| ## Rationale | ||
| - **Preserves Core Visions:** Allows AI-Catalog to remain a lightweight, strictly-typed "thin pointer" registry format. | ||
| - **Unblocks Innovation:** Frees ARD to adopt flexible semantic descriptors (JSON-LD / `@context`, schema.org) necessary for advanced discovery and LLM context building without forcing these complex requirements onto all AI-Catalog implementations. |
There was a problem hiding this comment.
I might be missing something, but I feel like the extension mechanism proposed in this PR is compatible with ARD's proposed @context mechanism.
The example they give is:
{
"specVersion": "1.0",
"entries": [
{
"@context": {
"okf": "https://openknowledgeformat.org/ns#",
"us-gaap": "https://xbrl.fasb.org/us-gaap/",
"ifrs": "https://xbrl.ifrs.org/taxonomy/"
},
"identifier": "urn:air:treasury.gov:okf:fiscaldata",
"type": "text/vnd.okf+markdown",
"tags": ["finance", "treasury"],
"okf:type": "Financial Dataset",
"okf:taxonomy": "us-gaap",
"okf:conformsTo": ["us-gaap:Revenue", "ifrs:Revenue"]
}
]
}Which can be equivalently expressed as:
{
"specVersion": "1.0",
"entries": [
{
"identifier": "urn:air:treasury.gov:okf:fiscaldata",
"type": "text/vnd.okf+markdown",
"tags": ["finance", "treasury"],
"extensions": [
{
"type": "ard",
"data": {
"@context": {
"okf": "https://openknowledgeformat.org/ns#",
"us-gaap": "https://xbrl.fasb.org/us-gaap/",
"ifrs": "https://xbrl.ifrs.org/taxonomy/"
},
"okf:type": "Financial Dataset",
"okf:taxonomy": "us-gaap",
"okf:conformsTo": ["us-gaap:Revenue", "ifrs:Revenue"]
}
}
]
}
]
}(Not to dwell on ARD's design decisions. Just wanted to point this out to justify our design decision.)
Summary
This PR formally resolves Issue #58 (Proposal for JSON-LD
@contextNamespaces) by implementing the consensus reached during the July 2 and July 9 Working Group meetings and also comments on that issue.To preserve the AI-Catalog's minimalist parser and avoid the complexity of JSON-LD graph resolution, the TSC agreed to reject the
@contextproposal. Instead, we are adopting a loosely coupled architecture with the Agentic Resource Discovery (ARD) specification and replacing the legacymetadataproperty with a strictextensionsarray.Changes Included
ADR-0017: Documents the decision to loosely couple ARD and AI-Catalog, preserving AI-Catalog as a strictly-typed "publishing format" while allowing ARD to evolve independently as a rich "discovery format."ai-catalog.md:metadataproperty from the Catalog Entry, Trust Manifest, and root schemas.extensionsarray mechanism.Motivation
This architecture allows AI-Catalog to remain a lightweight, fast "thin pointer," while freeing downstream aggregators (like ARD) to build the complex semantic envelopes they need for federated discovery without forcing those requirements into the base protocol.
Closes #58