<?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>Forem: Alex Kwiatkowski</title>
    <description>The latest articles on Forem by Alex Kwiatkowski (@rupurt).</description>
    <link>https://forem.com/rupurt</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%2F2773814%2Fa489e6c1-97ac-490e-9146-dcdcbcc6f626.jpeg</url>
      <title>Forem: Alex Kwiatkowski</title>
      <link>https://forem.com/rupurt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rupurt"/>
    <language>en</language>
    <item>
      <title>Keel: The Leash for Agentic SDLC Management</title>
      <dc:creator>Alex Kwiatkowski</dc:creator>
      <pubDate>Wed, 15 Apr 2026 02:46:38 +0000</pubDate>
      <link>https://forem.com/rupurt/keel-the-leash-for-agentic-sdlc-management-36mn</link>
      <guid>https://forem.com/rupurt/keel-the-leash-for-agentic-sdlc-management-36mn</guid>
      <description>&lt;p&gt;Most conversations about agentic engineering focus on two things: the model and the harness.&lt;/p&gt;

&lt;p&gt;The model reasons, writes code, and makes decisions. The harness orchestrates tool calls, manages context, and coordinates multi-step workflows. Together, they're powerful.&lt;/p&gt;

&lt;p&gt;Together, they're still missing something.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The missing layer is the host.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not the model. Not the harness. The persistent, rule-enforcing system that governs what work is valid, what evidence is required, and what constitutes done: regardless of who or what is doing the work.&lt;/p&gt;

&lt;p&gt;Without a host that enforces shared physics, you don't have a governed system. You have a capable-but-unaccountable agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.spoke.sh/keel" rel="noopener noreferrer"&gt;Keel&lt;/a&gt; is that host. It's a CLI state machine that both humans and agents must operate through. The leash isn't a constraint on what the model can reason about, it's a guarantee of what the system will enforce.&lt;/p&gt;




&lt;h2&gt;
  
  
  The model and harness cover two-thirds of the picture
&lt;/h2&gt;

&lt;p&gt;A language model brings extraordinary capability. A harness brings coordination. But neither answers the foundational questions that govern a software delivery team:&lt;/p&gt;

&lt;p&gt;What rules constrain the work? Not prompt-level suggestions — structural invariants that persist across sessions and actors.&lt;/p&gt;

&lt;p&gt;What constitutes done? Not the model's assertion that it's complete — verifiable evidence the system can check.&lt;/p&gt;

&lt;p&gt;Where is human judgment required? Not inferred from context — explicit gates that halt execution until a human decides.&lt;/p&gt;

&lt;p&gt;What's the shared state? Not reconstructed from a context window — persistent, git-auditable truth that survives session boundaries.&lt;/p&gt;

&lt;p&gt;Without a host layer that answers these questions structurally, every session starts with renegotiation. The model re-reads the codebase. The harness reconstructs intent from conversation history. Humans re-verify things they already approved. The agent loop restarts from scratch.&lt;/p&gt;

&lt;p&gt;This isn't a capability problem. It's a governance problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The design pattern: CLI state machine as host
&lt;/h2&gt;

&lt;p&gt;The pattern Keel implements is deceptively simple: every actor — human or agent — interacts with the board through the same CLI state machine. The machine defines the physics. The machine enforces the transitions. The machine records the evidence. Neither the model's capability nor the harness's coordination changes what the machine will allow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The same turn loop for humans and agents&lt;/span&gt;

keel turn                   &lt;span class="c"&gt;# orient: inspect charge, health, flow, and doctor&lt;/span&gt;

keel next &lt;span class="nt"&gt;--role&lt;/span&gt; operator   &lt;span class="c"&gt;# pull: role-scoped work from the delivery lane&lt;/span&gt;

keel story start &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;       &lt;span class="c"&gt;# begin: transitions the story to in-progress&lt;/span&gt;

keel story record &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;      &lt;span class="c"&gt;# proof: attach verifiable evidence to the story&lt;/span&gt;

keel story submit &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;      &lt;span class="c"&gt;# close: gate check — all ACs must have proofs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent doesn't get a special path. It uses the same commands, hits the same gates, and produces the same evidence as a human operator. There's no side door, an agent that tries to skip a gate gets a hard rejection from the same machine a human would hit.&lt;/p&gt;




