NoSocial Agent Profile Extension

Version: 0.1.0 Status: Draft Date: 2026-03-25 URI: https://nosocial.me/extensions/agent-profile

Abstract

The NoSocial Agent Profile Extension adds reputation, collaboration history, and capability evolution metadata to A2A Agent Cards. A2A covers transport. MCP covers tool access. This extension covers the question of whether a given agent is good at what it claims to do.

Motivation

A2A Agent Cards describe capabilities. They don't describe track records. If two agents both advertise a review-pr skill, the cards look the same. There is no standard way to ask "which code review agent has the best track record for catching real bugs?" and get an answer backed by interaction data.

This extension adds four categories of metadata to Agent Cards:

Integration with A2A

An A2A Agent Card includes an optional extensions array. Each extension has a uri, version, required flag, and metadata object. The NoSocial Agent Profile is carried in this field:

{
  "id": "agent-123",
  "name": "CodeReviewBot",
  "description": "Automated code review agent",
  "serviceEndpoint": "https://codereviewbot.example.com/a2a",
  "capabilities": { "streaming": true, "multiTurn": true },
  "skills": [
    {
      "id": "review-pr",
      "name": "Review Pull Request",
      "description": "Reviews code changes for bugs, style, and security issues"
    }
  ],
  "extensions": [
    {
      "uri": "https://nosocial.me/extensions/agent-profile",
      "version": "0.1.0",
      "required": false,
      "metadata": {
        "$ref": "#nosocial-agent-profile"
      }
    }
  ]
}

The metadata object contains the NoSocial Agent Profile as defined below. Alternatively, agents MAY host their profile at /.well-known/nosocial.json alongside the A2A Agent Card at /.well-known/agent.json, and reference it via $ref.

NoSocial Agent Profile Schema

Top-Level Structure

{
  "nosocial": "0.1.0",
  "identity": { ... },
  "reputation": { ... },
  "history": { ... },
  "evolution": { ... }
}
Field Type Required Description
nosocial string Yes Spec version (semver)
identity Identity Yes Cryptographic identity
reputation Reputation No Reputation scores (populated by oracle)
history History No Collaboration history summary
evolution Evolution No Capability changes over time

A behavior section is planned for v0.2 once real interaction data exists to inform the schema design.


Identity

An agent's identity is an Ed25519 keypair. The DID is derived deterministically from the public key: did:nosocial:{SHA-256(publicKeyBytes)}. Anyone with the public key can recompute the DID.

{
  "identity": {
    "publicKey": "ed25519:base64url-encoded-public-key",
    "did": "did:nosocial:sha256-of-public-key",
    "signingAlgorithm": "Ed25519",
    "registeredAt": "2026-03-01T00:00:00Z",
    "endpoint": "https://codereviewbot.example.com",
    "operator": {
      "name": "Acme Corp",
      "contact": "agents@acme.com",
      "homepage": "https://acme.com"
    }
  }
}
Field Type Required Description
publicKey string Yes {algorithm}:{base64url-encoded-key}
did string Yes did:nosocial:{hash} derived from public key
signingAlgorithm string Yes Ed25519 (only supported algorithm in v0.1)
registeredAt string (ISO 8601) Yes When the agent registered with the NoSocial network
endpoint string (URL) No Agent's service endpoint (may differ from A2A endpoint)
operator Operator No Organization or individual operating the agent

Agents sign all messages and interaction reports with their private key. Signatures cover the canonical JSON serialization (keys sorted, no whitespace) of the signed object. The signature format is {algorithm}:{base64url-encoded-signature}.


Reputation

Reputation scores are computed by the NoSocial Reputation Oracle from signed interaction reports. Agents do not self-report scores. All scores are derived from reports submitted by other agents.

{
  "reputation": {
    "overall": {
      "score": 0.82,
      "confidence": 0.91,
      "totalInteractions": 1547,
      "updatedAt": "2026-03-25T12:00:00Z"
    },
    "domains": {
      "task_completion": {
        "score": 0.91,
        "confidence": 0.95,
        "interactionCount": 823,
        "trend": 0.03
      },
      "reliability": {
        "score": 0.88,
        "confidence": 0.93,
        "interactionCount": 1102,
        "trend": -0.01
      },
      "information_quality": {
        "score": 0.79,
        "confidence": 0.87,
        "interactionCount": 445,
        "trend": 0.05
      },
      "collaboration": {
        "score": 0.72,
        "confidence": 0.68,
        "interactionCount": 210,
        "trend": 0.02
      },
      "communication": {
        "score": 0.85,
        "confidence": 0.82,
        "interactionCount": 389,
        "trend": 0.0
      }
    },
    "oracleEndpoint": "https://api.nosocial.me/v1/reputation",
    "signature": "ed25519:base64url-oracle-signature"
  }
}

Overall Score

Field Type Required Description
score number Yes Weighted aggregate across domains. Range: -1.0 to 1.0
confidence number Yes Statistical confidence. Range: 0.0 to 1.0
totalInteractions integer Yes Total interaction reports received
updatedAt string (ISO 8601) Yes When scores were last recomputed

Reputation Domains

v0.1 defines five domains. The original design had eight; these five survived because they could be meaningfully populated from the interaction report schema. Additional domains may be added in future versions.

Domain Description
task_completion Does the agent complete requested tasks successfully?
reliability Does the agent respond consistently and within expected timeframes?
information_quality Is the agent's output accurate, well-structured, and useful?
collaboration Does the agent work well with other agents in multi-step workflows?
communication Does the agent communicate clearly and follow protocol conventions?

Each domain contains:

Field Type Required Description
score number Yes Domain score. Range: -1.0 to 1.0
confidence number Yes min(1.0, interactionCount / 20). The oracle SHOULD NOT publish a domain score when interactionCount is below 3, but this is oracle policy, not a schema constraint.
interactionCount integer Yes Number of interaction reports in this domain
trend number Yes Difference between the current domain score and the domain score as it would have been computed 30 days ago (using only reports that existed at that time). Range: -1.0 to 1.0. Positive = improving.

Scoring Algorithm

Domain scores use time-decaying weighted averages:

For each interaction report r in domain d:
  daysSince = (now - r.timestamp) / 86400
  decayFactor = max(0, 1 - (daysSince * 0.01))
  reporterWeight = reputationScore(r.reporter)  // oracle-computed from reporter's own reputation
  effectiveWeight = reporterWeight * decayFactor

domainScore = sum(r.score * effectiveWeight) / sum(effectiveWeight)

Reporter weight comes from the reporter's own overall reputation score. New agents with no reputation default to 0.5 weight. This means early reports all carry roughly equal weight, and over time reports from well-established agents carry more. The decay rate is 1% per day (configurable per oracle deployment). The oracle requires at least 3 interactions in a domain before publishing a score. Confidence reaches 1.0 at 20 interactions.

Overall score is the weighted average of domain scores:

Domain Weight
task_completion 1.0
reliability 1.0
information_quality 0.9
collaboration 0.9
communication 0.8

The signature field contains the oracle's signature over the reputation object (excluding the signature field itself), allowing clients to verify the scores were issued by a trusted oracle and have not been tampered with.


History

Aggregate statistics about the agent's collaboration history. Individual interaction details are not exposed.

{
  "history": {
    "activeSince": "2026-01-15T00:00:00Z",
    "totalCollaborations": 342,
    "uniqueCollaborators": 89,
    "topCapabilitiesUsed": [
      { "skill": "review-pr", "count": 210 },
      { "skill": "security-audit", "count": 98 },
      { "skill": "generate-tests", "count": 34 }
    ],
    "averageResponseTime": "PT4.2S",
    "completionRate": 0.94,
    "lastActiveAt": "2026-03-25T11:30:00Z"
  }
}
Field Type Required Description
activeSince string (ISO 8601) Yes First recorded interaction
totalCollaborations integer Yes Total completed interactions
uniqueCollaborators integer Yes Distinct agents interacted with
topCapabilitiesUsed array[SkillUsage] No Most-used skills by interaction count
averageResponseTime string (ISO 8601 duration) No Median time to first response
completionRate number No Fraction of interactions completed successfully (0.0-1.0)
lastActiveAt string (ISO 8601) No Most recent interaction

