{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://certiwatt.app/aeo-manifest.schema.json",
  "title": "CertiWatt AEO Manifest",
  "description": "Machine-readable list of CertiWatt guide pages, brand hubs, and verdict pages intended for answer engines and agents answering 2026 power-bank flight-rule questions.",
  "type": "object",
  "required": [
    "$schema",
    "manifest_version",
    "content_hash_algorithm",
    "content_hash",
    "generated_at",
    "site",
    "ruleset_version",
    "cache_policy",
    "counts",
    "purpose",
    "question_guides",
    "brand_hubs",
    "long_tail_verdicts"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "const": "https://certiwatt.app/aeo-manifest.schema.json"
    },
    "manifest_version": {
      "const": "aeo-manifest.v1"
    },
    "content_hash_algorithm": {
      "const": "sha256"
    },
    "content_hash": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "generated_at": {
      "type": "string",
      "format": "date-time"
    },
    "site": {
      "const": "https://certiwatt.app"
    },
    "ruleset_version": {
      "type": "string",
      "minLength": 1
    },
    "cache_policy": {
      "type": "object",
      "required": ["max_age_seconds", "stale_while_revalidate_seconds", "revalidate_on"],
      "additionalProperties": false,
      "properties": {
        "max_age_seconds": { "type": "integer", "minimum": 300 },
        "stale_while_revalidate_seconds": { "type": "integer", "minimum": 3600 },
        "revalidate_on": { "const": "content_hash_change" }
      }
    },
    "counts": {
      "type": "object",
      "required": ["question_guides", "brand_hubs", "long_tail_verdicts"],
      "additionalProperties": false,
      "properties": {
        "question_guides": { "type": "integer", "minimum": 1 },
        "brand_hubs": { "type": "integer", "minimum": 1 },
        "long_tail_verdicts": { "type": "integer", "minimum": 1 }
      }
    },
    "purpose": {
      "type": "string",
      "minLength": 40
    },
    "question_guides": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "type",
          "url",
          "slug",
          "title",
          "description",
          "short_answer",
          "faq_count",
          "source_count",
          "sources"
        ],
        "additionalProperties": false,
        "properties": {
          "type": { "const": "guide" },
          "url": { "type": "string", "format": "uri" },
          "slug": { "type": "string", "minLength": 1 },
          "title": { "type": "string", "minLength": 1 },
          "description": { "type": "string", "minLength": 1 },
          "short_answer": { "type": "string", "minLength": 80 },
          "faq_count": { "type": "integer", "minimum": 3 },
          "source_count": { "type": "integer", "minimum": 3 },
          "sources": {
            "type": "array",
            "minItems": 3,
            "items": {
              "type": "object",
              "required": ["label", "url"],
              "additionalProperties": false,
              "properties": {
                "label": { "type": "string", "minLength": 1 },
                "url": { "type": "string", "format": "uri" }
              }
            }
          }
        }
      }
    },
    "brand_hubs": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "type",
          "url",
          "brand_id",
          "name",
          "model_count",
          "recent_count",
          "near_limit_count",
          "representative_models"
        ],
        "additionalProperties": false,
        "properties": {
          "type": { "const": "brand_hub" },
          "url": { "type": "string", "format": "uri" },
          "brand_id": { "type": "string", "minLength": 1 },
          "name": { "type": "string", "minLength": 1 },
          "model_count": { "type": "integer", "minimum": 1 },
          "recent_count": { "type": "integer", "minimum": 0 },
          "near_limit_count": { "type": "integer", "minimum": 0 },
          "representative_models": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": ["model_id", "model", "watt_hour", "capacity_mah", "url"],
              "additionalProperties": false,
              "properties": {
                "model_id": { "type": "string", "minLength": 1 },
                "model": { "type": "string", "minLength": 1 },
                "watt_hour": { "type": "number", "exclusiveMinimum": 0 },
                "capacity_mah": { "type": "integer", "exclusiveMinimum": 0 },
                "url": { "type": "string", "format": "uri" }
              }
            }
          }
        }
      }
    },
    "long_tail_verdicts": {
      "type": "array",
      "description": "Curated model-airline-country verdict pages. Each entry maps to a /p/[model]/[airline]/[country] page whose Article JSON-LD articleBody exposes the summary, route_factors, and citation source metadata for answer-engine extraction. Page citation nodes also expose citation_kind, citation_jurisdiction, and pulled_at properties derived from sources[].",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "type",
          "url",
          "intent",
          "model_id",
          "model",
          "watt_hour",
          "capacity_mah",
          "airline_code",
          "airline",
          "country_code",
          "country",
          "verdict",
          "summary",
          "route_factors",
          "article_body",
          "ruleset_version",
          "citation_count",
          "sources"
        ],
        "additionalProperties": false,
        "properties": {
          "type": { "const": "verdict" },
          "url": { "type": "string", "format": "uri" },
          "intent": { "type": "string", "minLength": 1 },
          "model_id": { "type": "string", "minLength": 1 },
          "model": { "type": "string", "minLength": 1 },
          "watt_hour": { "type": "number", "exclusiveMinimum": 0 },
          "capacity_mah": { "type": "integer", "exclusiveMinimum": 0 },
          "airline_code": { "type": "string", "minLength": 1 },
          "airline": { "type": "string", "minLength": 1 },
          "country_code": { "type": "string", "minLength": 2 },
          "country": { "type": "string", "minLength": 1 },
          "verdict": { "enum": ["allowed", "conditional", "banned", "insufficient"] },
          "summary": {
            "type": "string",
            "description": "Short verdict answer also used as the first signal in the programmatic page Article JSON-LD articleBody.",
            "minLength": 20
          },
          "route_factors": {
            "type": "array",
            "description": "Route-specific extraction signals for exact model capacity, departure-country overlays, operating-carrier policy, and recall context. Programmatic verdict pages include these same signals in Article JSON-LD articleBody.",
            "minItems": 4,
            "items": { "type": "string", "minLength": 40 }
          },
          "article_body": {
            "type": "string",
            "description": "Prebuilt extraction body for agents. Mirrors the programmatic verdict page Article JSON-LD articleBody by combining summary, route_factors, and citation source metadata.",
            "minLength": 160,
            "maxLength": 1600
          },
          "ruleset_version": { "type": "string", "minLength": 1 },
          "citation_count": { "type": "integer", "minimum": 1 },
          "sources": {
            "type": "array",
            "description": "Citation source metadata. Programmatic verdict pages expose authority, kind, jurisdiction, URL, citation_kind, citation_jurisdiction, and pulled_at from these sources in Article JSON-LD articleBody and citation nodes.",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": ["kind", "authority", "url", "pulled_at"],
              "additionalProperties": false,
              "properties": {
                "kind": {
                  "enum": ["regulator", "airline", "manufacturer", "news"],
                  "description": "Source class. Rendered verdict-page citation nodes expose this value as additionalProperty citation_kind."
                },
                "authority": {
                  "type": "string",
                  "description": "Human-readable regulator, airline, manufacturer, recall, or publication name.",
                  "minLength": 1
                },
                "jurisdiction": {
                  "type": "string",
                  "description": "Optional country, region, or international jurisdiction. Rendered verdict-page citation nodes expose this value as additionalProperty citation_jurisdiction when present.",
                  "minLength": 1
                },
                "url": {
                  "type": "string",
                  "description": "Absolute source URL used as the citation node URL.",
                  "format": "uri"
                },
                "pulled_at": {
                  "type": "string",
                  "description": "Source freshness timestamp. Rendered verdict-page citation nodes expose this value as additionalProperty pulled_at.",
                  "format": "date-time"
                }
              }
            }
          }
        }
      }
    }
  }
}
