You have solved thousands of problems and can retrieve maybe fifty from memory. A sanitized, searchable corpus of your own fixes — queried before every hard ticket — is the individual engineer's RAG: it compounds for as long as you keep the habit, and it leaves with you when you change jobs.
Tier: Foundation · Workflow area: Knowledge management · ~25 minutes to start, then habit
This playbook sets up a personal knowledge pipeline: capture each non-trivial fix in a two-minute note, sanitize it at write time, and make the pile semantically searchable with NotebookLM-class tools or a local Ollama-plus-embeddings setup — so "I've seen this before" becomes a query instead of a feeling.
Fix the note template — small enough to actually use. One markdown file per problem in one folder:
# Symptom: Outlook search returns nothing after profile rebuild
date: 2026-08-06
tags: outlook, search, windows-index
## Context
Win11 23H2, M365 Apps current channel, roaming profile shop.
## What actually fixed it
Rebuilt the search index scope: removed the profile path from
Indexing Options exclusions (a GPO had added it), then
Settings > Search > Advanced > Rebuild. 40 min to reindex.
## Dead ends
Registry fix from forums (no effect). New OST (no effect).
## Source
Own diagnosis + vendor ticket #445k excerpt.
Symptom in user words (that is what future-you will search), the fix, and the dead ends — dead ends save the most time on round two.
Sanitize at write time, not later. Rules baked into the template: no real hostnames (use fileserver-A), no usernames, no customer or employer identifiers, no secrets, no proprietary config values. A retro-sanitization pass never happens; write it clean or lose the portability.
Wire up semantic search — pick one of two stacks. Hosted: load the folder into a NotebookLM-class notebook and query conversationally; re-sync new notes weekly. Local and private: Ollama plus a small script —
ollama pull nomic-embed-text
ollama pull llama3.1:8b
import ollama, os, numpy as np
notes = {f: open(os.path.join("notes", f)).read()
for f in os.listdir("notes") if f.endswith(".md")}
emb = {f: ollama.embed(model="nomic-embed-text", input=t)["embeddings"][0]
for f, t in notes.items()}
def search(q, k=3):
qv = ollama.embed(model="nomic-embed-text", input=q)["embeddings"][0]
score = lambda v: np.dot(qv, v) / (np.linalg.norm(qv) * np.linalg.norm(v))
return sorted(notes, key=lambda f: -score(emb[f]))[:k]
print(search("outlook can't find any emails in search"))
Embed once per new note; the query runs in milliseconds, fully offline.
Install the query-first habit. Before diving into any hard ticket, one query against the corpus — symptom phrasing, not solution phrasing. This is the step that makes the corpus pay; capture without retrieval is a diary.
Close the loop after each hard ticket. Solved something non-trivial? Two-minute note before you close the ticket. Found your own old note and it worked? Add today's date as a "confirmed again" line — recurrence counts tell you what deserves promoting to the team KB.
Ask the corpus, not just search it. With the local stack, pipe the top hits into the model for synthesis:
Using ONLY these notes of mine, what did I try last time for this
symptom, what worked, and what were the dead ends?
Symptom: [current issue]. Notes: [top-3 note contents]
Grounded in your own notes, hallucination risk is near zero and the answer arrives in your own past voice.
Back it up like it matters. Private Git repo or synced encrypted folder. Five years of this is a career asset; treat it with the seriousness of one.
grep -ril "search index" over 200 well-titled notes works fine; add the semantic layer around note 300 when synonym misses start costing you.Your employer's data policy applies to a personal corpus — sanitized problem-solution patterns are generally defensible, but raw configs, logs and client-identifiable details are not; when a note cannot be written clean, it does not belong in the corpus.
The habit survives on friction, not motivation — a newnote shell alias that opens a pre-filled template dated today is the difference between a corpus and a good intention.