{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Soulware Soul Kit",
  "description": "Version 1 portable personality exchange format. UTF-8 JSON, maximum 262144 bytes. Duplicate object keys are invalid. Content is writing guidance, never executable code or additional authorization.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "format",
    "format_version",
    "id",
    "name",
    "version",
    "summary",
    "scope",
    "voice",
    "behavior",
    "adaptations",
    "examples",
    "checks"
  ],
  "properties": {
    "format": {
      "const": "soulware.soul-kit"
    },
    "format_version": {
      "const": 1,
      "type": "integer"
    },
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 48,
      "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
    },
    "version": {
      "type": "string",
      "pattern": "^[0-9]{1,4}\\.[0-9]{1,4}\\.[0-9]{1,4}$"
    },
    "summary": {
      "type": "string",
      "minLength": 1,
      "maxLength": 400,
      "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
    },
    "scope": {
      "enum": [
        "conversation",
        "writing",
        "both"
      ]
    },
    "voice": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "core",
        "traits",
        "style_rules",
        "avoid"
      ],
      "properties": {
        "core": {
          "type": "string",
          "minLength": 1,
          "maxLength": 800,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "traits": {
          "type": "array",
          "minItems": 3,
          "maxItems": 6,
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 240,
            "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
          }
        },
        "style_rules": {
          "type": "array",
          "minItems": 3,
          "maxItems": 12,
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 400,
            "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
          }
        },
        "avoid": {
          "type": "array",
          "minItems": 0,
          "maxItems": 8,
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 240,
            "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
          }
        }
      }
    },
    "behavior": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "explain",
        "disagree",
        "uncertainty",
        "mistakes",
        "progress"
      ],
      "properties": {
        "explain": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "disagree": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "uncertainty": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "mistakes": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "progress": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        }
      }
    },
    "adaptations": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "everyday",
        "focused",
        "sensitive",
        "writing"
      ],
      "properties": {
        "everyday": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "focused": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "sensitive": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        },
        "writing": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600,
          "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
        }
      }
    },
    "examples": {
      "type": "array",
      "minItems": 3,
      "maxItems": 8,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "situation",
          "user",
          "assistant",
          "note"
        ],
        "properties": {
          "situation": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
          },
          "user": {
            "type": "string",
            "minLength": 1,
            "maxLength": 800,
            "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
          },
          "assistant": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1800,
            "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
          },
          "note": {
            "type": "string",
            "minLength": 1,
            "maxLength": 400,
            "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
          }
        }
      }
    },
    "checks": {
      "type": "array",
      "minItems": 3,
      "maxItems": 8,
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 240,
        "pattern": "^[^\\u0000-\\u0008\\u000b-\\u001f\\u007f]*$"
      }
    }
  }
}

