<?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: Viacheslav Bochkarev</title>
    <description>The latest articles on DEV Community by Viacheslav Bochkarev (@__e7eb0ca).</description>
    <link>https://dev.to/__e7eb0ca</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4077975%2Fd437d949-e3c3-4a57-a0e5-263a00cce441.png</url>
      <title>DEV Community: Viacheslav Bochkarev</title>
      <link>https://dev.to/__e7eb0ca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/__e7eb0ca"/>
    <language>en</language>
    <item>
      <title>ONE SKILL INSTEAD OF SIX</title>
      <dc:creator>Viacheslav Bochkarev</dc:creator>
      <pubDate>Tue, 18 Aug 2026 09:13:50 +0000</pubDate>
      <link>https://dev.to/__e7eb0ca/one-skill-instead-of-six-lo5</link>
      <guid>https://dev.to/__e7eb0ca/one-skill-instead-of-six-lo5</guid>
      <description>&lt;p&gt;When I started wiring up AI agents, I did what everyone does: I kept adding tools. One tool remembered facts. Another compressed web search results. A third summarized long conversations. A fourth shared state across a team of agents. Before long, my agents were juggling a pile of little integrations, each with its own storage format, its own context cost, and its own way of failing.&lt;br&gt;
So I collapsed all of it into a single skill. Here's what that looked like, and what broke along the way.&lt;/p&gt;

&lt;p&gt;The fragmentation problem&lt;br&gt;
Every agent capability I needed had become a separate moving part:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Memory&lt;/strong&gt; — facts that survive between sessions, found by meaning, not keywords.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Web search savings&lt;/strong&gt; — search results are 5–15K tokens per article; dumping them raw into the model is expensive.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Thread memory&lt;/strong&gt; — long conversations that don't fit in context but still need to be restorable.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Team memory&lt;/strong&gt; — several agents writing into one shared namespace so an orchestrator can see "what the team already knows."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Live handoff&lt;/strong&gt; — an agent resuming work after &lt;code&gt;/new&lt;/code&gt;, a restart, or a crash, without asking the human "where were we?"&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Archive&lt;/strong&gt; — old facts that shouldn't slow down search but must never be lost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Six tools meant six integrations, six storage files, six context blobs, and six things that could drift out of sync. The overhead was eating the savings.&lt;/p&gt;

&lt;p&gt;The unifying idea: everything is a node&lt;br&gt;
I asked a dumb question: what actually differs between a remembered fact, a compressed article, a conversation summary, and a team note?&lt;/p&gt;

&lt;p&gt;Almost nothing. All of them are just "a labeled thing with content, a security level, and an expiry." So I built one primitive and stopped building tools:&lt;/p&gt;

&lt;p&gt;A single local encrypted graph, where every capability is just a node with a label, tags, a TTL, and a security level.&lt;/p&gt;

&lt;p&gt;One storage format (a .web file). One crypto layer. One CLI. The six "products" became six ways of using the same graph.&lt;/p&gt;

&lt;p&gt;Security became a single axis: L1 / L2 / L3&lt;br&gt;
Instead of each tool inventing its own access rules, I gave every node one of three levels:&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;L1 (public)&lt;/strong&gt; — names, tags, cities. Anything can see it.&lt;br&gt;
• &lt;strong&gt;L2 (private)&lt;/strong&gt; — notes, roadmap. Encrypted with the agent's key.&lt;br&gt;
• &lt;strong&gt;L3 (secret)&lt;/strong&gt; — API keys, passwords. Encrypted with the user's key, and it never reaches the LLM context at all — the model only ever sees a 🔒 placeholder.&lt;/p&gt;

&lt;p&gt;One important consequence: the model literally cannot leak an L3 secret, because it never saw it. That's a stronger guarantee than "please don't print the API key."&lt;/p&gt;

&lt;p&gt;How each function collapsed into the graph&lt;br&gt;
Memory is just nodes and edges:&lt;/p&gt;

&lt;p&gt;node = graph.add_node("Anna", "Client, loves coffee without sugar", tags=["person"])&lt;br&gt;
graph.add_edge(node.id, "company-inc", "founded")&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web search savings&lt;/strong&gt; became a compress-and-cache step in front of the search call — measured at 96.2% fewer tokens per article (12,975 → 489):&lt;/p&gt;

&lt;p&gt;compressed, stats = compress_article(article_text, query)   # saved_pct=96.2&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thread memory&lt;/strong&gt; keeps the full history in the file and sends only a compressed summary to the model — 72% fewer tokens, details restorable on demand:&lt;/p&gt;

&lt;p&gt;vibo dialog add "client asked about pricing" --topic pricing&lt;br&gt;
vibo dialog compress          # old messages → summary&lt;br&gt;
vibo dialog ask "what did we agree 3 days ago?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team memory&lt;/strong&gt; is just a namespace with authorship and TTL — one agent writes, the orchestrator reads one digest:&lt;/p&gt;

&lt;p&gt;vibo add "health" "disk 48G" --namespace team:x --by sys-agent --ttl 6h&lt;br&gt;
vibo context --namespace team:x&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live handoff&lt;/strong&gt; is a single overwritten &lt;code&gt;state_live&lt;/code&gt; node — read it first on startup, update it on every stop:&lt;/p&gt;

&lt;p&gt;vibo resume                       # "where was I" — one node, always current&lt;br&gt;
vibo save-state "summary" --done --next&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archive&lt;/strong&gt; is a two-tier "desk + drawer": an active memory that search touches (fast, cheap) and an archive that everything eventually lands in (never lost, queried on demand).&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest tradeoffs
&lt;/h2&gt;

&lt;p&gt;Combining everything into one skill is not free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bigger surface.&lt;/strong&gt; One skill now does six things, so it's more to test, more to document, and more to keep honest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's a commercial skill.&lt;/strong&gt; One license key, one machine, a license check on every run. I decided against a free tier with "built-in" keys — every install requires activation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The honest floor matters more than the ceiling.&lt;/strong&gt; ViBo must never cost more than no-ViBo: with a small memory (~100 facts) the skill stays silent and adds no overhead; only once facts pile up (10K+) do the savings appear — 50–150× fewer tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the one I care about most. A tool that "sometimes saves you tokens" but quietly wastes them when your data is small is a tax, not a feature. I'd rather the skill say nothing than pretend it helped.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;If I started over, I'd unify the storage and security model before building the first feature, not after. The compression, the semantic search, the team namespaces, and the handoff state all turned out to be the same graph operation wearing different hats — and realizing that late meant a few rounds of refactoring that a single primitive would have avoided.&lt;/p&gt;

&lt;p&gt;The win, though, is real: agents that used to depend on a toolbox now depend on one skill, with one file, one encryption model, and one honest savings number.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by Viacheslav Bochkarev. Source: &lt;a href="https://github.com/vnbochkarev-netizen/ViBo-memory" rel="noopener noreferrer"&gt;github.com/vnbochkarev-netizen/ViBo-memory&lt;/a&gt; · &lt;a href="https://wwwvibo.com" rel="noopener noreferrer"&gt;wwwvibo.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>python</category>
      <category>agents</category>
    </item>
    <item>
      <title>ZIP Stores Documents. ViBo Understands Them.</title>
      <dc:creator>Viacheslav Bochkarev</dc:creator>
      <pubDate>Fri, 14 Aug 2026 16:56:41 +0000</pubDate>
      <link>https://dev.to/__e7eb0ca/zip-stores-documents-vibo-understands-them-4agd</link>
      <guid>https://dev.to/__e7eb0ca/zip-stores-documents-vibo-understands-them-4agd</guid>
      <description>&lt;p&gt;The Living Archive: How My Agent Started Working Through ViBo&lt;/p&gt;

&lt;p&gt;My AI agent had a problem that every agent has: too many documents, no memory.&lt;/p&gt;

&lt;p&gt;98 files. 9 MB. Business plans, contracts, requisites, notes, decisions. When the agent needed an answer — "what did we propose to partner X?" or "what are the tax benefits of zone Y?" — it had to open files one by one. Slow. Expensive. Unreliable.&lt;/p&gt;

&lt;p&gt;So I built a LIVING ARCHIVE: my own format (.vibo), compression, semantic search. And then I did the hardest thing: I made my agent actually work through it. Not as a test. As its only working memory.&lt;/p&gt;

&lt;p&gt;Here is the proof, measured on real data.&lt;/p&gt;

&lt;p&gt;The archive&lt;/p&gt;

&lt;p&gt;98 working documents (9 MB) became one file: 808 KB.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;33 .docx files (business plans, a proposal to a partner, a service contract, company requisites) — now indexed as TEXT. Earlier they were opaque binaries. Now the full text is searchable.&lt;/li&gt;
&lt;li&gt;Junk is filtered automatically: package.json, tsconfig, tailwind configs, node_modules, build artifacts — never enter the archive. Only real documents.&lt;/li&gt;
&lt;li&gt;The agent answers ONLY through the archive: vibo archive search archive.vibo "question".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real questions, real answers&lt;/p&gt;

&lt;p&gt;"proposal to partner about the project"&lt;br&gt;
• Found: the actual proposal text ✅&lt;/p&gt;

&lt;p&gt;"project essence, key section"&lt;br&gt;
• Found: the exact section of the plan ✅&lt;/p&gt;

&lt;p&gt;"company requisites"&lt;br&gt;
• Found: the requisites, extracted from .docx ✅&lt;/p&gt;

&lt;p&gt;"margin on product X?"&lt;br&gt;
• Found: the pricing document, 100% tokens saved&lt;/p&gt;

&lt;p&gt;"what tax benefits does zone Y give?"&lt;br&gt;
• Found: the zone Y note ✅&lt;/p&gt;

&lt;p&gt;"how much does the product cost?"&lt;br&gt;
• Found: pricing records, 99.7% saved&lt;/p&gt;

&lt;p&gt;Savings: up to 99.7% of tokens. The agent reads 2-3 relevant fragments instead of opening 98 files.&lt;/p&gt;

&lt;p&gt;Integrity&lt;/p&gt;

&lt;p&gt;A real test on 216 files (1.6 MB): pack → unpack → ALL 216 files returned. Zero losses. Full paths preserved, name collisions resolved, extensions kept (.md stays .md). Original files untouched — the archive is a working copy, originals are backed up.&lt;/p&gt;

&lt;p&gt;The economics&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;9 MB of documents → 808 KB archive (9× smaller).&lt;/li&gt;
&lt;li&gt;Search: milliseconds.&lt;/li&gt;
&lt;li&gt;Token cost per question: near zero (the LLM reads only the essence).&lt;/li&gt;
&lt;li&gt;The more documents — the bigger the savings. This is not compression of bytes. This is compression of TIME.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why it matters&lt;/p&gt;

&lt;p&gt;ZIP stores documents. ViBo understands them. A ZIP cannot answer a question. ViBo answers in milliseconds — and now my agent works through the archive as its only memory. Dust is no longer dust. Dust is memory that was waiting for its hour.&lt;/p&gt;




&lt;p&gt;ViBo — memory + living archive for AI agents. One license, one key, three languages. Try it: 2-day free trial (&lt;a href="https://wwwvibo.com/" rel="noopener noreferrer"&gt;https://wwwvibo.com/&lt;/a&gt;).&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
