<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LimSangkyu</title>
    <description>The latest articles on DEV Community by LimSangkyu (@limsangkyu).</description>
    <link>https://dev.to/limsangkyu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3924122%2F369d7d9e-e02c-4680-88b1-e1af6a591e08.png</url>
      <title>DEV Community: LimSangkyu</title>
      <link>https://dev.to/limsangkyu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/limsangkyu"/>
    <language>en</language>
    <item>
      <title>My AI corrections used to be tribal knowledge. I shipped the fix into my own OSS.</title>
      <dc:creator>LimSangkyu</dc:creator>
      <pubDate>Tue, 26 May 2026 09:41:06 +0000</pubDate>
      <link>https://dev.to/limsangkyu/my-ai-corrections-used-to-be-tribal-knowledge-i-shipped-the-fix-into-my-own-oss-3a9h</link>
      <guid>https://dev.to/limsangkyu/my-ai-corrections-used-to-be-tribal-knowledge-i-shipped-the-fix-into-my-own-oss-3a9h</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — I ran a personal wiki inside Claude Code for a month and shipped it as &lt;strong&gt;Hypomnema&lt;/strong&gt; (&lt;code&gt;npm install -g hypomnema&lt;/code&gt;). It's MIT, plain markdown + git, no vector DB, no API keys. The core is 14 lifecycle hooks that wire the wiki into Claude Code so it maintains itself — auto-commit, auto-push, session-state injection, lookup signals, compact-time guards. The most acute thing a month of dogfooding surfaced — &lt;em&gt;AI behavior corrections rotting across three hand-synced storage layers&lt;/em&gt; — gets a fix that ships with this first drop. This is the field report.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(There's a &lt;a href="https://velog.io/@dlatkdrb980219/Karpathy-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4%EB%A5%BC-%ED%95%9C-%EB%8B%AC-%EA%B5%B4%EB%A0%A4%EB%B3%B4%EA%B3%A0-%EB%A7%8C%EB%93%A0-LLM-%EC%9C%84%ED%82%A4-%EC%98%A4%ED%94%88-%EC%86%8C%EC%8A%A4" rel="noopener noreferrer"&gt;Korean retrospective on velog&lt;/a&gt; if you read Korean — same author, longer narrative.)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The thing every note tool fails at
&lt;/h2&gt;

&lt;p&gt;I've cycled through every personal-knowledge tool you've heard of. They all break in roughly the same way:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;The pain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Note vaults&lt;/strong&gt; (Obsidian, Notion)&lt;/td&gt;
&lt;td&gt;You write fine. You never re-read. 100 notes = 100 islands.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAG / vector DBs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chunks grow forever. Knowledge doesn't compound — it accumulates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;AI notebooks&lt;/strong&gt; (Mem, Reflect, etc.)&lt;/td&gt;
&lt;td&gt;Closed format. No git. I don't trust them in five years.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Code wikis&lt;/strong&gt; (auto-generated from a repo)&lt;/td&gt;
&lt;td&gt;Code only. Can't capture decisions, research, or AI behavior corrections.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The thing every one of them fails at is &lt;strong&gt;synthesis&lt;/strong&gt;. They store. They retrieve. They never &lt;em&gt;update&lt;/em&gt; what you already know with what you just read.&lt;/p&gt;

&lt;p&gt;That's exactly the gap Karpathy pointed at in his Gist this April. RAG (Retrieval-Augmented Generation) re-reads chunks of your sources on every query and pastes them into the prompt; a wiki persists synthesis between queries:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"RAG re-reads sources every query. A wiki persists synthesis. The bottleneck was always bookkeeping, and LLMs reduce that cost to zero."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I built one — small at first, then aggressive — and ran it daily for a month inside Claude Code before opening it up. The result is &lt;strong&gt;Hypomnema&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;Hypomnema is a personal wiki that lives in &lt;code&gt;~/hypomnema/&lt;/code&gt; as plain markdown + git. You feed it sources with one slash command. Claude reads them, synthesizes structured pages, and &lt;em&gt;updates existing pages&lt;/em&gt; instead of creating new islands. Fourteen lifecycle hooks wire it into Claude Code so the wiki maintains itself: auto-commit, auto-push, session-state injection, lookup signals, compact-time guards. There's no vector DB. There's no API key. The whole stack is "Node.js script + markdown + git + Claude."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; hypomnema
&lt;span class="c"&gt;# inside Claude Code:&lt;/span&gt;
/hypo:init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Six walls, six fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Wall 1 — "Every new session forgets where I was"
&lt;/h3&gt;

