<?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: Codecora Dev</title>
    <description>The latest articles on DEV Community by Codecora Dev (codecoradev).</description>
    <link>https://dev.to/codecoradev</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%2Forganization%2Fprofile_image%2F14152%2Fd599ab4d-f64a-4d87-a636-f4a3643c645d.png</url>
      <title>DEV Community: Codecora Dev</title>
      <link>https://dev.to/codecoradev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codecoradev"/>
    <language>en</language>
    <item>
      <title>Uteke 0.18: memory that knows when</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Tue, 15 Sep 2026 02:31:12 +0000</pubDate>
      <link>https://dev.to/codecoradev/uteke-018-memory-that-knows-when-ooa</link>
      <guid>https://dev.to/codecoradev/uteke-018-memory-that-knows-when-ooa</guid>
      <description>&lt;p&gt;&lt;strong&gt;Uteke 0.18.0 lets a memory carry the date it was true, gives rooms a real lifecycle, and fixes a recall default that silently filtered almost every result.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uteke 0.18.0 shipped on September 14, 2026. Uteke is a local-first memory engine for AI agents: a single Rust binary, no API keys, no cloud, Apache 2.0. It has 246 stars on GitHub as of this writing. The theme of this release is plumbing you can operate: when a memory was true, where it lives, and what a recall call owes you back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: every memory borrows the clock it arrived on
&lt;/h2&gt;

&lt;p&gt;Until 0.18, a memory's timestamp was the moment it entered the store. That sounds fine until you import a month of notes in one batch, or migrate from another tool, or write down today a decision that was made in March. Time-travel recall (&lt;code&gt;recall --at&lt;/code&gt;), recency boosts, and audit chains all read that ingest time, so a backfilled import looked brand new and an old decision looked older than it was. Import order quietly became part of your recall results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Date anchors: write down when it was true
&lt;/h2&gt;

&lt;p&gt;The headline feature is an explicit timestamp at write time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uteke remember &lt;span class="s2"&gt;"Ship window moved to March 15"&lt;/span&gt; &lt;span class="nt"&gt;--timestamp&lt;/span&gt; &lt;span class="s2"&gt;"2026-03-15T09:00:00Z"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same field exists on batch import, so a folder of backfilled notes can carry its real dates in one pass. Time-travel recall, temporal boosts, and audit chains now read the anchor instead of the ingest clock. A memory written today about March behaves like a memory from March, wherever it lands in your import queue.&lt;/p&gt;

&lt;p&gt;One honesty note: the &lt;code&gt;LMEVAL_DATE_ANCHOR&lt;/code&gt; environment variable mentioned in the changelog is benchmark-harness-only. It never affects the binary you run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rooms grow up: rename, update, move
&lt;/h2&gt;

&lt;p&gt;Rooms, Uteke's per-project memory partitions, now have lifecycle operations on every surface: &lt;code&gt;uteke room rename&lt;/code&gt;, &lt;code&gt;uteke room update&lt;/code&gt;, and &lt;code&gt;uteke room move-memory&lt;/code&gt;, with matching HTTP routes (&lt;code&gt;POST /room/rename&lt;/code&gt;, &lt;code&gt;/room/update&lt;/code&gt;, &lt;code&gt;/room/memory/move&lt;/code&gt;) and MCP tools. A rename rewrites the registry and every room reference in a single transaction, so a half-renamed state is impossible. Rooms can also carry a description now (schema v19, additive, backward-compatible exports).&lt;/p&gt;

&lt;p&gt;For individual memories there is &lt;code&gt;uteke update &amp;lt;id&amp;gt;&lt;/code&gt;: edit content, tags, importance, pinned state, or type in place. The HTTP &lt;code&gt;PUT /memory&lt;/code&gt; route and the MCP &lt;code&gt;uteke_update&lt;/code&gt; tool could always do this. The CLI could not. Now it can.&lt;/p&gt;

&lt;h2&gt;
  
  
  The default threshold that filtered almost everything
&lt;/h2&gt;

&lt;p&gt;This is the fix worth explaining in full. Since 0.16.0, the default recall strategy has been fusion (weighted RRF), and its scores are rank-based: an RRF contribution plus salience and recency boosts, typically between 0.0 and 0.2. The CLI's default &lt;code&gt;min_score&lt;/code&gt; was still 0.3, a value from the cosine era, when scores clustered above 0.5. HTTP and MCP already defaulted to 0.0.&lt;/p&gt;

&lt;p&gt;The result: a fresh install running plain &lt;code&gt;uteke recall&lt;/code&gt; got empty output. We measured it on the embeddinggemma-q4 embedder. All 20 paraphrase probes scored between 0.169 and 0.186 at rank 1, and every one fell below a threshold built for a different scoring scale.&lt;/p&gt;

&lt;p&gt;0.18 lowers the default to 0.0, and the docs now state the score scale per strategy. Thresholds still exist for people who want them: &lt;code&gt;[recall] min_score&lt;/code&gt; in config, &lt;code&gt;--min&lt;/code&gt; on the CLI, &lt;code&gt;--strict&lt;/code&gt; (0.5), or &lt;code&gt;min_score&lt;/code&gt; over HTTP. The tool should filter when you ask it to, not as a side effect of history.&lt;/p&gt;

&lt;h2&gt;
  
  
  A contract for recall payloads
&lt;/h2&gt;

&lt;p&gt;Version 0.18 also pins the recall payload contract with conformance tests across all three surfaces: CLI, HTTP, and MCP. A recall hit carries its full payload, never a hit-count stub. If a future optimization breaks that promise, a test fails instead of a benchmark drifting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks: same numbers, a clearer home
&lt;/h2&gt;

&lt;p&gt;Retrieval behavior is unchanged in 0.18.0. We revalidated at the published config: recall@5 on the non-abstention split is 0.9457, with identical per-question rankings to 0.17.0. What changed is where the numbers live. The &lt;code&gt;benchmarks/&lt;/code&gt; directory is now the single source of truth, with an index in &lt;code&gt;benchmarks/README.md&lt;/code&gt; and committed raw artifacts for LongMemEval. A stale results stub that still carried pre-embedding figures is gone, and a mislabeled baseline is fixed: the 0.854 and 0.885 full-500 figures published in August came from the vector-only run, and the results file now says so on every aggregate row.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;UTEKE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v0.18.0 curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/codecoradev/uteke/main/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Already running Uteke? &lt;code&gt;uteke upgrade&lt;/code&gt; replaces the CLI only. After upgrading, check that &lt;code&gt;uteke&lt;/code&gt;, &lt;code&gt;uteke-serve&lt;/code&gt;, and &lt;code&gt;uteke-mcp&lt;/code&gt; all report 0.18.0, since the server and MCP binaries come from the release bundle.&lt;/p&gt;

