Release note · August 1, 2026
Document metadata is a review boundary, not a generic package change
A Word review can account carefully for visible paragraphs, comments, tracked changes, and embedded files while treating document properties as a generic package mutation. That is the wrong boundary for a controlled handoff. Core, extended, and custom properties can carry authoring and workflow metadata; Microsoft’s Document Inspector puts document properties and personal information in its own review category.
DocFence 0.4.0 turns that category into bounded, local evidence. It makes changes to Word’s core, extended, and custom property parts review-visible without printing property names, values, paths, relationship targets, or fingerprints into JSON, Markdown, or SARIF.
Three property families, intentionally separated
Word conventionally stores these property families in docProps/core.xml, docProps/app.xml, and docProps/custom.xml. Core properties can include fields such as creator and title; extended properties may describe application, template, or document statistics; custom properties are user-defined definitions. The Office property interface also distinguishes built-in and custom properties, including information Office maintains automatically. See Microsoft’s property guide for the user-facing model.
DocFence recognizes the corresponding package relationships and conventional stored paths, then validates the property XML root before counting. It supports Transitional OOXML and the canonical Strict relationship and root variants. Its public profile reports only aggregate counts: property-part counts, populated core and extended property counts, and custom-property definition counts. A custom-property definition remains counted even when its value is empty.
That distinction is useful. A change to a core timestamp, an application/version field, a template reference, or a custom definition is no longer lost among opaque parts. It is still not treated as proof that a document is unsafe, personal, confidential, intentional, or malicious. The tool reports stored-state evidence; a reviewer owns the decision.
Choose an empty-candidate gate or a controlled-baseline gate
A clean-handoff policy can prohibit custom property definitions in a candidate:
rules:
require_no_custom_document_properties: true
This emits DFP020 and reports only the custom part and definition counts. Some teams instead need to retain known built-in or custom properties in an approved template but reject drift afterwards. For that, use a comparison gate:
rules:
no_document_property_changes: true
This emits DFP019 when the private property inventory changes and shows before/after aggregate counts. It is deliberately sensitive: ordinary resaves can update automatically maintained metadata. The right workflow is a controlled baseline, not an assumption that every metadata change is suspicious.
Evidence without a metadata spill
The property inventory’s comparison signature stays private. The release tests conventional relationship-backed packages, canonical physical property paths without relationships, Strict OOXML variants, malformed roots, value-only changes, custom definitions, policy findings, relationship-ID renumbering, and output redaction. Unique markers placed in names and values are checked not to appear in public output.
The wheel and source distribution were independently built twice from the release commit with its SOURCE_DATE_EPOCH; each artifact pair was byte-identical. The GitHub release includes the wheel, source archive, and SHA-256 manifest. I then downloaded those public assets, verified their checksums, installed the wheel into a new environment, and ran a self-diff smoke test.
Use the release
python -m pip install https://github.com/SybilGambleyyu/docfence/releases/download/v0.4.0/docfence-0.4.0-py3-none-any.whl
docfence profile document.docx --format markdown
docfence check approved.docx candidate.docx --policy docfence.yml --format sarif --output docfence.sarif
The complete contract is in the policy reference and threat model. DocFence is MIT-licensed and available on GitHub. For the related imported-content boundary, read Imported document content is a review boundary, not a blank spot.