&lt;p&gt;Coming back to a paused project after a week, Claude had no memory of it. I had to retype context for ten minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix took three attempts.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Print &lt;code&gt;hot.md&lt;/code&gt; to stderr from a &lt;code&gt;SessionStart&lt;/code&gt; hook.&lt;/em&gt; Doesn't work — Claude Code's TUI captures hook stderr during init. You see nothing.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Inject via &lt;code&gt;additionalContext&lt;/code&gt; from &lt;code&gt;SessionStart&lt;/code&gt;.&lt;/em&gt; Also doesn't work in a multi-hook setup — when more than one &lt;code&gt;SessionStart&lt;/code&gt; hook runs, Claude Code keeps only the &lt;strong&gt;last&lt;/strong&gt; hook's &lt;code&gt;additionalContext&lt;/code&gt;. Earlier hooks get silently overwritten.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The pattern that finally stuck:&lt;/em&gt; &lt;code&gt;SessionStart&lt;/code&gt; writes a marker file (&lt;code&gt;os.tmpdir()/wiki-session-marker.json&lt;/code&gt;); the first &lt;code&gt;UserPromptSubmit&lt;/code&gt; reads the marker and injects via &lt;em&gt;its&lt;/em&gt; &lt;code&gt;additionalContext&lt;/code&gt; (which is reliable). 10-minute TTL, single-shot consumption.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SessionStart
  ↳ hypo-session-start.mjs
      ↳ git pull --ff-only
      ↳ write tmpdir marker {hot, session-state, ts}

UserPromptSubmit (first one only, within 10 min)
  ↳ hypo-first-prompt.mjs
      ↳ read marker → inject hot.md + session-state.md as additionalContext
      ↳ delete marker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resume cost is now effectively O(1). The takeaway: &lt;strong&gt;you can't rely on prompts; you also can't rely on a &lt;em&gt;single&lt;/em&gt; hook channel — you have to triangulate around platform constraints.&lt;/strong&gt; I lost a day to "why isn't stderr printing" before I understood that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall 2 — "&lt;code&gt;/compact&lt;/code&gt; deletes my work-in-progress learnings"
&lt;/h3&gt;

&lt;p&gt;Claude Code's &lt;code&gt;/compact&lt;/code&gt; summarizes your conversation. It also blows away anything you didn't write down. I lost two productive afternoons before I understood that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; a &lt;code&gt;PreCompact&lt;/code&gt; hook that refuses to compact if the session-close checklist is unfinished or the wiki lints fail.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PreCompact
  ↳ hypo-personal-check.mjs
      ↳ if lint errors → block + show what's broken
      ↳ if session-close incomplete → block + show next step
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same machinery covers &lt;code&gt;/clear&lt;/code&gt;: a Stop-chain auto-minimal-crystallize step offers &lt;code&gt;/hypo:crystallize --apply-session-close --minimal&lt;/code&gt; on non-trivial session ends, and a SessionEnd marker + SessionStart &lt;code&gt;source=clear&lt;/code&gt; recovery makes the &lt;code&gt;/clear-then-restart&lt;/code&gt; round-trip clean (ADR — Architecture Decision Record — 0022 Layer 3 in the repo).&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall 3 — "The 3-mode privacy matrix didn't survive contact with reality"
&lt;/h3&gt;

&lt;p&gt;An early prototype had &lt;code&gt;personal / shared / public&lt;/code&gt; modes per page. Sounded fine on paper. In practice every privacy decision was about &lt;em&gt;which paths to exclude&lt;/em&gt;, not about a mode label.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; the public release deletes the mode concept entirely. There's a single &lt;code&gt;.hypoignore&lt;/code&gt; file with glob patterns. One file, one source of truth. Code shrunk by half. Mental model doubled in clarity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall 4 — "BM25 libraries can't find Korean substrings"
&lt;/h3&gt;

&lt;p&gt;Most BM25 (Best Matching 25 — the standard term-frequency ranking function for full-text search) implementations split on whitespace. Korean ("장애 보고서") doesn't always have whitespace where you'd expect, so a search for "장애" missed the page that contained "장애보고서".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; a hand-rolled bi-gram BM25 tokenizer for CJK. Search suddenly worked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall 5 — "I corrected the AI three times, and it still made the same mistake tomorrow"
&lt;/h3&gt;

