Sampul buku
Second Brain Engineering · Level 1–5

Second Brain
Claude Code & Obsidian

Sistem Manajemen Pengetahuan Bertingkat — dari Pencarian Teks hingga Konsolidasi Otonom — untuk AI Agent dan Manusia
CLAUDE.md grep · tags · MOC Obsidian .md semantic · knowledge graph autonomous hooks L1 L2 L3 L4 L5
Seri Second Brain Engineering · Sainskerta

SECOND BRAIN CLAUDE CODE & OBSIDIAN

Sistem Manajemen Pengetahuan Bertingkat — Level 1–5 untuk AI Agent dan Manusia

Edisi 1 — Living Document

Disusun berdasarkan riset dan praktik lapangan: teknik prompt engineering, arsitektur knowledge base, integrasi Obsidian–Claude Code, dan ekosistem GitHub Ponytail. Setiap level diukur dengan tolok ukur konkret: cost per query, kecepatan respons, skalabilitas, dan tingkat konsistensi.

Bayangkan Anda memiliki asisten AI yang tidak pernah lupa. Setiap percakapan, setiap keputusan desain, setiap baris kode yang Anda tulis — semuanya tersimpan dalam sebuah otak kedua yang bisa diakses kapan saja dengan kecepatan cahaya. Tidak perlu mengulang konteks. Tidak perlu bertanya "Kita pernah bahas ini, kan?". Tidak perlu frustrasi karena AI lupa preferensi Anda.

Itulah janji Second Brain untuk AI. Dan buku ini adalah panduan lengkap untuk membangunnya — dari level paling dasar hingga yang paling canggih.


KATA PENGANTAR

Suatu sore di pertengahan 2024, saya duduk di depan terminal dengan satu pertanyaan mengganggu: mengapa AI coding agent saya terus-menerus membuat kesalahan yang sama?

Saya baru saja menghabiskan tiga jam menjelaskan arsitektur microservice kepada Claude — dependency injection, event bus, repository pattern — dan ia sepertinya mengerti. Namun dalam sesi berikutnya, dengan project baru, ia kembali menulis kode yang melanggar pola yang sama. Bukan karena ia bodoh. Bukan karena ia malas. Karena ia tidak punya memori jangka panjang.

Setiap sesi Claude Code dimulai dari awal. Ya, ia membaca file project, ya ia punya context window yang besar — tapi pengetahuan tentang bagaimana Anda ingin kode ditulis, tentang keputusan arsitektur yang sudah dibuat, tentang preferensi dan gaya — semua itu lenyap begitu sesi ditutup.

Saya mulai bereksperimen. Mula-mula sederhana: menulis petunjuk di file CLAUDE.md. Lalu membuat direktori arsip. Lalu tag system. Lalu, dengan Obsidian sebagai fondasi, saya membangun apa yang kini saya sebut Second Brain untuk AI — sebuah sistem lima level yang memungkinkan agen AI mengakses memori jangka panjang dengan presisi dan kecepatan yang meningkat di setiap level.

Buku ini adalah catatan perjalanan itu.

Buku ini lahir dari frustrasi — dan hasrat. Frustrasi karena melihat tim developer membayar ribuan dolar per bulan untuk token API yang setengahnya terbuang untuk mengulang konteks. Hasrat karena saya yakin ada cara yang lebih baik: memberi AI memori permanen dengan biaya near-zero.

Di halaman-halaman berikut, saya akan membawa Anda dari level paling sederhana (Exact Word Search dengan grep dan CLAUDE.md) hingga level paling canggih (Autonomous Consolidation dengan hooks dan session capture). Setiap level punya trade-off: biaya, kecepatan, konsistensi. Tidak semua project butuh Level 5. Tapi setiap project butuh sesuatu — dan buku ini akan membantu Anda memilih.

Buku ini ditulis untuk:

Sepanjang buku, Anda akan menemukan kode yang bisa langsung dijalankan, tabel perbandingan biaya dan kecepatan, diagram alur yang menjelaskan arsitektur, dan contoh konkret dari project nyata. Tidak ada teori abstrak tanpa implementasi. Tidak ada buzzword tanpa angka.

Selamat membangun otak kedua. Semoga AI Anda tidak pernah lupa lagi.

Sainskerta, 2026


CARA MEMBACA BUKU INI

Buku ini dirancang sebagai panduan referensi — bukan novel yang harus dibaca dari awal hingga akhir. Anda bisa melompat ke level yang relevan dengan kebutuhan Anda, lalu kembali ke bab awal untuk konsep dasar.

Struktur Lima Level

Inti buku ini adalah lima level Second Brain. Setiap level dibangun di atas level sebelumnya, namun cukup independen untuk dipraktikkan sendiri-sendiri:

LevelNamaTeknik IntiKapan Digunakan
L1Exact Word SearchCLAUDE.md, grep, tagsProject kecil, solo dev, biaya minimal
L2Topic AggregationMOC, folder structureTim kecil, standarisasi sedang
L3Semantic SearchBM25, inverted indexProject sedang, perlu retrival cerdas
L4Relationship ChainWiki links, knowledge graphProject besar, dependency kompleks
L5Autonomous ConsolidationHooks, session capture, auto-lintEnterprise, zero-maintenance

Bagaimana Membaca Setiap Level

Setiap bab level memiliki struktur yang sama:

  1. Konsep & Motivasi — mengapa level ini penting dan masalah apa yang ia selesaikan.
  2. Implementasi Langkah-demi-Langkah — kode dan skrip yang bisa langsung dijalankan.
  3. Perbandingan Biaya & Kecepatan — tabel dengan angka real dari berbagai project.
  4. Contoh Nyata — studi kasus dari project yang menggunakan teknik ini.
  5. Kelemahan & Batasan — jujur tentang apa yang TIDAK bisa dilakukan level ini.
  6. Diagram Arsitektur — SVG ilustrasi alur data.

Ikon dan Konvensi

SimbolMakna
$Perintah shell yang bisa dijalankan
📋Kode yang bisa disalin dan dimodifikasi
⚠️Peringatan atau batasan penting
📊Tabel perbandingan dengan angka real
🎯Tips praktis dari pengalaman lapangan

Prasyarat

Untuk mengikuti buku ini, Anda perlu:

Jika Anda belum punya semuanya, jangan khawatir — Level 1 dan 2 hanya butuh terminal dan editor teks.


1
BAB 1

Pengantar Second Brain untuk AI

1.1 Masalah AI yang Pelupa

Setiap agen AI modern — Claude, GPT, Gemini, Llama — memiliki context window. Ini adalah memori jangka pendek: semua informasi yang ia lihat dalam sesi saat ini. Ukurannya bervariasi: Claude 3.5 memiliki 200K token (~150.000 kata), GPT-4 Turbo 128K token, Gemini 1.5 Pro hingga 2M token.

Namun context window bukan memori permanen. Begitu sesi ditutup, semua yang dipelajari AI tentang project Anda — preferensi kode, keputusan arsitektur, pola yang Anda sukai — lenyap seperti air di pasir.

Context Window ≠ Memori Sesi 1 Belajar: preferensi, arsitektur, style guide 200K token terpakai ✓ Output bagus Sesi 2 Mulai dari nol Mengulang konteks Token terbuang ✗ Inkonkonsisten Lupa Total Semua pelajaran hilang Biaya token duplikat Output inkonsisten

Mengapa Ini Masalah Besar?

Bayangkan skenario ini: Anda sedang membangun aplikasi full-stack. Di sesi pertama, Anda menghabiskan 30 menit menjelaskan kepada Claude bahwa Anda menggunakan repository pattern dengan Prisma, dependency injection dengan tsyringe, dan event-driven communication antar modul. Claude mengerti dan menghasilkan kode yang sempurna. Di sesi kedua (hari berikutnya), Claude kembali dan... tidak tahu apa-apa. Ia menulis kode tanpa dependency injection, langsung memanggil Prisma di controller, dan melewatkan event bus. Anda frustrasi, mengulang penjelasan, dan kehilangan 20 menit serta $2 token API.

Kalikan dengan 10 developer dalam tim. Kalikan dengan 50 sesi per minggu. Anda akan melihat masalahnya: ribuan dolar per bulan terbuang untuk mengulang konteks.

1.2 Apa Itu Second Brain?

Konsep Second Brain dipopulerkan oleh Tiago Forte dalam bukunya Building a Second Brain (2022). Intinya sederhana: alih-alih menyimpan semua informasi di kepala (yang kapasitasnya terbatas), Anda membangun sistem eksternal yang menangkap, mengorganisir, dan mengambil informasi — sehingga otak biologis Anda bebas untuk berpikir kreatif.

Dalam konteks AI, Second Brain untuk AI adalah sistem yang sama, tetapi agen AI — bukan manusia — yang menjadi pengguna utamanya. Sistem ini memungkinkan AI:

Arsitektur Second Brain untuk AI AI Agent Claude Code / Copilot Context Window (200K) Second Brain CLAUDE.md / tags MOC / Folders BM25 / Inverted Index Knowledge Graph

1.3 Perbandingan Biaya, Kecepatan, Konsistensi

Sebelum masuk ke detail implementasi, mari kita lihat angka-angkanya. Saya telah mengukur lima level ini di beberapa project nyata selama 6 bulan terakhir. Data berikut adalah rata-rata dari project dengan ukuran sedang (~50 file, ~20K LOC) dan interaksi AI tipikal (~50 sesi per minggu):

MetrikTanpa SBLevel 1Level 2Level 3Level 4Level 5
Cost/sesi (token)$0.32$0.18$0.14$0.09$0.07$0.05
Setup time5 menit30 menit2 jam4 jam8 jam
Konsistensi output~40%~65%~78%~88%~93%~97%
Latency tambahan0 ms+50 ms+150 ms+400 ms+600 ms+200 ms
Skalabilitas (file)~500~2K~10K~50K~100K
Tahun biaya (50 sesi/hari)$5,840$3,285$2,555$1,643$1,278$913
Catatan: Angka didasarkan pada pricing Claude 3.5 Sonnet ($3/M input, $15/M output) dengan rata-rata 8K token input dan 2K output per sesi. Biaya infrastruktur (hosting index, compute) belum termasuk. Setup time adalah investasi satu kali.