&lt;h2&gt;
  
  
  ADRs as physics
&lt;/h2&gt;

&lt;p&gt;The clearest demonstration of host-layer governance is the Architecture Decision Record. In Keel, an ADR in proposed state is a blocking constraint. Work in the governed bounded context halts — not because the model was told to check for ADRs, but because the state machine rejects the transition.&lt;/p&gt;

&lt;p&gt;A proposed ADR covering authentication means no agent can start a story that touches the auth boundary. keel next --role operator won't surface that work. The machine won't allow the transition.&lt;/p&gt;

&lt;p&gt;This matters because it changes what the human needs to supervise. You're not reading every pull request hoping the agent respected the architectural decision you mentioned in a system prompt three sessions ago. You're looking at a binary gate: the ADR is accepted or work doesn't happen.&lt;/p&gt;

&lt;p&gt;ADRs aren't documentation the model might read. They're physics the machine enforces.&lt;/p&gt;




&lt;h2&gt;
  
  
  Transitions require evidence, not assertions
&lt;/h2&gt;

&lt;p&gt;The most common failure mode in agentic development is the confident wrong answer. The model completes a task, asserts it's done, and moves on. The harness accepts the assertion and records completion. Nobody checks the evidence because there's no structural requirement for evidence to exist.&lt;/p&gt;

&lt;p&gt;Keel's Verified Spec Driven Development (VSDD) changes this at the state machine level. A story cannot transition from in-progress to needs-human-verification without all acceptance criteria having recorded verification proofs. The model can't assert completion. It must demonstrate it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Attempt to submit without proofs — the gate rejects it&lt;/span&gt;

keel story submit &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# → Error: acceptance criteria AC-01 has no recorded verification proof&lt;/span&gt;

&lt;span class="c"&gt;#   All acceptance criteria must have evidence before the story can be submitted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent loop adapts to this naturally. Instead of asserting "I implemented the feature," it must run the verification, capture the output, record it against the specific acceptance criterion, and then submit. The human reviewing the submitted story sees a traced chain from implementation to acceptance criteria to recorded proof, not a summary the model wrote.&lt;/p&gt;

&lt;p&gt;This is a different kind of trust. You're not trusting the model's judgment about completeness. You're trusting the state machine's check that the evidence exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Separating human judgment from agent execution
&lt;/h2&gt;

&lt;p&gt;Keel resolves the human-in-the-loop tension through a 2-queue pull model with lane topology. The management lane holds decisions that require human judgment: proposed ADRs, stories awaiting acceptance, voyages needing planning. The delivery lane holds work agents can execute.&lt;/p&gt;

&lt;p&gt;The two lanes don't intersect — a manager role never returns implementation work, an operator role never returns governance decisions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Human pulls from the management lane — never gets implementation work&lt;/span&gt;

keel next &lt;span class="nt"&gt;--role&lt;/span&gt; manager

&lt;span class="c"&gt;# → accept: Story VE3IAG4jZ needs your verification&lt;/span&gt;

&lt;span class="c"&gt;# Agent pulls from the delivery lane — never gets governance decisions&lt;/span&gt;

keel next &lt;span class="nt"&gt;--role&lt;/span&gt; operator

&lt;span class="c"&gt;# → work: Story VDmdk1uib is ready to start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&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.amazonaws.com%2Fuploads%2Farticles%2F7jlszptyx0bfru6d2ysl.png" 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.amazonaws.com%2Fuploads%2Farticles%2F7jlszptyx0bfru6d2ysl.png" alt="Keel Doctor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where CLI visual fidelity starts earning its keep. The keel flow --scene dashboard answers the question any participant needs answered at a glance: where is the board right now, and what requires attention? Management lane queue depths, delivery lane progress, and blocking conditions all surface in a single terminal render.&lt;/p&gt;

&lt;p&gt;High-fidelity CLI output matters for agentic workflows in a way it never quite did for purely human ones. A human can squint at abbreviated output or ask a clarifying question. A model parsing terminal output to construct its next action cannot. Every ambiguity in the output is an opportunity for the model to misread board state and proceed on a wrong assumption.&lt;/p&gt;




&lt;h2&gt;
  
  
  Zero drift as a continuous invariant
&lt;/h2&gt;

&lt;p&gt;Long-running agentic work accumulates structural debt: stories without SRS references, voyages missing design documents, ADRs that governed a context that has since changed. In a model-plus-harness system, this drift is invisible until it causes a failure.&lt;/p&gt;

&lt;p&gt;In Keel, keel doctor checks structural coherence across the entire board. Agents run it first, before every session, and fix what it reports before doing anything else.&lt;/p&gt;

&lt;p&gt;The drift categories are structural, not heuristic. These aren't warnings to consider — they're blocking conditions the state machine treats as hard failures. An agent that introduces scaffold drift on Monday cleans it up on Tuesday before starting anything new. Entropy is structurally bounded.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fzvj7msdnui3zhh26hrnl.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fzvj7msdnui3zhh26hrnl.png" alt="Keel Flow Circuit"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Files as truth, git as the audit log
&lt;/h2&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fo8ilqlcqz41j3p3r9pcn.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fo8ilqlcqz41j3p3r9pcn.png" alt="Keel Knowledge Graph"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All board state lives in markdown files with YAML frontmatter. There's no hidden database, no daemon that can fall out of sync, no service to query. git log is the complete audit trail of every board mutation.&lt;/p&gt;

&lt;p&gt;When an agent submits a story, the evidence files and lifecycle transitions are committed to the repository as part of the sealing commit. The git history is the immutable record of what the agent claimed and what evidence it recorded. No retroactive amendment. No separate audit service to maintain.&lt;/p&gt;

&lt;p&gt;The knowledge graph surfaces the artifact web visually. Each node is a file. Each edge is a structural relationship: a story linked to its epic, an ADR scoping a bounded context, an SRS reference anchoring an acceptance criterion. A missing edge is missing evidence. A disconnected node is an orphaned artifact.&lt;/p&gt;

&lt;p&gt;High-fidelity CLI output is not a UI nicety for agents: it's how the model reads board state without hallucinating the parts it can't see.&lt;/p&gt;

&lt;p&gt;This is the deeper argument for investing in CLI visual fidelity in agentic tooling. A human operator adapts to ambiguous output. A model does not — it fills gaps with inference, and inference compounds into drift. Visual fidelity in the interface is structural reliability in the agent loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this changes about trust
&lt;/h2&gt;

&lt;p&gt;You verify everything important in agentic systems because you can't be sure the model held to the intent you had when you started the session. That's the actual cost of contextual trust: the human becomes the consistency check, session after session, because nothing else is holding the invariants.&lt;/p&gt;

&lt;p&gt;The host layer makes trust structural. You trust the state machine because it enforced the gate checks. You trust the evidence because the transition required it. You trust the scope because the ADRs blocked everything outside it. You trust the audit trail because git holds it immutably.&lt;/p&gt;

&lt;p&gt;The model's capability matters — a better model executes delivery lane work more effectively. The harness's coordination matters — a well-designed harness surfaces the right context at the right time. But neither determines whether the work was governed correctly. The host does that independently of both.&lt;/p&gt;

&lt;p&gt;The leash isn't a limit on what the model can do. It's a guarantee that what the model does was supposed to happen.&lt;/p&gt;




&lt;h2&gt;
  
  
  The physics are real
&lt;/h2&gt;

&lt;p&gt;The design pattern that emerges from Keel is this: place a CLI state machine between every actor and the work. Humans and agents are first-class participants in a governed system. The host defines the physics. The model executes within them. The harness coordinates around them. But neither the model nor the harness makes the rules, the CLI state machine does, persistently, across every session.&lt;/p&gt;

&lt;p&gt;This is not a new idea in software engineering. Formal state machines, enforced transitions, and evidence-gated acceptance are standard in high-assurance systems. What's new is applying that discipline to the agentic layer, building the host so that a language model operating at full autonomy is still operating within a structure a human designed and a machine enforces.&lt;/p&gt;

