{
  "date": "2026-10-21",
  "provenance": "Engineering fixture generated by evidence/c20-02-2026-10-21/generate.py. Hand-authored/engineering-generated SVG documents; not Inkscape output and not a capture of Inkscape dialogs. The outline handover copy contains glyph geometry flattened from the open-licensed DejaVu Sans font at authoring time; it is not an Object to Path command result.",
  "inkscape": {
    "available": false,
    "version": null
  },
  "runtime": {
    "python": "3.12.13",
    "platform": "macOS-26.6.2-arm64-arm-64bit",
    "dependencies": "standard library only (struct, math, hashlib, xml.etree)"
  },
  "font": {
    "name": "DejaVu Sans",
    "source": "https://dejavu-fonts.github.io/",
    "sha256": "7da195a74c55bef988d0d48f9508bd5d849425c1770dba5d7bfc6ce9ed848954",
    "license": "https://dejavu-fonts.github.io/License.html",
    "redistributed_binary": false,
    "units_per_em": 2048,
    "used_for": "text element font reference in the editable files; glyph advances and flattened contours in the outline handover copy",
    "kerning_applied": false,
    "family_attribute": "DejaVu Sans, Helvetica, Arial, sans-serif",
    "note": "Advance widths come from the font's hmtx table, no kerning or shaping. The editable SVGs reference the font by name with a fallback stack; a viewer without DejaVu Sans substitutes another face, so the drawn letter shapes and the exact centred offset can differ from the recorded DejaVu metrics. Only the outline handover copy carries fixed geometry."
  },
  "geometry": {
    "view_box": [
      0,
      0,
      400,
      240
    ],
    "units": "SVG user units; no physical size is asserted",
    "font_metric_note": "text_advance_width and the centred arc-length figures use DejaVu Sans metrics; text-anchor middle keeps the word centred whatever face a viewer resolves.",
    "baseline_path_d": "M 60 190 A 140 140 0 0 1 340 190",
    "baseline_shape": "upper semicircle, sweep flag 1, left to right",
    "arc_center": [
      200.0,
      190.0
    ],
    "arc_radius": 140.0,
    "start_point": [
      60.0,
      190.0
    ],
    "end_point": [
      340.0,
      190.0
    ],
    "arc_length_analytic": 439.822971502571,
    "arc_length_polyline_720": 439.82262260229294,
    "text": "CURVED ARC",
    "text_font_size": 26.0,
    "text_advance_width": 171.7548828125,
    "start_aligned_first_glyph_arc_length": 0.0,
    "centered_first_glyph_arc_length": 134.0340443450355,
    "centered_first_glyph_point": [
      119.4076888178508,
      75.52345489874519
    ],
    "centered_last_glyph_arc_length": 305.7889271575355,
    "alignment_difference_arc_length": 134.0340443450355,
    "alignment_difference_note": "Changing alignment before placement moves the same text by 134.034044 user units of arc length; the letter order and the characters do not change."
  },
  "text_placement": [
    {
      "file": "text-on-path-master.svg",
      "state": "editable text on path, start aligned",
      "observable": "text begins at the path start point (60, 190)"
    },
    {
      "file": "text-on-path-centered.svg",
      "state": "editable text on path, centered",
      "observable": "text-anchor middle with startOffset 50%; first glyph begins near arc length 134.034, so the word is centred on the arc"
    },
    {
      "file": "text-on-path-baseline-hidden.svg",
      "state": "baseline still present, fill and stroke removed",
      "observable": "path element remains and textPath still references it; layout is identical to the master, the curve is only invisible"
    },
    {
      "file": "text-on-path-baseline-deleted.svg",
      "state": "baseline removed; text modelled in its previous straight shape",
      "observable": "no path element and no textPath remain; the text no longer follows the curve. This file models the documented outcome and is not a recording of the software action."
    },
    {
      "file": "text-on-path-outline-handoff.svg",
      "state": "outline handover copy of the centred layout",
      "observable": "no text element and no font reference; only outlined glyph paths with 13 closed contours and 1233 vertices"
    }
  ],
  "hidden_versus_deleted": {
    "hidden": "Keep the path element and set fill:none and stroke:none. The textPath reference still resolves, the text keeps its on-path layout, and the baseline can be restored by adding fill or stroke again.",
    "deleted": "Removing the path element breaks the textPath reference. Per the official manual the text reverts to its previous shape, which is why the deleted fixture shows straight text and no retained layout to restore.",
    "rule": "Hide the guide path in the editable master; do not delete it unless the on-path layout is no longer needed."
  },
  "outline_handover": {
    "contours": 13,
    "vertices": 1233,
    "path_commands": [
      "L",
      "M",
      "Z"
    ],
    "bounds": {
      "min_x": 113.2480411862175,
      "min_y": 31.057545856274167,
      "max_x": 289.36214890359395,
      "max_y": 73.51586641957338
    },
    "quadratic_flattening_steps": 16,
    "max_chord_deviation_bound_user_units": 0.003634496643284667,
    "note": "Each glyph is placed at its cumulative advance along the arc and rotated to the local tangent; flattened to straight segments so the copy uses only M/L/Z. Contours are polygon approximations of the original quadratics."
  },
  "strict_subset_check": {
    "parser": "src/lib/cad/strict-cad.ts parseStrictSvg (browser DOMParser)",
    "executed": "Bundled with esbuild and run in headless Chromium by evidence/c20-02-2026-10-21/check-fixtures.cjs; raw output in evidence/c20-02-2026-10-21/fixture-strict-subset.json.",
    "findings": {
      "editable_files": "The master, centred and hidden-baseline files report PATH_COMMAND (not_checked) for the arc baseline and ELEMENT_text (not_checked) for the text element, and yield 0 entities: an editable text-on-path file is not converted by the strict subset.",
      "deleted_baseline": "Without the baseline path, only ELEMENT_text (not_checked) remains; there is still no geometry to convert.",
      "handover_copy": "The outline handover copy yields 13 LWPOLYLINE entities and a STRICT_SUBSET pass. It uses only M/L/Z path commands, has no text element and no href. This is a statement about this fixture, not a promise about arbitrary fonts, curves or files.",
      "unit_mapping": "parseStrictSvg reads the unitless 400x240 root size as px and maps it to 105.83x63.5 mm at 96 dpi. The fixture itself asserts no physical size; scale must be confirmed in the receiving tool."
    }
  },
  "limits": [
    "No Inkscape run: no version, menu screenshot or command output is claimed.",
    "No physical size, unit, machine, or downstream-software compatibility is asserted.",
    "The editable files depend on a viewer having DejaVu Sans; substitution changes letter shapes.",
    "The handover outlines are polygon approximations and do not include kerning or complex shaping."
  ],
  "files": {
    "text-on-path-master.svg": {
      "bytes": 407,
      "sha256": "8d1b37a22d5327e73c5521b34d505d235b5aaf79ba9643d484c2240674e7b735",
      "elements": {
        "path": 1,
        "text": 1,
        "textPath": 1
      },
      "text_elements": 1,
      "text_path_elements": 1,
      "path_elements": 1,
      "path_commands": [
        "A",
        "M"
      ],
      "text_path_href": "#baseline",
      "start_offset": "0",
      "text_anchor": "start",
      "referenced_baseline_fill_stroke": [
        "none",
        "#8aa0a8"
      ]
    },
    "text-on-path-centered.svg": {
      "bytes": 410,
      "sha256": "943af38cd391c55479bbd50ad21a8536ec2e26231b7e6399864045fb50ad9aa8",
      "elements": {
        "path": 1,
        "text": 1,
        "textPath": 1
      },
      "text_elements": 1,
      "text_path_elements": 1,
      "path_elements": 1,
      "path_commands": [
        "A",
        "M"
      ],
      "text_path_href": "#baseline",
      "start_offset": "50%",
      "text_anchor": "middle",
      "referenced_baseline_fill_stroke": [
        "none",
        "#8aa0a8"
      ]
    },
    "text-on-path-baseline-hidden.svg": {
      "bytes": 364,
      "sha256": "85b061a422d01f31d29c725b316ea5f6bdf5c1e22b97f2807c809857ead6ad1f",
      "elements": {
        "path": 1,
        "text": 1,
        "textPath": 1
      },
      "text_elements": 1,
      "text_path_elements": 1,
      "path_elements": 1,
      "path_commands": [
        "A",
        "M"
      ],
      "text_path_href": "#baseline",
      "start_offset": "0",
      "text_anchor": "start",
      "referenced_baseline_fill_stroke": [
        "none",
        "none"
      ]
    },
    "text-on-path-baseline-deleted.svg": {
      "bytes": 220,
      "sha256": "ca9b6d33c28b9c8ab373c638a6bcce57a2d972055a89420e3186b318c2f83569",
      "elements": {
        "text": 1
      },
      "text_elements": 1,
      "text_path_elements": 0,
      "path_elements": 0,
      "path_commands": [],
      "text_path_href": null,
      "start_offset": null,
      "text_anchor": null,
      "referenced_baseline_fill_stroke": null
    },
    "text-on-path-outline-handoff.svg": {
      "bytes": 28752,
      "sha256": "a1bec5d39b00eb55b7774bcacb8827b2b0714441f4226f11ba1e26ba7337eb61",
      "elements": {
        "path": 9
      },
      "text_elements": 0,
      "text_path_elements": 0,
      "path_elements": 9,
      "path_commands": [
        "L",
        "M",
        "Z"
      ],
      "text_path_href": null,
      "start_offset": null,
      "text_anchor": null,
      "referenced_baseline_fill_stroke": null
    }
  }
}
