{
  "title": "App Auto-Patch",
  "description": "Managed preferences for App Auto-Patch 4.0.0 (domain xyz.techitout.appAutoPatch). Keys follow the order of the App Auto-Patch Settings window: Installomator, Deferrals, Advanced and About, then Managed Only for keys with no Settings section. Each title starts with its Settings section; \u201c(managed only)\u201d marks a key with no Settings control. A managed value overrides the matching Settings control. Leave a key unset to use the default given in its description.",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "InstallomatorVersion": {
      "title": "Installomator Version \u203a Version",
      "description": "Installomator source that App Auto-Patch downloads and uses for discovery and patching. release: the latest tagged Installomator release. main: the main branch of Installomator/Installomator. custom: the repository and branch set in InstallomatorVersionCustomRepoPath and InstallomatorVersionCustomBranchName. Case-insensitive; an unrecognized value uses main. Default: main.",
      "property_order": 100,
      "type": "string",
      "default": "main",
      "enum": [
        "release",
        "main",
        "custom"
      ],
      "options": {
        "enum_titles": [
          "Release",
          "Main",
          "Custom"
        ],
        "infoText": "Key: InstallomatorVersion"
      }
    },
    "InstallomatorVersionCustomRepoPath": {
      "title": "Installomator Version \u203a Custom repo path (managed only)",
      "description": "GitHub owner/repository to download Installomator from, for example MyOrg/Installomator. Used only when InstallomatorVersion is custom. Default: Installomator/Installomator.",
      "property_order": 101,
      "type": "string",
      "options": {
        "infoText": "Key: InstallomatorVersionCustomRepoPath"
      }
    },
    "InstallomatorVersionCustomBranchName": {
      "title": "Installomator Version \u203a Custom branch name (managed only)",
      "description": "Branch of the custom repository to download. Used only when InstallomatorVersion is custom. Default: main.",
      "property_order": 102,
      "type": "string",
      "default": "main",
      "options": {
        "infoText": "Key: InstallomatorVersionCustomBranchName"
      }
    },
    "InstallomatorUpdateDisable": {
      "title": "Installomator Version \u203a Disable Installomator updates (managed only)",
      "description": "When true, App Auto-Patch does not download or replace Installomator.sh or fragments/. LabelVersionHelper.zsh is still refreshed. Use this when MDM pushes its own Installomator payload. A string TRUE or FALSE is accepted. Default: false.",
      "property_order": 103,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: InstallomatorUpdateDisable"
      }
    },
    "GitHubAPIAuthEnabled": {
      "title": "GitHub API \u203a Authenticate API requests",
      "description": "When true, api.github.com requests that check Installomator send GitHubAPIToken. The rate limit rises from 60 to 5,000 requests an hour. A missing token makes those requests fail instead of going out unauthenticated. Archive downloads on github.com are unchanged. A string TRUE or FALSE is accepted. Also editable in Settings. Default: false.",
      "property_order": 104,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: GitHubAPIAuthEnabled"
      }
    },
    "GitHubAPIToken": {
      "title": "GitHub API \u203a Personal access token",
      "description": "Personal access token used when GitHubAPIAuthEnabled is true. A fine-grained token needs Contents: Read on the repositories App Auto-Patch queries. The value is not written to the log. Also editable in Settings. Default: empty.",
      "property_order": 105,
      "type": "string",
      "options": {
        "infoText": "Key: GitHubAPIToken"
      }
    },
    "InstallomatorOptions": {
      "title": "User Experience / Advanced Behavior / Network & Process \u203a Installomator options",
      "description": "Space-separated KEY=VALUE options passed to every Installomator run. The Installomator tab builds this one string from three sections. User Experience: NOTIFY, BLOCKING_PROCESS_ACTION, LOGO and REOPEN. Advanced Behavior: IGNORE_APP_STORE_APPS, SYSTEMOWNER and INSTALL=force. Network & Process: INTERRUPT_DND, IGNORE_DND_APPS, PROXY and PROMPT_TIMEOUT. Other options are passed through unchanged. Background patching of closed apps always uses BLOCKING_PROCESS_ACTION=tell_user. IGNORE_DND_APPS is an Installomator option and is separate from the IgnoreDNDApps key. Apps with a Mac App Store receipt are left to the App Store and kept out of the pending count, Update All and deadlines unless IGNORE_APP_STORE_APPS=yes. Default: NOTIFY=silent LOGO=appstore. BLOCKING_PROCESS_ACTION is omitted, so Installomator uses tell_user.",
      "property_order": 110,
      "type": "string",
      "default": "NOTIFY=silent LOGO=appstore",
      "options": {
        "infoText": "Key: InstallomatorOptions"
      }
    },
    "DeferralTimerDefault": {
      "title": "Default Deferral Timer \u203a Delay (minutes)",
      "description": "Minutes App Auto-Patch waits before showing the update prompt again after the user defers. Accepts an integer or a numeric string. Default: 60.",
      "property_order": 200,
      "type": "integer",
      "default": 60,
      "options": {
        "infoText": "Key: DeferralTimerDefault"
      }
    },
    "DeferralTimerMenu": {
      "title": "Default Deferral Timer \u203a Deferral menu (managed only)",
      "description": "Comma-separated deferral lengths, in minutes, offered in the deferral dialog, for example 30,60,240,1440. Entries that aren't positive whole numbers are ignored. When unset or empty, the menu is DeferralTimerDefault, 60, 120 and 240. Default: unset.",
      "property_order": 201,
      "type": "string",
      "options": {
        "infoText": "Key: DeferralTimerMenu"
      }
    },
    "DialogTimeoutDeferral": {
      "title": "Default Deferral Timer \u203a Dialog timeout (managed only)",
      "description": "Seconds the deferral dialog stays open before DialogTimeoutDeferralAction is applied. At a hard deadline it also sets the countdown before installation starts. Values below 1 are treated as 1. Accepts an integer or a numeric string. Default: 300.",
      "property_order": 202,
      "type": "integer",
      "default": 300,
      "minimum": 1,
      "options": {
        "infoText": "Key: DialogTimeoutDeferral"
      }
    },
    "DialogTimeoutDeferralAction": {
      "title": "Default Deferral Timer \u203a Dialog timeout action (managed only)",
      "description": "What happens when the deferral dialog times out. defer: the updates are deferred. continue: the updates are installed. Case-insensitive; other values are ignored. At a hard deadline the dialog always continues. Default: defer.",
      "property_order": 203,
      "type": "string",
      "default": "defer",
      "enum": [
        "defer",
        "continue"
      ],
      "options": {
        "infoText": "Key: DialogTimeoutDeferralAction"
      }
    },
    "DeferralDialogPrimaryButton": {
      "title": "Default Deferral Timer \u203a Primary button (managed only)",
      "description": "Which deferral-dialog button is the default (blue, Return-key) action. update: the Update button. defer: the Defer button, so an accidental Return press doesn't start an install. Other values behave as update. Has no effect at a hard deadline, where there is no Defer button. Default: update.",
      "property_order": 204,
      "type": "string",
      "default": "update",
      "enum": [
        "update",
        "defer"
      ],
      "options": {
        "infoText": "Key: DeferralDialogPrimaryButton"
      }
    },
    "DeferralTimerError": {
      "title": "Default Deferral Timer \u203a Retry after an update error (managed only)",
      "description": "Minutes to wait before another attempt after an Update All finishes with one or more errors. This wait replaces restarting the prompt on DialogTimeoutDeferral. Values below 1 are treated as 1. Accepts an integer or a numeric string. Ignored when WorkflowUpdateAllErrorCompletesPatching is true. Default: 60.",
      "property_order": 205,
      "type": "integer",
      "default": 60,
      "minimum": 1,
      "options": {
        "infoText": "Key: DeferralTimerError"
      }
    },
    "DeadlineCountFocus": {
      "title": "Focus Deferral \u203a Count limit",
      "description": "Number of automatic focus deferrals allowed. While Focus, Do Not Disturb or a display-sleep assertion is active, App Auto-Patch defers automatically and hides the dialog until this limit or DeadlineDaysFocus is reached; dialogs then continue normally. Clamped to at least 1 below DeadlineCountHard. Accepts an integer or a numeric string. Unset: no count limit. With both focus limits unset there are no automatic focus deferrals.",
      "property_order": 210,
      "type": "integer",
      "options": {
        "infoText": "Key: DeadlineCountFocus"
      }
    },
    "DeadlineDaysFocus": {
      "title": "Focus Deferral \u203a Day limit",
      "description": "Days from the start of the patch cycle during which automatic focus deferrals are allowed. Interchangeable with DeadlineCountFocus: whichever is reached first ends automatic deferrals. Clamped to at least 1 below DeadlineDaysHard. Accepts an integer or a numeric string. Unset: no day limit.",
      "property_order": 211,
      "type": "integer",
      "options": {
        "infoText": "Key: DeadlineDaysFocus"
      }
    },
    "DeferralTimerFocus": {
      "title": "Focus Deferral \u203a Automatic deferral (minutes)",
      "description": "Minutes an automatic focus deferral waits before checking again. Accepts an integer or a numeric string. Default: 60.",
      "property_order": 212,
      "type": "integer",
      "default": 60,
      "options": {
        "infoText": "Key: DeferralTimerFocus"
      }
    },
    "FocusDeferralNotificationsEnabled": {
      "title": "Focus Deferral \u203a Notify during an automatic focus deferral",
      "description": "When true, an automatic focus deferral posts a notification; clicking it opens the deferral dialog. The dialog itself stays hidden either way. Default: false.",
      "property_order": 213,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: FocusDeferralNotificationsEnabled"
      }
    },
    "IgnoreDNDApps": {
      "title": "Focus Deferral \u203a Ignore display-sleep apps",
      "description": "Comma-separated process names to ignore when checking for display-sleep assertions, for example Google Chrome,caffeinate. coreaudiod is always ignored. Focus and Do Not Disturb are still detected. Default: empty.",
      "property_order": 214,
      "type": "string",
      "default": "",
      "options": {
        "infoText": "Key: IgnoreDNDApps"
      }
    },
    "DeadlineCountHard": {
      "title": "Hard Deadline \u203a Count limit",
      "description": "Number of user deferrals allowed before installation is required. Accepts an integer or a numeric string. Unset: no count limit.",
      "property_order": 220,
      "type": "integer",
      "options": {
        "infoText": "Key: DeadlineCountHard"
      }
    },
    "DeadlineDaysHard": {
      "title": "Hard Deadline \u203a Day limit",
      "description": "Days from the start of the patch cycle before installation is required, regardless of deferrals. Accepts an integer or a numeric string. Unset: no day limit.",
      "property_order": 221,
      "type": "integer",
      "options": {
        "infoText": "Key: DeadlineDaysHard"
      }
    },
    "HardDeadlineDialogAllowClose": {
      "title": "Hard Deadline \u203a Allow closing the dialog (managed only)",
      "description": "When true, the user may close the required-update dialog after a hard deadline. The enforcement countdown continues, and reminders are posted 60, 30 and 5 minutes before installation. Default: false (the dialog can't be closed).",
      "property_order": 222,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: HardDeadlineDialogAllowClose"
      }
    },
    "AggressivePatchDayDeferral": {
      "title": "Hard Deadline \u203a Aggressive patch-day deferral (managed only)",
      "description": "When true, deferral options on the hard-deadline day are capped by the time left until PatchingEndTime: more than 6 hours left, 120 minutes; 3\u20136 hours, 60; 1\u20133 hours, 30; 30\u201360 minutes, 15; under 30 minutes, 5. After PatchingEndTime no deferral is offered. Default: false.",
      "property_order": 223,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: AggressivePatchDayDeferral"
      }
    },
    "PatchingEndTime": {
      "title": "Hard Deadline \u203a Patching end time (managed only)",
      "description": "End of the patching window used by AggressivePatchDayDeferral, as HH:mm (24-hour), for example 17:00. Unset: 17:00.",
      "property_order": 224,
      "type": "string",
      "options": {
        "infoText": "Key: PatchingEndTime"
      }
    },
    "PatchWeekStartDay": {
      "title": "Patching Cadence \u203a Anchor weekday",
      "description": "Weekday that starts each weekly patch cycle: 1 = Sunday through 7 = Saturday. Used when MonthlyPatchingCadenceEnabled is false. Accepts an integer or a numeric string. Default: 2 (Monday).",
      "property_order": 230,
      "type": "integer",
      "default": 2,
      "enum": [
        1,
        2,
        3,
        4,
        5,
        6,
        7
      ],
      "options": {
        "enum_titles": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ],
        "infoText": "Key: PatchWeekStartDay"
      }
    },
    "DaysUntilReset": {
      "title": "Patching Cadence \u203a Reset cycle after (days)",
      "description": "Days after CurrentPatchingStartDate before deferral counts and deadlines reset and a new patch cycle begins. 7 is weekly and 14 is every other week. Monthly cadence uses the next matching weekday instead. Accepts an integer or a numeric string. Default: 1.",
      "property_order": 231,
      "type": "integer",
      "default": 1,
      "options": {
        "infoText": "Key: DaysUntilReset"
      }
    },
    "MonthlyPatchingCadenceEnabled": {
      "title": "Patching Cadence \u203a Use monthly cadence (Nth weekday of the month)",
      "description": "When true, each patch cycle starts on the weekday of the month set by MonthlyPatchingCadenceOrdinalValue and MonthlyPatchingCadenceWeekdayIndex instead of PatchWeekStartDay. Default: false.",
      "property_order": 232,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: MonthlyPatchingCadenceEnabled"
      }
    },
    "MonthlyPatchingCadenceOrdinalValue": {
      "title": "Patching Cadence \u203a Occurrence",
      "description": "Which occurrence of MonthlyPatchingCadenceWeekdayIndex starts the monthly cycle: first, second, third, fourth, fifth or final (the last one in the month). Must be a string; a number is ignored. Case-insensitive; an unrecognized value uses second. Default: second.",
      "property_order": 233,
      "type": "string",
      "default": "second",
      "enum": [
        "first",
        "second",
        "third",
        "fourth",
        "fifth",
        "final"
      ],
      "options": {
        "enum_titles": [
          "First",
          "Second",
          "Third",
          "Fourth",
          "Fifth",
          "Last"
        ],
        "infoText": "Key: MonthlyPatchingCadenceOrdinalValue"
      }
    },
    "MonthlyPatchingCadenceWeekdayIndex": {
      "title": "Patching Cadence \u203a Weekday",
      "description": "Weekday that starts the monthly cycle: sunday through saturday. Must be a string; a number is ignored. Case-insensitive; an unrecognized value uses tuesday. Default: tuesday.",
      "property_order": 234,
      "type": "string",
      "default": "tuesday",
      "enum": [
        "sunday",
        "monday",
        "tuesday",
        "wednesday",
        "thursday",
        "friday",
        "saturday"
      ],
      "options": {
        "enum_titles": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ],
        "infoText": "Key: MonthlyPatchingCadenceWeekdayIndex"
      }
    },
    "MonthlyPatchingCadenceStartTime": {
      "title": "Patching Cadence \u203a Start time (managed only)",
      "description": "Local time of day for the monthly cadence, as HH:mm:ss, for example 09:00:00. App Auto-Patch reads this key, but the monthly cycle currently starts on the configured day regardless of the time. Setting it locks the Deferrals settings, as any deferral key does. Default: 09:00:00.",
      "property_order": 235,
      "type": "string",
      "default": "09:00:00",
      "options": {
        "infoText": "Key: MonthlyPatchingCadenceStartTime"
      }
    },
    "BusinessHoursStartTime": {
      "title": "Business Hours \u203a Start",
      "description": "Start of business hours, as HH:mm (24-hour), for example 08:00. When both start and end are set, a hard-deadline install of open apps waits until business hours end; the user still sees the prompt and can install sooner. Background patching of closed apps isn't affected. Windows that cross midnight, such as 22:00 to 06:00, are supported. Unset: no business-hours hold.",
      "property_order": 240,
      "type": "string",
      "options": {
        "infoText": "Key: BusinessHoursStartTime"
      }
    },
    "BusinessHoursEndTime": {
      "title": "Business Hours \u203a End",
      "description": "End of business hours (exclusive), as HH:mm (24-hour), for example 17:00. See BusinessHoursStartTime. Unset: no business-hours hold.",
      "property_order": 241,
      "type": "string",
      "options": {
        "infoText": "Key: BusinessHoursEndTime"
      }
    },
    "AdminTestModeEnabled": {
      "title": "Admin Test Mode \u203a Show Admin Test Mode (managed only)",
      "description": "When true, Settings \u203a Deferrals shows the Admin Test Mode panel. It lets an admin override the patch-cycle anchor, deferral counts and next launch, and trigger the deferral and hard-deadline prompts and a test notification. Its actions bypass normal deferral guards, so don't deploy true to production Macs. Default: false.",
      "property_order": 250,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: AdminTestModeEnabled"
      }
    },
    "IgnoredLabels": {
      "title": "App Labels \u203a Ignored",
      "description": "Installomator labels skipped during discovery. Wildcards * and ? are supported, for example microsoft* zoom*. A space-separated string, an array containing one space-separated string, or an array with one label per string. When no ignored labels are set, App Auto-Patch seeds this list once per user: microsoft*, googlechrome*, jamfconnect, zoom*, 1password*, firefox*, homebrew, androidstudio.",
      "property_order": 300,
      "type": "array",
      "items": {
        "type": "string"
      },
      "options": {
        "infoText": "Key: IgnoredLabels"
      }
    },
    "RequiredLabels": {
      "title": "App Labels \u203a Required",
      "description": "Installomator labels that are always included, even when an IgnoredLabels pattern also matches them. Wildcards are supported. A space-separated string, an array containing one space-separated string, or an array with one label per string. Default: empty.",
      "property_order": 301,
      "type": "array",
      "items": {
        "type": "string"
      },
      "options": {
        "infoText": "Key: RequiredLabels"
      }
    },
    "OptionalLabels": {
      "title": "App Labels \u203a Optional",
      "description": "Installomator labels that are discovered and shown but not installed automatically. Wildcards are supported. A space-separated string, an array containing one space-separated string, or an array with one label per string. Default: empty.",
      "property_order": 302,
      "type": "array",
      "items": {
        "type": "string"
      },
      "options": {
        "infoText": "Key: OptionalLabels"
      }
    },
    "VersionComparisonMethod": {
      "title": "Version Comparison \u203a Method",
      "description": "How an installed version is compared with the latest version. IS_AT_LEAST: up to date when the installed version is the same or newer. EQUAL_TO: up to date only when the versions match exactly. Case-insensitive; other values are ignored. Default: IS_AT_LEAST.",
      "property_order": 310,
      "type": "string",
      "default": "IS_AT_LEAST",
      "enum": [
        "IS_AT_LEAST",
        "EQUAL_TO"
      ],
      "options": {
        "enum_titles": [
          "At least (recommended)",
          "Exact match"
        ],
        "infoText": "Key: VersionComparisonMethod"
      }
    },
    "VersionComparisonInstallomatorFallback": {
      "title": "Version Comparison \u203a Allow Installomator fallback when label version is unknown",
      "description": "When true, a label whose latest version can't be read from its metadata may run Installomator in DEBUG mode during Check for Updates to find it. This uses more bandwidth. Default: true.",
      "property_order": 311,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: VersionComparisonInstallomatorFallback"
      }
    },
    "WebhookFeature": {
      "title": "Webhooks \u203a Feature",
      "description": "When to post a run summary to the webhook URLs. off: never. all: after every run with results. failures: only when an update fails. Case-insensitive; an unrecognized value uses off. Default: off.",
      "property_order": 320,
      "type": "string",
      "default": "off",
      "enum": [
        "off",
        "all",
        "failures"
      ],
      "options": {
        "enum_titles": [
          "Off",
          "All",
          "Failures Only"
        ],
        "infoText": "Key: WebhookFeature"
      }
    },
    "WebhookURLSlack": {
      "title": "Webhooks \u203a Slack Webhook URL",
      "description": "Slack incoming-webhook URL. Used when WebhookFeature is all or failures. Default: unset.",
      "property_order": 321,
      "type": "string",
      "options": {
        "infoText": "Key: WebhookURLSlack"
      }
    },
    "WebhookURLTeams": {
      "title": "Webhooks \u203a Teams Webhook URL",
      "description": "Microsoft Teams Workflows webhook URL. An Office 365 connector URL does not receive the card. Used when WebhookFeature is all or failures. Default: unset.",
      "property_order": 322,
      "type": "string",
      "options": {
        "infoText": "Key: WebhookURLTeams"
      }
    },
    "AutoResetHelperOnLaunch": {
      "title": "Helper \u203a Automatically reset the helper if it stops responding",
      "description": "When true, App Auto-Patch unregisters and re-registers its root helper when the helper is registered but not responding, or when the helper binary has changed since it was last registered (for example after an upgrade). At most once per launch and once per hour. macOS may ask the user to approve the helper again. Default: true.",
      "property_order": 330,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: AutoResetHelperOnLaunch"
      }
    },
    "DiscoverSelfUpdateLabel": {
      "title": "Self-Update \u203a Show App Auto-Patch in the app list",
      "description": "When true, App Auto-Patch itself (SelfUpdateLabel) appears in the dashboard update list. Set false to hide it. While self-update is on it is always hidden, because the self-update scheduler updates it. Default: true.",
      "property_order": 340,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: DiscoverSelfUpdateLabel"
      }
    },
    "SelfUpdateEnabled": {
      "title": "Self-Update \u203a Automatically update App Auto-Patch itself",
      "description": "When true, App Auto-Patch checks for its own updates with SelfUpdateLabel at SelfUpdateFrequency and installs them in the background. AppSelfUpdateEnabled overrides this key when set. Default: false.",
      "property_order": 341,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: SelfUpdateEnabled"
      }
    },
    "AppSelfUpdateEnabled": {
      "title": "Self-Update \u203a Automatic update override (managed only)",
      "description": "Overrides SelfUpdateEnabled when set, turning self-update on (true) or off (false). Default: unset.",
      "property_order": 342,
      "type": "boolean",
      "options": {
        "infoText": "Key: AppSelfUpdateEnabled"
      }
    },
    "SelfUpdateLabel": {
      "title": "Self-Update \u203a Installomator label",
      "description": "Installomator label used to update App Auto-Patch 4. The default reads the build number from downloads.appautopatch.app. The 3.x label appautopatch does not see 4.x releases. Change it only for a private Installomator fork. A blank value is ignored. Default: appautopatch4.",
      "property_order": 343,
      "type": "string",
      "default": "appautopatch4",
      "options": {
        "infoText": "Key: SelfUpdateLabel"
      }
    },
    "SelfUpdateFrequency": {
      "title": "Self-Update \u203a Check frequency",
      "description": "How often self-update checks run: daily, weekly or monthly. Case-insensitive; an unrecognized value uses daily. Default: daily.",
      "property_order": 344,
      "type": "string",
      "default": "daily",
      "enum": [
        "daily",
        "weekly",
        "monthly"
      ],
      "options": {
        "enum_titles": [
          "Daily",
          "Weekly",
          "Monthly"
        ],
        "infoText": "Key: SelfUpdateFrequency"
      }
    },
    "IgnoreExternalDrives": {
      "title": "App Discovery \u203a Ignore apps on external drives",
      "description": "When true, installed apps on volumes other than the boot volume (external disks, disk images, network mounts, Time Machine backups) are excluded from discovery. /Applications, /Applications/Utilities and ~/Applications on the boot volume are always scanned. Default: false.",
      "property_order": 350,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: IgnoreExternalDrives"
      }
    },
    "IgnoreFilePaths": {
      "title": "App Discovery \u203a Additional ignored paths",
      "description": "Case-insensitive substrings; an installed app whose path contains any of them is excluded from discovery. These add to four built-in exclusions: /Daemon Containers/, /Library/Application Support/JAMF/Composer/, /Applications/Chrome Apps.localized/ and /Applications/Edge Apps.localized/. Array of strings, or one space-separated string. Use an array for paths that contain spaces. Default: empty.",
      "property_order": 351,
      "type": "array",
      "items": {
        "type": "string"
      },
      "options": {
        "infoText": "Key: IgnoreFilePaths"
      }
    },
    "DiscoveryFrequency": {
      "title": "App Discovery \u203a Automatic discovery frequency (hours)",
      "description": "Hours between automatic root-helper discovery and update checks. Unset or 0 leaves the schedule off. Mid-cycle runs refresh the GUI and menu bar inventory only; notifications and the deferral dialog wait until NextAutoLaunch. Cadence reset (monthly or DaysUntilReset) always rediscovers immediately with the full notify/dialog path. Independent of background closed-app patching. Default: unset (off).",
      "property_order": 352,
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "options": {
        "infoText": "Key: DiscoveryFrequency"
      }
    },
    "WorkflowUpdateAllErrorCompletesPatching": {
      "title": "Update All errors \u203a Mark the cycle complete when Update All has errors",
      "description": "When true, an Update All that finishes with one or more errors still records the patching cadence as complete until the next reset, and App Auto-Patch does not retry. When false, the still-pending apps are tried again after DeferralTimerError minutes. Default: false.",
      "property_order": 355,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: WorkflowUpdateAllErrorCompletesPatching"
      }
    },
    "WorkflowStageUpdates": {
      "title": "Background Patching \u203a Download installers before installing",
      "description": "When true, each detected update's installer is downloaded to a local staging folder before any install, including background patching of closed apps, and later installs reuse it. When false, installers are downloaded at install time. Default: true.",
      "property_order": 360,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: WorkflowStageUpdates"
      }
    },
    "BackgroundPatchClosedAppsEnabled": {
      "title": "Background Patching \u203a Silently patch apps that aren't currently open",
      "description": "When true, App Auto-Patch periodically checks for updates and silently installs them for apps that aren't running. Open apps are left to Update All and deferrals. Default: true.",
      "property_order": 361,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: BackgroundPatchClosedAppsEnabled"
      }
    },
    "BackgroundPatchClosedAppsScheduler": {
      "title": "Background Patching \u203a Scheduler",
      "description": "Where background patching is scheduled. inApp: inside App Auto-Patch; it stops when the user quits the app. helperDaemon: inside the root helper; it keeps running after the user quits, which suits managed Macs. Also accepts app and helper; an unrecognized value uses inApp. Default: inApp.",
      "property_order": 362,
      "type": "string",
      "default": "inApp",
      "enum": [
        "inApp",
        "helperDaemon"
      ],
      "options": {
        "enum_titles": [
          "In-app",
          "Helper daemon"
        ],
        "infoText": "Key: BackgroundPatchClosedAppsScheduler"
      }
    },
    "BackgroundPatchClosedAppsIntervalHours": {
      "title": "Background Patching \u203a Run every (hours)",
      "description": "Hours between background patching passes, 1\u201324. Values outside the range are clamped. Default: 4.",
      "property_order": 363,
      "type": "integer",
      "default": 4,
      "minimum": 1,
      "maximum": 24,
      "options": {
        "infoText": "Key: BackgroundPatchClosedAppsIntervalHours"
      }
    },
    "BackgroundPatchClosedAppsRequireOnAC": {
      "title": "Background Patching \u203a Only when on power adapter",
      "description": "When true, background passes are skipped while the Mac is on battery. Default: true.",
      "property_order": 364,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: BackgroundPatchClosedAppsRequireOnAC"
      }
    },
    "BackgroundPatchClosedAppsNotifyOnCompletion": {
      "title": "Background Patching \u203a Show a notification when a background pass finishes",
      "description": "When true, a notification is posted when a background pass starts and when it finishes. Default: true.",
      "property_order": 365,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: BackgroundPatchClosedAppsNotifyOnCompletion"
      }
    },
    "UpdatesAvailableNotificationsEnabled": {
      "title": "Background Patching \u203a Show a notification when new updates become available",
      "description": "When true, a notification is posted the first time Check for Updates finds more pending updates than were last notified. Not posted while the App Auto-Patch window is in front. Default: true.",
      "property_order": 366,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: UpdatesAvailableNotificationsEnabled"
      }
    },
    "BackgroundPatchClosedAppsAllowList": {
      "title": "Background Patching \u203a Allow list (optional)",
      "description": "When not empty, only these Installomator labels are patched in the background. Array of strings, or one space-separated string. Default: empty.",
      "property_order": 367,
      "type": "array",
      "items": {
        "type": "string"
      },
      "options": {
        "infoText": "Key: BackgroundPatchClosedAppsAllowList"
      }
    },
    "BackgroundPatchClosedAppsBlockList": {
      "title": "Background Patching \u203a Block list",
      "description": "Installomator labels never patched in the background, even when they're on the allow list. Array of strings, or one space-separated string. Default: empty.",
      "property_order": 368,
      "type": "array",
      "items": {
        "type": "string"
      },
      "options": {
        "infoText": "Key: BackgroundPatchClosedAppsBlockList"
      }
    },
    "BackgroundPatchStartupJitterMaxMinutes": {
      "title": "Background Patching \u203a Startup jitter maximum (minutes) (managed only)",
      "description": "Maximum random delay, in minutes, before the first background pass. Each Mac picks a delay between 0 and this value once per patch cycle and keeps it across restarts, so a fleet doesn't patch all at once. 0 turns jitter off; negative values are treated as 0. 60\u2013240 suits most fleets. Default: 0.",
      "property_order": 369,
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "options": {
        "infoText": "Key: BackgroundPatchStartupJitterMaxMinutes"
      }
    },
    "TemporaryNotificationTypes": {
      "title": "Background Patching \u203a Temporary notification types (managed only)",
      "description": "Notification types to post as temporary banners from the main app. Allowed: backgroundPatchStarted, backgroundPatchCompleted, backgroundPatchFailed, updatesAvailable, acPowerRequired, deferralResuming, hardDeadlineReminder, selfUpdateAvailable. Unlisted types keep their built-in routing: informational background-patch events are temporary and action-required events are persistent. A type in both lists is persistent. Unknown names are ignored and logged. Default: empty.",
      "property_order": 370,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "backgroundPatchStarted",
          "backgroundPatchCompleted",
          "backgroundPatchFailed",
          "updatesAvailable",
          "acPowerRequired",
          "deferralResuming",
          "hardDeadlineReminder",
          "selfUpdateAvailable"
        ]
      },
      "uniqueItems": true,
      "options": {
        "infoText": "Key: TemporaryNotificationTypes"
      }
    },
    "PersistentNotificationTypes": {
      "title": "Background Patching \u203a Persistent notification types (managed only)",
      "description": "Notification types to post as persistent alerts from App Auto-Patch Notification (bundle ID xyz.techitout.appAutoPatch-persistent). Allowed: backgroundPatchStarted, backgroundPatchCompleted, backgroundPatchFailed, updatesAvailable, acPowerRequired, deferralResuming, hardDeadlineReminder, selfUpdateAvailable. Unlisted types keep their built-in routing. This list wins when a type is in both lists. Unknown names are ignored and logged. Default: empty.",
      "property_order": 371,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "backgroundPatchStarted",
          "backgroundPatchCompleted",
          "backgroundPatchFailed",
          "updatesAvailable",
          "acPowerRequired",
          "deferralResuming",
          "hardDeadlineReminder",
          "selfUpdateAvailable"
        ]
      },
      "uniqueItems": true,
      "options": {
        "infoText": "Key: PersistentNotificationTypes"
      }
    },
    "VerboseMode": {
      "title": "Debug \u203a Verbose Mode",
      "description": "When true, adds [VERBOSE] lines (per-label discovery timings, full Installomator output, retry decisions) to /Library/Application Support/AppAutoPatch/logs/aap.log. Patching behavior doesn't change. Default: false.",
      "property_order": 380,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: VerboseMode"
      }
    },
    "DebugMode": {
      "title": "Debug \u203a Debug Mode",
      "description": "Same effect as VerboseMode: either one turns on [VERBOSE] logging. Default: false.",
      "property_order": 381,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: DebugMode"
      }
    },
    "TelemetryEnabled": {
      "title": "Anonymous usage data \u203a Send anonymous usage data",
      "description": "When true, the app sends anonymous TelemetryDeck signals for update checks, the number of applications a finished patch updated, and diagnostic bundle creation. A background pass and a patch started from the app are counted separately. The number is a numeric value, not an app name. Signals do not include app names, user names, paths, or serial numbers. A launch does not send its own signal. Only the App Auto-Patch app sends signals; the root helper and XPC service do not. Set false to turn this off. The Settings toggle is disabled while this key is managed. Default: true.",
      "property_order": 390,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: TelemetryEnabled"
      }
    },
    "ShowMenuBarIcon": {
      "title": "Menu Bar \u203a Show menu bar icon",
      "description": "When true, App Auto-Patch shows its menu bar icon. Set false to hide it. Default: true.",
      "property_order": 400,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: ShowMenuBarIcon"
      }
    },
    "MenuBarConcealAdvancedActions": {
      "title": "Menu Bar \u203a Conceal Settings and Quit (managed only)",
      "description": "When true, the Settings\u2026 and Quit App Auto-Patch rows in the menu bar menu are hidden until the user holds Option. If this key isn't in the profile, it is true on a Mac whose profile sets other common App Auto-Patch keys (such as IgnoredLabels, InstallomatorOptions, the deadline keys or the SupportTeam keys) and false on an unmanaged Mac. A value set locally on the Mac applies when the profile doesn't set this key. Deploy false to always show both rows.",
      "property_order": 401,
      "type": "boolean",
      "options": {
        "infoText": "Key: MenuBarConcealAdvancedActions"
      }
    },
    "MenuBarHideQuit": {
      "title": "Menu Bar \u203a Hide Quit (managed only)",
      "description": "When true, the Quit App Auto-Patch row is removed from the menu bar menu, even when Option is held. Default: false.",
      "property_order": 402,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: MenuBarHideQuit"
      }
    },
    "OpenAtLogin": {
      "title": "Startup \u203a Open at login",
      "description": "When true, App Auto-Patch writes a per-user LaunchAgent that starts the app at login. Quitting the app leaves it quit until the next login. The Settings toggle is disabled while this key is managed, while LockSettings is true, or while /Library/LaunchAgents/xyz.techitout.appAutoPatch.agent.plist is installed. Do not deploy that LaunchAgent and this key together; the installed LaunchAgent stays in charge and the app removes its own agent. Default: false.",
      "property_order": 403,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: OpenAtLogin"
      }
    },
    "KeepAlive": {
      "title": "Startup \u203a Keep running if quit",
      "description": "When true, App Auto-Patch writes a per-user LaunchAgent that starts the app again if the user quits it. That also starts the app at login. The Settings toggle is disabled while this key is managed, while LockSettings is true, or while /Library/LaunchAgents/xyz.techitout.appAutoPatch.agent.plist is installed. Do not deploy that LaunchAgent and this key together; the installed LaunchAgent stays in charge and the app removes its own agent. Default: false.",
      "property_order": 404,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: KeepAlive"
      }
    },
    "SupportTeamName": {
      "title": "Support \u203a Team",
      "description": "Support team name shown on the About tab and in the \u201cmanaged by your organization\u201d banner in Settings. Set it to hide, or leave it unset, to omit it. Default: unset.",
      "property_order": 410,
      "type": "string",
      "options": {
        "infoText": "Key: SupportTeamName"
      }
    },
    "SupportTeamPhone": {
      "title": "Support \u203a Phone",
      "description": "Support phone number shown on the About tab. Set it to hide, or leave it unset, to omit it. Default: unset.",
      "property_order": 411,
      "type": "string",
      "options": {
        "infoText": "Key: SupportTeamPhone"
      }
    },
    "SupportTeamEmail": {
      "title": "Support \u203a Email",
      "description": "Support email address shown on the About tab. Set it to hide, or leave it unset, to omit it. Default: unset.",
      "property_order": 412,
      "type": "string",
      "options": {
        "infoText": "Key: SupportTeamEmail"
      }
    },
    "SupportTeamWebsite": {
      "title": "Support \u203a Website",
      "description": "Support website shown as a link on the About tab and opened by Help \u203a App Auto-Patch Help. Set it to hide, or leave it unset, to omit it; Help then opens the App Auto-Patch GitHub page. Default: unset.",
      "property_order": 413,
      "type": "string",
      "options": {
        "infoText": "Key: SupportTeamWebsite"
      }
    },
    "LockSettings": {
      "title": "Managed Only \u203a Lock settings",
      "description": "When true, Settings can't be saved and its controls are disabled, including options that have no managed key of their own. Exceptions: the Version Comparison controls still respond but changes can't be saved; the Admin Test Mode panel (shown only when AdminTestModeEnabled is true) stays fully usable and its actions apply immediately; the About tab keeps its links and the Generate Diagnostic Bundle button. Default: false.",
      "property_order": 500,
      "type": "boolean",
      "default": false,
      "options": {
        "infoText": "Key: LockSettings"
      }
    },
    "ManagedSilentLaunchEnabled": {
      "title": "Managed Only \u203a Silent launch",
      "description": "When true, App Auto-Patch launches without a Dock icon and closes the dashboard window, leaving the menu bar icon and notifications. If this key isn't in the profile, it is true on a Mac whose profile sets other common App Auto-Patch keys (such as IgnoredLabels, InstallomatorOptions, the deadline keys or the SupportTeam keys) and false on an unmanaged Mac. Deploy false to keep the dashboard visible on managed Macs. To start App Auto-Patch at login, set OpenAtLogin, or deploy the LaunchAgent in MDM-LaunchAgent.md. Do not do both.",
      "property_order": 501,
      "type": "boolean",
      "options": {
        "infoText": "Key: ManagedSilentLaunchEnabled"
      }
    },
    "ZoomCallActiveCheck": {
      "title": "Managed Only \u203a Skip Zoom labels during an active call",
      "description": "When true, Zoom labels aren't installed while a Zoom call is active. Default: true.",
      "property_order": 502,
      "type": "boolean",
      "default": true,
      "options": {
        "infoText": "Key: ZoomCallActiveCheck"
      }
    },
    "AppTitle": {
      "title": "Managed Only \u203a Display name",
      "description": "Replaces the visible name \"App Auto-Patch\" in the dashboard window title, menu bar, notifications, and other on-screen text. A blank or missing value uses App Auto-Patch. This does not rename App Auto-Patch.app or the helper executables, and there is no Settings control. Default: App Auto-Patch.",
      "property_order": 503,
      "type": "string",
      "default": "App Auto-Patch",
      "options": {
        "infoText": "Key: AppTitle"
      }
    }
  }
}
