Release note · August 3, 2026
A PowerPoint action can change what it launches without changing visible text
A presentation can retain identical visible text, images, and layout while a click or hover action changes what it names. A static review should be able to notice that stored boundary without launching a program, invoking a macro, following a link, or sending a confidential deck to a comparison service.
This matters more now that PowerPoint's built-in Compare and Merge workflow is being retired from the Microsoft 365 Windows app beginning with version 2502; Microsoft also notes that it is unavailable in current Mac and web versions. The gap is not just visual: a slide can carry behavior that a visual comparison does not describe. Microsoft's comparison guidance documents both the older workflow and its retirement.
The stored action is separate from the visible slide
PresentationML uses DrawingML click, hover, and mouse-over declarations such as a:hlinkClick, a:hlinkHover, and a:hlinkMouseOver. They can bind to an OOXML relationship rather than putting a destination into visible text. PowerPoint's documented reserved action vocabulary includes links to external files and presentations, program launch, and macro invocation. The useful review question is therefore not merely “what text changed?” but “what stored interaction declaration changed?”
Microsoft's OOXML interoperability note for click hyperlinks lists the external-file, external-presentation, macro, and program action forms. Its Open XML SDK hyperlink example shows the relationship-bound external-target model. Neither source implies every declaration will run in every client or policy context, and neither does SlideFence.
Evidence without a new disclosure channel
SlideFence is a local-only, non-executing CLI for supported PowerPoint OOXML packages. It profiles and diffs stored action declarations, their relationship bindings, package-wide external relationship classes, VBA-project presence, and embedded OLE/package/control evidence. Its public reports contain only counts and fixed categories.
Raw action strings, macro names, program commands, URLs, file paths, relationship IDs, shape identifiers, slide text, notes, and embedded bytes remain out of public output. Internally, the raw stored state contributes to an in-memory digest, so an assignment or target rewrite remains observable even when the safe public counts are unchanged. That is the important property for an approval baseline: a reviewer learns that the interaction inventory moved without receiving the private operating detail that moved.
What the result does not say
A stored action is not proof that a macro exists, resolves, is enabled, runs, opens a target, or produces a result. SlideFence does not open PowerPoint, render slides, follow a relationship, invoke a program, execute VBA, load an OLE object, authenticate a user, inspect an endpoint policy, or predict a Trust Center outcome. Microsoft notes that trusted Office locations can enable active content including hyperlinks, media/data links, ActiveX controls, and VBA macros; that makes a static package review valuable, not a substitute for organizational policy.
Use the release
git clone https://github.com/SybilGambleyyu/slidefence.git
cd slidefence
git checkout v0.1.0
python -m venv .venv
.venv/bin/python -m pip install -e '.[dev]'
slidefence profile approved.pptx --format markdown
slidefence diff approved.pptx candidate.pptx --format json --output report.json
slidefence init slidefence.yml
slidefence check approved.pptx candidate.pptx --policy slidefence.yml
SlideFence 0.1.0 has 12 synthetic adversarial regressions, a passing hosted Python 3.11–3.13 matrix, package checks, and fresh wheel/source-distribution installs against two public python-pptx PresentationML fixtures. The compatibility record includes exact fixture hashes and the observation boundaries. Read the 0.1.0 release, the validation record, or the threat model for reproducible details.