Skip to main content
Glama

Generate basic PDF

generate_basic_pdf
Idempotent

Build multi-page PDFs by ordering content blocks: headings, paragraphs, lists, tables, images, charts, barcodes, form fields, and more. Use this default builder for complete documents.

Instructions

Multi-page PDF composed from ordered blocks: heading, paragraph, list, table, image (JPEG/PNG), link, toc (printed table of contents), barcode, svg, formField, chart, pageBreak, spacer — every block kind the engine offers, each sharing its body with the dedicated tool (add_table, embed_image, add_barcode, add_form, add_chart). DEFAULT for any document; use the dedicated tools only for a standalone artefact, add_attachment for embedded files and add_international_text for non-Latin scripts. pdfA + embedFonts:true for a valid PDF/A-1b/2b/2u/3b claim; outline / pageLabels / viewerPreferences / watermark for navigation and presentation; print, metadata, outputIntent, creationDate as on every document tool. The 'chart' block takes the same body as add_chart.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pdfANoPDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md.
pdfxNoPDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.
debugNoDraw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.
printNoPrint production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.
titleYesDocument title (rendered at top of page 1 and used as PDF metadata title).
blocksYesOrdered list of content blocks composing the document body.
strictNoFail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true.
encryptNoEncrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.
marginsNoMargins in points, all four required (0–200). Default 45 / 36 / 35 / 36.
outlineNoDocument outline (bookmarks panel). Either 'auto' (derive a flat outline from heading blocks) or an explicit nested bookmark tree.
compressNoFlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.
metadataNo/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.
pageSizeNoPortrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.
normalizeNoUnicode normalization before shaping ('NFC' recommended for glyph coverage; NFD/NFKC/NFKD accepted). Omit = none.
watermarkNoOptional semi-transparent watermark rendered centred on every page: `text` (e.g. 'DRAFT'), `image` (JPEG/PNG), or both combined. At least one of text / image is required. opacity < 1.0 (text or image, including the defaults) is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency).
embedFontsNoEmbed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB.
footerTextNoOptional footer text rendered at the bottom of every page.
outputModeNoEither 'base64' (returns the PDF inline as a base64 string) or 'file' (writes to a path inside the configured PDFNATIVE_MCP_OUTPUT_DIR sandbox).base64
outputPathNoRequired when outputMode='file'. Relative path inside the sandbox; must end with .pdf.
pageLabelsNoPage-label ranges (the visible page numbers in the viewer, e.g. roman front-matter then decimal body). startPage values must be unique and strictly increasing.
typographyNoFine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.
creationDateNoISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs.
outputIntentNoCustom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space.
footerTemplateNoRunning footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.
headerTemplateNoRunning header on every page (left / center / right zones); reserves 15 pt.
viewerPreferencesNoReader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional.
includeDiagnosticsNoReturn the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeYes
summaryNoTool-specific summary, when produced.
filePathNoSandboxed absolute path (file mode).
sizeBytesYes
diagnosticsNoEngine diagnostics (when includeDiagnostics=true).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed32 schema fields changedv1.6.2
    • changedInput schema / properties / blocks / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "level": {
      -        "enum": [
      -          1,
      -          2,
      -          3
      -        ],
      -        "type": "integer"
      -      },
      -      "text": {
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "heading"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text",
      -      "level"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "text": {
      -        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      -        "maxLength": 50000,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "paragraph"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "items": {
      -        "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).",
      -        "items": {
      -          "oneOf": [
      -            {
      -              "maxLength": 1000,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "items": {
      -                  "items": {
      -                    "oneOf": [
      -                      {
      -                        "maxLength": 1000,
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "items": {
      -                            "items": {
      -                              "oneOf": [
      -                                {
      -                                  "maxLength": 1000,
      -                                  "minLength": 1,
      -                                  "type": "string"
      -                                },
      -                                {
      -                                  "additionalProperties": false,
      -                                  "properties": {
      -                                    "items": {
      -                                      "items": {
      -                                        "oneOf": [
      -                                          {
      -                                            "maxLength": 1000,
      -                                            "minLength": 1,
      -                                            "type": "string"
      -                                          },
      -                                          {
      -                                            "additionalProperties": false,
      -                                            "properties": {
      -                                              "items": {
      -                                                "items": {
      -                                                  "oneOf": [
      -                                                    {
      -                                                      "maxLength": 1000,
      -                                                      "minLength": 1,
      -                                                      "type": "string"
      -                                                    },
      -                                                    {
      -                                                      "additionalProperties": false,
      -                                                      "properties": {
      -                                                        "items": {
      -                                                          "items": {
      -                                                            "oneOf": [
      -                                                              {
      -                                                                "maxLength": 1000,
      -                                                                "minLength": 1,
      -                                                                "type": "string"
      -                                                              },
      -                                                              {
      -                                                                "additionalProperties": false,
      -                                                                "properties": {
      -                                                                  "text": {
      -                                                                    "maxLength": 1000,
      -                                                                    "minLength": 1,
      -                                                                    "type": "string"
      -                                                                  }
      -                                                                },
      -                                                                "required": [
      -                                                                  "text"
      -                                                                ],
      -                                                                "type": "object"
      -                                                              }
      -                                                            ]
      -                                                          },
      -                                                          "maxItems": 1000,
      -                                                          "minItems": 1,
      -                                                          "type": "array"
      -                                                        },
      -                                                        "text": {
      -                                                          "maxLength": 1000,
      -                                                          "minLength": 1,
      -                                                          "type": "string"
      -                                                        }
      -                                                      },
      -                                                      "required": [
      -                                                        "text"
      -                                                      ],
      -                                                      "type": "object"
      -                                                    }
      -                                                  ]
      -                                                },
      -                                                "maxItems": 1000,
      -                                                "minItems": 1,
      -                                                "type": "array"
      -                                              },
      -                                              "text": {
      -                                                "maxLength": 1000,
      -                                                "minLength": 1,
      -                                                "type": "string"
      -                                              }
      -                                            },
      -                                            "required": [
      -                                              "text"
      -                                            ],
      -                                            "type": "object"
      -                                          }
      -                                        ]
      -                                      },
      -                                      "maxItems": 1000,
      -                                      "minItems": 1,
      -                                      "type": "array"
      -                                    },
      -                                    "text": {
      -                                      "maxLength": 1000,
      -                                      "minLength": 1,
      -                                      "type": "string"
      -                                    }
      -                                  },
      -                                  "required": [
      -                                    "text"
      -                                  ],
      -                                  "type": "object"
      -                                }
      -                              ]
      -                            },
      -                            "maxItems": 1000,
      -                            "minItems": 1,
      -                            "type": "array"
      -                          },
      -                          "text": {
      -                            "maxLength": 1000,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "text"
      -                        ],
      -                        "type": "object"
      -                      }
      -                    ]
      -                  },
      -                  "maxItems": 1000,
      -                  "minItems": 1,
      -                  "type": "array"
      -                },
      -                "text": {
      -                  "maxLength": 1000,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "text"
      -              ],
      -              "type": "object"
      -            }
      -          ]
      -        },
      -        "maxItems": 1000,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "style": {
      -        "default": "bullet",
      -        "enum": [
      -          "bullet",
      -          "numbered"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "type": {
      -        "const": "pageBreak"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "height": {
      -        "maximum": 500,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "spacer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "height"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.",
      -    "properties": {
      -      "align": {
      -        "description": "Horizontal alignment within the content width. Default 'left'.",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "altText": {
      -        "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "axis": {
      -        "additionalProperties": false,
      -        "description": "Value-axis options (bar/line only).",
      -        "properties": {
      -          "grid": {
      -            "description": "Draw horizontal gridlines.",
      -            "type": "boolean"
      -          },
      -          "scale": {
      -            "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.",
      -            "enum": [
      -              "linear",
      -              "log"
      -            ],
      -            "type": "string"
      -          },
      -          "ticks": {
      -            "description": "Target tick count (nice 1/2/5×10ⁿ steps).",
      -            "maximum": 20,
      -            "minimum": 2,
      -            "type": "integer"
      -          },
      -          "yMax": {
      -            "description": "Force the axis maximum (values are clamped to the plot band).",
      -            "type": "number"
      -          },
      -          "yMin": {
      -            "description": "Force the axis minimum (values are clamped to the plot band).",
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "axis2": {
      -        "additionalProperties": false,
      -        "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').",
      -        "properties": {
      -          "scale": {
      -            "enum": [
      -              "linear",
      -              "log"
      -            ],
      -            "type": "string"
      -          },
      -          "ticks": {
      -            "maximum": 20,
      -            "minimum": 2,
      -            "type": "integer"
      -          },
      -          "yMax": {
      -            "type": "number"
      -          },
      -          "yMin": {
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "categories": {
      -        "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.",
      -        "items": {
      -          "maxLength": 200,
      -          "type": "string"
      -        },
      -        "maxItems": 1000,
      -        "type": "array"
      -      },
      -      "chartType": {
      -        "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').",
      -        "enum": [
      -          "bar",
      -          "barH",
      -          "stackedBar",
      -          "stackedBarH",
      -          "line",
      -          "area",
      -          "scatter",
      -          "pie",
      -          "donut"
      -        ],
      -        "type": "string"
      -      },
      -      "colors": {
      -        "description": "Palette override (per-series for bar/line, per-slice for pie/donut).",
      -        "items": {
      -          "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      -          "pattern": "^#?[0-9a-fA-F]{6}$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "dataLabels": {
      -        "description": "Per-point value labels: true for defaults, or an object to format them.",
      -        "oneOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "decimals": {
      -                "maximum": 6,
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "prefix": {
      -                "maxLength": 16,
      -                "type": "string"
      -              },
      -              "suffix": {
      -                "maxLength": 16,
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "height": {
      -        "description": "Plot-area height in points. Default 240.",
      -        "maximum": 2000,
      -        "minimum": 50,
      -        "type": "number"
      -      },
      -      "labelRotation": {
      -        "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).",
      -        "maximum": 90,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "labelStride": {
      -        "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.",
      -        "maximum": 1000,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "legend": {
      -        "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.",
      -        "enum": [
      -          "bottom",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "markers": {
      -        "description": "Draw point markers on line series. Default false.",
      -        "type": "boolean"
      -      },
      -      "series": {
      -        "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "color": {
      -              "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      -              "pattern": "^#?[0-9a-fA-F]{6}$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "Series label (shown in the legend).",
      -              "maxLength": 200,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "values": {
      -              "description": "Numeric values, one per category. Negative values are supported for bar/line.",
      -              "items": {
      -                "type": "number"
      -              },
      -              "maxItems": 1000,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "xValues": {
      -              "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.",
      -              "items": {
      -                "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).",
      -                "maxLength": 64,
      -                "type": [
      -                  "number",
      -                  "string"
      -                ]
      -              },
      -              "maxItems": 1000,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "yAxis": {
      -              "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').",
      -              "enum": [
      -                "left",
      -                "right"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "values"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "title": {
      -        "description": "Chart title rendered above the plot.",
      -        "maxLength": 200,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "chart"
      -      },
      -      "width": {
      -        "description": "Plot width in points (clamped to content width). Default 460.",
      -        "maximum": 2000,
      -        "minimum": 50,
      -        "type": "number"
      -      },
      -      "xAxis": {
      -        "additionalProperties": false,
      -        "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.",
      -        "properties": {
      -          "grid": {
      -            "description": "Draw vertical gridlines.",
      -            "type": "boolean"
      -          },
      -          "max": {
      -            "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).",
      -            "maxLength": 64,
      -            "type": [
      -              "number",
      -              "string"
      -            ]
      -          },
      -          "min": {
      -            "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).",
      -            "maxLength": 64,
      -            "type": [
      -              "number",
      -              "string"
      -            ]
      -          },
      -          "ticks": {
      -            "maximum": 20,
      -            "minimum": 2,
      -            "type": "integer"
      -          },
      -          "type": {
      -            "enum": [
      -              "category",
      -              "linear",
      -              "time"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "chartType",
      -      "series"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).",
      -    "properties": {
      -      "autoFitColumns": {
      -        "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).",
      -        "type": "boolean"
      -      },
      -      "caption": {
      -        "description": "Caption rendered above the table (tagged as /Caption under PDF/A).",
      -        "maxLength": 200,
      -        "type": "string"
      -      },
      -      "cellBorders": {
      -        "additionalProperties": false,
      -        "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.",
      -        "properties": {
      -          "all": {
      -            "description": "Draw all four edges (overrides the individual side flags).",
      -            "type": "boolean"
      -          },
      -          "bottom": {
      -            "type": "boolean"
      -          },
      -          "color": {
      -            "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey.",
      -            "type": "string"
      -          },
      -          "left": {
      -            "type": "boolean"
      -          },
      -          "right": {
      -            "type": "boolean"
      -          },
      -          "style": {
      -            "description": "Stroke style (default 'solid').",
      -            "enum": [
      -              "solid",
      -              "dashed",
      -              "dotted"
      -            ],
      -            "type": "string"
      -          },
      -          "top": {
      -            "type": "boolean"
      -          },
      -          "width": {
      -            "description": "Stroke width in points (default 0.5).",
      -            "maximum": 10,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "cellPadding": {
      -        "description": "Horizontal cell padding in points (default 3).",
      -        "maximum": 50,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "cellVAlign": {
      -        "description": "Vertical alignment of cell content.",
      -        "enum": [
      -          "top",
      -          "middle",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "clipCells": {
      -        "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.",
      -        "type": "boolean"
      -      },
      -      "headers": {
      -        "description": "Column header labels. Must have the same length as each row in `rows`.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "minRowHeight": {
      -        "description": "Minimum row height in points (default 12).",
      -        "maximum": 200,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "repeatHeader": {
      -        "description": "Repeat the header row on every continuation page (default true).",
      -        "type": "boolean"
      -      },
      -      "rows": {
      -        "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.",
      -        "items": {
      -          "items": {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          "maxItems": 50,
      -          "minItems": 1,
      -          "type": "array"
      -        },
      -        "maxItems": 5000,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "table"
      -      },
      -      "wrap": {
      -        "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.",
      -        "enum": [
      -          "auto",
      -          "always",
      -          "never"
      -        ],
      -        "type": "string"
      -      },
      -      "zebra": {
      -        "description": "Alternate-row light tint (static fill, PDF/A-1b safe).",
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "headers",
      -      "rows"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).",
      -    "properties": {
      -      "align": {
      -        "default": "left",
      -        "description": "Horizontal placement inside the content width.",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "alt": {
      -        "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "Render height in points.",
      -        "maximum": 1000,
      -        "minimum": 10,
      -        "type": "number"
      -      },
      -      "imageBase64": {
      -        "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.",
      -        "maxLength": 12000000,
      -        "minLength": 4,
      -        "type": "string"
      -      },
      -      "mimeType": {
      -        "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).",
      -        "enum": [
      -          "image/jpeg",
      -          "image/png"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "image"
      -      },
      -      "width": {
      -        "description": "Render width in points.",
      -        "maximum": 800,
      -        "minimum": 10,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "imageBase64",
      -      "mimeType"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.",
      -    "properties": {
      -      "color": {
      -        "description": "Hex colour (#RGB or #RRGGBB).",
      -        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$",
      -        "type": "string"
      -      },
      -      "fontSize": {
      -        "description": "Default 10.",
      -        "maximum": 48,
      -        "minimum": 6,
      -        "type": "number"
      -      },
      -      "text": {
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "link"
      -      },
      -      "url": {
      -        "description": "http(s):// or mailto: URL.",
      -        "maxLength": 2048,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text",
      -      "url"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.",
      -    "properties": {
      -      "fontSize": {
      -        "description": "Default 10.",
      -        "maximum": 24,
      -        "minimum": 6,
      -        "type": "number"
      -      },
      -      "indent": {
      -        "description": "Points of indent per heading level (default 15).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "maxLevel": {
      -        "description": "Deepest heading level listed (default 3).",
      -        "enum": [
      -          1,
      -          2,
      -          3
      -        ],
      -        "type": "integer"
      -      },
      -      "title": {
      -        "description": "Default 'Table of Contents'.",
      -        "maxLength": 200,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "toc"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).",
      -    "properties": {
      -      "align": {
      -        "default": "left",
      -        "description": "Horizontal placement inside the content width.",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "data": {
      -        "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.",
      -        "maxLength": 4296,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "ecLevel": {
      -        "default": "M",
      -        "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).",
      -        "enum": [
      -          "L",
      -          "M",
      -          "Q",
      -          "H"
      -        ],
      -        "type": "string"
      -      },
      -      "format": {
      -        "description": "Barcode symbology to render.",
      -        "enum": [
      -          "qr",
      -          "code128",
      -          "ean13",
      -          "datamatrix",
      -          "pdf417"
      -        ],
      -        "type": "string"
      -      },
      -      "height": {
      -        "default": 200,
      -        "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).",
      -        "maximum": 500,
      -        "minimum": 30,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "barcode"
      -      },
      -      "width": {
      -        "default": 200,
      -        "description": "Barcode width in PDF points.",
      -        "maximum": 500,
      -        "minimum": 30,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "format",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than &amp; &lt; &gt; &quot; &apos; &nbsp; &#n; are dropped). Pure path operators — PDF/A-safe at every level.",
      -    "properties": {
      -      "align": {
      -        "default": "left",
      -        "description": "Horizontal placement inside the content width.",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "alt": {
      -        "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "data": {
      -        "description": "Path `d` string or SVG markup (≤ 100 000 characters).",
      -        "maxLength": 100000,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "fill": {
      -        "description": "Hex colour or 'none' (default black).",
      -        "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$",
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "Render height in points (default 200).",
      -        "maximum": 1000,
      -        "minimum": 10,
      -        "type": "number"
      -      },
      -      "stroke": {
      -        "description": "Hex colour or 'none' (default none).",
      -        "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$",
      -        "type": "string"
      -      },
      -      "strokeWidth": {
      -        "description": "Stroke width in SVG user units (default 1).",
      -        "maximum": 50,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "svg"
      -      },
      -      "viewBox": {
      -        "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.",
      -        "items": {
      -          "type": "number"
      -        },
      -        "maxItems": 4,
      -        "minItems": 4,
      -        "type": "array"
      -      },
      -      "width": {
      -        "description": "Render width in points (default 200).",
      -        "maximum": 800,
      -        "minimum": 10,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim the widget appearance font is not embedded (PDFA_UNEMBEDDED_FORM_FONT; strict:true fails the call).",
      -    "properties": {
      -      "checked": {
      -        "description": "Initial checked state for checkbox / radio fields.",
      -        "type": "boolean"
      -      },
      -      "fieldType": {
      -        "description": "Type of form control to render. Radio fields sharing a name form one radio group.",
      -        "enum": [
      -          "text",
      -          "textarea",
      -          "checkbox",
      -          "radio",
      -          "dropdown",
      -          "listbox"
      -        ],
      -        "type": "string"
      -      },
      -      "fontSize": {
      -        "description": "Font size for text rendering inside the field.",
      -        "maximum": 48,
      -        "minimum": 6,
      -        "type": "number"
      -      },
      -      "height": {
      -        "description": "Field height in points (default depends on the type).",
      -        "maximum": 300,
      -        "minimum": 10,
      -        "type": "number"
      -      },
      -      "label": {
      -        "description": "Human-readable label shown above the field.",
      -        "maxLength": 200,
      -        "type": "string"
      -      },
      -      "maxLength": {
      -        "description": "Maximum character length for text/textarea fields.",
      -        "maximum": 32767,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "name": {
      -        "description": "Unique field name used as the PDF annotation identifier (/T).",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "options": {
      -        "description": "Choices for dropdown, listbox or radio fields.",
      -        "items": {
      -          "maxLength": 200,
      -          "type": "string"
      -        },
      -        "maxItems": 100,
      -        "type": "array"
      -      },
      -      "placeholder": {
      -        "description": "Hint text shown while the field is empty.",
      -        "maxLength": 200,
      -        "type": "string"
      -      },
      -      "readOnly": {
      -        "description": "Prevent editing of this field.",
      -        "type": "boolean"
      -      },
      -      "required": {
      -        "description": "Mark field as required.",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "formField"
      -      },
      -      "value": {
      -        "description": "Default value pre-filled in the field.",
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "Field width in points (default: full content width).",
      -        "maximum": 500,
      -        "minimum": 10,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "fieldType",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "keepWithNext": {
      +        "description": "Keep this heading on the same page as the block that follows. Overrides typography.keepHeadingsWithNext for this block, either way.",
      +        "type": "boolean"
      +      },
      +      "level": {
      +        "enum": [
      +          1,
      +          2,
      +          3
      +        ],
      +        "type": "integer"
      +      },
      +      "text": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "heading"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text",
      +      "level"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "align": {
      +        "description": "Text alignment (default left). 'justify' spans every line but the last across the measure; pair it with typography.opticalMargins.",
      +        "enum": [
      +          "left",
      +          "right",
      +          "center",
      +          "justify"
      +        ],
      +        "type": "string"
      +      },
      +      "keepWithNext": {
      +        "description": "Keep this paragraph on the same page as the block that follows (a lead-in line before a table or figure). Default false.",
      +        "type": "boolean"
      +      },
      +      "splittable": {
      +        "description": "Allow / forbid this paragraph breaking across pages, overriding typography.splitParagraphs for this block.",
      +        "type": "boolean"
      +      },
      +      "text": {
      +        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      +        "maxLength": 50000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "paragraph"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "items": {
      +        "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).",
      +        "items": {
      +          "oneOf": [
      +            {
      +              "maxLength": 1000,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "additionalProperties": false,
      +              "properties": {
      +                "items": {
      +                  "items": {
      +                    "oneOf": [
      +                      {
      +                        "maxLength": 1000,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "items": {
      +                            "items": {
      +                              "oneOf": [
      +                                {
      +                                  "maxLength": 1000,
      +                                  "minLength": 1,
      +                                  "type": "string"
      +                                },
      +                                {
      +                                  "additionalProperties": false,
      +                                  "properties": {
      +                                    "items": {
      +                                      "items": {
      +                                        "oneOf": [
      +                                          {
      +                                            "maxLength": 1000,
      +                                            "minLength": 1,
      +                                            "type": "string"
      +                                          },
      +                                          {
      +                                            "additionalProperties": false,
      +                                            "properties": {
      +                                              "items": {
      +                                                "items": {
      +                                                  "oneOf": [
      +                                                    {
      +                                                      "maxLength": 1000,
      +                                                      "minLength": 1,
      +                                                      "type": "string"
      +                                                    },
      +                                                    {
      +                                                      "additionalProperties": false,
      +                                                      "properties": {
      +                                                        "items": {
      +                                                          "items": {
      +                                                            "oneOf": [
      +                                                              {
      +                                                                "maxLength": 1000,
      +                                                                "minLength": 1,
      +                                                                "type": "string"
      +                                                              },
      +                                                              {
      +                                                                "additionalProperties": false,
      +                                                                "properties": {
      +                                                                  "text": {
      +                                                                    "maxLength": 1000,
      +                                                                    "minLength": 1,
      +                                                                    "type": "string"
      +                                                                  }
      +                                                                },
      +                                                                "required": [
      +                                                                  "text"
      +                                                                ],
      +                                                                "type": "object"
      +                                                              }
      +                                                            ]
      +                                                          },
      +                                                          "maxItems": 1000,
      +                                                          "minItems": 1,
      +                                                          "type": "array"
      +                                                        },
      +                                                        "text": {
      +                                                          "maxLength": 1000,
      +                                                          "minLength": 1,
      +                                                          "type": "string"
      +                                                        }
      +                                                      },
      +                                                      "required": [
      +                                                        "text"
      +                                                      ],
      +                                                      "type": "object"
      +                                                    }
      +                                                  ]
      +                                                },
      +                                                "maxItems": 1000,
      +                                                "minItems": 1,
      +                                                "type": "array"
      +                                              },
      +                                              "text": {
      +                                                "maxLength": 1000,
      +                                                "minLength": 1,
      +                                                "type": "string"
      +                                              }
      +                                            },
      +                                            "required": [
      +                                              "text"
      +                                            ],
      +                                            "type": "object"
      +                                          }
      +                                        ]
      +                                      },
      +                                      "maxItems": 1000,
      +                                      "minItems": 1,
      +                                      "type": "array"
      +                                    },
      +                                    "text": {
      +                                      "maxLength": 1000,
      +                                      "minLength": 1,
      +                                      "type": "string"
      +                                    }
      +                                  },
      +                                  "required": [
      +                                    "text"
      +                                  ],
      +                                  "type": "object"
      +                                }
      +                              ]
      +                            },
      +                            "maxItems": 1000,
      +                            "minItems": 1,
      +                            "type": "array"
      +                          },
      +                          "text": {
      +                            "maxLength": 1000,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "text"
      +                        ],
      +                        "type": "object"
      +                      }
      +                    ]
      +                  },
      +                  "maxItems": 1000,
      +                  "minItems": 1,
      +                  "type": "array"
      +                },
      +                "text": {
      +                  "maxLength": 1000,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text"
      +              ],
      +              "type": "object"
      +            }
      +          ]
      +        },
      +        "maxItems": 1000,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "style": {
      +        "default": "bullet",
      +        "enum": [
      +          "bullet",
      +          "numbered"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "type": {
      +        "const": "pageBreak"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "height": {
      +        "maximum": 500,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "spacer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "height"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.",
      +    "properties": {
      +      "align": {
      +        "description": "Horizontal alignment within the content width. Default 'left'.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "altText": {
      +        "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "axis": {
      +        "additionalProperties": false,
      +        "description": "Value-axis options (bar/line only).",
      +        "properties": {
      +          "grid": {
      +            "description": "Draw horizontal gridlines.",
      +            "type": "boolean"
      +          },
      +          "scale": {
      +            "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.",
      +            "enum": [
      +              "linear",
      +              "log"
      +            ],
      +            "type": "string"
      +          },
      +          "ticks": {
      +            "description": "Target tick count (nice 1/2/5×10ⁿ steps).",
      +            "maximum": 20,
      +            "minimum": 2,
      +            "type": "integer"
      +          },
      +          "yMax": {
      +            "description": "Force the axis maximum (values are clamped to the plot band).",
      +            "type": "number"
      +          },
      +          "yMin": {
      +            "description": "Force the axis minimum (values are clamped to the plot band).",
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "axis2": {
      +        "additionalProperties": false,
      +        "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').",
      +        "properties": {
      +          "scale": {
      +            "enum": [
      +              "linear",
      +              "log"
      +            ],
      +            "type": "string"
      +          },
      +          "ticks": {
      +            "maximum": 20,
      +            "minimum": 2,
      +            "type": "integer"
      +          },
      +          "yMax": {
      +            "type": "number"
      +          },
      +          "yMin": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "categories": {
      +        "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.",
      +        "items": {
      +          "maxLength": 200,
      +          "type": "string"
      +        },
      +        "maxItems": 1000,
      +        "type": "array"
      +      },
      +      "chartType": {
      +        "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').",
      +        "enum": [
      +          "bar",
      +          "barH",
      +          "stackedBar",
      +          "stackedBarH",
      +          "line",
      +          "area",
      +          "scatter",
      +          "pie",
      +          "donut"
      +        ],
      +        "type": "string"
      +      },
      +      "colors": {
      +        "description": "Palette override (per-series for bar/line, per-slice for pie/donut).",
      +        "items": {
      +          "anyOf": [
      +            {
      +              "pattern": "^#?[0-9a-fA-F]{6}$",
      +              "type": "string"
      +            },
      +            {
      +              "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +              "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +              "type": "string"
      +            },
      +            {
      +              "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +              "items": {
      +                "maximum": 100,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "maxItems": 4,
      +              "minItems": 4,
      +              "type": "array"
      +            }
      +          ],
      +          "description": "CSS-style hex colour, e.g. \"#3366cc\"."
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "dataLabels": {
      +        "description": "Per-point value labels: true for defaults, or an object to format them.",
      +        "oneOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "decimals": {
      +                "maximum": 6,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "prefix": {
      +                "maxLength": 16,
      +                "type": "string"
      +              },
      +              "suffix": {
      +                "maxLength": 16,
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "height": {
      +        "description": "Plot-area height in points. Default 240.",
      +        "maximum": 2000,
      +        "minimum": 50,
      +        "type": "number"
      +      },
      +      "labelRotation": {
      +        "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).",
      +        "maximum": 90,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "labelStride": {
      +        "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.",
      +        "maximum": 1000,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "legend": {
      +        "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.",
      +        "enum": [
      +          "bottom",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "markers": {
      +        "description": "Draw point markers on line series. Default false.",
      +        "type": "boolean"
      +      },
      +      "series": {
      +        "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "color": {
      +              "anyOf": [
      +                {
      +                  "pattern": "^#?[0-9a-fA-F]{6}$",
      +                  "type": "string"
      +                },
      +                {
      +                  "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +                  "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +                  "type": "string"
      +                },
      +                {
      +                  "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +                  "items": {
      +                    "maximum": 100,
      +                    "minimum": 0,
      +                    "type": "number"
      +                  },
      +                  "maxItems": 4,
      +                  "minItems": 4,
      +                  "type": "array"
      +                }
      +              ],
      +              "description": "CSS-style hex colour, e.g. \"#3366cc\"."
      +            },
      +            "label": {
      +              "description": "Series label (shown in the legend).",
      +              "maxLength": 200,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "values": {
      +              "description": "Numeric values, one per category. Negative values are supported for bar/line.",
      +              "items": {
      +                "type": "number"
      +              },
      +              "maxItems": 1000,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "xValues": {
      +              "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.",
      +              "items": {
      +                "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).",
      +                "maxLength": 64,
      +                "type": [
      +                  "number",
      +                  "string"
      +                ]
      +              },
      +              "maxItems": 1000,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "yAxis": {
      +              "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').",
      +              "enum": [
      +                "left",
      +                "right"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "values"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "title": {
      +        "description": "Chart title rendered above the plot.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "chart"
      +      },
      +      "width": {
      +        "description": "Plot width in points (clamped to content width). Default 460.",
      +        "maximum": 2000,
      +        "minimum": 50,
      +        "type": "number"
      +      },
      +      "xAxis": {
      +        "additionalProperties": false,
      +        "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.",
      +        "properties": {
      +          "grid": {
      +            "description": "Draw vertical gridlines.",
      +            "type": "boolean"
      +          },
      +          "max": {
      +            "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).",
      +            "maxLength": 64,
      +            "type": [
      +              "number",
      +              "string"
      +            ]
      +          },
      +          "min": {
      +            "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).",
      +            "maxLength": 64,
      +            "type": [
      +              "number",
      +              "string"
      +            ]
      +          },
      +          "ticks": {
      +            "maximum": 20,
      +            "minimum": 2,
      +            "type": "integer"
      +          },
      +          "type": {
      +            "enum": [
      +              "category",
      +              "linear",
      +              "time"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "chartType",
      +      "series"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).",
      +    "properties": {
      +      "autoFitColumns": {
      +        "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).",
      +        "type": "boolean"
      +      },
      +      "caption": {
      +        "description": "Caption rendered above the table (tagged as /Caption under PDF/A).",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "cellBorders": {
      +        "additionalProperties": false,
      +        "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.",
      +        "properties": {
      +          "all": {
      +            "description": "Draw all four edges (overrides the individual side flags).",
      +            "type": "boolean"
      +          },
      +          "bottom": {
      +            "type": "boolean"
      +          },
      +          "color": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +                "items": {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                "maxItems": 4,
      +                "minItems": 4,
      +                "type": "array"
      +              }
      +            ],
      +            "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey."
      +          },
      +          "left": {
      +            "type": "boolean"
      +          },
      +          "right": {
      +            "type": "boolean"
      +          },
      +          "style": {
      +            "description": "Stroke style (default 'solid').",
      +            "enum": [
      +              "solid",
      +              "dashed",
      +              "dotted"
      +            ],
      +            "type": "string"
      +          },
      +          "top": {
      +            "type": "boolean"
      +          },
      +          "width": {
      +            "description": "Stroke width in points (default 0.5).",
      +            "maximum": 10,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "cellPadding": {
      +        "description": "Horizontal cell padding in points (default 3).",
      +        "maximum": 50,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "cellVAlign": {
      +        "description": "Vertical alignment of cell content.",
      +        "enum": [
      +          "top",
      +          "middle",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "clipCells": {
      +        "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.",
      +        "type": "boolean"
      +      },
      +      "headers": {
      +        "description": "Column header labels. Must have the same length as each row in `rows`.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "minRowHeight": {
      +        "description": "Minimum row height in points (default 12).",
      +        "maximum": 200,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "repeatHeader": {
      +        "description": "Repeat the header row on every continuation page (default true).",
      +        "type": "boolean"
      +      },
      +      "rows": {
      +        "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.",
      +        "items": {
      +          "items": {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "maxItems": 50,
      +          "minItems": 1,
      +          "type": "array"
      +        },
      +        "maxItems": 5000,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "table"
      +      },
      +      "wrap": {
      +        "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.",
      +        "enum": [
      +          "auto",
      +          "always",
      +          "never"
      +        ],
      +        "type": "string"
      +      },
      +      "zebra": {
      +        "description": "Alternate-row light tint (static fill, PDF/A-1b safe).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "headers",
      +      "rows"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).",
      +    "properties": {
      +      "align": {
      +        "default": "left",
      +        "description": "Horizontal placement inside the content width.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "alt": {
      +        "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "Render height in points.",
      +        "maximum": 1000,
      +        "minimum": 10,
      +        "type": "number"
      +      },
      +      "imageBase64": {
      +        "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.",
      +        "maxLength": 12000000,
      +        "minLength": 4,
      +        "type": "string"
      +      },
      +      "mimeType": {
      +        "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).",
      +        "enum": [
      +          "image/jpeg",
      +          "image/png"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "image"
      +      },
      +      "width": {
      +        "description": "Render width in points.",
      +        "maximum": 800,
      +        "minimum": 10,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "imageBase64",
      +      "mimeType"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.",
      +    "properties": {
      +      "color": {
      +        "anyOf": [
      +          {
      +            "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$",
      +            "type": "string"
      +          },
      +          {
      +            "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +            "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +            "type": "string"
      +          },
      +          {
      +            "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +            "items": {
      +              "maximum": 100,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Hex colour (#RGB or #RRGGBB)."
      +      },
      +      "fontSize": {
      +        "description": "Default 10.",
      +        "maximum": 48,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "text": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "link"
      +      },
      +      "url": {
      +        "description": "http(s):// or mailto: URL.",
      +        "maxLength": 2048,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.",
      +    "properties": {
      +      "fontSize": {
      +        "description": "Default 10.",
      +        "maximum": 24,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "indent": {
      +        "description": "Points of indent per heading level (default 15).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "maxLevel": {
      +        "description": "Deepest heading level listed (default 3).",
      +        "enum": [
      +          1,
      +          2,
      +          3
      +        ],
      +        "type": "integer"
      +      },
      +      "title": {
      +        "description": "Default 'Table of Contents'.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "toc"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).",
      +    "properties": {
      +      "align": {
      +        "default": "left",
      +        "description": "Horizontal placement inside the content width.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.",
      +        "maxLength": 4296,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "ecLevel": {
      +        "default": "M",
      +        "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).",
      +        "enum": [
      +          "L",
      +          "M",
      +          "Q",
      +          "H"
      +        ],
      +        "type": "string"
      +      },
      +      "format": {
      +        "description": "Barcode symbology to render.",
      +        "enum": [
      +          "qr",
      +          "code128",
      +          "ean13",
      +          "datamatrix",
      +          "pdf417"
      +        ],
      +        "type": "string"
      +      },
      +      "height": {
      +        "default": 200,
      +        "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).",
      +        "maximum": 500,
      +        "minimum": 30,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "barcode"
      +      },
      +      "width": {
      +        "default": 200,
      +        "description": "Barcode width in PDF points.",
      +        "maximum": 500,
      +        "minimum": 30,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "format",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than &amp; &lt; &gt; &quot; &apos; &nbsp; &#n; are dropped). Pure path operators — PDF/A-safe at every level.",
      +    "properties": {
      +      "align": {
      +        "default": "left",
      +        "description": "Horizontal placement inside the content width.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "alt": {
      +        "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Path `d` string or SVG markup (≤ 100 000 characters).",
      +        "maxLength": 100000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "fill": {
      +        "anyOf": [
      +          {
      +            "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$",
      +            "type": "string"
      +          },
      +          {
      +            "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +            "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +            "type": "string"
      +          },
      +          {
      +            "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +            "items": {
      +              "maximum": 100,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Hex colour or 'none' (default black)."
      +      },
      +      "height": {
      +        "description": "Render height in points (default 200).",
      +        "maximum": 1000,
      +        "minimum": 10,
      +        "type": "number"
      +      },
      +      "stroke": {
      +        "anyOf": [
      +          {
      +            "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$",
      +            "type": "string"
      +          },
      +          {
      +            "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +            "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +            "type": "string"
      +          },
      +          {
      +            "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +            "items": {
      +              "maximum": 100,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Hex colour or 'none' (default none)."
      +      },
      +      "strokeWidth": {
      +        "description": "Stroke width in SVG user units (default 1).",
      +        "maximum": 50,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "svg"
      +      },
      +      "viewBox": {
      +        "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.",
      +        "items": {
      +          "type": "number"
      +        },
      +        "maxItems": 4,
      +        "minItems": 4,
      +        "type": "array"
      +      },
      +      "width": {
      +        "description": "Render width in points (default 200).",
      +        "maximum": 800,
      +        "minimum": 10,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim pass embedFonts:true so the field font is embedded too (PDFA_UNEMBEDDED_FORM_FONT otherwise; strict:true then fails the call).",
      +    "properties": {
      +      "checked": {
      +        "description": "Initial checked state for checkbox / radio fields.",
      +        "type": "boolean"
      +      },
      +      "fieldType": {
      +        "description": "Type of form control to render. Radio fields sharing a name form one radio group.",
      +        "enum": [
      +          "text",
      +          "textarea",
      +          "checkbox",
      +          "radio",
      +          "dropdown",
      +          "listbox"
      +        ],
      +        "type": "string"
      +      },
      +      "fontSize": {
      +        "description": "Font size for text rendering inside the field.",
      +        "maximum": 48,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "height": {
      +        "description": "Field height in points (default depends on the type).",
      +        "maximum": 300,
      +        "minimum": 10,
      +        "type": "number"
      +      },
      +      "label": {
      +        "description": "Human-readable label shown above the field.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "maxLength": {
      +        "description": "Maximum character length for text/textarea fields.",
      +        "maximum": 32767,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "name": {
      +        "description": "Unique field name used as the PDF annotation identifier (/T).",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "options": {
      +        "description": "Choices for dropdown, listbox or radio fields.",
      +        "items": {
      +          "maxLength": 200,
      +          "type": "string"
      +        },
      +        "maxItems": 100,
      +        "type": "array"
      +      },
      +      "placeholder": {
      +        "description": "Hint text shown while the field is empty.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "readOnly": {
      +        "description": "Prevent editing of this field.",
      +        "type": "boolean"
      +      },
      +      "required": {
      +        "description": "Mark field as required.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "formField"
      +      },
      +      "value": {
      +        "description": "Pre-filled value. The key is 'value' (there is no defaultValue).",
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "Field width in points (default: full content width).",
      +        "maximum": 500,
      +        "minimum": 10,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "fieldType",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / creationDate / description
      Previous value: -"ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs."New value: +"ISO-8601 instant for /CreationDate (+ XMP, the trailer /ID and the {date} placeholder), written in UTC. Pin it for byte-identical output across calls and hosts; omitted = wall clock, so every call differs."
    • changedInput schema / properties / embedFonts / description
      Previous value: -"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB."New value: +"Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A or PDF/X claim (every font embedded) and for strict=true; adds ~0.3 MiB."
    • changedInput schema / properties / footerTemplate / properties / center / description
      Previous value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)."
    • addedInput schema / properties / footerTemplate / properties / color / anyOf
      Added value: +[
      +  {
      +    "pattern": "^#[0-9a-fA-F]{6}$",
      +    "type": "string"
      +  },
      +  {
      +    "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +    "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +    "type": "string"
      +  },
      +  {
      +    "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +    "items": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "maxItems": 4,
      +    "minItems": 4,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / footerTemplate / properties / color / description
      Previous value: -"Hex colour."New value: +"Hex colour (#RRGGBB)."
    • removedInput schema / properties / footerTemplate / properties / color / pattern
      Removed value: -"^#[0-9a-fA-F]{6}$"
    • removedInput schema / properties / footerTemplate / properties / color / type
      Removed value: -"string"
    • changedInput schema / properties / footerTemplate / properties / left / description
      Previous value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)."
    • changedInput schema / properties / footerTemplate / properties / right / description
      Previous value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)."
    • changedInput schema / properties / headerTemplate / properties / center / description
      Previous value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)."
    • addedInput schema / properties / headerTemplate / properties / color / anyOf
      Added value: +[
      +  {
      +    "pattern": "^#[0-9a-fA-F]{6}$",
      +    "type": "string"
      +  },
      +  {
      +    "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +    "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +    "type": "string"
      +  },
      +  {
      +    "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +    "items": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "maxItems": 4,
      +    "minItems": 4,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / headerTemplate / properties / color / description
      Previous value: -"Hex colour."New value: +"Hex colour (#RRGGBB)."
    • removedInput schema / properties / headerTemplate / properties / color / pattern
      Removed value: -"^#[0-9a-fA-F]{6}$"
    • removedInput schema / properties / headerTemplate / properties / color / type
      Removed value: -"string"
    • changedInput schema / properties / headerTemplate / properties / left / description
      Previous value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)."
    • changedInput schema / properties / headerTemplate / properties / right / description
      Previous value: -"Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate)."New value: +"Placeholders: {page} {pages} {title} {date} (UTC date of creationDate when pinned, else of the build)."
    • changedInput schema / properties / includeDiagnostics / description
      Previous value: -"Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty)."New value: +"Return the diagnostics raised while building (PDFA_*, PDFX_*, TYPOGRAPHY_*) as `diagnostics[]` (possibly empty)."
    • changedInput schema / properties / outline / oneOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "auto"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "bold": {
      -          "type": "boolean"
      -        },
      -        "children": {
      -          "items": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "bold": {
      -                "type": "boolean"
      -              },
      -              "children": {
      -                "items": {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "bold": {
      -                      "type": "boolean"
      -                    },
      -                    "children": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "bold": {
      -                            "type": "boolean"
      -                          },
      -                          "children": {
      -                            "items": {
      -                              "additionalProperties": false,
      -                              "properties": {
      -                                "bold": {
      -                                  "type": "boolean"
      -                                },
      -                                "children": {
      -                                  "items": {
      -                                    "additionalProperties": false,
      -                                    "properties": {
      -                                      "bold": {
      -                                        "type": "boolean"
      -                                      },
      -                                      "color": {
      -                                        "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      -                                        "type": "string"
      -                                      },
      -                                      "italic": {
      -                                        "type": "boolean"
      -                                      },
      -                                      "open": {
      -                                        "description": "Initial expansion state (default true). false renders the branch collapsed.",
      -                                        "type": "boolean"
      -                                      },
      -                                      "pageIndex": {
      -                                        "description": "0-based destination page index.",
      -                                        "minimum": 0,
      -                                        "type": "integer"
      -                                      },
      -                                      "title": {
      -                                        "description": "Bookmark label.",
      -                                        "maxLength": 500,
      -                                        "minLength": 1,
      -                                        "type": "string"
      -                                      },
      -                                      "y": {
      -                                        "description": "Destination Y coordinate in points (default: top of page).",
      -                                        "type": "number"
      -                                      }
      -                                    },
      -                                    "required": [
      -                                      "title",
      -                                      "pageIndex"
      -                                    ],
      -                                    "type": "object"
      -                                  },
      -                                  "maxItems": 1000,
      -                                  "type": "array"
      -                                },
      -                                "color": {
      -                                  "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      -                                  "type": "string"
      -                                },
      -                                "italic": {
      -                                  "type": "boolean"
      -                                },
      -                                "open": {
      -                                  "description": "Initial expansion state (default true). false renders the branch collapsed.",
      -                                  "type": "boolean"
      -                                },
      -                                "pageIndex": {
      -                                  "description": "0-based destination page index.",
      -                                  "minimum": 0,
      -                                  "type": "integer"
      -                                },
      -                                "title": {
      -                                  "description": "Bookmark label.",
      -                                  "maxLength": 500,
      -                                  "minLength": 1,
      -                                  "type": "string"
      -                                },
      -                                "y": {
      -                                  "description": "Destination Y coordinate in points (default: top of page).",
      -                                  "type": "number"
      -                                }
      -                              },
      -                              "required": [
      -                                "title",
      -                                "pageIndex"
      -                              ],
      -                              "type": "object"
      -                            },
      -                            "maxItems": 1000,
      -                            "type": "array"
      -                          },
      -                          "color": {
      -                            "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      -                            "type": "string"
      -                          },
      -                          "italic": {
      -                            "type": "boolean"
      -                          },
      -                          "open": {
      -                            "description": "Initial expansion state (default true). false renders the branch collapsed.",
      -                            "type": "boolean"
      -                          },
      -                          "pageIndex": {
      -                            "description": "0-based destination page index.",
      -                            "minimum": 0,
      -                            "type": "integer"
      -                          },
      -                          "title": {
      -                            "description": "Bookmark label.",
      -                            "maxLength": 500,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "y": {
      -                            "description": "Destination Y coordinate in points (default: top of page).",
      -                            "type": "number"
      -                          }
      -                        },
      -                        "required": [
      -                          "title",
      -                          "pageIndex"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 1000,
      -                      "type": "array"
      -                    },
      -                    "color": {
      -                      "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      -                      "type": "string"
      -                    },
      -                    "italic": {
      -                      "type": "boolean"
      -                    },
      -                    "open": {
      -                      "description": "Initial expansion state (default true). false renders the branch collapsed.",
      -                      "type": "boolean"
      -                    },
      -                    "pageIndex": {
      -                      "description": "0-based destination page index.",
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "title": {
      -                      "description": "Bookmark label.",
      -                      "maxLength": 500,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "y": {
      -                      "description": "Destination Y coordinate in points (default: top of page).",
      -                      "type": "number"
      -                    }
      -                  },
      -                  "required": [
      -                    "title",
      -                    "pageIndex"
      -                  ],
      -                  "type": "object"
      -                },
      -                "maxItems": 1000,
      -                "type": "array"
      -              },
      -              "color": {
      -                "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      -                "type": "string"
      -              },
      -              "italic": {
      -                "type": "boolean"
      -              },
      -              "open": {
      -                "description": "Initial expansion state (default true). false renders the branch collapsed.",
      -                "type": "boolean"
      -              },
      -              "pageIndex": {
      -                "description": "0-based destination page index.",
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "title": {
      -                "description": "Bookmark label.",
      -                "maxLength": 500,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "y": {
      -                "description": "Destination Y coordinate in points (default: top of page).",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "title",
      -              "pageIndex"
      -            ],
      -            "type": "object"
      -          },
      -          "maxItems": 1000,
      -          "type": "array"
      -        },
      -        "color": {
      -          "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      -          "type": "string"
      -        },
      -        "italic": {
      -          "type": "boolean"
      -        },
      -        "open": {
      -          "description": "Initial expansion state (default true). false renders the branch collapsed.",
      -          "type": "boolean"
      -        },
      -        "pageIndex": {
      -          "description": "0-based destination page index.",
      -          "minimum": 0,
      -          "type": "integer"
      -        },
      -        "title": {
      -          "description": "Bookmark label.",
      -          "maxLength": 500,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "y": {
      -          "description": "Destination Y coordinate in points (default: top of page).",
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "title",
      -        "pageIndex"
      -      ],
      -      "type": "object"
      -    },
      -    "maxItems": 1000,
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "auto"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "bold": {
      +          "type": "boolean"
      +        },
      +        "children": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "bold": {
      +                "type": "boolean"
      +              },
      +              "children": {
      +                "items": {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "bold": {
      +                      "type": "boolean"
      +                    },
      +                    "children": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "bold": {
      +                            "type": "boolean"
      +                          },
      +                          "children": {
      +                            "items": {
      +                              "additionalProperties": false,
      +                              "properties": {
      +                                "bold": {
      +                                  "type": "boolean"
      +                                },
      +                                "children": {
      +                                  "items": {
      +                                    "additionalProperties": false,
      +                                    "properties": {
      +                                      "bold": {
      +                                        "type": "boolean"
      +                                      },
      +                                      "color": {
      +                                        "anyOf": [
      +                                          {
      +                                            "type": "string"
      +                                          },
      +                                          {
      +                                            "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +                                            "items": {
      +                                              "maximum": 100,
      +                                              "minimum": 0,
      +                                              "type": "number"
      +                                            },
      +                                            "maxItems": 4,
      +                                            "minItems": 4,
      +                                            "type": "array"
      +                                          }
      +                                        ],
      +                                        "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display."
      +                                      },
      +                                      "italic": {
      +                                        "type": "boolean"
      +                                      },
      +                                      "open": {
      +                                        "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                                        "type": "boolean"
      +                                      },
      +                                      "pageIndex": {
      +                                        "description": "0-based destination page index.",
      +                                        "minimum": 0,
      +                                        "type": "integer"
      +                                      },
      +                                      "title": {
      +                                        "description": "Bookmark label.",
      +                                        "maxLength": 500,
      +                                        "minLength": 1,
      +                                        "type": "string"
      +                                      },
      +                                      "y": {
      +                                        "description": "Destination Y coordinate in points (default: top of page).",
      +                                        "type": "number"
      +                                      }
      +                                    },
      +                                    "required": [
      +                                      "title",
      +                                      "pageIndex"
      +                                    ],
      +                                    "type": "object"
      +                                  },
      +                                  "maxItems": 1000,
      +                                  "type": "array"
      +                                },
      +                                "color": {
      +                                  "anyOf": [
      +                                    {
      +                                      "type": "string"
      +                                    },
      +                                    {
      +                                      "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +                                      "items": {
      +                                        "maximum": 100,
      +                                        "minimum": 0,
      +                                        "type": "number"
      +                                      },
      +                                      "maxItems": 4,
      +                                      "minItems": 4,
      +                                      "type": "array"
      +                                    }
      +                                  ],
      +                                  "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display."
      +                                },
      +                                "italic": {
      +                                  "type": "boolean"
      +                                },
      +                                "open": {
      +                                  "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                                  "type": "boolean"
      +                                },
      +                                "pageIndex": {
      +                                  "description": "0-based destination page index.",
      +                                  "minimum": 0,
      +                                  "type": "integer"
      +                                },
      +                                "title": {
      +                                  "description": "Bookmark label.",
      +                                  "maxLength": 500,
      +                                  "minLength": 1,
      +                                  "type": "string"
      +                                },
      +                                "y": {
      +                                  "description": "Destination Y coordinate in points (default: top of page).",
      +                                  "type": "number"
      +                                }
      +                              },
      +                              "required": [
      +                                "title",
      +                                "pageIndex"
      +                              ],
      +                              "type": "object"
      +                            },
      +                            "maxItems": 1000,
      +                            "type": "array"
      +                          },
      +                          "color": {
      +                            "anyOf": [
      +                              {
      +                                "type": "string"
      +                              },
      +                              {
      +                                "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +                                "items": {
      +                                  "maximum": 100,
      +                                  "minimum": 0,
      +                                  "type": "number"
      +                                },
      +                                "maxItems": 4,
      +                                "minItems": 4,
      +                                "type": "array"
      +                              }
      +                            ],
      +                            "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display."
      +                          },
      +                          "italic": {
      +                            "type": "boolean"
      +                          },
      +                          "open": {
      +                            "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                            "type": "boolean"
      +                          },
      +                          "pageIndex": {
      +                            "description": "0-based destination page index.",
      +                            "minimum": 0,
      +                            "type": "integer"
      +                          },
      +                          "title": {
      +                            "description": "Bookmark label.",
      +                            "maxLength": 500,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "y": {
      +                            "description": "Destination Y coordinate in points (default: top of page).",
      +                            "type": "number"
      +                          }
      +                        },
      +                        "required": [
      +                          "title",
      +                          "pageIndex"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 1000,
      +                      "type": "array"
      +                    },
      +                    "color": {
      +                      "anyOf": [
      +                        {
      +                          "type": "string"
      +                        },
      +                        {
      +                          "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +                          "items": {
      +                            "maximum": 100,
      +                            "minimum": 0,
      +                            "type": "number"
      +                          },
      +                          "maxItems": 4,
      +                          "minItems": 4,
      +                          "type": "array"
      +                        }
      +                      ],
      +                      "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display."
      +                    },
      +                    "italic": {
      +                      "type": "boolean"
      +                    },
      +                    "open": {
      +                      "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                      "type": "boolean"
      +                    },
      +                    "pageIndex": {
      +                      "description": "0-based destination page index.",
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "title": {
      +                      "description": "Bookmark label.",
      +                      "maxLength": 500,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "y": {
      +                      "description": "Destination Y coordinate in points (default: top of page).",
      +                      "type": "number"
      +                    }
      +                  },
      +                  "required": [
      +                    "title",
      +                    "pageIndex"
      +                  ],
      +                  "type": "object"
      +                },
      +                "maxItems": 1000,
      +                "type": "array"
      +              },
      +              "color": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +                    "items": {
      +                      "maximum": 100,
      +                      "minimum": 0,
      +                      "type": "number"
      +                    },
      +                    "maxItems": 4,
      +                    "minItems": 4,
      +                    "type": "array"
      +                  }
      +                ],
      +                "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display."
      +              },
      +              "italic": {
      +                "type": "boolean"
      +              },
      +              "open": {
      +                "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                "type": "boolean"
      +              },
      +              "pageIndex": {
      +                "description": "0-based destination page index.",
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "title": {
      +                "description": "Bookmark label.",
      +                "maxLength": 500,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "y": {
      +                "description": "Destination Y coordinate in points (default: top of page).",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "title",
      +              "pageIndex"
      +            ],
      +            "type": "object"
      +          },
      +          "maxItems": 1000,
      +          "type": "array"
      +        },
      +        "color": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +              "items": {
      +                "maximum": 100,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "maxItems": 4,
      +              "minItems": 4,
      +              "type": "array"
      +            }
      +          ],
      +          "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1'). An outline label is RGB by definition (/C): a CMYK value is converted for on-screen display."
      +        },
      +        "italic": {
      +          "type": "boolean"
      +        },
      +        "open": {
      +          "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +          "type": "boolean"
      +        },
      +        "pageIndex": {
      +          "description": "0-based destination page index.",
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "title": {
      +          "description": "Bookmark label.",
      +          "maxLength": 500,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "y": {
      +          "description": "Destination Y coordinate in points (default: top of page).",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "title",
      +        "pageIndex"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 1000,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / outputIntent / description
      Previous value: -"Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected)."New value: +"Custom OutputIntent (under pdfA or pdfx): an RGB, CMYK or Gray ICC profile + condition strings, replacing the built-in sRGB intent. The profile must be a real ICC file ('acsp' signature, consistent size — PRINT_ERROR otherwise); pdfx needs device class 'prtr'. Under a CMYK / Gray intent RGB content is mapped through a calibrated default space."
    • changedInput schema / properties / outputIntent / properties / iccProfileBase64 / description
      Previous value: -"ICC profile bytes, base64 (RGB, ≤ 8 MiB)."New value: +"ICC profile bytes, base64 (RGB, CMYK or Gray; ≤ 8 MiB)."
    • addedInput schema / properties / pdfx
      Added value: +{
      +  "description": "PDF/X-4 print exchange (ISO 15930-7). REQUIRES outputIntent with the printer's ICC profile (device class 'prtr'; CMYK or Gray — none is bundled); needs embedFonts:true for a conformant file (PDFX_NO_FONT_ENTRIES otherwise, strict:true refuses). Exclusive with pdfA and encrypt; metadata.trapped must be 'True' or 'False'; TrimBox or ArtBox, not both. Links and form fields are reported (PDFX_ANNOTATIONS). Check with validate_pdf standard:'pdf-x-4'. See the print_ready prompt.",
      +  "enum": [
      +    "pdfx4"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / print / properties / marks / oneOf
      Previous value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "crop": {
      -        "description": "Corner crop (trim) marks. Default true.",
      -        "type": "boolean"
      -      },
      -      "length": {
      -        "description": "Mark length in points. Default 14.",
      -        "maximum": 100,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "offset": {
      -        "description": "Gap between TrimBox and marks in points. Default 5.",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "registration": {
      -        "description": "Edge-midpoint registration targets. Default true.",
      -        "type": "boolean"
      -      },
      -      "weight": {
      -        "description": "Stroke width in points. Default 0.25.",
      -        "maximum": 5,
      -        "minimum": 0.05,
      -        "type": "number"
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "colourBars": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "size": {
      +                "description": "Patch size in points. Default 12.",
      +                "maximum": 72,
      +                "minimum": 4,
      +                "type": "number"
      +              },
      +              "tints": {
      +                "description": "Add the four 50 % tint patches. Default true.",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        ],
      +        "description": "Colour control strip in the bleed (C M Y K solids + their 50 % tints): true for defaults. Off by default; needs a bleed of about 5 mm (14.17 pt) and is skipped when the strip would not fit."
      +      },
      +      "crop": {
      +        "description": "Corner crop (trim) marks. Default true.",
      +        "type": "boolean"
      +      },
      +      "length": {
      +        "description": "Mark length in points. Default 14.",
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "offset": {
      +        "description": "Gap between TrimBox and marks in points. Default 5.",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "registration": {
      +        "description": "Edge-midpoint registration targets. Default true.",
      +        "type": "boolean"
      +      },
      +      "weight": {
      +        "description": "Stroke width in points. Default 0.25.",
      +        "maximum": 5,
      +        "minimum": 0.05,
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / strict / description
      Previous value: -"Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true."New value: +"Fail instead of producing a file the engine warns about: a PDFA_* diagnostic → PDF_A_COMPLIANCE_VIOLATION (e.g. PDFA_NO_FONT_ENTRIES without embedFonts), a PDFX_* one → PDF_X_COMPLIANCE_VIOLATION, any other → DIAGNOSTIC_ESCALATED. Pair with embedFonts=true."
    • addedInput schema / properties / typography
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Fine typography, all opt-in (omitted = unchanged bytes). kerning, fontFeatures and the 'fr' narrow space need embedFonts:true. No hyphenation dictionary is installed: use soft hyphens (U+00AD). See the typography prompt.",
      +  "properties": {
      +    "bindShortWords": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "maxLength": {
      +              "maximum": 3,
      +              "minimum": 1,
      +              "type": "integer"
      +            },
      +            "words": {
      +              "items": {
      +                "maxLength": 16,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 100,
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      ],
      +      "description": "Never end a line on a short word: up to maxLength letters (default 1), or exactly the listed words."
      +    },
      +    "fontFeatures": {
      +      "description": "OpenType features, later wins. tnum / lnum are no-ops on Noto Sans (TYPOGRAPHY_FEATURE_INEFFECTIVE).",
      +      "items": {
      +        "enum": [
      +          "tnum",
      +          "pnum",
      +          "lnum",
      +          "onum",
      +          "zero",
      +          "ordn",
      +          "sups",
      +          "subs",
      +          "smcp",
      +          "c2sc",
      +          "case"
      +        ],
      +        "type": "string"
      +      },
      +      "maxItems": 11,
      +      "type": "array",
      +      "uniqueItems": true
      +    },
      +    "hyphenationLanguage": {
      +      "description": "BCP 47 tag; no effect here (no hyphenation provider installed).",
      +      "maxLength": 35,
      +      "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$",
      +      "type": "string"
      +    },
      +    "keepHeadingsWithNext": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "minLines": {
      +              "maximum": 10,
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      ],
      +      "description": "Never strand a heading at a page foot. true = { minLines: 2 }."
      +    },
      +    "kerning": {
      +      "description": "Pair kerning (GPOS).",
      +      "type": "boolean"
      +    },
      +    "metrics": {
      +      "description": "Base-14 text: 'exact' uses the AFM widths (different wraps). Default 'approximate'.",
      +      "enum": [
      +        "approximate",
      +        "exact"
      +      ],
      +      "type": "string"
      +    },
      +    "opticalMargins": {
      +      "description": "Hang punctuation into the margin of align:'justify' text.",
      +      "type": "boolean"
      +    },
      +    "orphans": {
      +      "description": "Min lines left at a page foot (default 2; needs splitParagraphs).",
      +      "maximum": 10,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "punctuationSpacing": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "fr",
      +            "fr-CA"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "char": {
      +                "maxLength": 2,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "side": {
      +                "enum": [
      +                  "before",
      +                  "after"
      +                ],
      +                "type": "string"
      +              },
      +              "space": {
      +                "description": "U+00A0 / U+202F (narrow needs embedFonts).",
      +                "enum": [
      +                  "nbsp",
      +                  "narrow"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "char",
      +              "side",
      +              "space"
      +            ],
      +            "type": "object"
      +          },
      +          "maxItems": 32,
      +          "type": "array"
      +        }
      +      ],
      +      "description": "No-break spaces next to punctuation (existing spaces only). 'fr': narrow before ; ! ?, no-break before ':' and inside « ». 'fr-CA': ':' and « » only. Or explicit rules."
      +    },
      +    "splitParagraphs": {
      +      "description": "Paragraphs may break across pages at a line boundary (default: atomic).",
      +      "type": "boolean"
      +    },
      +    "unitBinding": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "units": {
      +              "items": {
      +                "maxLength": 16,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 100,
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      ],
      +      "description": "No-break space between a number and its unit ('150 €', '12 kg'); units replaces the built-in list."
      +    },
      +    "widows": {
      +      "description": "Min lines carried over (default 2; needs splitParagraphs).",
      +      "maximum": 10,
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / watermark / properties / color / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "maxItems": 3,
      +    "minItems": 3,
      +    "type": "array"
      +  },
      +  {
      +    "description": "DeviceCMYK operands 'C M Y K', each 0.0–1.0.",
      +    "pattern": "^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)(?: (?:0(?:\\.\\d+)?|1(?:\\.0+)?)){3}$",
      +    "type": "string"
      +  },
      +  {
      +    "description": "DeviceCMYK ink percentages [c, m, y, k], each 0–100.",
      +    "items": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "maxItems": 4,
      +    "minItems": 4,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / watermark / properties / color / description
      Previous value: -"Text RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]."New value: +"Text colour. RGB as a [r, g, b] triple in the 0.0–1.0 range; default light gray [0.75, 0.75, 0.75]."
    • removedInput schema / properties / watermark / properties / color / items
      Removed value: -{
      -  "maximum": 1,
      -  "minimum": 0,
      -  "type": "number"
      -}
    • removedInput schema / properties / watermark / properties / color / maxItems
      Removed value: -3
    • removedInput schema / properties / watermark / properties / color / minItems
      Removed value: -3
    • removedInput schema / properties / watermark / properties / color / type
      Removed value: -"array"
    • changedOutput schema / properties / diagnostics / description
      Previous value: -"PDF/A diagnostics (when includeDiagnostics=true)."New value: +"Engine diagnostics (when includeDiagnostics=true)."
  2. Changed34 schema fields changed
    • changedInput schema / properties / blocks / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "level": {
      -        "enum": [
      -          1,
      -          2,
      -          3
      -        ],
      -        "type": "integer"
      -      },
      -      "text": {
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "heading"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text",
      -      "level"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "text": {
      -        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      -        "maxLength": 50000,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "paragraph"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "items": {
      -        "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).",
      -        "items": {
      -          "oneOf": [
      -            {
      -              "maxLength": 1000,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "items": {
      -                  "items": {
      -                    "oneOf": [
      -                      {
      -                        "maxLength": 1000,
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "items": {
      -                            "items": {
      -                              "oneOf": [
      -                                {
      -                                  "maxLength": 1000,
      -                                  "minLength": 1,
      -                                  "type": "string"
      -                                },
      -                                {
      -                                  "additionalProperties": false,
      -                                  "properties": {
      -                                    "items": {
      -                                      "items": {
      -                                        "oneOf": [
      -                                          {
      -                                            "maxLength": 1000,
      -                                            "minLength": 1,
      -                                            "type": "string"
      -                                          },
      -                                          {
      -                                            "additionalProperties": false,
      -                                            "properties": {
      -                                              "items": {
      -                                                "items": {
      -                                                  "oneOf": [
      -                                                    {
      -                                                      "maxLength": 1000,
      -                                                      "minLength": 1,
      -                                                      "type": "string"
      -                                                    },
      -                                                    {
      -                                                      "additionalProperties": false,
      -                                                      "properties": {
      -                                                        "items": {
      -                                                          "items": {
      -                                                            "oneOf": [
      -                                                              {
      -                                                                "maxLength": 1000,
      -                                                                "minLength": 1,
      -                                                                "type": "string"
      -                                                              },
      -                                                              {
      -                                                                "additionalProperties": false,
      -                                                                "properties": {
      -                                                                  "text": {
      -                                                                    "maxLength": 1000,
      -                                                                    "minLength": 1,
      -                                                                    "type": "string"
      -                                                                  }
      -                                                                },
      -                                                                "required": [
      -                                                                  "text"
      -                                                                ],
      -                                                                "type": "object"
      -                                                              }
      -                                                            ]
      -                                                          },
      -                                                          "maxItems": 1000,
      -                                                          "minItems": 1,
      -                                                          "type": "array"
      -                                                        },
      -                                                        "text": {
      -                                                          "maxLength": 1000,
      -                                                          "minLength": 1,
      -                                                          "type": "string"
      -                                                        }
      -                                                      },
      -                                                      "required": [
      -                                                        "text"
      -                                                      ],
      -                                                      "type": "object"
      -                                                    }
      -                                                  ]
      -                                                },
      -                                                "maxItems": 1000,
      -                                                "minItems": 1,
      -                                                "type": "array"
      -                                              },
      -                                              "text": {
      -                                                "maxLength": 1000,
      -                                                "minLength": 1,
      -                                                "type": "string"
      -                                              }
      -                                            },
      -                                            "required": [
      -                                              "text"
      -                                            ],
      -                                            "type": "object"
      -                                          }
      -                                        ]
      -                                      },
      -                                      "maxItems": 1000,
      -                                      "minItems": 1,
      -                                      "type": "array"
      -                                    },
      -                                    "text": {
      -                                      "maxLength": 1000,
      -                                      "minLength": 1,
      -                                      "type": "string"
      -                                    }
      -                                  },
      -                                  "required": [
      -                                    "text"
      -                                  ],
      -                                  "type": "object"
      -                                }
      -                              ]
      -                            },
      -                            "maxItems": 1000,
      -                            "minItems": 1,
      -                            "type": "array"
      -                          },
      -                          "text": {
      -                            "maxLength": 1000,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "text"
      -                        ],
      -                        "type": "object"
      -                      }
      -                    ]
      -                  },
      -                  "maxItems": 1000,
      -                  "minItems": 1,
      -                  "type": "array"
      -                },
      -                "text": {
      -                  "maxLength": 1000,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "text"
      -              ],
      -              "type": "object"
      -            }
      -          ]
      -        },
      -        "maxItems": 1000,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "style": {
      -        "default": "bullet",
      -        "enum": [
      -          "bullet",
      -          "numbered"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "type": {
      -        "const": "pageBreak"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "height": {
      -        "maximum": 500,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "spacer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "height"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Native vector chart (pdfnative v1.6.0) — bar / horizontal-bar / line / pie / donut, rendered as pure PDF path operators.",
      -    "properties": {
      -      "align": {
      -        "description": "Horizontal alignment within the content width. Default 'left'.",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "altText": {
      -        "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "axis": {
      -        "additionalProperties": false,
      -        "description": "Value-axis options (bar/line only).",
      -        "properties": {
      -          "grid": {
      -            "description": "Draw horizontal gridlines.",
      -            "type": "boolean"
      -          },
      -          "ticks": {
      -            "description": "Target tick count (nice 1/2/5×10ⁿ steps).",
      -            "maximum": 20,
      -            "minimum": 2,
      -            "type": "integer"
      -          },
      -          "yMax": {
      -            "description": "Force the axis maximum (values are clamped to the plot band).",
      -            "type": "number"
      -          },
      -          "yMin": {
      -            "description": "Force the axis minimum (values are clamped to the plot band).",
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "categories": {
      -        "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.",
      -        "items": {
      -          "maxLength": 200,
      -          "type": "string"
      -        },
      -        "maxItems": 1000,
      -        "type": "array"
      -      },
      -      "chartType": {
      -        "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'line' support multiple series.",
      -        "enum": [
      -          "bar",
      -          "barH",
      -          "line",
      -          "pie",
      -          "donut"
      -        ],
      -        "type": "string"
      -      },
      -      "colors": {
      -        "description": "Palette override (per-series for bar/line, per-slice for pie/donut).",
      -        "items": {
      -          "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      -          "pattern": "^#?[0-9a-fA-F]{6}$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "height": {
      -        "description": "Plot-area height in points. Default 240.",
      -        "maximum": 2000,
      -        "minimum": 50,
      -        "type": "number"
      -      },
      -      "legend": {
      -        "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.",
      -        "enum": [
      -          "bottom",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "markers": {
      -        "description": "Draw point markers on line series. Default false.",
      -        "type": "boolean"
      -      },
      -      "series": {
      -        "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "color": {
      -              "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      -              "pattern": "^#?[0-9a-fA-F]{6}$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "Series label (shown in the legend).",
      -              "maxLength": 200,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "values": {
      -              "description": "Numeric values, one per category. Negative values are supported for bar/line.",
      -              "items": {
      -                "type": "number"
      -              },
      -              "maxItems": 1000,
      -              "minItems": 1,
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "values"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "title": {
      -        "description": "Chart title rendered above the plot.",
      -        "maxLength": 200,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "chart"
      -      },
      -      "width": {
      -        "description": "Plot width in points (clamped to content width). Default 460.",
      -        "maximum": 2000,
      -        "minimum": 50,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "chartType",
      -      "series"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "level": {
      +        "enum": [
      +          1,
      +          2,
      +          3
      +        ],
      +        "type": "integer"
      +      },
      +      "text": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "heading"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text",
      +      "level"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "text": {
      +        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      +        "maxLength": 50000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "paragraph"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "items": {
      +        "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).",
      +        "items": {
      +          "oneOf": [
      +            {
      +              "maxLength": 1000,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "additionalProperties": false,
      +              "properties": {
      +                "items": {
      +                  "items": {
      +                    "oneOf": [
      +                      {
      +                        "maxLength": 1000,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "items": {
      +                            "items": {
      +                              "oneOf": [
      +                                {
      +                                  "maxLength": 1000,
      +                                  "minLength": 1,
      +                                  "type": "string"
      +                                },
      +                                {
      +                                  "additionalProperties": false,
      +                                  "properties": {
      +                                    "items": {
      +                                      "items": {
      +                                        "oneOf": [
      +                                          {
      +                                            "maxLength": 1000,
      +                                            "minLength": 1,
      +                                            "type": "string"
      +                                          },
      +                                          {
      +                                            "additionalProperties": false,
      +                                            "properties": {
      +                                              "items": {
      +                                                "items": {
      +                                                  "oneOf": [
      +                                                    {
      +                                                      "maxLength": 1000,
      +                                                      "minLength": 1,
      +                                                      "type": "string"
      +                                                    },
      +                                                    {
      +                                                      "additionalProperties": false,
      +                                                      "properties": {
      +                                                        "items": {
      +                                                          "items": {
      +                                                            "oneOf": [
      +                                                              {
      +                                                                "maxLength": 1000,
      +                                                                "minLength": 1,
      +                                                                "type": "string"
      +                                                              },
      +                                                              {
      +                                                                "additionalProperties": false,
      +                                                                "properties": {
      +                                                                  "text": {
      +                                                                    "maxLength": 1000,
      +                                                                    "minLength": 1,
      +                                                                    "type": "string"
      +                                                                  }
      +                                                                },
      +                                                                "required": [
      +                                                                  "text"
      +                                                                ],
      +                                                                "type": "object"
      +                                                              }
      +                                                            ]
      +                                                          },
      +                                                          "maxItems": 1000,
      +                                                          "minItems": 1,
      +                                                          "type": "array"
      +                                                        },
      +                                                        "text": {
      +                                                          "maxLength": 1000,
      +                                                          "minLength": 1,
      +                                                          "type": "string"
      +                                                        }
      +                                                      },
      +                                                      "required": [
      +                                                        "text"
      +                                                      ],
      +                                                      "type": "object"
      +                                                    }
      +                                                  ]
      +                                                },
      +                                                "maxItems": 1000,
      +                                                "minItems": 1,
      +                                                "type": "array"
      +                                              },
      +                                              "text": {
      +                                                "maxLength": 1000,
      +                                                "minLength": 1,
      +                                                "type": "string"
      +                                              }
      +                                            },
      +                                            "required": [
      +                                              "text"
      +                                            ],
      +                                            "type": "object"
      +                                          }
      +                                        ]
      +                                      },
      +                                      "maxItems": 1000,
      +                                      "minItems": 1,
      +                                      "type": "array"
      +                                    },
      +                                    "text": {
      +                                      "maxLength": 1000,
      +                                      "minLength": 1,
      +                                      "type": "string"
      +                                    }
      +                                  },
      +                                  "required": [
      +                                    "text"
      +                                  ],
      +                                  "type": "object"
      +                                }
      +                              ]
      +                            },
      +                            "maxItems": 1000,
      +                            "minItems": 1,
      +                            "type": "array"
      +                          },
      +                          "text": {
      +                            "maxLength": 1000,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "text"
      +                        ],
      +                        "type": "object"
      +                      }
      +                    ]
      +                  },
      +                  "maxItems": 1000,
      +                  "minItems": 1,
      +                  "type": "array"
      +                },
      +                "text": {
      +                  "maxLength": 1000,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text"
      +              ],
      +              "type": "object"
      +            }
      +          ]
      +        },
      +        "maxItems": 1000,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "style": {
      +        "default": "bullet",
      +        "enum": [
      +          "bullet",
      +          "numbered"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "type": {
      +        "const": "pageBreak"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "height": {
      +        "maximum": 500,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "spacer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "height"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Native vector chart rendered as pure PDF path operators — bar / horizontal-bar / stacked-bar / line / area / scatter / pie / donut (pdfnative 1.7 charts v2: time and log axes, data labels, secondary axis, legends). Same body as add_chart.",
      +    "properties": {
      +      "align": {
      +        "description": "Horizontal alignment within the content width. Default 'left'.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "altText": {
      +        "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "axis": {
      +        "additionalProperties": false,
      +        "description": "Value-axis options (bar/line only).",
      +        "properties": {
      +          "grid": {
      +            "description": "Draw horizontal gridlines.",
      +            "type": "boolean"
      +          },
      +          "scale": {
      +            "description": "Value-axis scale. 'log' requires strictly positive values and is not available for stacked charts.",
      +            "enum": [
      +              "linear",
      +              "log"
      +            ],
      +            "type": "string"
      +          },
      +          "ticks": {
      +            "description": "Target tick count (nice 1/2/5×10ⁿ steps).",
      +            "maximum": 20,
      +            "minimum": 2,
      +            "type": "integer"
      +          },
      +          "yMax": {
      +            "description": "Force the axis maximum (values are clamped to the plot band).",
      +            "type": "number"
      +          },
      +          "yMin": {
      +            "description": "Force the axis minimum (values are clamped to the plot band).",
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "axis2": {
      +        "additionalProperties": false,
      +        "description": "Secondary RIGHT value axis (drawn only when a series sets yAxis:'right').",
      +        "properties": {
      +          "scale": {
      +            "enum": [
      +              "linear",
      +              "log"
      +            ],
      +            "type": "string"
      +          },
      +          "ticks": {
      +            "maximum": 20,
      +            "minimum": 2,
      +            "type": "integer"
      +          },
      +          "yMax": {
      +            "type": "number"
      +          },
      +          "yMin": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "categories": {
      +        "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.",
      +        "items": {
      +          "maxLength": 200,
      +          "type": "string"
      +        },
      +        "maxItems": 1000,
      +        "type": "array"
      +      },
      +      "chartType": {
      +        "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'stackedBar'/'stackedBarH'/'line'/'area'/'scatter' support multiple series. 'scatter' requires xValues on every series and a positional xAxis.type ('linear' or 'time').",
      +        "enum": [
      +          "bar",
      +          "barH",
      +          "stackedBar",
      +          "stackedBarH",
      +          "line",
      +          "area",
      +          "scatter",
      +          "pie",
      +          "donut"
      +        ],
      +        "type": "string"
      +      },
      +      "colors": {
      +        "description": "Palette override (per-series for bar/line, per-slice for pie/donut).",
      +        "items": {
      +          "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      +          "pattern": "^#?[0-9a-fA-F]{6}$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "dataLabels": {
      +        "description": "Per-point value labels: true for defaults, or an object to format them.",
      +        "oneOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "decimals": {
      +                "maximum": 6,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "prefix": {
      +                "maxLength": 16,
      +                "type": "string"
      +              },
      +              "suffix": {
      +                "maxLength": 16,
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "height": {
      +        "description": "Plot-area height in points. Default 240.",
      +        "maximum": 2000,
      +        "minimum": 50,
      +        "type": "number"
      +      },
      +      "labelRotation": {
      +        "description": "Rotate category labels counter-clockwise by this many degrees (disables the automatic stride).",
      +        "maximum": 90,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "labelStride": {
      +        "description": "Draw every Nth category label. Default: automatic (measured non-overlap); 1 draws every label.",
      +        "maximum": 1000,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "legend": {
      +        "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.",
      +        "enum": [
      +          "bottom",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "markers": {
      +        "description": "Draw point markers on line series. Default false.",
      +        "type": "boolean"
      +      },
      +      "series": {
      +        "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "color": {
      +              "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      +              "pattern": "^#?[0-9a-fA-F]{6}$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "Series label (shown in the legend).",
      +              "maxLength": 200,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "values": {
      +              "description": "Numeric values, one per category. Negative values are supported for bar/line.",
      +              "items": {
      +                "type": "number"
      +              },
      +              "maxItems": 1000,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "xValues": {
      +              "description": "Per-point x positions (same length as values) for scatter charts and for line/area charts with xAxis.type 'linear' or 'time'.",
      +              "items": {
      +                "description": "Positional x value: a number (linear axis) or an ISO-8601 date / epoch milliseconds (time axis).",
      +                "maxLength": 64,
      +                "type": [
      +                  "number",
      +                  "string"
      +                ]
      +              },
      +              "maxItems": 1000,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "yAxis": {
      +              "description": "Bind the series to the left (default) or the secondary right value axis (cartesian charts only; configure its range with 'axis2').",
      +              "enum": [
      +                "left",
      +                "right"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "values"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "title": {
      +        "description": "Chart title rendered above the plot.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "chart"
      +      },
      +      "width": {
      +        "description": "Plot width in points (clamped to content width). Default 460.",
      +        "maximum": 2000,
      +        "minimum": 50,
      +        "type": "number"
      +      },
      +      "xAxis": {
      +        "additionalProperties": false,
      +        "description": "Horizontal axis. 'category' (default) positions points by index; 'linear' / 'time' position them by series xValues (line/area/scatter only). Time ticks are UTC-deterministic.",
      +        "properties": {
      +          "grid": {
      +            "description": "Draw vertical gridlines.",
      +            "type": "boolean"
      +          },
      +          "max": {
      +            "description": "Axis maximum (number, or ISO-8601 / epoch ms for time axes).",
      +            "maxLength": 64,
      +            "type": [
      +              "number",
      +              "string"
      +            ]
      +          },
      +          "min": {
      +            "description": "Axis minimum (number, or ISO-8601 / epoch ms for time axes).",
      +            "maxLength": 64,
      +            "type": [
      +              "number",
      +              "string"
      +            ]
      +          },
      +          "ticks": {
      +            "maximum": 20,
      +            "minimum": 2,
      +            "type": "integer"
      +          },
      +          "type": {
      +            "enum": [
      +              "category",
      +              "linear",
      +              "time"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "chartType",
      +      "series"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline smart table — same body as add_table (every row must have exactly as many cells as headers).",
      +    "properties": {
      +      "autoFitColumns": {
      +        "description": "Auto-fit column widths to content. Output bytes then depend on text metrics (not byte-deterministic across content changes).",
      +        "type": "boolean"
      +      },
      +      "caption": {
      +        "description": "Caption rendered above the table (tagged as /Caption under PDF/A).",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "cellBorders": {
      +        "additionalProperties": false,
      +        "description": "Per-cell vector borders (pure strokes, PDF/A-safe). Choose individual sides or `all`.",
      +        "properties": {
      +          "all": {
      +            "description": "Draw all four edges (overrides the individual side flags).",
      +            "type": "boolean"
      +          },
      +          "bottom": {
      +            "type": "boolean"
      +          },
      +          "color": {
      +            "description": "Stroke colour as a PDF operator string ('0.8 0.8 0.8') or hex. Default light grey.",
      +            "type": "string"
      +          },
      +          "left": {
      +            "type": "boolean"
      +          },
      +          "right": {
      +            "type": "boolean"
      +          },
      +          "style": {
      +            "description": "Stroke style (default 'solid').",
      +            "enum": [
      +              "solid",
      +              "dashed",
      +              "dotted"
      +            ],
      +            "type": "string"
      +          },
      +          "top": {
      +            "type": "boolean"
      +          },
      +          "width": {
      +            "description": "Stroke width in points (default 0.5).",
      +            "maximum": 10,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "cellPadding": {
      +        "description": "Horizontal cell padding in points (default 3).",
      +        "maximum": 50,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "cellVAlign": {
      +        "description": "Vertical alignment of cell content.",
      +        "enum": [
      +          "top",
      +          "middle",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "clipCells": {
      +        "description": "Clip cell contents to the column bounds (PDF clip operators). Recommended for PDF/A and visual safety.",
      +        "type": "boolean"
      +      },
      +      "headers": {
      +        "description": "Column header labels. Must have the same length as each row in `rows`.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "minRowHeight": {
      +        "description": "Minimum row height in points (default 12).",
      +        "maximum": 200,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "repeatHeader": {
      +        "description": "Repeat the header row on every continuation page (default true).",
      +        "type": "boolean"
      +      },
      +      "rows": {
      +        "description": "Data rows. Each row is an array of cell strings with the same length as `headers`.",
      +        "items": {
      +          "items": {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "maxItems": 50,
      +          "minItems": 1,
      +          "type": "array"
      +        },
      +        "maxItems": 5000,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "table"
      +      },
      +      "wrap": {
      +        "description": "Cell wrap policy: 'auto' (default) wraps only overflowing cells; 'always' wraps every cell; 'never' truncates.",
      +        "enum": [
      +          "auto",
      +          "always",
      +          "never"
      +        ],
      +        "type": "string"
      +      },
      +      "zebra": {
      +        "description": "Alternate-row light tint (static fill, PDF/A-1b safe).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "headers",
      +      "rows"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline JPEG/PNG image. Without width/height the pixel size is used as points and clamped to the content width; with one dimension the aspect ratio is kept. The decoded bytes of all image blocks in one call are capped at 24 MiB (a watermark image has its own 8 MiB cap).",
      +    "properties": {
      +      "align": {
      +        "default": "left",
      +        "description": "Horizontal placement inside the content width.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "alt": {
      +        "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "Render height in points.",
      +        "maximum": 1000,
      +        "minimum": 10,
      +        "type": "number"
      +      },
      +      "imageBase64": {
      +        "description": "Base64 image bytes. JPEG (baseline; 1, 3 or 4 components — CMYK raises PDFA_DEVICE_CMYK_IMAGE under PDF/A) or PNG (8-bit greyscale/RGB, non-interlaced; alpha-channel and palette PNGs are rejected with a remedy). No data: URI.",
      +        "maxLength": 12000000,
      +        "minLength": 4,
      +        "type": "string"
      +      },
      +      "mimeType": {
      +        "description": "MIME type of the image. Must match the actual encoding of imageBase64 (magic bytes are checked).",
      +        "enum": [
      +          "image/jpeg",
      +          "image/png"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "image"
      +      },
      +      "width": {
      +        "description": "Render width in points.",
      +        "maximum": 800,
      +        "minimum": 10,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "imageBase64",
      +      "mimeType"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Clickable external link (/URI action). Only http:, https: and mailto: URLs are accepted.",
      +    "properties": {
      +      "color": {
      +        "description": "Hex colour (#RGB or #RRGGBB).",
      +        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$",
      +        "type": "string"
      +      },
      +      "fontSize": {
      +        "description": "Default 10.",
      +        "maximum": 48,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "text": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "link"
      +      },
      +      "url": {
      +        "description": "http(s):// or mailto: URL.",
      +        "maxLength": 2048,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Printed table of contents generated from the document's heading blocks (internal /GoTo links with dot leaders). Pairs with outline:'auto' for the bookmark pane.",
      +    "properties": {
      +      "fontSize": {
      +        "description": "Default 10.",
      +        "maximum": 24,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "indent": {
      +        "description": "Points of indent per heading level (default 15).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "maxLevel": {
      +        "description": "Deepest heading level listed (default 3).",
      +        "enum": [
      +          1,
      +          2,
      +          3
      +        ],
      +        "type": "integer"
      +      },
      +      "title": {
      +        "description": "Default 'Table of Contents'.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "toc"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline barcode — same body as add_barcode (pure vector, no /Alt available in the engine).",
      +    "properties": {
      +      "align": {
      +        "default": "left",
      +        "description": "Horizontal placement inside the content width.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Raw payload to encode — do NOT URL-encode. For QR/URL pass e.g. \"https://example.com\" verbatim. EAN-13 must be 12 or 13 digits (13th is auto-computed). Code 128 accepts ASCII alphanumerics.",
      +        "maxLength": 4296,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "ecLevel": {
      +        "default": "M",
      +        "description": "QR ONLY. Error correction level (L=7%, M=15%, Q=25%, H=30%). Ignored for code128/ean13/datamatrix/pdf417. Use H for printed media that may get smudged or partially covered (e.g. logo overlay).",
      +        "enum": [
      +          "L",
      +          "M",
      +          "Q",
      +          "H"
      +        ],
      +        "type": "string"
      +      },
      +      "format": {
      +        "description": "Barcode symbology to render.",
      +        "enum": [
      +          "qr",
      +          "code128",
      +          "ean13",
      +          "datamatrix",
      +          "pdf417"
      +        ],
      +        "type": "string"
      +      },
      +      "height": {
      +        "default": 200,
      +        "description": "Barcode height in PDF points (ignored for square symbologies like QR/Data Matrix).",
      +        "maximum": 500,
      +        "minimum": 30,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "barcode"
      +      },
      +      "width": {
      +        "default": 200,
      +        "description": "Barcode width in PDF points.",
      +        "maximum": 500,
      +        "minimum": 30,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "format",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Vector drawing from an SVG path `d` string or SVG markup. Supported: <path> <rect> (rx/ry) <circle> <ellipse> <line> <polyline> <polygon> and <text>/<tspan> (x, y, font-size, fill, text-anchor, dx/dy); fill / stroke / stroke-width attributes; double-quoted attributes only. NOT supported (silently ignored): transform, <g>, <use>, <image>, <defs>/<clipPath>, gradients, opacity, CSS/style, dash patterns, text word-wrap. No external reference is ever fetched (no XML parser: entities other than &amp; &lt; &gt; &quot; &apos; &nbsp; &#n; are dropped). Pure path operators — PDF/A-safe at every level.",
      +    "properties": {
      +      "align": {
      +        "default": "left",
      +        "description": "Horizontal placement inside the content width.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "alt": {
      +        "description": "Accessible description (tagged /Figure /Alt). Always provide it for non-decorative content under PDF/A or PDF/UA.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Path `d` string or SVG markup (≤ 100 000 characters).",
      +        "maxLength": 100000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "fill": {
      +        "description": "Hex colour or 'none' (default black).",
      +        "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "Render height in points (default 200).",
      +        "maximum": 1000,
      +        "minimum": 10,
      +        "type": "number"
      +      },
      +      "stroke": {
      +        "description": "Hex colour or 'none' (default none).",
      +        "pattern": "^(?:none|#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$",
      +        "type": "string"
      +      },
      +      "strokeWidth": {
      +        "description": "Stroke width in SVG user units (default 1).",
      +        "maximum": 50,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "svg"
      +      },
      +      "viewBox": {
      +        "description": "[minX, minY, width, height] — overrides the viewBox of the markup; required for a bare path string that is not 0-based.",
      +        "items": {
      +          "type": "number"
      +        },
      +        "maxItems": 4,
      +        "minItems": 4,
      +        "type": "array"
      +      },
      +      "width": {
      +        "description": "Render width in points (default 200).",
      +        "maximum": 800,
      +        "minimum": 10,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Inline AcroForm field — same body as an add_form field. Under a PDF/A claim the widget appearance font is not embedded (PDFA_UNEMBEDDED_FORM_FONT; strict:true fails the call).",
      +    "properties": {
      +      "checked": {
      +        "description": "Initial checked state for checkbox / radio fields.",
      +        "type": "boolean"
      +      },
      +      "fieldType": {
      +        "description": "Type of form control to render. Radio fields sharing a name form one radio group.",
      +        "enum": [
      +          "text",
      +          "textarea",
      +          "checkbox",
      +          "radio",
      +          "dropdown",
      +          "listbox"
      +        ],
      +        "type": "string"
      +      },
      +      "fontSize": {
      +        "description": "Font size for text rendering inside the field.",
      +        "maximum": 48,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "height": {
      +        "description": "Field height in points (default depends on the type).",
      +        "maximum": 300,
      +        "minimum": 10,
      +        "type": "number"
      +      },
      +      "label": {
      +        "description": "Human-readable label shown above the field.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "maxLength": {
      +        "description": "Maximum character length for text/textarea fields.",
      +        "maximum": 32767,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "name": {
      +        "description": "Unique field name used as the PDF annotation identifier (/T).",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "options": {
      +        "description": "Choices for dropdown, listbox or radio fields.",
      +        "items": {
      +          "maxLength": 200,
      +          "type": "string"
      +        },
      +        "maxItems": 100,
      +        "type": "array"
      +      },
      +      "placeholder": {
      +        "description": "Hint text shown while the field is empty.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "readOnly": {
      +        "description": "Prevent editing of this field.",
      +        "type": "boolean"
      +      },
      +      "required": {
      +        "description": "Mark field as required.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "formField"
      +      },
      +      "value": {
      +        "description": "Default value pre-filled in the field.",
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "Field width in points (default: full content width).",
      +        "maximum": 500,
      +        "minimum": 10,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "fieldType",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / compress
      Added value: +{
      +  "description": "FlateDecode the streams (smaller file, different bytes; PDF/A unaffected, XMP stays plain). Default false.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / creationDate
      Added value: +{
      +  "description": "ISO-8601 instant for /CreationDate (+ XMP). Pin it for byte-identical output across calls (same host TZ); omitted = wall clock, so every call differs.",
      +  "format": "date-time",
      +  "type": "string"
      +}
    • addedInput schema / properties / debug
      Added value: +{
      +  "description": "Draw margin / block / cell guide rectangles (unmarked content — not for PDF/UA output). Geometry unchanged. Default false.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / embedFonts
      Added value: +{
      +  "default": false,
      +  "description": "Embed Noto Sans Latin instead of the viewer base-14 Helvetica. REQUIRED for a valid PDF/A claim (ISO 19005 §6.2.11.4.1) and for strict=true; adds ~0.3 MiB.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / encrypt
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Encrypt at build time (AES-128 default / AES-256) and KEEP the AcroForm — unlike encrypt_pdf, which rebuilds the page tree. Exclusive with pdfA. Randomised output, never cached.",
      +  "properties": {
      +    "algorithm": {
      +      "default": "aes128",
      +      "description": "aes128 (V4/R4, widest compatibility) or aes256 (V5/R6).",
      +      "enum": [
      +        "aes128",
      +        "aes256"
      +      ],
      +      "type": "string"
      +    },
      +    "ownerPassword": {
      +      "description": "Owner password (full access).",
      +      "maxLength": 4096,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "permissions": {
      +      "additionalProperties": false,
      +      "description": "Permission flags; each defaults to allowed.",
      +      "properties": {
      +        "copy": {
      +          "type": "boolean"
      +        },
      +        "extractText": {
      +          "type": "boolean"
      +        },
      +        "modify": {
      +          "type": "boolean"
      +        },
      +        "print": {
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "userPassword": {
      +      "description": "Open password; omitted/empty = opens without a prompt.",
      +      "maxLength": 4096,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "ownerPassword"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / footerTemplate
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Running footer on every page. Replaces the default footer: footerText is then ignored and page numbers appear only via {page}/{pages}.",
      +  "properties": {
      +    "center": {
      +      "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).",
      +      "maxLength": 200,
      +      "type": "string"
      +    },
      +    "color": {
      +      "description": "Hex colour.",
      +      "pattern": "^#[0-9a-fA-F]{6}$",
      +      "type": "string"
      +    },
      +    "fontSize": {
      +      "description": "Default 7.",
      +      "maximum": 14,
      +      "minimum": 6,
      +      "type": "number"
      +    },
      +    "left": {
      +      "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).",
      +      "maxLength": 200,
      +      "type": "string"
      +    },
      +    "right": {
      +      "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).",
      +      "maxLength": 200,
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / headerTemplate
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Running header on every page (left / center / right zones); reserves 15 pt.",
      +  "properties": {
      +    "center": {
      +      "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).",
      +      "maxLength": 200,
      +      "type": "string"
      +    },
      +    "color": {
      +      "description": "Hex colour.",
      +      "pattern": "^#[0-9a-fA-F]{6}$",
      +      "type": "string"
      +    },
      +    "fontSize": {
      +      "description": "Default 7.",
      +      "maximum": 14,
      +      "minimum": 6,
      +      "type": "number"
      +    },
      +    "left": {
      +      "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).",
      +      "maxLength": 200,
      +      "type": "string"
      +    },
      +    "right": {
      +      "description": "Placeholders: {page} {pages} {title} {date} (build-day wall clock, not creationDate).",
      +      "maxLength": 200,
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / includeDiagnostics
      Added value: +{
      +  "default": false,
      +  "description": "Return the PDF/A diagnostics raised while building as `diagnostics[]` (possibly empty).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / margins
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Margins in points, all four required (0–200). Default 45 / 36 / 35 / 36.",
      +  "properties": {
      +    "bottom": {
      +      "maximum": 200,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "left": {
      +      "maximum": 200,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "right": {
      +      "maximum": 200,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "top": {
      +      "maximum": 200,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "top",
      +    "right",
      +    "bottom",
      +    "left"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / metadata
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "/Info (+ XMP under PDF/A): author, subject, keywords, /Trapped.",
      +  "properties": {
      +    "author": {
      +      "maxLength": 500,
      +      "type": "string"
      +    },
      +    "keywords": {
      +      "maxLength": 1000,
      +      "type": "string"
      +    },
      +    "subject": {
      +      "maxLength": 1000,
      +      "type": "string"
      +    },
      +    "trapped": {
      +      "description": "/Trapped print flag.",
      +      "enum": [
      +        "True",
      +        "False",
      +        "Unknown"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / normalize / description
      Previous value: -"Optional Unicode normalization applied to all rendered text before shaping. 'NFC' (recommended) composes base + combining marks into precomposed code points for better glyph coverage; 'NFD'/'NFKC'/'NFKD' are also accepted. Omit for byte-stable output (no normalization)."New value: +"Unicode normalization before shaping ('NFC' recommended for glyph coverage; NFD/NFKC/NFKD accepted). Omit = none."
    • addedInput schema / properties / outputIntent
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Custom PDF/A OutputIntent: an RGB ICC profile + condition strings replacing the built-in sRGB intent (CMYK rejected).",
      +  "properties": {
      +    "iccProfileBase64": {
      +      "description": "ICC profile bytes, base64 (RGB, ≤ 8 MiB).",
      +      "maxLength": 11000000,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "info": {
      +      "maxLength": 500,
      +      "type": "string"
      +    },
      +    "outputCondition": {
      +      "maxLength": 200,
      +      "type": "string"
      +    },
      +    "outputConditionIdentifier": {
      +      "description": "e.g. \"sRGB IEC61966-2.1\".",
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "registryName": {
      +      "description": "Default \"http://www.color.org\".",
      +      "maxLength": 200,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "iccProfileBase64",
      +    "outputConditionIdentifier"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / pageSize
      Added value: +{
      +  "description": "Portrait page preset (points): A4 595.28×841.89 (default), Letter 612×792, Legal 612×1008, A3 841.89×1190.55, Tabloid 792×1224. print.* boxes must fit it.",
      +  "enum": [
      +    "A4",
      +    "Letter",
      +    "Legal",
      +    "A3",
      +    "Tabloid"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / pdfA / description
      Previous value: -"Optional PDF/A conformance level (powered by pdfnative v1.2). Use 'pdfa1b' for archival of simple text+images, 'pdfa2b'/'pdfa2u' for richer content (2u guarantees Unicode mapping), 'pdfa3b' when embedding source attachments (Factur-X / ZUGFeRD). Mutually exclusive with PDF encryption. See docs/guides/PDFA.md."New value: +"PDF/A level: pdfa1b (simple text+images), pdfa2b/pdfa2u (richer; 2u = Unicode mapping), pdfa3b (attachments / Factur-X). Pair with embedFonts=true for a valid claim. Exclusive with encryption. See docs/guides/PDFA.md."
    • addedInput schema / properties / print
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Print production (ISO 32000-1 §14.11): page boxes, `bleed` shorthand (TrimBox = MediaBox inset), crop/registration marks outside the TrimBox, /UserUnit for large formats (PDF 1.7; not under pdfa1b). See docs/guides/PRINT.md.",
      +  "properties": {
      +    "artBox": {
      +      "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.",
      +      "items": {
      +        "type": "number"
      +      },
      +      "maxItems": 4,
      +      "minItems": 4,
      +      "type": "array"
      +    },
      +    "bleed": {
      +      "description": "Bleed in points (8.5 = 3 mm); sets TrimBox = MediaBox inset. Exclusive with trimBox.",
      +      "exclusiveMinimum": 0,
      +      "maximum": 200,
      +      "type": "number"
      +    },
      +    "bleedBox": {
      +      "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.",
      +      "items": {
      +        "type": "number"
      +      },
      +      "maxItems": 4,
      +      "minItems": 4,
      +      "type": "array"
      +    },
      +    "cropBox": {
      +      "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.",
      +      "items": {
      +        "type": "number"
      +      },
      +      "maxItems": 4,
      +      "minItems": 4,
      +      "type": "array"
      +    },
      +    "marks": {
      +      "description": "Printer's marks (needs bleed or trimBox): true for defaults, or an object.",
      +      "oneOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "crop": {
      +              "description": "Corner crop (trim) marks. Default true.",
      +              "type": "boolean"
      +            },
      +            "length": {
      +              "description": "Mark length in points. Default 14.",
      +              "maximum": 100,
      +              "minimum": 1,
      +              "type": "number"
      +            },
      +            "offset": {
      +              "description": "Gap between TrimBox and marks in points. Default 5.",
      +              "maximum": 100,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "registration": {
      +              "description": "Edge-midpoint registration targets. Default true.",
      +              "type": "boolean"
      +            },
      +            "weight": {
      +              "description": "Stroke width in points. Default 0.25.",
      +              "maximum": 5,
      +              "minimum": 0.05,
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      ]
      +    },
      +    "trimBox": {
      +      "description": "[x0, y0, x1, y1] in points, origin bottom-left, inside the MediaBox.",
      +      "items": {
      +        "type": "number"
      +      },
      +      "maxItems": 4,
      +      "minItems": 4,
      +      "type": "array"
      +    },
      +    "userUnit": {
      +      "description": "/UserUnit (multiples of 1/72 in) for pages over 14400 pt. Rejected under pdfa1b.",
      +      "maximum": 75000,
      +      "minimum": 1,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / strict
      Added value: +{
      +  "default": false,
      +  "description": "Fail with PDF_A_COMPLIANCE_VIOLATION instead of producing a non-conformant PDF/A file (e.g. PDFA_NO_FONT_ENTRIES without embedFonts). Pair with embedFonts=true.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / viewerPreferences / properties / duplex
      Added value: +{
      +  "description": "Print-dialog paper handling default (/Duplex): single-sided or double-sided flipping on the short/long edge.",
      +  "enum": [
      +    "simplex",
      +    "duplexFlipShortEdge",
      +    "duplexFlipLongEdge"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / viewerPreferences / properties / numCopies
      Added value: +{
      +  "description": "Default number of copies for the Print dialog (/NumCopies; viewers honour 2-5 per ISO 32000 Table 150).",
      +  "maximum": 1000,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / viewerPreferences / properties / pickTrayByPDFSize
      Added value: +{
      +  "description": "Ask the printer to pick the input tray from the PDF page size (/PickTrayByPDFSize).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / viewerPreferences / properties / printPageRange
      Added value: +{
      +  "description": "Default page ranges for the Print dialog (/PrintPageRange) as inclusive 1-based [first, last] pairs, e.g. [[1, 4], [7, 7]].",
      +  "items": {
      +    "items": {
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "maxItems": 2,
      +    "minItems": 2,
      +    "type": "array"
      +  },
      +  "maxItems": 100,
      +  "type": "array"
      +}
    • changedInput schema / properties / watermark / description
      Previous value: -"Optional semi-transparent text watermark rendered on every page (e.g. 'DRAFT', 'CONFIDENTIAL'). Text only in this version. opacity < 1.0 is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency)."New value: +"Optional semi-transparent watermark rendered centred on every page: `text` (e.g. 'DRAFT'), `image` (JPEG/PNG), or both combined. At least one of text / image is required. opacity < 1.0 (text or image, including the defaults) is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency)."
    • changedInput schema / properties / watermark / properties / angle / description
      Previous value: -"Rotation in degrees (counterclockwise). Default -45."New value: +"Text rotation in degrees (counterclockwise). Default -45."
    • changedInput schema / properties / watermark / properties / color / description
      Previous value: -"RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]."New value: +"Text RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75]."
    • changedInput schema / properties / watermark / properties / fontSize / description
      Previous value: -"Font size in points. Default 60, auto-fit to the page."New value: +"Text font size in points. Default 60, auto-fit to the page."
    • addedInput schema / properties / watermark / properties / image
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Image watermark (JPEG or PNG) centred on every page, optionally combined with `text`. Bytes are validated against the JPEG/PNG magic numbers; mimeType must match.",
      +  "properties": {
      +    "height": {
      +      "description": "Display height in points (default: from the image pixel size).",
      +      "exclusiveMinimum": 0,
      +      "maximum": 14400,
      +      "type": "number"
      +    },
      +    "imageBase64": {
      +      "description": "Base64-encoded JPEG or 8-bit opaque PNG bytes (max 8 MiB decoded; alpha-channel, palette and interlaced PNGs are rejected with a remedy). Plain base64, no data: URI prefix.",
      +      "maxLength": 12000000,
      +      "minLength": 4,
      +      "type": "string"
      +    },
      +    "mimeType": {
      +      "description": "'image/jpeg' or 'image/png' — must match the actual bytes.",
      +      "enum": [
      +        "image/jpeg",
      +        "image/png"
      +      ],
      +      "type": "string"
      +    },
      +    "opacity": {
      +      "description": "Image opacity 0.0–1.0. Default 0.10.",
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "width": {
      +      "description": "Display width in points (default: from the image pixel size).",
      +      "exclusiveMinimum": 0,
      +      "maximum": 14400,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "imageBase64",
      +    "mimeType"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / watermark / properties / opacity / description
      Previous value: -"Opacity 0.0–1.0. Default 0.15."New value: +"Text opacity 0.0–1.0. Default 0.15. (Image opacity is image.opacity.)"
    • changedInput schema / properties / watermark / properties / position / description
      Previous value: -"'background' (behind page content, default) or 'foreground' (above it)."New value: +"'background' (behind page content, default) or 'foreground' (above it). Applies to text and image alike."
    • changedInput schema / properties / watermark / properties / text / description
      Previous value: -"Watermark text."New value: +"Watermark text. Optional when `image` is given."
    • removedInput schema / properties / watermark / required
      Removed value: -[
      -  "text"
      -]
    • changedOutput schema / description
      Previous value: -"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."New value: +"Result of a PDF-producing tool. base64 mode: the PDF arrives as an embedded `resource` content block (not duplicated here); file mode: `filePath`."
    • addedOutput schema / properties / diagnostics
      Added value: +{
      +  "description": "PDF/A diagnostics (when includeDiagnostics=true).",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "code": {
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "severity": {
      +        "enum": [
      +          "warning"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "message",
      +      "severity"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / filePath / description
      Previous value: -"Absolute sandboxed file path (when mode='file')."New value: +"Sandboxed absolute path (file mode)."
    • addedOutput schema / properties / summary
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Tool-specific summary, when produced.",
      +  "type": "object"
      +}
  3. Changed1 schema field changedv1.6.0
    • changedInput schema / properties / blocks / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "level": {
      -        "enum": [
      -          1,
      -          2,
      -          3
      -        ],
      -        "type": "integer"
      -      },
      -      "text": {
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "heading"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text",
      -      "level"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "text": {
      -        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      -        "maxLength": 50000,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "paragraph"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "items": {
      -        "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).",
      -        "items": {
      -          "oneOf": [
      -            {
      -              "maxLength": 1000,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "additionalProperties": false,
      -              "properties": {
      -                "items": {
      -                  "items": {
      -                    "oneOf": [
      -                      {
      -                        "maxLength": 1000,
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "items": {
      -                            "items": {
      -                              "oneOf": [
      -                                {
      -                                  "maxLength": 1000,
      -                                  "minLength": 1,
      -                                  "type": "string"
      -                                },
      -                                {
      -                                  "additionalProperties": false,
      -                                  "properties": {
      -                                    "items": {
      -                                      "items": {
      -                                        "oneOf": [
      -                                          {
      -                                            "maxLength": 1000,
      -                                            "minLength": 1,
      -                                            "type": "string"
      -                                          },
      -                                          {
      -                                            "additionalProperties": false,
      -                                            "properties": {
      -                                              "items": {
      -                                                "items": {
      -                                                  "oneOf": [
      -                                                    {
      -                                                      "maxLength": 1000,
      -                                                      "minLength": 1,
      -                                                      "type": "string"
      -                                                    },
      -                                                    {
      -                                                      "additionalProperties": false,
      -                                                      "properties": {
      -                                                        "items": {
      -                                                          "items": {
      -                                                            "oneOf": [
      -                                                              {
      -                                                                "maxLength": 1000,
      -                                                                "minLength": 1,
      -                                                                "type": "string"
      -                                                              },
      -                                                              {
      -                                                                "additionalProperties": false,
      -                                                                "properties": {
      -                                                                  "text": {
      -                                                                    "maxLength": 1000,
      -                                                                    "minLength": 1,
      -                                                                    "type": "string"
      -                                                                  }
      -                                                                },
      -                                                                "required": [
      -                                                                  "text"
      -                                                                ],
      -                                                                "type": "object"
      -                                                              }
      -                                                            ]
      -                                                          },
      -                                                          "maxItems": 1000,
      -                                                          "minItems": 1,
      -                                                          "type": "array"
      -                                                        },
      -                                                        "text": {
      -                                                          "maxLength": 1000,
      -                                                          "minLength": 1,
      -                                                          "type": "string"
      -                                                        }
      -                                                      },
      -                                                      "required": [
      -                                                        "text"
      -                                                      ],
      -                                                      "type": "object"
      -                                                    }
      -                                                  ]
      -                                                },
      -                                                "maxItems": 1000,
      -                                                "minItems": 1,
      -                                                "type": "array"
      -                                              },
      -                                              "text": {
      -                                                "maxLength": 1000,
      -                                                "minLength": 1,
      -                                                "type": "string"
      -                                              }
      -                                            },
      -                                            "required": [
      -                                              "text"
      -                                            ],
      -                                            "type": "object"
      -                                          }
      -                                        ]
      -                                      },
      -                                      "maxItems": 1000,
      -                                      "minItems": 1,
      -                                      "type": "array"
      -                                    },
      -                                    "text": {
      -                                      "maxLength": 1000,
      -                                      "minLength": 1,
      -                                      "type": "string"
      -                                    }
      -                                  },
      -                                  "required": [
      -                                    "text"
      -                                  ],
      -                                  "type": "object"
      -                                }
      -                              ]
      -                            },
      -                            "maxItems": 1000,
      -                            "minItems": 1,
      -                            "type": "array"
      -                          },
      -                          "text": {
      -                            "maxLength": 1000,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "text"
      -                        ],
      -                        "type": "object"
      -                      }
      -                    ]
      -                  },
      -                  "maxItems": 1000,
      -                  "minItems": 1,
      -                  "type": "array"
      -                },
      -                "text": {
      -                  "maxLength": 1000,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "text"
      -              ],
      -              "type": "object"
      -            }
      -          ]
      -        },
      -        "maxItems": 1000,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "style": {
      -        "default": "bullet",
      -        "enum": [
      -          "bullet",
      -          "numbered"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "type": {
      -        "const": "pageBreak"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "height": {
      -        "maximum": 500,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "spacer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "height"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "level": {
      +        "enum": [
      +          1,
      +          2,
      +          3
      +        ],
      +        "type": "integer"
      +      },
      +      "text": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "heading"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text",
      +      "level"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "text": {
      +        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      +        "maxLength": 50000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "paragraph"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "items": {
      +        "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).",
      +        "items": {
      +          "oneOf": [
      +            {
      +              "maxLength": 1000,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "additionalProperties": false,
      +              "properties": {
      +                "items": {
      +                  "items": {
      +                    "oneOf": [
      +                      {
      +                        "maxLength": 1000,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "items": {
      +                            "items": {
      +                              "oneOf": [
      +                                {
      +                                  "maxLength": 1000,
      +                                  "minLength": 1,
      +                                  "type": "string"
      +                                },
      +                                {
      +                                  "additionalProperties": false,
      +                                  "properties": {
      +                                    "items": {
      +                                      "items": {
      +                                        "oneOf": [
      +                                          {
      +                                            "maxLength": 1000,
      +                                            "minLength": 1,
      +                                            "type": "string"
      +                                          },
      +                                          {
      +                                            "additionalProperties": false,
      +                                            "properties": {
      +                                              "items": {
      +                                                "items": {
      +                                                  "oneOf": [
      +                                                    {
      +                                                      "maxLength": 1000,
      +                                                      "minLength": 1,
      +                                                      "type": "string"
      +                                                    },
      +                                                    {
      +                                                      "additionalProperties": false,
      +                                                      "properties": {
      +                                                        "items": {
      +                                                          "items": {
      +                                                            "oneOf": [
      +                                                              {
      +                                                                "maxLength": 1000,
      +                                                                "minLength": 1,
      +                                                                "type": "string"
      +                                                              },
      +                                                              {
      +                                                                "additionalProperties": false,
      +                                                                "properties": {
      +                                                                  "text": {
      +                                                                    "maxLength": 1000,
      +                                                                    "minLength": 1,
      +                                                                    "type": "string"
      +                                                                  }
      +                                                                },
      +                                                                "required": [
      +                                                                  "text"
      +                                                                ],
      +                                                                "type": "object"
      +                                                              }
      +                                                            ]
      +                                                          },
      +                                                          "maxItems": 1000,
      +                                                          "minItems": 1,
      +                                                          "type": "array"
      +                                                        },
      +                                                        "text": {
      +                                                          "maxLength": 1000,
      +                                                          "minLength": 1,
      +                                                          "type": "string"
      +                                                        }
      +                                                      },
      +                                                      "required": [
      +                                                        "text"
      +                                                      ],
      +                                                      "type": "object"
      +                                                    }
      +                                                  ]
      +                                                },
      +                                                "maxItems": 1000,
      +                                                "minItems": 1,
      +                                                "type": "array"
      +                                              },
      +                                              "text": {
      +                                                "maxLength": 1000,
      +                                                "minLength": 1,
      +                                                "type": "string"
      +                                              }
      +                                            },
      +                                            "required": [
      +                                              "text"
      +                                            ],
      +                                            "type": "object"
      +                                          }
      +                                        ]
      +                                      },
      +                                      "maxItems": 1000,
      +                                      "minItems": 1,
      +                                      "type": "array"
      +                                    },
      +                                    "text": {
      +                                      "maxLength": 1000,
      +                                      "minLength": 1,
      +                                      "type": "string"
      +                                    }
      +                                  },
      +                                  "required": [
      +                                    "text"
      +                                  ],
      +                                  "type": "object"
      +                                }
      +                              ]
      +                            },
      +                            "maxItems": 1000,
      +                            "minItems": 1,
      +                            "type": "array"
      +                          },
      +                          "text": {
      +                            "maxLength": 1000,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "text"
      +                        ],
      +                        "type": "object"
      +                      }
      +                    ]
      +                  },
      +                  "maxItems": 1000,
      +                  "minItems": 1,
      +                  "type": "array"
      +                },
      +                "text": {
      +                  "maxLength": 1000,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text"
      +              ],
      +              "type": "object"
      +            }
      +          ]
      +        },
      +        "maxItems": 1000,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "style": {
      +        "default": "bullet",
      +        "enum": [
      +          "bullet",
      +          "numbered"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "type": {
      +        "const": "pageBreak"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "height": {
      +        "maximum": 500,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "spacer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "height"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Native vector chart (pdfnative v1.6.0) — bar / horizontal-bar / line / pie / donut, rendered as pure PDF path operators.",
      +    "properties": {
      +      "align": {
      +        "description": "Horizontal alignment within the content width. Default 'left'.",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "altText": {
      +        "description": "Alt text for the tagged-PDF /Figure /Alt. Auto-generated when omitted.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "axis": {
      +        "additionalProperties": false,
      +        "description": "Value-axis options (bar/line only).",
      +        "properties": {
      +          "grid": {
      +            "description": "Draw horizontal gridlines.",
      +            "type": "boolean"
      +          },
      +          "ticks": {
      +            "description": "Target tick count (nice 1/2/5×10ⁿ steps).",
      +            "maximum": 20,
      +            "minimum": 2,
      +            "type": "integer"
      +          },
      +          "yMax": {
      +            "description": "Force the axis maximum (values are clamped to the plot band).",
      +            "type": "number"
      +          },
      +          "yMin": {
      +            "description": "Force the axis minimum (values are clamped to the plot band).",
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "categories": {
      +        "description": "Category / slice labels (x-axis). Defaults to 1-based indices when omitted.",
      +        "items": {
      +          "maxLength": 200,
      +          "type": "string"
      +        },
      +        "maxItems": 1000,
      +        "type": "array"
      +      },
      +      "chartType": {
      +        "description": "Chart kind. 'pie'/'donut' use exactly one series; 'bar'/'barH'/'line' support multiple series.",
      +        "enum": [
      +          "bar",
      +          "barH",
      +          "line",
      +          "pie",
      +          "donut"
      +        ],
      +        "type": "string"
      +      },
      +      "colors": {
      +        "description": "Palette override (per-series for bar/line, per-slice for pie/donut).",
      +        "items": {
      +          "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      +          "pattern": "^#?[0-9a-fA-F]{6}$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "height": {
      +        "description": "Plot-area height in points. Default 240.",
      +        "maximum": 2000,
      +        "minimum": 50,
      +        "type": "number"
      +      },
      +      "legend": {
      +        "description": "Legend placement. Defaults to 'bottom' for multi-series/pie, else 'none'.",
      +        "enum": [
      +          "bottom",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "markers": {
      +        "description": "Draw point markers on line series. Default false.",
      +        "type": "boolean"
      +      },
      +      "series": {
      +        "description": "Data series. Pie/donut charts use exactly one series (each value becomes a slice).",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "color": {
      +              "description": "CSS-style hex colour, e.g. \"#3366cc\".",
      +              "pattern": "^#?[0-9a-fA-F]{6}$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "Series label (shown in the legend).",
      +              "maxLength": 200,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "values": {
      +              "description": "Numeric values, one per category. Negative values are supported for bar/line.",
      +              "items": {
      +                "type": "number"
      +              },
      +              "maxItems": 1000,
      +              "minItems": 1,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "values"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "title": {
      +        "description": "Chart title rendered above the plot.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "chart"
      +      },
      +      "width": {
      +        "description": "Plot width in points (clamped to content width). Default 460.",
      +        "maximum": 2000,
      +        "minimum": 50,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "chartType",
      +      "series"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed4 schema fields changedv1.2.2
    • changedInput schema / properties / blocks / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "level": {
      -        "enum": [
      -          1,
      -          2,
      -          3
      -        ],
      -        "type": "integer"
      -      },
      -      "text": {
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "heading"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text",
      -      "level"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "text": {
      -        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      -        "maxLength": 50000,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "paragraph"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "items": {
      -        "items": {
      -          "maxLength": 1000,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 1000,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "style": {
      -        "default": "bullet",
      -        "enum": [
      -          "bullet",
      -          "numbered"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "type": {
      -        "const": "pageBreak"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "height": {
      -        "maximum": 500,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "spacer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "height"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "level": {
      +        "enum": [
      +          1,
      +          2,
      +          3
      +        ],
      +        "type": "integer"
      +      },
      +      "text": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "heading"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text",
      +      "level"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "text": {
      +        "description": "Paragraph text. Embedded newlines ('\\n') are automatically split into separate paragraphs — no need to pre-split; never emit a literal newline expecting a soft line break.",
      +        "maxLength": 50000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "paragraph"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "items": {
      +        "description": "List items. A string is a leaf; an object { text, items } nests a sub-list (bullets/numbers indent; numbered sub-lists restart at 1).",
      +        "items": {
      +          "oneOf": [
      +            {
      +              "maxLength": 1000,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "additionalProperties": false,
      +              "properties": {
      +                "items": {
      +                  "items": {
      +                    "oneOf": [
      +                      {
      +                        "maxLength": 1000,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "items": {
      +                            "items": {
      +                              "oneOf": [
      +                                {
      +                                  "maxLength": 1000,
      +                                  "minLength": 1,
      +                                  "type": "string"
      +                                },
      +                                {
      +                                  "additionalProperties": false,
      +                                  "properties": {
      +                                    "items": {
      +                                      "items": {
      +                                        "oneOf": [
      +                                          {
      +                                            "maxLength": 1000,
      +                                            "minLength": 1,
      +                                            "type": "string"
      +                                          },
      +                                          {
      +                                            "additionalProperties": false,
      +                                            "properties": {
      +                                              "items": {
      +                                                "items": {
      +                                                  "oneOf": [
      +                                                    {
      +                                                      "maxLength": 1000,
      +                                                      "minLength": 1,
      +                                                      "type": "string"
      +                                                    },
      +                                                    {
      +                                                      "additionalProperties": false,
      +                                                      "properties": {
      +                                                        "items": {
      +                                                          "items": {
      +                                                            "oneOf": [
      +                                                              {
      +                                                                "maxLength": 1000,
      +                                                                "minLength": 1,
      +                                                                "type": "string"
      +                                                              },
      +                                                              {
      +                                                                "additionalProperties": false,
      +                                                                "properties": {
      +                                                                  "text": {
      +                                                                    "maxLength": 1000,
      +                                                                    "minLength": 1,
      +                                                                    "type": "string"
      +                                                                  }
      +                                                                },
      +                                                                "required": [
      +                                                                  "text"
      +                                                                ],
      +                                                                "type": "object"
      +                                                              }
      +                                                            ]
      +                                                          },
      +                                                          "maxItems": 1000,
      +                                                          "minItems": 1,
      +                                                          "type": "array"
      +                                                        },
      +                                                        "text": {
      +                                                          "maxLength": 1000,
      +                                                          "minLength": 1,
      +                                                          "type": "string"
      +                                                        }
      +                                                      },
      +                                                      "required": [
      +                                                        "text"
      +                                                      ],
      +                                                      "type": "object"
      +                                                    }
      +                                                  ]
      +                                                },
      +                                                "maxItems": 1000,
      +                                                "minItems": 1,
      +                                                "type": "array"
      +                                              },
      +                                              "text": {
      +                                                "maxLength": 1000,
      +                                                "minLength": 1,
      +                                                "type": "string"
      +                                              }
      +                                            },
      +                                            "required": [
      +                                              "text"
      +                                            ],
      +                                            "type": "object"
      +                                          }
      +                                        ]
      +                                      },
      +                                      "maxItems": 1000,
      +                                      "minItems": 1,
      +                                      "type": "array"
      +                                    },
      +                                    "text": {
      +                                      "maxLength": 1000,
      +                                      "minLength": 1,
      +                                      "type": "string"
      +                                    }
      +                                  },
      +                                  "required": [
      +                                    "text"
      +                                  ],
      +                                  "type": "object"
      +                                }
      +                              ]
      +                            },
      +                            "maxItems": 1000,
      +                            "minItems": 1,
      +                            "type": "array"
      +                          },
      +                          "text": {
      +                            "maxLength": 1000,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "text"
      +                        ],
      +                        "type": "object"
      +                      }
      +                    ]
      +                  },
      +                  "maxItems": 1000,
      +                  "minItems": 1,
      +                  "type": "array"
      +                },
      +                "text": {
      +                  "maxLength": 1000,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text"
      +              ],
      +              "type": "object"
      +            }
      +          ]
      +        },
      +        "maxItems": 1000,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "style": {
      +        "default": "bullet",
      +        "enum": [
      +          "bullet",
      +          "numbered"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "type": {
      +        "const": "pageBreak"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "height": {
      +        "maximum": 500,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "spacer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "height"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / outline
      Added value: +{
      +  "description": "Document outline (bookmarks panel). Either 'auto' (derive a flat outline from heading blocks) or an explicit nested bookmark tree.",
      +  "oneOf": [
      +    {
      +      "enum": [
      +        "auto"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "bold": {
      +            "type": "boolean"
      +          },
      +          "children": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "bold": {
      +                  "type": "boolean"
      +                },
      +                "children": {
      +                  "items": {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "bold": {
      +                        "type": "boolean"
      +                      },
      +                      "children": {
      +                        "items": {
      +                          "additionalProperties": false,
      +                          "properties": {
      +                            "bold": {
      +                              "type": "boolean"
      +                            },
      +                            "children": {
      +                              "items": {
      +                                "additionalProperties": false,
      +                                "properties": {
      +                                  "bold": {
      +                                    "type": "boolean"
      +                                  },
      +                                  "children": {
      +                                    "items": {
      +                                      "additionalProperties": false,
      +                                      "properties": {
      +                                        "bold": {
      +                                          "type": "boolean"
      +                                        },
      +                                        "color": {
      +                                          "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      +                                          "type": "string"
      +                                        },
      +                                        "italic": {
      +                                          "type": "boolean"
      +                                        },
      +                                        "open": {
      +                                          "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                                          "type": "boolean"
      +                                        },
      +                                        "pageIndex": {
      +                                          "description": "0-based destination page index.",
      +                                          "minimum": 0,
      +                                          "type": "integer"
      +                                        },
      +                                        "title": {
      +                                          "description": "Bookmark label.",
      +                                          "maxLength": 500,
      +                                          "minLength": 1,
      +                                          "type": "string"
      +                                        },
      +                                        "y": {
      +                                          "description": "Destination Y coordinate in points (default: top of page).",
      +                                          "type": "number"
      +                                        }
      +                                      },
      +                                      "required": [
      +                                        "title",
      +                                        "pageIndex"
      +                                      ],
      +                                      "type": "object"
      +                                    },
      +                                    "maxItems": 1000,
      +                                    "type": "array"
      +                                  },
      +                                  "color": {
      +                                    "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      +                                    "type": "string"
      +                                  },
      +                                  "italic": {
      +                                    "type": "boolean"
      +                                  },
      +                                  "open": {
      +                                    "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                                    "type": "boolean"
      +                                  },
      +                                  "pageIndex": {
      +                                    "description": "0-based destination page index.",
      +                                    "minimum": 0,
      +                                    "type": "integer"
      +                                  },
      +                                  "title": {
      +                                    "description": "Bookmark label.",
      +                                    "maxLength": 500,
      +                                    "minLength": 1,
      +                                    "type": "string"
      +                                  },
      +                                  "y": {
      +                                    "description": "Destination Y coordinate in points (default: top of page).",
      +                                    "type": "number"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "title",
      +                                  "pageIndex"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "maxItems": 1000,
      +                              "type": "array"
      +                            },
      +                            "color": {
      +                              "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      +                              "type": "string"
      +                            },
      +                            "italic": {
      +                              "type": "boolean"
      +                            },
      +                            "open": {
      +                              "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                              "type": "boolean"
      +                            },
      +                            "pageIndex": {
      +                              "description": "0-based destination page index.",
      +                              "minimum": 0,
      +                              "type": "integer"
      +                            },
      +                            "title": {
      +                              "description": "Bookmark label.",
      +                              "maxLength": 500,
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "y": {
      +                              "description": "Destination Y coordinate in points (default: top of page).",
      +                              "type": "number"
      +                            }
      +                          },
      +                          "required": [
      +                            "title",
      +                            "pageIndex"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 1000,
      +                        "type": "array"
      +                      },
      +                      "color": {
      +                        "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      +                        "type": "string"
      +                      },
      +                      "italic": {
      +                        "type": "boolean"
      +                      },
      +                      "open": {
      +                        "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                        "type": "boolean"
      +                      },
      +                      "pageIndex": {
      +                        "description": "0-based destination page index.",
      +                        "minimum": 0,
      +                        "type": "integer"
      +                      },
      +                      "title": {
      +                        "description": "Bookmark label.",
      +                        "maxLength": 500,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "y": {
      +                        "description": "Destination Y coordinate in points (default: top of page).",
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "title",
      +                      "pageIndex"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "maxItems": 1000,
      +                  "type": "array"
      +                },
      +                "color": {
      +                  "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      +                  "type": "string"
      +                },
      +                "italic": {
      +                  "type": "boolean"
      +                },
      +                "open": {
      +                  "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +                  "type": "boolean"
      +                },
      +                "pageIndex": {
      +                  "description": "0-based destination page index.",
      +                  "minimum": 0,
      +                  "type": "integer"
      +                },
      +                "title": {
      +                  "description": "Bookmark label.",
      +                  "maxLength": 500,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "y": {
      +                  "description": "Destination Y coordinate in points (default: top of page).",
      +                  "type": "number"
      +                }
      +              },
      +              "required": [
      +                "title",
      +                "pageIndex"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 1000,
      +            "type": "array"
      +          },
      +          "color": {
      +            "description": "Label colour as a hex string ('#1a73e8') or PDF operator string ('0 0 1').",
      +            "type": "string"
      +          },
      +          "italic": {
      +            "type": "boolean"
      +          },
      +          "open": {
      +            "description": "Initial expansion state (default true). false renders the branch collapsed.",
      +            "type": "boolean"
      +          },
      +          "pageIndex": {
      +            "description": "0-based destination page index.",
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "title": {
      +            "description": "Bookmark label.",
      +            "maxLength": 500,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "y": {
      +            "description": "Destination Y coordinate in points (default: top of page).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "title",
      +          "pageIndex"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 1000,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  ]
      +}
    • addedInput schema / properties / pageLabels
      Added value: +{
      +  "description": "Page-label ranges (the visible page numbers in the viewer, e.g. roman front-matter then decimal body). startPage values must be unique and strictly increasing.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "prefix": {
      +        "description": "Optional label prefix (e.g. 'A-').",
      +        "maxLength": 64,
      +        "type": "string"
      +      },
      +      "start": {
      +        "description": "First numeric value in the range (default 1).",
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "startPage": {
      +        "description": "0-based index of the first page in this range.",
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "style": {
      +        "description": "Numbering style. 'none' (or omitted with a prefix) yields prefix-only labels.",
      +        "enum": [
      +          "decimal",
      +          "roman",
      +          "Roman",
      +          "alpha",
      +          "Alpha",
      +          "none"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "startPage"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 1000,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / viewerPreferences
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Reader presentation hints (catalog /PageLayout, /PageMode, /ViewerPreferences). PDF/A-safe; all optional.",
      +  "properties": {
      +    "centerWindow": {
      +      "type": "boolean"
      +    },
      +    "direction": {
      +      "enum": [
      +        "l2r",
      +        "r2l"
      +      ],
      +      "type": "string"
      +    },
      +    "displayDocTitle": {
      +      "type": "boolean"
      +    },
      +    "fitWindow": {
      +      "type": "boolean"
      +    },
      +    "hideMenubar": {
      +      "type": "boolean"
      +    },
      +    "hideToolbar": {
      +      "type": "boolean"
      +    },
      +    "hideWindowUI": {
      +      "type": "boolean"
      +    },
      +    "nonFullScreenPageMode": {
      +      "enum": [
      +        "useNone",
      +        "useOutlines",
      +        "useThumbs",
      +        "useOC"
      +      ],
      +      "type": "string"
      +    },
      +    "pageLayout": {
      +      "enum": [
      +        "singlePage",
      +        "oneColumn",
      +        "twoColumnLeft",
      +        "twoColumnRight",
      +        "twoPageLeft",
      +        "twoPageRight"
      +      ],
      +      "type": "string"
      +    },
      +    "pageMode": {
      +      "enum": [
      +        "useNone",
      +        "useOutlines",
      +        "useThumbs",
      +        "fullScreen",
      +        "useOC",
      +        "useAttachments"
      +      ],
      +      "type": "string"
      +    },
      +    "printScaling": {
      +      "enum": [
      +        "none",
      +        "appDefault"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  5. Changed4 schema fields changedv1.2.0
    • addedInput schema / properties / normalize
      Added value: +{
      +  "description": "Optional Unicode normalization applied to all rendered text before shaping. 'NFC' (recommended) composes base + combining marks into precomposed code points for better glyph coverage; 'NFD'/'NFKC'/'NFKD' are also accepted. Omit for byte-stable output (no normalization).",
      +  "enum": [
      +    "NFC",
      +    "NFD",
      +    "NFKC",
      +    "NFKD"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / watermark
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional semi-transparent text watermark rendered on every page (e.g. 'DRAFT', 'CONFIDENTIAL'). Text only in this version. opacity < 1.0 is rejected under pdfA='pdfa1b' (ISO 19005-1 forbids transparency).",
      +  "properties": {
      +    "angle": {
      +      "description": "Rotation in degrees (counterclockwise). Default -45.",
      +      "maximum": 360,
      +      "minimum": -360,
      +      "type": "number"
      +    },
      +    "color": {
      +      "description": "RGB colour as a [r, g, b] triple in the 0.0–1.0 range. Default light gray [0.75, 0.75, 0.75].",
      +      "items": {
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "maxItems": 3,
      +      "minItems": 3,
      +      "type": "array"
      +    },
      +    "fontSize": {
      +      "description": "Font size in points. Default 60, auto-fit to the page.",
      +      "maximum": 300,
      +      "minimum": 6,
      +      "type": "number"
      +    },
      +    "opacity": {
      +      "description": "Opacity 0.0–1.0. Default 0.15.",
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "position": {
      +      "default": "background",
      +      "description": "'background' (behind page content, default) or 'foreground' (above it).",
      +      "enum": [
      +        "background",
      +        "foreground"
      +      ],
      +      "type": "string"
      +    },
      +    "text": {
      +      "description": "Watermark text.",
      +      "maxLength": 100,
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "text"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / description
      Added value: +"Structured result of a PDF-producing tool. In base64 mode the PDF bytes are delivered out-of-band as an embedded `resource` content block (data: URI), NOT duplicated here, to keep responses token-frugal. In file mode `filePath` is the sandboxed absolute path."
    • removedOutput schema / properties / base64
      Removed value: -{
      -  "description": "Base64-encoded PDF bytes (when mode='base64').",
      -  "type": "string"
      -}
  6. First observedv1.1.0

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true and openWorldHint=false, so the safety profile is largely covered. The description adds compliance-state consequences (what a valid PDF/A claim requires) and structural notes (block bodies mirror the dedicated tools), but says nothing about output mode behaviour (inline base64 vs sandboxed file write), the pdfA/encryption exclusivity, or the random-vs-deterministic output caveat — all material for a 27-parameter generator.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the block inventory, then the routing rule, then the option map — the three things an agent needs in priority order. Given the scope of the tool, every clause carries information; there is no filler or restated title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and the input schema is exhaustively documented, so return-value detail is unnecessary. The description covers routing and the major option families, and the block inventory matches the schema's oneOf variants; it stops short only on output delivery (outputMode/outputPath) and the pdfA/encrypt exclusivity, which matter for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the per-parameter text is already complete and the baseline is 3. The description earns above baseline by grouping the 27 parameters into functional clusters (compliance, navigation/presentation, print, metadata, determinism) and asserting cross-parameter pairings, which is orientation an agent does not get from reading 27 independent schema entries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb+resource (multi-page PDF) and enumerates exactly what can be composed from ordered blocks, naming every block kind. It explicitly positions itself against siblings: 'DEFAULT for any document; use the dedicated tools only for a standalone artefact', making it unmistakable that this is the general-purpose document builder rather than add_table/add_chart/embed_image.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing guidance: default for any document, dedicated tools only for standalone artefacts, add_attachment for embedded files, add_international_text for non-Latin scripts. It also gives conditional guidance for compliance flags ('pdfA + embedFonts:true for a valid PDF/A-1b/2b/2u/3b claim') and for navigation/presentation options, which is when-to-use at the parameter level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.