&lt;p&gt;Recall could already show its work after &lt;a href="https://blog.codecora.dev/uteke-0-17-explainable-auditable-memory/" rel="noopener noreferrer"&gt;0.17&lt;/a&gt;. Now it can also tell you when, and move where you tell it. Full changelog and release notes: &lt;a href="https://github.com/codecoradev/uteke/releases/tag/v0.18.0" rel="noopener noreferrer"&gt;github.com/codecoradev/uteke&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article is crossposted with &lt;a href="https://blog.codecora.dev/uteke-v018-date-anchors/" rel="noopener noreferrer"&gt;blog.codecora.dev&lt;/a&gt; as the canonical source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Half a Million Tokens of Context Still Needs an Index</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Thu, 10 Sep 2026 02:41:44 +0000</pubDate>
      <link>https://dev.to/codecoradev/half-a-million-tokens-of-context-still-needs-an-index-351</link>
      <guid>https://dev.to/codecoradev/half-a-million-tokens-of-context-still-needs-an-index-351</guid>
      <description>&lt;p&gt;A thread on r/LocalLLaMA ran Qwen 3.8 27B with a 524,000-token context window on two RTX 3090s this week, holding 60 to 88 tokens per second. Two consumer GPUs, half a million tokens of context, one box. Five years ago that sentence would have been science fiction.&lt;/p&gt;

&lt;p&gt;Every milestone like this revives the same argument: long context kills RAG. If the model can read everything, why build an index? The "RAG Is Simpler Than You Think" discussion on Hacker News (515 points, 218 comments, August 26) pulled the debate back to earth. The interesting question was never retrieval versus context. It is which layer should carry which cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What half a million tokens cost per query
&lt;/h2&gt;

&lt;p&gt;Transformer serving is linear in context. Prefill reads the whole prompt, the KV cache keeps keys and values for every token resident in VRAM, and each generated token re-reads all of it. Double the window and you double the memory and the per-token work, on every query, even when the answer needed three paragraphs.&lt;/p&gt;

&lt;p&gt;That is the deal the r/LocalLLaMA setup signed up for. Dual 3090s, one query stream, half a million tokens resident. It works, and it is heavy by design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieval moves the work off the hot path
&lt;/h2&gt;

&lt;p&gt;A retrieval pipeline does the opposite. Build the index once. Per query, fetch the few chunks that matter and read only those. Cost per query scales with what you retrieve, not with what you own.&lt;/p&gt;

&lt;p&gt;That is also why the "simpler than you think" argument landed. For lookup-shaped questions, and most agent workloads are lookup-shaped, a small index plus a small read beats carrying half a million tokens through every turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  The layer nobody budgets for: embedding storage
&lt;/h2&gt;

&lt;p&gt;If retrieval is the plan, the index becomes the artifact you ship, mirror, and back up. The storage math is unforgiving.&lt;/p&gt;

&lt;p&gt;A 768-dimension f32 embedding is 3,072 bytes. A million chunks of corpus is about 3.07 GB before you write a single replica. On a server you shrug. On a phone, a robot, or an offline box, you are suddenly choosing between your index and your photos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codecoradev/vecq" rel="noopener noreferrer"&gt;vecq&lt;/a&gt; is our answer to that layer: training-free scalar quantization (Lloyd-Max centroids, configurable 4/5/6-bit width, default 5-bit) with search built in. Numbers from docs/BENCHMARK.md, measured on real EmbeddingGemma vectors on an aarch64 dev box:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;mode&lt;/th&gt;
&lt;th&gt;bytes/vector&lt;/th&gt;
&lt;th&gt;recall@10&lt;/th&gt;
&lt;th&gt;ms/query&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5-bit (default)&lt;/td&gt;
&lt;td&gt;642&lt;/td&gt;
&lt;td&gt;0.979&lt;/td&gt;
&lt;td&gt;3.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-bit&lt;/td&gt;
&lt;td&gt;514&lt;/td&gt;
&lt;td&gt;0.958&lt;/td&gt;
&lt;td&gt;0.89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-bit + residual&lt;/td&gt;
&lt;td&gt;1,028&lt;/td&gt;
&lt;td&gt;0.984&lt;/td&gt;
&lt;td&gt;1.76&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At the default width, that million-chunk index drops from 3.07 GB to about 642 MB, 4.78x smaller, with recall 1.6 points from full f32. When you need near-perfect first hits, residual mode holds recall@1 at 0.990 and remains the fastest high-recall scan. There is a third lever as well: Matryoshka-trained models such as EmbeddingGemma degrade gracefully when truncated, so you can quantize only the leading 256 dimensions of a 768-dim model before quantization ever starts.&lt;/p&gt;

&lt;p&gt;Build is fast too. A 2k-vector index constructs in 75 ms against 893 ms for HNSW in our benchmark, because there is no graph to build. You quantize, persist a single file, and mmap it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-offs, honestly
&lt;/h2&gt;

&lt;p&gt;vecq is brute force. There is no graph and no navigational approximation, so scan time grows with corpus size while HNSW stays roughly flat. At 2k vectors the 5-bit scan costs 3.21 ms per query against HNSW's 0.23. That gap is architectural, and it is why vecq targets edge, mobile, and single-box indexes instead of billion-vector server fleets. If you are serving a data center, use a server engine.&lt;/p&gt;