&lt;p&gt;Every AI tool today accepts corrections &lt;strong&gt;for the current chat&lt;/strong&gt;. None of them persist.&lt;/p&gt;

&lt;p&gt;I built &lt;code&gt;/hypo:feedback "stop doing X because Y"&lt;/code&gt; — stores the rule in &lt;code&gt;pages/feedback/&amp;lt;slug&amp;gt;.md&lt;/code&gt;, which is inside the wiki, so it auto-syncs via the &lt;code&gt;Stop&lt;/code&gt; hook to every machine. Good first step.&lt;/p&gt;

&lt;p&gt;But: Claude Code itself has two more places where behavior rules live — &lt;code&gt;~/.claude/projects/&amp;lt;id&amp;gt;/memory/MEMORY.md&lt;/code&gt; (per-project, machine-local) and &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; &lt;code&gt;&amp;lt;learned_behaviors&amp;gt;&lt;/code&gt; (global, machine-local). Both live outside the wiki. Both are read on every prompt. Hand-syncing three layers rots fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall 6 — "Three storage layers, hand-synced, rotting fast"
&lt;/h3&gt;

&lt;p&gt;A month of dogfooding compressed this into a sharp shape: I had &lt;strong&gt;14 hand-written entries&lt;/strong&gt; in &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; &lt;code&gt;&amp;lt;learned_behaviors&amp;gt;&lt;/code&gt;. Nine of them had &lt;strong&gt;the same rule in &lt;code&gt;pages/feedback/&lt;/code&gt; already&lt;/strong&gt;. I'd edited the wiki page and forgotten the global rules file. I'd added a global rule and forgotten to write the page. The drift was invisible until I counted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The response that became the headline: &lt;code&gt;feedback&lt;/code&gt; is the single source of truth, &lt;code&gt;&amp;lt;learned_behaviors&amp;gt;&lt;/code&gt; and &lt;code&gt;MEMORY.md&lt;/code&gt; are derived.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One place to edit: &lt;code&gt;pages/feedback/&amp;lt;slug&amp;gt;.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;One command to project: &lt;code&gt;hypomnema feedback-sync --check&lt;/code&gt; (dry-run) / &lt;code&gt;--write&lt;/code&gt; (apply).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;learned_behaviors&amp;gt;&lt;/code&gt; and &lt;code&gt;MEMORY.md&lt;/code&gt; get filled inside marker-fenced managed blocks (&lt;code&gt;HYPO:FEEDBACK-SYNC:START / END&lt;/code&gt;). Hand-edits inside those blocks surface as &lt;code&gt;CONFLICT_MANUAL_EDIT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Strict gate for the global rules layer: a feedback page must declare &lt;code&gt;scope: global&lt;/code&gt; + &lt;code&gt;tier: L1&lt;/code&gt; + &lt;code&gt;targets: claude-learned&lt;/code&gt; + &lt;code&gt;promote_to_global: true&lt;/code&gt; + &lt;code&gt;sensitivity ∈ {public, sanitized}&lt;/code&gt;. Five gates. Plus a &lt;strong&gt;hard cap of 10 entries&lt;/strong&gt; so global rules can't quietly bloat the token budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-way projection&lt;/strong&gt;. The wiki is the SoT (single source of truth, SoT); the two downstreams are derived. No back-flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sensitivity: private&lt;/code&gt; is forbidden&lt;/strong&gt; — the wiki is git-pushed, so private data must stay outside the wiki entirely.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Author the SoT page&lt;/span&gt;
/hypo:feedback &lt;span class="s2"&gt;"&amp;lt;rule&amp;gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Project to downstreams&lt;/span&gt;
hypomnema feedback-sync &lt;span class="nt"&gt;--check&lt;/span&gt;       &lt;span class="c"&gt;# dry-run&lt;/span&gt;
hypomnema feedback-sync &lt;span class="nt"&gt;--write&lt;/span&gt;       &lt;span class="c"&gt;# apply (managed blocks only)&lt;/span&gt;
hypomnema feedback-sync &lt;span class="nt"&gt;--bootstrap&lt;/span&gt;   &lt;span class="c"&gt;# scaffold drafts from existing state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the spine of the release and the reason it's the first public one: any earlier and the projection design would have shipped with the assumption that hand-sync works, which it doesn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  SCHEMA — why we refused to auto-stub
&lt;/h2&gt;

