Doctor
drwn doctor reports drift, broken links, missing generated files, and project-config issues without mutating anything. It is the read-only counterpart to drwn write.
Run a health check:
drwn doctor
drwn doctor --json
drwn doctor is project-aware: when run inside a configured project, the report scopes to that project's write record, generated dir, and overlay. Outside a project, the report is machine-scoped.
What it surfaces
| Category | Detail |
|---|---|
| Broken or missing skill entries | drwn-owned skill entries in downstream skill directories whose content no longer exists |
| Stale skill entries | drwn-owned downstream skill entries that no longer correspond to the desired set (curated + scope + card-source resolved skills) |
| MCP drift | Per-target managed-content drift across Claude / Codex / Cursor, comparing recorded vs recomputed hashes for each managed field |
| Hook issues | A locked card declares hook policies but no hook consent has been recorded via drwn card trust |
| Project config — unknown server | serverOverrides references a server that is neither in the registry nor the user MCP library |
| Project config — unknown skill | skills.include (or extensions.<name> derivations) references a skill that does not resolve in any layer |
| Project config — unknown extension | extensions.<name> references an extension drwn does not know |
| Project config — stale target override | targets.<name> references a target drwn does not know |
| Project config — unknown card | A config.cards entry cannot be parsed or matched against card.lock |
| Project config — unresolved card refs | A locked card cannot be materialized (missing extract, missing remote, etc.) |
| Card manifest — unavailable skill | A consumed card's manifest references a skill name that does not resolve under the effective state |
| Store + write-record status | Store schema version, card count, and last-write record presence/corruption |
Report-only by design
drwn doctor never mutates files. It is safe to run anywhere, including under DRWN_STORE_READONLY=1.
The unresolved skills.include case is split across two surfaces:
drwn writefails before any downstream mutation when askills.includename does not resolve — this is a hard write-time contract.drwn doctorreports the same condition as a diagnostic, so operators can see it without attempting a write.
Related
- Status — effective harness summary (use
--whyto trace why something is active) - Write — the mutating counterpart;
--dry-runpreviews the same writes doctor reports drift against - Extensions doctor — extension-specific diagnostics (Parallel, Beads, MarkItDown)
- Store status / verify — store-layer health