# v1.8.0 Pre-Push Audit — claude-obsidian **Date:** 2026-05-18 **Branch:** `v1.7.0-compound-vault` (24 commits ahead of `main`, 5 uncommitted v1.8.2 files) **Auditor:** Claude (Opus 4.7 [1M context]) via parallel subagent dispatch + main-thread synthesis **Methodology:** 10-principle thinking spine (OBSERVE-OBSERVE-LISTEN-THINK-CONNECT-CONNECT-FEEL-ACCEPT-CREATE-GROW), applied to differential-rigor audit per [plan](../../.claude/plans/read-in-full-the-hidden-sun.md). Strict push gate: any BLOCKER halts push. **Result file size:** ~900 lines. --- ## 1. Executive verdict (200 words) **Push verdict: YELLOW.** Cleared of BLOCKERs and ready to push WITH explicit disclosure of 4 HIGH-tier findings, OR fixable to GREEN in ~90 minutes of doc/sub-agent edits. The v1.8.2 wiki-mode fix cycle holds end-to-end: 5 path-traversal vectors confirmed sanitized via `safe_name()`, `mkstemp()` write yields 0600 perms, `--mode` preview is non-mutating. Pre-commit verifier on the staged diff returned `CLEAR TO COMMIT` (0 BLOCKER / 0 HIGH / 1 MEDIUM / 4 LOW). All 8 test suites pass (~191+ assertions including the new 19 traversal/perm/preview assertions). Average per-skill score is 84.6/100 across 14 skills. The 4 HIGH findings are NOT security flaws or runtime breaks; they are documentation/integration drift: 1. `wiki-cli` documents a `manual_override` feature that the script never reads. 2. `agents/wiki-ingest.md` (parallel batch sub-agent) lacks v1.8 mode awareness and `Bash` in `tools`. 3. `autoresearch` SKILL.md lacks web-egress hygiene guidance (URL validation + content sanitization). 4. `save` SKILL.md table conflicts with global `~/.claude/CLAUDE.md` `/save` destination rule (project-local vs personal vault). Recommended path: apply the 4 fixes (60-90 min), bump to v1.8.2, then push as a clean GREEN. The 14 MEDIUM findings can ship as v1.8.3 backlog with disclosure. --- ## 2. Methodology — 10-principle spine in action This audit IS the framework's first execution. Each principle produced a concrete output: | # | Principle | Where applied | Output | |---|-----------|---------------|--------| | 1 | OBSERVE (external) | Inventory subagent (§3.1) + git status + manifest reads | Full artifact map | | 2 | OBSERVE (internal) | §11 anti-bias notes; ownership/ship-it/familiarity checks | Bias log honored throughout scoring | | 3 | LISTEN | Read every SKILL.md + README + CLAUDE.md + CHANGELOG + global rule | "What the project SAYS" reconciled with reality | | 4 | THINK | 14 parallel skill-audit subagents + verifier subagent | Per-skill scores + finding ledgers | | 5 | CONNECT (lateral) | Cross-skill pattern subagent | Path-traversal posture audit + `allowed-tools` gap inventory | | 6 | CONNECT (system) | Hook safety + manifest consistency + test suite execution | Integration map | | 7 | FEEL | UX walkthrough §8 | Install rehearsal, error-message survey, slash-command discoverability | | 8 | ACCEPT | Severity tiering §5 with anti-sycophancy caps applied | Calibrated, non-inflated ledger | | 9 | CREATE | This document | The audit | | 10 | GROW | §10 Feedback loop notes | Inputs to v1.8.3 backlog + framework integration plan | --- ## 3. Per-skill score table | # | Skill | Tier | Score | BLOCKER | HIGH | MEDIUM | LOW | Recommendation | |---|-------|------|-------|---------|------|--------|-----|----------------| | 1 | wiki-mode | 1 | 94/100 | 0 | 0 | 0 | 4 | ship-clean | | 2 | wiki-cli | 1 | 75/100 | 0 | 1 | 2 | 2 | fix-before-push | | 3 | wiki-retrieve | 1 | 88/100 | 0 | 0 | 2 | 3 | ship | | 4 | save | 1 | 78/100 | 0 | 1 | 3 | 2 | fix-or-disclose | | 5 | wiki-ingest | 1 | 76/100 | 0 | 1 | 2 | 2 | fix-before-push | | 6 | autoresearch | 1 | 72/100 | 0 | 1 | 4 | 3 | fix-or-disclose | | 7 | wiki | 2 | 84/100 | 0 | 0 | 1 | 5 | ship-clean | | 8 | wiki-query | 2 | 82/100 | 0 | 0 | 0 | 5 | keep | | 9 | wiki-lint | 2 | 84/100 | 0 | 0 | 0 | 4 | keep | | 10 | wiki-fold | 2 | 92/100 | 0 | 0 | 0 | 2 | pass | | 11 | canvas | 2 | 88/100 | 0 | 0 | 0 | 3 | keep — light fix | | 12 | defuddle | 2 | 88/100 | 0 | 0 | 0 | 2 | ship | | 13 | obsidian-bases | 2 | 88/100 | 0 | 0 | 0 | 3 | keep | | 14 | obsidian-markdown | 2 | 86/100 | 0 | 0 | 0 | 5 | keep — light fix | | **AVG** | — | — | **84.6** | **0** | **4** | **14** | **45** | — | **Score caps applied (anti-sycophancy):** - save: re-scored from agent's 72 → 78 after downgrading "cross-boundary HIGH" — see §4 finding-rationale below - No path-traversal escapes the vault root (verified end-to-end by `os.path.abspath()` in test_wiki_mode.py) - No leaked secrets in any file - No `eval` / `exec` / `shell=True` patterns in any script - Test cap (Tier 1 missing tests): applied to wiki-cli (-3 for no detect-transport test), autoresearch (-2 for missing tests/__init__.py) --- ## 4. Master finding ledger ### 4.1 BLOCKER findings: 0 **No BLOCKER findings.** No path traversal escapes the vault. No secrets exposed. No broken-in-normal-use code paths. No security flaws in active code. The v1.7.0 audit's BLOCKER B1 (data-egress consent gap) closure verified to still hold via consent-gate replay on `contextual-prefix.py`. ### 4.2 HIGH findings: 4 | ID | Skill | Finding | File:Line | Fix | |----|-------|---------|-----------|-----| | H1 | wiki-cli | `manual_override: true` documented in `wiki/references/transport-fallback.md:91-97` and `docs/compound-vault-guide.md:87` is NOT implemented in `scripts/detect-transport.sh`. Users following the documented procedure will have their manual transport choice clobbered on the next `--force` run or 7-day staleness rollover. | `scripts/detect-transport.sh` (no read of existing `transport.json`); doc-vs-code drift | Either implement (~10 LOC: read existing JSON, honor `manual_override: true`, re-stamp only `detected_at`/`host`) OR strike the documentation. Implementation is the right call — it's the documented MCP-user escape hatch. | | H2 | wiki-ingest | `agents/wiki-ingest.md` (parallel batch ingest sub-agent): (a) `tools: Read, Write, Edit, Glob, Grep` does NOT include `Bash`, but body §40-50 instructs `bash scripts/wiki-lock.sh acquire/release`; (b) no `## Mode awareness (v1.8+)` section, so batch-ingest in LYT/PARA/Zettelkasten vaults files to v1.7 generic paths. v1.7 multi-writer safety guarantee + v1.8 mode routing both rely on this agent. | `agents/wiki-ingest.md:16` (tools line) + missing mode-awareness section | Add `Bash` to `tools:` frontmatter (1 line). Append a `## Mode awareness (v1.8+)` section mirroring `skills/wiki-ingest/SKILL.md:26-46` (3-5 lines). | | H3 | autoresearch | SKILL.md lacks web-egress hygiene guidance: no URL validation (reject `file://`, `javascript:`, RFC1918 hosts in redirect chains), no content sanitization (strip `