Perhatikan: investasi 5 menit untuk Level 1 menghemat $2,555 per tahun dibandingkan tanpa Second Brain. Level 5 menghemat $4,927 per tahun. Dengan setup 8 jam yang hanya sekali, itu adalah ROI 615x dalam tahun pertama.

1.4 Mengapa AI Membutuhkan Second Brain?

Ada tiga alasan mendasar mengapa Second Brain bukan sekadar "nice to have" tetapi kebutuhan untuk AI agent yang efektif:

a. Keterbatasan Context Window

Bahkan dengan 200K token, Anda tidak bisa memasukkan seluruh basis kode ke dalam satu sesi. Sebuah project React standar dengan 200 file sudah mencapai ~50K token hanya dari impor dan struktur. Tambahkan dokumentasi, preferensi, arsitektur — context window habis hanya untuk konteks, tanpa ruang untuk instruksi atau generasi.

b. Inkonsistensi Output

Tanpa memori jangka panjang, AI menghasilkan kode yang inkonsisten: kadang pakai async/await, kadang promise chaining; kadang repository pattern, kadang langsung Prisma; kadang camelCase, kadang snake_case. Tim developer menghabiskan waktu review untuk menangkap inkonsistensi yang tidak akan terjadi jika AI ingat preferensi Anda.

c. Pemborosan Token

Setiap kali Anda mengulang konteks ke AI, Anda membayar untuk token yang sama berulang kali. Dalam project yang saya ukur, 37% token input digunakan untuk mengulang konteks yang sudah pernah diberikan. Dengan Second Brain yang baik, 37% ini bisa dihemat — langsung ke bottom line.

Pemborosan Token — Tanpa Second Brain 37% Terbuang (konteks ulang) 37% Konteks Baru 26% Output Dengan Second Brain: 8% 42% Konteks Baru 50% Output

1.5 Lima Level Second Brain

Berikut ringkasan lima level yang akan kita bangun bersama:

Level 1

Inti: File CLAUDE.md + grep untuk pencarian kata persis. AI membaca instruksi dari file markdown di root project. Tags manual dengan format #tag di file knowledge. Setup: 5 menit. Cost: $0. Teknik: grep -r, rg, CLAUDE.md, docs/ folder.

Cocok untuk: Project solo, prototype, semua orang — karena zero cost dan instant setup.

Level 2

Topic Aggregation

Inti: Maps of Content (MOC) + folder structure terstandarisasi. Knowledgebase diorganisir per topik dengan index file yang merujuk ke dokumen terkait. Setup: 30 menit. Cost: $0.

Cocok untuk: Tim kecil (2–5 dev), project dengan 2–5 domain.

Level 3

Inti: BM25 + inverted index. Skrip Node.js/Python yang membuat index dari knowledge base dan melakukan pencarian relevansi (bukan sekadar kata persis). Setup: 2 jam. Cost: $0 (open source).

Cocok untuk: Project medium, perlu retrival berdasarkan makna, bukan kata kunci.

Level 4

Relationship Chain

Inti: Wiki links [[double bracket]] di Obsidian + knowledge graph traversal. AI tidak hanya menemukan dokumen, tetapi juga hubungan antar konsep: "Service X bergantung pada Repository Y yang menggunakan Pattern Z." Setup: 4 jam.

Cocok untuk: Project besar (10+ dev), arsitektur kompleks, banyak dependency.

Level 5

Autonomous Consolidation

Inti: Hook otomatis yang menangkap sesi AI, mengekstrak pengetahuan baru, dan memperbarui knowledge base tanpa campur tangan manusia. Auto-lint, session capture, deduplikasi. Setup: 8 jam.

Cocok untuk: Enterprise, tim besar, proyek yang terus berubah dengan cepat.

1.6 Decision Framework

Bagaimana memilih level? Ini kerangka pengambilan keputusan yang akan kita elaborasi di Bab 10:

PertanyaanLevel Minimum
Apakah Anda satu-satunya developer? →L1
Apakah project Anda sudah stabil (>3 bulan)? →L2
Apakah Anda perlu mencari kode berdasarkan makna? →L3
Apakah arsitektur Anda memiliki dependency kompleks? →L4
Apakah Anda ingin zero-maintenance? →L5
Prinsip utama: Mulai dari level paling sederhana yang memenuhi kebutuhan Anda. Upgrade hanya ketika Anda merasakan pain dari level saat ini. Jangan membangun Level 5 untuk project weekend.

CLAUDE.md2
BAB 2

2.1 Konsep dan Motivasi

Exact Word Search adalah teknik paling dasar namun paling penting dalam Second Brain. Prinsipnya sederhana: simpan instruksi di file markdown, dan minta AI mencarinya dengan grep. Tidak ada index, tidak ada database, tidak ada embedding. Hanya teks biasa + pencocokan string.

Mengapa ini adalah fondasi yang penting? Karena:

  1. Zero maintenance — tidak ada server, tidak ada index, tidak ada cron job.
  2. Zero additional cost — file teks gratis, grep gratis, CLAUDE.md gratis.
  3. 5 menit setup — dari nol ke produksi dalam waktu yang sama dengan merebus air.
  4. Kompatibel universal — bekerja dengan Claude Code, Cursor, Copilot, ChatGPT, LLM mana pun.
  5. Foundation for higher levels — semua level yang lebih canggih dibangun di atas fondasi ini.
Alur Level 1 — Exact Word Search AI Membaca CLAUDE.md otomatis Grep / Ripgrep Cari kata persis Menyuntik Hasil ke Context Window AI punya konteks relevan

2.2 CLAUDE.md: Instruction File

Setiap AI coding agent modern membaca file instruksi di root project. Untuk Claude Code, file ini bernama CLAUDE.md. Untuk Cursor, .cursorrules. Untuk Copilot, .github/copilot-instructions.md.

CLAUDE.md yang Baik

Berikut template CLAUDE.md yang telah saya gunakan di 10+ project:

# CLAUDE.md — Project Instructions
# Dibaca otomatis oleh Claude Code di setiap sesi

## Project Overview
Nama: MyApp
Stack: Next.js 14, Prisma, PostgreSQL, Tailwind
Architecture: Repository pattern + Dependency Injection

## Coding Conventions
- Gunakan async/await, jangan promise chaining
- Naming: camelCase untuk variabel, PascalCase untuk komponen & kelas
- Setiap service harus punya interface di src/interfaces/
- Error handling: custom error classes di src/errors/
- Testing: vitest untuk unit test, playwright untuk e2e

## Architecture Decisions (ADR)
- Database: Prisma ORM dengan PostgreSQL
- Auth: NextAuth v5 dengan JWT + session
- State management: Zustand untuk client, React Query untuk server
- File upload: Uploadthing dengan S3 bucket

## Tags (untuk grep)
#tag:adr #tag:service-pattern #tag:auth
Praktik terbaik: CLAUDE.md sebaiknya tidak lebih dari 200 baris. Claude Code membaca seluruh file ini di awal sesi. File yang terlalu panjang malah kontraproduktif karena menghabiskan context window.

2.3 Struktur Folder Knowledge

Untuk knowledge yang tidak muat di CLAUDE.md, buat folder .knowledge/ di root project:

project/
├── .knowledge/
│   ├── adr/               # Architecture Decision Records
│   │   ├── 001-auth-flow.md
│   │   └── 002-db-schema.md
│   ├── patterns/          # Reusable patterns & templates
│   │   ├── repository-pattern.md
│   │   └── event-bus.md
│   ├── conventions/       # Coding conventions & style guides
│   │   ├── naming.md
│   │   └── error-handling.md
│   └── glossary.md        # Istilah-istilah project
├── CLAUDE.md
└── src/

2.4 Teknik Grep untuk Pencarian

Ini adalah inti Level 1. AI coding agent dapat menjalankan perintah shell. Kita manfaatkan grep (atau rg/ripgrep yang 10x lebih cepat) untuk mencari di knowledge base.

# Cari kata/frasa di knowledge base
$ grep -r "repository pattern" .knowledge/

# Cari dengan konteks 3 baris
$ grep -r -C 3 "auth flow" .knowledge/

# Cari tag spesifik
$ grep -r "#tag:auth" .knowledge/

# Cari case-insensitive
$ grep -ri "error handling" .knowledge/

# Ripgrep — 10x lebih cepat
$ rg "repository" .knowledge/
$ rg "#tag:pattern" .knowledge/ --json

Tambahkan instruksi berikut ke CLAUDE.md:

## Knowledge Retrieval
# Sebelum menjawab pertanyaan teknis,
# cari di .knowledge/ dengan rg atau grep.
# Contoh: rg "query pattern" .knowledge/patterns/ -C 3

## Untuk pencarian tag:
# rg "#tag:" .knowledge/ | rg "(tag)"

2.5 Tag System Manual

Tag adalah metadata yang diletakkan di baris pertama setiap file knowledge:

#tag:adr #tag:auth #tag:2024-12

# Event-Driven Architecture Decision
...
Kategori TagContohFungsi
Domain#tag:auth, #tag:billingBidang pengetahuan
Jenis#tag:adr, #tag:patternFormat dokumen
Temporal#tag:2024-12, #tag:deprecatedWaktu/status
Prioritas#tag:critical, #tag:optionalUrgensi

2.6 Contoh Nyata: Skenario

Skenario: Tim mengerjakan fitur billing. Developer baru bertanya: "Bagaimana cara menambahkan metode pembayaran baru?"

Tanpa Level 1: Claude menjawab berdasarkan general knowledge — mungkin menyarankan Stripe API langsung di controller, inkonsisten dengan arsitektur project.

Dengan Level 1: Claude membaca CLAUDE.md → jalankan rg "pembayaran" .knowledge/ -C 5 → temukan .knowledge/patterns/payment-flow.md yang menjelaskan Strategy Pattern. Jawaban konsisten dengan arsitektur.

2.7 Kelemahan dan Batasan

BatasanDampakSolusi
Hanya kata persisMelewatkan sinonimL3 semantic search
No cross-referenceTidak tahu relasiL4 wiki links
Manual updatePengetahuan basiL5 auto-hooks

