OPF
SpecValidation output schemaView source

Validation results

Errors, warnings and suggested fixes.

Errors, warnings and suggested fixes.

Schema $id
https://openpresentation.org/schema/opf-finding/v1
Type
object
Source
spec/schemas/finding.schema.json
Fields
3 · 3 required

Field index

FieldTypeReq.DefaultDescription
validbooleanyes—True when no finding has severity error.
findingsarray<ref:Finding>yes—Every finding, in report order.
countsobjectyes—How many findings each severity has.

valid

typebooleanrequiredyesdefault—

True when no finding has severity error.

findings

typearray<ref:Finding>requiredyesdefault—

Every finding, in report order.

findings[].severity · Allowed values
"error""warning""info"
findings[].category · Named choices (see schema for other values and constraints)
"format""references""policy""accessibility""layout""content"
findings[].scope · Allowed values
"document""context"
findings[].fixes[].kind · Allowed values
"patch""focus"
findings[].fixes[].patch[] (oneOf 1).op · Allowed values
"add""replace""test"
findings[].fixes[].patch[] (oneOf 2).op · Allowed values
"remove"
findings[].fixes[].patch[] (oneOf 3).op · Allowed values
"move""copy"

counts

typeobjectrequiredyesdefault—

How many findings each severity has.

Complete definition constraints
Exact schema constraints
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://openpresentation.org/schema/opf-finding/v1",
  "title": "Validation results",
  "description": "Errors, warnings and suggested fixes.",
  "type": "object",
  "required": [
    "valid",
    "findings",
    "counts"
  ],
  "properties": {
    "valid": {
      "type": "boolean",
      "description": "True when no finding has severity `error`."
    },
    "findings": {
      "type": "array",
      "description": "Every finding, in report order.",
      "items": {
        "$ref": "#/$defs/Finding"
      }
    },
    "counts": {
      "type": "object",
      "description": "How many findings each severity has.",
      "required": [
        "error",
        "warning",
        "info"
      ],
      "additionalProperties": false,
      "properties": {
        "error": {
          "type": "integer",
          "minimum": 0
        },
        "warning": {
          "type": "integer",
          "minimum": 0
        },
        "info": {
          "type": "integer",
          "minimum": 0
        }
      }
    }
  },
  "$defs": {
    "FindingSeverity": {
      "type": "string",
      "enum": [
        "error",
        "warning",
        "info"
      ],
      "description": "`error` makes a report invalid. `warning` is a problem the author should fix. `info` is advisory."
    },
    "FindingCategory": {
      "description": "What kind of question the finding answers. Core uses `format` (is it well-formed OPF), `references` (does everything it points at resolve), `policy` (host house rules), `accessibility`, `layout` (will it present as authored) and `content` (is anything left unfinished). Other producers may use their own category names, such as `narrative` or `audience-fit`.",
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "format",
            "references",
            "policy",
            "accessibility",
            "layout",
            "content"
          ]
        },
        {
          "type": "string",
          "minLength": 1
        }
      ]
    },
    "FindingLocation": {
      "type": "object",
      "description": "A range in the checked text: UTF-16 offset and length from the start, and the one-based line and column of the start. Present when the finding was produced from text (JSON, Markdown or YAML).",
      "required": [
        "offset",
        "length",
        "line",
        "column"
      ],
      "additionalProperties": false,
      "properties": {
        "offset": {
          "type": "integer",
          "minimum": 0
        },
        "length": {
          "type": "integer",
          "minimum": 0
        },
        "line": {
          "type": "integer",
          "minimum": 1
        },
        "column": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    "JsonPatchOperation": {
      "description": "One RFC 6902 JSON Patch operation. Paths are JSON Pointers into the checked presentation.",
      "oneOf": [
        {
          "type": "object",
          "required": [
            "op",
            "path",
            "value"
          ],
          "additionalProperties": false,
          "properties": {
            "op": {
              "type": "string",
              "enum": [
                "add",
                "replace",
                "test"
              ]
            },
            "path": {
              "type": "string"
            },
            "value": {}
          }
        },
        {
          "type": "object",
          "required": [
            "op",
            "path"
          ],
          "additionalProperties": false,
          "properties": {
            "op": {
              "type": "string",
              "const": "remove"
            },
            "path": {
              "type": "string"
            }
          }
        },
        {
          "type": "object",
          "required": [
            "op",
            "from",
            "path"
          ],
          "additionalProperties": false,
          "properties": {
            "op": {
              "type": "string",
              "enum": [
                "move",
                "copy"
              ]
            },
            "from": {
              "type": "string"
            },
            "path": {
              "type": "string"
            }
          }
        }
      ]
    },
    "FindingFocus": {
      "type": "object",
      "description": "The field an author has to fill in, for a fix that cannot be written as a patch.",
      "required": [
        "path",
        "field"
      ],
      "additionalProperties": false,
      "properties": {
        "path": {
          "type": "string",
          "description": "JSON Pointer of the field to edit."
        },
        "field": {
          "type": "string",
          "description": "What the field is, such as `alt`, `title`, `text`, `link`, `language` or `fontSize`."
        },
        "value": {
          "type": [
            "string",
            "number",
            "boolean",
            "null",
            "array",
            "object"
          ],
          "description": "The field's current value, when it has one."
        }
      }
    },
    "FindingFix": {
      "type": "object",
      "description": "A suggested repair. Core never applies it: the host shows it and applies it through its own undoable edit path. A `patch` fix carries JSON Patch operations; a `focus` fix only names the field the author has to fill in.",
      "required": [
        "title"
      ],
      "additionalProperties": false,
      "properties": {
        "title": {
          "type": "string",
          "minLength": 1,
          "description": "What applying the fix does, in a few words."
        },
        "id": {
          "type": "string",
          "description": "Stable id within one finding, such as `focus-alt` or `use-readable-color`."
        },
        "kind": {
          "type": "string",
          "enum": [
            "patch",
            "focus"
          ],
          "default": "patch",
          "description": "`patch` fixes carry `patch`; `focus` fixes carry `focus`."
        },
        "safe": {
          "type": "boolean",
          "description": "True when applying the fix cannot change what the content says or how it looks beyond the repair, such as switching a failing colour to the one the theme chose. False fixes need a deliberate choice."
        },
        "patch": {
          "type": "array",
          "description": "RFC 6902 JSON Patch operations that apply the fix to the checked presentation.",
          "items": {
            "$ref": "#/$defs/JsonPatchOperation"
          }
        },
        "focus": {
          "$ref": "#/$defs/FindingFocus"
        }
      }
    },
    "FindingSuggestion": {
      "type": "object",
      "description": "A value the author could use instead, such as a catalog record that exists. Suggestions name records actually present in the checked context and never replace authored values silently.",
      "required": [
        "value",
        "label",
        "origin"
      ],
      "additionalProperties": false,
      "properties": {
        "value": {
          "type": [
            "string",
            "number",
            "boolean",
            "null"
          ]
        },
        "label": {
          "type": "string"
        },
        "origin": {
          "type": "string",
          "description": "Where the suggestion comes from: `schema`, `document` (a record the document embeds), `registered` (a catalog the host registered) or `contract`."
        },
        "definition": {
          "type": "string",
          "description": "Where the suggested record or constraint is defined."
        }
      }
    },
    "ValidationIssue": {
      "type": "object",
      "description": "The raw schema or semantic issue behind a finding, kept with every union alternative so a host can inspect the exact constraint.",
      "required": [
        "path",
        "message",
        "keyword",
        "schemaPath",
        "params"
      ],
      "additionalProperties": false,
      "properties": {
        "path": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "keyword": {
          "type": "string",
          "description": "The JSON Schema keyword that failed, or `opf` for a rule the schema cannot express."
        },
        "schemaPath": {
          "type": "string"
        },
        "params": {
          "type": "object",
          "additionalProperties": true
        }
      }
    },
    "Finding": {
      "type": "object",
      "description": "One thing a checker found at one place in a presentation.",
      "required": [
        "ruleId",
        "severity",
        "category",
        "path",
        "message"
      ],
      "additionalProperties": false,
      "properties": {
        "ruleId": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*/[A-Za-z0-9][A-Za-z0-9._-]*$",
          "description": "Stable `<producer>/<rule>` id, such as `opf/text-contrast` for core or `pptx.dev/narrative-gap` for a hosted reviewer. Ids do not change between releases."
        },
        "source": {
          "type": "string",
          "description": "The producer: `opf` (the default) for core, or the name of another tool such as `pptx.dev/review`."
        },
        "severity": {
          "$ref": "#/$defs/FindingSeverity"
        },
        "category": {
          "$ref": "#/$defs/FindingCategory"
        },
        "path": {
          "type": "string",
          "description": "JSON Pointer to the value the finding is about, such as `/slides/4/title`. Empty for the whole document, or for a value in a supplied context such as a loaded catalog."
        },
        "scope": {
          "type": "string",
          "enum": [
            "document",
            "context"
          ],
          "description": "`document` (the default) when `path` points into the checked presentation, `context` when it points into host-supplied context such as loaded catalog records."
        },
        "message": {
          "type": "string",
          "minLength": 1,
          "description": "What is wrong, in a sentence."
        },
        "help": {
          "type": "string",
          "description": "What to do about it."
        },
        "slide": {
          "type": "integer",
          "minimum": 0,
          "description": "Zero-based index of the slide the finding belongs to."
        },
        "slideId": {
          "type": "string",
          "description": "The id of that slide, when it has one."
        },
        "location": {
          "$ref": "#/$defs/FindingLocation"
        },
        "definition": {
          "type": "string",
          "description": "A link to the rule's documentation or to the schema constraint or catalog record the finding is about."
        },
        "lookup": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Arguments for the `opf schema` or `opf catalog` command that shows the definition, as an argument list rather than a shell string."
        },
        "suggestions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/FindingSuggestion"
          }
        },
        "measured": {
          "type": "object",
          "description": "The numbers behind the finding, such as `{ \"ratio\": 2.1, \"needed\": 4.5 }`.",
          "additionalProperties": {
            "type": [
              "number",
              "string",
              "boolean",
              "null"
            ]
          }
        },
        "fixes": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/FindingFix"
          }
        },
        "validation": {
          "$ref": "#/$defs/ValidationIssue"
        }
      }
    }
  }
}

Definition choices

Values declared by this schema and its nested definitions. Paths ending in [] describe array items; * describes each dictionary entry. Variant paths apply within the named schema branch.

$defs.FindingSeverity · Allowed values
"error""warning""info"
$defs.FindingCategory · Named choices (see schema for other values and constraints)
"format""references""policy""accessibility""layout""content"
$defs.JsonPatchOperation (oneOf 1).op · Allowed values
"add""replace""test"
$defs.JsonPatchOperation (oneOf 2).op · Allowed values
"remove"
$defs.JsonPatchOperation (oneOf 3).op · Allowed values
"move""copy"
$defs.FindingFix.kind · Allowed values
"patch""focus"
$defs.Finding.severity · Allowed values
"error""warning""info"
$defs.Finding.category · Named choices (see schema for other values and constraints)
"format""references""policy""accessibility""layout""content"
$defs.Finding.scope · Allowed values
"document""context"