Authentication and Configuration
Package-based AI Watch uses one organization API key for scans, hooks, sessions, and macOS updates. The key is written by the macOS Configuration Profile (OrgApiKey) or Windows MSI property (AIWATCH_ORG_API_KEY) and read by the installed aiwatch binary.
runlayer scan workflows can still use interactive login credentials or a stored organization API key. Legacy enrollment keys only apply to older non-package auto-provisioning flows.
The AI Watch organization API key is tenant-scoped: it is not tied to a user, cannot impersonate one, and is blocked from policy-based access control. On the backend it is stored only as an HMAC-SHA256 hash — the plaintext is shown once at creation and cannot be retrieved later, so if it is lost, regenerate the configuration to mint a new one.
Interpreting Discovery Results
User appears in the Shadow report for MCP servers they say they never used
User appears in the Shadow report for MCP servers they say they never used
- Project-level config in a cloned repo. A
.cursor/mcp.json,.vscode/mcp.json,.mcp.json,.codex/config.toml, or similar checked into a shared repo is discovered on every developer who clones it. The config is attributed to the OS user who ran the scan on that machine. - Stale or experimental config. The user added the server to a client config file once (e.g. trying it out, copy-pasting from a blog), never invoked it, and forgot it was still there.
- Shared device. Another OS account on the same workstation configured the MCP, but the scan ran under a different OS account that resolves to this Runlayer user.
- Username resolution mismatch. Tiered matching can link a device’s OS username to the wrong Runlayer user. See User and Identity Mapping, then fix via Settings → MDM Configuration → Unresolved usernames and re-analyze.
- Click the shadow artifact row in the Shadow page to open the detail drawer.
- The detail includes the device hostname, device id, the MCP server’s
command/args/url, and any project paths where the config was found. - If a project path is listed, the discovery came from a project-level config file. Open that repo and inspect the checked-in MCP config to confirm.
- If no project path is listed, the discovery came from a global client config. On the listed device, inspect the relevant client config (e.g.
~/Library/Application Support/Claude/claude_desktop_config.json,~/.cursor/mcp.json,~/.codex/config.toml). - To clear the discovery, remove the entry from the offending config file (or uninstall the project) and the next scan will drop it from the inventory.
A skill is flagged High or Medium risk but is legitimate
A skill is flagged High or Medium risk but is legitimate
- Open the skill’s row in Shadow → Skills to read the analyzed instructions and see why it was flagged.
- If the skill is sanctioned, bring it under management by publishing it through Runlayer — managed skills are classified Managed instead of Shadow. See Responding to Discoveries.
- After the skill’s content or management status changes, re-analyze to refresh its classification and risk level.
Package Issues
No devices appearing in the Shadow dashboard
No devices appearing in the Shadow dashboard
- Confirm the package is installed:
- Confirm managed configuration is present:
- Trigger one scan manually from the device:
- Confirm network connectivity from the device to your Runlayer host.
macOS scan agent is not running
macOS scan agent is not running
- Confirm the bundled LaunchAgent exists:
- Check whether launchd loaded it for the logged-in user:
- Kickstart it once:
- Inspect the unified log:
`aiwatch: host not configured` on macOS
`aiwatch: host not configured` on macOS
Host / OrgApiKey into managed preferences.Resolution:- Check managed preferences:
- If the file is empty or missing, force an MDM sync from the device or wait for the next check-in.
- Confirm the profile targets the same device group as the
.pkg.
log show --predicate 'process == "aiwatch"' returns nothing
log show --predicate 'process == "aiwatch"' returns nothing
- Check whether launchd loaded the agent for the logged-in user:
- If launchd returns
Could not find service, re-deploy the.pkg; the postinstall may not have bootstrapped the agent. - If the agent is loaded, wait one
StartIntervaltick (default 15 minutes) or seed output with: - For durable logs, collect unified logs with
log collector forward them to your SIEM. macOS retains unified logs for roughly 24 hours to a few days depending on device log volume.
Users see 'Background Item Added' notification on first login after install
Users see 'Background Item Added' notification on first login after install
- Confirm
com.runlayer.aiwatch.loginitems.mobileconfigis deployed to the device. - After MDM sync, verify Background Task Management state:
- Expect the agent to show
Disposition: enabled allowed visible.
macOS package blocked by Gatekeeper
macOS package blocked by Gatekeeper
.pkg is not signed, not notarized, or is not the official CI-built release artifact.Resolution:- Verify the package signature and notarization:
- Expected output includes
status: signed by a developer certificate issued by Appleandsource=Notarized Developer ID. - Official GitHub Release builds are signed and notarized by Anysource Inc. with Developer ID team
AF2M8HC7A2.
Windows scans are not running
Windows scans are not running
- Confirm the app installed
aiwatch.exeunderC:\Program Files\Runlayer\AIWatch\. - Confirm the hidden
\Runlayertask folder and theAIWatchScantask exist:The task-registration action gates on theOrgApiKeyregistry value — if there are no tasks, confirmGet-ItemProperty "HKLM:\Software\Runlayer\AIWatch"showsOrgApiKey, then repair/reinstall the app. - Check the
AIWatchScantask’s last result and the per-profile scan outcomes. The single SYSTEM task runsaiwatch.exe scan --all-usersand scans each real profile in a child process; a never-signed-in user has no profile yet and is picked up on the next tick (logon / boot / 15 min): - Check the task-registration lines (tagged
[register]) inC:\ProgramData\Runlayer\Logs\scheduled-task.log. - Run a one-off scan as the logged-in user:
Hook configs are not installed or drifted
Hook configs are not installed or drifted
- Confirm Enforce or Sessions is enabled. If both are disabled, AI Watch is Detect-only and no hooks are installed.
- Check hook config compliance:
- On macOS, confirm the bootstrap daemon is loaded:
- On Windows, confirm the device-local
AIWatchHookstask (SYSTEM) is running:Get-ScheduledTaskInfo -TaskPath "\Runlayer\" -TaskName "AIWatchHooks" | Select-Object LastRunTime, LastTaskResult. Force a run withStart-ScheduledTask -TaskPath "\Runlayer\" -TaskName "AIWatchHooks", or repair/reinstall the app if it’s missing. - Restart Cursor, VS Code, Claude Code, Codex, or Hermes after hook configs change.
Hooks are installed but not blocking
Hooks are installed but not blocking
- Confirm
Enforcementis enabled: Enforcement=false,AIWATCH_ENFORCEMENT=0, or an absent enforcement key is monitoring-only. Hooks may still forward Sessions telemetry, but they do not block.- Re-push the configuration with
Enforcement=true/AIWATCH_ENFORCEMENT=1. - Restart the AI client so it reloads hook config.
Scan or hook fails behind a corporate TLS inspection proxy
Scan or hook fails behind a corporate TLS inspection proxy
aiwatch binary trust the OS trust store automatically, but scans and hooks can fail if that private CA is not installed in system trust.Resolution:- Prefer installing the corporate root CA into the OS trust store through MDM.
- For debugging or one-off deployments, pass a PEM bundle explicitly:
- For custom CLI workflows, set
RUNLAYER_CA_BUNDLE. The CLI also honorsSSL_CERT_FILEandREQUESTS_CA_BUNDLEas fallbacks. - Ask the security team to exempt the Runlayer tenant hostname from TLS inspection, such as
*.runlayer.comor customer-managed hostnames likerunlayer.dev.company.comjust like they do for other security products like endpoint detection and response (EDR).
runlayer: command not found after install
runlayer: command not found after install
uv tool install runlayer places the binary in ~/.local/bin (macOS/Linux) or %USERPROFILE%\.local\bin (Windows), which may not be in your shell’s PATH yet.Resolution:- Restart your terminal (new shells pick up the updated PATH)
- Or run
uv tool update-shellto add~/.local/binto your shell profile, thenexec $SHELL -l(or open a new terminal) - Verify:
which runlayer(macOS/Linux) orwhere runlayer(Windows)
Users see macOS consent dialogs for AI Watch
Users see macOS consent dialogs for AI Watch
aiwatch for directories like Desktop, Documents, or Downloads.Cause: The AI Watch PPPC profile was not deployed before the package ran, so macOS falls back to interactive consent prompts. This can also happen if a device is not enrolled via User-Approved MDM or Automated Device Enrollment.Resolution:- Deploy
com.runlayer.aiwatch.pppc.mobileconfigvia your MDM. - Re-deploying the PPPC profile restores access even if a user clicked “Don’t Allow”.
- Ensure devices are enrolled via User-Approved MDM or Automated Device Enrollment (required for MDM-managed PPPC profiles to take effect)
- Verify the profile is installed:
- Re-run the scan after the profile is applied
Scan finds fewer MCP servers than expected on macOS
Scan finds fewer MCP servers than expected on macOS
- Deploy the AI Watch PPPC profile to grant Full Disk Access to
/usr/local/lib/runlayer/aiwatch/aiwatch. - Ensure devices are enrolled via User-Approved MDM or Automated Device Enrollment
- Verify the profile is installed:
profiles show -type configuration | grep aiwatch - Check TCC denials:
Look for
Prompting policy ... Denylines. TCC PPPC payloads are ignored on manually enrolled MDM devices. - Verify the package binary is installed and signed correctly:
- Re-run the scan after the PPPC profile is applied
PPPC profile applied but TCC still denies AI Watch
PPPC profile applied but TCC still denies AI Watch
com.runlayer.aiwatch and Developer ID team AF2M8HC7A2 (Anysource Inc.). Custom, local, or ad-hoc signed builds do not satisfy that requirement, so TCC falls back to deny.Resolution:- Verify the installed binary:
- Expected output:
- If the team identifier or identifier do not match, confirm with your Runlayer account team that the
.pkgyou deployed is the official signed and notarized build from the GitHub Release.
Legacy runlayer-scan artifacts still appear
Legacy runlayer-scan artifacts still appear
/usr/local/bin/runlayer-scan, com.runlayer.scan, or com.runlayer.scan.pppc.Resolution: Follow Legacy macOS Detect Cleanup. For full package removal, use Remove AI Watch.Log Locations and Checks
Exit Codes
scan that finds no MCP servers, skills, or plugins exits 0 (nothing to submit). Servers, skills, and plugins are submitted independently, so a failure in one category does not block the others; if any found item cannot be stored the scan exits nonzero (2 or 3). Best-effort check-ins (detect, enforce, sessions) never change the exit code. Any nonzero scan exit surfaces in the AIWatchScan task’s LastTaskResult (Windows) / the launchd job log (macOS), so a scan that ran but persisted nothing is not reported as a silent green.
Verifying PPPC Profile Deployment
After deploying the AI Watch PPPC profile, verify it is installed on target devices:Verifying Package Binary
Verify the package binary is properly installed and signed:Identifier=com.runlayer.aiwatch, which matches the AI Watch PPPC profile.
Related Resources
User and Identity Mapping
FAQ
Remove AI Watch
Getting Help
If you continue to experience issues:- Collect the relevant log files from the affected device
- Note the HTTP status codes and error messages
- Contact Runlayer support with the collected information