{
  "$schema": "../_schema.json",
  "format": "docx",
  "element": "paragraph",
  "elementAliases": [
    "p"
  ],
  "operations": {
    "add": true,
    "set": true,
    "get": true,
    "query": true,
    "remove": true
  },
  "paths": {
    "stable": [
      "/body/p[@paraId=ID]"
    ],
    "positional": [
      "/body/p[N]"
    ]
  },
  "note": "Get returns canonical keys: spaceBefore/spaceAfter/lineSpacing/align (legacy aliases spacebefore/linespacing/halign still accepted on Add/Set). effective.* keys are read-only values resolved through paragraph style → docDefaults from the first run; each carries an effective.X.src pointer to the writing layer (e.g. /styles/Heading1). Suppressed when the paragraph (or first run) sets the direct value.",
  "children": [
    {
      "element": "run",
      "pathSegment": "r",
      "cardinality": "0..n"
    }
  ],
  "extends": "_shared/paragraph",
  "properties": {
    "lineRule": {
      "type": "enum",
      "description": "line spacing rule paired with lineSpacing (Word-only: w:spacing@w:lineRule). 'auto' = multiplier (default for 1.5x/150%), 'exact' = exact fixed height (default for Npt), 'atLeast' = minimum height (Npt floor; lines may grow to fit tall content).",
      "values": [
        "auto",
        "exact",
        "atLeast"
      ],
      "aliases": [
        "linerule"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop lineSpacing=14pt --prop lineRule=atLeast"
      ],
      "readback": "auto | exact | atLeast",
      "enforcement": "report"
    },
    "align": {
      "type": "enum",
      "values": [
        "left",
        "center",
        "right",
        "justify",
        "both",
        "distribute"
      ],
      "aliases": [
        "alignment",
        "halign"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop align=center"
      ],
      "readback": "one of values",
      "enforcement": "strict"
    },
    "style": {
      "type": "string",
      "description": "paragraph styleId (e.g. Heading1, Normal, Quote). Must reference an existing style or one of the built-in style aliases. Aliases mirror the canonical readback keys exposed by Get: styleId targets the OOXML styleId; styleName resolves the display name through the styles part (lenient, falls back to verbatim if no match).",
      "aliases": [
        "styleId",
        "styleid",
        "styleName",
        "stylename"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop style=Heading1",
        "--prop styleId=Heading1",
        "--prop styleName=\"Heading 1\""
      ],
      "readback": "styleId as stored on the paragraph",
      "enforcement": "strict"
    },
    "spaceBefore": {
      "type": "length",
      "aliases": [
        "spacebefore"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop spaceBefore=12pt"
      ],
      "readback": "unit-qualified, e.g. \"12pt\"",
      "enforcement": "strict"
    },
    "spaceAfter": {
      "type": "length",
      "aliases": [
        "spaceafter"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop spaceAfter=6pt"
      ],
      "readback": "unit-qualified, e.g. \"6pt\"",
      "enforcement": "strict"
    },
    "spaceBeforeAuto": {
      "type": "boolean",
      "aliases": [
        "beforeAutospacing"
      ],
      "add": true,
      "set": true,
      "get": true,
      "description": "w:spacing @beforeAutospacing — Word's 'automatic spacing between paragraphs of the same style' toggle for the space BEFORE the paragraph. Surfaced on get only when present.",
      "examples": [
        "--prop spaceBeforeAuto=true"
      ],
      "readback": "true|false",
      "enforcement": "report"
    },
    "spaceAfterAuto": {
      "type": "boolean",
      "aliases": [
        "afterAutospacing"
      ],
      "add": true,
      "set": true,
      "get": true,
      "description": "w:spacing @afterAutospacing — automatic spacing toggle for the space AFTER the paragraph. See spaceBeforeAuto.",
      "examples": [
        "--prop spaceAfterAuto=true"
      ],
      "readback": "true|false",
      "enforcement": "report"
    },
    "listStyle": {
      "type": "enum",
      "values": [
        "bullet",
        "ordered",
        "none"
      ],
      "description": "high-level list type. 'bullet' (aliases: unordered, ul) creates a bulleted list; 'ordered' (or any other non-bullet value, e.g. 'decimal') creates a numbered list; 'none'/'remove'/'clear' strips list formatting. Preferred over raw numId. Continues the IMMEDIATELY preceding list of the same type automatically; an intervening non-list paragraph (or a list of the other type) starts a fresh list at 1. To continue numbering across such an interruption, pass an explicit 'numId' referencing the earlier list's instance; pass 'start' to force a restart.",
      "aliases": [
        "liststyle"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop listStyle=bullet --prop text=\"item\"",
        "--prop listStyle=ordered --prop text=\"step 1\""
      ],
      "readback": "'bullet' or 'ordered' (normalized from the numbering format)",
      "enforcement": "strict"
    },
    "numId": {
      "type": "int",
      "description": "numbering definition id (w:numId). Low-level entry point — prefer 'listStyle' unless you specifically need to reference an existing numbering instance. Requires the numId to already exist in /numbering (create via `add /numbering --type num` first).",
      "aliases": [
        "numid"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop numId=1"
      ],
      "readback": "numbering id as stored on the paragraph",
      "enforcement": "report"
    },
    "numLevel": {
      "type": "int",
      "description": "list indent level (w:ilvl), 0..8. Requires numId or listStyle to be effective; Get only surfaces numLevel when numId is present on the paragraph.",
      "aliases": [
        "numlevel",
        "ilvl",
        "listLevel",
        "listlevel",
        "level"
      ],
      "requires": [
        "numId"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop numLevel=1 --prop numId=1",
        "--prop ilvl=1 --prop numId=1"
      ],
      "readback": "integer level as stored on the paragraph (only when numId is set)",
      "enforcement": "report"
    },
    "start": {
      "type": "int",
      "description": "starting number for an ordered list (w:start / w:startOverride on level 0 of the numbering definition). Only meaningful together with liststyle=ordered or an existing numid. NOTE: this applies to the whole numbering instance shared by the paragraph, so setting it on one item of a multi-item list renumbers the entire list (every paragraph that shares the numId), not just that item onward. To restart numbering for a sub-range mid-list, give those paragraphs a fresh numId instead. Readback not implemented — w:start lives in the separate numbering part and cross-part traversal is fragile; query the numbering directly if you need it.",
      "add": true,
      "set": true,
      "get": false,
      "examples": [
        "--prop liststyle=ordered --prop start=5 --prop text=\"item\""
      ],
      "readback": "n/a (write-only via paragraph; query numbering part)",
      "enforcement": "report"
    },
    "bold": {
      "type": "bool",
      "description": "run-level bold. On Add, applied to the implicit run created by 'text'. On Set, applied to all runs in the paragraph and to the paragraph-mark run properties so subsequent runs inherit.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop bold=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "italic": {
      "type": "bool",
      "description": "run-level italic. Same scope as 'bold'.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop italic=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "font": {
      "type": "string",
      "description": "run-level font family (applied to Ascii/HighAnsi/EastAsia). On Add, applied to the implicit run created by 'text'. On Set, applied to all runs in the paragraph.",
      "add": true,
      "set": true,
      "get": false,
      "examples": [
        "--prop font=\"Times New Roman\" --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "size": {
      "type": "font-size",
      "description": "run-level font size. Accepts bare number (pt), '14pt', '10.5pt'.",
      "aliases": [
        "fontsize"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop size=14 --prop text=\"Hi\"",
        "--prop size=10.5pt --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "color": {
      "type": "color",
      "description": "run-level text color. Accepts #RRGGBB, RRGGBB, named colors (e.g. red), rgb(r,g,b).",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop color=red --prop text=\"Hi\"",
        "--prop color=#FF0000 --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "underline": {
      "type": "string",
      "description": "run-level underline. Accepts 'true'/'false' or an underline style (single, double, thick, dotted, dash, wavy, etc.).",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop underline=true --prop text=\"Hi\"",
        "--prop underline=double --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "underline.color": {
      "type": "color",
      "description": "underline stroke color, written to w:u/@w:color. Preserved when 'underline' style is toggled.",
      "aliases": [
        "underlineColor",
        "underlinecolor",
        "font.underline.color"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop underline=single --prop underline.color=#FF0000"
      ],
      "enforcement": "strict"
    },
    "strike": {
      "type": "bool",
      "description": "run-level single strikethrough.",
      "aliases": [
        "strikethrough"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop strike=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "highlight": {
      "type": "string",
      "description": "run-level highlight color (w:highlight values: yellow, green, cyan, magenta, blue, red, darkBlue, darkCyan, darkGreen, darkMagenta, darkRed, darkYellow, darkGray, lightGray, black, white, none).",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop highlight=yellow --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "caps": {
      "type": "bool",
      "description": "run-level all caps. On Add only (no paragraph-level Set wrapper).",
      "aliases": [
        "allCaps"
      ],
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop caps=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "smallcaps": {
      "type": "bool",
      "description": "run-level small caps. On Add only.",
      "aliases": [
        "smallCaps"
      ],
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop smallcaps=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "dstrike": {
      "type": "bool",
      "description": "run-level double strikethrough. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop dstrike=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "vanish": {
      "type": "bool",
      "description": "run-level hidden text. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop vanish=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "outline": {
      "type": "bool",
      "description": "run-level outline text effect. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop outline=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "shadow": {
      "type": "bool",
      "description": "run-level shadow text effect. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop shadow=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "emboss": {
      "type": "bool",
      "description": "run-level emboss text effect. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop emboss=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "imprint": {
      "type": "bool",
      "description": "run-level imprint (engrave) text effect. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop imprint=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "noproof": {
      "type": "bool",
      "description": "run-level no-proofing flag. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop noproof=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "superscript": {
      "type": "bool",
      "description": "run-level superscript vertical alignment. On Add only (use vertAlign for Set).",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop superscript=true --prop text=\"x^2\""
      ],
      "enforcement": "strict"
    },
    "subscript": {
      "type": "bool",
      "description": "run-level subscript vertical alignment. On Add only (use vertAlign for Set).",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop subscript=true --prop text=\"H2O\""
      ],
      "enforcement": "strict"
    },
    "vertAlign": {
      "type": "enum",
      "values": [
        "superscript",
        "subscript",
        "baseline",
        "super",
        "sub"
      ],
      "description": "run-level vertical text alignment. On Add only.",
      "aliases": [
        "vertalign"
      ],
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop vertAlign=superscript --prop text=\"x^2\""
      ],
      "enforcement": "strict"
    },
    "charSpacing": {
      "type": "length",
      "description": "run-level character spacing in points (bare number = pt, or 'Xpt'). Stored as twips. On Add only.",
      "aliases": [
        "charspacing",
        "letterspacing",
        "letterSpacing"
      ],
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop charSpacing=2 --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "rtl": {
      "type": "bool",
      "description": "run-level right-to-left text flag. On Add only.",
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop rtl=true --prop text=\"Hi\""
      ],
      "enforcement": "strict"
    },
    "direction": {
      "type": "enum",
      "values": [
        "ltr",
        "rtl"
      ],
      "description": "paragraph reading direction. 'rtl' writes <w:bidi/> on pPr, <w:rtl/> on the paragraph mark, and <w:rtl/> on every run (so Arabic / Hebrew character order reverses inside runs, not just page-side layout). 'ltr' clears all three.",
      "aliases": [
        "dir",
        "bidi"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop direction=rtl"
      ],
      "readback": "rtl | ltr (only emitted when explicitly set)",
      "enforcement": "strict"
    },
    "font.cs": {
      "type": "string",
      "description": "Complex-script font slot (rFonts/cs) — Arabic / Hebrew / Thai typefaces.",
      "aliases": [
        "font.complexscript",
        "font.complex"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop font.cs=\"Arabic Typesetting\""
      ],
      "enforcement": "report"
    },
    "font.ea": {
      "type": "string",
      "description": "East-Asian font slot (rFonts/eastAsia) — Chinese / Japanese / Korean typefaces.",
      "aliases": [
        "font.eastasia",
        "font.eastasian"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop font.ea=\"メイリオ\""
      ],
      "enforcement": "report"
    },
    "font.latin": {
      "type": "string",
      "description": "Latin font slots (rFonts/ascii + hAnsi) — ASCII / Western text.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop font.latin=Calibri"
      ],
      "enforcement": "report"
    },
    "font.asciiTheme": {
      "type": "string",
      "description": "Theme font binding for the ascii slot (rFonts/asciiTheme). Values: minorHAnsi, majorHAnsi, minorEastAsia, majorEastAsia, minorBidi, majorBidi.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop font.asciiTheme=minorHAnsi"
      ],
      "enforcement": "report"
    },
    "font.hAnsiTheme": {
      "type": "string",
      "description": "Theme font binding for the hAnsi slot (rFonts/hAnsiTheme).",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop font.hAnsiTheme=minorHAnsi"
      ],
      "enforcement": "report"
    },
    "font.eaTheme": {
      "type": "string",
      "description": "Theme font binding for the East-Asia slot (rFonts/eastAsiaTheme). Values: minorEastAsia, majorEastAsia.",
      "aliases": [
        "font.eastAsiaTheme"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop font.eaTheme=minorEastAsia"
      ],
      "enforcement": "report"
    },
    "font.csTheme": {
      "type": "string",
      "description": "Theme font binding for the complex-script slot (rFonts/cstheme). Values: minorBidi, majorBidi.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop font.csTheme=minorBidi"
      ],
      "enforcement": "report"
    },
    "bold.cs": {
      "type": "bool",
      "description": "complex-script bold for the paragraph's runs (<w:bCs/>). Required for Arabic / Hebrew bold rendering.",
      "aliases": [
        "font.bold.cs",
        "boldcs"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop bold.cs=true"
      ],
      "readback": "true | false",
      "enforcement": "strict"
    },
    "italic.cs": {
      "type": "bool",
      "description": "complex-script italic (<w:iCs/>) for the paragraph's runs.",
      "aliases": [
        "font.italic.cs",
        "italiccs"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop italic.cs=true"
      ],
      "readback": "true | false",
      "enforcement": "strict"
    },
    "size.cs": {
      "type": "font-size",
      "description": "complex-script font size (<w:szCs/>) for the paragraph's runs.",
      "aliases": [
        "font.size.cs",
        "sizecs"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop size.cs=14pt"
      ],
      "readback": "unit-qualified, e.g. \"14pt\"",
      "enforcement": "strict"
    },
    "shd": {
      "type": "string",
      "description": "shading. Format: 'fill' or 'val;fill' or 'val;fill;color'. Applied at paragraph level on Add (pPr/shd).",
      "aliases": [
        "shading"
      ],
      "add": true,
      "set": true,
      "get": false,
      "examples": [
        "--prop shd=FFFF00",
        "--prop shd=clear;FFFF00"
      ],
      "enforcement": "report"
    },
    "firstLineIndent": {
      "type": "length",
      "description": "first-line indent. Routed through SpacingConverter.",
      "aliases": [
        "firstlineindent"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop firstLineIndent=2cm"
      ],
      "enforcement": "report"
    },
    "rightIndent": {
      "type": "length",
      "description": "right indentation. Routed through SpacingConverter.",
      "aliases": [
        "rightindent",
        "indentright"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop rightIndent=1cm"
      ],
      "enforcement": "report"
    },
    "hangingIndent": {
      "type": "length",
      "description": "hanging indent (pairs with left indent). Routed through SpacingConverter.",
      "aliases": [
        "hangingindent",
        "hanging"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop hangingIndent=0.5cm"
      ],
      "readback": "unit-qualified length (e.g. \"28.35pt\")",
      "enforcement": "report"
    },
    "keepNext": {
      "type": "bool",
      "description": "keep paragraph with the next paragraph (no page break between).",
      "aliases": [
        "keepnext"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop keepNext=true"
      ],
      "enforcement": "report"
    },
    "keepLines": {
      "type": "bool",
      "description": "keep all lines of the paragraph together (no page break within).",
      "aliases": [
        "keeplines",
        "keeptogether",
        "keepTogether"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop keepLines=true"
      ],
      "enforcement": "report"
    },
    "pageBreakBefore": {
      "type": "bool",
      "description": "force a page break before this paragraph.",
      "aliases": [
        "pagebreakbefore",
        "break"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop pageBreakBefore=true",
        "--prop break=newPage"
      ],
      "enforcement": "report"
    },
    "widowControl": {
      "type": "bool",
      "description": "widow/orphan control.",
      "aliases": [
        "widowcontrol"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop widowControl=true"
      ],
      "enforcement": "report"
    },
    "wordWrap": {
      "type": "bool",
      "description": "Latin-word break behaviour in CJK paragraphs. Set false to allow ASCII text/whitespace to participate in CJK character flow — required for right-aligned CJK lines that rely on trailing underlined whitespace to align with adjacent lines.",
      "aliases": [
        "wordwrap"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop wordWrap=false"
      ],
      "enforcement": "report"
    },
    "contextualSpacing": {
      "type": "bool",
      "description": "suppress space between paragraphs of the same style. Applied on Add/Set to paragraph pPr; also valid on Style.",
      "aliases": [
        "contextualspacing"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop contextualSpacing=true"
      ],
      "enforcement": "report"
    },
    "effective.size": {
      "type": "font-size",
      "description": "inheritance-resolved font size (read-only) — derived from the first run's style chain → paragraph style → docDefaults.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "unit-qualified, e.g. \"14pt\"",
      "enforcement": "report"
    },
    "effective.size.src": {
      "type": "string",
      "description": "source pointer for effective.size.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.font.ascii": {
      "type": "string",
      "description": "inheritance-resolved Latin/ASCII font slot (read-only).",
      "add": false,
      "set": false,
      "get": true,
      "readback": "font family name",
      "enforcement": "report"
    },
    "effective.font.ascii.src": {
      "type": "string",
      "description": "source pointer for effective.font.ascii.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.font.eastAsia": {
      "type": "string",
      "description": "inheritance-resolved East-Asian font slot (read-only).",
      "add": false,
      "set": false,
      "get": true,
      "readback": "font family name",
      "enforcement": "report"
    },
    "effective.font.eastAsia.src": {
      "type": "string",
      "description": "source pointer for effective.font.eastAsia.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.font.hAnsi": {
      "type": "string",
      "description": "inheritance-resolved High-ANSI font slot (read-only).",
      "add": false,
      "set": false,
      "get": true,
      "readback": "font family name",
      "enforcement": "report"
    },
    "effective.font.hAnsi.src": {
      "type": "string",
      "description": "source pointer for effective.font.hAnsi.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.font.cs": {
      "type": "string",
      "description": "inheritance-resolved complex-script font slot (read-only).",
      "add": false,
      "set": false,
      "get": true,
      "readback": "font family name",
      "enforcement": "report"
    },
    "effective.font.cs.src": {
      "type": "string",
      "description": "source pointer for effective.font.cs.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.bold": {
      "type": "bool",
      "description": "inheritance-resolved bold (read-only).",
      "add": false,
      "set": false,
      "get": true,
      "readback": "true | false",
      "enforcement": "report"
    },
    "effective.bold.src": {
      "type": "string",
      "description": "source pointer for effective.bold.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.italic": {
      "type": "bool",
      "description": "inheritance-resolved italic (read-only).",
      "add": false,
      "set": false,
      "get": true,
      "readback": "true | false",
      "enforcement": "report"
    },
    "effective.italic.src": {
      "type": "string",
      "description": "source pointer for effective.italic.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.color": {
      "type": "color",
      "description": "inheritance-resolved font color (read-only). #RRGGBB or scheme color name.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "#RRGGBB uppercase or scheme color",
      "enforcement": "report"
    },
    "effective.color.src": {
      "type": "string",
      "description": "source pointer for effective.color.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.underline": {
      "type": "string",
      "description": "inheritance-resolved underline style (read-only).",
      "add": false,
      "set": false,
      "get": true,
      "readback": "underline style name",
      "enforcement": "report"
    },
    "effective.underline.src": {
      "type": "string",
      "description": "source pointer for effective.underline.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "effective.rtl": {
      "type": "bool",
      "description": "inheritance-resolved right-to-left flag (read-only). Emitted even when 'rtl' is set directly so callers can compare direct vs cascade-resolved state.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "true | false",
      "enforcement": "report"
    },
    "effective.rtl.src": {
      "type": "string",
      "description": "source pointer for effective.rtl.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "style/docDefaults path",
      "enforcement": "report"
    },
    "numFmt": {
      "type": "string",
      "description": "raw numbering format (e.g. bullet, decimal, lowerLetter). Emitted only when present.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "numbering format token",
      "enforcement": "report"
    },
    "fill": {
      "type": "color",
      "description": "paragraph background shading (w:shd @fill). A solid background reads back as this canonical key (matching table cells and runs). Accepts a solid color — hex ('FF0000'), '#'-prefixed hex ('#FF0000'), named color ('red'), or rgb(...) notation. For a true pattern shading (pct*/stripe/cross) or a foreground pattern color, pass the legacy `shd`/`shading` triplet form 'PATTERN;FILL[;COLOR]' instead; those read back via the shading.* detail keys.",
      "aliases": ["shd", "shading"],
      "add": true,
      "set": true,
      "get": true,
      "examples": ["--prop fill=FFFF00", "--prop fill=#FF0000", "--prop fill=red", "--prop shd=\"pct25;FF0000;0000FF\""],
      "readback": "#RRGGBB uppercase",
      "enforcement": "report"
    },
    "shading.val": {
      "type": "string",
      "description": "shading pattern value (decomposed from `shd`). Emitted on get only for a true pattern shading (pct*/stripe/cross); a solid background reads back as the canonical `fill` key. Add/Set use `fill`/`shd`/`shading`.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "shading pattern token (pattern shading only)",
      "enforcement": "report"
    },
    "shading.fill": {
      "type": "string",
      "description": "shading fill color hex (decomposed from `shd`). Emitted on get only for a true pattern shading; a solid background reads back as the canonical `fill` key.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "#RRGGBB (pattern shading only)",
      "enforcement": "report"
    },
    "shading.color": {
      "type": "string",
      "description": "shading foreground (pattern) color hex. Pattern shading only.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "#RRGGBB (pattern shading only)",
      "enforcement": "report"
    },
    "paraId": {
      "type": "string",
      "description": "paragraph stable id (source of @paraId in stable path). Emitted only when present.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "paraId hex string",
      "enforcement": "report"
    },
    "outlineLvl": {
      "type": "number",
      "description": "outline level (0-9). Used by Word's TOC and document map.",
      "add": true,
      "set": true,
      "get": true,
      "readback": "integer",
      "enforcement": "report"
    },
    "rStyle": {
      "type": "string",
      "description": "Paragraph mark run style id (e.g. FootnoteReference, IntenseEmphasis). Inherited by runs without their own rStyle.",
      "add": true,
      "set": true,
      "get": true,
      "readback": "style id",
      "enforcement": "report"
    },
    "tabs": {
      "type": "array",
      "description": "tab stops array. Set accepts a comma-separated list of positions (twips, e.g. 720,1440); Get emits the stored tab stops when present.",
      "aliases": [
        "tabstops"
      ],
      "add": false,
      "set": true,
      "get": true,
      "examples": [
        "--prop tabs=720,1440"
      ],
      "readback": "array of tab stop descriptors",
      "enforcement": "report"
    },
    "pbdr.top": {
      "type": "string",
      "description": "paragraph border edge descriptor. Emitted only when present.",
      "add": false,
      "set": false,
      "get": false,
      "readback": "n/a (handler does not surface paragraph borders today)",
      "enforcement": "report"
    },
    "pbdr.bottom": {
      "type": "string",
      "description": "paragraph border edge descriptor. Emitted only when present.",
      "add": false,
      "set": false,
      "get": false,
      "readback": "n/a (handler does not surface paragraph borders today)",
      "enforcement": "report"
    },
    "pbdr.left": {
      "type": "string",
      "description": "paragraph border edge descriptor. Emitted only when present.",
      "add": false,
      "set": false,
      "get": false,
      "readback": "n/a (handler does not surface paragraph borders today)",
      "enforcement": "report"
    },
    "pbdr.right": {
      "type": "string",
      "description": "paragraph border edge descriptor. Emitted only when present.",
      "add": false,
      "set": false,
      "get": false,
      "readback": "n/a (handler does not surface paragraph borders today)",
      "enforcement": "report"
    },
    "pbdr.between": {
      "type": "string",
      "description": "paragraph border edge descriptor. Emitted only when present.",
      "add": false,
      "set": false,
      "get": false,
      "readback": "n/a (handler does not surface paragraph borders today)",
      "enforcement": "report"
    },
    "pbdr.bar": {
      "type": "string",
      "description": "paragraph border edge descriptor. Emitted only when present.",
      "add": false,
      "set": false,
      "get": false,
      "readback": "n/a (handler does not surface paragraph borders today)",
      "enforcement": "report"
    },
    "firstLineChars": {
      "type": "number",
      "add": false,
      "set": true,
      "get": true,
      "description": "first-line indent in 1/100 character units (CT_Ind @firstLineChars). Word's chars-relative variant of firstLineIndent.",
      "readback": "integer 1/100-char units",
      "enforcement": "report"
    },
    "hangingChars": {
      "type": "number",
      "add": false,
      "set": true,
      "get": true,
      "description": "hanging indent in 1/100 character units (CT_Ind @hangingChars). Word's chars-relative variant of hangingIndent.",
      "readback": "integer 1/100-char units",
      "enforcement": "report"
    },
    "markRPr.bold": {
      "type": "bool",
      "description": "paragraph-mark run property — bold flag on the ¶ glyph (w:pPr/w:rPr/w:b). Distinct from per-run bold; affects how the mark itself renders and is inherited by appended runs without their own bold setting.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "true|false",
      "enforcement": "report"
    },
    "markRPr.italic": {
      "type": "bool",
      "description": "paragraph-mark run italic (w:pPr/w:rPr/w:i).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "true|false",
      "enforcement": "report"
    },
    "markRPr.strike": {
      "type": "bool",
      "description": "paragraph-mark run strike (w:pPr/w:rPr/w:strike).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "true|false",
      "enforcement": "report"
    },
    "markRPr.rtl": {
      "type": "bool",
      "description": "paragraph-mark run right-to-left flag (w:pPr/w:rPr/w:rtl).",
      "add": true,
      "set": true,
      "get": true,
      "readback": "true|false",
      "enforcement": "report"
    },
    "markRPr.rStyle": {
      "type": "string",
      "description": "paragraph-mark run character style (w:pPr/w:rPr/w:rStyle). Emitted on Get when the style binds the mark only; bare rStyle covers the mark+implicit-run shape.",
      "add": true,
      "set": true,
      "get": true,
      "enforcement": "report"
    },
    "markRPr.underline": {
      "type": "string",
      "description": "paragraph-mark run underline style (w:pPr/w:rPr/w:u @val).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "underline style enum (single, double, dotted, …)",
      "enforcement": "report"
    },
    "markRPr.size": {
      "type": "length",
      "description": "paragraph-mark run font size (w:pPr/w:rPr/w:sz, half-points internally).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "unit-qualified pt (e.g. 11pt)",
      "enforcement": "report"
    },
    "markRPr.color": {
      "type": "color",
      "description": "paragraph-mark run color (w:pPr/w:rPr/w:color). Returns scheme color name for theme refs, or #-prefixed hex.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "scheme color name or #RRGGBB",
      "enforcement": "report"
    },
    "markRPr.highlight": {
      "type": "string",
      "description": "paragraph-mark run highlight color (w:pPr/w:rPr/w:highlight @val).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "highlight color enum",
      "enforcement": "report"
    },
    "markRPr.font.latin": {
      "type": "string",
      "description": "paragraph-mark run Ascii font (w:pPr/w:rPr/w:rFonts @ascii).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "font name",
      "enforcement": "report"
    },
    "markRPr.font.ea": {
      "type": "string",
      "description": "paragraph-mark run EastAsia font (w:pPr/w:rPr/w:rFonts @eastAsia).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "font name",
      "enforcement": "report"
    },
    "markRPr.font.cs": {
      "type": "string",
      "description": "paragraph-mark run ComplexScript font (w:pPr/w:rPr/w:rFonts @cs).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "font name",
      "enforcement": "report"
    },
    "markRPr.font.hint": {
      "type": "string",
      "description": "paragraph-mark run font slot hint (w:pPr/w:rPr/w:rFonts @hint) — eastAsia / cs / default; selects the font slot for ambiguous characters on the paragraph mark.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "eastAsia / cs / default",
      "enforcement": "report"
    },
    "markRPr.font.asciiTheme": {
      "type": "string",
      "description": "paragraph-mark run theme font binding (w:pPr/w:rPr/w:rFonts/@w:asciiTheme), e.g. minorHAnsi.",
      "add": true,
      "set": true,
      "get": true,
      "enforcement": "report"
    },
    "markRPr.font.hAnsiTheme": {
      "type": "string",
      "description": "paragraph-mark run theme font binding (w:pPr/w:rPr/w:rFonts/@w:hAnsiTheme), e.g. minorHAnsi.",
      "add": true,
      "set": true,
      "get": true,
      "enforcement": "report"
    },
    "markRPr.font.eaTheme": {
      "type": "string",
      "description": "paragraph-mark run theme font binding (w:pPr/w:rPr/w:rFonts/@w:eastAsiaTheme), e.g. minorHAnsi.",
      "add": true,
      "set": true,
      "get": true,
      "enforcement": "report"
    },
    "markRPr.font.csTheme": {
      "type": "string",
      "description": "paragraph-mark run theme font binding (w:pPr/w:rPr/w:rFonts/@w:csTheme), e.g. minorHAnsi.",
      "add": true,
      "set": true,
      "get": true,
      "enforcement": "report"
    },
    "markRPr.charSpacing": {
      "type": "length",
      "description": "paragraph-mark run character spacing (w:pPr/w:rPr/w:spacing @val, twips internally).",
      "add": false,
      "set": true,
      "get": true,
      "readback": "unit-qualified pt (e.g. 1pt)",
      "enforcement": "report"
    },
    "markRPr.size.cs": {
      "type": "length",
      "description": "paragraph-mark run complex-script font size (w:pPr/w:rPr/w:szCs, half-points internally). The CJK/RTL counterpart of markRPr.size; emitted separately so the ¶ glyph's complex-script metrics survive dump→batch.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "unit-qualified pt (e.g. 11pt)",
      "enforcement": "report"
    },
    "markRPr.bold.cs": {
      "type": "bool",
      "description": "paragraph-mark run complex-script bold (w:pPr/w:rPr/w:bCs). The CJK/RTL counterpart of markRPr.bold.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "true|false",
      "enforcement": "report"
    },
    "markRPr.italic.cs": {
      "type": "bool",
      "description": "paragraph-mark run complex-script italic (w:pPr/w:rPr/w:iCs). The CJK/RTL counterpart of markRPr.italic.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "true|false",
      "enforcement": "report"
    },
    "markRPr.kern": {
      "type": "integer",
      "description": "paragraph-mark run kerning threshold (w:pPr/w:rPr/w:kern @val, half-points). Below this font size Word disables kerning on the ¶ glyph.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "integer half-points",
      "enforcement": "report"
    },
    "markRPr.font.ascii": {
      "type": "string",
      "description": "paragraph-mark run Ascii font (w:pPr/w:rPr/w:rFonts @ascii). Emitted alongside markRPr.font.hAnsi only when the two slots diverge; the symmetric case collapses to markRPr.font.latin.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "font name",
      "enforcement": "report"
    },
    "markRPr.font.hAnsi": {
      "type": "string",
      "description": "paragraph-mark run HighAnsi font (w:pPr/w:rPr/w:rFonts @hAnsi). Emitted alongside markRPr.font.ascii only when the two slots diverge; the symmetric case collapses to markRPr.font.latin.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "font name",
      "enforcement": "report"
    },
    "markRPr.lang.latin": {
      "type": "string",
      "description": "paragraph-mark run Latin language tag (w:pPr/w:rPr/w:lang @val, BCP-47 e.g. en-US). Tags the ¶ glyph's language for proofing; mirrors run-level lang.latin.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "BCP-47 tag",
      "enforcement": "report"
    },
    "markRPr.lang.ea": {
      "type": "string",
      "description": "paragraph-mark run East-Asian language tag (w:pPr/w:rPr/w:lang @eastAsia, BCP-47 e.g. ja-JP). Mirrors run-level lang.ea.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "BCP-47 tag",
      "enforcement": "report"
    },
    "markRPr.lang.cs": {
      "type": "string",
      "description": "paragraph-mark run complex-script language tag (w:pPr/w:rPr/w:lang @bidi, BCP-47 e.g. ar-SA). Mirrors run-level lang.cs.",
      "add": false,
      "set": true,
      "get": true,
      "readback": "BCP-47 tag",
      "enforcement": "report"
    },
    "kern": {
      "type": "integer",
      "description": "kerning threshold on an empty paragraph's ¶-mark run (w:pPr/w:rPr/w:kern @val, half-points). Below this font size Word disables kerning. Get-side readback only — the value is applied via the generic run-formatting path (ApplyRunFormatting), not a dedicated paragraph Set case; text-bearing paragraphs surface the ¶-mark kern under markRPr.kern instead.",
      "add": false,
      "set": false,
      "get": true,
      "readback": "integer half-points",
      "enforcement": "report"
    }
  }
}