github dan-snelson/DDM-OS-Reminder v5.1.0
DDM OS Reminder (5.1.0)

3 hours ago

13-Oct-2026

  • Added a read-only client-state diagnosis helper and agent skill so Mac Admins can upload the client-side log, /var/log/install.log, and client-side .plist and get a fact sheet of effective settings, install.log declaration evidence, and the last run's recorded resolver result (Issue #147)

    • Resources/diagnoseReminderState.zsh writes nothing. The client log's Normal DDM resolver result line is authoritative for what that Mac did. The fact sheet follows the 5.1.0 install.log timestamp rule and minute-threshold order, and it redacts usernames, /Users paths, install.log computer names, and labeled serial numbers.
    • Agent instructions live at Resources/skills/diagnose-client-state/SKILL.md, with links from .github/skills, .agents/skills, and .claude/skills.
  • All and Script redeployments now keep /Library/Management/<rdnn>/dor-state.plist, so redeploying inside a MinutesBeforeDeadlineReminderSchedule window no longer shows an already-delivered pre-deadline threshold reminder again (Issue #149)

    • Pre-deadline threshold delivery records and UpdateTonightSuppressionUntil carry across the redeploy; threshold records still reset automatically when the deadline/version signature changes.
    • Only NextScheduledReminder is cleared, so the refreshed heartbeat still evaluates reminders right after deployment (and a stale FALSE value cannot silence the Mac).
    • Deployment logs [NOTICE] when scheduler state is preserved and when NextScheduledReminder is cleared. An unreadable state file is logged at [WARNING] and left for the starter and runtime to quarantine.
    • Script now unloads and removes the current heartbeat LaunchDaemon before stopping the active runtime and clearing NextScheduledReminder (as All already did), so a heartbeat firing mid-redeploy can no longer relaunch the previous dor.zsh beside the replacement or overwrite the cleared schedule. The LaunchDaemon is recreated and loaded at the end of deployment as before.
    • Upgrade note: Only Uninstall removes dor-state.plist, matching the aggressive-mode kill switch dor-aggressive-kill.
  • Replaced the percentage-based low-disk-space warning with a fixed GB threshold, so large disks no longer warn with hundreds of GB free and small disks no longer under-warn (Issue #146; idea credit: @zte303, DDM-Notify-Basic)

    • New MinimumDiskFreeGB preference (Resources/sample.plist default 26, matching Apple's last published macOS upgrade requirement (Monterey: 26 GB); 0 disables) is compared against the existing Finder-aligned available-capacity value (diskutil fallback) in decimal GB, matching the displayed value.
    • {diskSpaceHumanReadable} and the infobox Free Disk Space line are unchanged.
    • Each evaluation logs [INFO] Disk space: … free; MinimumDiskFreeGB threshold … GB; warning shown|suppressed.
    • Applied the same change to Resources/reminderDialogPreferenceTest.zsh and Resources/createPlist.zsh.
    • Upgrade note: MinimumDiskFreePercentage is deprecated. When MinimumDiskFreeGB is not set, an existing MinimumDiskFreePercentage value is still honored and logged at [WARNING]; when both are set, MinimumDiskFreeGB wins and the legacy key is logged as ignored. Support will be removed in 6.0.0. Regenerated configuration carries only MinimumDiskFreeGB.
    • Prior-plist import in assemble.zsh names the replacement instead of listing MinimumDiskFreePercentage as an unsupported key: ⚠️ Replaced deprecated MinimumDiskFreePercentage (10%) with MinimumDiskFreeGB (26 GB, sample default), or ⚠️ Dropping deprecated MinimumDiskFreePercentage (…%); keeping imported MinimumDiskFreeGB (… GB) when the prior plist already has both (or … imported MinimumDiskFreeGB '…' was invalid, using MinimumDiskFreeGB (26 GB, sample default) when its value is outside 0–999). When a prior plist carried MinimumDiskFreePercentage, production builds also list MinimumDiskFreeGB under Recommended review items.
  • Prior-plist import in assemble.zsh now skips numeric values outside 0–999 (keeping the sample default and printing ⚠️ Skipping invalid integer value … (expected 0-999)), matching the runtime, which already ignored them.

  • Infobox Deadline now renders in red whenever Day(s) Remaining does, including the final ~12 hours before the effective deadline when Day(s) Remaining rounds to 0 (requires swiftDialog markdown-color support) (Issue #143)

    • Resources/reminderDialogPreferenceTest.zsh applies the same highlighting, so --pre-deadline-threshold and --aggressive previews show Deadline and Day(s) Remaining in red.
    • Square brackets in a red-highlighted deadline (for example, from a custom DateFormatDeadlineHumanReadable) render as parentheses in the infobox Deadline and the red deadline enforcement sentence, so a literal ] no longer ends swiftDialog's :red[…] markup early. Uncolored output is unchanged.

Full Changelog: v5.1.0...v5.1.0

Don't miss a new DDM-OS-Reminder release

NewReleases is sending notifications on new releases.