link-discovery — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited link-discovery (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Analyze a note and discover connections to other notes in the vault that aren't linked yet.
Obsidian must be open. Config at ~/.mnemo/config.json — reads vault and links_section. Schema in references/config-schema.md.
Accept note name as argument: /mn:connect "Atom — LongCat-Flash-Prover"
If no argument, ask: "Which note should I analyze for connections?"
obsidian read file="{note_name}" vault="{vault}"Extract:
[[wikilinks]]{links_section} sectionEven better than parallel `obsidian search` calls: one `grep -E` with all concepts OR'd together. Single filesystem scan against the vault path — ~50ms for any number of concepts vs ~180ms per obsidian search.
# Get vault filesystem path once (shared helper — BSD/macOS-awk-safe)
VAULT_PATH=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/get-vault-path.sh" "{vault}")
# Run these TWO commands in parallel (single message, two Bash tool uses):
# 1. Single grep for all concepts — much faster than N separate obsidian searches
grep -rlE --include="*.md" "({concept_1}|{concept_2}|...|{concept_N})" "$VAULT_PATH" 2>/dev/null
# 2. Backlinks check
obsidian backlinks file="{note_name}" vault="{vault}"Collect matching notes from grep output (strip vault path prefix to get note names). Exclude the target note itself. Backlinks output → notes already connected (exclude from suggestions).
Why not `obsidian search` per concept: each CLI call is ~180ms. Single grep = ~50ms total for any N. On 7 concepts: 1.26s → 50ms (25x faster).
Compare: notes found by search MINUS notes already linked (wikilinks + backlinks).
For each suggestion, explain WHY it's relevant (shared concept, shared tag, complementary topics).
Tension-nodes (high value, ТРИЗ): if a found note makes an OPPOSITE claim on the same question — that's NOT a duplicate, it's a #contradiction link worth surfacing. Two notes disagreeing on the same benchmark is a synthesis point, not noise.
🔗 Connection suggestions for "{note_name}"
Already connected: {N} notes
New suggestions: {N}
1. [[Atom — SCOPE beats TextGrad]]
Why: Both discuss agentic RL stability — HisPO and SCOPE solve similar problems
2. [[MOC — Agent Self-Correction]]
Why: Note mentions trial→verify→reflect cycle, this MOC covers the same pattern
Action: Add to MOC? (currently not listed there)
3. [[Session — ANT-14 TextGrad research]]
Why: Both evaluate RL approaches for agent improvement
4. [[Atom — Full attention wins on this benchmark]] ⚡ #contradiction
Why: opposite conclusion on the same GPU-efficiency question — tension to resolve
Apply these? (y/N, or pick numbers: 1,3)Links are applied with their one-line context (the «Why»), not as bare [[wikilinks]] (Luhmann: state why you linked).
If user confirms:
{links_section} with a one-line context (Luhmann — state why connected): - [[Name]] — {why, ≤10 words}, not a bare [[Name]]. Tension links get the marker: - [[Name]] #contradiction — {what disagrees}. Via `mcp__obsidian__str_replace` (preferred — targeted insert). CLI obsidian append content="- [[name]]" is a safe fallback only for plain wikilinks (no backticks, no $())mcp__obsidian__str_replace or obsidian append (plain wikilink = safe)obsidian backlinksWhy MCP preferred: if suggestions ever include code-reference links with backticks (e.g. [[function_name()]]), CLI obsidian append content="..." would trigger zsh command substitution. MCP passes content as JSON — always safe.
--deep: obsidian eval code="(()=>{const rl=app.metadataCache.resolvedLinks;const t=Object.keys(rl['{note_path}']||{});const r={};for(const[f,l]of Object.entries(rl)){if(f==='{note_path}')continue;const s=Object.keys(l).filter(x=>t.includes(x));if(s.length>=2)r[f]=s;}return JSON.stringify(r);})()" vault="{vault}"--canvas {topic} — gather all topic Atoms, drop them onto an Obsidian Canvas without categories, let the user group spatially so structure emerges. Then name clusters → new Molecules / MOC revision. Use when a topic has many Atoms but no clear MOC yet.Common failures in references/gotchas.md. Tool-routing rationale in references/tool-routing.md. Skill-specific rules:
/mn:health if interested).[[Technology]] pointing to a non-existent note enables entity discovery. Not "unresolved" in the bad sense.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.