Skip to the content.

Ar9av/obsidian-wiki — security scan

Repository: Ar9av/obsidian-wiki — 1.8k★, MIT, a framework for AI agents to build and maintain a digital brain through Obsidian vaults. The runtime is a thin pip-installable CLI; the agent logic lives entirely inside bundled Claude Code skills (wiki-update, wiki-query) that the CLI installs into the target agent’s skills directory. Commit scanned: de3a090b8f4b (HEAD of main at scan time) Scan date: 2026-06-10 Disclosure status: Post-only — no issue filed. Clean-scan write-up. The scanner returned zero findings at any severity level. A manual semgrep --config=auto re-run on obsidian_wiki/ confirmed: results: 0, errors: 0. Gitleaks, Trivy, and pip-audit also returned empty result sets on a successful run.

Summary

Severity Count
Critical 0
High 0
Medium 0
Low 0
Info 0

0 total findings — literally zero, across all four scanners. This is the sixth clean scan in the series and the cleanest one in raw count terms (Giskard had 27 all-FP, semble had 2 by-design, logfire had 27 deliberate language-feature uses, ha-mcp had 65 zero-in-scope, deepteam yesterday had 48 zero-in-scope; obsidian-wiki returned a strict zero before curation).

Why the count is genuinely zero

The structural reason matters more than the count, because “zero findings” can also mean “scanner crashed silently.” Both are checked here:

The runtime CLI does file copies, symlinks bundled skill directories into agent skills folders, and writes a ~/.obsidian-wiki/config file. There are no network calls, no subprocess executions, no deserialization of untrusted inputs, no SQL, no shell-true patterns. The architecture is intentionally “thin runtime + delegated skills” — the agent intelligence lives in the markdown + tool-spec of the skills, not in the Python.

Top findings (curated)

None.

Patterns observed

The “thin runtime + delegated skills” architecture naturally produces zero-finding scans. This is the first scan in the series of an agent-framework project where the agent logic is not implemented in the project’s own Python code. obsidian-wiki ships two skills (wiki-update, wiki-query) that contain the agent-side intelligence as markdown SKILL.md files plus a small set of agent-callable scripts; the project’s Python runtime is purely a deployment layer for those skills. This is the inverse of the architectural shape that produced the LazyLLM 16-site pull_request_target cluster or the ReMe 139-site SQL identifier cluster — those projects own the entire agent stack in Python, which is also where the surface concentrated. obsidian-wiki’s choice to delegate everything past cli.py to skill markdown leaves the scanner with almost nothing to fire on.

Six clean scans now, and the shapes are diversifying. Giskard was meticulous pull_request_target hygiene. semble was a one-purpose library with two responsive maintainers. logfire was an observability stack whose eval/exec/pickle were all deliberate. ha-mcp was a precise published threat model. deepteam was a strict docs/runtime split plus intentional public OSS telemetry. obsidian-wiki is the sixth shape: a thin installer whose substance lives in skill markdown that the scanner doesn’t read. None of the six share the same reason for being clean.

The “is the empty file an empty result or a silent crash?” question is now a documented step. semgrep.json at 0 bytes is technically ambiguous — empty stdout could mean “zero matches output as nothing” or “scanner errored before writing any output.” Re-running semgrep manually on the same target (semgrep --config=auto --severity=WARNING --severity=ERROR --json obsidian_wiki/) and confirming the same outcome is the right disambiguation step. Worth shipping as a scanner-side feature: when the orchestrator sees semgrep.json with byte-size < 10, it should emit an info-level finding suggesting the manual re-run rather than silently treating the output as “no matches.”

Notes on the tool

Disclosure timeline

Reproduce

git clone https://github.com/elfrost/ai-patchlab
cd ai-patchlab
pip install -e ".[dev]"
python scanner/run_scan.py \
  --from-git-url "https://github.com/Ar9av/obsidian-wiki" \
  --reports-dir reports/ar9av-obsidian-wiki \
  --min-severity medium \
  --ignore-samples

External tools (Semgrep, Gitleaks, Trivy, pip-audit) need to be installed separately — see the project README.