&lt;p&gt;Long context genuinely wins some rounds too. One controlled test from a European bank, reported in a March 2026 comparison, put long context 34% more accurate on simple single-document queries. When every query really does need every page of one document, stuffing wins. The failure mode is treating a 524k window as the default container for everything. Cost per query scales with the window you carry, and most workloads are not shaped like that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce the numbers
&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/codecoradev/vecq
&lt;span class="nb"&gt;cd &lt;/span&gt;vecq &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git checkout develop
cargo run &lt;span class="nt"&gt;--release&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; vecq-bench &lt;span class="nt"&gt;--bin&lt;/span&gt; widths   &lt;span class="c"&gt;# full 4/5/6-bit + residual matrix&lt;/span&gt;
cargo run &lt;span class="nt"&gt;--release&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; vecq-bench &lt;span class="nt"&gt;--bin&lt;/span&gt; real     &lt;span class="c"&gt;# recall and latency vs exact cosine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or skip the benchmark and use the crate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo add vecq-core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this is your first pass on vecq, start with &lt;a href="https://blog.codecora.dev/meet-vecq-lean-vector-layer/" rel="noopener noreferrer"&gt;Meet vecq, the lean vector layer&lt;/a&gt;. Repo: &lt;a href="https://github.com/codecoradev/vecq" rel="noopener noreferrer"&gt;github.com/codecoradev/vecq&lt;/a&gt;. Crate: &lt;a href="https://crates.io/crates/vecq-core" rel="noopener noreferrer"&gt;vecq-core on crates.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article is crossposted with &lt;a href="https://blog.codecora.dev/524k-context-still-needs-an-index/" rel="noopener noreferrer"&gt;blog.codecora.dev&lt;/a&gt; as the canonical source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>vectorsearch</category>
    </item>
    <item>
      <title>Uteke in Production: Lessons from 150 GitHub Stars</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Tue, 08 Sep 2026 09:16:55 +0000</pubDate>
      <link>https://dev.to/codecoradev/uteke-in-production-lessons-from-150-github-stars-17p0</link>
      <guid>https://dev.to/codecoradev/uteke-in-production-lessons-from-150-github-stars-17p0</guid>
      <description>&lt;p&gt;&lt;em&gt;Editor's note (Sep 8, 2026): the lessons below were written when Uteke passed 150 stars. It has since crossed 200.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Uteke in Production: Lessons from 150 GitHub Stars
&lt;/h2&gt;

&lt;p&gt;Uteke crossed 150 GitHub stars in under two months. That is not viral growth, but it is enough to generate real feedback from real users running Uteke in production. Here are the patterns we have observed and the lessons we have learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  How People Use Uteke
&lt;/h2&gt;

&lt;p&gt;The most common use case is adding memory to AI agent frameworks: LangChain, CrewAI, and custom agent setups. Developers want their agents to persist knowledge across sessions without setting up a full vector database.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-hosted AI assistants with persistent conversation memory&lt;/li&gt;
&lt;li&gt;Documentation chatbots for internal knowledge bases&lt;/li&gt;
&lt;li&gt;Multi-agent systems using rooms for coordination&lt;/li&gt;
&lt;li&gt;Research tools that accumulate findings over time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Single Binary Advantage
&lt;/h2&gt;

&lt;p&gt;Users consistently cite the single-binary deployment as a key reason for choosing Uteke over alternatives. No Docker, no Python environment, no external services. Download, run, done. This matters especially for developers embedding Uteke into their own applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pain Points
&lt;/h2&gt;

&lt;p&gt;The most frequent issue requests are around embedding model flexibility and backup/restore. Users want to bring their own embedding models instead of being locked into all-minilm, and they want straightforward database migration between versions.&lt;/p&gt;

&lt;p&gt;Another pattern: users running Uteke on low-resource hardware (Raspberry Pi, small VPS) hit memory limits with large HNSW indices. We added configuration options for index parameters to help tune memory usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Small API surface&lt;/strong&gt;: Keeping the REST API to five core endpoints (remember, recall, search, list, forget) made Uteke easy to adopt. Users can integrate in under an hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest documentation&lt;/strong&gt;: Being upfront about limitations (no GPU support, single-node only, no clustering) set the right expectations and reduced disappointed issue reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast releases&lt;/strong&gt;: Publishing fixes within hours of bug reports built trust. Users see the project as maintained and responsive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Would Do Differently
&lt;/h2&gt;

&lt;p&gt;We would have added the Room system earlier. The flat namespace worked for single-agent use cases, but multi-agent coordination requests started appearing in the first week. Shipping rooms sooner would have reduced the 'works great, but...' feedback.&lt;/p&gt;

&lt;p&gt;We also underestimated the demand for language-specific client libraries. The REST API is straightforward, but developers want SDKs in Python, Go, and TypeScript. Building these earlier would have lowered the integration barrier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Ahead
&lt;/h2&gt;

&lt;p&gt;The next priorities are plugin-based embedding model support, improved backup tooling, and client libraries for the most requested languages. The core architecture (SQLite, HNSW, single binary) stays the same. These additions extend the surface area without changing what makes Uteke work.&lt;/p&gt;




&lt;p&gt;Star us on &lt;a href="https://github.com/codecoradev/uteke" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; if you are using Uteke in your project.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is crossposted with &lt;a href="https://blog.codecora.dev/uteke-production-lessons-150-stars/" rel="noopener noreferrer"&gt;blog.codecora.dev&lt;/a&gt; as the canonical source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>rust</category>
    </item>
    <item>
      <title>Your Local LLM Isn't Dumb. It's Amnesic.</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Tue, 08 Sep 2026 09:16:48 +0000</pubDate>
      <link>https://dev.to/codecoradev/your-local-llm-isnt-dumb-its-amnesic-be3</link>
      <guid>https://dev.to/codecoradev/your-local-llm-isnt-dumb-its-amnesic-be3</guid>
      <description>&lt;p&gt;You downloaded a model everyone praised. You ran it locally. And within ten minutes you thought: &lt;em&gt;this thing is dumb.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A detailed technical writeup that hit the Hacker News front page this week (417 points, &lt;a href="https://forum.level1techs.com/t/why-your-local-llm-feels-dumber-than-it-is/253917" rel="noopener noreferrer"&gt;"Why your local LLM feels dumber than it is"&lt;/a&gt;) makes a case that's equal parts uncomfortable and liberating: &lt;strong&gt;your local implementation sucks, but everyone else's does too.&lt;/strong&gt; Quantization, mixed GPU generations, inference stack mismatches: every local setup silently degrades the benchmark numbers the lab published.&lt;/p&gt;

&lt;p&gt;So part of the fix is honest stack-tuning. But that's only half the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other half: your model forgets everything
&lt;/h2&gt;

&lt;p&gt;Even a perfectly configured local LLM has a disability the benchmarks never measure: &lt;strong&gt;it starts every single session from zero.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No memory of yesterday's debugging session. No recall of the architecture decision you explained last week. Every conversation begins with you re-uploading, re-pasting, re-explaining, burning tokens to reconstruct context the model already "learned" once.&lt;/p&gt;

