<?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: Hashevolution</title>
    <description>The latest articles on DEV Community by Hashevolution (@hashevolution).</description>
    <link>https://dev.to/hashevolution</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3926644%2Ff977d90a-7772-4986-81c2-143af88dd6ac.png</url>
      <title>DEV Community: Hashevolution</title>
      <link>https://dev.to/hashevolution</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hashevolution"/>
    <language>en</language>
    <item>
      <title>Building a Mini Palantir: A Local Graph-RAG Engine with Ontology, Security, and Self-Evolution (Alpha)</title>
      <dc:creator>Hashevolution</dc:creator>
      <pubDate>Tue, 12 May 2026 08:27:36 +0000</pubDate>
      <link>https://dev.to/hashevolution/building-a-mini-palantir-a-local-graph-rag-engine-with-ontology-security-and-self-evolution-1914</link>
      <guid>https://dev.to/hashevolution/building-a-mini-palantir-a-local-graph-rag-engine-with-ontology-security-and-self-evolution-1914</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/Hashevolution/James-RAG-Evol" rel="noopener noreferrer"&gt;PROJECT JAMES&lt;/a&gt; is a security-focused, locally-runnable Graph-RAG knowledge engine in Python. It combines an explicit 12-type ontology, 3-stage access control (RBAC + ABAC + instruction isolation), a self-evolution scaffold with audit log, and 100% local execution via Ollama. MIT-licensed, alpha v0.2.0, &lt;a href="https://www.bestpractices.dev/projects/12806" rel="noopener noreferrer"&gt;OpenSSF Best Practices passing&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;If you've ever wanted to point a local LLM at your own wiki, codebase, or document store, you've probably hit the same three walls I did:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cloud RAG services&lt;/strong&gt; want everything in their cloud — fine for prototypes, painful for anything sensitive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted RAG frameworks&lt;/strong&gt; are usually one of: (a) too much infrastructure (Kubernetes-shaped), or (b) too few security primitives (no role separation, no audit trail).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most Graph-RAG implementations&lt;/strong&gt; treat the graph as a side feature on top of vectors. The graph rarely &lt;em&gt;participates&lt;/em&gt; in the security boundary or the reasoning path.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I wanted something closer to &lt;strong&gt;Palantir Foundry's mental model&lt;/strong&gt; — an explicit ontology, capability-token security, a full audit log — but compressed into something one person can run on a laptop, under MIT, without a cloud account.&lt;/p&gt;

&lt;p&gt;That's what PROJECT JAMES is.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Palantir® is a registered trademark of Palantir Technologies Inc. PROJECT JAMES is not affiliated with or endorsed by Palantir. "Mini Palantir" here is a descriptive comparison of the ontology-and-audit-log design pattern, not a product claim.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's in the box
&lt;/h2&gt;

&lt;p&gt;Five things that rarely show up in the same Python repo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Graph-RAG with ontology&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12 relation types; relations carry semantic meaning beyond vector similarity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3-stage security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RBAC + ABAC + Instruction Isolation, applied at vector → graph → output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Self-evolution scaffold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;feedback signals → patch proposals → 4-Gate validation → auto-rollback on bench regression, all with &lt;code&gt;approver_username&lt;/code&gt; audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100% local&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ollama-based, no cloud LLM dependency. Gemma &lt;code&gt;gemma2:2b&lt;/code&gt; works on a laptop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Explicit reasoning paths&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every response surfaces the traversed graph paths so you can see &lt;em&gt;why&lt;/em&gt; it answered that way&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Architecture at a glance
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[User query]
     ↓
[Security filter]      ← 31+ injection patterns + risky-coding hard-refuse
     ↓
[Query router]         ← chat / coding / retrieval / web_search
     ↓
[Hybrid search]        ← Vector(60%) + BM25(20%) + keyword(10%) + name(10%)
     ↓
[Graph engine]         ← DFS traversal + confidence pruning + sensitivity gating
     ↓
[Reasoning loop]       ← retrieve → expand → verify
     ↓
[Output filter]        ← PII masking + role-based content filter
     ↓
[Answer + reasoning path]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The graph is not a side index. Every retrieval that reaches the graph engine is gated by the user's role, the entity's sensitivity, and the ontology relation type. Removing the graph would break the security model — they're the same pipeline, not two pipelines glued together.&lt;/p&gt;

&lt;h2&gt;
  
  
  A typical query lifecycle
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Pseudocode for what happens behind /query/
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. Pre-check: 31+ injection patterns, risky-coding hard-refuse
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;security_layer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pre_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;BLOCK&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RESPONSE_BLOCKED&lt;/span&gt;  &lt;span class="c1"&gt;# byte-identical block message
&lt;/span&gt;
    &lt;span class="c1"&gt;# 2. Hybrid retrieval — vector + BM25 + keyword + name match