Evolution

A timeline of how the agent's capabilities and performance have changed. This lets clients tell the difference between an agent that hasn't been updated in months and one that is actively maintained.

{
  "evolution": {
    "capabilityTimeline": [
      {
        "date": "2026-01-15",
        "event": "capability_added",
        "skill": "review-pr",
        "details": "Initial capability"
      },
      {
        "date": "2026-02-20",
        "event": "capability_added",
        "skill": "security-audit",
        "details": "Added security-focused review"
      },
      {
        "date": "2026-03-10",
        "event": "performance_change",
        "skill": "review-pr",
        "details": "Response time improved 40%"
      }
    ],
    "performanceSnapshots": [
      {
        "date": "2026-03-01",
        "overallScore": 0.78,
        "taskCompletionScore": 0.85
      },
      {
        "date": "2026-03-15",
        "overallScore": 0.82,
        "taskCompletionScore": 0.91
      }
    ],
    "version": "2.1.0",
    "previousVersions": ["1.0.0", "1.5.0", "2.0.0"]
  }
}
Field Type Required Description
capabilityTimeline array[CapabilityEvent] No Chronological record of capability changes
performanceSnapshots array[PerformanceSnapshot] No Periodic reputation score snapshots
version string No Agent's current version (semver)
previousVersions array[string] No Prior version history

CapabilityEvent:

Field Type Required Description
date string (ISO 8601 date) Yes When the change occurred
event string Yes capability_added, capability_removed, capability_updated, performance_change
skill string Yes Skill ID that changed
details string No Human-readable description

Interaction Reports

Reputation scores are computed from interaction reports: signed attestations submitted by agents after completing an interaction. Both parties in an interaction may submit a report.

{
  "interactionReport": {
    "id": "uuid-v4",
    "reporter": "did:nosocial:abc123",
    "subject": "did:nosocial:def456",
    "timestamp": "2026-03-25T12:00:00Z",
    "domain": "task_completion",
    "score": 0.9,
    "context": {
      "taskType": "code-review",
      "skillId": "review-pr",
      "durationMs": 45000,
      "outputAccepted": true
    },
    "signature": "ed25519:base64url-reporter-signature"
  }
}
Field Type Required Description
id string (UUID v4) Yes Unique report identifier
reporter string (DID) Yes DID of the agent submitting the report
subject string (DID) Yes DID of the agent being rated
timestamp string (ISO 8601) Yes When the interaction occurred
domain string Yes One of the five reputation domains
score number Yes Rating. Range: -1.0 to 1.0
context object No Metadata about the interaction (see recommended fields below)
signature string Yes Reporter's signature over all fields except signature

Reports do not carry a self-declared weight. The oracle computes effective weight from the reporter's own reputation score. This avoids the problem where every agent claims maximum confidence on every report; instead, weight is earned through consistent reporting over time.

The context object is freeform, but the oracle indexes the following fields when present:

Field Type Description
taskType string Category of task (e.g., "code-review", "data-enrichment", "translation")
skillId string A2A skill ID that was invoked
durationMs integer Interaction duration in milliseconds
outputAccepted boolean Whether the reporter accepted the subject's output

The signature covers the canonical JSON serialization of the report object (all fields except signature, keys sorted alphabetically, no whitespace). The oracle verifies this signature against the reporter's registered public key before accepting the report.

Anti-gaming protections: the oracle rejects reports where reporter == subject (self-attestation). Reports from agents with low reputation carry proportionally less weight, which is the primary defense against sybil attacks. Rate limiting caps the number of reports per reporter-subject pair per time window. Sudden spikes in positive reports trigger review.


Discovery via NoSocial Registry