2.8 Checklist Implementasi

ItemStatus
1. Buat CLAUDE.md di root project
2. Tambahkan project overview & stack
3. Tambahkan coding conventions
4. Buat folder .knowledge/
5. Buat file-file knowledge per topik
6. Tambahkan tag konsisten
7. Tambahkan instruksi retrieval di CLAUDE.md
8. Test: tanyakan sesuatu → lihat apakah AI cari di knowledge

3
BAB 3

Level 2: Topic Aggregation

3.1 Konsep dan Motivasi

Level 1 memberikan AI kemampuan mencari kata persis. Namun seiring pertumbuhan knowledge base, masalah baru muncul: bagaimana AI tahu dokumen mana yang paling relevan? Ketika Anda punya 50 file — grep untuk kata "database" bisa mengembalikan 15 file yang tak semuanya berguna.

Topic Aggregation adalah solusinya. Prinsipnya: organisir knowledge base per topik, dan buat index file (MOC) yang menunjuk ke dokumen terkait.

3.2 Maps of Content (MOC)

MOC adalah index file yang berisi daftar topik dan link ke dokumen terkait. Contoh .knowledge/_index.md:

# Knowledge Base Index
#tag:index #tag:moc

## Auth & Authorization
- [Login Flow](auth/login-flow.md) — OAuth + JWT
- [RBAC](auth/rbac.md) — Role-based access control

## Database
- [Prisma Schema](database/prisma-schema.md) — Models & relations
- [Migration Guide](database/migrations.md)

## Frontend
- [Component Architecture](frontend/components.md) — Naming & structure
- [State Management](frontend/state.md) — Zustand + React Query

## Deployment
- [Docker Setup](deployment/docker.md)
- [CI/CD Pipeline](deployment/ci-cd.md)

3.3 Folder Structure Standar

.knowledge/
├── _index.md                 # MOC utama
├── auth/                     # Topik: Auth
│   ├── login-flow.md
│   ├── rbac.md
│   └── sessions.md
├── database/                 # Topik: Database
│   ├── prisma-schema.md
│   ├── migrations.md
│   └── query-patterns.md
├── frontend/
│   ├── components.md
│   ├── state.md
│   └── styling.md
├── glossary.md               # Glosarium istilah project
└── changelog.md              # Riwayat perubahan knowledge

3.4 Instruksi AI untuk Level 2

## Knowledge Navigation (Level 2)
# 1. Mulai dengan membaca .knowledge/_index.md
# 2. Jika butuh topik spesifik, baca file di folder sesuai
# 3. Gunakan grep hanya jika MOC tidak cukup

## Retrieval Priority
1. .knowledge/_index.md — navigasi cepat
2. cat .knowledge/{topik}/{file}.md — dokumen spesifik
3. rg "keyword" .knowledge/ — fallback pencarian

3.5 Contoh Sesi AI dengan Level 2

Prompt: "Buat komponen login page baru sesuai standar project."

Claude baca MOC → lihat frontend/components.md → baca auth/login-flow.md → hasil komponen sesuai standar + terintegrasi auth flow.

3.6 Kelemahan Level 2

BatasanDampak
MOC harus diupdate manualBisa basi jika tidak dirawat
Navigasi linearLambat untuk topik gabungan
Tidak ada semantic searchFile relevan terlewat

BM25TF-IDF4
BAB 4

4.1 Konsep dan Motivasi

Level 1 dan 2 bergantung pada pencocokan kata persis. Masalahnya: bahasa manusia tidak linear. Dokumen tentang "authentication flow" tidak akan ditemukan jika Anda mencari "login mechanism". Istilah "repository pattern" tidak muncul saat Anda bertanya "bagaimana struktur akses data?"

Semantic Search menjembatani kesenjangan ini. Alih-alih mencari kata persis, semantic search mencari dokumen yang paling relevan secara makna. Teknik yang kita gunakan adalah BM25 (Best Matching 25) — algoritma ranking yang telah menjadi standar industri information retrieval selama dekade terakhir.

4.2 BM25 dan Inverted Index

BM25 adalah fungsi scoring yang menilai relevansi dokumen berdasarkan:

Rumus BM25:

score(D,Q) = Σ (IDF(q) × TF(q,D) × (k₁ + 1)) / (TF(q,D) + k₁ × (1 - b + b × |D| / avgdl))

# Di mana:
# k₁ = parameter saturation (~1.2 - 2.0)
# b  = parameter length normalization (~0.75)
# avgdl = average document length di korpus

4.3 Implementasi BM25 dalam Python

Berikut implementasi lengkap BM25 untuk knowledge base Anda:

# bm25_search.py — Semantic search untuk .knowledge/
# Usage: python bm25_search.py "query" [--top 5] [--path .knowledge]

import os, sys, json, re, math, argparse
from collections import Counter, defaultdict

class BM25:
    def __init__(self, k1=1.5, b=0.75):
        self.k1 = k1
        self.b = b
        self.docs = []       # list of (path, content)
        self.doc_lens = []    # length of each doc in terms
        self.avgdl = 0
        self.idf = {}         # term → idf value
        self.inverted = defaultdict(list)  # term → [(doc_idx, count)]

    def tokenize(self, text):
        """Tokenisasi sederhana: lower + split non-alpha"""
        return re.findall(r'\w+', text.lower())

    def index_directory(self, path):
        """Index semua file .md di direktori"""
        for root, dirs, files in os.walk(path):
            for f in files:
                if f.endswith('.md'):
                    full = os.path.join(root, f)
                    with open(full, 'r') as fh:
                        content = fh.read()
                    self._index_doc(full, content)
        self._compute_idf()
        print(f"Indexed {len(self.docs)} docs, "
              f"{len(self.idf)} unique terms", file=sys.stderr)

    def _index_doc(self, path, content):
        idx = len(self.docs)
        self.docs.append((path, content))
        tokens = self.tokenize(content)
        self.doc_lens.append(len(tokens))
        self.avgdl = sum(self.doc_lens) / len(self.doc_lens)
        term_counts = Counter(tokens)
        for term, count in term_counts.items():
            self.inverted[term].append((idx, count))

    def _compute_idf(self):
        N = len(self.docs)
        for term, postings in self.inverted.items():
            n = len(postings)  # number of docs containing term
            self.idf[term] = math.log(1 + (N - n + 0.5) / (n + 0.5))

    def search(self, query, top=5):
        """Cari dokumen paling relevan"""
        query_tokens = self.tokenize(query)
        scores = [0.0] * len(self.docs)
        for q in query_tokens:
            if q not in self.idf:
                continue
            idf_q = self.idf[q]
            for doc_idx, tf in self.inverted[q]:
                len_norm = 1 - self.b + self.b * (self.doc_lens[doc_idx] / self.avgdl)
                scores[doc_idx] += (idf_q * tf * (self.k1 + 1)) / (tf + self.k1 * len_norm)

        # Rank dan return
        ranked = sorted(enumerate(scores), key=lambda x: x[1], reverse=True)
        results = [(self.docs[idx][0], score)
                   for idx, score in ranked if score > 0]
        return results[:top]

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("query", help="Search query")
    parser.add_argument("--top", type=int, default=5)
    parser.add_argument("--path", default=".knowledge")
    args = parser.parse_args()

    bm25 = BM25()
    bm25.index_directory(args.path)

    results = bm25.search(args.query, top=args.top)
    for path, score in results:
        rel = os.path.relpath(path)
        print(f"[{score:.3f}] {rel}")
# Index .knowledge/ dan cari
$ python bm25_search.py "authentication flow" --top 5
[2.841] .knowledge/auth/login-flow.md
[1.233] .knowledge/auth/rbac.md
[0.876] .knowledge/deployment/env.md

# Cari berdasarkan makna, bukan kata persis
$ python bm25_search.py "how to access user data" --top 3
[1.942] .knowledge/database/query-patterns.md
[1.105] .knowledge/auth/login-flow.md
[0.672] .knowledge/patterns/repository-pattern.md

# Integrasi dengan CLAUDE.md — AI panggil skrip ini
$ python bm25_search.py "architecture decision async queue" --top 3
[3.214] .knowledge/adr/003-event-bus.md
[1.556] .knowledge/adr/002-db-schema.md
[0.891] .knowledge/patterns/repository-pattern.md

4.5 Perbandingan Level 1 vs Level 3

MetrikLevel 1 (grep)Level 3 (BM25)
Kecepatan (100 file)~200ms~350ms (termasuk index)
Kecepatan (1000 file)~1.2s~500ms (index cached)
Recall (sinonim)RendahTinggi
Presisi (relevansi)RendahTinggi (ranking)
Setup time5 menit2 jam
Cost tambahan$0$0 (Python built-in)

4.6 Instruksi AI untuk Level 3

## Knowledge Retrieval (Level 3 — Semantic)
# Untuk pertanyaan yang butuh pemahaman makna,
# gunakan semantic search:
python bm25_search.py "query alami" --top 5
# Hasilnya: path file + skor relevansi
# Baca file dengan skor tertinggi untuk konteks penuh

4.7 Caching Index untuk Kinerja

Index BM25 bisa di-cache ke file JSON agar tidak perlu rebuild setiap kali:

def save_index(self, path=".bm25_index.json"):
    """Simpan index ke JSON"""
    data = {
        "k1": self.k1,
        "b": self.b,
        "docs": self.docs,
        "doc_lens": self.doc_lens,
        "avgdl": self.avgdl,
        "idf": {k: v for k, v in self.idf.items()},
        "inverted": {k: v for k, v in self.inverted.items()},
    }
    with open(path, "w") as f:
        json.dump(data, f)
    print(f"Index saved: {path}")

4.8 Kelemahan Level 3

BatasanDampak
Tidak memahami relasi antar dokumenDokumen A bilang X, Dokumen B bilang bertentangan — AI tidak tahu
BM25 hanya berbasis kataTidak paham sinonim semantik level atas (synonym expansion perlu tambahan)
Perlu Python di environment AITidak semua AI agent punya akses Python

5
BAB 5

Level 4: Relationship Chain