&lt;/span&gt;    &lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hybrid_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. Graph expansion — only visit entities the user can read
&lt;/span&gt;    &lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;graph_engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;seed_entities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;# RBAC
&lt;/span&gt;        &lt;span class="n"&gt;sensitivity_ceiling&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# ABAC
&lt;/span&gt;        &lt;span class="n"&gt;max_depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 4. Reason over retrieved context (LLM call via router)
&lt;/span&gt;    &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reasoning_trace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 5. Output filter — PII mask, role-based redact
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;output_filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting part is step 3: &lt;strong&gt;the graph traversal itself is access-controlled&lt;/strong&gt;, not just the final output. A &lt;code&gt;confidential&lt;/code&gt; entity is never even &lt;em&gt;traversed&lt;/em&gt; for an &lt;code&gt;employee&lt;/code&gt; user, so the model never sees it. This means no jailbreak prompt can talk the LLM into leaking content it never had in the context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security in depth
&lt;/h2&gt;

&lt;p&gt;A few specific behaviors worth calling out:&lt;/p&gt;

&lt;h3&gt;
  
  
  Hard-refuse for destructive commands
&lt;/h3&gt;

&lt;p&gt;Queries that ask the model to produce filesystem-wide deletion, SQL &lt;code&gt;DROP DATABASE&lt;/code&gt;, &lt;code&gt;git reset --hard&lt;/code&gt;, etc. trigger a &lt;strong&gt;byte-identical block message&lt;/strong&gt; &lt;em&gt;before&lt;/em&gt; the LLM is ever called. The block message is the same string as the prompt-injection block, so an audit consumer cannot distinguish the two externally.&lt;/p&gt;

&lt;p&gt;Patterns live in &lt;code&gt;core/security_layer.py::RISKY_CODING_REGEX&lt;/code&gt;. Korean scope markers (&lt;code&gt;전체&lt;/code&gt;, &lt;code&gt;모든&lt;/code&gt;) are recognized too.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bcrypt password storage with transparent migration
&lt;/h3&gt;

&lt;p&gt;Passwords are stored as &lt;code&gt;bcrypt$&amp;lt;hash&amp;gt;&lt;/code&gt;. Pre-bcrypt SHA-256 hex digests from older deployments are accepted on input only and &lt;strong&gt;rewritten to bcrypt on the next successful login&lt;/strong&gt; — no manual migration needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audit log everywhere
&lt;/h3&gt;

&lt;p&gt;Every approved self-evolution patch is recorded with &lt;code&gt;approver_username&lt;/code&gt;, &lt;code&gt;approver_role&lt;/code&gt;, &lt;code&gt;approved_at&lt;/code&gt;, and &lt;code&gt;approval_method&lt;/code&gt; in the patch lifecycle JSONL. There is no auto-deploy path that bypasses this — if you bypass it, your fork stops being JAMES.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-evolution scaffold
&lt;/h2&gt;

&lt;p&gt;This is the part that scares people most when I describe it, so let me be precise about what it does and doesn't do:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collects feedback signals from &lt;code&gt;/query/&lt;/code&gt; responses (thumbs-up/down, latency, hallucination flags)&lt;/li&gt;
&lt;li&gt;Generates a candidate patch proposal (LLM-assisted)&lt;/li&gt;
&lt;li&gt;Validates it through a 4-Gate pipeline:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gate 1&lt;/strong&gt;: Syntactic — parses, imports, no obvious explosions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gate 2&lt;/strong&gt;: Test suite — existing tests still pass&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gate 3&lt;/strong&gt;: Bench eval — STEP 7 regression suite stays within tolerance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gate 4&lt;/strong&gt;: Human approval — &lt;code&gt;approver_username&lt;/code&gt; required&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Applies the patch with a known-good backup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-rollback&lt;/strong&gt; if Gate 3 detects a post-deploy regression&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What it does NOT do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It does not auto-deploy without &lt;code&gt;approver_username&lt;/code&gt;. If you set &lt;code&gt;JAMES_AUTO_APPROVE=1&lt;/code&gt;, the server refuses to start unless &lt;code&gt;JAMES_DEV_MODE=1&lt;/code&gt; is also set.&lt;/li&gt;
&lt;li&gt;It does not modify trust boundaries (auth, policy, sandbox) without an explicit &lt;code&gt;architecture&lt;/code&gt; PR label.&lt;/li&gt;
&lt;li&gt;It does not touch security-critical files inside &lt;code&gt;core/security_layer.py&lt;/code&gt; or &lt;code&gt;core/policy_engine.py&lt;/code&gt; automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default deployment ships with &lt;code&gt;JAMES_ENABLE_EVOLUTION=0&lt;/code&gt;. You have to opt in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's NOT — honest limitations
&lt;/h2&gt;