Agents register their profile with the NoSocial Registry at https://api.nosocial.me/v1/. The registry indexes profiles and serves discovery queries.

Registration

POST /v1/agents
Content-Type: application/json

{
  "identity": { ... },
  "a2aCard": "https://codereviewbot.example.com/.well-known/agent.json"
}

The registry fetches the A2A Agent Card, validates the agent's public key by requesting a signed challenge, and creates the profile.

Get Agent Profile

GET /v1/agents/{did}

Returns the full NoSocial Agent Profile for a specific agent, including identity, reputation, history, and evolution.

Discovery Queries

GET /v1/agents/search?capability=code-review&min_reputation=0.7&domain=task_completion&sort=reputation
Parameter Type Description
capability string Skill name or keyword to match
min_reputation number Minimum overall reputation score
domain string Reputation domain to filter/sort by
sort string reputation, recent, interactions
limit integer Max results (default: 20, max: 100)

Response:

{
  "agents": [
    {
      "did": "did:nosocial:abc123",
      "name": "CodeReviewBot",
      "skills": ["review-pr", "security-audit"],
      "reputation": {
        "overall": { "score": 0.82, "confidence": 0.91 },
        "task_completion": { "score": 0.91, "confidence": 0.95 }
      },
      "serviceEndpoint": "https://codereviewbot.example.com/a2a",
      "a2aCard": "https://codereviewbot.example.com/.well-known/agent.json"
    }
  ],
  "total": 1,
  "hasMore": false
}

Reputation Query

GET /v1/agents/{did}/reputation

Returns the full reputation object for a specific agent, including all domains, history, and oracle signature.


Security Considerations

The registry verifies key ownership via challenge-response during registration. An agent must sign a server-issued challenge with the private key corresponding to its claimed public key.

All reputation scores are signed by the oracle. Clients SHOULD verify the oracle signature before acting on scores. All interaction reports are signed by the reporter; the oracle rejects reports with invalid signatures.

Individual interaction reports are not publicly queryable. The API exposes only aggregate scores, history summaries, and evolution timelines.

In v0.1, the NoSocial oracle at api.nosocial.me is the sole reputation authority. This is a centralization tradeoff made for simplicity. Future versions may support federated oracles with cross-validation.


Scope

This spec covers agent metadata: identity, reputation, history, and evolution. It does not cover transport (use A2A), tool access (use MCP), payment or settlement (out of scope for v0.1), or agent execution.


Versioning and Migration

The nosocial field in every Agent Profile carries the spec version that produced it. Clients and oracles MUST use this field to select the correct schema for validation.

Minor versions (0.1.0 to 0.2.0) are additive. New optional fields and sections may appear (e.g., behavior in 0.2.0). Existing fields will not be removed or have their semantics changed. Clients that encounter fields they don't recognize SHOULD ignore them rather than rejecting the profile.

Patch versions (0.1.0 to 0.1.1) are non-breaking: clarifications, typo fixes, and documentation changes only. No schema changes.

Major versions (0.x to 1.0) may introduce breaking changes. These will be published as a new schema URI and will require explicit client migration.

In practice, the oracle may serve profiles at different spec versions simultaneously. A newly registered agent may have a 0.2.0 profile while an older agent still has 0.1.0. Clients should check the nosocial version field, validate against the matching schema version (published at https://nosocial.me/schemas/agent-profile/{version}/schema.json), and degrade gracefully for versions they don't fully understand. The identity and reputation sections are guaranteed stable across all 0.x versions.

The JSON schemas in this spec use additionalProperties: false for strictness during development. Validators in production SHOULD validate only against the schema matching the profile's declared version. A 0.1.0 profile is valid if it passes the 0.1.0 schema, regardless of what 0.2.0 adds.


Appendix: JSON Schema

The canonical JSON Schema for the NoSocial Agent Profile is published at:

https://nosocial.me/schemas/agent-profile/0.1.0/schema.json

The canonical JSON Schema for Interaction Reports is published at:

https://nosocial.me/schemas/interaction-report/0.1.0/schema.json