&lt;p&gt;The shared way of working doesn't emerge from the model being aligned. It emerges from the physics being real.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>agentsdlc</category>
      <category>ai</category>
      <category>vsdd</category>
    </item>
    <item>
      <title>Sift: Local Hybrid Search Without the Infrastructure Tax</title>
      <dc:creator>Alex Kwiatkowski</dc:creator>
      <pubDate>Tue, 10 Mar 2026 04:33:59 +0000</pubDate>
      <link>https://forem.com/rupurt/sift-local-hybrid-search-without-the-infrastructure-tax-487n</link>
      <guid>https://forem.com/rupurt/sift-local-hybrid-search-without-the-infrastructure-tax-487n</guid>
      <description>&lt;p&gt;&lt;code&gt;sift&lt;/code&gt; is a local Rust CLI for document retrieval. Point it at a directory, ask a question, and it runs a full hybrid search pipeline, BM25, dense vector, fusion, optional reranking, and returns ranked results. No daemon. No background indexer. No cloud. One binary.&lt;/p&gt;

&lt;p&gt;It's built for agents and developers who need reliable, repeatable search over raw codebases, docs, and mixed-format corpora without spinning up infrastructure to get there.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://github.com/rupurt/sift#installation" rel="noopener noreferrer"&gt;install it&lt;/a&gt; now on Mac, Windows &amp;amp; Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  The retrieval pipeline
&lt;/h2&gt;

&lt;p&gt;Every query runs through four stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Expansion&lt;/strong&gt; — query variants are generated to broaden recall before retrieval begins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval&lt;/strong&gt; — BM25 (keyword), phrase match, and dense vector retrieval run against the corpus. Each method captures different signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fusion&lt;/strong&gt; — results are merged using Reciprocal Rank Fusion (RRF), balancing signal across retrieval methods without manual weight tuning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reranking&lt;/strong&gt; — optional local LLM reranking via Qwen applies semantic disambiguation on the fused candidate set.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each stage is independently tunable. Skip the vector pass if you only need BM25 speed. Run the full stack for best precision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The implementation is split into domain and adapters: domain objects model search plans, candidates, and scoring outputs; adapters implement the concrete BM25, phrase, vector, and reranking backends. A shared search service executes the&lt;br&gt;
  same strategy model for CLI, benchmark, and eval flows — nothing changes between a dev run and a CI eval pass.&lt;/p&gt;

&lt;p&gt;Performance is local-first by design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SIMD-accelerated dot-product&lt;/strong&gt; for vector scoring on CPU-heavy workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zig-inspired incremental cache&lt;/strong&gt; — a two-layer design borrowed from Zig's build system. A manifest store tracks filesystem metadata (inode, mtime, size) mapped to BLAKE3 content hashes, so &lt;code&gt;sift&lt;/code&gt; knows exactly which files have
changed without re-reading them. A content-addressable blob store holds pre-extracted text, pre-computed BM25 term frequencies, and pre-embedded dense vectors — meaning repeat queries never touch the neural network at all. Identical
files across different projects share a single blob entry. The result: search performance bounded by dot-product speed, not inference latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-query embedding reuse&lt;/strong&gt; across multi-stage pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mapped I/O and tight tokenization hot loops&lt;/strong&gt; to keep latency low on large corpora.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One concrete tradeoff during development: lowering embedding &lt;code&gt;max_length&lt;/code&gt; from 48 to 40 recovered latency budget while keeping quality above the BM25 baseline — a good example of how evidence-driven tuning beats guesswork.&lt;/p&gt;

&lt;p&gt;Full internals are documented in &lt;a href="https://github.com/rupurt/sift/blob/main/ARCHITECTURE.md" rel="noopener noreferrer"&gt;ARCHITECTURE.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evaluation
&lt;/h2&gt;

