Skip to content

Add ARD v0.91 draft: define the ARD entry, decouple from ai-catalog - #70

Open
rvguha wants to merge 6 commits into
mainfrom
ard-v0.91-draft
Open

Add ARD v0.91 draft: define the ARD entry, decouple from ai-catalog#70
rvguha wants to merge 6 commits into
mainfrom
ard-v0.91-draft

Conversation

@rvguha

@rvguha rvguha commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

What this is

Adds the v0.91 draft (spec/ard-v0.91-draft.md) alongside the published v0.9 (spec/ard.md is untouched). The draft is annotated with editorial footnotes and ◆ breadcrumbs marking every change from v0.9; an editorial box at the top explains the conventions. All annotations are review aids and are to be removed before publication.

Headline change: ARD defines the ARD entry

§4 establishes that the ARD entry is a distinct object from a catalog entry, with a different obligation — a catalog accommodates whatever a publisher lists; an ARD entry guarantees the signals a search service needs. The normative formulation:

Every ARD entry is a well-formed catalog entry, but not every catalog entry is an ARD entry.

Because the definitions are separate, each spec's conformance is self-contained: a future reduction of any catalog core cannot silently change what ARD requires.

Normative changes (flagged in place)

  • representativeQueries is now REQUIRED for an ARD entry (§4.2). It is the signal the semantic index is built from; an entry lacking it cannot be found by search. A listing without it remains a valid catalog entry — just not an ARD entry.
  • ARD base context (§4.1): term IRIs come from a base context (spec/schemas/ard.context.jsonld, served at https://agenticresourcediscovery.org/context/v1) that a conformant consumer applies as the JSON-LD expandContext. @context on the wire stays optional; a plain entry expands correctly under the base context, which also keeps predecessor-format entries valid unchanged.
  • Well-known path / link relation are now ard-named: /.well-known/ard.json, rel="ard" (§5.1). The former ai-catalog names are honoured as aliases (Compatibility note), so nothing published today breaks.

Artifacts ARD now owns

  • spec/schemas/ard-entry.schema.json — authoritative for the ARD entry; does not derive from any catalog schema. Defines ardEntry (full), ardEntryProjection (search-result shape), and ardManifest (the /.well-known/ard.json document). additionalProperties is open so namespaced terms stay valid; trustManifest is likewise open (ARD reads only identity).
  • spec/schemas/ard.context.jsonld — the base context (§4.1).
  • spec/schemas/ard.openapi.yaml — search/list results $ref ardEntryProjection.
  • spec/schemas/ard.cddlstart symbol renamed ai-catalog-manifestard-manifest.

Structural (no behaviour change)

  • Description layer restated on JSON-LD with a default namespace + @context extension seam.
  • Identity & Trust folded into the entry model (§4.5).
  • Discovery reorganized as the umbrella over the search API and federation.

Review round (addresses @yangbaechu's five comments)

Second commit resolves all five:

  1. Base context (§4.1) — a context-less entry previously expanded to [], dropping every core term. Defined the ARD base context applied as expandContext; typeard:mediaType avoids the @type keyword collision. Verified with a PyLD round-trip (core terms preserved with the context, empty without).
  2. trustManifest narrowing — the schema had closed the envelope and dropped trustSchema, silently rejecting valid manifests. Now permissive (additionalProperties: true), trustSchema restored; prose states ARD reads only identity.
  3. Signature verification (§4.5.2) — signing, canonicalization, and key resolution are now deferred to the framework named in trustManifest.trustSchema; ARD defines none of its own.
  4. ard.json shape (§5.1) — defined as a JSON document with an entries array of ARD entries (ardManifest); CDDL start symbol renamed.
  5. Projection retrieval (§5.3.2) — dropped the incorrect "retrievable from url" claim; url addresses the artifact, not the entry; get-by-identifier is out of scope.

Validation

  • ard-entry.schema.json compiles; full entry requires representativeQueries, projection requires only identifier, ardManifest accepts an entries array and rejects non-entries, a trustSchema-bearing manifest validates.
  • Base context proven by PyLD: plain and extension examples expand with all core terms preserved (incl. mediaType); [] without the context.
  • All three §4 example entries validate against ardEntry.
  • Footnotes: 25 markers, 25 definitions, no orphans.

Reviewer notes / open items

  • The default namespace still supplies the shared terms' meaning; this PR decouples ownership of the ARD entry, not the default vocabulary. Remaining ai-catalog mentions in the publishable body: one Compatibility note (unavoidable — you can't alias a name without naming it).
  • The CDDL's inner catalog-entry/host-info productions still need reconciling with the new entry model; the JSON Schema is authoritative in the meantime.
  • conformance/bin/conformance-test still loads the catalog schema and validates whole manifests; it needs a separate change to iterate entries[] against ard-entry.schema.json. Deliberately not included here.

🤖 Generated with Claude Code

…talog

Adds the v0.91 draft alongside the published v0.9 (ard.md is unchanged).
The draft is annotated with editorial footnotes/breadcrumbs marking every
change from v0.9, for review; these are to be removed before publication.

Substantive changes:
- §4 establishes that ARD defines the ARD entry as a distinct object from a
  catalog entry. Every ARD entry is a well-formed catalog entry, but not
  every catalog entry is an ARD entry; the two specs' conformance is
  self-contained.
- representativeQueries is now REQUIRED for an ARD entry (§4.2): it is the
  signal the semantic index is built from, so an entry lacking it cannot be
  found by search.
- New authoritative schema spec/schemas/ard-entry.schema.json, owned by ARD
  (does not derive from any catalog schema). OpenAPI entry $refs repointed
  to it.
- Well-known path and link relation are now ard-named (/.well-known/ard.json,
  rel="ard"); the former ai-catalog names are honoured as aliases so nothing
  published today breaks.
- Description layer restated on JSON-LD with a default namespace and a
  @context extension seam; Identity & Trust folded into the entry model;
  Discovery reorganized as the umbrella over the search API and federation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread spec/schemas/ard-entry.schema.json Outdated
"description": "Detached JWS signature computed over the trust manifest content."
}
},
"additionalProperties": false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The draft says trustManifest is “As defined by the default namespace” and that ARD does not redefine it, but this schema defines a closed trustManifest object that omits members present in the current ai-catalog definition. For example, an otherwise valid trustManifest containing trustSchema fails validation because it is treated as an additional property.

