Environment
- macOS 26.5.2 (Tahoe, Darwin 25), SIP enabled (stock configuration)
@guidepup/setup 0.24.6, @guidepup/guidepup 0.33.2
- Node 24.19.0
Summary
On macOS 26, VoiceOver gates its AppleScript control on the existence of the root-owned marker file /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled. The legacy preference (defaults write com.apple.VoiceOver4/default SCREnableAppleScript -bool true) is no longer honored — VoiceOver 26.5 keeps its live preferences in ~/Library/Group Containers/group.com.apple.VoiceOver/Library/Preferences/com.apple.VoiceOver4/default.plist (with a per-key timestamp journal), and even setting SCREnableAppleScript to true there has no effect while the marker file is absent.
setup knows about the marker file, but lib/commands/setup/macOS/setup.js only writes it when SIP is disabled:
if (!(0, isSipEnabled_1.isSipEnabled)() && !(await (0, enabledDbFile_1.enabledDbFile)())) {
(0, writeDatabaseFile_1.writeDatabaseFile)();
}
On a stock (SIP-enabled) machine the branch is skipped silently, the legacy defaults write runs as a no-op, and setup finishes with "Environment setup complete 🎉". Every subsequent VoiceOver-suite AppleScript command then fails with -1708:
execution error: VoiceOver got an error: right doesn't understand the "move" message. (-1708)
The symptom is misleading because the standard suite still works (tell application "VoiceOver" to quit succeeds), so it looks like a scripting-dictionary problem rather than the control gate.
Additional macOS 26 data points
- An OS upgrade can silently drop a previously enabled state: this machine had
/var/db/Accessibility/.VoiceOverAppleScriptEnabled-Migrated (dated from a past migration) but no enable file, and VoiceOver had rewritten SCREnableAppleScript to false in the group container.
- VoiceOver Utility moved to
/System/Applications/Utilities/VoiceOver Utility.app. Its binary symbols (appleScriptEnabledFileExists, createAppleScriptEnabledFileOnSuccess:onError:, waitForAppleScriptEnabledFileExists:systemAuth:adminAuth:) show the checkbox now creates/removes the marker file through an admin-authorized operation.
sudo touch /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled works with SIP enabled — SIP does not protect this path, so the current isSipEnabled() guard is stricter than necessary; the actual requirement is root, not SIP-off.
After creating the marker file manually, @guidepup/guidepup 0.33.2 works on Tahoe: 3/3 consecutive runs against a WAI-ARIA APG disclosure fixture in Safari captured deterministic spoken-phrase logs (name/role/state, aria-expanded state change, revealed content) with no other changes.
Repro
- Stock macOS 26 machine, SIP enabled, no
/private/var/db/Accessibility/.VoiceOverAppleScriptEnabled.
npx @guidepup/setup setup → completes with success message.
- Any
voiceOver.move*/next() via @guidepup/guidepup → -1708.
sudo touch /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled → same code now works.
Suggested fix
- Treat the marker file as required on all machines, not only SIP-disabled ones: attempt the write, and when it fails with
EPERM/EACCES (or the process isn't root), fail the step (or at minimum end with a prominent warning, not the success banner) and print the two working remedies: tick "Allow VoiceOver to be controlled with AppleScript" in VoiceOver Utility (admin prompt), or sudo touch /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled.
- On Darwin ≥ 25, skip or demote the legacy
defaults write com.apple.VoiceOver4/default step — it no longer does anything.
- Consider a post-setup verification probe (start VO, issue one VO-suite command, expect non-
-1708) so false-success can't ship; the manual-setup guide the CLI links to would also benefit from the macOS 26 marker-file note.
Happy to provide the full probe logs or test candidate fixes on this machine.
Environment
@guidepup/setup0.24.6,@guidepup/guidepup0.33.2Summary
On macOS 26, VoiceOver gates its AppleScript control on the existence of the root-owned marker file
/private/var/db/Accessibility/.VoiceOverAppleScriptEnabled. The legacy preference (defaults write com.apple.VoiceOver4/default SCREnableAppleScript -bool true) is no longer honored — VoiceOver 26.5 keeps its live preferences in~/Library/Group Containers/group.com.apple.VoiceOver/Library/Preferences/com.apple.VoiceOver4/default.plist(with a per-key timestamp journal), and even settingSCREnableAppleScripttotruethere has no effect while the marker file is absent.setupknows about the marker file, butlib/commands/setup/macOS/setup.jsonly writes it when SIP is disabled:On a stock (SIP-enabled) machine the branch is skipped silently, the legacy
defaults writeruns as a no-op, and setup finishes with "Environment setup complete 🎉". Every subsequent VoiceOver-suite AppleScript command then fails with-1708:The symptom is misleading because the standard suite still works (
tell application "VoiceOver" to quitsucceeds), so it looks like a scripting-dictionary problem rather than the control gate.Additional macOS 26 data points
/var/db/Accessibility/.VoiceOverAppleScriptEnabled-Migrated(dated from a past migration) but no enable file, and VoiceOver had rewrittenSCREnableAppleScripttofalsein the group container./System/Applications/Utilities/VoiceOver Utility.app. Its binary symbols (appleScriptEnabledFileExists,createAppleScriptEnabledFileOnSuccess:onError:,waitForAppleScriptEnabledFileExists:systemAuth:adminAuth:) show the checkbox now creates/removes the marker file through an admin-authorized operation.sudo touch /private/var/db/Accessibility/.VoiceOverAppleScriptEnabledworks with SIP enabled — SIP does not protect this path, so the currentisSipEnabled()guard is stricter than necessary; the actual requirement is root, not SIP-off.After creating the marker file manually,
@guidepup/guidepup0.33.2 works on Tahoe: 3/3 consecutive runs against a WAI-ARIA APG disclosure fixture in Safari captured deterministic spoken-phrase logs (name/role/state,aria-expandedstate change, revealed content) with no other changes.Repro
/private/var/db/Accessibility/.VoiceOverAppleScriptEnabled.npx @guidepup/setup setup→ completes with success message.voiceOver.move*/next()via@guidepup/guidepup→-1708.sudo touch /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled→ same code now works.Suggested fix
EPERM/EACCES(or the process isn't root), fail the step (or at minimum end with a prominent warning, not the success banner) and print the two working remedies: tick "Allow VoiceOver to be controlled with AppleScript" in VoiceOver Utility (admin prompt), orsudo touch /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled.defaults write com.apple.VoiceOver4/defaultstep — it no longer does anything.-1708) so false-success can't ship; the manual-setup guide the CLI links to would also benefit from the macOS 26 marker-file note.Happy to provide the full probe logs or test candidate fixes on this machine.