&lt;p&gt;The new &lt;code&gt;type: feedback&lt;/code&gt; page requires &lt;strong&gt;nine fields&lt;/strong&gt; unconditionally: &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;scope&lt;/code&gt;, &lt;code&gt;tier&lt;/code&gt;, &lt;code&gt;targets&lt;/code&gt;, &lt;code&gt;sensitivity&lt;/code&gt;, &lt;code&gt;priority&lt;/code&gt;, &lt;code&gt;memory_summary&lt;/code&gt;, &lt;code&gt;reason&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;. If &lt;code&gt;targets&lt;/code&gt; includes &lt;code&gt;claude-learned&lt;/code&gt;, add &lt;code&gt;global_summary&lt;/code&gt; + &lt;code&gt;promote_to_global&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When you run &lt;code&gt;hypomnema upgrade --apply&lt;/code&gt;, the upgrade writes a fresh backfill checklist into your wiki root. It deliberately does &lt;strong&gt;not&lt;/strong&gt; auto-stub.&lt;/p&gt;

&lt;p&gt;The reason: &lt;code&gt;scope&lt;/code&gt; / &lt;code&gt;tier&lt;/code&gt; / &lt;code&gt;targets&lt;/code&gt; / &lt;code&gt;sensitivity&lt;/code&gt; / &lt;code&gt;reason&lt;/code&gt; / &lt;code&gt;source&lt;/code&gt; are &lt;em&gt;meaning&lt;/em&gt; decisions, not formatting decisions. Auto-stubbing them with defaults like &lt;code&gt;scope: project:?&lt;/code&gt; would &lt;em&gt;silently project wrong behavior&lt;/em&gt; into two downstream surfaces (&lt;code&gt;MEMORY.md&lt;/code&gt; and &lt;code&gt;&amp;lt;learned_behaviors&amp;gt;&lt;/code&gt;). We chose loud manual work over silent wrong work.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SCHEMA.md&lt;/code&gt; itself stays byte-equal across upgrades (Option C preservation). Migration report tag stays &lt;code&gt;[schema]&lt;/code&gt; — the only token historically valid across every shipped Meta vocabulary. One honest caveat: lint regex &lt;code&gt;^project:[a-z0-9][a-z0-9-]*$&lt;/code&gt; and the default cwd-derived project-id format are incompatible — to use &lt;code&gt;scope: project:*&lt;/code&gt; you must pass &lt;code&gt;--project-id=&amp;lt;slug&amp;gt;&lt;/code&gt;. Full reconciliation comes in the next minor.&lt;/p&gt;

&lt;p&gt;A related cross-project leak in the projection filter is also closed: a feedback page scoped to &lt;code&gt;project:other&lt;/code&gt; no longer projects into the current project's &lt;code&gt;MEMORY.md&lt;/code&gt;. Only &lt;code&gt;scope: global&lt;/code&gt; or exact &lt;code&gt;scope: project:${projectId}&lt;/code&gt; entries pass through.&lt;/p&gt;