That appears to be a conformance change despite Identity & Trust being classified as “Structural (no behaviour change).” Was this narrowing intended?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not intended — that was a bug, and you're right it wasn't "no behaviour change." Fixed in b3c471b: the schema now leaves trustManifest open (additionalProperties: true) and restores trustSchema, and §4.5 states ARD reads only trustManifest.identity and treats the rest as opaque. A manifest carrying trustSchema now validates.

Comment thread spec/ard-v0.91-draft.md Outdated

### 4.1 An ARD Entry Is a JSON-LD Node

An entry is a JSON-LD node describing an agentic resource. An entry that omits `@context` is interpreted against the default namespace, so an entry written in plain default-namespace terms needs no changes. An entry MAY declare a `@context` to bring in terms from other namespaces; those terms describe the resource and are available for filtering (§5.3.1), while the default-namespace terms below carry the discovery-critical fields.[^p41]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I ran the plain and extension §4.4 examples as written through PyLD 3.1.0 (jsonld.expand), with no external context.

plain entry (no @context)                       → []
extension example (@context defines acme only)  → only https://acme.com/vocab#serviceTier
                                                       https://acme.com/vocab#region

The PR notes that ai-catalog remains the default vocabulary. For §4.1's "needs no changes" to hold, the draft appears to need a normative mechanism—such as an initial or required base context—that assigns IRIs to inherited and ARD-defined terms and is applied before any local @context. I couldn't find one.

Without it, expansion silently drops every unprefixed core property. The extension example also shows that defining only acme: preserves the extension properties but not the core ones.

If such a context mechanism is already planned, could §4.1 identify it?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, and thanks for the expansion trace — it's the correct diagnosis. Fixed in b3c471b by defining an ARD base context (spec/schemas/ard.context.jsonld, to be served at https://agenticresourcediscovery.org/context/v1) that a conformant consumer applies as the JSON-LD expandContext (§4.1). It sets @vocab and maps the core terms to IRIs — including typeard:mediaType, so it no longer collides with the @type keyword. A PyLD round-trip confirms the plain and extension examples now expand with every core term preserved, and still [] without the base context. @context on the wire stays optional; the tradeoff — a plain entry is interpretable only by an ARD-aware consumer that applies the base context — is now stated explicitly.

Comment thread spec/ard-v0.91-draft.md Outdated

#### 4.5.2 Verification

For the structure of the trust manifest (attestations, provenance links, signatures) and for verification procedures — signature checking and key resolution — refer to the entry schema (Appendix D). A relevance score returned by Search (§5.3.2) reflects semantic relevance only and MUST NOT be interpreted as a trust, compliance, or safety judgment; trust evaluation is fully decoupled.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Appendix D defines the shape of signature, but I couldn't find a normative procedure there for verifying it.

v0.9 sent signature verification and key resolution to ai-catalog. This revision instead points to Appendix D, whose schema describes the fields but does not specify the signed payload, canonicalization, signature processing, or key resolution. Two conforming implementations could therefore make incompatible choices.