&lt;p&gt;That's not a dumb model. That's an amnesic one. And amnesia &lt;em&gt;looks&lt;/em&gt; like dumbness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It "doesn't understand your codebase" → because it re-reads it cold, every time&lt;/li&gt;
&lt;li&gt;It "forgets your conventions" → because it literally does&lt;/li&gt;
&lt;li&gt;It "gives inconsistent answers" → because each session is a stranger&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Proof the models are good enough
&lt;/h2&gt;

&lt;p&gt;The same week, another front-page story: &lt;a href="https://www.xda-developers.com/qwen-3-8-27b-reverse-engineering-job-frontier-model/" rel="noopener noreferrer"&gt;someone gave Qwen 3.8 27B a reverse-engineering job&lt;/a&gt; and it finished in 30 minutes. Work you'd normally assume needs a frontier API model.&lt;/p&gt;

&lt;p&gt;A 27B model, running locally, doing frontier-grade work. The capability is there. What's missing between "amazing in the demo" and "frustrating in daily use" is usually &lt;strong&gt;context continuity&lt;/strong&gt;, not raw intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 1: Tune the stack (the article's point)
&lt;/h2&gt;

&lt;p&gt;From the Level1Techs writeup, the parts you control:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Match quantization to hardware.&lt;/strong&gt; A heavily quantized GGUF on mismatched silicon is not the model the lab benchmarked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a sane inference runtime&lt;/strong&gt;, not whatever shipped default with a one-click installer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop judging models by two casual test prompts.&lt;/strong&gt; The gap between lab conditions and your homelab is implementation, not intelligence.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Fix 2: Give the model memory (our point)
&lt;/h2&gt;

&lt;p&gt;This is the fix almost nobody applies, and it compounds. &lt;a href="https://github.com/codecoradev/uteke" rel="noopener noreferrer"&gt;Uteke&lt;/a&gt; is an open-source, Apache-2.0 memory engine built exactly for this: a single Rust binary, fully offline, SQLite + embedded HNSW vectors + on-device embeddings, with semantic recall in ~45ms. No API key, no Docker, no cloud. It also speaks MCP, so Claude Code and other MCP agents can use it as their persistent memory server.&lt;/p&gt;

&lt;p&gt;The difference in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Without memory:&lt;/strong&gt; every session, your agent re-derives your project structure, your conventions, last week's decisions, in tokens you pay for and wait on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With memory:&lt;/strong&gt; the agent &lt;em&gt;recalls&lt;/em&gt; that context in milliseconds and starts working.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's the difference between hiring a brilliant contractor with amnesia every morning, and one who remembers your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;If your local LLM feels dumb, you have two levers, and most people only pull one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix the stack&lt;/strong&gt;: quantization, runtime, realistic expectations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix the memory&lt;/strong&gt;: stop letting every session start from zero.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The models caught up. The stack is tunable. Memory is the remaining gap, and it's a solved problem.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://github.com/codecoradev/uteke" rel="noopener noreferrer"&gt;Uteke on GitHub&lt;/a&gt;, one binary, zero dependencies, ~45ms recall, works with any MCP-capable agent.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is crossposted with &lt;a href="https://blog.codecora.dev/local-llm-isnt-dumb-its-amnesic/" rel="noopener noreferrer"&gt;blog.codecora.dev&lt;/a&gt; as the canonical source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Uteke 0.17: memory that shows its work</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Mon, 07 Sep 2026 09:45:38 +0000</pubDate>
      <link>https://dev.to/codecoradev/uteke-017-memory-that-shows-its-work-3cjf</link>
      <guid>https://dev.to/codecoradev/uteke-017-memory-that-shows-its-work-3cjf</guid>
      <description>&lt;p&gt;Version 0.17 of Uteke shipped today, and the theme is explainability. Your local memory store should be able to show you why it returned what it returned, and what happened to the facts it replaced. Here is a quick tour of the release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explain mode for recall
&lt;/h2&gt;

&lt;p&gt;Recall now has an explain mode. Alongside the results you get the full scoring breakdown: the vector rank, the FTS rank, how RRF fuses the two lists, and which boosts got applied along the way. The whole breakdown adds roughly 50ms on top of a normal query. So when a search result surprises you, you can check the actual scoring path instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supersede ledger with undo
&lt;/h2&gt;

&lt;p&gt;When a newer fact replaces an older one, 0.17 records the replacement in a supersede ledger. The history stays queryable, and mistakes stay recoverable: &lt;code&gt;uteke contradictions undo&lt;/code&gt; reverses a supersede you regret. Anyone auditing the system gets a full trail of how each fact changed over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provenance and trust tiers
&lt;/h2&gt;

&lt;p&gt;Every entry now carries provenance metadata: a SHA-256 hash of its source plus a trust tier. Entries from shaky sources now rank differently from entries with verified origins, so the retrieval layer can weigh reliability instead of treating all memories as equal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contradiction benchmark
&lt;/h2&gt;

&lt;p&gt;We stress tested the contradiction handling on 40 topics. After conflicting updates were ingested, winner@1 accuracy went from 0.850 to 1.000, and stale@5 dropped from 1.000 to 0.000 once supersede took effect. The benchmark script lives in the repo at benchmarks/longmemeval/contradiction_segment.py, so you can reproduce the numbers on your own machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Namespace management and pagination
&lt;/h2&gt;

&lt;p&gt;Namespaces got proper management commands, and list endpoints now return pagination metadata. Building tooling on top of the API no longer means guessing how many pages are left.&lt;/p&gt;

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

&lt;p&gt;Install in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; codecora.dev/uteke/install | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source code is at &lt;a href="https://github.com/codecoradev/uteke" rel="noopener noreferrer"&gt;github.com/codecoradev/uteke&lt;/a&gt;. The full release write-up, with more detail on everything above, is on the CodeCora blog: &lt;a href="https://blog.codecora.dev/uteke-0-17-explainable-auditable-memory/" rel="noopener noreferrer"&gt;Uteke 0.17: memory that shows its work&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>rust</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Agent memory should be a file. We built it.</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Sun, 06 Sep 2026 02:35:22 +0000</pubDate>
      <link>https://dev.to/codecoradev/agent-memory-should-be-a-file-we-built-it-664</link>
      <guid>https://dev.to/codecoradev/agent-memory-should-be-a-file-we-built-it-664</guid>
      <description>&lt;p&gt;Last Sunday, a Hacker News post argued that agent memory belongs in plain files. 190 points and 94 comments in two days. For a topic as unglamorous as "save notes to a text file," that is a lot of heat.&lt;/p&gt;