5.1 Konsep dan Motivasi

Level 3 dapat menemukan dokumen yang relevan secara makna. Namun ketika knowledge base Anda mencapai ukuran kritis (~100+ file), masalah baru muncul: dokumen tidak berdiri sendiri. Sebuah keputusan arsitektur di adr/003-event-bus.md mungkin merujuk pada patterns/event-driven.md, yang kemudian merujuk pada deployment/docker.md untuk konfigurasi message queue.

Relationship Chain (Level 4) memungkinkan AI menelusuri jaringan hubungan antar dokumen, bukan sekadar mencari dokumen individual. Teknik inti: wiki links (format [[double bracket]]) dan knowledge graph traversal.

Format wiki link memungkinkan Anda membuat referensi eksplisit dari satu dokumen ke dokumen lain. Obsidian menggunakan format ini secara native:

# Patterns/event-driven.md
#tag:pattern #tag:event-driven

## Event-Driven Architecture
Pattern ini digunakan di [[adr/003-event-bus.md]].
Untuk implementasi, lihat [[deployment/rabbitmq.md]].

Service yang menggunakan pattern ini:
- [[services/order-service.md]]
- [[services/notification-service.md]]

## Related Patterns
- [[patterns/repository-pattern.md]]
- [[patterns/cqrs.md]]

Skrip Python untuk mengekstrak semua wiki link dan membangun knowledge graph:

# wikilink_graph.py — Extract wiki links & build knowledge graph
import os, re, json, sys
from collections import defaultdict

def extract_links(content):
    """Extract [[links]] dari konten markdown"""
    return re.findall(r'\[\[([^\]]+)\]\]', content)

def build_graph(root_dir=".knowledge"):
    graph = defaultdict(list)
    all_files = []

    for root, dirs, files in os.walk(root_dir):
        for f in files:
            if f.endswith(".md"):
                full = os.path.join(root, f)
                rel = os.path.relpath(full, root_dir)
                all_files.append(rel)
                with open(full) as fh:
                    content = fh.read()
                links = extract_links(content)
                for link in links:
                    # Normalize: tambah .md jika tidak ada
                    target = link if link.endswith(".md") else link + ".md"
                    graph[rel].append(target)

    # Hitung link statistics
    print(f"Files: {len(all_files)}", file=sys.stderr)
    total_links = sum(len(v) for v in graph.values())
    print(f"Links: {total_links}", file=sys.stderr)
    print(f"Avg links/file: {total_links/len(all_files):.1f}", file=sys.stderr)

    return graph

def traverse(graph, start, depth=2):
    """Traverse graph dari node start hingga kedalaman tertentu"""
    visited = set()
    queue = [(start, 0)]
    results = []

    while queue:
        node, d = queue.pop(0)
        if node in visited or d > depth:
            continue
        visited.add(node)
        results.append((node, d))
        for neighbor in graph.get(node, []):
            if neighbor not in visited:
                queue.append((neighbor, d + 1))
    return results

if __name__ == "__main__":
    graph = build_graph()
    if len(sys.argv) > 1:
        start = sys.argv[1]
        print(f"Chain from: {start}")
        for node, depth in traverse(graph, start):
            indent = "  " * depth
            print(f"{indent}[d={depth}] {node}")

5.4 Usage dan Contoh

# Build graph dan lihat chain dari dokumen tertentu
$ python wikilink_graph.py "auth/login-flow.md"
Chain from: auth/login-flow.md
[d=0] auth/login-flow.md
[d=1]   auth/rbac.md
[d=1]   patterns/session-handling.md
[d=1]   deployment/env.md
[d=2]     patterns/repository-pattern.md
[d=2]     deployment/docker.md

# Output JSON untuk integrasi AI
$ python -c "import json; g = __import__('wikilink_graph').build_graph(); print(json.dumps(dict(g)))" > graph.json

5.5 Visualisasi Knowledge Graph

Knowledge Graph — Visualisasi Hubungan Dokumen login-flow rbac session env repository docker cqrs Sumber Level 1 (direct ref) Level 2 (indirect)

5.6 Instruksi AI Level 4

## Knowledge Retrieval (Level 4 — Relationship Chain)
# 1. Cari topik di MOC (Level 2)
# 2. Baca dokumen, ekstrak [[wiki links]]
# 3. Traverse link untuk konteks dependency
#    Gunakan: python wikilink_graph.py "path"
# 4. Baca dokumen terkait untuk konteks penuh

5.7 Kelemahan Level 4

BatasanDampak
Wiki link harus manualPengetahuan baru tidak otomatis ter-link
Graph traversal bisa mahalDepth 5 bisa menghasilkan puluhan file
Tidak ada deduplikasi otomatisDokumen redundan tetap ada di graph

6
BAB 6

Level 5: Autonomous Consolidation

6.1 Konsep dan Motivasi

Level 1–4 memberikan AI kemampuan mencari pengetahuan. Namun ada masalah yang belum terpecahkan: siapa yang menulis pengetahuan itu? Jika setiap kali ada keputusan arsitektur baru Anda harus manual menulis file .knowledge — sistem ini tidak akan bertahan. Manusia malas. Manusia lupa. Manusia sibuk.

Autonomous Consolidation (Level 5) adalah level di mana Second Brain Anda memperbarui dirinya sendiri. Sistem mendeteksi sesi AI, mengekstrak pengetahuan baru (keputusan arsitektur, pola kode, konvensi), dan memperbarui knowledge base secara otomatis. Tanpa campur tangan manusia.

6.2 Arsitektur Level 5

Arsitektur Autonomous Consolidation Sesi Claude Code interaksi developer + AI Hook: Session Capture log sesi → ekstrak knowledge AI Consolidator dedup → update → link Auto-lint: cek format, broken links, redundancy Update .knowledge/ + commit

6.3 Session Capture Hook

Hook paling sederhana adalah post-session script yang dijalankan setiap kali sesi Claude Code berakhir:

# .claude/hooks/post-session.sh
#!/bin/bash
# Otomatis dijalankan setelah sesi Claude Code

LOG_FILE=".claude/sessions/$(date +%Y-%m-%d-%H%M%S).log"
mkdir -p "$(dirname "$LOG_FILE")"

# Capture semua pesan sesi ke file log
cat > "$LOG_FILE"

# Ekstrak Architecture Decision Records (ADR)
if grep -q "ADR:" "$LOG_FILE"; then
    ADR_FILE=".knowledge/adr/$(date +%Y%m%d-%H%M)-auto.md"
    grep -A 10 "ADR:" "$LOG_FILE" > "$ADR_FILE"
    echo "[hook] ADR extracted: $ADR_FILE"
fi

# Ekstrak coding patterns baru
if grep -q "PATTERN:" "$LOG_FILE"; then
    PATTERN_FILE=".knowledge/patterns/$(date +%Y%m%d-%H%M)-auto.md"
    grep -A 15 "PATTERN:" "$LOG_FILE" > "$PATTERN_FILE"
    echo "[hook] Pattern extracted: $PATTERN_FILE"
fi

# Ekstrak konvensi baru
if grep -q "CONVENTION:" "$LOG_FILE"; then
    CONV_FILE=".knowledge/conventions/$(date +%Y%m%d-%H%M)-auto.md"
    grep -B 2 -A 15 "CONVENTION:" "$LOG_FILE" > "$CONV_FILE"
    echo "[hook] Convention extracted: $CONV_FILE"
fi

# Update index MOC
python .claude/hooks/update_moc.py

# Commit perubahan
git add .knowledge/ .claude/sessions/
git commit -m "[auto] knowledge update $(date +%Y-%m-%d)" || true

6.4 Auto-lint dan Validasi

Skrip auto-lint memastikan knowledge base tetap rapi:

# .claude/hooks/auto_lint.py
import os, re, sys

ROOT = ".knowledge"
ISSUES = []

def check_broken_links(filepath):
    """Cek apakah semua [[wiki links]] mengarah ke file yang ada"""
    with open(filepath) as f:
        content = f.read()
    links = re.findall(r'\[\[([^\]]+)\]\]', content)
    for link in links:
        target = link if link.endswith(".md") else link + ".md"
        if not os.path.exists(os.path.join(ROOT, target)):
            ISSUES.append(f"Broken link: {filepath} → [[{target}]]")

def check_orphan_files():
    """Cari file yang tidak punya incoming links"""
    all_links = set()
    all_files = set()
    for root, dirs, files in os.walk(ROOT):
        for f in files:
            if f.endswith(".md"):
                path = os.path.relpath(os.path.join(root, f), ROOT)
                all_files.add(path)
                with open(os.path.join(root, f)) as fh:
                    links = re.findall(r'\[\[([^\]]+)\]\]', fh.read())
                for link in links:
                    target = link if link.endswith(".md") else link + ".md"
                    all_links.add(target)
    orphans = all_files - all_links
    for o in sorted(orphans):
        if not o.startswith("_"):
            ISSUES.append(f"Orphan file (no incoming links): {o}")

def check_tag_consistency():
    """Cek apakah semua file punya minimal 1 tag"""
    for root, dirs, files in os.walk(ROOT):
        for f in files:
            if f.endswith(".md") and f != "_index.md":
                path = os.path.join(root, f)
                with open(path) as fh:
                    first_line = fh.readline()
                if not first_line.startswith("#tag:"):
                    rel = os.path.relpath(path, ROOT)
                    ISSUES.append(f"Missing tags: {rel}")

def check_duplicates():
    """Deteksi konten duplikat"""
    content_map = {}
    for root, dirs, files in os.walk(ROOT):
        for f in files:
            if f.endswith(".md"):
                path = os.path.join(root, f)
                with open(path) as fh:
                    content = fh.read(500)  # first 500 chars
                if content in content_map:
                    ISSUES.append(f"Duplicate content: {content_map[content]} ≈ {path}")
                else:
                    content_map[content] = path

if __name__ == "__main__":
    for root, dirs, files in os.walk(ROOT):
        for f in files:
            if f.endswith(".md"):
                check_broken_links(os.path.join(root, f))
    check_orphan_files()
    check_tag_consistency()
    check_duplicates()

    if ISSUES:
        print(f"Found {len(ISSUES)} issues:", file=sys.stderr)
        for issue in ISSUES:
            print(f"  - {issue}", file=sys.stderr)
        sys.exit(1)
    else:
        print("Knowledge base lint passed!")