&lt;h2&gt;
  
  
  The rest in one section
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Extensions companion sync.&lt;/strong&gt; The wiki ships &lt;code&gt;extensions/{agents, commands, hooks, skills}/&lt;/code&gt;. &lt;code&gt;init&lt;/code&gt; scaffolds; &lt;code&gt;upgrade&lt;/code&gt; mirrors into &lt;code&gt;~/.claude/&lt;/code&gt; (and with &lt;code&gt;--codex&lt;/code&gt;, the &lt;code&gt;hooks&lt;/code&gt; + &lt;code&gt;commands&lt;/code&gt; subset into &lt;code&gt;~/.codex/&lt;/code&gt;). &lt;code&gt;hypomnema doctor extensions&lt;/code&gt; audits orphans, matcher drift, non-registrable orphans. This means your personal agents / skills / commands ride along with the wiki and stay in sync across machines. What's left for a dotfiles tool like chezmoi is &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; body + &lt;code&gt;settings.json&lt;/code&gt; deltas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-project on cwd match.&lt;/strong&gt; Open a repo with a project marker (&lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;Cargo.toml&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt;, &lt;code&gt;pyproject.toml&lt;/code&gt;, …) but no wiki project? SessionStart offers to create one. "Y" scaffolds from &lt;code&gt;templates/projects/_template/&lt;/code&gt;. "N" gets recorded; 5-minute per-cwd cooldown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PostToolUse &lt;code&gt;WebFetch&lt;/code&gt; / &lt;code&gt;WebSearch&lt;/code&gt; auto-ingest signal.&lt;/strong&gt; Claude fetches a URL or runs &lt;code&gt;WebSearch&lt;/code&gt; → PostToolUse hook injects a nudge so Claude considers &lt;code&gt;/hypo:ingest&lt;/code&gt;. Privacy: URL &lt;code&gt;query&lt;/code&gt; / &lt;code&gt;hash&lt;/code&gt; / userinfo are stripped before injection on &lt;code&gt;WebFetch&lt;/code&gt; URLs (&lt;code&gt;WebSearch&lt;/code&gt; isn't URL-redacted because there's no URL being called).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update notifier + &lt;code&gt;--codex&lt;/code&gt; core hook mirror + &lt;code&gt;W8&lt;/code&gt; lint stale design-history + code comment cleanup.&lt;/strong&gt; Update banner at SessionStart (npm channel + Claude Code plugin channel; pick the one you're on). &lt;code&gt;upgrade --codex&lt;/code&gt; now mirrors core hooks (not just extensions). Lint emits &lt;code&gt;W8&lt;/code&gt; for stale &lt;code&gt;design-history.md&lt;/code&gt;. A comment-only cleanup pass landed across 13 files: rot-prone refs and codex verdict shorthand stripped while contract / spec / Layer anchors stay. New policy: time-bound cross-references belong in PR descriptions, not in code comments. A second cleanup pass is queued for the next track.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you actually get
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8 slash commands
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:ingest &amp;lt;url-or-path&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save raw to &lt;code&gt;sources/&lt;/code&gt;, synthesize a page in &lt;code&gt;pages/&lt;/code&gt;. &lt;strong&gt;Updates existing page if topic exists.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:query "..."&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BM25 retrieval + LLM synthesis. Answers cite &lt;code&gt;[[wikilink]]&lt;/code&gt;s.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:crystallize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;End-of-session: 11-step checklist that locks today's learnings into the wiki.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:resume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reload the most recent state of an active project.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:feedback "..."&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture an AI behavior correction — writes the SoT page directly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:verify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Audit pages whose &lt;code&gt;verify_by&lt;/code&gt; date has passed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:lint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Frontmatter / wikilink / schema validation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hypo:graph&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate a wikilink dependency graph.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5 CLI subcommands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hypomnema init                        # bootstrap a wiki
hypomnema upgrade [--apply] [--codex] # hooks / SCHEMA / extensions / migration report
hypomnema doctor [extensions]         # integrity audit
hypomnema uninstall                   # remove companion files
hypomnema feedback-sync --check|--write|--bootstrap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  14 lifecycle hooks
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SessionStart&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-session-start&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inject &lt;code&gt;hot.md&lt;/code&gt; / &lt;code&gt;session-state.md&lt;/code&gt;, &lt;code&gt;git pull --ff-only&lt;/code&gt;, offer auto-project, update notifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UserPromptSubmit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-lookup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BM25 top-3 HIT inject / MISS → closest-slug signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UserPromptSubmit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-compact-guard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detect &lt;code&gt;/compact&lt;/code&gt; → enforce checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UserPromptSubmit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-first-prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;First-prompt forced resume summary (marker-driven, 10-min TTL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CwdChanged&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-cwd-change&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inject the matching project's &lt;code&gt;hot.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FileChanged&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-file-watch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Notify on wiki-file changes (honors &lt;code&gt;.hypoignore&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostToolUse(Write/Edit)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-auto-stage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto &lt;code&gt;git add&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostToolUse(WebFetch/WebSearch)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-web-fetch-ingest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inject &lt;code&gt;/hypo:ingest&lt;/code&gt; nudge (URL redacted)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-auto-commit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto commit + pull --rebase + push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-hot-rebuild&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rebuild &lt;code&gt;hot.md&lt;/code&gt; from the latest session activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-session-record&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Record session metadata for the observability score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-auto-minimal-crystallize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Offer minimal crystallize on non-trivial session end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SessionEnd&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-session-end&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stash a &lt;code&gt;/clear&lt;/code&gt;-survivable marker so the next SessionStart can recover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PreCompact&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hypo-personal-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block compact on lint failures or unfinished session-close&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The synthesis-heavy commands also ship as &lt;strong&gt;Claude Agent Skills&lt;/strong&gt;, so they auto-trigger by description match — no slash required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Directory shape
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/hypomnema/
├── hypo-config.md       ← root marker
├── index.md             ← page catalog
├── hot.md               ← active project pointers
├── log.md               ← append-only activity log
├── SCHEMA.md            ← type system (v2.0, user-owned)
├── MIGRATION-*.md       ← created on schema bumps with a backfill checklist
├── .hypoignore          ← glob patterns to exclude
├── pages/
│   └── feedback/        ← AI behavior corrections (the SoT)
├── projects/&amp;lt;name&amp;gt;/
│   ├── hot.md
│   ├── session-state.md
│   └── session-log/
├── journal/{daily,weekly,monthly}/
├── extensions/{agents,commands,hooks,skills}/   ← mirrored to ~/.claude/
└── sources/             ← raw ingested sources, never edited
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How it stacks up against the other LLM-wiki OSS
&lt;/h2&gt;

&lt;p&gt;After Karpathy's Gist, ten-plus implementations appeared in a couple of weeks. I read all of them. Short version:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Strongest dimension&lt;/th&gt;
&lt;th&gt;Where Hypomnema differs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nvk/llm-wiki&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;--mode thesis&lt;/code&gt; (parallel for/against agents)&lt;/td&gt;
&lt;td&gt;We don't have thesis mode yet — on the roadmap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SamurAIGPT/llm-wiki-agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-format ingest (PDF/Word/PPT) + contradiction detection&lt;/td&gt;
&lt;td&gt;We do contradictions at lint time, not ingest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;swarmclawai/swarmvault&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Graph RAG with Louvain clustering&lt;/td&gt;
&lt;td&gt;We use Obsidian's graph view; no custom RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;nashsu/llm_wiki&lt;/code&gt; (6.6k ⭐)&lt;/td&gt;
&lt;td&gt;Electron desktop GUI, multi-language&lt;/td&gt;
&lt;td&gt;We're CLI + Obsidian, no GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Tencent/WeKnora&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enterprise RAG + ReAct + WeChat Mini&lt;/td&gt;
&lt;td&gt;Different category; we're personal-scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lucasastorian/llmwiki&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hosted web app (SQLite FTS5, MCP)&lt;/td&gt;
&lt;td&gt;We're local-first, file-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OmegaWiki&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9-entity typed graph&lt;/td&gt;
&lt;td&gt;We have lighter typed relations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Where Hypomnema is alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session lifecycle automation&lt;/strong&gt; — no other project hooks &lt;code&gt;SessionStart&lt;/code&gt;, &lt;code&gt;PreCompact&lt;/code&gt;, &lt;code&gt;Stop&lt;/code&gt; to keep the wiki maintained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source isolation&lt;/strong&gt; — &lt;code&gt;sources/&lt;/code&gt; is immutable. Other projects blur source and synthesis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI feedback as a single source of truth with one-way projections&lt;/strong&gt; — &lt;code&gt;/hypo:feedback&lt;/code&gt; writes a typed page; &lt;code&gt;hypomnema feedback-sync&lt;/code&gt; projects into Claude Code's memory and global rules layers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companion sync for &lt;code&gt;~/.claude/{agents,commands,hooks,skills}/&lt;/code&gt;&lt;/strong&gt; — your personal Claude Code companion files ride along with the wiki.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bi-gram BM25 for Korean&lt;/strong&gt; — small thing, shipped by default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The summary I keep coming back to: &lt;strong&gt;other projects are about how to structure wiki content. Hypomnema is about automating the loop of working with an AI assistant over months.&lt;/strong&gt; Different problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things deliberately left out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No vector DB.&lt;/strong&gt; BM25 + LLM synthesis covers personal-scale corpora. Vector DBs are a future failure mode (they get bought, deprecated, or leak credentials).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No API keys.&lt;/strong&gt; Claude Code is the only AI dependency, and you already have it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No GUI.&lt;/strong&gt; Obsidian already exists and is excellent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No mode matrix.&lt;/strong&gt; A single &lt;code&gt;.hypoignore&lt;/code&gt; beats &lt;code&gt;personal / shared / public&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No auto-stub on SCHEMA bumps.&lt;/strong&gt; Wrong defaults silently project wrong behavior. Loud manual work beats silent wrong work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole stack is intentionally boring. The interesting part is what Claude does on top of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dogfooding the SoT engine on ourselves
&lt;/h2&gt;

&lt;p&gt;The day the release was ready to publish, I ran &lt;code&gt;hypomnema feedback-sync --check&lt;/code&gt; against my own machine for the first real time. Three things broke at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The engine reported claude-target candidates = &lt;strong&gt;11&lt;/strong&gt;, cap = &lt;strong&gt;10&lt;/strong&gt;, &lt;code&gt;overCap=true&lt;/code&gt;, &lt;code&gt;dirty=true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;My &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; &lt;code&gt;&amp;lt;learned_behaviors&amp;gt;&lt;/code&gt; had &lt;strong&gt;14 hand-written entries&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Of those 14, &lt;strong&gt;9 had a backing page already in the wiki&lt;/strong&gt; (i.e., duplicate hand-syncs that should have been managed blocks). &lt;strong&gt;5 had no backing page&lt;/strong&gt; (hand-written-only rules I'd never page-promoted).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So "14 vs cap 10" wasn't an over-cap problem. It was three problems compressed: (a) one demote needed to land under the cap, (b) nine duplicates needed cleanup, (c) five page-less rules needed a separate promotion track.&lt;/p&gt;

&lt;p&gt;I ran codex through three candidates for the demote and picked the lowest-operating-loss one. I edited its frontmatter (&lt;code&gt;targets&lt;/code&gt; removed &lt;code&gt;claude-learned&lt;/code&gt;, &lt;code&gt;promote_to_global: false&lt;/code&gt;). I ran &lt;code&gt;--check&lt;/code&gt; again — green. I ran &lt;code&gt;--write&lt;/code&gt; — &lt;code&gt;&amp;lt;learned_behaviors&amp;gt;&lt;/code&gt; now had a &lt;code&gt;HYPO:FEEDBACK-SYNC:START / END&lt;/code&gt; fenced block with 10 managed entries. I removed the 9 duplicate hand-writtens. End state: 5 hand-written + 10 managed = 15 entries. &lt;code&gt;--check&lt;/code&gt; clean. Vault commit &lt;code&gt;18dd4e8&lt;/code&gt;. Engine transitioned from dormant to active.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's worth saying out loud about that moment&lt;/strong&gt;: a self-operating system surfaces &lt;em&gt;its operator's accumulated drift&lt;/em&gt; on first run. The engine was fine. The data was the failure mode — a month of hand-sync I hadn't kept clean. That's the shape of dogfood that actually catches something — not "does the binary run," but "what does the binary surface about the operator."&lt;/p&gt;

&lt;p&gt;The five hand-written-only rules become next-minor work (page them, decide demote, run &lt;code&gt;--write&lt;/code&gt;). The nine cleanup wasn't a one-off; it's evidence the cap + gate enforcement was right.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ready to try?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; hypomnema
&lt;span class="c"&gt;# in Claude Code:&lt;/span&gt;
/hypo:init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The hooks register themselves. First commit happens automatically. If you set a remote, &lt;code&gt;Stop&lt;/code&gt; will keep every machine in sync.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/sk-lim19f/Hypomnema" rel="noopener noreferrer"&gt;https://github.com/sk-lim19f/Hypomnema&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/hypomnema" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/hypomnema&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've been frustrated by the "I write notes I never re-read" loop, give it a week. The compounding shows up around day 10 — the moment a third article on the same topic &lt;em&gt;updates&lt;/em&gt; an existing page instead of creating a new one. That's when the model in your head clicks.&lt;/p&gt;

&lt;p&gt;The next-minor contribution magnet: &lt;strong&gt;a chezmoi bridge for &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; and &lt;code&gt;settings.json&lt;/code&gt;&lt;/strong&gt; so the feedback-sync projection works across machines without manual sync. The Extensions companion already covers &lt;code&gt;agents&lt;/code&gt; / &lt;code&gt;skills&lt;/code&gt; / &lt;code&gt;commands&lt;/code&gt; / &lt;code&gt;hooks&lt;/code&gt;, but the &lt;code&gt;CLAUDE.md&lt;/code&gt; body itself is still machine-local. Solving it has impact on the whole LLM-wiki OSS ecosystem — no project there has done it yet.&lt;/p&gt;

&lt;p&gt;Feedback, issues, PRs welcome. If you build something on top of it, drop a comment — I'd love to see it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