&lt;p&gt;PROJECT JAMES is alpha. Here's what doesn't work yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-data validation is the v0.2 → v0.3 gate.&lt;/strong&gt; The internal STEP 7 suite passes (13 queries, security-block invariants, graph-paths bands), but the next gate is &lt;em&gt;a second user running the bench end-to-end on their own corpus&lt;/em&gt;. That's a recruitment problem, not a coding problem, and I'm honest about it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal retrieval is v0.3.&lt;/strong&gt; Video-ASR (Whisper) and image OCR (Tesseract, EasyOCR) are wired and work as ingestion paths, but multimodal retrieval as a first-class graph citizen is the next milestone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-evolution is verified single-user.&lt;/strong&gt; It works on my machine. It has not been adversarially probed by a second user yet. Don't enable it in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin API is v0.3.&lt;/strong&gt; Domain packs (legal, food, retail, travel) are deliberately blocked until v1.0 — see &lt;code&gt;docs/PLATFORM_READINESS.md&lt;/code&gt; for the gate definitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trust signals
&lt;/h2&gt;

&lt;p&gt;External validation that matters more than my self-assessment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.bestpractices.dev/projects/12806" rel="noopener noreferrer"&gt;OpenSSF Best Practices passing badge&lt;/a&gt;&lt;/strong&gt; (Tiered 111%, awarded 2026-05-11)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7 published GitHub Releases&lt;/strong&gt; through v0.2.0 (Foundation Hardening)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static analysis&lt;/strong&gt; — ruff F-class rules (F821 + F541 + F401 + F841) enforced on every PR via GitHub Actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security tests&lt;/strong&gt; — 83-item adversarial regression suite (&lt;code&gt;james_security_test.py&lt;/code&gt;) covering injection, path traversal, prompt injection, unsafe deserialization; 17-item password regression suite (&lt;code&gt;tests/test_password_bcrypt.py&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vulnerability disclosure&lt;/strong&gt; — GitHub Private Vulnerability Reporting enabled; backup channel documented in &lt;code&gt;SECURITY.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIT-licensed&lt;/strong&gt;, with &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; test-policy gate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Hashevolution/James-RAG-Evol
&lt;span class="nb"&gt;cd &lt;/span&gt;James-RAG-Evol

&lt;span class="c"&gt;# Configure&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# Edit .env — set JAMES_API_KEY, JAMES_JWT_SECRET (32-char random)&lt;/span&gt;

&lt;span class="c"&gt;# Install (Python 3.11+)&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Pull a model&lt;/span&gt;
ollama pull gemma2:2b   &lt;span class="c"&gt;# 1.6 GB, runs on a laptop&lt;/span&gt;

&lt;span class="c"&gt;# Start&lt;/span&gt;
python server_llmwiki.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is going
&lt;/h2&gt;

&lt;p&gt;Short-term roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v0.2.1&lt;/strong&gt;: Recruitment for the second-user real-data validation gate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v0.3.0&lt;/strong&gt;: Plugin API skeleton — &lt;code&gt;core/plugins/base.py&lt;/code&gt; with 4 plugin interfaces, &lt;code&gt;JAMES_PLUGINS&lt;/code&gt; loader, &lt;code&gt;packs/general/&lt;/code&gt; dogfood, multi-instance &lt;code&gt;JAMES_WORKSPACE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1.0&lt;/strong&gt;: Production hardening + first domain packs (legal, retail, etc. only after this gate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bigger frame is in &lt;code&gt;docs/PLATFORM_READINESS.md&lt;/code&gt;: PROJECT JAMES is a &lt;em&gt;mother platform&lt;/em&gt; until v1.0. Domain forks happen after, not before. That's the discipline of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback welcome
&lt;/h2&gt;

&lt;p&gt;I'm specifically looking for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Adversarial review of the security model&lt;/strong&gt; — the boundary, the audit log, the hard-refuse policy. If you can break the role separation, please open a private advisory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A second-user corpus&lt;/strong&gt;. If you've got a wiki/document store you can point this at and run &lt;code&gt;scripts/bench.py --suite=step7 --check&lt;/code&gt; on, I want to know what breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critiques of the self-evolution scaffold&lt;/strong&gt; — particularly whether the 4-Gate is &lt;em&gt;enough&lt;/em&gt; gating, or whether it needs another stage before Gate 4.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Hashevolution/James-RAG-Evol" rel="noopener noreferrer"&gt;https://github.com/Hashevolution/James-RAG-Evol&lt;/a&gt;&lt;br&gt;
Discussions: GitHub Issues&lt;br&gt;
Security: GitHub Private Vulnerability Reporting (preferred), &lt;code&gt;karu-7@hanmail.net&lt;/code&gt; (backup)&lt;/p&gt;

&lt;p&gt;If you build something on top of it, I'd love to hear about it.&lt;/p&gt;




&lt;p&gt;🤖 Honest disclosure: this article was drafted with AI assistance and edited by the author. The codebase, design decisions, and limitations described here are real and verifiable&lt;/p&gt;

</description>
      <category>rag</category>
      <category>llm</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
