dan-snelson/ddm-os-reminder/diagnose-client-state
Claude Code and agent skill by dan-snelson/ddm-os-reminder
- community
Checking that the SKILL.md file is still in the repository.
Diagnose why a DDM OS Reminder dialog did not appear or appeared unexpectedly from uploaded client files. Use when a Mac Admin uploads the client-side log (/var/log/<rdnn>.log), /var/log/install.log, and a client-side .plist, or asks to triage resolver suppression, missing reminders, or DDM OS Reminder client state. Use when the user runs /diagnose-client-state.
Install
npx vskill@latest install dan-snelson/ddm-os-reminder/diagnose-client-stateSKILL.md
Diagnose DDM OS Reminder client state
Read-only against the affected Mac. Do not write preferences, scheduler state, LaunchDaemons, or logs. The only file this skill may write is the findings Markdown, and only after the user confirms a path. Never add --no-redaction unless the Mac Admin asks for it.
Mac Admins upload files from the affected Mac. Do not assume live access to that Mac.
Required uploads
Ask for any of these that are missing:
- Client-side log:
/var/log/<rdnn>.log /var/log/install.log(full copy is fine; analysis uses the last 4000 lines)- Client-side preferences, whichever exist:
/Library/Managed Preferences/<rdnn>.dorm.plist/Library/Preferences/<rdnn>.dorm.plist
A single unlabeled plist is valid. Do not invent the other layer.
Optional uploads
Use only when the admin includes them: dor-state.plist, dor-fallback-declaration.plist, SoftwareUpdateDDMStatePersistence.plist, /Library/LaunchDaemons/<rdnn>.dor.plist, and whether /Library/Management/<rdnn>/dor-aggressive-kill existed.
Extract facts
When zsh and PlistBuddy are available, run:
Label layers when both exist:
On the affected Mac
If the Mac Admin runs the helper on the affected Mac, --rdnn reads each input that is not supplied from its live path. Explicit flags still win, and sudo lets root-only files be read:
To track several Macs internally, the Mac Admin may add --no-redaction. With --rdnn, the helper then also saves its fact sheet as /Library/Management/<rdnn>/ddm-os-reminder-<rdnn>-<computer-name>-unredacted-<YYYY-MM-DD-HHMMSS>-fact-sheet.md (mode 0600) and exits 73 if it cannot. That saved file is the helper's only write.
Treat the resulting fact sheet exactly like one built from uploads. Uploads stay the default; do not ask for live access.
The helper is read-only, apart from that opt-in save. It prints a fact sheet that ends with a ## Report skeleton. Preference ranges, plist key names, and install.log source-type markers live in the helper; do not restate them here. This skill matches the diagnoseReminderState.zsh 1.6.5 report skeleton.
If the helper cannot run, read the three files and build the report from the template below by hand. Treat reminderDialog.zsh validatePreferenceLoad / resolveDDMEnforcementFromInstallLog as the runtime source of truth.
Rules
- The client log line
DDM update check:(5.2.0and later) orNormal DDM resolver result:(earlier) is what that Mac did. Quote it, along with anyNo reminder shown:andNext step:lines. install.logexplains that result. Do not invent a different resolver status.- If the log and
install.logevidence disagree, say they disagree and quote both. - Without
SoftwareUpdateDDMStatePersistence.plist, do not dropinstall.logcandidates as uncorroborated. Quote client-log warnings about uncorroborated trust when present. NextScheduledReminderlives indor-state.plist. If that file is missing, say it was not in the upload.dor-starter.zshexits 0 with no newdormrun and no new log line in three cases:NextScheduledReminderisFALSE;NextScheduledReminderisYYYY-MM-DD:HH:MM:SSand that local time is still in the future;dor.pidnames a live process. Exception (5.3.0and later): once per boot, the first heartbeat that finds a console user other thanloginwindow,_mbsetupuser, orrootlaunches a post-boot re-evaluation even whenNextScheduledReminderis still in the future. It logsStarter launch after boot; re-evaluating deadline (NextScheduledReminder: …).and records thekern.boottimeepoch inLastBootReevaluation. That run shows a reminder only when a pre-deadline threshold, aggressive mode, or Force mode is due, or when the stored schedule has come due; otherwise it logsNo reminder shown: post-boot re-evaluation found no reminder dueand may moveNextScheduledReminderearlier, never later. Starting with5.3.0, a due starter during a Maintenance DarkWake also launches nodormrun, but logsDarkWake detected (system capabilities: …); deferring reminder launch to the next heartbeat.and leavesdor-state.plistunchanged; the reminder runs at the first heartbeat after a full wake. A missingNextScheduledReminderkey lets the starter launch. An older healthydormrun does not mean the heartbeat launched again.--aggressive-kill yes, or apresentrow checked on the Mac with--rdnn, means/Library/Management/<rdnn>/dor-aggressive-killexisted, so aggressive mode uses the normal cadence until that file is removed.- Files-table statuses:
supplied(named on the command line),not in upload, and with--rdnnalsoinferred (--rdnn),not present on this Mac, andunreadable on this Mac. Report anunreadable on this Macfile as missing evidence, not as absent. - Read
dorm (<version>):from the log. A laterdor (line (two spaces) is deployment, not the runtime run. This skill matchesreminderDialog.zsh5.3.0. If the version differs, say the checklist is best-effort. A sharedScriptLogcan also hold other scripts' runs in the same<name> (<version>): … Initiatingformat; the helper (1.6.4and later) excludes them from run detection and names them in an identity note. - The helper redacts usernames, first names,
/Users/…paths, install.log computer names, and labeled serial numbers in the fact sheet. Keep RDNN, versions, deadlines, and preference keys. Attach the redacted report. Keep raw client files and the fact sheet out of public issues. - With
--no-redaction, the fact sheet saysRedaction is off, values appear as logged, section 3 addsComputer nameandSerial numberrows, section 9 says the report is not redacted, and the suggested report filename carries the computer name and-unredacted. Do not redact such a report by hand. Never attach an unredacted report to a public issue.
Report
Every report uses one format. Do not add, drop, rename, merge, or reorder sections.
- Copy the helper's
## Report skeletonblock, from<!-- report-skeleton:begin -->to<!-- report-skeleton:end -->. Drop the two marker lines. - Fill only the
<!-- agent: … -->slots: sections 1, 7, and 8, plus optional extra bullets in section 5. Replace each slot; do not leave comments behind. In section 7, base the answer on the helper's comparison table; it lists facts only and does not decide agreement. In section 8, base the cause and next steps on the helper's recorded evidence; when the runtime logged aNext step:, keep it as the first next step. - Do not reformat, re-sort, trim, or re-word helper tables, bullets, or the section 9 sentence. If a helper row is wrong, say so in section 8; do not edit the row.
Template (helper-filled parts shown as …):
…
With --no-redaction, the helper writes the section 9 sentence as This report is not redacted (--no-redaction): …. Copy it unchanged.
Verdict categories (pick exactly one, bold, sentence case): Resolver suppression, Fallback selected, Already compliant, Outside the display window, Quiet period, Update Tonight, Meeting or Focus delay, Threshold dialog, Aggressive dialog, Dialog shown, Fatal setup error, Not enough evidence. Follow with the recorded resolver status in backticks when the last run has one, for example Resolver suppression (conflict).
A conflict from Declaration persisted after 'No updates found for DDM to enforce' or Available descriptor <offered> disagrees with DDM declaration <version>, on a Mac that already meets the declaration, is Already compliant (conflict). Earlier versions evaluated the DDM Emergency Fallback when one was configured and could end with No reminder shown: macOS <installed> already meets DDM Emergency Fallback macOS <version>. The fallback is skipped, ending with No reminder shown: macOS <installed> already meets DDM-enforced macOS <version>; …, starting with 5.3.0.
Style:
- Headings exactly as in the template, including numbers. Use
###only for the two section 8 subheadings. - Tables stay tables; never convert helper tables to bullets or bullets to tables.
- Full timestamps (
YYYY-MM-DD HH:MMor as logged). Never short forms like10-14. - US English spelling (labeled, honored, analyze).
- Backticks for preference keys, file names, paths, statuses, versions, and quoted log fragments.
- Bold only for the verdict category and the section 7 lead word.
- Quote log lines in
textfenced blocks. Redact as the helper does. - In section 8, mark inferences as inferences. Number next steps; put read-only checks first and end each with
(read-only).
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingResources/skills/diagnose-client-state/SKILL.md
Popularity
- Repository stars
- 130
- Repository forks
- 27
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/dan-snelson/ddm-os-reminder/diagnose-client-state)