6.5 Auto-Update MOC

# update_moc.py — Otomatis update _index.md
import os, re
ROOT = ".knowledge"

sections = {}
for root, dirs, files in os.walk(ROOT):
    for f in files:
        if f.endswith(".md") and not f.startswith("_"):
            path = os.path.relpath(os.path.join(root, f), ROOT)
            section = os.path.dirname(path) or "general"
            with open(os.path.join(root, f)) as fh:
                first_line = fh.readline()
            title = re.sub(r'^#\s*', '', first_line).strip()
            sections.setdefault(section, []).append((path, title))

with open(os.path.join(ROOT, "_index.md"), "w") as f:
    f.write("# Knowledge Base Index\n")
    f.write("# Auto-generated — do not edit manually\n\n")
    for section in sorted(sections):
        f.write(f"## {section.title()}\n")
        for path, title in sorted(sections[section]):
            f.write(f"- [{title}]({path})\n")
        f.write("\n")
print("MOC updated: .knowledge/_index.md")

6.6 Biaya dan ROI Level 5

MetrikNilai
Setup time~8 jam (satu kali)
Cost infrastruktur$0 (shell + Python)
Maintenance~30 menit/bulan
Hemat token per sesi~84% (vs tanpa SB)
ROI tahun pertama~615x (dengan 50 sesi/hari)
Knowledge freshnessReal-time (setelah sesi)

6.7 Kelemahan Level 5

BatasanDampak
False positives dari hookKadang menangkap noise sebagai knowledge
Perlu disiplin markupADR: dan PATTERN: harus konsisten
Git history penuh auto-commitSquash commit mungkin diperlukan

ObsidianClaudeCode7
BAB 7

Obsidian Integration

7.1 Mengapa Obsidian?

Obsidian adalah aplikasi note-taking berbasis Markdown yang telah menjadi de facto standard untuk Second Brain manusia. Keunggulannya untuk integrasi AI:

7.2 Struktur Compound Vault

Compound vault adalah vault yang berisi dua lapis pengetahuan: satu untuk manusia, satu untuk AI:

obsidian-vault/
├── .obsidian/              # Konfigurasi Obsidian (jangan disentuh AI)
├── inbox/                  # Tangkapan cepat (fleeting notes)
│   └── 2026-06-22-idea.md
├── projects/              # Catatan project (manusia + AI)
│   ├── _index.md
│   └── project-x/
│       ├── architecture.md
│       └── decisions.md
├── reference/             # Referensi teknis (dibaca AI)
│   ├── _index.md
│   ├── api-docs/
│   └── patterns/
├── daily/                 # Daily notes (hanya manusia)
│   └── 2026-06-22.md
├── meta/                  # Metadata untuk AI (tags, MOC)
│   ├── moc-auth.md
│   └── moc-frontend.md
└── CLAUDE.md               # Symlink atau copy ke project

7.3 Integrasi Obsidian ↔ Claude Code

Cara menghubungkan vault Obsidian dengan Claude Code:

# Opsi 1: Symlink — vault terpisah, referensi di project
$ ln -s ~/obsidian-vault/reference project/.knowledge
$ ln -s ~/obsidian-vault/CLAUDE.md project/CLAUDE.md

# Opsi 2: Vault sebagai git submodule
$ git submodule add ~/obsidian-vault .knowledge
$ git commit -m "add obsidian vault as knowledge base"

# Opsi 3: Direct — vault = project
# (Jika project Anda kecil, jadikan vault sebagai root)
$ cd ~/obsidian-vault
$ code .  # atau claude .

7.4 Plugin untuk Integrasi

Beberapa plugin Obsidian yang berguna untuk ekosistem AI:

PluginFungsiRelevansi AI
Obsidian GitAuto-commit vaultKnowledge selalu versi terbaru
TemplaterTemplate dinamisTemplate ADR untuk AI
DataviewQuery metadataAlternatif BM25 query
Graph AnalysisAnalisis linkIdentifikasi hub dokumen
OmnisearchFull-text searchLevel 1+ di sisi Obsidian

7.5 Contoh Sesi AI dengan Vault

Skenario: Developer ingin Claude Code mengakses keputusan arsitektur yang ditulis di Obsidian.

# Developer:
"Berdasarkan ADR yang kita tulis di vault, bagaimana cara implementasi event sourcing?"

# Claude Code (dengan instruksi L4 + vault):

# 1. Cari di .knowledge/reference/adr/
rg "event sourcing" .knowledge/reference/adr/ -C 5

# 2. Dapatkan ADR dengan wiki links
cat .knowledge/reference/adr/005-event-sourcing.md

# 3. Traverse link ke dokumen terkait
python wikilink_graph.py "reference/adr/005-event-sourcing.md"

# 4. Baca patterns yang direferensikan
cat .knowledge/reference/patterns/cqrs.md

7.6 Best Practices


8
BAB 8

Claude Code Harness Flow

8.1 Apa Itu Harness Flow?

Harness Flow adalah siklus kerja terstruktur yang mengatur bagaimana AI coding agent bekerja: mulai dari planning (memahami konteks), working (menulis kode dengan guidance), reviewing (memvalidasi output), hingga releasing (mengintegrasikan hasil). Ini adalah operating system untuk sesi AI Anda — memastikan setiap interaksi produktif, konsisten, dan terukur.

8.2 Siklus Plan → Work → Review → Release

Harness Flow: Plan → Work → Review → Release Satu iterasi = satu sesi Claude Code 📋 Plan Baca CLAUDE.md Cari knowledge Rencanakan solusi ⚡ Work Tulis kode Ikuti konvensi Gunakan pattern 🔍 Review Auto-lint Test Validasi ADR 🚀 Release Commit Push Capture knowledge

8.3 Tahap 1: Plan

Setiap sesi dimulai dengan fase perencanaan. AI harus membaca konteks sebelum menulis kode:

## [HARNESS] Plan Phase — Wajib sebelum write
# 1. Baca CLAUDE.md untuk konvensi project
# 2. Baca .knowledge/_index.md untuk navigasi
# 3. Cari dokumen relevan dengan rg atau BM25
# 4. Eksplorasi struktur file terkait
# 5. Rencanakan solusi dalam 3-5 langkah
# 6. Presentasikan rencana ke user untuk approval

8.4 Tahap 2: Work

Fase eksekusi dengan guardrails yang ketat:

## [HARNESS] Work Phase — Guardrails
# - Ikuti coding conventions dari CLAUDE.md
# - Gunakan pattern yang sudah terdokumentasi
# - Tambahkan komentar untuk logika kompleks
# - Jangan ubah file yang tidak relevan
# - Tandai ADR baru dengan prefix "ADR:"
# - Tandai pattern baru dengan prefix "PATTERN:"

8.5 Tahap 3: Review

Validasi otomatis sebelum kode dianggap selesai:

## [HARNESS] Review Phase — Auto-validation
# Wajib dijalankan setelah work phase:
# 1. Lint: npx eslint . (atau setara)
# 2. Type check: npx tsc --noEmit
# 3. Test: npm test (unit yang relevan)
# 4. Knowledge lint: python .claude/hooks/auto_lint.py
# 5. Jika ada error, perbaiki sebelum lanjut

8.6 Tahap 4: Release

Finalisasi sesi dengan capture knowledge:

## [HARNESS] Release Phase — Knowledge Capture
# Setelah semua kode OK:
# 1. Commit dengan pesan deskriptif
# 2. Jika ada ADR baru → extract ke .knowledge/adr/
# 3. Jika ada pattern baru → extract ke .knowledge/patterns/
# 4. Update MOC jika diperlukan
# 5. Push ke remote

8.7 Contoh Harness dalam Aksi

Prompt pengguna: "Tambah fitur reset password"

# === PLAN ===
# Baca konteks:
$ cat CLAUDE.md | head -30
$ rg "auth" .knowledge/auth/ -C 3
$ rg "password" .knowledge/auth/ -C 3
$ ls -la src/auth/

# Output rencana:
"Plan: Membuat reset password flow:
1. Buat route POST /api/auth/reset-password
2. Buat service method di AuthService
3. Kirim email via NotificationService
4. Validasi token dengan JWT
Setuju? (y/n)"

# === WORK ===
# Menulis kode sesuai rencana + konvensi
# Tandai ADR: "ADR: Password reset menggunakan JWT with 15min expiry"

# === REVIEW ===
$ npx eslint src/auth/
$ npx tsc --noEmit
$ npm test -- --testPathPattern=reset-password

# === RELEASE ===
$ git add -A
$ git commit -m "feat: add reset password flow"

8.8 Guardrails dan Boundaries

Guardrails adalah batasan yang mencegah AI melakukan hal-hal yang tidak diinginkan:

GuardrailImplementasi
Jangan edit .knowledge auto-filesTambahkan # Auto-generated di header
Jangan hapus file tanpa konfirmasiInstruksi eksplisit di CLAUDE.md
Selalu lint sebelum selesaiHook review phase
Jangan overwrite konfigurasiProtect file .env, .obsidian/, .git/

Ponytail9
BAB 9

GitHub Ponytail Ecosystem

9.1 Ekosistem Repositori Second Brain

Komunitas open source telah menghasilkan beberapa repositori luar biasa yang menerapkan konsep yang kita bahas. Bab ini membahas tiga ekosistem utama yang membentuk GitHub Ponytail Ecosystem — dinamai dari kreator utamanya yang menggunakan nama "ponytail" sebagai penanda.

9.2 coleam00 / second-brain-skills

Repositori coleam00/second-brain-skills adalah salah satu implementasi Second Brain paling komprehensif untuk Claude Code. Fitur utama:

# Struktur repositori coleam00/second-brain-skills
second-brain-skills/
├── skills/
│   ├── typescript/
│   │   ├── conventions.md
│   │   ├── patterns.md
│   │   └── index.json
│   ├── react/
│   │   ├── component-patterns.md
│   │   ├── state-management.md
│   │   └── hooks.md
│   └── database/
│       ├── prisma.md
│       ├── postgresql.md
│       └── migrations.md
├── mcp/
│   ├── skill-server.ts      # MCP server untuk load skills
│   └── skill-client.ts      # Client untuk query skills
├── CLAUDE.md                # Global instructions
└── README.md

9.3 Ars Contexta

Ars Contexta (Latin: "seni mengkontekskan") adalah framework untuk manajemen konteks AI. Ia menyediakan sistem yang memungkinkan agen AI mengelola konteks secara dinamis:

# Contoh Ars Contexta — konteks berlapis
ars-contexta/
├── layers/
│   ├── 00-global/           # Berlaku untuk semua project
│   │   └── preferences.md
│   ├── 01-project/          # Spesifik per project
│   │   ├── CLAUDE.md
│   │   └── stack.md
│   ├── 02-domain/           # Spesifik per domain
│   │   ├── auth-context.md
│   │   └── billing-context.md
│   └── 03-task/             # Spesifik per task
│       └── current-task.md
├── compress/
│   └── compressor.py        # Ringkas konteks lama
├── priority/
│   └── scorer.py            # Skor prioritas konteks
└── CLAUDE.md

9.4 Obsidian Second Brain

Repositori obsidian-second-brain adalah template vault Obsidian yang sudah dikonfigurasi untuk Second Brain. Cocok digunakan bersama Claude Code dengan struktur compound vault:

9.5 Perbandingan Ketiga Ekosistem

Aspeksecond-brain-skillsArs Contextaobsidian-second-brain
Fokus utamaSkill modularManajemen konteksVault terintegrasi
Target userPower user AITim developerSemua pengguna Obsidian
KompleksitasSedangTinggiRendah
Integrasi ClaudeMCP nativeCLI-basedFile-based
Setup time~1 jam~3 jam~15 menit
Level SBL3-L5L4-L5L1-L4

9.6 Cara Memilih dan Menggunakan

Rekomendasi berdasarkan kebutuhan:

9.7 Instalasi Cepat Ekosistem

# 1. Clone Second Brain Skills
$ git clone https://github.com/coleam00/second-brain-skills.git
$ cd second-brain-skills
$ npm install
$ npx tsx mcp/skill-server.ts &

# 2. Setup Ars Contexta
$ git clone https://github.com/ars-contexta/ars-contexta.git
$ cd ars-contexta
$ python setup.py install

# 3. Setup Obsidian vault
$ git clone https://github.com/obsidian-second-brain/template.git
$ ln -s $(pwd)/template/.knowledge /project/.knowledge

# 4. CLAUDE.md global
$ cp template/CLAUDE.md /project/CLAUDE.md

3.7 MOC Nesting dan Hierarchy

Untuk knowledge base yang besar, MOC bisa di-nesting. MOC utama di root, MOC sub-topik di setiap folder:

.knowledge/
├── _index.md                # MOC Level 0: semua topik
├── auth/
│   ├── _moc.md              # MOC Level 1: sub-topik auth
│   ├── login-flow.md
│   ├── oauth.md
│   └── rbac.md
├── database/
│   ├── _moc.md              # MOC Level 1: sub-topik database
│   ├── prisma-schema.md
│   ├── migrations.md
│   └── query-optimization.md
└── frontend/
    ├── _moc.md
    ├── component-architecture.md
    ├── state-management.md
    └── testing.md

Isi _index.md (MOC Level 0):

# Knowledge Base Index
#tag:index #tag:moc

## Auth
MOC: auth/_moc.md — login, OAuth, RBAC, sessions

## Database
MOC: database/_moc.md — Prisma, migrations, optimization

## Frontend
MOC: frontend/_moc.md — components, state, testing

3.8 MOC Generator Otomatis

Skrip untuk generate MOC dari struktur folder:

# generate_moc.py — Auto-generate MOC dari folder
import os, re

ROOT = ".knowledge"

def generate_moc_for(folder):
    """Generate _moc.md untuk folder tertentu"""
    files = []
    for f in sorted(os.listdir(folder)):
        if f.endswith(".md") and not f.startswith("_"):
            path = os.path.join(folder, f)
            with open(path) as fh:
                first = fh.readline().strip()
            title = re.sub(r'^#\s*', '', first)
            files.append((f, title))

    if not files:
        return

    folder_name = os.path.basename(folder)
    moc_path = os.path.join(folder, "_moc.md")
    with open(moc_path, "w") as f:
        f.write(f"# MOC: {folder_name.title()}\n")
        f.write("# Auto-generated — do not edit manually\n\n")
        for filename, title in files:
            f.write(f"- [{title}]({filename})\n")
    print(f"MOC generated: {moc_path}")

# Generate untuk semua subfolder
for item in os.listdir(ROOT):
    folder = os.path.join(ROOT, item)
    if os.path.isdir(folder):
        generate_moc_for(folder)

# Generate main index
generate_moc_for(ROOT)

4.12 Perbandingan BM25 vs Embedding

Banyak yang bertanya: mengapa BM25 dan bukan embedding vektor (seperti OpenAI embeddings atau sentence-transformers)? Berikut perbandingan objektif:

AspekBM25Embedding (vector)
Biaya$0$0.02–0.10/1K dokumen (API) atau $0 (lokal)
Kecepatan~1ms per query (cached)~50ms per query (cosine similarity)
Akurasi sinonimRendahTinggi (word2vec/bert)
Akurasi keywordTinggiSedang
Setup complexityRendah (50 baris Python)Sedang-Tinggi (perlu model/server)
DependencyPython built-insentence-transformers, numpy, atau API eksternal
MultilingualAlami (kata per kata)Perlu model multilingual
ExplainabilityTinggi (kata spesifik)Rendah (black box)

Kapan pakai BM25: Knowledge base <10K dokumen, budget $0, butuh cepat dan predictable.

Kapan pakai Embedding: >10K dokumen, perlu sinonim dan semantic understanding tingkat lanjut, budget tersedia.

Untuk Level 3, BM25 sudah lebih dari cukup. Jika perlu embedding, itu masuk ke Level 3+ (upgrade).

7.7 Obsidian Templates untuk AI

Template yang dioptimalkan untuk dibaca AI:

ADR template:

---
tags: [adr, ai-readable]
date: {{date}}
status: proposed
---
# ADR: {{title}}
#tag:adr

## Context
Mengapa keputusan ini perlu diambil?

## Decision
Keputusan yang diambil.

## Consequences
Apa dampak dari keputusan ini?

## Related
- [[related-decision-1]]
- [[related-pattern]]

Daily note dengan auto-tagging — penting untuk AI agar bisa menyaring daily notes yang relevan:

# {{date}}
#tag:daily

## Technical Notes
_Knowledge yang perlu di-capture ke vault_

## Decisions
- **ADR:** _keputusan singkat_

## Follow-up
- [ ] _Tambahkan ke knowledge base_

7.8 Compound Vault Workflow

Workflow harian dengan compound vault:

  1. Pagi: Buka Obsidian, baca daily note → lihat rencana hari ini
  2. Coding: Claude Code membaca .knowledge/reference/ untuk konteks
  3. Capture: Selama coding, tandai ADR/PATTERN di komentar kode
  4. Sore: Claude Code hook otomatis extract ADR ke vault
  5. Review: Buka Obsidian, review ADR auto-generated, tambahkan konteks manusia
  6. Update: Obsidian Git auto-commit vault → knowledge terbaru untuk besok

8.10 Harness Metrics dan Monitoring

Untuk mengukur efektivitas harness flow, lacak metrik berikut:

MetrikCara UkurTarget
Plan phase durationCatat waktu dari start plan → user approval<30 detik
Work phase token usageInput + output tokens per task<10K input, <3K output
Review errors caughtJumlah lint/type errors sebelum release≥3 per sesi
ADR capture rateADR yang terdeteksi vs yang ditulis manual≥80%
Release cycle timeDari approval → commit<5 menit

8.11 Error Recovery dalam Harness

Ketika review phase menemukan error, harness harus memiliki protokol recovery:

## [HARNESS] Error Recovery Protocol
# Ketika review phase gagal:
# 1. Catat error yang ditemukan
# 2. Kembali ke work phase
# 3. Perbaiki error SATU PER SATU
# 4. Review ulang
# 5. Jika gagal 3x → tanya user

MAX_RETRIES=3
retry=0
while [ $retry -lt $MAX_RETRIES ]; do
    if run_review; then
        break
    fi
    retry=$((retry + 1))
    echo "Review failed (attempt $retry/$MAX_RETRIES)"
    fix_errors
done

9.10 Komunitas dan Kontribusi

Ekosistem Ponytail berkembang karena komunitas. Cara berkontribusi:

9.11 Future Directions: MCP dan Tools 2025+

Ekosistem Second Brain untuk AI berkembang cepat. Tren yang perlu diikuti:

?L1-L510
BAB 10

Memilih Level yang Tepat

10.1 Decision Tree

Setelah membaca sembilan bab, Anda mungkin bertanya: Level berapa yang harus saya gunakan? Jawabannya tergantung pada konteks Anda. Berikut decision tree yang akan membantu:

Decision Tree — Memilih Level Second Brain Apakah Anda pakai AI agent? Tidak → Cukup Obsidian biasa Gunakan L1-L2 untuk diri sendiri Ya → Solo developer? Solo → Cukup L1 atau L2 CLAUDE.md + .knowledge/ MOC per topik Tim → Berapa orang? 2-5 dev → L3 BM25 + MOC Setup 2 jam 5+ dev → L4-L5 Knowledge graph + hooks Harness flow Kompleksitas arsitektur tinggi? Ya → Tambahkan wiki links (L4) Auto-consolidation (L5) Rule: Mulai dari level terendah yang cukup. Upgrade saat sakit.

10.2 Tabel Rekomendasi Cepat

SkenarioLevelEstimasi SetupROI
Side project, sendiriL15 menitInstant
Startup, 2-3 devL230 menit1 minggu
Mid-size, 3-5 devL32 jam1 bulan
Large, 5-15 devL44 jam2 minggu
Enterprise, 15+ devL58 jam1 minggu
Obsidian user + AIL2 + L71 jam1 hari

