Skip to content

[Bug]: v0.3.1 validation with a2a extension 'class_name missing' #25

@sfph

Description

@sfph

Bug Description

If I validate the following record with https://schema.oasf.outshift.com/0.3.1/api/validate/object/agent?missing_recommended=false

It errors out saying that "Required attribute "class_name" is missing." However, if I remove the extension altogether then the document passes. Not sure if it's getting confused with the skills at the card level or what's going on there :)

(Btw, if 0.3.1 goes away, that is ok too :) )

{
  "schema_version": "0.3.1",
  "name": "example_geo/planner_agent",
  "version": "v1.2.1",
  "description": "Provides advanced route planning, traffic analysis, and custom map generation services. This agent can calculate optimal routes, estimate travel times considering real-time traffic, and create personalized maps with points of interest.",
  "authors": [
    "Example Geo Services Inc."
  ],
  "skills": [
    {
      "category_uid": 1,
      "class_uid": 10204,
      "category_name": "Natural Language Processing",
      "class_name": "Dialogue Generation"
    },
    {
      "category_uid": 1,
      "class_uid": 10201,
      "category_name": "Natural Language Processing",
      "class_name": "Text Completion"
    },
    {
      "category_uid": 1,
      "class_uid": 10203,
      "category_name": "Natural Language Processing",
      "class_name": "Text Paraphrasing"
    },
    {
      "category_uid": 1,
      "class_uid": 10303,
      "category_name": "Natural Language Processing",
      "class_name": "Knowledge Synthesis"
    },
    {
      "category_uid": 1,
      "class_uid": 10206,
      "category_name": "Natural Language Processing",
      "class_name": "Text Style Transfer"
    },
    {
      "category_uid": 1,
      "class_uid": 10602,
      "category_name": "Natural Language Processing",
      "class_name": "Tone and Style Adjustment"
    }
  ],
  "created_at": "2024-01-15T10:00:00Z",
  "locators": [
    {
      "type": "source-code",
      "url": "https://github.com/agntcy/agentic-apps/tree/main/marketing-campaign"
    },
    {
      "type": "python-package",
      "url": "https://github.com/agntcy/agentic-apps/tree/main/marketing-campaign/pyproject.toml"
    }
  ],
  "extensions": [
    {
      "schema": "schema.oasf.agntcy.org/features/a2a",
      "version": "v1.0.0",
      "data": {
        "additionalInterfaces": [
          {
            "transport": "JSONRPC",
            "url": "https://georoute-agent.example.com/a2a/v1"
          },
          {
            "transport": "GRPC",
            "url": "https://georoute-agent.example.com/a2a/grpc"
          },
          {
            "transport": "HTTP+JSON",
            "url": "https://georoute-agent.example.com/a2a/json"
          }
        ],
        "capabilities": {
          "pushNotifications": true,
          "stateTransitionHistory": false,
          "streaming": true
        },
        "defaultInputModes": [
          "application/json",
          "text/plain"
        ],
        "defaultOutputModes": [
          "application/json",
          "image/png"
        ],
        "description": "Provides advanced route planning, traffic analysis, and custom map generation services. This agent can calculate optimal routes, estimate travel times considering real-time traffic, and create personalized maps with points of interest.",
        "documentationUrl": "https://docs.examplegeoservices.com/georoute-agent/api",
        "iconUrl": "https://georoute-agent.example.com/icon.png",
        "name": "GeoSpatial Route Planner Agent",
        "preferredTransport": "JSONRPC",
        "protocolVersion": "0.2.9",
        "provider": {
          "organization": "Example Geo Services Inc.",
          "url": "https://www.examplegeoservices.com"
        },
        "security": [
          {
            "google": [
              "openid",
              "profile",
              "email"
            ]
          }
        ],
        "securitySchemes": {
          "google": {
            "openIdConnectUrl": "https://accounts.google.com/.well-known/openid-configuration",
            "type": "openIdConnect"
          }
        },
        "signatures": [
          {
            "protected": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpPU0UiLCJraWQiOiJrZXktMSIsImprdSI6Imh0dHBzOi8vZXhhbXBsZS5jb20vYWdlbnQvandrcy5qc29uIn0",
            "signature": "QFdkNLNszlGj3z3u0YQGt_T9LixY3qtdQpZmsTdDHDe3fXV9y9-B3m2-XgCpzuhiLt8E0tV6HXoZKHv4GtHgKQ"
          }
        ],
        "skills": [
          {
            "description": "Calculates the optimal driving route between two or more locations, taking into account real-time traffic conditions, road closures, and user preferences (e.g., avoid tolls, prefer highways).",
            "examples": [
              "Plan a route from '1600 Amphitheatre Parkway, Mountain View, CA' to 'San Francisco International Airport' avoiding tolls.",
              "{\"origin\": {\"lat\": 37.422, \"lng\": -122.084}, \"destination\": {\"lat\": 37.7749, \"lng\": -122.4194}, \"preferences\": [\"avoid_ferries\"]}"
            ],
            "id": "route-optimizer-traffic",
            "inputModes": [
              "application/json",
              "text/plain"
            ],
            "name": "Traffic-Aware Route Optimizer",
            "outputModes": [
              "application/json",
              "application/vnd.geo+json",
              "text/html"
            ],
            "tags": [
              "maps",
              "routing",
              "navigation",
              "directions",
              "traffic"
            ]
          },
          {
            "description": "Creates custom map images or interactive map views based on user-defined points of interest, routes, and style preferences. Can overlay data layers.",
            "examples": [
              "Generate a map of my upcoming road trip with all planned stops highlighted.",
              "Show me a map visualizing all coffee shops within a 1-mile radius of my current location."
            ],
            "id": "custom-map-generator",
            "inputModes": [
              "application/json"
            ],
            "name": "Personalized Map Generator",
            "outputModes": [
              "image/png",
              "image/jpeg",
              "application/json",
              "text/html"
            ],
            "tags": [
              "maps",
              "customization",
              "visualization",
              "cartography"
            ]
          }
        ],
        "supportsAuthenticatedExtendedCard": true,
        "url": "https://georoute-agent.example.com/a2a/v1",
        "version": "1.2.0"
      }
    }
  ],
  "signature": {
    "algorithm": "SHA2_256",
    "signature": "MEQCIDrSGlDTu2qWn+7Oi//F+TDoy8kBtzidmsWuijSDP2LwAiBvhyxddZoi0oSRn8cmLw032ESFDVnTLj5xgj/MZVaG+w==",
    "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQVl3Q0NRRGdTdDJPRGU4RHN6QU5CZ2txaGtpRzl3MEJBUXNGQURBU01CMEdBMVVFQXd3S1pYaGgKYlhCc1pTNWpiMjB3SGhjTk1qUXdPREUwTVRReU56TTNXaGNOTWpVd09ERTBNVFF5TnpNM1dqQVNNUkF3RGdZRApWUVFEREFkbGVHRnRjR3hsTUI0d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQUsrVnJOOW9xVW5kCk9seUF4S1hrTDNJdFpUUkpjYStHdHpjcTNGWEtNSDZJdVN6d1M3ZVhNQ2FWc0cxNDM2M1RQTE1WdVBvSVlmZ2EKZ1NWNEQ0T1FkU25JZFZiV3FkMGtOYUhYWFNvbzZhdFZTZVphWTJZZjY1N0hxREp0eFpYaUtMaCtRMHBPYjkrSApsY0J5eDNSTWgxSFQzcklzOFJVVlBPbWttNFJ6QWdNQkFBRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFLM0g1CnBkVjMwZmxMc3BhV09YS1E4SDN0L0R0dUlmdWdRZGNSQitubGxDRWhnZXNCcVFiOXA0VVViVVlqL1hYVkppbk8KRnNMVEZUaFFHeTg3b2YvZ0tQQUZCTVJJOGRLRXpTdHFXeTExZUNDRDlGTUkrTWZmU2V1U3U1SHZCM3FwZzgxZQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t",
    "content_type": "application/vnd.dev.sigstore.bundle.v0.3+json",
    "content_bundle": "eyJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQuZGV2LnNpZ3N0b3JlLmJ1bmRsZS52MC4zK2pzb24iLCJ2ZXJpZmljYXRpb25NYXRlcmlhbCI6eyJwdWJsaWNLZXkiOnsiaGludCI6Inl6ZTZtNjdnNC85RWFtTERGdE1tUVliSE1HQkdRTFZFU05vMDRqNVBXNTQ9In19LCJtZXNzYWdlU2lnbmF0dXJlIjp7Im1lc3NhZ2VEaWdlc3QiOnsiYWxnb3JpdGhtIjoiU0hBMl8yNTYiLCJkaWdlc3QiOiIvNEZrU1hEbGVjOVNMNmM2c3NMZ202MmFVb21JRnZ0VTRBQnBnTE1ONzlJPSJ9LCJzaWduYXR1cmUiOiJNRVFDSURyU0dsRFR1MnFXbis3T2kvL0YrVERveThrQnR6aWRtc1d1aWpTRFAyTHdBaUJ2aHl4ZGRab2kwb1NSbjhjbUx3MDMyRVNGRFZuVExqNXhnai9NWlZhRyt3PT0ifX0=",
    "signed_at": "2025-08-14T14:27:37-04:00"
  }
}

Expected Behavior

I would expect this record to pass the validator. I'm not sure how to map the affected version below to v0.3.1

Affected Version

v1.0.0

Steps to Reproduce

Validate the record in the description against the link in the description

Checklist

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions