<?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: Lakshay Deol</title>
    <description>The latest articles on DEV Community by Lakshay Deol (@lakshay_deol_3f21b00bccca).</description>
    <link>https://dev.to/lakshay_deol_3f21b00bccca</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2630047%2F750abbd9-1e90-497c-8278-42466a7e7873.png</url>
      <title>DEV Community: Lakshay Deol</title>
      <link>https://dev.to/lakshay_deol_3f21b00bccca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lakshay_deol_3f21b00bccca"/>
    <language>en</language>
    <item>
      <title>Hammock: The Gentle AI "Sloth" That Triages Your GitHub Issues Overnight (And Never Speaks Without Permission) 🦥💤</title>
      <dc:creator>Lakshay Deol</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:28:57 +0000</pubDate>
      <link>https://dev.to/lakshay_deol_3f21b00bccca/hammock-the-gentle-ai-sloth-that-triages-your-github-issues-overnight-and-never-speaks-without-3f77</link>
      <guid>https://dev.to/lakshay_deol_3f21b00bccca/hammock-the-gentle-ai-sloth-that-triages-your-github-issues-overnight-and-never-speaks-without-3f77</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Every maintainer knows the morning dread. Forty notifications, and before writing a line of code you answer the same four questions in the same order: &lt;em&gt;Is this a duplicate? Is it even a bug? Which version are you on? Can you give me a minimal reproduction?&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Hammock&lt;/strong&gt; is an overnight triage sloth. A durable Temporal workflow fetches new and updated issues idempotently, classifies them with a local Gemma 4 model, recalls duplicate reports with embeddings, asks Gemma to adjudicate whether two issues share the same technical root cause, and drafts the reply that asks for exactly what's missing. Then it stops.&lt;br&gt;
It applies allowlisted, reversible labels on its own. Everything public : comments, closes, locks, assignments  waits in a local queue for one maintainer tap.&lt;br&gt;
&lt;strong&gt;Hammock can propose anything. It can only &lt;em&gt;do&lt;/em&gt; the reversible things alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Labels on an allowlist: &lt;strong&gt;automatic&lt;/strong&gt;.&lt;br&gt;
Comments, closes, locks, and assignments: &lt;strong&gt;your tap&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Who decides&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;bug&lt;/code&gt;, &lt;code&gt;needs-info&lt;/code&gt;, &lt;code&gt;feature&lt;/code&gt;, &lt;code&gt;duplicate&lt;/code&gt;, &lt;code&gt;question&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Automatic&lt;/strong&gt; — additive, allowlisted in &lt;code&gt;.hammock.yml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comments, closes, locks, assignments&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Your tap&lt;/strong&gt; — always, with no config that disables it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The person who gets to be a little lazier is a maintainer at 7am: instead of forty tabs, they get a short queue of drafts to approve, edit, or discard.&lt;br&gt;
The person who gets to be a little lazier is a maintainer at 7am: instead of forty tabs, they get a short queue of drafts to approve, edit, or discard.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;video&lt;/em&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/zc80-qOblSU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;live demo&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://hammock-maintainer-dashboard.onrender.com/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;hammock-maintainer-dashboard.onrender.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;To run on Local Device&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;60-second reviewer path&lt;/strong&gt; — no Ollama, no Temporal, no tokens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Lakshay-Deol/Hammock.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Hammock
pnpm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pnpm build

pnpm hammock eval-dedupe &lt;span class="nt"&gt;--replay&lt;/span&gt;     &lt;span class="c"&gt;# precision / recall vs ground truth&lt;/span&gt;
pnpm hammock test-fixtures &lt;span class="nt"&gt;--replay&lt;/span&gt;   &lt;span class="c"&gt;# 8 fixtures incl. 3 prompt injections&lt;/span&gt;
pnpm hammock dashboard                &lt;span class="c"&gt;# http://localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Lakshay-Deol" rel="noopener noreferrer"&gt;
        Lakshay-Deol
      &lt;/a&gt; / &lt;a href="https://github.com/Lakshay-Deol/Hammock" rel="noopener noreferrer"&gt;
        Hammock
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🦥 Hammock&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hammock triages your GitHub issues overnight on a local Gemma 4 model. It labels, spots duplicates and drafts replies — and touches nothing public without your tap.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Reversible alone. Visible never.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Submission for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge (Week 3: Slow and Steady)&lt;/strong&gt;.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 The Core Thesis&lt;/h2&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hammock can propose anything. It can only &lt;em&gt;do&lt;/em&gt; the reversible things alone.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Labels on an allowlist: &lt;strong&gt;automatic&lt;/strong&gt;
Comments, closes, locks, and assignments: &lt;strong&gt;your tap&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most AI triage bots call hosted models on public webhooks and post directly to repositories without supervision. Hammock runs &lt;strong&gt;100% locally, overnight, durably via Temporal, and strictly refuses to speak in public without maintainer approval&lt;/strong&gt; — proving every action with an immutable &lt;strong&gt;receipt&lt;/strong&gt;.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏗️ Architecture&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;GitHub REST API
      │  since + ETag (conditional, idempotent)
      ▼
Temporal schedule "nightly-triage"
      │
      ▼
workflow: fetch → per-issue activity fan-out → digest
      │
      ├─► Mastra agent ──►&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Lakshay-Deol/Hammock" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 via Ollama&lt;/strong&gt; does three genuinely different jobs, each shaped by a different failure mode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Classification&lt;/strong&gt; returns Zod-validated JSON : &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;severity&lt;/code&gt;, &lt;code&gt;confidence&lt;/code&gt;, &lt;code&gt;missing_info[]&lt;/code&gt;, &lt;code&gt;suggested_labels[]&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt;. The thinking channel (&lt;code&gt;&amp;lt;|channel&amp;gt;thought … &amp;lt;channel|&amp;gt;&lt;/code&gt;) is stripped before parsing, so a rambling model can't corrupt the object. A verdict that fails validation is an error, not a guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate adjudication&lt;/strong&gt; is hybrid by necessity. &lt;code&gt;nomic-embed-text&lt;/code&gt; embeddings plus cosine similarity over SQLite recall the top-3 candidates; Gemma then answers the narrower question : &lt;em&gt;do these share the same technical root cause?&lt;/em&gt;  and must return an evidence string. In the benchmark, a true duplicate sat at 0.979 similarity while a false friend sat at 0.919 and was correctly ruled distinct. The embedding finds candidates; the model decides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drafting&lt;/strong&gt; produces a tone conditioned reply listing exactly the missing information, derived from the verdict rather than the raw issue body.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Temporal&lt;/strong&gt; carries the overnight pass: a deterministic workflow with per-issue activity fan out, defined timeouts, and a registered cron schedule, so a laptop asleep at 2am resumes instead of double labelling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mastra&lt;/strong&gt; defines the triage agent and its four typed tools (&lt;code&gt;classifyIssue&lt;/code&gt;, &lt;code&gt;embedIssue&lt;/code&gt;, &lt;code&gt;findDuplicates&lt;/code&gt;, &lt;code&gt;draftReply&lt;/code&gt;) over the local Ollama model a provider-agnostic contract for the loop, while the deterministic activities call the same primitives directly so workflow replay stays pure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQLite (&lt;code&gt;better-sqlite3&lt;/code&gt;)&lt;/strong&gt; stores issues, verdicts, proposals, embeddings, and append-only receipts in WAL mode. &lt;strong&gt;Hono&lt;/strong&gt; serves the cockpit: an editable draft per pending proposal, a live character-count diff indicator, approve/reject, and the receipt log.&lt;/p&gt;

&lt;p&gt;Two design decisions I'd defend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue text is fenced&lt;/strong&gt; in &lt;code&gt;&amp;lt;untrusted_issue_data&amp;gt;&lt;/code&gt; and the model's only job is to emit JSON, which is validated before anything reads it. Adversarial fixtures come back &lt;code&gt;injection_suspected: true&lt;/code&gt; and produce &lt;em&gt;nothing&lt;/em&gt; no label, no queued draft  so there's nothing for a tired maintainer to approve by accident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rejection calls no GitHub API at all.&lt;/strong&gt; That's the point: rejecting leaves provably zero trace on the repository, while still recording who, when, why, and the text that was never sent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also a &lt;strong&gt;replay adapter&lt;/strong&gt;  a real &lt;code&gt;ModelClient&lt;/code&gt; implementation that swaps the transport and reads recorded verdicts through the same Zod schema. Every code path after the model call is the production path. It exists so a judge with no GPU, no Ollama, and no tokens can still run the whole thing in one minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Because the alternative is shipping your bug reports to someone else's API.&lt;/p&gt;

&lt;p&gt;Private issue trackers contain internal hostnames, database schemas, customer identifiers, and proprietary stack traces. Running Gemma locally via Ollama makes "triage 500 issues overnight" cost $0.00 in tokens and zero bytes of exfiltration. It also means the tool works on a plane, in an air-gapped environment, and after the maintainer stops paying someone's subscription.&lt;/p&gt;

&lt;p&gt;Open weights made the trust model possible, not just the economics. Because I can run the model locally, and read the SDKs it is wrapped in, I can make a real promise about what never leaves the machine — and I can show the receipt for every decision, including the ones that never touched GitHub. A closed API could give me a better classifier; it could not give me that guarantee. And because everything is open, the interesting part — the approval gate, the sandbox assertion, the reversibility split — is auditable by anyone who disagrees with me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Measured on the fixtures in the repo, all reproducible offline:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deduplication precision&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100.0%&lt;/strong&gt; (TP 3, FP 0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deduplication recall&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100.0%&lt;/strong&gt; (TN 5, FN 0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg cosine similarity — true duplicates&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.971&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg cosine similarity — distinct pairs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.236&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt injections neutralized&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 / 3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixture acceptance&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8 / 8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test suite&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;26 / 26&lt;/strong&gt; across 7 files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On a sandbox pass of 8 issues: &lt;strong&gt;6 allowlisted labels applied automatically, 5 drafts queued, 1 duplicate flagged&lt;/strong&gt; — one tap per public action instead of writing each reply from scratch.&lt;/p&gt;

&lt;p&gt;Two footnotes, because benchmarks without them are marketing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The dedupe set is 8 hand-labelled pairs&lt;/strong&gt;, not a scraped corpus. It demonstrates the adjudication logic — a 0.919 similarity correctly ruled distinct — not statistical significance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replay is not a speed benchmark.&lt;/strong&gt; The replay adapter reports a fixed placeholder throughput; real tok/s depends on your hardware. Measure it with &lt;code&gt;pnpm hammock verdict fixtures/issue-001.json&lt;/code&gt; and confirm the client name does not say &lt;code&gt;[replay]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 4 (&lt;code&gt;gemma4:e4b&lt;/code&gt;) does three distinct jobs locally: schema-validated classification, root-cause duplicate adjudication with an evidence string, and tone-conditioned reply drafting. Issue text never leaves the machine, and the pipeline survives a full network disconnect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Temporal&lt;/strong&gt; — the nightly pass is a deterministic workflow with per-issue activity fan-out, defined timeouts, and a registered cron schedule, so interruptions resume rather than duplicate work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Mastra&lt;/strong&gt; — the triage agent and its four typed tools are defined in &lt;code&gt;@mastra/core&lt;/code&gt;, giving the loop a typed, provider-agnostic contract over the local model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Auth0 for AI Agents&lt;/strong&gt; — approval is modelled as asynchronous authorization: a pending proposal carries an authorization request, and the write path is gated on an approval identity recorded on the receipt. The adapter is swappable; the demo runs its local-session fallback.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Apache-2.0 © 2026 Lakshay Deol · Hammock triages while you sleep, and never speaks without your permission.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>temporal</category>
      <category>triage</category>
    </item>
    <item>
      <title>Kintsugi : A Side Hustle Repair Assistant for Technicians Who Can't Afford a Wrong Answer</title>
      <dc:creator>Lakshay Deol</dc:creator>
      <pubDate>Sun, 18 Oct 2026 09:49:38 +0000</pubDate>
      <link>https://dev.to/lakshay_deol_3f21b00bccca/kintsugi-a-side-hustle-repair-assistant-for-technicians-who-cant-afford-a-wrong-answer-g39</link>
      <guid>https://dev.to/lakshay_deol_3f21b00bccca/kintsugi-a-side-hustle-repair-assistant-for-technicians-who-cant-afford-a-wrong-answer-g39</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Kintsugi (金継ぎ)&lt;/em&gt; is a manual-grounded AI appliance repair assistant for technicians, repair shops, and repair-café volunteers. A technician enters a brand and model number, describes the symptom, and Kintsugi answers using only that model’s service manual. Every technical claim carries a [Page X] citation. If the manual is missing, if retrieval scores fall below a calibrated threshold, or if the procedure involves mains voltage, natural gas, or sealed refrigerants, Kintsugi refuses deterministically before calling the LLM.&lt;/p&gt;

&lt;p&gt;The problem it solves is not “technicians lack information.” It is that a generic chatbot is confidently wrong about safety-critical procedures. A fabricated torque spec strips threading. A guessed electrical test creates a shock or fire hazard. A made-up error-code meaning sends the technician to replace a $180 control board that was never faulty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who pays&lt;/strong&gt;: Independent appliance technicians and small repair shops. A single avoided misdiagnosis pays for a month of access. Repair-café volunteers are a secondary, non-paying group who get the offline Ollama path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Video&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/cal-TsySyWk" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Demo site&lt;/em&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://kintsugi-hx3b.onrender.com/ui/index.html" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;kintsugi-hx3b.onrender.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Lakshay-Deol/kintsugi" rel="noopener noreferrer"&gt;https://github.com/Lakshay-Deol/kintsugi&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Reproduce locally&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Lakshay-Deol/kintsugi.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kintsugi
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env   &lt;span class="c"&gt;# insert MONGODB_URI and LLM_API_KEY&lt;/span&gt;
python scripts/gate_phase0.py
python scripts/gate_phase1.py
python scripts/gate_phase2.py
python scripts/gate_phase3.py
python scripts/gate_phase4.py
python &lt;span class="nt"&gt;-m&lt;/span&gt; uvicorn kintsugi.api.app:app &lt;span class="nt"&gt;--host&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 8080

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Kintsugi&lt;/em&gt; is built around three deterministic gates and a hybrid retrieval layer, with open-source and open-weight models doing the synthesis.&lt;/p&gt;

&lt;p&gt;The three gates (all before or after the LLM, never inside it):&lt;br&gt;
 Query (model + symptom)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ Gate 1:&lt;/strong&gt; Hazard filter →  REFUSE: HAZARD_REFERRAL (no DB/LLM) → &lt;br&gt;
          MongoDB Atlas hybrid retrieval&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ Gate 2:&lt;/strong&gt; Retrieval gate → REFUSE: LOW_RELEVANCE / MODEL_NOT_FOUND&lt;br&gt;
          → Gemma synthesis&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ Gate 3:&lt;/strong&gt; Citation verifier → strip ungrounded pages&lt;br&gt;
            → Verified answer with [Page X] &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate 1 and Gate 2 run before the LLM call. Refusals cost zero tokens.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MongoDB Atlas&lt;/strong&gt; — Hybrid search.&lt;code&gt;vector_index&lt;/code&gt;stores 384-dimensional dense vectors on &lt;code&gt;kintsugi.chunks&lt;/code&gt; with pre-filters on brand and model, so a Bosch query cannot retrieve a Whirlpool chunk. &lt;code&gt;bm25_index&lt;/code&gt; is an Atlas Search full-text index tuned for alphanumeric error codes (F5E2, E18) and component IDs that dense embeddings handle poorly. &lt;/p&gt;

&lt;p&gt;The two ranked lists are fused in the application layer with &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reciprocal &lt;br&gt;
Rank Fusion : score = 1/(60 + rank_vector) + 1/(60 + rank_bm25).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Gemma&lt;/strong&gt; — bounded synthesis. The primary reasoning engine is a Gemma model served via Google AI Studio through the google-genai SDK.  Prompts are bounded to retrieved excerpts and require structured output with [Page X] citations. An offline open-weights path (&lt;em&gt;gemma3:12b via Ollama&lt;/em&gt;) is benchmarked for rural repair cafés and air-gapped workshops.&lt;/p&gt;

&lt;p&gt;Embeddings. 384-dimensional embeddings are precomputed offline at ingestion time. The query embedder is a lightweight ONNX path. A warm transformer is not loaded in the Render web service — the free tier cannot afford it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render&lt;/strong&gt;. Declarative &lt;code&gt;render.yaml&lt;/code&gt;, &lt;code&gt;/health&lt;/code&gt; endpoint that checks database connectivity and demo-mode status, and proxy-aware rate limiting (proxy_headers=True, forwarded_allow_ips="*") so limits apply per client IP behind Render’s edge proxy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Because the alternative is a closed chatbot that guesses, and a technician has no way to see that a claim was never grounded.&lt;/p&gt;

&lt;p&gt;Open models and open infrastructure made two things possible that a closed API would not:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An offline path&lt;/strong&gt;. The Ollama gemma3:12b route lets a repair café in a basement with no internet run the same grounding and refusal logic. A closed API cannot be shipped to an air-gapped workshop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A refusal path&lt;/strong&gt; that costs nothing and can be inspected. Because the gates are local code, not a vendor policy, anyone can read them, calibrate the thresholds, and audit the citation verifier. The safety behavior is open source, not a black box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measured cost, per query:&lt;/strong&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff4oapv8impgx6am42i3y.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff4oapv8impgx6am42i3y.png" alt="Price Comparison Table " width="799" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Customer Story
&lt;/h2&gt;

&lt;p&gt;A technician traced an intermittent fault on an OEM diagnostic reader. The fix itself was small; the problem was that the reader needed the vendor's server to confirm it. No internet in the bay, no confirmation, no repair that day.&lt;/p&gt;

&lt;p&gt;He said the thing that stuck: if a tool could do that daily, offline, he'd pay for it not a flat fee, but a share of what it earned him. Two percent of profits, because a flat subscription is a cost whether or not the work comes in, and a percentage only costs him when the tool actually pays.&lt;/p&gt;

&lt;p&gt;That is the constraint Kintsugi is built around. Not "works when the network works" works in a basement repair café with no signal, on a laptop with gemma3:12b running locally. The refusal gates and the citation check run in the same offline path as the cloud path. A tool that only works online fails exactly when a technician is standing in front of an open appliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gemma:&lt;/strong&gt; Gemma is the synthesis engine behind every grounded answer, and the &lt;em&gt;Ollama gemma3:12b&lt;/em&gt; path makes Kintsugi usable offline in repair cafés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MongoDB Atlas:&lt;/strong&gt; Atlas Vector Search and Atlas Search are fused with RRF, so semantic retrieval and error-code keyword matching reinforce each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render:&lt;/strong&gt; &lt;em&gt;Kintsugi&lt;/em&gt; ships as a declarative &lt;code&gt;render.yaml&lt;/code&gt; Blueprint with a /health endpoint and proxy-aware rate limiting on Render’s free tier.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>repair</category>
      <category>electrical</category>
    </item>
  </channel>
</rss>
