From learning-loop
Strengthens a single vault note by assessing maturity, researching gaps, rewriting in the vault's voice, and promoting when ready. Invoke with a note name or let it pick the shallowest inbox note.
How this skill is triggered — by the user, by Claude, or both
Slash command
/learning-loop:deepenThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Launches the `note-deepener` agent to strengthen a single note. The agent assesses maturity, researches gaps scaled to need, rewrites in persona voice, verifies sources, and promotes when ready. Shallow notes get heavy research; deep notes get a light touch.
Launches the note-deepener agent to strengthen a single note. The agent assesses maturity, researches gaps scaled to need, rewrites in persona voice, verifies sources, and promotes when ready. Shallow notes get heavy research; deep notes get a light touch.
/deepen <note-name>: target a specific note/deepen: no argument; picks the shallowest inbox note/inbox flags a note as needing deepeningThis skill emits provenance events for pipeline observability. Run each Bash command silently.
At session start:
node "${CLAUDE_PLUGIN_ROOT}/scripts/provenance-emit.js" '{"agent":"deepen","skill":"deepen","action":"session-start","target":"NOTE_FILENAME"}'
At session end:
node "${CLAUDE_PLUGIN_ROOT}/scripts/provenance-emit.js" '{"agent":"deepen","skill":"deepen","action":"session-end","target":"NOTE_FILENAME","promoted":true|false}'
Per-note tracking is handled automatically by the PostToolUse hook.
No argument (/deepen):
Use AskUserQuestion:
Which note would you like to deepen?
- Type a note name: I'll find and strengthen it
- Leave blank: I'll pick the shallowest inbox note automatically
Argument provided: Proceed immediately.
Launch the note-deepener agent with:
Glob if only a name was given){{VAULT}}/The agent definition is at PLUGIN/agents/note-deepener.md.
If no note name was provided, pass no note_path: the agent will pick the shallowest inbox note.
The note-deepener is a subagent. Its Write/Edit tool calls bypass PostToolUse, so the deepened note (and any split note in 0-inbox/) miss post-write-autolink.js and post-write-edge-infer.js.
Run the unlinked-body sweep from skills/_shared/hook-replay.md to catch them. Idempotent: safe on already-hooked notes:
PLUGIN_DATA="${CLAUDE_PLUGIN_DATA:-$(node "${CLAUDE_PLUGIN_ROOT}/scripts/resolve-paths.mjs" PLUGIN_DATA)}"
LL_VAULT="$(node -e "const c=JSON.parse(require('fs').readFileSync(process.argv[1]+'/config.json','utf-8'));console.log(c.vault_path.replace(/^~/,require('os').homedir()))" "$PLUGIN_DATA")"
ll-search index "$LL_VAULT" "$LL_VAULT/.vault-search/vault-index.db" 2>&1 | tail -1
SWEEP_CANDIDATES="${TMPDIR:-/tmp}/ll-${CLAUDE_CODE_SESSION_ID:-$$}-sweep-candidates.txt"
LL_VAULT="$LL_VAULT" python3 - <<'PY' > "$SWEEP_CANDIDATES"
import os, re
root = os.environ["LL_VAULT"]
for d in ["0-inbox", "1-fleeting", "2-literature", "3-permanent", "5-maps"]:
for dirpath, _, files in os.walk(os.path.join(root, d)):
for f in files:
if not f.endswith(".md"): continue
p = os.path.join(dirpath, f)
try:
body = open(p).read()
body = re.sub(r"^---\n.*?\n---\n", "", body, count=1, flags=re.DOTALL)
if not re.search(r"\[\[[^\]]+\]\]", body):
print(p)
except: pass
PY
if [ -s "$SWEEP_CANDIDATES" ]; then
node "${CLAUDE_PLUGIN_ROOT}/scripts/sweep-hook-replay.mjs" --stdin < "$SWEEP_CANDIDATES"
fi
rm -f "$SWEEP_CANDIDATES"
Report failures in Step 2 if any.
The agent returns a structured report with before/after comparison, maturity transition, and destination. Present it to the user.
If the agent flagged uncaptured sources, suggest /literature for each.
If the note contains write-time verification markers, prioritize resolving them:
[unresolved] -- search for the source via web search. If found, add the URL/DOI and remove the marker. If genuinely unfindable, either find an alternative source for the claim or remove the claim.[unverified] -- run node PLUGIN/scripts/source-resolver.mjs verify-note <path> to see the specific issue. Fix the author/year, then remove the marker.[not in abstract] -- fetch the full source (web fetch the URL or DOI page). If the number appears in the full text, remove the marker. If it doesn't, either correct the number or add scope qualification.note-deepener agent and its _skills/.0-inbox/.npx claudepluginhub robinslange/learning-loop --plugin learning-loopTransforms ingested insight notes in Claude vault into enriched Zettelkasten notes: rewrites prose, improves titles, adds context, updates status to enriched.
Scores note quality (depth, sourcing, linking, voice, atomicity) and verifies claims against cited sources. Detects URL fabrication, overclaim, stale references, and duplicates. Produces a fix plan for vault notes.
Enforces Zettelkasten note-writing discipline: atomic claims, declarative titles, own-words prose, and typed link relationships. Use when capturing or refactoring evergreen notes.