Release note · August 1, 2026
The style-hidden blind spot needs evidence, not guesswork
In Word, “hidden text” is not one simple package signal. A direct w:vanish property on a run is evidence about that run. A property on the paragraph mark is a different thing. A declaration inside a style may participate in a hierarchy of inherited and toggle properties before Word decides what to display.
That distinction matters in a CI gate. Reporting every style declaration as an effectively hidden run creates false confidence; ignoring the style part entirely leaves a real review surface opaque. DocFence 0.2.0 adds evidence for the gap without claiming to be a renderer.
Three separate signals
The release now reports three deliberately separate inventories:
- Direct hidden-text runs.
hidden_text_run_countcovers directw:vanishmarkup on ordinary runs. - Direct hidden paragraph marks.
hidden_paragraph_mark_countcoversw:vanishandw:specVanishunderw:pPr/w:rPr. - Stored style/default declarations. The new style inventory reports how many style definitions contain enabled text-run
w:vanishdeclarations, plus whether document-default run properties declare it.
Microsoft documents that hidden text is a toggle property in styles: the effective result depends on the style hierarchy, while direct formatting is absolute. It also documents w:specVanish as a paragraph-mark property that can be ignored on any other run. Those are exactly the reasons the new inventories are separate. See the Open XML guidance on hidden text and specVanish.
A useful limit is part of the feature
The style declaration count is not an effective-format calculation. DocFence does not claim which styles are applied, resolve basedOn, table or numbering styles, or calculate the toggle hierarchy. A style can therefore raise a useful review signal without becoming a fabricated “hidden run” count. Paragraph-mark branches and tracked historical formatting inside a style are also kept out of the text-style count.
This is a narrower statement, but a more dependable one: a review team can see that the stored package gained potentially relevant hidden-text declarations, then use Word or an appropriate rendering review to decide the visual outcome.
Policy stays explicit
The two new candidate-state gates are opt-in. Add them under rules: when a template or publishing boundary needs them:
require_no_hidden_text: true
require_no_hidden_paragraph_marks: true
require_no_hidden_text_style_declarations: true
They produce DFP006, DFP014, and DFP013, respectively. The first is direct runs, the second is direct paragraph-mark markup, and the third is stored style/default declarations. Reports continue to contain aggregate counts and fixed categories—not source text, style names, IDs, part paths, or fingerprints. The full boundary is in the policy reference and threat model.
Release evidence
DocFence 0.2.0 adds regression cases for direct false values, paragraph-mark specVanish, style declarations, tracked style history, malformed style parts, policy results, and report redaction. It also profiles a conventionally generated Word package with 164 standard styles as a compatibility smoke test.
The wheel and source distribution were built twice from the release commit using its SOURCE_DATE_EPOCH, producing byte-identical artifacts. The GitHub release includes both artifacts and a SHA-256 manifest.
Use the release
python -m pip install https://github.com/SybilGambleyyu/docfence/releases/download/v0.2.0/docfence-0.2.0-py3-none-any.whl
docfence diff approved.docx candidate.docx --format markdown
docfence check approved.docx candidate.docx --policy docfence.yml --format sarif --output docfence.sarif
DocFence is MIT-licensed and available on GitHub. For its first release and the broader case for document CI, read Word review artifacts need a CI boundary too.