Authentication and Configuration
Package-based AI Watch uses one organization API key for scans, hooks, sessions, and managed updates on every supported platform. The installedaiwatch binary reads it from the macOS Configuration Profile (OrgApiKey), the Windows MSI property (AIWATCH_ORG_API_KEY), or Linux’s root-only /etc/runlayer/aiwatch/credentials file (RUNLAYER_API_KEY).
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 does not grant dashboard or policy access. In
Runlayer it is stored only as a one-way 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.
Built-in diagnostic commands
AI Watch packages ship a small set of operator commands that cover most on-device checks. Use the installed binary path:/usr/local/bin/aiwatch on macOS, C:\Program Files\Runlayer\AIWatch\aiwatch.exe on Windows.
aiwatch config show is the fastest way to answer “what settings is this device actually using?” — it shows the effective Mode, Sessions, and detection options after the settings sync, plus the tenant host and a redacted key suffix.
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. Username matching can link a device’s OS username to the wrong Runlayer user. See User and Identity Mapping, then fix via Settings → User mapping and re-analyze.
- Click the shadow artifact row on the Shadow AI page’s Details tab 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 AI → 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 on the Shadow AI page
No devices appearing on the Shadow AI page
- 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.mobileconfig(which carries the Login Items payload;com.runlayer.aiwatch.loginitems.mobileconfigon fleets still running the older split profiles) is 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 signed AI Watch package from Runlayer.Resolution:- Verify the package signature and notarization:
- Expected output includes
status: signed by a developer certificate issued by Appleandsource=Notarized Developer ID. - Official packages downloaded from Settings → MDM configuration 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 Mode is Protect/Enforce, Sessions is enabled, or Track MCP tool usage without content is enabled. Monitor with Sessions disabled and that setting off is Detect-only and installs no hooks.
- 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 the AI client after hook configs change — Cursor, VS Code, Claude Code, GitHub Copilot CLI, Gemini CLI, Grok CLI, Cline CLI, Codex, Qwen Code, Hermes, Windsurf, and Goose all read hook configs only at process start.
Hooks are installed but not blocking
Hooks are installed but not blocking
- Confirm the deployment’s effective settings with
aiwatch config show— it prints the resolved Mode, Sessions, and detection options, and whether a valid settings snapshot is cached. To inspect the raw snapshot instead: Mode=monitoris report-only. Protect applies scanner decisions plus fail-open, allow-unless-denied MCP source governance. Enforce adds local-tool controls and fail-closed, deny-by-default MCP source governance, while managed MCP calls scan at the gateway.- Check whether the “missed” call was allowed by policy rather than missed by the hook:
- The user is on the exemption list under Settings → Tool governance → Exempt users. Exempted users’ violations are still recorded and alerted, but the call proceeds.
- The MCP server is managed through Runlayer or matches an allowlist entry, so source governance allows it by design.
- For built-in tool blocking, the tool’s behavior type (shell/terminal, file read, file write) is not toggled on in the Enforce policy — types you have not enabled are allowed by default.
- The matching scanner’s action is Alert rather than Block, which records a finding without stopping the call.
- Change Mode from Settings → AI Watch → Manage settings, then wait for the hourly hook reconcile or run
aiwatch config syncto apply it immediately. Re-push MDM policy only when changing the fallback or another MDM-owned value. - Restart the AI client so it reloads hook config.
The browser extension does not appear in Chrome or Firefox
The browser extension does not appear in Chrome or Firefox
chrome://extensions or about:addons.Resolution:- The extension is installed by the hourly hook reconcile. Rerun it immediately as an administrator instead of waiting:
- Fully quit and reopen the browser — Chrome and Firefox apply managed extension policy at startup.
- Confirm the device runs AI Watch
0.29.6or newer and appears in Shadow AI → Devices. - See Browser extension for session-collection and blocking issues once the extension is installed.
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 payload 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.mobileconfig(which carries the PPPC payload;com.runlayer.aiwatch.pppc.mobileconfigon fleets still running the older split profiles) via your MDM. - Re-deploying the 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, re-download the official signed and notarized
.pkgfrom Settings → MDM configuration and re-deploy it. Contact your Runlayer account team if you suspect the deployed build was tampered with.
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). 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