Troubleshooting
Start with the exit code and the error block of the result. Pardon always prints a JSON result, even when it fails, and the message usually names the problem.
{"schema":"result/v1","outcome":"invalid_payload","exit_code":11,"error":{"code":"invalid_payload","message":"payload is not valid campaign/v1 JSON: ..."}, "...": "..."}
Nothing appeared
| Exit | Likely cause | What to do |
|---|---|---|
| 6 | Run as SYSTEM with nobody signed in | Expected. Run again when someone is, or schedule for working hours. |
| 7 | Shown on purpose to no one | Read detail.suppressed_reason: expired (past expires_at), focus (user was presenting and respect_focus is skip), quiet_hours (inside the campaign's quiet hours with action: "skip"), already_answered (a show_once campaign someone on this machine already answered; see Hosted campaigns), deferred, not_pending, satisfied, restarted or stale (reboot campaigns; see Reboot campaigns). |
| 0 instantly | You passed --dry-run | Dry runs never draw. |
| Nothing yet, still running | Waiting for a presenter to finish or for quiet hours to end | Expected with "wait". It shows when they are free, or after respect_focus_max_wait_seconds (one hour by default). See Quiet hours and busy users. |
| 10 | The machine could not draw the card, or --payload-url could not fetch the campaign | Check error.code. payload_fetch_failed means the download failed: the URL must be HTTPS, reachable through the machine's proxy, answer within 15 seconds and be under 256 KB. Otherwise see WebView2. |
To see what a reboot campaign will do next on a machine without showing anything, run pardon.exe status --campaign <id> --payload <file>.
Exit 11 or 64 on a file that looks fine
Exit 11 means the JSON is not a valid campaign. The message names the field. Common causes:
- A field Pardon doesn't know, often a typo (
"titel"). Unknown fields are rejected on purpose. - A
campaign_idwith spaces or symbols. Use letters, digits,.,_,:and-. - A brand
accentthat isn't#plus six hex digits. - A reboot campaign with no
policy.deadline.
Encoding. Pardon reads campaign files saved as UTF-8 (with or without a byte-order mark) and UTF-16, which covers what Notepad and Windows PowerShell 5.1 write. A file in any other encoding is exit 11.
Exit 64 otherwise means the command line itself was wrong (an unknown flag, or more than two --buttons). pardon.exe show --help lists the options.
WebView2
Pardon draws its cards with Microsoft Edge WebView2, which most Windows 10 and 11 PCs already have. Fresh Windows Server installs often don't. pardon.exe selftest reports whether it is present.
If it is missing, Pardon installs it silently from a bootstrapper built into the exe, then carries on. That install:
- needs admin rights (running as SYSTEM from an RMM is fine);
- downloads the runtime from Microsoft, so it needs outbound HTTPS;
- took about 75 seconds on a fresh Windows Server 2022 VM in testing.
On an air-gapped or locked-down machine the install cannot finish and Pardon exits 10. Deploy WebView2 yourself with Microsoft's offline installer first. If you already manage WebView2 and want a missing runtime to fail fast instead of installing, add --no-runtime-install.
Restarts
Exit 10 restart_failed. Windows refused the restart. On Windows Server, ordinary users aren't allowed to restart the machine, so run reboot campaigns as SYSTEM there.
The machine didn't restart after "Restart now". Pardon asks Windows to restart politely first, so apps can prompt to save. An app sitting on an unsaved-changes prompt can hold that up; after force_apps_closed_after_seconds (120 by default) Pardon forces it. If you set that field to null, it never forces.
A user ended the countdown in Task Manager and nothing happened. That only works when Pardon was run as the user rather than as SYSTEM. Run reboot campaigns as SYSTEM and the restart happens regardless.
I need to start a campaign over on one machine. pardon.exe clear --campaign <id> forgets its deferrals and removes any reprompt task.
Getting more detail
Set PARDON_DEBUG=1 before running Pardon to print diagnostic lines (rendering, option resolution) to stderr. They never mix with the JSON on stdout.
$env:PARDON_DEBUG = 1
pardon.exe show --payload .\campaign.json