&lt;p&gt;Comparative strategy run over 5,185 SciFact documents (~7.8 MB) on an AMD Ryzen Threadripper 3960X:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;nDCG@10&lt;/th&gt;
&lt;th&gt;MRR@10&lt;/th&gt;
&lt;th&gt;Recall@10&lt;/th&gt;
&lt;th&gt;p50 (ms)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bm25&lt;/td&gt;
&lt;td&gt;0.7262&lt;/td&gt;
&lt;td&gt;0.7000&lt;/td&gt;
&lt;td&gt;0.8000&lt;/td&gt;
&lt;td&gt;5.41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;legacy-hybrid&lt;/td&gt;
&lt;td&gt;0.7893&lt;/td&gt;
&lt;td&gt;0.7250&lt;/td&gt;
&lt;td&gt;1.0000&lt;/td&gt;
&lt;td&gt;50.29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page-index&lt;/td&gt;
&lt;td&gt;0.7000&lt;/td&gt;
&lt;td&gt;0.6667&lt;/td&gt;
&lt;td&gt;0.8000&lt;/td&gt;
&lt;td&gt;16.79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page-index-hybrid&lt;/td&gt;
&lt;td&gt;0.5701&lt;/td&gt;
&lt;td&gt;0.4367&lt;/td&gt;
&lt;td&gt;1.0000&lt;/td&gt;
&lt;td&gt;41.09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page-index-llm&lt;/td&gt;
&lt;td&gt;0.7893&lt;/td&gt;
&lt;td&gt;0.7250&lt;/td&gt;
&lt;td&gt;1.0000&lt;/td&gt;
&lt;td&gt;41.28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page-index-qwen&lt;/td&gt;
&lt;td&gt;0.7893&lt;/td&gt;
&lt;td&gt;0.7250&lt;/td&gt;
&lt;td&gt;1.0000&lt;/td&gt;
&lt;td&gt;41.18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.8262&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.7667&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.0000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25.94&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few things worth noting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BM25&lt;/strong&gt; at 5.41ms p50 is the right default for latency-constrained cases where keyword recall is sufficient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector&lt;/strong&gt; achieves the best nDCG@10 (0.8262) and perfect recall at 25.94ms — the most balanced strategy for most workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM reranking&lt;/strong&gt; (page-index-llm, page-index-qwen) matches legacy-hybrid quality at comparable speed, validating the local Qwen path as a practical alternative to heavier hybrid pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;page-index-hybrid&lt;/strong&gt; is the only strategy that underperforms BM25 on nDCG — a useful reminder that adding complexity doesn't always improve quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cache hit rates (100/0/100%) confirm the caching layer is working correctly across all strategies. Verbose output (&lt;code&gt;-v&lt;/code&gt;, &lt;code&gt;-vv&lt;/code&gt;) surfaces cache hit rates, phase timings, and ranking metadata directly in the CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for agents
&lt;/h2&gt;

&lt;p&gt;For agents, latency and reliability are requirements, not nice-to-haves. Tooling loops fail hard when search is slow, drops context, or depends on services that may be unavailable.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sift&lt;/code&gt; removes that friction: retrieval is local, deterministic, and cheap to repeat. No daemon to health-check. No embedding service to rate-limit against. No cloud dependency to manage. The binary ships with Homebrew and static Linux&lt;br&gt;
  artifact support, so agents can rely on a pinned version without environment drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it was built
&lt;/h2&gt;

&lt;p&gt;This shipped in a focused, nearly uninterrupted 24-hour push — implementation, eval design, benchmarking, performance tightening, packaging, and release prep in one sustained flow. Every major unit had acceptance criteria and measurable&lt;br&gt;
  evidence attached before it was marked done.&lt;/p&gt;

&lt;p&gt;What made that pace possible is something I'm not ready to talk about in detail yet. But &lt;code&gt;sift&lt;/code&gt; is the first real proof that it works at speed, under real constraints, without cutting corners. More on that soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rupurt/sift/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; — installation and basic usage&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rupurt/sift/blob/main/CONFIGURATION.md" rel="noopener noreferrer"&gt;CONFIGURATION&lt;/a&gt; — strategy and model settings&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rupurt/sift/blob/main/EVALUATION.md" rel="noopener noreferrer"&gt;EVALUATION&lt;/a&gt; — running your own corpus evals&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rupurt/sift/blob/main/ARCHITECTURE.md" rel="noopener noreferrer"&gt;ARCHITECTURE&lt;/a&gt; — internals deep dive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/rupurt/sift" rel="noopener noreferrer"&gt;github.com/rupurt/sift&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>rag</category>
      <category>rust</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
