Release note · August 3, 2026

A linked picture target can change without changing Word text

By SybilGambleyyu · Document Change Assurance Benchmark 0.3.0

A Word document can keep every stored text node, every DrawingML picture marker, and every relationship ID fixed while changing the target of a linked picture. That is exactly the kind of change a text diff will miss—and exactly the kind of stored evidence a static reviewer can expose without downloading an image.

Document Change Assurance Benchmark (DCAB) 0.3.0 adds its fourteenth deterministic paired package: external.drawing_linked_picture_target_retargeted. Both sides contain the same a:blip r:link marker and the same package members. Only word/_rels/document.xml.rels changes, retargeting a standard external image relationship.

Recognize the marker; do not retrieve the image

Microsoft’s Open XML documentation for Blip.Link describes r:link as a linked-picture reference for an image that does not reside in the file. DCAB models that relationship-backed marker, but never resolves its target, opens a document client, renders an image, or makes a claim that an Office client will load it.

The package target is a synthetic example.invalid value. The target-free public truth declares only drawing_linked_picture_target_changed, with an external binding and image relationship category. It deliberately excludes the target, relationship ID, relationship path, and the marker’s static presentation metadata.

A valid package boundary, not a screenshot trick

The fixture contains a compact DrawingML inline picture shape with an a:blip r:link attribute and no image payload member. The generator fixes that markup and all Word text, while the candidate changes only the relationship target. The independent verifier checks the marker, absence of r:embed, standard image relationship type, external target mode, deterministic bytes, stable member set, and exact changed-member boundary.

The standard python-docx reader opens all 26 .docx fixtures, including this pair, and its lower-level OPC reader opens all 28 packages. The optional local DocFence 0.27.0 adapter maps public aggregate evidence—an external-relationship change and a DrawingML linked-picture inventory change—to a complete DCAB observation without consuming a target or private signature.

The release passed 12 tests locally, including that adapter path, then passed hosted CI on Python 3.11, 3.12, and 3.13 plus a clean DocFence installation. Fresh wheel and source-distribution installs each validate the bundled corpus.

Use the release

python -m pip install https://github.com/SybilGambleyyu/document-change-benchmark/releases/download/v0.3.0/document_change_benchmark-0.3.0-py3-none-any.whl
dcab validate
dcab docfence-observations --executable docfence --output observations.json
dcab score --observations observations.json --strict

DCAB 0.3.0 retains fixture schema version 1 because the public truth and observation envelopes are unchanged; it extends the corpus from 13 to 14 cases. It does not claim image safety, a network request, a renderer outcome, client behavior, or a universal policy. It gives review tooling a reproducible static boundary to cover.

The MIT-licensed source, generated fixtures, structural verifier, release artifacts, and research notes are available on GitHub. The fixture corpus is also mirrored as a public Hugging Face dataset.