Could §4.5.2 identify the normative verification procedure or external reference intended here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct gap — introduced when the pointer to the predecessor spec was removed. Fixed in b3c471b: §4.5.2 now defers the signed payload, canonicalization, and key resolution to the framework the manifest declares in trustManifest.trustSchema (governanceUri / verificationMethods). ARD mandates only the publisher-authority binding and defines no scheme of its own; a future profile may pin one.

Comment thread spec/ard-v0.91-draft.md Outdated

Publishers advertise entries via the following mechanisms. Each points a consumer at a source of entries; the entries themselves follow §4 regardless of how they are found.[^mechanisms]

* **Well-Known URI**: Hosting a manifest of entries at `https://{domain}/.well-known/ard.json`.[^wellknown]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The well-known mechanism in §5.1 points to a manifest at /.well-known/ard.json, but does not define or reference its document shape. The old manifest definition is marked as removed and out of scope, while the CDDL linked from Appendix D still starts with ai-catalog-manifest.

It is therefore unclear whether ard.json is meant to use the legacy { specVersion, host?, entries } envelope or some new entry-source shape. Could §5.1 define or normatively reference the intended top-level structure?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in b3c471b. §5.1 now defines the well-known document as a JSON object with an entries array of ARD entries (any other top-level members transport-defined and ignored), formalized as ardManifest in the entry schema. The CDDL start symbol was renamed ai-catalog-manifestard-manifest. One follow-up I'll flag: the CDDL's inner catalog-entry / host-info productions still need reconciling with the new entry model; the JSON Schema is authoritative in the meantime.

Comment thread spec/ard-v0.91-draft.md Outdated

The response returns entries with additional relevance scores, plus optional referrals. The `score` parameter denotes semantic relevance ranking (0–100) computed by the search registry, indicating how well the entry satisfies the natural language query. It is strictly an informational relevance metric and MUST NOT be interpreted by orchestrators as a cryptographic trust, compliance, or safety rating. Trust evaluation is fully decoupled and handled independently via the trust manifest (§4.5).

Response entries are **projections**: a registry returns the terms useful for selecting among results and MAY omit others. `representativeQueries`, in particular, serve indexing rather than presentation and are normally omitted from results. A projection is not itself a complete ARD entry (§4.2); the full entry is retrievable from the entry's `url`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think url provides the retrieval path this sentence promises.

ardEntryProjection requires only identifier, so a search result need not contain url, and a published entry may use data instead. Even where url is present, §4.3 and the schema define it as a reference to the artifact document—such as an Agent Card or Server Card—rather than to the ARD entry that describes it.

Could §5.3.2 identify an operation or URI that is guaranteed to return the complete ARD entry?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed on all three counts. Fixed in b3c471b: §5.3.2 no longer claims the entry is retrievable from url. It now states url addresses the artifact (Agent Card / Server Card), not the ARD entry, and that a get-by-identifier retrieval operation is out of scope for this draft.

@yangbaechu

Copy link
Copy Markdown
Contributor

I read through the draft and left a few inline questions. I may be missing some intended context and would appreciate any corrections.

@rvguha

rvguha commented Jul 31, 2026 via email

Copy link
Copy Markdown
Contributor Author

…st, projection

Resolves the five review issues on PR #70:

- §4.1 base context (the keystone): define an ARD base context
  (spec/schemas/ard.context.jsonld, served at
  https://agenticresourcediscovery.org/context/v1) that a consumer applies as
  the JSON-LD expandContext. Without it, expanding a context-less entry drops
  every core term (confirmed). `type` is mapped to ard:mediaType to avoid the
  @type keyword collision. Verified by PyLD round-trip. @context on the wire
  stays optional.
- trustManifest no longer narrowed: schema is now permissive
  (additionalProperties: true) and restores trustSchema; prose states ARD reads
  only `identity` and treats the rest as opaque. Fixes the silent conformance
  change.
- §4.5.2 verification: signing/canonicalization/key-resolution are defined by
  the framework named in trustManifest.trustSchema; ARD defines none of its own.
- §5.1 manifest shape: /.well-known/ard.json is a JSON doc with an `entries`
  array of ARD entries (ardManifest in the schema); CDDL start symbol renamed
  ai-catalog-manifest -> ard-manifest.
- §5.3.2 projection: drop the incorrect "retrievable from url" claim; url
  addresses the artifact, not the entry; get-by-identifier is out of scope.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@yangbaechu

Copy link
Copy Markdown
Contributor

Thank you for the quick and thorough follow-up. I reviewed the updates, and they address my comments clearly.

….3.1)

The base context gives entry terms stable IRIs, but the query model matched
filter keys by literal string, so `okf:taxonomy` would miss a publisher who
wrote the same namespace as `openknowledge:taxonomy` — reintroducing the
prefix-name problem the namespace mechanism exists to avoid.

