From 31c67b957366567faa68c0adf8c5cf680a1d9c30 Mon Sep 17 00:00:00 2001 From: Travis Herbranson Date: Sat, 23 May 2026 06:49:50 -0400 Subject: [PATCH] Drop Obsidian vault (root domain) from default audit scope MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wiki-vault/wiki-context are an MCP-owned, managed surface — a second scanner risks interfering with how the vault MCP maintains its context. Remove the 'root' domain from DEFAULT_DOMAINS so a plain run no longer touches the vault; the --scan/--repo escape hatch still allows manual one-offs. Updated SKILL.md, check-catalog, findings-format, README, CLAUDE.md with the rationale. Default run: 3 domains, 37 repos, 54 findings (was 61); clears the vault-only false positives (herbygitea doc-mention, wiki-context uv-init stub). --- CLAUDE.md | 12 ++++++++---- README.md | 2 +- repo-hygiene-audit.skill | Bin 17018 -> 17521 bytes repo-hygiene-audit/SKILL.md | 12 +++++++++--- .../references/check-catalog.md | 8 ++++++++ repo-hygiene-audit/scripts/audit.py | 6 +++++- 6 files changed, 31 insertions(+), 9 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 62ad6f1..8662ee7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ lives in `README.md` — this file is the concise, gotcha-focused guide. ## What this is A Claude skill that runs a repeatable, **read-only** hygiene audit across the -homelab / pbs / docker / root project domains. Phase 7 of the +homelab / pbs / docker project domains. Phase 7 of the repo-hygiene-remediation project: the durable version of the one-time audit. ## Architecture @@ -26,9 +26,13 @@ repo-hygiene-remediation project: the durable version of the one-time audit. - **Read-only is the contract.** The script must never write to the trees it scans — only to `--output`. All git invocations use read subcommands. Don't add a check that mutates a repo. -- **Each repo = an immediate child of a domain root.** The `root` domain is the - exception: it names explicit repo paths (wiki-vault, wiki-context), not a - scan root. +- **Each repo = an immediate child of a domain root.** Domains can also name + explicit repo paths via `repos` (vs `scan`) if a one-off is ever needed. +- **The Obsidian vault is intentionally NOT a default domain.** wiki-vault / + wiki-context are MCP-owned, managed surfaces — a second scanner risks + interfering with the vault MCP's context. Don't "helpfully" re-add a `root` + domain to `DEFAULT_DOMAINS`; the `--scan`/`--repo` escape hatch covers manual + one-offs. - **`docker` domain repos are compose stacks** — README expected, CLAUDE.md intentionally NOT expected (`COMPOSE_STACK_DOMAINS`). Don't "fix" the missing CLAUDE.md flag suppression there. diff --git a/README.md b/README.md index ebd2938..63bcd89 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # repo-hygiene-audit A Claude Code / Cowork skill that runs a **repeatable, read-only hygiene audit** -across the `homelab`, `pbs`, `docker`, and `root` project domains and reports +across the `homelab`, `pbs`, and `docker` project domains and reports the findings, grouped by remediation phase. It is the durable, repeatable version of the one-time 2026-05-19/20 diff --git a/repo-hygiene-audit.skill b/repo-hygiene-audit.skill index cbe2a1b505413d66bed538bb9131a53b0a6d60c3..7b64c994bb3c7317664cd9d72b43396f2a0f1c2f 100644 GIT binary patch literal 17521 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 p|JN-L*#C>q|DFT<-QXWNz`wl%82CRvF! - Repeatable hygiene audit across the homelab / pbs / docker / root project + Repeatable hygiene audit across the homelab / pbs / docker project domains. Runs scripted, read-only checks for git auditability and .git ownership drift, .env file permissions, inline secrets in compose files, non-git directories, uv-init leftover stubs, docker-compose.yml -> compose.yml @@ -39,18 +39,24 @@ wrong doc is worse than a missing one). That semantic scoring is the human part. This skill automates the **mechanical enumeration** underneath it: sweep every repo in every domain and flag the objective signals that drift produces. -Domains (the four the audit covered): +Default domains scanned: | Domain | Roots scanned | |--------|---------------| | `homelab` | `/opt/projects/homelab/*` | | `pbs` | `/opt/projects/pbs/*` | | `docker` | `/opt/projects/docker/*`, `~/projects/docker/*` (compose stacks) | -| `root` | `/opt/projects/wiki-vault`, `/opt/projects/wiki-context` | `docker` repos are treated as compose stacks: README expected, **no per-stack CLAUDE.md** (per the locked doc-role convention). +**The Obsidian vault (`wiki-vault`, `wiki-context`) is intentionally out of +scope.** It's an MCP-owned, managed surface — the vault MCP maintains its own +context — so a second scanner poking at it risks interference. The original +audit covered it as a "root" domain; this recurring skill deliberately does +not. The `--scan` / `--repo` escape hatch can still point at it manually if +ever truly needed; don't re-add it to the defaults. + ## Workflow ### Step 1 — Run the scripted sweep diff --git a/repo-hygiene-audit/references/check-catalog.md b/repo-hygiene-audit/references/check-catalog.md index 668c1a3..dd00104 100644 --- a/repo-hygiene-audit/references/check-catalog.md +++ b/repo-hygiene-audit/references/check-catalog.md @@ -12,6 +12,14 @@ CLAUDE.md = concise agent guide (not a README clone); docker compose stacks get README only; prefer `main` over `master`; GitHub-destined repos are pushed manually. +## Scope + +Default domains: `homelab`, `pbs`, `docker`. The Obsidian vault (`wiki-vault`, +`wiki-context`) is **intentionally excluded** — it's an MCP-owned, managed +surface, so a second scanner risks interfering with how the vault MCP maintains +its context. Use `--scan` / `--repo` to point at it manually if ever needed; +don't re-add it to the defaults. + ## AUDITABILITY (maps to Phase 3 — unblock un-auditable repos) | check id | Looks for | Severity | Why | diff --git a/repo-hygiene-audit/scripts/audit.py b/repo-hygiene-audit/scripts/audit.py index 6b91b16..777287f 100644 --- a/repo-hygiene-audit/scripts/audit.py +++ b/repo-hygiene-audit/scripts/audit.py @@ -43,11 +43,15 @@ from pathlib import Path # A domain either scans the immediate children of one or more roots ("scan"), # or names explicit repo paths ("repos"), or both. Override with --config. +# +# The Obsidian vault (wiki-vault, wiki-context) is deliberately NOT a default +# domain: it's an MCP-owned, managed surface (the vault MCP maintains its +# context), so a second scanner poking at it risks interference. Point --scan +# or --repo at it manually if you ever truly need to. DEFAULT_DOMAINS: dict[str, dict[str, list[str]]] = { "homelab": {"scan": ["/opt/projects/homelab"]}, "pbs": {"scan": ["/opt/projects/pbs"]}, "docker": {"scan": ["/opt/projects/docker", "/home/herbyadmin/projects/docker"]}, - "root": {"repos": ["/opt/projects/wiki-vault", "/opt/projects/wiki-context"]}, } # Conventions from the repo-hygiene-remediation plan (Locked Decisions).