Project services: installed services whose config path matches the current config
Other installed services: services that point at some other config path
Project service failures affect the overall pass/fail result. Other installed services that are healthy (config file still exists) are shown for visibility, and their running-state failures are informational only.Orphaned services — installed services whose embedded --config path no longer exists on disk — are flagged as errors and contribute to doctor’s overall error count. These accumulate when project directories are deleted or moved. Run cordon service cleanup to review and remove them.If ./cordon.toml is missing and exactly one installed service exists, cordon doctor inspects that service automatically. If multiple installed services exist, re-run with --config for the target config.
On Linux, if any routes use source: keyring, doctor checks whether a D-Bus session bus is available — either via DBUS_SESSION_BUS_ADDRESS or the systemd user bus socket ($XDG_RUNTIME_DIR/bus). This detects environments where the Secret Service provider is unreachable (containers, CI, SSH, headless servers) before you hit a runtime error.
Doctor probes the plausible agent skill install locations for each integration: both project-scope and user-scope paths for claude-code and codex, the single ~/.hermes/skills/devops/cordon/SKILL.md path for hermes. OpenClaw skills are not currently probed. Only actually-installed skills are checked — missing files are silently skipped, so integrations you haven’t set up won’t appear.For each installed skill file, doctor verifies:
The file is a regular file (not a symlink or directory)
Content matches the expected version embedded in the binary
Permissions are 0444 (read-only)
A content mismatch or incorrect permissions produces a warning with a cordon setup <integration> remediation hint.
After diagnostics finish, cordon doctor records a best-effort telemetry event bucketed by result: doctor_ok, doctor_warning, or doctor_error. This helps identify whether users are running into setup trouble without sending individual check messages, config paths, service names, routes, or credential data. Doctor sends an existing install ID when one is already present, but it does not create the install ID before the first cordon start install event. See Telemetry and update checks for the full list of collection points and opt-outs.
cordon doctor ✓ Config: /home/user/my-project/cordon.toml ✓ CA certificate: /home/user/.config/cordon/projects/.../ca-cert.pem ✓ CA key: /home/user/.config/cordon/projects/.../ca-key.pem ✓ CA certificate is valid PEM and not expired ✓ CA is in system trust store ✓ Port 8432: available ✓ Service 'my-project': running (PID 12345, launchd (io.codezero.cordon.my-project)) ✓ Secret providers: not configured (resolved on-demand) ✓ Service 'my-project': PATH is current ✓ Token enforcement: active (1 token(s) configured) ✓ Agent skill (claude-code): /home/user/my-project/.claude/skills/cordon/SKILL.md — up to dateOther installed services: ✓ Service 'hermes': running (PID 67890, launchd (io.codezero.cordon.hermes), config: /path/to/hermes/cordon.toml) ✓ Service 'hermes': PATH is current11 passed · 0 warnings · 0 errors
The port shown above is illustrative. Run cordon status to see the port allocated for the selected config.
Run cordon doctor as the first troubleshooting step when something isn’t working.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Cordon","colors":{"primary":"#D05C29","light":"#E8712F","dark":"#D05C29"},"logo":{"light":"https://mintcdn.com/codezero/oQtJQj8YChzXSXBb/logo/light.svg?fit=max\u0026auto=format\u0026n=oQtJQj8YChzXSXBb\u0026q=85\u0026s=07fdceef1809b3f17d997c4c5834c640","dark":"https://mintcdn.com/codezero/oQtJQj8YChzXSXBb/logo/dark.svg?fit=max\u0026auto=format\u0026n=oQtJQj8YChzXSXBb\u0026q=85\u0026s=4b8c7e011d2e42c74dcb85758e314b46"},"favicon":"https://mintcdn.com/codezero/8Qb50bdEbTbM91Gi/favicon.ico?fit=max\u0026auto=format\u0026n=8Qb50bdEbTbM91Gi\u0026q=85\u0026s=81f15120a7e36c866b0bc129c0bab724","integrations":{"ga4":{"measurementId":"G-2DXS90S7DY"},"posthog":{"apiKey":"phc_oX8BjqYf4ogcL2rNH5WLb8vLQgWCJScbhtwBTxyqabpR","sessionRecording":true}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Changelog","href":"https://codezero.io/changelog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"codezero","hasAudioNarration":false,"actualSubdomain":"codezero","customDomains":["docs.codezero.io"],"gitSource":{"type":"github","owner":"codezero-io","repo":"cordon","deployBranch":"docs","contentDirectory":"developer-docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adeb1fbb7bed53c17af79c6","collectionId":"fc89aba8-587d-4b12-b673-fd2c06eb6f19","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adeb1fbb7bed53c17af79c6"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adeb1fbb7bed53c17af79c6","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"CLI Reference","count":16},{"language":"default","tag":"Guides","count":11},{"language":"default","tag":"Configuration","count":5},{"language":"default","tag":"Getting Started","count":4},{"language":"default","tag":"Security","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"cli/doctor","slug":"/cli/doctor","pageMetadata":{"title":"cordon doctor","description":"Diagnose common setup issues.","href":"/cli/doctor"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Diagnose common setup issues.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Runs a series of checks to diagnose common setup problems.`}),`\n`,_jsx(Heading,{level:`2`,id:`usage`,children:`Usage`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`cordon`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` doctor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [--config `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`PATH`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` --scope`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` project`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`|`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`user]`})]}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Option`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`--config`}),`, `,_jsx(_components.code,{children:`-c`})]}),_jsxs(_components.td,{children:[`Path to config file. Mutually exclusive with `,_jsx(_components.code,{children:`--scope`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--scope`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`project`}),` or `,_jsx(_components.code,{children:`user`}),`; selects which config file to inspect. Mutually exclusive with `,_jsx(_components.code,{children:`--config`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`checks-performed`,children:`Checks performed`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Check`}),_jsx(_components.th,{children:`What it verifies`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Config validity`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`cordon.toml`}),` parses and validates correctly`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cert paths`}),_jsx(_components.td,{children:`CA cert and key files exist at configured paths`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cert expiry`}),_jsx(_components.td,{children:`CA certificate is not expired`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Trust store`}),_jsx(_components.td,{children:`CA is trusted in the system trust store`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Port availability`}),_jsx(_components.td,{children:`Configured listen port is available`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Service status`}),_jsx(_components.td,{children:`Background service is running (if installed)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OS keyring session (Linux)`}),_jsx(_components.td,{children:`D-Bus session bus is available for keyring secrets`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Secret providers`}),_jsx(_components.td,{children:`Configured secret providers are detected`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Service PATH (macOS)`}),_jsx(_components.td,{children:`Background service PATH matches current session`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Token enforcement`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`tokens.toml`}),` exists and contains valid tokens for the scope`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Agent skill freshness`}),_jsx(_components.td,{children:`Installed agent skill files match expected content and permissions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Stale service binary`}),_jsx(_components.td,{children:`Running service is older than the installed binary (shows restart command)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Go tool network isolation (macOS)`}),_jsxs(_components.td,{children:[`Go-based tools (e.g. `,_jsx(_components.code,{children:`gh`}),`, `,_jsx(_components.code,{children:`terraform`}),`, `,_jsx(_components.code,{children:`kubectl`}),`) have the network-isolation setting needed to route through Cordon`]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`installed-services`,children:`Installed services`}),`\n`,_jsx(_components.p,{children:`Doctor partitions installed services into:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Project services`}),`: installed services whose config path matches the current config`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Other installed services`}),`: services that point at some other config path`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Project service failures affect the overall pass/fail result. Other installed services that are healthy (config file still exists) are shown for visibility, and their running-state failures are informational only.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Orphaned services`}),` — installed services whose embedded `,_jsx(_components.code,{children:`--config`}),` path no longer exists on disk — are flagged as errors and contribute to doctor’s overall error count. These accumulate when project directories are deleted or moved. Run `,_jsx(_components.a,{href:`/cli/service#cordon-service-cleanup`,children:_jsx(_components.code,{children:`cordon service cleanup`})}),` to review and remove them.`]}),`\n`,_jsxs(_components.p,{children:[`If `,_jsx(_components.code,{children:`./cordon.toml`}),` is missing and exactly one installed service exists, `,_jsx(_components.code,{children:`cordon doctor`}),` inspects that service automatically. If multiple installed services exist, re-run with `,_jsx(_components.code,{children:`--config`}),` for the target config.`]}),`\n`,_jsx(Heading,{level:`3`,id:`linux-keyring-session-check`,children:`Linux keyring session check`}),`\n`,_jsxs(_components.p,{children:[`On Linux, if any routes use `,_jsx(_components.code,{children:`source: keyring`}),`, doctor checks whether a D-Bus session bus is available — either via `,_jsx(_components.code,{children:`DBUS_SESSION_BUS_ADDRESS`}),` or the systemd user bus socket (`,_jsx(_components.code,{children:`$XDG_RUNTIME_DIR/bus`}),`). This detects environments where the Secret Service provider is unreachable (containers, CI, SSH, headless servers) before you hit a runtime error.`]}),`\n`,_jsx(Heading,{level:`3`,id:`agent-skill-freshness`,children:`Agent skill freshness`}),`\n`,_jsxs(_components.p,{children:[`Doctor probes the plausible agent skill install locations for each integration: both project-scope and user-scope paths for `,_jsx(_components.code,{children:`claude-code`}),` and `,_jsx(_components.code,{children:`codex`}),`, the single `,_jsx(_components.code,{children:`~/.hermes/skills/devops/cordon/SKILL.md`}),` path for `,_jsx(_components.code,{children:`hermes`}),`. OpenClaw skills are not currently probed. Only actually-installed skills are checked — missing files are silently skipped, so integrations you haven’t set up won’t appear.`]}),`\n`,_jsx(_components.p,{children:`For each installed skill file, doctor verifies:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The file is a regular file (not a symlink or directory)`}),`\n`,_jsx(_components.li,{children:`Content matches the expected version embedded in the binary`}),`\n`,_jsxs(_components.li,{children:[`Permissions are `,_jsx(_components.code,{children:`0444`}),` (read-only)`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A content mismatch or incorrect permissions produces a warning with a `,_jsx(_components.code,{children:`cordon setup \u003cintegration>`}),` remediation hint.`]}),`\n`,_jsx(Heading,{level:`2`,id:`telemetry`,children:`Telemetry`}),`\n`,_jsxs(_components.p,{children:[`After diagnostics finish, `,_jsx(_components.code,{children:`cordon doctor`}),` records a best-effort telemetry event bucketed by result: `,_jsx(_components.code,{children:`doctor_ok`}),`, `,_jsx(_components.code,{children:`doctor_warning`}),`, or `,_jsx(_components.code,{children:`doctor_error`}),`. This helps identify whether users are running into setup trouble without sending individual check messages, config paths, service names, routes, or credential data. Doctor sends an existing install ID when one is already present, but it does not create the install ID before the first `,_jsx(_components.code,{children:`cordon start`}),` install event. See `,_jsx(_components.a,{href:`/security/overview#telemetry-and-update-checks`,children:`Telemetry and update checks`}),` for the full list of collection points and opt-outs.`]}),`\n`,_jsx(Heading,{level:`2`,id:`example-output`,children:`Example output`}),`\n`,_jsx(CodeBlock,{numberOfLines:`20`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`20`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`cordon doctor`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Config: /home/user/my-project/cordon.toml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ CA certificate: /home/user/.config/cordon/projects/.../ca-cert.pem`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ CA key: /home/user/.config/cordon/projects/.../ca-key.pem`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ CA certificate is valid PEM and not expired`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ CA is in system trust store`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Port 8432: available`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Service 'my-project': running (PID 12345, launchd (io.codezero.cordon.my-project))`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Secret providers: not configured (resolved on-demand)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Service 'my-project': PATH is current`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Token enforcement: active (1 token(s) configured)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Agent skill (claude-code): /home/user/my-project/.claude/skills/cordon/SKILL.md — up to date`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Other installed services:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Service 'hermes': running (PID 67890, launchd (io.codezero.cordon.hermes), config: /path/to/hermes/cordon.toml)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Service 'hermes': PATH is current`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`11 passed · 0 warnings · 0 errors`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The port shown above is illustrative. Run `,_jsx(_components.code,{children:`cordon status`}),` to see the port allocated for the selected config.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Run `,_jsx(_components.code,{children:`cordon doctor`}),` as the first troubleshooting step when something isn’t working.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"cordon doctor","description":"Diagnose common setup issues.","href":"/cli/doctor"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Usage","slug":"usage","depth":2,"children":[]},{"title":"Checks performed","slug":"checks-performed","depth":2,"children":[{"title":"Installed services","slug":"installed-services","depth":3,"children":[]},{"title":"Linux keyring session check","slug":"linux-keyring-session-check","depth":3,"children":[]},{"title":"Agent skill freshness","slug":"agent-skill-freshness","depth":3,"children":[]}]},{"title":"Telemetry","slug":"telemetry","depth":2,"children":[]},{"title":"Example output","slug":"example-output","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"codezero","siteName":"Cordon","title":"cordon doctor - Cordon","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-08T18:12:22.726Z","originalFileLocation":"cli/doctor.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Diagnose common setup issues.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Cordon\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"cordon doctor - Cordon\">\u003cmeta data-mint-head property=\"og:description\" content=\"Diagnose common setup issues.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Cordon\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.codezero.io/cli/doctor\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://codezero.mintlify.app/_mintlify/api/og/v2?division=CLI+Reference\u0026amp;title=cordon+doctor\u0026amp;description=Diagnose+common+setup+issues.\u0026amp;theme=84a94c06642e416e1f593acf\u0026amp;signature=6b5fede33f36c6854c3617804f4450c232668201902be20d3c1c70ef5d83718f\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"cordon doctor - Cordon\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Diagnose common setup issues.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://codezero.mintlify.app/_mintlify/api/og/v2?division=CLI+Reference\u0026amp;title=cordon+doctor\u0026amp;description=Diagnose+common+setup+issues.\u0026amp;theme=84a94c06642e416e1f593acf\u0026amp;signature=6b5fede33f36c6854c3617804f4450c232668201902be20d3c1c70ef5d83718f\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/codezero/1Hvzh0b0AfKeF4Xm/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Cordon\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#D05C29\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.codezero.io/cli/doctor\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/cli/doctor.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.codezero.io/#organization\",\"name\":\"Cordon\",\"url\":\"https://docs.codezero.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/codezero/oQtJQj8YChzXSXBb/logo/light.svg?fit=max\u0026auto=format\u0026n=oQtJQj8YChzXSXBb\u0026q=85\u0026s=07fdceef1809b3f17d997c4c5834c640\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.codezero.io#website\",\"name\":\"Cordon\",\"url\":\"https://docs.codezero.io\",\"publisher\":{\"@id\":\"https://docs.codezero.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.codezero.io/cli/doctor#webpage\",\"url\":\"https://docs.codezero.io/cli/doctor\",\"name\":\"cordon doctor\",\"description\":\"Diagnose common setup issues.\",\"dateModified\":\"2026-07-08T18:12:22.726Z\",\"isPartOf\":{\"@id\":\"https://docs.codezero.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.codezero.io/cli/doctor#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.codezero.io/cli/doctor#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"CLI Reference\",\"item\":\"https://docs.codezero.io/cli/start\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"cordon doctor\",\"item\":\"https://docs.codezero.io/cli/doctor\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.codezero.io/cli/doctor#article\",\"headline\":\"cordon doctor\",\"name\":\"cordon doctor\",\"description\":\"Diagnose common setup issues.\",\"url\":\"https://docs.codezero.io/cli/doctor\",\"mainEntityOfPage\":{\"@id\":\"https://docs.codezero.io/cli/doctor#webpage\"},\"dateModified\":\"2026-07-08T18:12:22.726Z\",\"publisher\":{\"@id\":\"https://docs.codezero.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.codezero.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Cordon\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Cordon","nav":{"global":{"anchors":[{"anchor":"Changelog","href":"https://codezero.io/changelog"}]},"groups":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Installation","href":"/installation"},{"title":"Quickstart","href":"/quickstart"},{"title":"Support","href":"/support"},{"title":"Developer License Agreement","hidden":true,"href":"/license"}]},{"group":"Configuration","pages":[{"title":"Configuration Overview","href":"/configuration/overview"},{"title":"Routes","href":"/configuration/routes"},{"title":"Listeners","href":"/configuration/listeners"},{"title":"Secret Sources","href":"/configuration/secret-sources"},{"title":"TLS","href":"/configuration/tls"}]},{"group":"Guides","pages":[{"title":"1Password","href":"/guides/onepassword"},{"title":"Claude Code","href":"/guides/claude-code"},{"title":"Codex","href":"/guides/codex"},{"title":"Hermes Agent","href":"/guides/hermes"},{"title":"OpenClaw","href":"/guides/openclaw"},{"title":"Any tool (generic)","href":"/guides/generic"},{"title":"Proxy Tokens","href":"/guides/token-migration"},{"title":"MCP Servers","href":"/guides/mcp-servers"},{"title":"Database Connections","href":"/guides/databases"},{"title":"Process Management","href":"/guides/process-management"},{"title":"SDK Compatibility","href":"/guides/sdk-compatibility"}]},{"group":"CLI Reference","pages":[{"title":"cordon start","href":"/cli/start"},{"title":"cordon setup","href":"/cli/setup"},{"title":"cordon integration","href":"/cli/integration"},{"title":"cordon env","href":"/cli/env"},{"title":"cordon token","href":"/cli/token"},{"title":"cordon route","href":"/cli/route"},{"title":"cordon listener","description":"Add, edit, list, show, and remove PostgreSQL listeners in cordon.toml.","href":"/cli/listener"},{"title":"cordon doctor","href":"/cli/doctor"},{"title":"cordon trust / untrust","description":"Manage the CA certificate in the system trust store.","href":"/cli/trust"},{"title":"cordon wait","href":"/cli/wait"},{"title":"cordon status","href":"/cli/status"},{"title":"cordon stop","href":"/cli/stop"},{"title":"cordon service","href":"/cli/service"},{"title":"cordon secret","href":"/cli/secret"},{"title":"cordon upgrade","href":"/cli/upgrade"},{"title":"cordon help","href":"/cli/help"}]},{"group":"Security","pages":[{"title":"October 2026 security upgrade","href":"/security/october-2026-upgrade"},{"title":"Security Model","href":"/security/overview"},{"title":"Threat Model","href":"/security/threat-model"},{"title":"OWASP Risk Coverage","href":"/security/owasp"}]}]},"title":"cordon doctor - Cordon","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}