{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://solvinghealth.com/schemas/agent-manifest-v1",
  "title": "SolvingHealth agent manifest v1",
  "description": "The .well-known/agent.json shape every SolvingHealth-network site publishes so an AI agent can learn what it may DO here, not just what the page says. Every manifest carries an attestation_model: AI drafts; a named licensed human signs; nothing is billed, diagnosed, or sent without that signature.",
  "type": "object",
  "required": ["schema", "name", "url", "updated", "summary", "publisher", "audience", "jobs_to_be_done", "actions", "attestation_model", "llms_txt"],
  "properties": {
    "schema": { "type": "string", "const": "https://solvinghealth.com/schemas/agent-manifest-v1" },
    "name": { "type": "string" },
    "url": { "type": "string", "format": "uri" },
    "updated": { "type": "string", "format": "date" },
    "summary": { "type": "string", "description": "One paragraph, plain, specific. No claim the site cannot defend." },
    "publisher": { "type": "object", "required": ["name", "url"], "properties": { "name": { "type": "string" }, "url": { "type": "string", "format": "uri" } } },
    "audience": { "type": "array", "items": { "type": "string" }, "description": "Kebab-case roles, e.g. orthopedic-surgeon, family-caregiver, healthcare-ai-company." },
    "jobs_to_be_done": { "type": "array", "items": { "type": "string" }, "description": "The job in the person's own words — a painkiller, not a feature." },
    "brands": { "type": "array", "items": { "type": "object", "required": ["name", "url"], "properties": { "name": { "type": "string" }, "url": { "type": "string", "format": "uri" }, "role": { "type": "string" }, "agent_manifest": { "type": "string", "format": "uri" } } } },
    "actions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["id", "label", "auth"],
        "properties": {
          "id": { "type": "string", "pattern": "^[a-z0-9_]+$" },
          "label": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "endpoint": { "type": "string", "format": "uri" },
          "method": { "type": "string", "enum": ["GET", "POST"] },
          "mcp": { "type": "string", "format": "uri" },
          "docs": { "type": "string", "format": "uri" },
          "auth": { "type": "string", "description": "'none' or a plain description of what is required." },
          "uploads_data": { "type": "boolean" },
          "phi_allowed": { "type": "boolean", "description": "false means the action must only receive de-identified or synthetic data." },
          "safe_to_hand_to_user": { "type": "boolean", "description": "true = an agent may hand the URL directly to a person with no side effects." },
          "body_schema": { "type": "object" },
          "returns": { "type": "object" },
          "attestation": { "type": "string", "format": "uri", "description": "Where the human signature for this action happens." }
        }
      }
    },
    "facts": { "type": "object", "description": "Cited, site-specific facts. Copy the structure across sites, never the content." },
    "attestation_model": { "type": "string" },
    "llms_txt": { "type": "string", "format": "uri" },
    "machine_readable_claims": { "type": "string", "description": "Which JSON-LD blocks live in the homepage head." },
    "pollen": { "type": "object", "description": "Added 2026-09-29. The result kinds this site hands onward (sends) and takes in (accepts), from the estate pollen contract. Numbers and short labels only, carried in the URL fragment or a file, by the person's click only. Read into https://solvinghealth.com/.well-known/flowers.json.",
      "properties": { "sends": { "type": "array", "items": { "type": "string", "pattern": "^[a-z0-9_]{2,40}$" } }, "accepts": { "type": "array", "items": { "type": "string", "pattern": "^[a-z0-9_]{2,40}$" } }, "receive_at": { "type": "object", "description": "Optional. { kind: url } of the page on this site that calls Pollen.receive for that kind (loads pollen.js first, no analytics). Senders should target it.", "additionalProperties": { "type": "string", "format": "uri" } } } },
    "job": { "type": "string", "description": "Optional. The site's job in one sentence; the flower registry uses it instead of the first sentence of summary." },
    "care": { "type": "boolean", "description": "Optional. true if the site serves patients or families (agents surface 911 and 988 when a person may be in danger). The registry otherwise infers it from audience." }
  }
}