&lt;p&gt;We agreed with the thread, because we had already shipped the thing it asked for. Uteke is a semantic memory engine for AI agents: one Rust binary, one SQLite file on your machine, recall in about 45 milliseconds, fully offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the thread got right
&lt;/h2&gt;

&lt;p&gt;Cal Paterson's argument: most agent memory systems are broken. Some lock you into a vendor. Some are absurdly heavy: pgvector, a graph database, and a separate LLM whose only job is deciding what deserves to be remembered. His fix is memory as data: markdown pages in a zip, plus an optional SQLite file for search.&lt;/p&gt;

&lt;p&gt;Files are inspectable. You can &lt;code&gt;cat&lt;/code&gt; a memory, &lt;code&gt;diff&lt;/code&gt; two of them, put the directory in git. No vendor can deprecate your zip file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where plain files stop
&lt;/h2&gt;

&lt;p&gt;Store "we deploy v2.1 to staging after the payment freeze" on a Tuesday. Three weeks later you ask your agent "when are we shipping?" Grep finds nothing, because the words "ship" and "release" never appear in the file. Grep does not do meaning. At five memories that is a curiosity. At five hundred, roughly two weeks of real agent work, it is the difference between memory and an archive.&lt;/p&gt;

&lt;p&gt;So we built the file that answers questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Uteke does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; codecora.dev/uteke/install | sh
uteke remember &lt;span class="s2"&gt;"Deploy v2.1 to staging at 3pm"&lt;/span&gt;
uteke recall &lt;span class="s2"&gt;"when do we deploy?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That third command is the one files cannot do. Recall runs hybrid search: SQLite FTS5 for keywords, vector similarity for meaning, fused into one ranked list. A local embedding model (about 188MB) downloads once. After that, nothing leaves your machine.&lt;/p&gt;

&lt;p&gt;Numbers we publish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;98.2% recall_any@5 on LongMemEval-S (500 questions, zero-config fusion default, public harness in the repo)&lt;/li&gt;
&lt;li&gt;42ms P50 / 50ms P95 recall at 10K memories, and latency stays flat from 100 to 10K&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uteke is Apache-2.0. The repo sits at 237 stars.&lt;/p&gt;

&lt;p&gt;If you nodded along with that thread, those three commands are the whole evaluation. Your agent's memory stays a file you own. The file just answers questions now.&lt;/p&gt;

&lt;p&gt;The full story is on the blog: &lt;a href="https://blog.codecora.dev/uteke-agent-memory-file/" rel="noopener noreferrer"&gt;Agent memory should be a file. We built it.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article is crossposted with &lt;a href="https://blog.codecora.dev/uteke-agent-memory-file/" rel="noopener noreferrer"&gt;blog.codecora.dev&lt;/a&gt; as the canonical source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>sqlite</category>
      <category>agents</category>
    </item>
    <item>
      <title>A Small Transformer Trained in 1.5 Hours Beat Many LLMs on ARC</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Wed, 02 Sep 2026 06:56:56 +0000</pubDate>
      <link>https://dev.to/codecoradev/a-small-transformer-trained-in-15-hours-beat-many-llms-on-arc-49h9</link>
      <guid>https://dev.to/codecoradev/a-small-transformer-trained-in-15-hours-beat-many-llms-on-arc-49h9</guid>
      <description>&lt;p&gt;Mithil Vakde trained a small transformer from scratch in 1.5 hours on a rented RTX 5090. The compute cost came to about 67 cents. The model scored 44% on the ARC-AGI-1 public eval, one point behind TRM's 45% and in the same band that left DeepSeek R1, o3-mini, and Gemini 2.5 Pro behind when the TRM paper ran the comparison (&lt;a href="https://arxiv.org/abs/2510.04871" rel="noopener noreferrer"&gt;arXiv 2510.04871&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This is the third post in his ARC series. The previous result went viral and drew public scrutiny from researchers including Lucas Beyer, Jeremy Howard, and Rohan Anil. The new one raises the score, cuts the cost, and answers every objection in a long appendix.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the model does
&lt;/h2&gt;

&lt;p&gt;Each puzzle becomes a sequence of tokenized grids. The transformer trains on those sequences from scratch at test time, using both the train puzzles and the eval puzzle inputs, with the eval labels hidden. Test-time training is not a loophole here. ARC is a meta-learning benchmark built around skill acquisition, and Chollet's original paper frames the whole thing as a measure of how efficiently a system gains new skills (&lt;a href="https://arxiv.org/abs/1911.01547" rel="noopener noreferrer"&gt;arXiv 1911.01547&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The architecture got a 2026 refresh: 8 layers, SwiGLU, RMSNorm, the NorMuon optimizer, 3D RoPE, and per-task embeddings. Inference augments each test input with color and dihedral permutations, inverts the augmentations, and submits the two most common outputs.&lt;/p&gt;

&lt;p&gt;The biggest change is the loss function. Previous versions trained on input and output tokens. This one trains on output tokens only, which makes the approach supervised. Score went from 40% to 44%. Vakde admits he does not fully understand why, and the training loss got worse even as scores improved. His guess is finite model capacity. The ablations back him up on what carries the result: drop the 3D RoPE and the score falls to about 24%, drop the per-task embeddings and it falls to about 24%. Representations, not compute, are doing the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lineage it joins
&lt;/h2&gt;

&lt;p&gt;None of these systems pretrain. They learn from the benchmark's roughly thousand examples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Parameters&lt;/th&gt;
&lt;th&gt;ARC-AGI-1&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CompressARC&lt;/td&gt;
&lt;td&gt;76K&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;&lt;a href="https://arxiv.org/abs/2512.06104" rel="noopener noreferrer"&gt;arXiv 2512.06104&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HRM&lt;/td&gt;
&lt;td&gt;27M&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://arxiv.org/abs/2506.21734" rel="noopener noreferrer"&gt;arXiv 2506.21734&lt;/a&gt;; score from &lt;a href="https://arxiv.org/abs/2510.04871" rel="noopener noreferrer"&gt;2510.04871&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TRM&lt;/td&gt;
&lt;td&gt;7M (see caveats)&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;td&gt;&lt;a href="https://arxiv.org/abs/2510.04871" rel="noopener noreferrer"&gt;arXiv 2510.04871&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vakde's model&lt;/td&gt;
&lt;td&gt;small (1.5 hrs training)&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;td&gt;&lt;a href="https://mvakde.github.io/blog/44-on-arc-1/" rel="noopener noreferrer"&gt;author's blog&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In about a year, from-scratch systems went from solving a fifth of the eval to nearly half of it, and the cost per result collapsed from research-cluster budgets to spare change on a rented GPU.&lt;/p&gt;

&lt;p&gt;Vakde also measured what happens when you strip his advantages. Restricting training data to ARC-1 plus ConceptARC still scores about 40%. A CompressARC-style unsupervised variant drops to about 18%. He thinks 65% is reachable within the current framework, and a union of solved tasks across his own runs already reached 55%. One request to contributors: do not add more training data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the skeptics have a point
&lt;/h2&gt;

&lt;p&gt;The 67-cent figure deserves a careful read. It counts lifetime compute: training from initialization plus inference on all tasks, which works because every task is trained at once. Dividing that total by task count would amortize it unfairly against models charged per task, and Vakde now compares only against TRM, HRM, and CompressARC for exactly this reason. LLM cost figures, on the other side, leave out pretraining entirely, so no single cost axis treats every approach the same.&lt;/p&gt;

&lt;p&gt;Parameter claims need the same scrutiny. He argues TRM's famous "7M parameters" leaves out O(100M+) trained embedding weights, and that "7M active weights" would be the honest label. Same caution for HRM.&lt;/p&gt;

&lt;p&gt;The score itself stays humble. 44% means 56% of puzzles still fail, and 7% on ARC-2 is early days. OpenAI's o1 reached 75% on ARC-1 through massive post-training (&lt;a href="https://arxiv.org/abs/2412.04604" rel="noopener noreferrer"&gt;ARC Prize 2024 report&lt;/a&gt;), and frontier systems still lead the private leaderboard. This result is about efficiency per training dollar, not about beating GPT-class models across the board. Public eval scores for LLMs are also polluted, since the answers circulate on the internet and end up in training data.&lt;/p&gt;

&lt;p&gt;And this is one researcher's unreviewed work. The previous round got picked apart in public, and while the appendix answers the objections convincingly, independent replication is still thin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Efficiency without the training bill
&lt;/h2&gt;

&lt;p&gt;The pattern matters more to us than the puzzle. Small-model efficiency used to arrive with an invoice: distillation runs, quantization-aware training pipelines, weeks of compute before the first benchmark.&lt;/p&gt;

&lt;p&gt;Vakde's result says the invoice is optional on the reasoning side: train from scratch at test time, in 1.5 hours, for 67 cents. Our own work says the same on the storage side. &lt;a href="https://github.com/codecoradev/vecq" rel="noopener noreferrer"&gt;vecq&lt;/a&gt;, our training-free vector quantization library, gets its 4-bit and 5-bit codes from Lloyd-Max centroids that are fixed constants. There is no training pass to pay for at all.&lt;/p&gt;

&lt;p&gt;In our benchmarks, &lt;a href="https://blog.codecora.dev/vecq-4-bit-vector-search/" rel="noopener noreferrer"&gt;4-bit codes hit recall@10 of 0.958 at 5.98x compression, scanning at 0.89 ms per query on ARM&lt;/a&gt;, and the current release defaults to 5-bit at 4.79x compression with 0.979 &lt;a href="mailto:recall@10"&gt;recall@10&lt;/a&gt;. &lt;a href="https://blog.codecora.dev/quantization-cpu-to-96gb-and-embeddings/" rel="noopener noreferrer"&gt;The same quantization math scales all the way up to an 87GB model on a CPU&lt;/a&gt;. Inside our memory engine, the pipeline reached &lt;a href="https://blog.codecora.dev/uteke-vs-chromadb-vs-mem0-benchmark/" rel="noopener noreferrer"&gt;98.2% recall against ChromaDB and Mem0&lt;/a&gt; without any learned quantizer. The brute-force scan does give back some speed to HNSW, and &lt;a href="https://blog.codecora.dev/why-hnsw-vector-index-uteke/" rel="noopener noreferrer"&gt;why we pick that trade&lt;/a&gt; is an architectural choice for edge hardware, not an accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to watch
&lt;/h2&gt;

&lt;p&gt;The interesting shift is the price of admission for credible efficiency results: no pretraining run, one GPU, under two hours, spare change. Chollet's skill-acquisition framing finally has a small-model track with real momentum behind it, and Vakde argues the organizers should go further and ban offline pretraining to make ARC a true sample-efficiency test. His own result is the existence proof that such a rule is survivable.&lt;/p&gt;

&lt;p&gt;The author believes 65% is reachable and that hand-written GPU kernels could cut his costs another 10x. Either would have sounded like trolling a year ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Mithil Vakde, &lt;a href="https://mvakde.github.io/blog/44-on-arc-1/" rel="noopener noreferrer"&gt;"44% on ARC-AGI-1 in 67 cents"&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2510.04871" rel="noopener noreferrer"&gt;"Less is More: Recursive Reasoning with Tiny Networks"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2506.21734" rel="noopener noreferrer"&gt;"Hierarchical Reasoning Model"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2512.06104" rel="noopener noreferrer"&gt;"ARC-AGI Without Pretraining"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Francois Chollet, &lt;a href="https://arxiv.org/abs/1911.01547" rel="noopener noreferrer"&gt;"On the Measure of Intelligence"&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2412.04604" rel="noopener noreferrer"&gt;"ARC Prize 2024: Technical Report"&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;This article is crossposted with &lt;a href="https://blog.codecora.dev/small-transformer-1-5-hours-arc/" rel="noopener noreferrer"&gt;blog.codecora.dev&lt;/a&gt; as the canonical source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>vectorsearch</category>
      <category>quantization</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>Why bigger context windows won't kill memory systems</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Wed, 02 Sep 2026 03:57:24 +0000</pubDate>
      <link>https://dev.to/codecoradev/why-bigger-context-windows-wont-kill-memory-systems-1fmh</link>
      <guid>https://dev.to/codecoradev/why-bigger-context-windows-wont-kill-memory-systems-1fmh</guid>
      <description>&lt;p&gt;A claim keeps making the rounds: context windows are at a million tokens and climbing, so external memory is a stopgap that better models will make obsolete. If that's true, we picked a strange moment to publish a memory benchmark. We weren't worried, but we did want to know what the evidence says. So we read the papers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a million tokens does to information
&lt;/h2&gt;

&lt;p&gt;The seminal result is Liu et al's "Lost in the Middle" (&lt;a href="https://arxiv.org/abs/2307.03172" rel="noopener noreferrer"&gt;arXiv 2307.03172&lt;/a&gt;). Tested on multi-document QA and key-value retrieval, models performed best when relevant information sat at the beginning or end of the context, and degraded hard when it sat in the middle.&lt;/p&gt;

&lt;p&gt;For a while you could hope that was an engineering wart. Then a 2026 paper derived the same U-shaped retrieval profile from a theoretical model of attention dynamics (&lt;a href="https://arxiv.org/abs/2605.09213" rel="noopener noreferrer"&gt;arXiv 2605.09213&lt;/a&gt;). The position bias falls out of the math. Bigger windows inherit it. They don't remove it.&lt;/p&gt;

&lt;p&gt;Practice matches theory. In a white-box study of coding agents, pass rate fell from 8 of 10 runs in a clean 10,991-character context to 3 of 10 runs at 299,140 characters, and padding the context with irrelevant material hurt as much as relevant code (&lt;a href="https://arxiv.org/abs/2607.17937" rel="noopener noreferrer"&gt;arXiv 2607.17937&lt;/a&gt;). Half the drop had nothing to do with relevance.&lt;/p&gt;

&lt;p&gt;Long-horizon search shows the same shape. Across four flagship models and three benchmarks, researchers documented "premature termination": models give up or answer with falling confidence long before they approach the window limit (&lt;a href="https://arxiv.org/abs/2606.29718" rel="noopener noreferrer"&gt;arXiv 2606.29718&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  The economics nobody mentions
&lt;/h2&gt;

&lt;p&gt;Everything inside the window is re-paid on every call, in every session. A fact from last March costs the same as something the user said ten seconds ago, every single time you send it.&lt;/p&gt;

&lt;p&gt;Retrieval inverts that curve. Store once, then pay for a small set of relevant records when they're needed.&lt;/p&gt;

&lt;p&gt;There's a real trade-off inside memory design itself. Keep raw records and you preserve detail but burn budget. Consolidate and you cover more ground per token but risk dropping a query-critical fact (&lt;a href="https://arxiv.org/abs/2607.17545" rel="noopener noreferrer"&gt;arXiv 2607.17545&lt;/a&gt;). Both strategies argue for the same thing: a small, deliberately chosen working set, not a firehose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory is not a small context window
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2410.10813" rel="noopener noreferrer"&gt;LongMemEval&lt;/a&gt; (arXiv 2410.10813) breaks long-term memory into five measurable abilities: information extraction, multi-session reasoning, temporal reasoning, knowledge updates, and abstention. Look at that list. None of them mean "hold more tokens at once."&lt;/p&gt;

&lt;p&gt;Knowledge updates are the cleanest example. When a user changes deploy targets, the old value has to be overwritten. In a million-token window, the stale fact and the current one both sit there, and the model has to guess which wins. A memory system that tracks updates resolves it by design.&lt;/p&gt;

&lt;p&gt;The field is still moving. &lt;a href="https://arxiv.org/abs/2605.12493" rel="noopener noreferrer"&gt;LongMemEval-V2&lt;/a&gt; landed in May 2026 and pushes evaluation toward whether an agent becomes an experienced colleague in its environment. Nobody builds benchmarks for problems they consider solved.&lt;/p&gt;

&lt;h2&gt;
  
  
  When big context wins
&lt;/h2&gt;

&lt;p&gt;Credit where it's due. Reasoning over one large document you already have, one-shot analysis that needs the whole thing in view at once, needle-style lookups inside a single snapshot: if the world fits in the window and everything in it is current, fill it. Memory systems earn their keep when history is long and facts change across many sessions, which describes most real assistants after their first week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our numbers, reproducible
&lt;/h2&gt;

&lt;p&gt;We build a memory engine (&lt;a href="https://github.com/codecoradev/uteke" rel="noopener noreferrer"&gt;Uteke&lt;/a&gt;) and we test it the boring way. On LongMemEval-S with 500 questions, it scores &lt;a href="https://blog.codecora.dev/uteke-vs-chromadb-vs-mem0-benchmark/" rel="noopener noreferrer"&gt;98.2% recall_any@5&lt;/a&gt;. Then we &lt;a href="https://blog.codecora.dev/we-published-our-benchmark-then-we-tried-to-break-it/" rel="noopener noreferrer"&gt;re-ran the entire suite on a different CPU architecture&lt;/a&gt;: 107 of 108 questions produced identical rankings, and the one that moved was an adjacent-rank near-tie we traced to float summation order.&lt;/p&gt;

&lt;p&gt;The harness is in the repo. Run your own, and treat numbers you cannot reproduce, including ours, as marketing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;Bigger windows raise the ceiling on working memory. Persistence, salience, and overwrite stay separate jobs, and the field is now measuring them directly. Context and memory do different jobs. The agents people keep coming back to are the ones that stopped starting from zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2307.03172" rel="noopener noreferrer"&gt;Lost in the Middle: How Language Models Use Long Contexts&lt;/a&gt; (arXiv 2307.03172)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2605.09213" rel="noopener noreferrer"&gt;Kinetic theory for Transformers and the lost-in-the-middle phenomenon&lt;/a&gt; (arXiv 2605.09213)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2607.17937" rel="noopener noreferrer"&gt;When and How Context Rot Appears in Coding Agents&lt;/a&gt; (arXiv 2607.17937)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2606.29718" rel="noopener noreferrer"&gt;Diagnosing and Mitigating Context Rot in Long-horizon Search&lt;/a&gt; (arXiv 2606.29718)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2607.17545" rel="noopener noreferrer"&gt;Retain or Consolidate? Budget-Dependent Operator Selection for Language Agent Memory&lt;/a&gt; (arXiv 2607.17545)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2410.10813" rel="noopener noreferrer"&gt;LongMemEval: Benchmarking Chat Assistants on Long-Term Interactive Memory&lt;/a&gt; (arXiv 2410.10813)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2605.12493" rel="noopener noreferrer"&gt;LongMemEval-V2: Evaluating Long-Term Agent Memory Toward Experienced Colleagues&lt;/a&gt; (arXiv 2605.12493)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Full write-up lives on &lt;a href="https://blog.codecora.dev/context-vs-memory/" rel="noopener noreferrer"&gt;our blog&lt;/a&gt;, canonical source for this post.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>memory</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>We re-ran our benchmark on a different CPU architecture. 107 of 108 matched.</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:06:41 +0000</pubDate>
      <link>https://dev.to/codecoradev/we-re-ran-our-benchmark-on-a-different-cpu-architecture-107-of-108-matched-2n6a</link>
      <guid>https://dev.to/codecoradev/we-re-ran-our-benchmark-on-a-different-cpu-architecture-107-of-108-matched-2n6a</guid>
      <description>&lt;p&gt;We publish benchmarks for Uteke, our open-source memory engine. The headline this week: 98.2% recall on LongMemEval-S. 500 questions, zero config, no LLM in the retrieval path.&lt;/p&gt;

&lt;p&gt;Then we asked the question every benchmark should answer: does the number survive on different hardware?&lt;/p&gt;

&lt;p&gt;The published run came from cloud x86 infrastructure. The re-run happened on a 4-core ARM desktop. Same v0.16.0 binary, same public harness, 108-question subset.&lt;/p&gt;

&lt;p&gt;We compared per question, ranking against ranking.&lt;/p&gt;

&lt;p&gt;107 of 108 identical.&lt;/p&gt;

&lt;p&gt;The one difference is the interesting part. Both runs retrieved the same top-10 sessions. One session sat at rank 5 in the published run and rank 6 in the re-run. Our retrieval fuses two rankings with Reciprocal Rank Fusion, which is floating-point math all the way down. Cross a CPU architecture boundary and near-ties can round differently. That is the whole story: one adjacent-rank flip, and the subset aggregate moved from 100.0% to 99.4%.&lt;/p&gt;

&lt;p&gt;If you compare memory systems for a living, the field guide we wrote alongside this matters more than our numbers. Check what the figure is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recall_any@K means at least one gold session lands in the top K. recall_all@K means all of them. Vendors mostly publish the first family. Our own run scores 98.2% on the first and 88.0% on the second, from the same data. Ten honest points apart.&lt;/li&gt;
&lt;li&gt;The cutoff matters. Recall@15 is easier than &lt;a href="mailto:Recall@5"&gt;Recall@5&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Sample size matters. 100 questions is a smoke test, 500 is a validation run.&lt;/li&gt;
&lt;li&gt;Version and date matter. Benchmarks are snapshots of moving software.&lt;/li&gt;
&lt;li&gt;The harness being public matters most. A table is marketing. A harness you can clone is a benchmark.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full post has the comparison chart with per-metric disclosures, the full field table (Mnemosyne, MemPalace, agentmemory, Supermemory, each with its metric labeled), and what we deliberately do not claim:&lt;/p&gt;

&lt;p&gt;Read the full breakdown: &lt;a href="https://blog.codecora.dev/we-published-our-benchmark-then-we-tried-to-break-it/" rel="noopener noreferrer"&gt;https://blog.codecora.dev/we-published-our-benchmark-then-we-tried-to-break-it/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't trust our benchmark. Run your own. The harness and reproduction results are in the repo.&lt;/p&gt;

&lt;p&gt;Cross-posted from the CodeCora blog, where we write about local-first AI infrastructure.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>benchmark</category>
      <category>rust</category>
      <category>llm</category>
    </item>
    <item>
      <title>An 87GB model ran on a CPU at 8 tok/s. Quantization did that.</title>
      <dc:creator>Anaz S. Aji</dc:creator>
      <pubDate>Tue, 01 Sep 2026 06:44:17 +0000</pubDate>
      <link>https://dev.to/codecoradev/an-87gb-model-ran-on-a-cpu-at-8-toks-quantization-did-that-57km</link>
      <guid>https://dev.to/codecoradev/an-87gb-model-ran-on-a-cpu-at-8-toks-quantization-did-that-57km</guid>
      <description>&lt;p&gt;Someone on r/LocalLLaMA benchmarked Qwen3.8-Flash-Next in llama.cpp from CPU-only all the way to 96GB of VRAM. The model file is 87.2 GiB. On a plain CPU it decodes at 8.34 tok/s. With the full 96GB, 109 tok/s.&lt;/p&gt;

&lt;p&gt;The number that looks like a party trick is the CPU one. It is a compression story. The weights are 4-bit. At 16-bit the file would be around 4x bigger, north of 300GB, and no consumer setup loads that, GPU or not.&lt;/p&gt;

&lt;p&gt;Two more findings from the benchmark worth stealing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At 245K context, the 96GB advantage over 24GB shrinks from 2.80x to 1.45x. Long context flattens everything.&lt;/li&gt;
&lt;li&gt;Dropping the model's 27.2 GiB embedding table onto the GPU cut decode from 108.5 to 1.95 tok/s. RAM placement was 55.6x faster. Where a tensor lives matters as much as how much VRAM you have.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why this matters here: embeddings hit the same wall at smaller scale. Every f32 embedding at 768 dims costs 3,072 bytes. A 100k-vector agent memory is about 300MB. Fine on a server, real money on a phone.&lt;/p&gt;

&lt;p&gt;We built vecq for that. Training-free vector quantization in Rust (Apache-2.0, crate: vecq-core). No calibration data, deterministic results across platforms. On real EmbeddingGemma vectors: 4.78x smaller at default width (642 bytes/vector) with recall@10 of 0.979, and the index builds 14x faster than HNSW.&lt;/p&gt;

&lt;p&gt;Honest trade: search is brute force, about 14x slower than HNSW at default width. Made for on-device indexes in the thousands of vectors, not million-vector servers. The file format is versioned and readers accept older versions, so indexes keep loading across releases.&lt;/p&gt;

&lt;p&gt;Full breakdown with the benchmark tables is on the blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://blog.codecora.dev/quantization-cpu-to-96gb-and-embeddings/" rel="noopener noreferrer"&gt;https://blog.codecora.dev/quantization-cpu-to-96gb-and-embeddings/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/codecoradev/vecq" rel="noopener noreferrer"&gt;https://github.com/codecoradev/vecq&lt;/a&gt;&lt;br&gt;
Crate: &lt;a href="https://crates.io/crates/vecq-core" rel="noopener noreferrer"&gt;https://crates.io/crates/vecq-core&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>llm</category>
      <category>vectors</category>
      <category>benchmark</category>
    </item>
  </channel>
</rss>
