Octobrain 0.9.0: नॉलेज अब मल्टीप्लेयर है
आपकी टीम पहले ही डॉक्स लिख चुकी है। deploy runbook, "बिना migration के इसे कभी मत छुओ" वाले नियम, payments सर्विस आख़िर क्यों उस तरह retry करती है इसके बारे में मुश्किल से कमाए गए नोट्स। वे एक ऐसी wiki में रहते हैं जिसे कोई नहीं पढ़ता, एक pinned Slack मैसेज में, और तीन लोगों के दिमाग़ में। हर नया एजेंट सेशन — और हर नया साथी — शून्य से शुरू करता है और उसे मुश्किल तरीके से फिर सीखता है।
0.7.0 ने हर एजेंट की मेमोरी को ख़ुद का रखरखाव करने वाला बनाया — sleep consolidation, decay, goal-anchored folding। वह एक मेमोरी के बारे में था, जो अपने आप समझदार होती जाती है।
0.9.0 समस्या के दूसरे आधे हिस्से के बारे में है: ऐसी नॉलेज जिसे हर मशीन पर फिर से नहीं सीखना चाहिए। यह Octobrain की नॉलेज लेयर को साझा करने योग्य बनाता है — git में versioned, नाम से scoped, अपने-आप synced — और recall को इतना तीखा करता है कि सही तथ्य ज़्यादा बार जीते। (हमने 0.8.0 की ग्राउंडवर्क भी यहीं समेट दी है।)
Git-Backed Knowledge Boxes — नॉलेज को कोड की तरह भेजें
यही मुख्य बात है। एक knowledge box markdown से भरी एक git रिपॉज़िटरी है — नियम, डॉक्स, playbooks, architecture नोट्स — जिसे Octobrain clone करता है, index करता है, और sync में रखता है। एक बार इसे curate करें, इसे कोड की तरह version करें, और हर मशीन पर हर एजेंट जो subscribe करता है उसे वही searchable नॉलेज मिलती है।
दो रूप हैं, और वे दो असली मामले कवर करते हैं:
Project-local — बस एक .box/ डायरेक्टरी commit करें। अपने प्रोजेक्ट की जीवंत नॉलेज को रिपॉज़िटरी के root में .box/ में डाल दें। जो कोई भी रिपॉज़िटरी clone करता है और Octobrain चलाता है उसे वह अपने-आप indexed मिल जाती है — कोई अतिरिक्त कमांड नहीं, कोई remote कॉन्फ़िगर करने को नहीं। यह कोड के साथ चलती है क्योंकि यह है ही कोड में।
Remote — एक साझा box को subscribe करें। Octobrain को एक git URL की ओर इंगित करें और यह box को shallow-clone करके उसे एक scope के तहत index कर देता है:
# Subscribe to your org's shared knowledge box
octobrain box import https://github.com/acme/engineering-knowledge
# Index it at the global scope — visible in every project on this machine
octobrain box import https://github.com/acme/conventions --global
# Pull + smart-reindex every subscribed box and the local .box/
octobrain box sync
# See what you're subscribed to, or drop one
octobrain box list
octobrain box remove github.com/acme/engineering-knowledge
हर box-स्रोत वाले chunk को एक स्थिर box://<host>/<org>/<repo>/... source URI मिलता है, तो वह grouped, attributable, और साफ़-सुथरे तरीके से हटाने योग्य रहता है — एक box हटाएँ और उसकी सारी rows उसके साथ चली जाती हैं। Re-syncs hash-आधारित और स्मार्ट हैं: सिर्फ़ बदली हुई फ़ाइलें फिर से embed होती हैं, तो किसी unchanged box पर एक sync की लागत लगभग शून्य होती है।
और MCP के तहत, आप sync कॉल भी नहीं करते — सर्वर हर प्रोजेक्ट के .box/ को खोज लेता है, एक org box के लिए probe करता है, और subscribed remotes को बैकग्राउंड में, प्रति सेशन एक बार रिफ़्रेश करता है, single-flighted ताकि यह कभी किसी अनुरोध को न रोके। आपका एजेंट बस अपनी खोजों में टीम की नॉलेज ढूँढना शुरू कर देता है।
[knowledge]
chunk_size = 1200 # boxes index through the same chunker as everything else
मुद्दा यह है: runbook किसी के दिमाग़ में रहना बंद कर देता है। यह एक रिपॉज़िटरी में रहता है, यह अर्थ के हिसाब से searchable है, और जिस पल यह प्रासंगिक होता है आपके एजेंट के संदर्भ में आ जाता है — सबके लिए।
Scopes ने Project Hashes की जगह ली — नाम वाली मेमोरी
अब तक Octobrain आपके Git remote URL को एक अपारदर्शी SHA-256 डायरेक्टरी में hash करके हर प्रोजेक्ट की मेमोरी को अलग रखता था। यह काम करता था, पर आप इसे पढ़ नहीं सकते थे, उसे target नहीं कर सकते थे, और उसे साझा नहीं कर सकते थे।
0.9.0 उसकी जगह scopes ले आता है: मानव-पठनीय strings, जो आपके Git remote से (या fallback के रूप में local path से) अपने-आप derive होती हैं, जिन्हें आप वाकई देख सकते हैं और जिनकी ओर इशारा कर सकते हैं।
# Auto-detected from the git remote — nothing to configure
octobrain memory remember "rate limiting approach"
# Or target a scope explicitly
octobrain memory remember "rate limiting approach" --scope acme/payments
# Store something that should be visible everywhere, not just this project
octobrain memory memorize --title "Team convention: trunk-based, no long-lived branches" \
--content "..." --global
Scopes ही boxes को सुसंगत बनाते हैं: एक remote box डिफ़ॉल्ट रूप से एक org-स्तरीय scope से bind होती है, एक .box/ अपने प्रोजेक्ट के scope से bind होती है, और --global नॉलेज या मेमोरी को मशीन के हर प्रोजेक्ट के सामने रख देता है। एक ही नामकरण प्रणाली, हर जगह इस्तेमाल — storage paths, search filters, stats, और logs अब hashes के बजाय सीधी-सादी भाषा में पढ़े जाते हैं।
यही एकमात्र breaking change है जो आपको छूता है: --project flag और project टूल पैरामीटर अब --scope हैं। वही व्यवहार, पठनीय नाम। देखें अपग्रेड करना।
Multi-Query Recall जो सचमुच फलदायी है — RRF Fusion
Octobrain लंबे समय से multi-query search को सपोर्ट करता रहा है — एक धुँधले सवाल को कई तीखे सवालों में decompose करें और उन्हें एक साथ खोजें:
octobrain memory remember "authentication" "session security" "jwt expiry"
समस्या merge में थी। पुराना logic हर मेमोरी के सबसे अच्छे अकेले score को रखता और हर अतिरिक्त match के लिए एक सपाट 10% जोड़ देता — असंगत scales पर गणना किए गए per-query scores को मिला देता। एक मेमोरी जो तीनों क्वेरी में मज़बूती से रैंक करती, वह एक अकेली क्वेरी पर एक इकलौते top hit से हार सकती थी। Decomposition असल में मदद नहीं करता; कभी-कभी नुक़सान करता।
0.9.0 उसकी जगह Reciprocal Rank Fusion ले आता है — वही k=60 rank-आधारित fusion जिसे Octobrain पहले से in-store BM25 और vector search को मिलाने के लिए इस्तेमाल करता है। RRF rank-आधारित और scale-free है: एक मेमोरी जो कई क्वेरी में अच्छी जगह बनाती है वह उस मेमोरी को हराती है जो एक अकेली क्वेरी पर उछलती है। अब query decomposition उस तरह फलदायी होता है जैसा होना चाहिए। यह शुद्ध गणित है — कोई LLM नहीं, कोई अतिरिक्त config नहीं — और rrf_fuse एक छोटा, unit-tested फ़ंक्शन है जिस पर आप भरोसा कर सकते हैं।
Recall को पता है कि मौजूदा क्या है — Supersedes-Aware रैंकिंग
तथ्य बासी हो जाते हैं। आपने Postgres इस्तेमाल करने का फ़ैसला किया, फिर छह हफ़्ते बाद SQLite पर चले गए। दोनों नोट्स मेमोरी में हैं, दोनों "हम कौन-सा database इस्तेमाल कर रहे हैं" से match करते हैं — और पुराने जवाब का जीतना बनता ही नहीं।
Octobrain में हमेशा से एक Supersedes relationship type रहा है, पर वह defined, parsed, और stored था — और फिर retrieval पर कभी पढ़ा नहीं जाता था। एक बनी हुई क्षमता, बेकार पड़ी।
0.9.0 इसे जोड़ देता है। जब एक active X Supersedes M edge किसी रिज़ल्ट को पुराना चिह्नित करता है, तो retrieval बासी वाले को soft-down-rank कर देता है (×0.1 — कभी delete नहीं), ताकि मौजूदा तथ्य ऊपर उठे जबकि इतिहास queryable बना रहे। दो जान-बूझकर रखे गए guardrails:
- Edges का सम्मान होता है, उन्हें कभी अपने-आप नहीं बनाया जाता। एक असली contradiction को पहचानने के लिए semantic judgment चाहिए, और Octobrain जान-बूझकर उसे hot path से बाहर रखता है। आप (या आपका एजेंट) supersede मार्क करते हैं; retrieval उसका सम्मान करता है। MCP पर,
knowledgeटूल अब एजेंट्स को सक्रिय रूप से मार्गदर्शन देता है कि जब वे कोई तथ्य अपडेट करें तो supersedes links बनाएँ। - Best-effort। एक relationship-lookup विफलता रिज़ल्ट को छोड़ने के बजाय उसे अछूता छोड़ देती है। सबसे ख़राब स्थिति में आप पुराने व्यवहार पर लौट आते हैं, कभी उससे बुरा नहीं।
मौजूदा निर्णय जीतता है; पुराने तक वापस जाने का रास्ता बचा रहता है।
Time-Scoped Recall — Temporal और Relevance Filters
"मैंने पिछले हफ़्ते क्या तय किया था?" यह एक ऐसा सवाल है जो इंसान लगातार पूछते हैं, और अकेला semantic search इसका जवाब बुरी तरह देता है — relevance को समय के बारे में पता नहीं होता।
MemoryQuery पहले से created_after / created_before (सीधे created_at index पर pushed) और min_relevance को सपोर्ट करता था — पर remember MCP टूल ने उन्हें कभी populate नहीं किया। एक और बनी-पर-बेकार क्षमता। 0.9.0 दोनों को expose कर देता है:
created_after/created_before— ISO-8601 date (2026-06-01) या पूरा RFC3339 timestamp। एक खाली date का मतलब midnight UTC; जो कुछ भी unparseable हो वह error देने के बजाय बस filter को छोड़ देता है।min_relevance— रिज़ल्ट गुणवत्ता पर एक per-call floor, जो global डिफ़ॉल्ट को override करता है।
टूल एजेंट को कहता है कि window ख़ुद गणना करे — उसे पहले से आज की तारीख़ पता है — तो टूल में कोई कमज़ोर natural-language date parsing दबी नहीं रहती। "मैंने पिछले हफ़्ते क्या तय किया था" एक साफ़ indexed range scan में बदल जाता है, जो ठीक उसी तरह का time-anchored सवाल है जिसे LongMemEval मापता है।
हमने इस पर आँकड़े रखे — BEIR Retrieval Benchmarks
0.7.0 ने दीर्घकालिक मेमोरी के लिए LongMemEval जोड़ा। 0.9.0 एक BEIR retrieval हार्नेस जोड़ता है ताकि हम ranking layer — embedding + BM25 fusion + reranking — को असली qrels वाले मानक datasets पर स्कोर कर सकें, पूरी तरह local, कोई LLM judge नहीं।
डिफ़ॉल्ट local embedder (bge-small-en-v1.5, 384-dim, 33M params) का उपयोग करते हुए, nDCG@10 के रूप में मापा गया:
| Dataset | Octobrain vector | Octobrain hybrid | BM25 | bge-small-en-v1.5 |
|---|---|---|---|---|
| SciFact (5.2K docs, 300 q) | 0.722 | 0.742 | 0.665 | 0.713 |
| NFCorpus (3.6K docs, 323 q) | 0.341 | 0.363 | 0.325 | 0.343 |
dense-only कॉलम embedder के प्रकाशित BEIR आँकड़ों को फिर से पैदा करता है — यही हार्नेस ख़ुद को validate करता हुआ। hybrid कॉलम (BM25 + vector को RRF से fused, Octobrain का डिफ़ॉल्ट) बेयर embedding पर +2 nDCG@10 जोड़ता है और दोनों datasets पर classic BM25 को हराता है। इसे ख़ुद reproduce करें: cd benches && bash scripts/run_retrieval.sh। ऊपर के recall दावे ऐसे दावे हैं जिन पर हम खड़े रह सकते हैं।
कवर के नीचे
वे शांत बदलाव जो corpus के बढ़ने पर चीज़ों को तेज़ और पूर्वानुमेय बनाए रखते हैं:
दो नए search knobs, config में।
search.similarity_threshold(डिफ़ॉल्ट0.3) semantic क्वेरी के लिए global relevance floor है;search.max_results(डिफ़ॉल्ट50) एक hard ceiling है जिसे कोई caller पार नहीं कर सकता। दोनों अब advertised-पर-ignored होने के बजाय end-to-end wired हैं।[search] similarity_threshold = 0.3 # min relevance for semantic queries (0.0–1.0) max_results = 50 # hard ceiling on results from any searchEmbeddings और reranker के लिए Timeouts। एक धीमा या अटका हुआ provider कॉल अब किसी search को नहीं रोकता —
timeout_secs(डिफ़ॉल्ट30) दोनों को bound करता है, जिसका reranker config में एक उदाहरण है।Background initialization। भारी startup कार्य hot path से अलग spawn होते हैं, तो launch के बाद का पहला अनुरोध index warm-up की क़ीमत नहीं चुकाता।
अपने-आप scope discovery और config override (0.8.0 से)। Octobrain working directory से आपका scope अपने-आप derive करता है, और
OCTOBRAIN_CONFIG_PATHआपको एक custom config फ़ाइल की ओर इंगित करने देता है — CI, containers, और multi-tenant setups के लिए सुविधाजनक। Project और role locking को decouple कर दिया गया ताकि असंबंधित सेशन आपस में टकराना बंद करें।Multi-arch Docker। Release अब multi-arch images बनाकर push करता है, तो
arm64(Apple Silicon, Graviton) औरamd64दोनों first-class हैं।कठोर बनाई गई ranking गणित। reranker candidate limit, RRF normalization, archived-memory exclusion में सुधार, और एक PRF guard नए retrieval path के edge cases को कस देते हैं। Knowledge search अब एक truncated fragment के बजाय पूरा parent section लौटाता है।
आप इनमें से ज़्यादातर तक सीधे नहीं पहुँचेंगे। यही तो बात है।
व्यवहार में 0.9.0 कैसा दिखता है
payments टीम में एक नया engineer जुड़ता है:
- वे रिपॉज़िटरी clone करते हैं। उसकी
.box/डायरेक्टरी — deploy runbook, "idempotency layer को bypass मत करो" वाले नियम, why-we-retry नोट्स — पहली बार उनका एजेंट चलते ही अपने-आप index हो जाती है। शून्य setup। - उनकी मशीन org box को subscribe करती है (
octobrain box import …), तो कंपनी-व्यापी conventions हर प्रोजेक्ट में एक global scope के तहत दिखती हैं। - वे अपने एजेंट से एक अस्पष्ट सवाल पूछते हैं — "यहाँ हम webhook failures को कैसे संभालते हैं?" Multi-query decomposition इसे फैला देता है, RRF ranks को fuse करता है, और टीम की runbook एंट्री सबसे ऊपर आ जाती है।
- पिछले महीने एक निर्णय बदला — टीम एक ऐसे queue से हट गई जिसकी वे पहले सिफ़ारिश करते थे। पुराना नोट superseded चिह्नित है, तो मौजूदा तरीका जीतता है और इतिहास अब भी एक क्वेरी दूर है।
- वे पूछते हैं "पिछले हफ़्ते हमने क्या बदला?" — temporal filter, साफ़ indexed range, छह महीने पुराने का कोई शोर नहीं।
किसी ने सिस्टम फिर से नहीं समझाया। नॉलेज पहले से लिखी हुई थी — Octobrain ने बस उसे ढूँढने योग्य, मौजूदा, और साझा बना दिया।
अपग्रेड करना
0.7.x या 0.8.x से, migration छोटा है।
Config — --project बन जाता है --scope। यही एकमात्र breaking change है। CLI पर जहाँ कहीं आपने --project <id> पास किया, या किसी MCP टूल को project पैरामीटर दिया, उसकी जगह --scope <name> इस्तेमाल करें। बड़ा अपग्रेड: यह value अब एक मानव-पठनीय string है (आपके Git remote से अपने-आप derive होकर), hash नहीं — तो ज़्यादातर समय आप flag पूरी तरह छोड़ सकते हैं और discovery को संभालने दे सकते हैं।
octobrain memory remember "api design" --scope acme/web # was: --project <hash>
Storage — कुछ करने की ज़रूरत नहीं। scope कॉलम और उसका index पहले रन पर जुड़ते हैं, और मौजूदा यादें वहीं की वहीं migrate हो जाती हैं। कोई मैन्युअल चरण नहीं, कोई downtime नहीं।
नया config additive है। search.similarity_threshold, search.max_results, और embedding/reranker का timeout_secs सब काम करते हुए डिफ़ॉल्ट्स के साथ आते हैं। इन्हें तभी जोड़ें जब आप इन्हें ट्यून करना चाहें।
Knowledge boxes opt-in हैं। जब तक आप एक .box/ डायरेक्टरी commit न करें या octobrain box import न चलाएँ, तब तक कुछ नहीं बदलता। मौजूदा indexed स्रोत अछूते रहते हैं।
MCP क्लाइंट — अपनी टूल सूची रिफ़्रेश करें। remember अब created_after, created_before, और min_relevance स्वीकार करता है; memorize --global लेता है। मूल पाँच टूल पर कोई rename नहीं — बस नए वैकल्पिक fields जिन्हें आपका एजेंट इस्तेमाल कर सकता है।
स्रोत, बाइनरी, और Docker images github.com/muvon/octobrain पर। अगर कुछ टूटे, एक issue खोलें — हम पढ़ते हैं।



