{
  "schema_version": "1.0",
  "id": "document-processing",
  "title": "Local-first Document Processing",
  "summary": "Convert supported files locally, validate versioned JSON, and explicitly submit only structured content.",
  "sections": {
    "workflow": [
      "select a supported file locally",
      "hash and extract locally",
      "preview and export JSON",
      "optionally validate JSON remotely",
      "explicitly obtain a quote and submit a document job",
      "retrieve the final report"
    ],
    "local_tool": "/local-converter",
    "schema": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "schema_version",
        "document_id",
        "original_file_sha256",
        "normalized_json_sha256",
        "text_blocks",
        "extraction",
        "provenance"
      ],
      "properties": {
        "schema_version": {
          "const": "1.0"
        },
        "document_id": {
          "type": "string",
          "minLength": 8,
          "maxLength": 128,
          "pattern": "^[A-Za-z0-9._:-]+$"
        },
        "source_filename": {
          "type": "string",
          "maxLength": 255
        },
        "source_mime_type": {
          "type": "string",
          "maxLength": 100
        },
        "original_file_sha256": {
          "type": "string",
          "pattern": "^[a-f0-9]{64}$"
        },
        "normalized_json_sha256": {
          "type": "string",
          "pattern": "^[a-f0-9]{64}$"
        },
        "page_count": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100
        },
        "sections": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "block_ids"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "level": {
                "type": "integer",
                "minimum": 1
              },
              "block_ids": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        },
        "pages": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "page",
              "block_ids"
            ],
            "properties": {
              "page": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100
              },
              "block_ids": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        },
        "text_blocks": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "text"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "text": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              },
              "page": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100
              },
              "section_id": {
                "type": "string"
              },
              "source_location": {
                "type": "string"
              }
            }
          }
        },
        "tables": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "rows"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "rows": {
                "type": "array",
                "items": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "page": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100
              },
              "source_location": {
                "type": "string"
              }
            }
          }
        },
        "extraction": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "method",
            "ocr_used",
            "converter_version",
            "converted_at"
          ],
          "properties": {
            "method": {
              "type": "string",
              "enum": [
                "native_text",
                "local_ocr",
                "agent_parser"
              ]
            },
            "ocr_used": {
              "type": "boolean"
            },
            "ocr_confidence": {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            },
            "converter_version": {
              "type": "string",
              "maxLength": 100
            },
            "converted_at": {
              "type": "string"
            }
          }
        },
        "provenance": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "trust_classification",
            "original_uploaded"
          ],
          "properties": {
            "trust_classification": {
              "type": "string",
              "enum": [
                "LOCAL_VERIFIED",
                "AGENT_VERIFIED",
                "SELF_DECLARED",
                "SERVER_VERIFIED"
              ]
            },
            "original_uploaded": {
              "const": false
            },
            "converter_id": {
              "type": "string"
            },
            "agent_id": {
              "type": "string"
            },
            "attestation": {
              "type": "string"
            }
          }
        },
        "warnings": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "validation": "POST /v1/documents/validate",
    "submission": "POST /v1/document-jobs",
    "supported_local_formats": [
      "TXT",
      "Markdown",
      "CSV",
      "TSV",
      "JSON",
      "HTML"
    ],
    "unsupported_local_formats": [
      "PDF",
      "DOCX",
      "XLSX",
      "images",
      "scans",
      "OCR"
    ],
    "network_behavior": "Selecting, converting, previewing, and exporting make no application network request. Remote validation occurs only after the user clicks the validation action; job submission is a separate authenticated action.",
    "provenance_classes": [
      "LOCAL_VERIFIED",
      "AGENT_VERIFIED",
      "SELF_DECLARED",
      "SERVER_VERIFIED (reserved)"
    ],
    "distinctions": {
      "integrity": "A hash can show equality/change.",
      "extraction_validity": "Parsing or OCR can still misread the source.",
      "authenticity": "Neither a hash nor accurate extraction proves the underlying document is genuine."
    }
  },
  "version": "2026-08-v6",
  "effective_at": "2026-08-10T00:00:00Z",
  "content_hash": "sha256:464b2f5e0a8dc6f59e1b3fd42a83ba432e3d35a5818d4f1050b0986c33207dad"
}