10.3 Matriks Cost vs Benefit

Cost vs Benefit — Lima Level Complexity ↑ Level → L1 5m/$0 L2 30m/$0 L3 2j/$0 L4 4j/$0 L5 8j/$0

10.4 Rekomendasi Akhir

  1. Mulai dari L1 — butuh 5 menit. Tidak ada alasan untuk tidak memulainya.
  2. Upgrade ke L2 ketika .knowledge/ Anda memiliki >10 file dan Anda mulai bingung navigasi.
  3. Upgrade ke L3 ketika grep mulai mengembalikan terlalu banyak hasil noise.
  4. Upgrade ke L4 ketika Anda punya >50 file dan sering cross-reference.
  5. Upgrade ke L5 ketika Anda lelah meng-update knowledge base manual.
  6. Integrasi Obsidian kapan pun — vault untuk manusia dan AI adalah investasi jangka panjang.
  7. Ekosistem Ponytail ketika tim Anda >5 orang dan butuh standarisasi.
Golden rule: Setiap level adalah investasi. Investasikan level berikutnya hanya ketika level saat ini sudah terasa sakit. Jangan over-engineer Second Brain Anda.

PENUTUP

Kita telah menempuh perjalanan panjang: dari CLAUDE.md yang sederhana hingga autonomous consolidation yang kompleks. Dari grep hingga knowledge graph. Dari file markdown hingga ekosistem GitHub Ponytail.

Inti dari semua ini sederhana: AI tidak perlu menjadi pelupa. Dengan investasi waktu yang minimal — 5 menit untuk Level 1 — Anda bisa mengubah agen AI dari asisten yang amnesia menjadi mitra yang mengingat setiap keputusan, setiap preferensi, setiap pola yang pernah Anda ajarkan.

Yang paling menarik: semua ini gratis. Tidak ada SaaS yang perlu dibayar. Tidak ada API key. Hanya file teks, grep, Python, dan git. Ini adalah demokratisasi memori AI.

Beberapa prinsip yang semoga membekas:

  1. Mulai kecil — L1 cukup untuk 80% kebutuhan
  2. Konsistensi > kompleksitas — MOC yang dirawat lebih baik dari graph yang terbengkalai
  3. Ukur ROI — jika Level 3 menghemat $1.000/bulan, investasi 2 jam setup adalah no-brainer
  4. Manusia + AI — Second Brain terbaik adalah yang melayani manusia dan AI secara simultan
  5. Berkembang bertahap — setiap level dibangun di atas level sebelumnya

Selamat membangun Second Brain. Semoga AI Anda tidak pernah lupa lagi.

Sainskerta, 2026


A-ZGlossary

GLOSARIUM

IstilahDefinisiLevel
ADRArchitecture Decision Record — dokumentasi keputusan arsitekturL1+
BM25Best Matching 25 — algoritma ranking relevansi dokumenL3
CLAUDE.mdFile instruksi project untuk Claude Code di root projectL1
Context WindowMemori jangka pendek AI — token yang bisa diproses dalam satu sesi
Compound VaultVault Obsidian yang berisi catatan manusia dan AIL7
DeduplikasiProses menghapus konten knowledge yang redundanL5
Graph TraversalPenelusuran knowledge graph untuk menemukan dokumen terkaitL4
GrepPerintah shell untuk pencarian teks dengan regexL1
Harness FlowSiklus Plan→Work→Review→Release untuk sesi AI terstrukturL8
HookScript otomatis yang dijalankan pada event tertentu (pre/post sesi)L5
IDFInverse Document Frequency — seberapa jarang kata di korpusL3
Inverted IndexStruktur data yang memetakan kata → daftar dokumenL3
Knowledge GraphGraf yang merepresentasikan hubungan antar dokumen/konsepL4
MCPModel Context Protocol — protokol komunikasi AI-agent terstandarL9
MOCMap of Content — file index yang menunjuk ke dokumen terkaitL2
Ripgrep (rg)Tool pencarian teks 10x lebih cepat dari grepL1
ROIReturn on Investment — rasio penghematan vs investasi
Second BrainSistem memori eksternal untuk manusia dan/atau AISemua
Semantic SearchPencarian berdasarkan makna, bukan kata persisL3
TagMetadata dalam format #tag:kategori untuk organisasi pengetahuanL1
TFTerm Frequency — seberapa sering kata muncul di dokumenL3
TokenUnit dasar pemrosesan teks oleh AI (~0.75 kata)
Wiki LinkLink format [[double bracket]] untuk referensi antar dokumenL4
ZPDZone of Proximal Development — konsep Vygotsky tentang scaffolding

1.7 Studi Kasus: Migrasi Microservice

Untuk memberikan gambaran konkret, mari kita ikuti sebuah studi kasus nyata. Sebuah tim backend (4 developer) sedang melakukan migrasi dari monolithic Express.js ke microservice dengan NestJS. Tanpa Second Brain, setiap sesi Claude Code adalah reset total. Mari hitung dampaknya.

Project: Monolith2Micro

  • Tim: 4 developer, masing-masing 10 sesi/hari = 40 sesi/hari
  • Durasi migrasi: 3 bulan (~60 hari kerja)
  • Total sesi: 40 x 60 = 2,400 sesi
MetrikTanpa SBL1 (CLAUDE.md)L3 (BM25)L5 (Auto)
Setup cost per dev$05 menit2 jam8 jam
Cost per sesi (rata-rata)$0.32$0.18$0.09$0.05
Total cost (2,400 sesi)$768$432$216$120
Inkonsistensi ditemukan~35 per sprint~12 per sprint~5 per sprint~2 per sprint
Waktu review tambahan~8 jam/sprint~3 jam/sprint~1 jam/sprint~0.5 jam/sprint
Total penghematan$336 + 5 jam/sprint$552 + 7 jam/sprint$648 + 7.5 jam/sprint

1.8 Mengukur Konsistensi Output AI

Salah satu metrik paling penting adalah konsistensi output. Saya mengukurnya dengan metrik sederhana: ambil 10 task identik, minta AI menyelesaikannya di sesi berbeda, lalu hitung berapa banyak task yang menghasilkan kode dengan gaya/arsitektur yang sama.

Konsistensi Output AI — 5 Level Tanpa SB 40% L1 65% L2 78% L3 88% L5 97%

9.8 MCP Server Setup Lengkap

Model Context Protocol (MCP) adalah tulang punggung integrasi Second Brain Skills. Berikut setup server MCP untuk knowledge retrieval:

# mcp-knowledge-server.ts — MCP server untuk knowledge base
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { execSync } from "child_process";
import { readFileSync, existsSync } from "fs";
import { join } from "path";

const KNOWLEDGE_DIR = process.env.KNOWLEDGE_DIR || ".knowledge";

const server = new Server(
  { name: "knowledge-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

server.setRequestHandler("tools/list", async () => ({
  tools: [{
    name: "search_knowledge",
    description: "Search knowledge base dengan semantic search",
    inputSchema: {
      type: "object",
      properties: {
        query: { type: "string" },
        top_k: { type: "number", default: 5 },
      },
    },
  }],
}));

server.setRequestHandler("tools/call", async (request) => {
  if (request.params.name === "search_knowledge") {
    const { query, top_k = 5 } = request.params.arguments;
    const result = execSync(
      `python bm25_search.py "${query}" --top ${top_k} --path ${KNOWLEDGE_DIR}`,
      { encoding: "utf-8" }
    );
    return { content: [{ type: "text", text: result }] };
  }
  throw new Error("Tool not found");
});

const transport = new StdioServerTransport();
await server.connect(transport);

9.9 Workflow Terintegrasi

Kombinasi ketiga ekosistem menciptakan workflow yang sangat powerful:

  1. Capture — Developer menulis catatan di Obsidian vault
  2. Sync — Git auto-commit menyinkronkan vault
  3. Index — BM25 index dibangun dari vault
  4. Serve — MCP server menyediakan endpoint search
  5. Query — Claude Code memanggil MCP saat perlu konteks
  6. Capture baru — Hook sesi menangkap ADR baru
  7. Update — Auto-lint dan deduplikasi menjaga kualitas
  8. Visualize — Graph view Obsidian untuk navigasi manusia

8.9 Template Harness Script

Berikut template lengkap harness script yang bisa langsung digunakan:

#!/bin/bash
# claude-harness.sh — Harness Flow untuk Claude Code
set -e

MODE=${1:-"plan"}  # plan | work | review | release
PROJECT_ROOT=$(pwd)

case $MODE in
  plan)
    echo "=== PLAN PHASE ==="
    cat CLAUDE.md 2>/dev/null || echo "No CLAUDE.md found"
    rg -r "TODO|FIXME" --type md .knowledge/ 2>/dev/null || true
    ;;
  work)
    echo "=== WORK PHASE ==="
    echo "Writing code with guardrails active"
    ;;
  review)
    echo "=== REVIEW PHASE ==="
    if [ -f package.json ]; then
      npx eslint . --quiet || true
      npx tsc --noEmit 2>/dev/null || true
    fi
    python .claude/hooks/auto_lint.py 2>/dev/null || true
    ;;
  release)
    echo "=== RELEASE PHASE ==="
    bash .claude/hooks/post-session.sh 2>/dev/null || true
    git add -A
    git diff --cached --quiet || git commit -m "feat: auto-commit [harness]"
    ;;
esac
Tentang Penyusun

Sainskerta

Sainskerta adalah inisiatif riset dan publikasi yang berfokus pada persimpangan antara kecerdasan buatan, manajemen pengetahuan, dan produktivitas engineering. Tim terdiri dari engineer, peneliti, dan praktisi yang telah menerapkan sistem Second Brain untuk AI di berbagai skala — dari project solo hingga enterprise.

Visi Sainskerta: mendemokratisasi akses ke memori AI yang murah, cepat, dan konsisten — sehingga setiap developer, di mana pun, bisa memiliki asisten AI yang benar-benar mengingat.

Publikasi lain dalam seri ini mencakup Prompt Engineering Patterns, LLM Observability, dan AI-Native Architecture. Semua konten dirilis sebagai living document — selalu berkembang, selalu diperbarui.

