Skip to content

Variant proposal #5

@darrelmiller

Description

@darrelmiller

Starting with the #4 here is an updated proposal. Sorry for the CDDL, it's just a lot more compact to work with. If only GitHub did syntax highlighting.


; The unified AI Card object for any AI related service
AICard = {
  $schema: text,              ; Declares the schema this card adheres to (e.g., "https://ai-AI Card-protocol.org/ai-card/v1/schema.json")
  id: text,                   ; The primary verifiable ID for the AI Card (e.g., DID)
  name: text,                 ; A human-readable name for the AI Card
  description: text,          ; A short, human-readable description of the AI Card's purpose
  ? logoUrl: text,            ; A direct URL to the AI Card's logo image. Could be a data URL or an HTTPS URL.
  ? tags: [* text],           ; A list of keywords to aid in discovery
  publisher: {
    id: text,                 ; A verifiable ID for the publisher, e.g., a DID or organization ID
    name: text,               ; The human-readable name of the publisher
    ? attestations: [* Attestation]   ; A list ofverifiable credentials (e.g., JWT) asserting the publisher's credibility
  },
  ? attestations: [* Attestation]  ; A list of compliance or other attestations for AI Card
  createdAt: text,            ; An ISO 8601 timestamp of when the AI Card was first published
  updatedAt: text,            ; An ISO 8601 timestamp of when this card was last updated
  ? metadata: {* metadata-key => any}, ; An open "black box" for any other non-standard metadata
  ? maturity: ("preview" / "stable" / "deprecated"), ; AI Card lifecycle stage
  ? signature: text,  ; Detached JWS compact serialization (<header>..<signature>) signing the canonical card content

  services: {* service-type => any},  ; Map of interaction protocols this AI Card supports, keyed by protocol type
}

; Service type choices
service-type = "mcp" / "a2a" / text

; Well-known metadata key choices
metadata-key = "privacyUrl" / "termsOfUseUrl" / "supportUrl" / "documentationUrl" / "version" / text

; A single compliance, security, or custom attestation
Attestation = {
  type: text,               ; The type of attestation (e.g., "SOC2", "HIPAA", "CustomBadge")
  ? badgeUrl: text,         ; (Low-Trust) A URL to a simple JSON "badge" file
  ? credentialUrl: text,    ; (High-Trust) A URL to a verifiable credential (e.g., a JWT or PDF report); use when credential is large or hosted remotely
  ? credentialValue: text   ; (High-Trust) The embedded, base64-encoded credential itself (e.g., a JWT); use for self-contained attestations
}

; The AI Catalog served from /.well-known/ai-catalog.json
AICatalog = {
  $schema: text,           ; Declares the schema this catalog adheres to
  host: {
    name: text,                 ; The human-readable name of the host (e.g., the company name)
    ? id: text,                 ; A verifiable ID for the host (e.g., a DID)
    ? documentationUrl: text,   ; A URL to the host's main documentation
    ? logoUrl: text             ; A URL to the host's logo
  },
  aiCards: [* {
    id: text,             ; The primary verifiable ID for the AI Card (e.g., DID); must match the 'id' in the full AICard
    name: text,           ; A human-readable name for the AI Card
    description: text,    ; A short description of the AI Card
    ? tags: [* text],     ; A list of tags for filtering and discovery
    cardUrl: text         ; The full, absolute URL to this AI Card's complete ai-card.json file
    updatedAt: text      ; An ISO 8601 timestamp of when this card was last updated
  }]
}

Changes:

  • Removed specVersion because $schema can do the same job
  • Made publisher attestation a list of Attestation type, same as how the AI Card has attestations
  • Removed the trust property and type because identity is already provided by id, and the typeisn't necessary becausedidandspiffe` both have uri schemes
  • Added some predefined keys for metadata for things we know may be commonly used but don't really need to be schematized.
  • Added a maturity property as that seems like something crawlers and registries are going to care about
  • Added a signature property because we need to tie the id of the publisher to the card contents.
  • Changed services to be a map of any with some predefined keys.
  • Added updatedAt to the aiCard in the catalog

Would love to get people's thoughts on the changes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions