{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://prd-plugin.dev/contracts/repository-module/v1/module-manifest.schema.json",
  "title": "PRD Plugin Repository Module Manifest",
  "description": "Portable desired-state declaration submitted to AI-Collab for admission.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "module_id",
    "module_mode",
    "repository",
    "compatibility",
    "consumes",
    "needs",
    "offers",
    "governance",
    "migration",
    "provenance"
  ],
  "properties": {
    "schema_version": {"const": "1.0"},
    "module_id": {"$ref": "#/$defs/stableId"},
    "module_mode": {"enum": ["passive", "agent_routable"]},
    "repository": {"$ref": "#/$defs/repository"},
    "compatibility": {"$ref": "#/$defs/compatibility"},
    "consumes": {
      "type": "array",
      "items": {"$ref": "#/$defs/consumedContract"}
    },
    "needs": {"$ref": "#/$defs/needs"},
    "offers": {"$ref": "#/$defs/offers"},
    "governance": {"$ref": "#/$defs/governance"},
    "migration": {"$ref": "#/$defs/migration"},
    "provenance": {"$ref": "#/$defs/provenance"}
  },
  "allOf": [
    {
      "if": {
        "properties": {"module_mode": {"const": "agent_routable"}},
        "required": ["module_mode"]
      },
      "then": {
        "properties": {
          "governance": {
            "properties": {
              "agent_profiles": {
                "contains": {
                  "type": "object",
                  "properties": {"profile_kind": {"const": "repo_expert"}},
                  "required": ["profile_kind"]
                }
              }
            }
          }
        }
      }
    }
  ],
  "$defs": {
    "stableId": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$"
    },
    "nonEmptyString": {"type": "string", "minLength": 1},
    "stringList": {
      "type": "array",
      "items": {"$ref": "#/$defs/nonEmptyString"},
      "uniqueItems": true
    },
    "requirementPolicy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["required", "fallback"],
      "properties": {
        "required": {"type": "boolean"},
        "fallback": {"enum": ["block", "degrade", "skip", "local"]},
        "degraded_capability": {"type": "string"}
      },
      "allOf": [
        {
          "if": {"properties": {"required": {"const": true}}},
          "then": {"properties": {"fallback": {"const": "block"}}}
        }
      ]
    },
    "repository": {
      "type": "object",
      "additionalProperties": false,
      "required": ["repo_id", "display_name", "visibility", "source_revision"],
      "properties": {
        "repo_id": {"$ref": "#/$defs/stableId"},
        "display_name": {"$ref": "#/$defs/nonEmptyString"},
        "visibility": {"enum": ["private", "repository", "workspace", "public"]},
        "source_revision": {"$ref": "#/$defs/nonEmptyString"},
        "source_root": {"type": "string"}
      }
    },
    "compatibility": {
      "type": "object",
      "additionalProperties": false,
      "required": ["manifest_contract", "ai_collab_runtime", "hub_contracts"],
      "properties": {
        "manifest_contract": {"const": "1.0"},
        "ai_collab_runtime": {"$ref": "#/$defs/nonEmptyString"},
        "hub_contracts": {
          "type": "object",
          "minProperties": 1,
          "additionalProperties": {"$ref": "#/$defs/nonEmptyString"}
        },
        "legacy_aliases": {"$ref": "#/$defs/stringList"},
        "deprecated_capabilities": {"$ref": "#/$defs/stringList"}
      }
    },
    "consumedContract": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "contract", "version_range", "capabilities", "policy"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "contract": {"$ref": "#/$defs/stableId"},
        "provider_class": {"$ref": "#/$defs/stableId"},
        "version_range": {"$ref": "#/$defs/nonEmptyString"},
        "capabilities": {"$ref": "#/$defs/stringList"},
        "policy": {"$ref": "#/$defs/requirementPolicy"}
      }
    },
    "permissionNeed": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "actions", "resource", "approval", "policy"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "actions": {"$ref": "#/$defs/stringList"},
        "resource": {"$ref": "#/$defs/nonEmptyString"},
        "approval": {"enum": ["none", "policy", "user", "admin"]},
        "audit_required": {"type": "boolean"},
        "policy": {"$ref": "#/$defs/requirementPolicy"}
      }
    },
    "secretRequirement": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "purpose", "scope", "provider_class", "policy"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "purpose": {"$ref": "#/$defs/nonEmptyString"},
        "scope": {"enum": ["module", "runner", "tool", "provider"]},
        "provider_class": {"$ref": "#/$defs/stableId"},
        "rotation_policy": {"type": "string"},
        "policy": {"$ref": "#/$defs/requirementPolicy"}
      }
    },
    "runtimeNeed": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "kind", "constraint", "policy"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "kind": {"enum": ["host_feature", "model_capability", "resource", "port", "runtime"]},
        "constraint": {"$ref": "#/$defs/nonEmptyString"},
        "policy": {"$ref": "#/$defs/requirementPolicy"}
      }
    },
    "needs": {
      "type": "object",
      "additionalProperties": false,
      "required": ["permissions", "secrets", "runtime"],
      "properties": {
        "permissions": {"type": "array", "items": {"$ref": "#/$defs/permissionNeed"}},
        "secrets": {"type": "array", "items": {"$ref": "#/$defs/secretRequirement"}},
        "runtime": {"type": "array", "items": {"$ref": "#/$defs/runtimeNeed"}}
      }
    },
    "toolOffer": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "catalog_authority",
        "utcp_manual_ref",
        "transports",
        "input_schema_ref",
        "output_schema_ref",
        "side_effect",
        "idempotency",
        "permission_refs",
        "approval",
        "timeout_ms",
        "health_ref"
      ],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "catalog_authority": {"const": "utcp"},
        "utcp_manual_ref": {"$ref": "#/$defs/nonEmptyString"},
        "transports": {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {"enum": ["cli", "http", "mcp", "utcp", "workflow"]}
        },
        "mcp_projection": {"const": "generated"},
        "input_schema_ref": {"$ref": "#/$defs/nonEmptyString"},
        "output_schema_ref": {"$ref": "#/$defs/nonEmptyString"},
        "side_effect": {"enum": ["none", "read", "write", "external", "irreversible"]},
        "idempotency": {"enum": ["idempotent", "keyed", "non_idempotent"]},
        "permission_refs": {"$ref": "#/$defs/stringList"},
        "secret_requirement_refs": {"$ref": "#/$defs/stringList"},
        "approval": {"enum": ["none", "policy", "user", "admin"]},
        "timeout_ms": {"type": "integer", "minimum": 1},
        "health_ref": {"$ref": "#/$defs/nonEmptyString"}
      },
      "allOf": [
        {
          "if": {"properties": {"transports": {"contains": {"const": "mcp"}}}},
          "then": {"required": ["mcp_projection"]}
        }
      ]
    },
    "knowledgeOffer": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "authority", "visibility", "source_roots", "freshness", "citation_base", "indexing"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "authority": {"enum": ["canonical", "derived", "reference", "historical"]},
        "visibility": {"enum": ["private", "repository", "workspace", "public"]},
        "source_roots": {"$ref": "#/$defs/stringList"},
        "freshness": {"$ref": "#/$defs/nonEmptyString"},
        "citation_base": {"$ref": "#/$defs/nonEmptyString"},
        "indexing": {"enum": ["allow", "deny", "metadata_only"]}
      }
    },
    "configurationOffer": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "schema_ref", "scope", "visibility", "mutability", "activation", "validation_ref"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "schema_ref": {"$ref": "#/$defs/nonEmptyString"},
        "scope": {"enum": ["repository", "workspace", "module", "profile"]},
        "visibility": {"enum": ["private", "repository", "workspace", "public"]},
        "mutability": {"enum": ["read_only", "validated_write", "operator_only"]},
        "activation": {"enum": ["immediate", "next_session", "restart_required"]},
        "validation_ref": {"$ref": "#/$defs/nonEmptyString"},
        "secret_requirement_refs": {"$ref": "#/$defs/stringList"}
      }
    },
    "simpleOffer": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "contract_ref"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "contract_ref": {"$ref": "#/$defs/nonEmptyString"},
        "permission_refs": {"$ref": "#/$defs/stringList"},
        "status": {"enum": ["native", "derived", "missing", "legacy_adapter"]}
      }
    },
    "appOffer": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "route_namespace", "mount_point", "host_api_range", "asset_refs", "permission_refs", "isolation"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "route_namespace": {"$ref": "#/$defs/nonEmptyString"},
        "navigation": {"type": "string"},
        "mount_point": {"$ref": "#/$defs/nonEmptyString"},
        "host_api_range": {"$ref": "#/$defs/nonEmptyString"},
        "asset_refs": {"$ref": "#/$defs/stringList"},
        "permission_refs": {"$ref": "#/$defs/stringList"},
        "isolation": {"enum": ["sandboxed", "process", "host_managed"]}
      }
    },
    "runnerOffer": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "handler_ref", "health_endpoint", "log_policy_ref", "rollback_ref", "permission_refs"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "handler_ref": {"$ref": "#/$defs/nonEmptyString"},
        "health_endpoint": {"$ref": "#/$defs/nonEmptyString"},
        "log_policy_ref": {"$ref": "#/$defs/nonEmptyString"},
        "rollback_ref": {"$ref": "#/$defs/nonEmptyString"},
        "permission_refs": {"$ref": "#/$defs/stringList"},
        "secret_requirement_refs": {"$ref": "#/$defs/stringList"},
        "runtime_need_refs": {"$ref": "#/$defs/stringList"}
      }
    },
    "offers": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "tools",
        "knowledge",
        "configuration",
        "skills",
        "workflows",
        "data_contracts",
        "app_contributions",
        "runners",
        "observability",
        "agent_profile_refs"
      ],
      "properties": {
        "tools": {"type": "array", "items": {"$ref": "#/$defs/toolOffer"}},
        "knowledge": {"type": "array", "items": {"$ref": "#/$defs/knowledgeOffer"}},
        "configuration": {"type": "array", "items": {"$ref": "#/$defs/configurationOffer"}},
        "skills": {"type": "array", "items": {"$ref": "#/$defs/simpleOffer"}},
        "workflows": {"type": "array", "items": {"$ref": "#/$defs/simpleOffer"}},
        "data_contracts": {"type": "array", "items": {"$ref": "#/$defs/simpleOffer"}},
        "app_contributions": {"type": "array", "items": {"$ref": "#/$defs/appOffer"}},
        "runners": {"type": "array", "items": {"$ref": "#/$defs/runnerOffer"}},
        "observability": {"type": "array", "items": {"$ref": "#/$defs/simpleOffer"}},
        "agent_profile_refs": {"$ref": "#/$defs/stringList"}
      }
    },
    "role": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "purpose", "capabilities", "responsibilities", "permission_refs", "skill_refs", "escalation"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "purpose": {"$ref": "#/$defs/nonEmptyString"},
        "capabilities": {"$ref": "#/$defs/stringList"},
        "responsibilities": {"$ref": "#/$defs/stringList"},
        "permission_refs": {"$ref": "#/$defs/stringList"},
        "skill_refs": {"$ref": "#/$defs/stringList"},
        "data_boundaries": {"$ref": "#/$defs/stringList"},
        "escalation": {"$ref": "#/$defs/nonEmptyString"}
      }
    },
    "agentProfile": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "profile_kind", "role_ref", "instructions_ref", "repo_scope", "supported_tasks", "permission_refs", "skill_refs", "knowledge_refs", "model_capabilities"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "profile_kind": {"enum": ["repo_expert", "specialist", "reviewer", "operator"]},
        "role_ref": {"$ref": "#/$defs/stableId"},
        "instructions_ref": {"$ref": "#/$defs/nonEmptyString"},
        "repo_scope": {"$ref": "#/$defs/nonEmptyString"},
        "supported_tasks": {"$ref": "#/$defs/stringList"},
        "permission_refs": {"$ref": "#/$defs/stringList"},
        "skill_refs": {"$ref": "#/$defs/stringList"},
        "knowledge_refs": {"$ref": "#/$defs/stringList"},
        "model_capabilities": {"$ref": "#/$defs/stringList"},
        "handoff_policy": {"type": "string"}
      }
    },
    "teamTemplate": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "required_profile_refs", "optional_profile_refs", "routing", "concurrency", "separation_of_duty"],
      "properties": {
        "id": {"$ref": "#/$defs/stableId"},
        "required_profile_refs": {"$ref": "#/$defs/stringList"},
        "optional_profile_refs": {"$ref": "#/$defs/stringList"},
        "routing": {"$ref": "#/$defs/nonEmptyString"},
        "concurrency": {"type": "integer", "minimum": 1},
        "separation_of_duty": {"$ref": "#/$defs/stringList"}
      }
    },
    "providerPolicy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["allowed_classes", "required_capabilities", "fallback_order", "privacy", "budget_class"],
      "properties": {
        "allowed_classes": {"$ref": "#/$defs/stringList"},
        "required_capabilities": {"$ref": "#/$defs/stringList"},
        "fallback_order": {"$ref": "#/$defs/stringList"},
        "privacy": {"$ref": "#/$defs/nonEmptyString"},
        "residency": {"type": "string"},
        "budget_class": {"enum": ["low", "standard", "high", "workspace_managed"]}
      }
    },
    "governance": {
      "type": "object",
      "additionalProperties": false,
      "required": ["roles", "agent_profiles", "team_templates", "provider_policy", "requested_policy"],
      "properties": {
        "roles": {"type": "array", "items": {"$ref": "#/$defs/role"}},
        "agent_profiles": {"type": "array", "items": {"$ref": "#/$defs/agentProfile"}},
        "team_templates": {"type": "array", "items": {"$ref": "#/$defs/teamTemplate"}},
        "provider_policy": {"$ref": "#/$defs/providerPolicy"},
        "requested_policy": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "autonomy": {"enum": ["guided", "key_decision", "autonomous"]},
            "consent_floor_ref": {"$ref": "#/$defs/nonEmptyString"}
          }
        }
      }
    },
    "migration": {
      "type": "object",
      "additionalProperties": false,
      "required": ["source_authority", "adapter_kind", "conformance_level", "field_provenance", "missing_fields", "compatibility_warnings", "legacy_entrypoints", "replacement_contracts", "rollback"],
      "properties": {
        "source_authority": {"$ref": "#/$defs/nonEmptyString"},
        "adapter_kind": {"enum": ["none", "legacy_compiler", "manual_sidecar"]},
        "adapter_version": {"type": "string"},
        "conformance_level": {"enum": ["legacy_observed", "manifest_shimmed", "binding_managed", "hub_native", "schema_native"]},
        "field_provenance": {
          "type": "object",
          "additionalProperties": {"$ref": "#/$defs/nonEmptyString"}
        },
        "missing_fields": {"$ref": "#/$defs/stringList"},
        "compatibility_warnings": {"$ref": "#/$defs/stringList"},
        "legacy_entrypoints": {"$ref": "#/$defs/stringList"},
        "replacement_contracts": {"$ref": "#/$defs/stringList"},
        "state_migrations": {"$ref": "#/$defs/stringList"},
        "parity_evidence_refs": {"$ref": "#/$defs/stringList"},
        "rollback": {
          "type": "object",
          "additionalProperties": false,
          "required": ["supported", "contract_ref"],
          "properties": {
            "supported": {"type": "boolean"},
            "contract_ref": {"$ref": "#/$defs/nonEmptyString"}
          }
        }
      }
    },
    "artifactDigest": {
      "type": "object",
      "additionalProperties": false,
      "required": ["path", "sha256", "status"],
      "properties": {
        "path": {"$ref": "#/$defs/nonEmptyString"},
        "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
        "status": {"enum": ["shipped", "proposed", "deferred", "superseded", "dirty_candidate"]}
      }
    },
    "provenance": {
      "type": "object",
      "additionalProperties": false,
      "required": ["compiled_at", "compiler", "source_revision", "manifest_digest", "artifacts"],
      "properties": {
        "compiled_at": {"type": "string", "format": "date-time"},
        "compiler": {"$ref": "#/$defs/nonEmptyString"},
        "source_revision": {"$ref": "#/$defs/nonEmptyString"},
        "manifest_digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
        "artifacts": {"type": "array", "items": {"$ref": "#/$defs/artifactDigest"}}
      }
    }
  }
}
