spec: make Catalog Entry displayName optional (not required) (ADR 0016)#39
Merged
tadasant merged 5 commits intoJun 26, 2026
Merged
Conversation
e23aed1 to
ede6f35
Compare
Move `displayName` from the required members of a Catalog Entry to the OPTIONAL members, and drop it from the Minimal Catalog (Level 1) conformance requirement. Add guidance that `displayName` SHOULD be set only when the referenced artifact does not already carry its own canonical human-readable name (e.g. a raw dataset, model blob, or skill bundle), and SHOULD be omitted when the artifact carries one (A2A Agent Card `name`, MCP Server Card `title`) so the catalog does not duplicate a value that can drift out of sync. When both are present and disagree, the artifact's own name is authoritative. - Examples: card-backed entries (A2A cards, MCP Server Cards, registry server.json, plugin manifests) omit displayName; opaque artifacts (parquet datasets, skill zips) and nested catalogs keep it, since they have no embedded canonical name. HostInfo and Publisher displayName are unaffected -- they name the host/publisher org. - Conceptual-mapping tables (MCP registry, Claude plugins) updated so the human-readable name maps to the artifact, with displayName as the fallback only when the artifact lacks a name. An earlier draft of this change removed `displayName` from the entry level entirely; that was dismissed because opaque artifacts (e.g. the Parquet dataset in examples/ai-catalog.json) have no other home for a human-readable name. Draft for discussion -- see PR description. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Tadas Antanavicius <tadasant@users.noreply.github.com>
ede6f35 to
0798bcc
Compare
Documents the decision already implemented by this PR: displayName moves from a REQUIRED to an OPTIONAL member of a Catalog Entry and is dropped from the Minimal Catalog (Level 1) required-at-minimum set. Pairs each substantive spec PR with an ADR, matching ADR-0014 (Agent-Card#37) / ADR-0015 (Agent-Card#36). Status is Proposed pending the 2026-06-18 working-group call. Signed-off-by: Tadas Antanavicius <tadasant@users.noreply.github.com> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refines the displayName-optional change with the consumer-vs-producer guidance agreed at the 2026-06-18 AI Catalog TSC working-group call. - Catalog Entry displayName is now an explicit *master override*: when a publisher sets it, it is authoritative for display and a consumer renders it as given, even if it differs from the artifact's own name. - Add a "Resolving an Artifact's Display Name" section with the consumer fallback order the WG agreed on: displayName -> the referenced artifact's own canonical name (A2A `name` / MCP Server Card `title`) -> the trailing segment of the `identifier` URN (the last-segment hack raised on the call). - Steer name resolution to ingestion-time caching rather than render-time dereferencing, reflecting the point that registries already normalize/cache at ingestion. - Update ADR-0016 to match. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…isplayName') The lead-in said 'For an entry without displayName' but step (1) is 'displayName if present' — reword to the general rendering case. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
darrelmiller
approved these changes
Jun 25, 2026
Contributor
|
My perspective on this is that with the identifier and description property, a registry can synthesize a friendly display name for their registry. Picking the last segment of the URN identifier would likely be a reasonable substitute |
Member
|
Agree that for browsing/indexing, the |
mindpower
approved these changes
Jun 25, 2026
…ntry-displayname # Conflicts: # specification/ai-catalog.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this proposes
Make
displayNameOPTIONAL on the Catalog Entry rather than required — i.e. move it from the required members of a Catalog Entry (ai-catalog.md§Catalog Entry) into the OPTIONAL members, drop it from the Minimal Catalog (Level 1) conformance requirement, and add guidance that it SHOULD be set only when the referenced artifact does not already carry its own canonical human-readable name.The intent: when an entry points at an artifact that names itself (an A2A Agent Card, an MCP Server Card), the artifact is the single source of truth and the entry shouldn't duplicate the name. When an entry points at something opaque that has no embedded name (a raw dataset, a model blob, a skill bundle), the entry is the only place a human-readable name can live — so the field stays available for exactly that case.
This change deliberately does not touch
displayNameon the HostInfo or Publisher objects — those name the catalog host and the publishing org respectively, which is genuinely catalog-authored metadata with no other home.Alternative considered: removing the field entirely
My first instinct was to remove
displayNamefrom the entry level altogether and always defer to the artifact, but I'm not suggesting it because that would mean opaque artifacts have nowhere else to put a name.examples/ai-catalog.jsonhas anapplication/parquetdataset entry; a Parquet file, a model blob, or a skill.zipdoesn't embed a self-describing display name the way a card does. Removing the field outright would leave those artifacts nameless in a catalog. So "optional, with guidance" is the proposal; "remove entirely" is the rejected alternative.Why make it optional — the duplication / drift problem
A Catalog Entry already points at the full artifact via
urlordata. For the card-shaped artifact types this spec calls out by media type, the human-readable name is already present in the artifact itself:nameis a REQUIRED, human-readable field. From the A2A protobuf spec (specification/a2a.proto,message AgentCard):nameis a reverse-DNS machine identifier (^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$), whiletitleis documented as "Optional human-readable title or display name for the MCP server", anddescription(required) is human-readable too.So for the two flagship artifact types, requiring
displayNameon the entry means every catalog publisher copies a value that already exists in the document the client is about to fetch, and then has to keep the two in sync forever. When they drift — and over time they will — a consumer has two conflicting human-readable names for the same thing and no principled way to pick. Making the field optional (and recommending omission for self-naming artifacts) keeps the name fresh and authoritative at its source, while the entry stays a thin pointer.What's in the diff
displayNamemoved from required → OPTIONAL members, with a SHOULD-guidance paragraph (set it only when the artifact has no canonical name; omit it for self-naming cards; the artifact's own name wins on conflict). Removed from the Minimal Catalog (Level 1) required-at-minimum list.server.json, plugin manifests) now omitdisplayName; opaque entries (theapplication/parquetdataset,application/agentskill+zipskill bundles) and nestedapplication/ai-catalog+jsonentries — which have no embedded canonical name — keep it.HostInfo/PublisherdisplayNameuntouched. The field still exists, so the class diagram and the "logical format" vocabulary lists are unchanged.displayNameframed as the fallback for nameless artifacts.Some history (for transparency)
As far as I can reconstruct from the public record,
displayNamewas required from its first appearance rather than as the outcome of an explicit "should this be mandatory?" debate:namein commit0271c14(2026-03-31), already under "It MUST contain the following members."name→displayNamein1e8c70c9per the AI Actor Naming Standard (PR #19), still required, and shipped via PR #27.I went looking for a written rationale for the mandatory status specifically — across the ADRs (0001–0013), issues, and discussions — and couldn't find one. The closest articulations of the field's purpose are PR #19 ("a human-readable name used for discovery in UIs … not required to be unique") and ADR 0013 framing the catalog as "the authoring and discovery format — a human-readable JSON document." I might simply be missing the discussion where requiring it was decided — if there's prior context I've overlooked, please point me to it, since it likely bears directly on the tradeoff.
Counter-argument to landing this
The strongest argument I can construct for keeping it required is browsing UX: a UI that renders a list of N artifacts shouldn't have to fetch N separate cards just to show names, so requiring
displayNameon the entry makes the catalog self-describing for a cheap list view.However, that's a steep trade-off for a permanent duplication/sync cost; one we'd like to avoid making on the MCP side. I'm not sure I'm convinced that UIs of AI Catalogs will be a major use case of AI Catalog (please correct me if you foresee otherwise, would love to understand the use case), and the optional form still lets a publisher populate
displayNameon every entry if they want the self-describing list view. It just doesn't force the card-backed entries to carry a redundant copy.If there's a use case beyond browsing that makes the field load-bearing enough to mandate, would love to understand.