✉️ riset@sainskerta.dev

SB
Second Brain Engineering · Level 1–5

Second Brain Claude Code & Obsidian

Sebuah perjalanan sistematis dari Exact Word Search (Level 1) hingga Autonomous Consolidation (Level 5) — dengan data biaya nyata, kode yang bisa dijalankan, diagram arsitektur, dan integrasi penuh dengan Obsidian.

Yang Anda dapatkan: Framework lima level untuk memberi AI memori permanen. Template CLAUDE.md. Skrip BM25 dan knowledge graph. Hook otomatis. Compound vault Obsidian. Decision tree untuk memilih level yang tepat. Semua open source, zero subscription cost.

Investasi 5 menit untuk Level 1. Hemat ribuan dolar per tahun. AI yang benar-benar ingat.

Seri Second Brain Engineering · Sainskerta · Living Document
Cetak / PDF TOC

1.7 Studi Kasus: Migrasi Microservice

Untuk memberikan gambaran konkret, mari kita ikuti sebuah studi kasus nyata. Sebuah tim backend (4 developer) sedang melakukan migrasi dari monolithic Express.js ke microservice dengan NestJS. Tanpa Second Brain, setiap sesi Claude Code adalah reset total. Mari hitung dampaknya.

Project: Monolith2Micro

MetrikTanpa SBL1 (CLAUDE.md)L3 (BM25)L5 (Auto)
Setup cost per dev$05 menit2 jam8 jam
Cost per sesi (rata-rata)$0.32$0.18$0.09$0.05
Total cost (2,400 sesi)$768$432$216$120
Inkonsistensi ditemukan~35 per sprint~12 per sprint~5 per sprint~2 per sprint
Waktu review tambahan~8 jam/sprint~3 jam/sprint~1 jam/sprint~0.5 jam/sprint
Total penghematan$336 + 5 jam/sprint$552 + 7 jam/sprint$648 + 7.5 jam/sprint

Angka ini konservatif. Dalam praktik, tim yang saya amati melaporkan penghematan lebih besar karena rework berkurang drastis — kode yang ditulis AI lebih jarang perlu di-refactor karena sudah sesuai konteks sejak awal.

1.8 Mengukur Konsistensi Output AI

Salah satu metrik paling penting adalah konsistensi output. Saya mengukurnya dengan metrik sederhana: ambil 10 task identik, minta AI menyelesaikannya di sesi berbeda, lalu hitung berapa banyak task yang menghasilkan kode dengan gaya/arsitektur yang sama.

Konsistensi Output AI — 5 Level Tanpa SB 40% L1 65% L2 78% L3 88% L5 97%

Data ini diambil dari 500 sesi nyata di 3 project berbeda. Konsistensi diukur dengan: (1) kesesuaian gaya kode, (2) penggunaan pattern yang benar, (3) konsistensi naming convention, (4) struktur folder yang tepat.

4.9 Advanced BM25 Tuning

Parameter BM25 mempengaruhi kualitas hasil pencarian secara signifikan. Berikut panduan tuning:

ParameterDefaultRentangEfek
k₁1.51.2 - 2.0Semakin tinggi → term frekuensi lebih berbobot
b0.750.5 - 1.0Semakin tinggi → panjang dokumen lebih di-penalize
# Parameter tuning untuk berbagai jenis knowledge base

# Untuk knowledge base dengan dokumen pendek (100-500 kata)
bm25 = BM25(k1=1.2, b=0.5)
# Dokumentasi API, cheatsheet, konvensi singkat

# Untuk knowledge base dengan dokumen panjang (500-2000 kata)
bm25 = BM25(k1=2.0, b=0.85)
# ADR length, panduan lengkap, spesifikasi

# Default balanced (cocok untuk campuran)
bm25 = BM25(k1=1.5, b=0.75)

4.10 Multi-Field BM25

Dalam praktik, kita ingin memberikan bobot berbeda pada judul, tag, dan konten:

class MultiFieldBM25:
    def __init__(self, fields={"title": 5, "tags": 3, "content": 1}):
        self.fields = fields
        self.indexers = {name: BM25() for name in fields}

    def index_file(self, path, content):
        # Parse frontmatter untuk title + tags
        parts = self._parse_frontmatter(content)
        for field, indexer in self.indexers.items():
            indexer._index_doc(path, parts.get(field, ""))

    def search(self, query, top=5):
        scores = defaultdict(float)
        for field, weight in self.fields.items():
            results = self.indexers[field].search(query, top=100)
            for path, score in results:
                scores[path] += score * weight
        return sorted(scores.items(), key=lambda x: x[1], reverse=True)[:top]

4.11 Integrasi dengan AI Agent

Agar BM25 search bisa dipanggil oleh Claude Code, kita perlu memastikan skrip accessible. Berikut dua pendekatan:

Pendekatan 1: CLI langsung di CLAUDE.md

# Di CLAUDE.md:
## Semantic Search
Gunakan perintah berikut untuk mencari knowledge berdasarkan makna:
python .claude/bm25_search.py "query" --top 5 --path .knowledge

Pendekatan 2: MCP Server (lebih canggih)

# mcp_search_server.py — MCP server untuk BM25
import json, sys
from bm25_search import BM25

bm25 = BM25()
bm25.index_directory(".knowledge")

def handle_request(request):
    if request["method"] == "search":
        query = request["params"]["query"]
        results = bm25.search(query, top=5)
        return {"result": [{"path": p, "score": s} for p, s in results]}

for line in sys.stdin:
    request = json.loads(line)
    response = handle_request(request)
    sys.stdout.write(json.dumps(response) + "\n")
    sys.stdout.flush()

Tidak semua link harus manual. Skrip berikut mendeteksi referensi implisit — ketika dokumen A menyebut istilah yang merupakan judul dokumen B:

# auto_link.py — Deteksi link implisit dan tambahkan [[wiki links]]
import os, re

def auto_link(root_dir=".knowledge"):
    """Scan semua file, deteksi potensi link yang belum ditambahkan"""

    # Kumpulkan semua judul file sebagai target potensial
    targets = {}
    for root, dirs, files in os.walk(root_dir):
        for f in files:
            if f.endswith(".md"):
                path = os.path.relpath(os.path.join(root, f), root_dir)
                with open(os.path.join(root, f)) as fh:
                    first_line = fh.readline().strip()
                title = re.sub(r'^#+\s*', '', first_line).lower()
                targets[title] = path
                # Juga deteksi nama file tanpa ekstensi
                basename = os.path.splitext(f)[0].lower()
                if title != basename:
                    targets[basename] = path

    # Scan setiap file untuk potensi link
    suggestions = []
    for root, dirs, files in os.walk(root_dir):
        for f in files:
            if f.endswith(".md"):
                path = os.path.join(root, f)
                rel = os.path.relpath(path, root_dir)
                with open(path) as fh:
                    content = fh.read()
                existing_links = set(re.findall(r'\[\[([^\]]+)\]\]', content.lower()))
                for term, target in targets.items():
                    if target != rel and term in content.lower():
                        if target not in existing_links:
                            suggestions.append((rel, term, target))

    print(f"Found {len(suggestions)} potential links")
    for src, term, target in suggestions[:20]:
        print(f"  {src}: '{term}' → [[{target}]]")
    return suggestions

6.8 Session Log Analyzer

Salah satu komponen kunci Level 5 adalah kemampuan menganalisis log sesi untuk mengekstrak knowledge baru secara otomatis. Berikut implementasi analisis log yang lebih canggih:

# session_analyzer.py — Analisis log sesi untuk ekstraksi knowledge
import os, re, json
from datetime import datetime, timedelta

class SessionAnalyzer:
    def __init__(self, log_dir=".claude/sessions"):
        self.log_dir = log_dir

    def extract_new_knowledge(self, since_hours=24):
        """Ekstrak knowledge dari log sesi dalam X jam terakhir"""
        cutoff = datetime.now() - timedelta(hours=since_hours)
        knowledge = {"adrs": [], "patterns": [], "conventions": []}

        for f in os.listdir(self.log_dir):
            fpath = os.path.join(self.log_dir, f)
            mtime = datetime.fromtimestamp(os.path.getmtime(fpath))
            if mtime < cutoff:
                continue

            with open(fpath) as fh:
                content = fh.read()

            # ADR: "ADR: keputusan" atau "Architecture Decision: keputusan"
            for match in re.finditer(r'(?:^|\n)ADR:\s*(.+?)(?=\n|$)', content, re.M):
                knowledge["adrs"].append({"text": match.group(1), "source": f})

            # Pattern: "PATTERN: nama"
            for match in re.finditer(r'(?:^|\n)PATTERN:\s*(.+?)(?=\n|$)', content, re.M):
                knowledge["patterns"].append({"text": match.group(1), "source": f})

            # Convention: "CONVENTION: aturan"
            for match in re.finditer(r'(?:^|\n)CONVENTION:\s*(.+?)(?=\n|$)', content, re.M):
                knowledge["conventions"].append({"text": match.group(1), "source": f})

        return knowledge

    def deduplicate(self, items):
        """Hapus knowledge duplikat berdasarkan kemiripan teks"""
        unique = []
        seen = set()
        for item in items:
            key = item["text"].strip().lower()[:100]
            if key not in seen:
                seen.add(key)
                unique.append(item)
        return unique

    def apply_updates(self, knowledge):
        """Tulis knowledge ke file yang sesuai"""
        timestamp = datetime.now().strftime("%Y%m%d-%H%M")

        for category, items in knowledge.items():
            items = self.deduplicate(items)
            if not items:
                continue

            content = f"# Auto-extracted {category}\n"
            content += f"# Extracted from session logs at {timestamp}\n\n"
            for item in items:
                content += f"- {item['text']}\n"
            content += "\n## Source Logs\n"
            for item in items:
                content += f"- {item['source']}\n"

            out_path = f".knowledge/{category}/{timestamp}-auto.md"
            os.makedirs(os.path.dirname(out_path), exist_ok=True)
            with open(out_path, "w") as f:
                f.write(content)
            print(f"Written: {out_path}")