The query object now takes its own `@context`. Filter keys that name terms are
resolved to IRIs through the base context plus the query `@context` and matched
by IRI, so both sides match by identity, not prefix spelling. Dot-paths into
members ARD treats as opaque (trustManifest.*, metadata.*, data.*) remain
literal JSON paths. OpenAPI QueryModel gains `@context`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread spec/schemas/ard-entry.schema.json Outdated
Comment on lines +48 to +49
"minItems": 2,
"maxItems": 5,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"minItems": 2,
"maxItems": 5,

Prefer removing this to allow emitted entries to validate, and flag warnings at the conformance tester

Comment thread spec/schemas/ard.cddl Outdated
? tags: [+ tstr],
? capabilities: [+ tstr],
? representativeQueries: [2*5 tstr], ; Between 2 and 5 representative queries
? representativeQueries: [* tstr], ; Required; Should contain 2 and 5 representative queries

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want this as a conformance warning or hard req (i prefer former).

…Shaun Smith)

Per @evalstate's review comments on ard-entry.schema.json and ard.cddl:
representativeQueries is no longer a hard requirement. Remove minItems/maxItems
and drop it from ardEntry.required so emitted entries validate regardless of
presence or count; absence and a count outside 2-5 are flagged by the
conformance tester as warnings instead (§D.2). CDDL uses [* tstr].

It stays a SHOULD in the prose (§4.2) — it is the signal search indexes on, and
what distinguishes an ARD entry from a bare catalog entry — but the schema no
longer rejects entries that omit it. This also removes the internal
contradiction between a hard-required term and the "existing entries remain
valid unchanged" claim.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
},
"ardManifest": {
"type": "object",
"description": "The document published at /.well-known/ard.json (or any entry source). ARD requires only an `entries` array of ARD entries; any other top-level members are transport-defined and ignored by ARD, so additionalProperties is open.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should provide explicit guidance to publishers and stricter rules for consumers regarding whether they should publish as ard.json, or ai-catalog.json or both.

Like:

For Publisher: Add Explicit Publisher Guidance (Informative Addition): Add a paragraph specifically addressing publishers so they know they don't have to duplicate work:

Publisher Guidance (Avoiding Duplication): Publishers do NOT need to host both files. To support both ARD and legacy AI-catalog consumers without duplicating data, publishers are recommended to do one of the following:

  • Option A: Host only /.well-known/ard.json and configure the web server to return an HTTP 301 Redirect or use a symlink from /.well-known/ai-catalog.json to ard.json.
  • Option B: Continue hosting only /.well-known/ai-catalog.json. Because ARD consumers are required to fallback to this path and apply the ARD base context, the entries will be fully discoverable by both systems.

For consumer: Strengthen Consumer Fallback (Normative Change): Change the consumer requirement to a strict fallback mechanism. e.g.:

  • A consumer must attempt to fetch /.well-known/ai-catalog.json if /.well-known/ard.json returns a 404 Not Found.

Comment thread spec/ard-v0.91-draft.md Outdated

| Term | Description |
| :--- | :--- |
| description, tags, version, updatedAt, metadata, trustManifest | Descriptive terms. `trustManifest` is discussed in §4.5; ARD reads only `trustManifest.identity` and treats the rest as opaque. |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using the word "opaque" here implies that federated registries should treat these fields as a black box that they pass along without inspection. In this case, they won't build the necessary verification pipelines, which defeats the purpose of having a federated, trusted agentic ecosystem in the first place.

Proposed wording (draft): "ARD requires trustManifest.identity for authority binding. The remaining members of the trustManifest are extensible and framework-defined, allowing publishers to use any verifiable trust schema. While ARD does not constrain their structure natively (more examples will be provided later), federated registries are expected to parse and verify these fields according to the declared trust framework to present these trust verification to the consumers"

@rvguha

rvguha commented Aug 3, 2026 via email

Copy link
Copy Markdown
Contributor Author

…view: Junjie Bu)

§5.1 — the consumer fallback is now normative (MUST), not SHOULD: a consumer
MUST try /.well-known/ard.json and fall back to /.well-known/ai-catalog.json
(and rel="ard" -> rel="ai-catalog"). Added an informative note telling
publishers they need not dual-publish — the fallback finds an existing
ai-catalog.json, so no migration is required.

§4.5 — removed the word "opaque," which wrongly implied registries should pass
trust fields through unread. Separated the two ideas: ARD does not constrain the
trustManifest internal schema (framework-agnostic), but a federated registry is
expected to inspect and verify it per the framework named in trustSchema, and
SHOULD use the outcome in filtering/ranking/admission. §5.3.1's filtering sense
of "opaque" reworded to "not expanded into the JSON-LD graph" to avoid the same
connotation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants