<?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: RagLeap</title>
    <description>The latest articles on DEV Community by RagLeap (@ragleap).</description>
    <link>https://dev.to/ragleap</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%2F3859689%2F0ddcc260-cc95-431d-9ba2-4c3c8cbe0d06.png</url>
      <title>DEV Community: RagLeap</title>
      <link>https://dev.to/ragleap</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ragleap"/>
    <language>en</language>
    <item>
      <title>I Built Tenant-Scoped Memory That Erases for Real — 89 Tests, 27 Mutations, Byte-Level Verified</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Sat, 24 Oct 2026 16:00:33 +0000</pubDate>
      <link>https://dev.to/ragleap/i-built-tenant-scoped-memory-that-erases-for-real-89-tests-27-mutations-byte-level-verified-i3c</link>
      <guid>https://dev.to/ragleap/i-built-tenant-scoped-memory-that-erases-for-real-89-tests-27-mutations-byte-level-verified-i3c</guid>
      <description>&lt;p&gt;ragleap-memory 0.1.0 + ragleap-security 0.1.0 — One SQLite File, Real Erasure, Scope Enforced in SQL&lt;/p&gt;

&lt;p&gt;I just released two new libraries: ragleap-security 0.1.0 (101 tests) and ragleap-memory 0.1.0 (89 tests). Both v0.1.0, both first releases, both with mutation testing.&lt;/p&gt;

&lt;p&gt;TL;DR: Tenant isolation enforced inside SQL, not in app code. And erase() actually removes bytes.&lt;/p&gt;

&lt;p&gt;ragleap-security — stdlib only&lt;/p&gt;

&lt;p&gt;from ragleap_security import Scope, AuditLog, SecretStr, check_size&lt;/p&gt;

&lt;p&gt;scope = Scope.parse("org:gov-dept/region:south/branch:chennai")&lt;br&gt;
print(scope.covers(Scope.parse("org:gov-dept/region:south"))) # True&lt;/p&gt;

&lt;p&gt;child = scope.narrow("facility:factory1")&lt;/p&gt;

&lt;h1&gt;
  
  
  org:gov-dept/region:south/branch:chennai/facility:factory1
&lt;/h1&gt;

&lt;p&gt;log = AuditLog("audit.jsonl")&lt;br&gt;
log.append({"op": "add", "scope": str(scope)})&lt;br&gt;
log.verify() # hash-chain check&lt;/p&gt;

&lt;p&gt;secret = SecretStr("sk-...")&lt;br&gt;
print(secret) # SecretStr(***) — never leaks in repr&lt;br&gt;
check_size(data, max_bytes=1_000_000)&lt;/p&gt;

&lt;p&gt;5 modules, no deps. You can audit it in an afternoon.&lt;/p&gt;

&lt;p&gt;Why hash-chained JSONL? Tamper-evident. If someone edits line 10, verify() fails because hash chain breaks. Not tamper-proof (can't prevent edit), but can detect.&lt;/p&gt;

&lt;p&gt;Verified: 101 tests, 30/30 mutations killed, reproducible build matches PyPI.&lt;/p&gt;

&lt;p&gt;ragleap-memory — the interesting part&lt;/p&gt;

&lt;p&gt;Problem with most memory libs: They do SELECT * FROM memories WHERE tenant_id = X in app code. But they still return different errors for "not found" vs "not allowed" — leaking existence.&lt;/p&gt;

&lt;p&gt;Our approach: scope filtering inside SQL, same response for missing vs outside-scope.&lt;/p&gt;

&lt;p&gt;from ragleap_memory import SQLiteStore&lt;br&gt;
from ragleap_security import Scope&lt;/p&gt;

&lt;p&gt;store = SQLiteStore("memory.db")&lt;br&gt;
scope_a = Scope.parse("org:hospital/branch:chennai")&lt;br&gt;
scope_b = Scope.parse("org:hospital/branch:mumbai")&lt;/p&gt;

&lt;p&gt;store.add(text="ICU bed count changed to 12", type="fact", trust="trusted", scope=scope_a)&lt;/p&gt;

&lt;h1&gt;
  
  
  Same scope → found
&lt;/h1&gt;

&lt;p&gt;print(store.search("ICU", scope=scope_a)) # [fact]&lt;/p&gt;

&lt;h1&gt;
  
  
  Different scope → looks like missing, not "access denied"
&lt;/h1&gt;

&lt;p&gt;print(store.search("ICU", scope=scope_b)) # [] — same as missing&lt;/p&gt;

&lt;p&gt;Typed entries: episode (raw events), fact (distilled), summary (compressed). All default to untrusted — you must explicitly trust.&lt;/p&gt;

&lt;p&gt;Operations that matter for enterprise:&lt;/p&gt;

&lt;p&gt;id1 = store.add(text="Old threshold", type="fact", scope=scope_a)&lt;br&gt;
id2 = store.supersede(id1, text="New threshold is 80", scope=scope_a) # history kept&lt;/p&gt;

&lt;p&gt;store.forget(id2, scope=scope_a) # soft delete&lt;br&gt;
store.erase(id2, scope=scope_a) # hard delete + vacuum&lt;/p&gt;

&lt;h1&gt;
  
  
  After erase, byte-level check:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  grep -a "New threshold" memory.db → not found
&lt;/h1&gt;

&lt;h1&gt;
  
  
  grep -a "New threshold" memory.db-journal → not found
&lt;/h1&gt;

&lt;p&gt;We actually tested byte-level search after erase on two SQLite builds.&lt;/p&gt;

&lt;p&gt;Other ops: export (dump for migration), sweep_expired (TTL), compact (vacuum), optional audit log without entry text (privacy).&lt;/p&gt;

&lt;p&gt;FTS5 search: Full-text search, not vector. Why? Deterministic, no embedding cost, works offline. For Hindi, Tamil, Arabic, Chinese with spaces — whole-word tested. Without spaces (Chinese/Japanese) — not split yet, known limit.&lt;/p&gt;

&lt;p&gt;Mutation testing&lt;/p&gt;

&lt;p&gt;We run scripts/mutation_check.py — it mutates code (change == to !=, remove WHERE clause, etc.) and checks tests kill it.&lt;/p&gt;

&lt;p&gt;security: 30/30 killed&lt;/p&gt;

&lt;p&gt;memory: 27/27 killed&lt;/p&gt;

&lt;p&gt;If a mutation survives, your tests are weak. We fixed until all killed.&lt;/p&gt;

&lt;p&gt;Reproducible builds&lt;/p&gt;

&lt;p&gt;Build locally before tagging, compute SHA-256, build on CI after tagging, compare. If different, fail. For these releases, local SHA matches PyPI SHA.&lt;/p&gt;

&lt;p&gt;ragleap_memory-0.1.0-py3-none-any.whl sha256 c60a1e4f91e323c04ba04d7628abb7028039206d2330921a7ca00ae053a3533e&lt;br&gt;
ragleap_security-0.1.0-py3-none-any.whl sha256 e3f31d3703d552cde53080e6d6c56cef733954d61deeaba586bdce48db53075d&lt;/p&gt;

&lt;p&gt;Not verified — honest&lt;/p&gt;

&lt;p&gt;No Windows / NFS / multi-process writes / power-loss tests&lt;br&gt;
No retrieval benchmark (precision/recall unmeasured)&lt;br&gt;
Tenant isolation holds inside lib, but nothing else uses it yet&lt;br&gt;
No independent security review — see docs/threat-model.md&lt;/p&gt;

&lt;p&gt;Install&lt;/p&gt;

&lt;p&gt;pip install ragleap-security==0.1.0&lt;br&gt;
pip install ragleap-memory==0.1.0&lt;/p&gt;

&lt;p&gt;Repo: github.com/ragleap/ragleap-core&lt;/p&gt;

&lt;p&gt;Release PRs: #907 (security), #922/#924 (memory)&lt;br&gt;
Workflows: 40016023080, 40060689857&lt;/p&gt;

&lt;p&gt;This is foundation for human digital twins and org-wide memory with real isolation. Next: integrate Scope into agents.&lt;/p&gt;

&lt;p&gt;If you care about multi-tenant AI, try breaking the scope isolation — I'd love a failing test.&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Added Sub-Agents to ragleap-agents Without Breaking Anything — Here's How</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Thu, 22 Oct 2026 06:30:54 +0000</pubDate>
      <link>https://dev.to/ragleap/i-added-sub-agents-to-ragleap-agents-without-breaking-anything-heres-how-5579</link>
      <guid>https://dev.to/ragleap/i-added-sub-agents-to-ragleap-agents-without-breaking-anything-heres-how-5579</guid>
      <description>&lt;p&gt;ragleap-agents 0.5.0: Sub-agents — 208 tests, 8 live runs, 0 breaking changes&lt;/p&gt;

&lt;p&gt;Tag: ragleap-agents-v0.5.0 (332b4c0) — 2 commits to main since.&lt;/p&gt;

&lt;p&gt;TL;DR: make_delegate_tool lets a parent delegate to children, with taint flowing both ways and hard limits. Opt-in only.&lt;/p&gt;

&lt;p&gt;The design goal&lt;/p&gt;

&lt;p&gt;No breaking changes. Every addition is opt-in.&lt;/p&gt;

&lt;h1&gt;
  
  
  Old code still works
&lt;/h1&gt;

&lt;p&gt;agent.run("do X") &lt;/p&gt;

&lt;h1&gt;
  
  
  New opt-in flags
&lt;/h1&gt;

&lt;p&gt;agent.run("do X", tainted=True) # #828&lt;/p&gt;

&lt;p&gt;Agent.run gained only *, tainted=False — keyword-only, defaults to old behavior.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;make_delegate_tool — the new primitive&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;from ragleap_agents import make_delegate_tool, delegate_policy, Budget, MAX_DEPTH_CEILING&lt;/p&gt;

&lt;p&gt;delegate = make_delegate_tool(&lt;br&gt;
    children={&lt;br&gt;
        "researcher": researcher_agent,&lt;br&gt;
        "analyst": analyst_agent&lt;br&gt;
    },&lt;br&gt;
    # limits per root run&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;parent = Agent(tools=[delegate, send_message, ...])&lt;br&gt;
result = parent.run("Research competitor pricing and draft a note")&lt;/p&gt;

&lt;p&gt;Implementation in #827, #843, #849:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Child runs in isolated context (its own tools, budget)&lt;/li&gt;
&lt;li&gt;Returns as untrusted, fenced observation — parent must treat as untrusted&lt;/li&gt;
&lt;li&gt;Taint: if parent.tainted → child.tainted=True, if child.tainted → parent.tainted=True&lt;/li&gt;
&lt;li&gt;Budget: Budget + MAX_DEPTH_CEILING cap depth and cost per root run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why fenced? To prevent prompt injection via child answer becoming parent's instructions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Child approval model (v0.5.0 limit)&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Child proposes send_message → needs approval
&lt;/h1&gt;

&lt;h1&gt;
  
  
  In 0.5.0: does NOT pause parent, stops with approval_not_available
&lt;/h1&gt;

&lt;p&gt;This is intentional for safety. No privilege escalation from child to parent approval queue.&lt;/p&gt;

&lt;p&gt;Future: explicit child approval queue with owner confirmation on host (Phase 2 permission system).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;current_run()&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;from ragleap_agents.context import current_run&lt;/p&gt;

&lt;p&gt;def my_tool(x: str):&lt;br&gt;
    ctx = current_run()&lt;br&gt;
    print(ctx.run_id, ctx.taint)&lt;br&gt;
    return x&lt;/p&gt;

&lt;p&gt;Useful for custom logging / policy.&lt;/p&gt;

&lt;p&gt;Verified (with numbers)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;208 tests pass on Python 3.10 (VPS c31ab4e), CI green on 3.10/3.11/3.12&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wheel: exposes make_delegate_tool, delegate_policy, Budget, MAX_DEPTH_CEILING, Agent.run(..., tainted=False)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Live: scripts/live_delegate.py #890&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provider: Groq openai/gpt-oss-20b, native mode&lt;/li&gt;
&lt;li&gt;8 runs (4 tasks × 2 configs)&lt;/li&gt;
&lt;li&gt;Delegation: 8/8&lt;/li&gt;
&lt;li&gt;Tainted: 8/8&lt;/li&gt;
&lt;li&gt;send_message blocked: 8/8 (approvals never granted)&lt;/li&gt;
&lt;li&gt;Taint gate held: 3 runs proposed send after child read note → held for approval&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not verified — honest&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Injection resistance: 2/8 read injected note unprompted → no send. Not enough for claim.&lt;/li&gt;
&lt;li&gt;Child stop path tested only with scripted models in live runs.&lt;/li&gt;
&lt;li&gt;2/8 runs failed on unparseable_reply / invalid_plan — same format intermittency as 0.4.x&lt;/li&gt;
&lt;li&gt;No benchmarks, no 3.11/3.12 runtime check on published wheel, no resume test for 0.4.x saves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We ship honest limits, not marketing.&lt;/p&gt;

&lt;p&gt;Install &amp;amp; Provenance&lt;/p&gt;

&lt;p&gt;pip install ragleap-agents==0.5.0&lt;/p&gt;

&lt;p&gt;Digests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whl: 8961d9ff4c131313b899dd8907f68fa2fa7672dd642a5e0ff34cb6c992334712&lt;/li&gt;
&lt;li&gt;tar.gz: 12a1204bbe0c88e9afb45c89ab5c11f59dde33b2851dedb022c032bdefaa14c0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Release PR #892, workflow 39653944931, 2026-10-21 18:35 UTC. Trusted publishing with Sigstore.&lt;/p&gt;

&lt;p&gt;What's next&lt;/p&gt;

&lt;p&gt;This unlocks Phase 3 of RagLeap roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lead agent that splits task → parallel children → citation merge&lt;/li&gt;
&lt;li&gt;Budget per child + cancellation&lt;/li&gt;
&lt;li&gt;Multi-provider live tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code: github.com/ragleap/ragleap-core&lt;/p&gt;

&lt;p&gt;If you build multi-agent, try the delegation API and tell me where it breaks.&lt;/p&gt;

</description>
      <category>python</category>
      <category>multiagent</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>ragleap-core v0.11.0 – Documents Tab, One Scheduler, and Early Computer Control</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Tue, 20 Oct 2026 16:20:28 +0000</pubDate>
      <link>https://dev.to/ragleap/ragleap-core-v0110-documents-tab-one-scheduler-and-early-computer-control-mg2</link>
      <guid>https://dev.to/ragleap/ragleap-core-v0110-documents-tab-one-scheduler-and-early-computer-control-mg2</guid>
      <description>&lt;h1&gt;
  
  
  ragleap-core v0.11.0 is out – first release under &lt;code&gt;ragleap&lt;/code&gt; org
&lt;/h1&gt;

&lt;p&gt;Repo moved: &lt;code&gt;antonyrag/ragleap-core&lt;/code&gt; → &lt;code&gt;ragleap/ragleap-core&lt;/code&gt;&lt;br&gt;
Tag: &lt;code&gt;v0.11.0&lt;/code&gt; / commit &lt;code&gt;c1fc164&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is a stability + product release. Here's the breakdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Documents Tab (the main feature)
&lt;/h3&gt;

&lt;p&gt;Before: adding docs was scattered.&lt;br&gt;
Now: dedicated Documents tab to list, upload, and delete.&lt;/p&gt;

&lt;p&gt;Important: deleting also removes the document's entries from the knowledge graph.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
# #710, #711 – deletion now cleans graph
# Dashboard now accepts:
# 28 file types + web pages by address (#720)

2. AI Office

Two new tabs:

Proactive
Connectors

PR #740 – foundation for AI employees to act, not just chat.

3. Offline Language Detection

LANGUAGE_DETECTION_MODEL=lite

Works without internet now (#741). Useful for air-gapped installs.

4. Infra fixes that matter

Non-root container:

# #742
USER 10001
# pinned dependencies

One scheduler:
Previously, extra web workers repeated scheduled triggers. Now only one process runs background jobs (#817).

5. Providers

DemonRoute added – 20 providers total (#851).

# provider count
20

6. Experimental: Computer Control (OFF by default)

⚠️ Not independently reviewed. Do NOT enable for real data.
Design:

Share via CLI only: ragleap files
Sandbox runner = read-only
AI can: list, read, ask for access
Access request ≠ grant. Always needs owner approval.
File contents never enter activity log
Grants visible in Files tab
ragleap files off = pause everything

Issues: #747, #776, #777, #789-#792. Review RFC: #800.

Community

Testing issues #779-#787

Number words for every language #801

ragleap-phone RFC #814
Thanks @sammist2 @mig-builds @ahmet-izgi @haterfactory

Upgrade

Container user is now 10001. No migration needed, app writes no files of its own.
Packages (ragleap-rag, ragleap-graph, voice, agents) versioned separately.

Known Limits

Neo4j default password still public in compose (localhost only) – per-install random password planned

Tested: Windows laptop + Linux servers. NOT verified: macOS, Linux desktops, Ollama on Windows (#779-#781)

No named users/roles, no security audit yet

Links:

Release: github.com/ragleap/ragleap-core/releases/tag/v0.11.0
Core: github.com/ragleap/ragleap-core

If you self-host, try the Documents tab and tell me what breaks. PRs welcome.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>ai</category>
      <category>ragleap</category>
    </item>
    <item>
      <title>Testing Python-to-Java Parity in a Graph Retrieval Library</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Fri, 16 Oct 2026 05:00:15 +0000</pubDate>
      <link>https://dev.to/ragleap/testing-python-to-java-parity-in-a-graph-retrieval-library-2311</link>
      <guid>https://dev.to/ragleap/testing-python-to-java-parity-in-a-graph-retrieval-library-2311</guid>
      <description>&lt;p&gt;What does it take to port a graph-retrieval library from Python to Java without relying on API similarity alone?&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;RagLeap Graph Java v0.2.0&lt;/strong&gt;, the answer was a combination of parity tests, deliberate mutations, database integration tests, and validation of the actual published artifact.&lt;/p&gt;

&lt;p&gt;Release: &lt;a href="https://github.com/antonyrag/ragleap-core/releases/tag/ragleap-graph-java-v0.2.0" rel="noopener noreferrer"&gt;RagLeap Graph Java v0.2.0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features in this release
&lt;/h2&gt;

&lt;p&gt;The Java library now includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optional LLM-based entity and relation extraction.&lt;/li&gt;
&lt;li&gt;Configurable extraction and entity deduplication.&lt;/li&gt;
&lt;li&gt;Cross-chunk relation handling.&lt;/li&gt;
&lt;li&gt;Hybrid vector + graph retrieval and graph-only retrieval.&lt;/li&gt;
&lt;li&gt;Chunk and graph-path citations.&lt;/li&gt;
&lt;li&gt;Pluggable graph and vector search interfaces.&lt;/li&gt;
&lt;li&gt;Backfill utilities and a schema migration runner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regex-based extraction remains the default. LLM integration is optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we approached parity testing
&lt;/h2&gt;

&lt;p&gt;We compared the Java implementation against the Python &lt;code&gt;ragleap-graph&lt;/code&gt; v0.9.0 implementation.&lt;/p&gt;

&lt;p&gt;Rather than comparing method names, we exercised behavior using recorded calls, parameters, outputs, and scripted model responses.&lt;/p&gt;

&lt;p&gt;The test scenarios covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;422 string-similarity pairs.&lt;/li&gt;
&lt;li&gt;25 extraction-configuration cases.&lt;/li&gt;
&lt;li&gt;Entity and relation extraction.&lt;/li&gt;
&lt;li&gt;Graph upserts, including Cypher statements and parameters.&lt;/li&gt;
&lt;li&gt;Backfills and migration behavior.&lt;/li&gt;
&lt;li&gt;Retrieval scenarios and retrieval configurations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also ran 27 deliberate mutations across the new functionality. Every injected break was caught by the parity tests.&lt;/p&gt;

&lt;p&gt;This is evidence for the tested cases, not a mathematical guarantee of complete equivalence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why mutation testing matters
&lt;/h2&gt;

&lt;p&gt;A passing test suite can still miss bugs if its assertions are too weak.&lt;/p&gt;

&lt;p&gt;Mutation testing deliberately changes behavior to check whether the tests notice. For this release, the 27 deliberate breaks were caught by the parity tests.&lt;/p&gt;

&lt;p&gt;That gave us additional confidence that the tests were checking behavior rather than merely executing code paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the real release
&lt;/h2&gt;

&lt;p&gt;The full local run used generated parity fixtures and a live Neo4j 5.26.29 Community instance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;129 tests&lt;/li&gt;
&lt;li&gt;0 failures&lt;/li&gt;
&lt;li&gt;0 skipped tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After publishing, we resolved the Maven artifact in a clean project and exercised health checks, upserts, backfills, and graph-only retrieval against live Neo4j.&lt;/p&gt;

&lt;p&gt;Maven coordinates:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;io.github.antonyrag:ragleap-graph:0.2.0\&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What still needs testing?
&lt;/h2&gt;

&lt;p&gt;LLM extraction hasn't been verified against a real model provider. Compatibility with other Neo4j deployments also needs more testing, and the optional vector-search adapter hasn't been tested against a live RagLeap facade.&lt;/p&gt;

&lt;p&gt;The PostgreSQL audit writer hasn't been ported yet.&lt;/p&gt;

&lt;p&gt;Documenting these limitations is part of making a library easier to evaluate responsibly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it and share feedback
&lt;/h2&gt;

&lt;p&gt;Source and release notes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/antonyrag/ragleap-core/releases/tag/ragleap-graph-java-v0.2.0" rel="noopener noreferrer"&gt;https://github.com/antonyrag/ragleap-core/releases/tag/ragleap-graph-java-v0.2.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RagLeap is fully open-source and self-hosted, with a wider ecosystem of retrieval, graph, and AI tooling libraries.&lt;/p&gt;

&lt;p&gt;If you work with Java or Neo4j, I'd appreciate feedback on the API, compatibility, test coverage, and integration experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What integration test would you add before using this library in production?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>opensource</category>
      <category>neo4j</category>
      <category>ai</category>
    </item>
    <item>
      <title>ragleap-rag Java v0.13.0 and ragleap-graph v0.1.0 are on Maven Central — Full Python Parity, 502 Tests</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Thu, 15 Oct 2026 08:16:31 +0000</pubDate>
      <link>https://dev.to/ragleap/ragleap-rag-java-v0130-and-ragleap-graph-v010-are-on-maven-central-full-python-parity-502-4pf2</link>
      <guid>https://dev.to/ragleap/ragleap-rag-java-v0130-and-ragleap-graph-v010-are-on-maven-central-full-python-parity-502-4pf2</guid>
      <description>&lt;p&gt;Java devs — RagLeap is now native Java, on Maven Central!&lt;/p&gt;

&lt;p&gt;No Python service needed anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Maven Central:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ragleap-rag: &lt;a href="https://central.sonatype.com/artifact/io.github.antonyrag/ragleap-rag" rel="noopener noreferrer"&gt;https://central.sonatype.com/artifact/io.github.antonyrag/ragleap-rag&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ragleap-graph: &lt;a href="https://central.sonatype.com/artifact/io.github.antonyrag/ragleap-graph" rel="noopener noreferrer"&gt;https://central.sonatype.com/artifact/io.github.antonyrag/ragleap-graph&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub Releases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ragleap-rag: &lt;a href="https://github.com/antonyrag/ragleap-core/releases/tag/ragleap-rag-java-v0.13.0" rel="noopener noreferrer"&gt;https://github.com/antonyrag/ragleap-core/releases/tag/ragleap-rag-java-v0.13.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ragleap-graph: &lt;a href="https://github.com/antonyrag/ragleap-core/releases/tag/ragleap-graph-java-v0.1.0" rel="noopener noreferrer"&gt;https://github.com/antonyrag/ragleap-core/releases/tag/ragleap-graph-java-v0.1.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/antonyrag/ragleap-core" rel="noopener noreferrer"&gt;https://github.com/antonyrag/ragleap-core&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;pom.xml:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
  io.github.antonyrag&lt;br&gt;
  ragleap-rag&lt;br&gt;
  0.13.0&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
  io.github.antonyrag&lt;br&gt;
  ragleap-graph&lt;br&gt;
  0.1.0&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Code:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
java
var rag = new RagLeap(config);

// Ingest
rag.ingest(Path.of("report.pdf"));
rag.ingestText("RagLeap is safety-first RAG");
rag.ingestImage(Path.of("chart.png"));

// Ask
String ans = rag.ask("Summarize report with sources");

// Stream
rag.askStream("Explain", System.out::print);

// History
rag.getHistory();
rag.clearSession();

// Documents
rag.listDocuments();
rag.deleteDocument("doc-id");


Graph:

var graphConfig = new GraphConfig("http://localhost:7474", "neo4j", "password");
var graph = new GraphIndex(graphConfig, cypherRunner);

graph.upsertDocument(docId, text);
var docs = graph.findDocumentsByEntities(List.of("RagLeap", "Antony"));
var lineage = graph.findLineage("entity-id");



How we proved parity

Most ports test final output. We tested ordered behavior.

* 33 scenarios vs Python RagLeap 0.13.0 (d210dab)
* Fake embedder, vector store, generator, memory, hooks
* Full ordered log must match — calls, hooks, memory writes
* Mutation test — change behavior → test fails

**Results:** 502 tests — 0 failures.

**Graph:** 252 logic + 14 upsert + 47 query vs Python 0.9.0 (226fa4d). Cypher + params (int vs float!) must match.

**Live:** Tested against Postgres and Neo4j 5.26.29 Community by resolving jar from Maven Central in clean project.

**

## What's NOT ported (honest)
**

**ragleap-rag:** reranking, Redis cache, ingest_url, async variants. QueryRewrite is enum, streaming is callback. ingestBatch keeps metadata (Python drops it for file items).

**ragleap-graph:** LLM extraction, deduplication, GraphRetriever, backfills, migration, Postgres audit writer.

Check release notes for full list — no surprises.


**

## Roadmap
**


* reranking + Redis cache
* GraphRetriever (hybrid vector+graph)
* LLM entity extraction in Java


Contributions welcome — raise issue or PR on ragleap-core.

Try it: mvn dependency:get and let me know what breaks!


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>java</category>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>RagLeap Core v0.10.1 — I shipped 2 releases in 44 mins after Windows broke everything</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Tue, 13 Oct 2026 07:08:47 +0000</pubDate>
      <link>https://dev.to/ragleap/ragleap-core-v0101-i-shipped-2-releases-in-44-mins-after-windows-broke-everything-14a</link>
      <guid>https://dev.to/ragleap/ragleap-core-v0101-i-shipped-2-releases-in-44-mins-after-windows-broke-everything-14a</guid>
      <description>&lt;p&gt;I shipped ragleap-core v0.10.0 with login throttling, Setup tab, and a read-only skill for coding agents. 44 minutes later I shipped v0.10.1.&lt;/p&gt;

&lt;p&gt;Why? First real Windows test with Docker Desktop.&lt;/p&gt;

&lt;p&gt;A local PostgreSQL was already on port 5433. Installer stopped. That's it.&lt;/p&gt;

&lt;p&gt;That's the most honest bug report you'll get in AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What shipped in v0.10.0 (hardening):&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Login throttling:&lt;/strong&gt; 10 bad API keys in 5 mins → 15 min 429 lock with Retry-After. Proxy-aware via TRUSTED_PROXIES, off with AUTH_THROTTLE=off&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup tab + GET /setup/status:&lt;/strong&gt; Shows what's configured/missing, never shows secrets, zero AI calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read-only skill for coding agents:&lt;/strong&gt; manifest + small client (health, employees, ask). Can't change anything by design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama context 8192 default:&lt;/strong&gt; Long docs no longer silently cut&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installer checks:&lt;/strong&gt; Free disk check (4GB / 14GB for local AI), refuses if Compose project name already used, can use Ollama app already running on Win/Mac. Added install.ps1 PowerShell installer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Every third-party GitHub Action pinned to exact commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped in v0.10.1 (Windows reality):
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;This is where it gets real.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free host ports:&lt;/strong&gt; All ports are now settings — APP_PORT 8000, DB_PORT 5433, VOICE_PORT 8766, NEO4J 7475/7688, REDIS 6380. On fresh install, installer picks next free port if busy, writes to .env, uses it for dashboard link. Existing .env never changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ragleap key --rotate:&lt;/strong&gt; Writes new random API key to .env, restarts only app, checks old key is refused + new accepted, prints new link. DB untouched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser instead of printed key:&lt;/strong&gt; On desktop (Win/Mac/Linux with display, no SSH), opens dashboard in browser, no key in terminal. Servers/SSH/CI still print link. RAGLEAP_NO_BROWSER=1 to always print.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed:&lt;/strong&gt; DB exists check matched ANY Docker volume with same name, even unrelated installs → now matches only this setup's volume. API docs now says needs x-api-key header (401 by design).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Honest limits (we list these in release notes):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tested on one Windows machine with Docker Desktop, Gemini/Ollama/skip menu set to skip. Ollama on Windows not tested yet&lt;/li&gt;
&lt;li&gt;One-liner irm ... | iex fails on that machine, cause unknown. Use two-step: $s = irm ; iex $s&lt;/li&gt;
&lt;li&gt;PATH hint writes for bash, not PowerShell&lt;/li&gt;
&lt;li&gt;Windows reserved excluded ranges not detected by busy-port check&lt;/li&gt;
&lt;li&gt;While browser launches, key briefly visible in process list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  What is RagLeap Core?
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;Self-hosted AI Business OS — 46 autonomous AI Employees (9 core + 37 vertical like Recruiter, Real Estate Agent, Legal Intake), Graph RAG (Neo4j), multi-channel (WhatsApp/Telegram/Discord/Voice), BYOK 19 providers + Ollama local, MIT licensed.&lt;/p&gt;

&lt;p&gt;curl -fsSL &lt;a href="https://ragleap.com/install.sh" rel="noopener noreferrer"&gt;https://ragleap.com/install.sh&lt;/a&gt; | bash&lt;/p&gt;

&lt;h1&gt;
  
  
  or Windows
&lt;/h1&gt;

&lt;p&gt;$s = irm &lt;a href="https://ragleap.com/install.ps1" rel="noopener noreferrer"&gt;https://ragleap.com/install.ps1&lt;/a&gt;; iex $s&lt;/p&gt;

&lt;p&gt;18 stars → aiming 20⭐️&lt;/p&gt;

&lt;p&gt;GitHub: github.com/antonyrag/ragleap-core&lt;br&gt;
Website: ragleap.com&lt;/p&gt;

&lt;p&gt;Building in public&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>docker</category>
      <category>showdev</category>
    </item>
    <item>
      <title>ragleap-agents v0.1.0: A Fail-Closed Act-Observe Loop in 200 Lines</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Sun, 11 Oct 2026 08:03:59 +0000</pubDate>
      <link>https://dev.to/ragleap/ragleap-agents-v010-a-fail-closed-act-observe-loop-in-200-lines-79h</link>
      <guid>https://dev.to/ragleap/ragleap-agents-v010-a-fail-closed-act-observe-loop-in-200-lines-79h</guid>
      <description>&lt;p&gt;I just shipped &lt;code&gt;ragleap-agents v0.1.0&lt;/code&gt;. It's not a framework, it's a guardrail.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;llm&lt;/code&gt; is any &lt;code&gt;callable(prompt) -&amp;gt; str&lt;/code&gt;. No SDK lock-in.&lt;/p&gt;

&lt;h3&gt;
  
  
  The loop
&lt;/h3&gt;

&lt;p&gt;llm -&amp;gt; JSON action -&amp;gt; validate against JSON Schema -&amp;gt; check ToolPolicy -&amp;gt; execute or pause for approval&lt;/p&gt;

&lt;h3&gt;
  
  
  Security model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
ToolPolicy(
  taints=True,      # this tool reads untrusted data
  outbound=True,    # this tool sends data out
  requires_approval=True
)

Rule: After a tainting tool has run, every later outbound tool needs approval.

No policy? Counted as both taints + outbound. Fail closed.

Tool outputs are capped, fenced, tags neutralized case-insensitively.


**

## Pause / Resume
**

StateStore is pluggable. InMemoryStateStore included.

Approve -&amp;gt; sends. Reject -&amp;gt; never sends. Replay -&amp;gt; ResumeError.

**

## Provenance you can check
**

PR #628 merged as d3e0c14, release PR #646 -&amp;gt; tag 0482515
CI 37889921507 success, publish run 37890106262 with trusted publishing.

Wheel: d305238f... Tar: 44cf1267... - identical in logs and PyPI.

41 tests, mutation-checked.

**

## Install
**

pip install ragleap-agents==0.1.0
pip install ragleap-tools==0.4.0  # dependency

This does NOT stop prompt injection. It limits blast radius IF your policies are accurate.

Code: PR #628 in antonyrag/ragleap-core

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
    </item>
    <item>
      <title>RagLeap v0.9.0 — Self-hosted AI Office with sandboxed agents, approval inbox, and pluggable embeddings</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Thu, 08 Oct 2026 12:56:27 +0000</pubDate>
      <link>https://dev.to/ragleap/ragleap-v090-self-hosted-ai-office-with-sandboxed-agents-approval-inbox-and-pluggable-1fjg</link>
      <guid>https://dev.to/ragleap/ragleap-v090-self-hosted-ai-office-with-sandboxed-agents-approval-inbox-and-pluggable-1fjg</guid>
      <description>&lt;p&gt;RagLeap is an open-source AI-employee platform. v0.9.0 ships the AI Office.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard at /office&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ragleap&lt;/code&gt; CLI: launch, stop, status, logs, update (with DB backup), key&lt;/li&gt;
&lt;li&gt;Pluggable embeddings (Ollama, OpenAI, Mistral, Gemini) + vector size check&lt;/li&gt;
&lt;li&gt;Agent loop: act-observe, sandboxed exec, MCP client, cron triggers&lt;/li&gt;
&lt;li&gt;Approval system: off/semi/full, taint after web fetch, network-less sandbox&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How settings work now
&lt;/h3&gt;

&lt;p&gt;Settings page &amp;gt; .env. UI shows source of each value. Keys are encrypted at rest, write-only in UI. Test connection button included.&lt;/p&gt;

&lt;h3&gt;
  
  
  Safety by default
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API-key auth on all data routes, no stack traces to client&lt;/li&gt;
&lt;li&gt;SSRF-safe fetch, sandbox has no network&lt;/li&gt;
&lt;li&gt;Approval inbox for all tool calls in semi/full mode&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;

&lt;p&gt;curl -fsSL ... | bash&lt;/p&gt;

&lt;h1&gt;
  
  
  or
&lt;/h1&gt;

&lt;p&gt;pip install ragleap-core&lt;br&gt;
ragleap launch&lt;/p&gt;

&lt;p&gt;Open PRs and issues welcome. I need clean-machine testers for installer.&lt;/p&gt;

&lt;p&gt;Repo: github.com/antonyrag/ragleap-core&lt;br&gt;
Release: v0.9.0 - f11d458&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>We Shipped ragleap-terraform v0.1.0: How a Solo Dev is Building DevOps for ANY Software — Live-Verified, Not Hype</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Tue, 06 Oct 2026 06:42:49 +0000</pubDate>
      <link>https://dev.to/ragleap/we-shipped-ragleap-terraform-v010-how-a-solo-dev-is-building-devops-for-any-software--2ljh</link>
      <guid>https://dev.to/ragleap/we-shipped-ragleap-terraform-v010-how-a-solo-dev-is-building-devops-for-any-software--2ljh</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fprvl3qxz11ip8a0ke2lh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fprvl3qxz11ip8a0ke2lh.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  We Shipped ragleap-terraform v0.1.0: How a Solo Dev is Building DevOps for ANY Software
&lt;/h1&gt;

&lt;p&gt;I shipped &lt;code&gt;ragleap-terraform v0.1.0&lt;/code&gt; 8 hours ago. It's our 9th library. And it changes what RagLeap is.&lt;/p&gt;

&lt;p&gt;RagLeap started as RAG. Now it's &lt;strong&gt;DevOps for ANY software&lt;/strong&gt;. Here's the honest breakdown — what's live-verified, what's next, and what we won't claim.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New:&lt;/strong&gt; &lt;code&gt;ragleap-terraform&lt;/code&gt; 0.1.0 — kind cluster + full observability stack via Terraform, verified on a real Docker host&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Done:&lt;/strong&gt; 4 infra libs — ops, app-chart, observability, terraform — all live-verified&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Philosophy:&lt;/strong&gt; "enterprise-grade foundations, live-verified" — NOT "proven at global scale". One node, single-fault tests. We ship truth.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🚀 The Latest: ragleap-terraform v0.1.0
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;br&gt;
A Terraform module that creates a local kind cluster and installs &lt;code&gt;ragleap-observability&lt;/code&gt; with &lt;code&gt;helm_release&lt;/code&gt;.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
hcl
module "kind-cluster" {
  source = "your-registry/ragleap-terraform"
  cluster_name = "ragleap-dev"
  grafana_admin_password = var.grafana_password
}


**Variables:** cluster_name, namespace, install_observability, observability_chart_path, grafana_admin_password, install_postgres_exporter (default false), helm_timeout, kubeconfig_path

**What's inside:** examples/kind ships inside the wheel. pip install ragleap-terraform and you have it.


**Verified — Not Mocked:**

Applied and destroyed on a real Docker Desktop host with Terraform 1.9.8. All chart pods Ready. Your kubectl context untouched. This is why I say "live-verified".

**Known Limitations (honest):**

Local kind only. No AWS/GCP/Azure modules yet — those need a real cloud account to verify, not just code.

postgres-exporter off by default — needs ragleap-ops and a Secret no chart creates yet.

State and kubeconfig hold credentials in plain text. Do not interrupt apply/destroy.

This is v0.1.0 for a reason. It works, it's verified, and we're transparent about gaps.

**

## ✅ What's Done &amp;amp; Live-Verified So Far
**

**1. ragleap-ops 0.4.1**

Helm chart, SecurityContext, read-only root filesystem (not neo4j), zero-permission ServiceAccounts, NetworkPolicies, Ingress + TLS, multi-env values, Postgres and neo4j backup/restore with RTO, runbooks drilled against broken clusters.

This wasn't helm install and hope. We broke clusters on purpose and drilled restore.

**2. ragleap-app-chart 0.2.1**

Generic Helm chart for any developer's services. If you have a service, this deploys it with the same security standards as ragleap-ops. This is the "ANY software" part.

**3. ragleap-observability 0.6.0**

Prometheus v3, Grafana 12, Loki 3.6, Promtail, AlertManager, Slack and email receivers (delivery proven against a stand-in), pods-only RBAC, configurable Grafana password, Trivy scans of all images.

We started at 383 findings. Down to 14 on four images. postgres-exporter still at 48, Promtail at 86 — next bump cycle will fix.

**4. Release Process**

PyPI keywords, TestPyPI → PyPI, tags, GitHub Releases, docs surfaces. Boring but critical.

**

## 🔜 What's Next — Ordered by Level
**

I organize everything by solo → team → corporate. You only need what you need.

#**## SOLO DEVELOPER (Next 2 weeks):**

* Finish Loki retention → ship 0.6.1
* Real Slack/email send — right now only stand-in is proven
* Automate postgres-exporter Secret + DB role — no chart does it today, it's manual
* ragleap-ansible for VPS bootstrap (never started)
* Image bumps

**

## TEAM (Next month — needs your sign-off):
**

* HPA and PodDisruptionBudgets in ragleap-ops + app-chart
* Helm chart testing in CI (ct) + scheduled Trivy job — both edit CI files
* GitOps (ArgoCD or Flux) — this is the blocker for canary and blue-green
* SLO and SLI dashboards
* ServiceAccounts, RBAC and PDBs for app-chart


**

## CORPORATE (Later — needs cloud accounts &amp;amp; audits):
**

* Cloud Terraform modules (AWS, GCP, Azure) — they'd be unverified without an account, so I won't fake it
* Multi-AZ, multi-node, cluster autoscaling (blocked — kind is one node)
* Ingress rate limiting + WAF, audit logging, image SBOM + provenance
* Tracing, SSO for Grafana, chaos testing
* Compliance (SOC 2) — needs external audit, not just engineering



## Suggested Order:

Loki retention → 0.6.1 → HPA/PDB → Ansible → Trivy/ct in CI → GitOps

**

## 🎯 The Honest Claim
**

This is important. Even with every item done, the accurate claim is:

**

## "enterprise-grade foundations, live-verified"
**

It is NOT "proven at global scale". Everything has run on one node, with single-fault tests.

I'm a solo dev building in public from Chennai. I won't claim what I haven't tested. Many startups claim "enterprise-ready" after one Helm chart. I drilled backup/restore against broken clusters before claiming RTO.

**

## 📦 Where We Are
**

46 AI Employees — modular RAG &amp;amp; self-thinking intelligent agents
9 Libraries — 8 Python + 1 Java
45k+ Downloads
MIT Licensed, Self-Hosted, BYOK — 17 LLMs + Ollama local
45+ Vector DBs


Links:

Core: github.com/antonyrag/ragleap-core (17 stars, help us reach 50?)
Docs: docs.ragleap.com
Packages: packages.ragleap.com
PyPI: pypi.org/project/ragleap-terraform

If you want DevOps that doesn't hide behind marketing, try:

pip install ragleap-terraform

Feedback welcome. Issues welcome. Stars appreciated.

Building in public. Shipping truth.

— Antony
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>terraform</category>
    </item>
    <item>
      <title>I benchmarked 4 vector DBs with identical vectors — retrieval was identical, scores were not</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Mon, 05 Oct 2026 03:40:24 +0000</pubDate>
      <link>https://dev.to/ragleap/i-benchmarked-4-vector-dbs-with-identical-vectors-retrieval-was-identical-scores-were-not-5hlo</link>
      <guid>https://dev.to/ragleap/i-benchmarked-4-vector-dbs-with-identical-vectors-retrieval-was-identical-scores-were-not-5hlo</guid>
      <description>&lt;p&gt;A comment on my last release: backend portability only matters if retrieval quality stays comparable. Fair.&lt;/p&gt;

&lt;p&gt;So I built ragleap-rag/benchmark.&lt;/p&gt;

&lt;p&gt;TL;DR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;296 SQuAD paragraphs, 60 questions, same vectors in pgvector, FAISS, Qdrant, Weaviate vs exact float64 scan&lt;/li&gt;
&lt;li&gt;overlap@10 = 1.000 on all four&lt;/li&gt;
&lt;li&gt;Found 5 bugs: score scale mismatch + 3 edge cases&lt;/li&gt;
&lt;li&gt;Fixed in v0.11.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How I ran it:&lt;/p&gt;

&lt;p&gt;cd java/ragleap-rag&lt;br&gt;
./benchmark/run.sh # starts pgvector (docker), FAISS in-mem, Qdrant, Weaviate&lt;/p&gt;

&lt;h1&gt;
  
  
  generates benchmark/RESULTS.md + results.csv
&lt;/h1&gt;

&lt;p&gt;Core logic:&lt;/p&gt;

&lt;p&gt;var groundTruth = exactScan.query(queryVector, 10);&lt;br&gt;
for (var backend : List.of(pgvector, faiss, qdrant, weaviate)) {&lt;br&gt;
    var results = backend.query(queryVector, 10);&lt;br&gt;
    double overlap = overlapAtK(groundTruth, results, 10);&lt;br&gt;
    double scoreDev = meanAbs(results.scores - (cosine+1)/2);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;The bug that matters:&lt;/p&gt;

&lt;p&gt;FAISS IndexFlatIP returns inner product = cosine if normalized. Weaviate returns cosine distance. Both in [-1,1].&lt;/p&gt;

&lt;p&gt;But my abstraction promised [0,1]. Threshold-based filtering broke silently.&lt;/p&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;// In FaissStore &amp;amp; WeaviateStore&lt;br&gt;
return (rawScore + 1.0) * 0.5;&lt;/p&gt;

&lt;p&gt;Now deviation: 0.17561 -&amp;gt; 0.00003&lt;/p&gt;

&lt;p&gt;Other 3 bugs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;insert([0.1, 0.2]) into dim=768 store — should throw IllegalArgumentException&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;search() on empty Weaviate collection — should return [], not 500&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Failed batch write left ragleap_docs row without vectors&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Added 19-case matrix in FailureModeTest.java.&lt;/p&gt;

&lt;p&gt;What's next?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Milvus/Pinecone via Testcontainers if I get CI keys&lt;/li&gt;
&lt;li&gt;100K Wikipedia scale test for recall@10 vs efSearch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/antonyrag/ragleap-core" rel="noopener noreferrer"&gt;https://github.com/antonyrag/ragleap-core&lt;/a&gt;&lt;br&gt;
Results: java/ragleap-rag/benchmark/RESULTS.md&lt;br&gt;
Maven: io.github.antonyrag:ragleap-rag:0.11.0&lt;/p&gt;

&lt;p&gt;If you use vector DB abstraction, test your score normalization. Overlap is easy, scores lie.&lt;/p&gt;

</description>
      <category>java</category>
      <category>vectordatabase</category>
      <category>opensource</category>
      <category>rag</category>
    </item>
    <item>
      <title>RagLeap Triple Release: Fixing Fresh Install Breakage, Adding Slack Alerts &amp; GitHub Search</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Fri, 02 Oct 2026 12:54:32 +0000</pubDate>
      <link>https://dev.to/ragleap/ragleap-triple-release-fixing-fresh-install-breakage-adding-slack-alerts-github-search-31m4</link>
      <guid>https://dev.to/ragleap/ragleap-triple-release-fixing-fresh-install-breakage-adding-slack-alerts-github-search-31m4</guid>
      <description>&lt;p&gt;Shipped 3 packages yesterday/today. Here's the technical breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  ragleap-rag v0.12.10
&lt;/h2&gt;

&lt;p&gt;Stack trace:&lt;/p&gt;

&lt;p&gt;ModuleNotFoundError: No module named 'lxml.html.clean'&lt;/p&gt;

&lt;p&gt;Root cause: lxml moved clean to lxml_html_clean==0.4.0.&lt;/p&gt;

&lt;p&gt;Fix in pyproject.toml:&lt;/p&gt;

&lt;p&gt;[project.optional-dependencies]&lt;br&gt;
web = ["trafilatura&amp;gt;=2.2.0", "lxml_html_clean&amp;gt;=0.4.0"]&lt;br&gt;
formats = ["pandas&amp;gt;=2.2.2", "pyarrow&amp;gt;=14.0.0", "xlwt&amp;gt;=1.3.0"]&lt;br&gt;
all = ["ragleap-rag[web,formats,qdrant,weaviate,pinecone,milvus]"]&lt;/p&gt;

&lt;p&gt;Problem 2: _extract_parquet calls Table.to_pandas() — needs pandas, but wasn't in extras.&lt;/p&gt;

&lt;p&gt;Now raises proper ValueError with install hint if missing.&lt;/p&gt;

&lt;p&gt;CI Fix: Before → pip install.[test] only → 63 tests skipped.&lt;br&gt;
Now → pip install.[formats][web][qdrant][weaviate][pinecone][milvus][test] → 308 passed.&lt;/p&gt;

&lt;p&gt;Guard test:&lt;/p&gt;

&lt;p&gt;def test_all_extras_installed_in_ci():&lt;br&gt;
    if os.getenv("CI") == "true":&lt;br&gt;
        import qdrant_client, weaviate, pinecone, milvus&lt;/p&gt;

&lt;h2&gt;
  
  
  ragleap-observability v0.4.0
&lt;/h2&gt;

&lt;p&gt;Helm values:&lt;/p&gt;

&lt;p&gt;alertmanager:&lt;br&gt;
  receivers:&lt;br&gt;
    slack:&lt;br&gt;
      enabled: true&lt;br&gt;
      api_url_file: /etc/alertmanager/secrets/slack_api_url&lt;br&gt;
    email:&lt;br&gt;
      enabled: true&lt;br&gt;
      smtp_auth_password_file: /etc/alertmanager/secrets/email_password&lt;/p&gt;

&lt;p&gt;Secret mount is read-only. Tested with prom/alertmanager:v0.27.0 image + amtool check-config.&lt;/p&gt;

&lt;h2&gt;
  
  
  ragleap-tools v0.3.0
&lt;/h2&gt;

&lt;p&gt;Zero-dep GitHub search:&lt;/p&gt;

&lt;p&gt;class GitHubSearchConfig(BaseModel):&lt;br&gt;
    token: Optional[str] = None&lt;br&gt;
    num_results: int = 10 # clamped 1-20&lt;/p&gt;

&lt;p&gt;def make_github_search_tool(config: GitHubSearchConfig):&lt;br&gt;
    # uses urllib.request, sets User-Agent: ragleap-tools/0.3.0&lt;br&gt;
    # handles 422 gracefully -&amp;gt; success=False&lt;/p&gt;

&lt;p&gt;Live test without token:&lt;/p&gt;

&lt;p&gt;GET &lt;a href="https://api.github.com/search/repositories?q=rag" rel="noopener noreferrer"&gt;https://api.github.com/search/repositories?q=rag&lt;/a&gt;&lt;br&gt;
Rate limit: search=10, core=60 (docstring fix pending)&lt;/p&gt;

&lt;p&gt;Install all 3:&lt;/p&gt;

&lt;p&gt;pip install ragleap-rag==0.12.10 ragleap-observability==0.4.0 ragleap-tools==0.3.0&lt;/p&gt;

&lt;p&gt;Repo: github.com/antonyrag/ragleap-core — star if useful ⭐&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
    <item>
      <title>v0.7.5 — Maintenance Snapshot: 5 Packages, 477 Tests Green</title>
      <dc:creator>RagLeap</dc:creator>
      <pubDate>Tue, 29 Sep 2026 06:45:56 +0000</pubDate>
      <link>https://dev.to/ragleap/v075-maintenance-snapshot-5-packages-477-tests-green-h2o</link>
      <guid>https://dev.to/ragleap/v075-maintenance-snapshot-5-packages-477-tests-green-h2o</guid>
      <description>&lt;p&gt;No core changes in this one — but if you maintain a monorepo, you know this is the important release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v0.7.5 is a snapshot since v0.7.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use only &lt;code&gt;ragleap-core&lt;/code&gt;, stay on v0.7.0. This is for monorepo users.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's bundled:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. ragleap-observability v0.3.0&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AlertManager + first real alert rule — verified with &lt;code&gt;curl /api/v1/rules&lt;/code&gt; = &lt;code&gt;ok&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Prometheus fix: &lt;code&gt;strategy: Recreate&lt;/code&gt; to avoid PVC crash-loop&lt;/li&gt;
&lt;li&gt;Loki Deployment + Grafana datasource wiring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. ragleap-tools v0.2.0&lt;/strong&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
from ragleap_tools import search_web
# BYOK - plug your own provider
result = search_web("ragleap observability", provider="tavily")




**

## 3. ragleap-rag
**

ingest(metadata={"source": "docs"}) — now supported
Fix: QdrantBackend cosine score normalization
Fix: WeaviateBackend custom port + named-vector search

## **4. Java Port v0.10.0**

+4 backends: Qdrant, Weaviate (live-verified), Milvus, Pinecone

## **5. Housekeeping**

clone-count badge automation (real traction &amp;gt; stars)
SBOM regenerated for compliance
477 tests passing

Why we care about SBOM + badges? Enterprise adoption needs it.

Repo: github.com/antonyrag/ragleap-core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>opensource</category>
      <category>observability</category>
      <category>devops</category>
      <category>python</category>
    </item>
  </channel>
</rss>
