Release note · August 1, 2026
The Word link your relationship scan cannot see
A relationship scan is useful, but it is not a complete link inventory. A legacy Word package can place a URL directly on a VML shape’s href attribute. That leaves no OOXML hyperlink relationship, no HYPERLINK field, no w:hyperlink, and no DrawingML action for a review gate to find.
DocFence 0.20 adds a privacy-safe inventory for that distinct stored surface: direct legacy VML shape-link markup in supported Word stories.
The target can live on the shape itself
VML is old, but the data model is unambiguous. Microsoft’s HRef shape attribute documentation defines a URL for a shape, and the W3C’s VML note describes it as the URL to jump to when the element is clicked, with target as the frame. In a Word story, this markup can appear under legacy w:pict content rather than a modern DrawingML object.
That is a storage fact, not a rendering claim. A client can choose compatibility behavior; the shape can be inside a group or template; and a target can be malformed, inert, or inaccessible. For controlled handoffs, however, the direct stored marker is evidence worth preserving.
Count the direct marker, not an imagined click
DocFence scans a deliberately tight VML vocabulary: arc, curve, image, line, oval, polyline, rect, roundrect, shape, group, and shapetype. It records a direct unqualified href attribute—even an empty one—as stored evidence.
Public output contains only aggregate element/story counts, concrete-shape/group/shape-template counts, and whether a direct target attribute is present. URLs, frame targets, titles, alternate text, shape IDs, story paths, and fingerprints remain private. A same-count href or attribute rewrite is still visible through the private signature.
The boundary is intentionally narrow: it does not scan arbitrary VML attributes, calculate a link inherited from a group or shape template, select a Markup Compatibility branch, resolve or follow a URL, validate a target, render a shape, or execute an action.
Two review policies
For a handoff that must carry no supported direct VML shape links:
rules:
require_no_word_vml_hyperlinks: true
This produces DFP053. For an approved legacy template that intentionally keeps such markup:
rules:
no_word_vml_hyperlink_changes: true
DFP054 protects the private baseline. These rules complement relationship, field-code, direct WordprocessingML, and DrawingML gates because each watches a different stored mechanism.
Evidence and limits
The 0.20 suite has 46 tests. Its VML case covers every supported element kind across body and header stories, an empty direct href, target-attribute presence, same-count target and href changes, policy/SARIF output, and redaction. It also proves the separation: the test package’s relationship, HYPERLINK-field, w:hyperlink, and DrawingML inventories are all zero while the VML inventory is nonzero.
I looked for a public authored Word fixture before treating this as an authoring-behavior claim. A scan of the Open XML SDK’s Word assets at its pinned public commit found legacy VML shapes but no direct VML href. So the release uses a controlled, standards-shaped Word-story package for exact parser evidence and describes the result honestly as a stored-XML compatibility boundary—not proof that contemporary Word commonly creates these links.
Hosted CI passed on Python 3.11 and 3.13 for both the release commit and tag, including distribution validation. The wheel and source archive were rebuilt independently from the tagged source and matched byte-for-byte. Fresh public-release downloads passed the published SHA-256 manifest, package checks, and an isolated-wheel VML probe.
python -m pip install https://github.com/SybilGambleyyu/docfence/releases/download/v0.20.0/docfence-0.20.0-py3-none-any.whl
docfence profile candidate.docx --format markdown
docfence check approved.docx candidate.docx --policy docfence.yml --format sarif --output docfence.sarif
The public release includes the wheel, source archive, and SHA-256 manifest. The exact behavior and non-goals are in the tagged policy reference, threat model, and validation notes.