<?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: Diwakar Arya</title>
    <description>The latest articles on DEV Community by Diwakar Arya (@diwakararya).</description>
    <link>https://dev.to/diwakararya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Diwakar Arya</title>
      <link>https://dev.to/diwakararya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diwakararya"/>
    <language>en</language>
    <item>
      <title>GutTracker: A Food &amp; Symptom Journal That Runs Fully Offline for My Sister</title>
      <dc:creator>Diwakar Arya</dc:creator>
      <pubDate>Mon, 05 Oct 2026 00:41:42 +0000</pubDate>
      <link>https://dev.to/diwakararya/guttracker-a-food-symptom-journal-that-runs-fully-offline-for-my-sister-b98</link>
      <guid>https://dev.to/diwakararya/guttracker-a-food-symptom-journal-that-runs-fully-offline-for-my-sister-b98</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My sister has been having gut problems for the past few weeks. The usual drill: write down what you ate, write down how you felt, try to spot the pattern — and never quite manage to see it, because a notebook can't compute anything.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;GutTracker&lt;/strong&gt;, a food and symptom journal for her. She types a meal the way she'd say it out loud ("two idlis and a bowl of sambar with filter coffee"), logs symptoms in the same casual language ("mild bloating about an hour later"), and gets back a week's view: symptom rate, the symptoms she's reported most, and which foods keep turning up alongside them.&lt;/p&gt;

&lt;p&gt;Two rules shaped every decision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It stays on our machines.&lt;/strong&gt; Food-and-gut logs are exactly the kind of data you don't want on someone else's server, so the model runs locally on llama.cpp and the database is a single SQLite file on disk. There is no cloud AI in the request path, by design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model never gets a vote.&lt;/strong&gt; It parses her sentences into structured data and restates numbers Java has already computed. Every statistic is computed by Java; every sentence it produces is screened by a &lt;code&gt;LanguageGuard&lt;/code&gt; that rejects causal, diagnostic or prescriptive wording outright. GutTracker reports &lt;em&gt;co-occurrence&lt;/em&gt; — "you logged rice in 3 meals; 2 of them came with discomfort" — never &lt;em&gt;cause&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GutTracker is a logging and observation tool, not medical advice, and it says so in the UI.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live: &lt;a href="https://guttracker.onrender.com" rel="noopener noreferrer"&gt;guttracker.onrender.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Heads-up on what you're seeing: the deployed instance has no local model next to it, and the challenge rules say no cloud AI — so Render runs the &lt;strong&gt;deterministic fallback&lt;/strong&gt; path, and the status chip honestly reads &lt;code&gt;offline&lt;/code&gt;. That's the same fallback that runs whenever my sister's laptop can't reach the model, so the demo is the degraded path working, not a broken feature.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Locally it's the full thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./start.sh   &lt;span class="c"&gt;# backend :8081, UI :5173, model on :8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The status chip polls &lt;code&gt;/api/v1/health/ai&lt;/code&gt; every 30s: green means the open-weight model is answering, grey means Java's deterministic tokenizer is.&lt;/p&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/Diwakar38" rel="noopener noreferrer"&gt;
        Diwakar38
      &lt;/a&gt; / &lt;a href="https://github.com/Diwakar38/GutTracker" rel="noopener noreferrer"&gt;
        GutTracker
      &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;GutTracker&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/Diwakar38/GutTracker/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Diwakar38/GutTracker/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Diwakar38/GutTracker/./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;▶ Live demo: &lt;a href="https://guttracker.onrender.com" rel="nofollow noopener noreferrer"&gt;https://guttracker.onrender.com&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Diwakar38/GutTracker" rel="noopener noreferrer"&gt;Code&lt;/a&gt; · &lt;a href="https://github.com/Diwakar38/GutTracker/actions" rel="noopener noreferrer"&gt;CI runs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A privacy-first food and symptom journal that runs entirely on your own machine
with an open-weight model doing the writing and Java doing the maths.&lt;/p&gt;
&lt;p&gt;You type a meal the way you'd say it out loud — &lt;em&gt;"two idlis and a bowl of sambar
with filter coffee"&lt;/em&gt; — and get back structured ingredients. You type how you feel
later — &lt;em&gt;"mild bloating about an hour later"&lt;/em&gt; — and get back correlations over
your own records, phrased in a way that never pretends to be a diagnosis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nothing leaves the laptop.&lt;/strong&gt; No account, no sync, no telemetry, no cloud AI.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This challenge asks why open matters for what you built. For GutTracker it is
not a footnote, it is the whole design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The data is the point.&lt;/strong&gt; A food-and-symptom log is medical-adjacent and
deeply personal. Putting it on a…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Diwakar38/GutTracker" 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;Stack:&lt;/strong&gt; Spring Boot 3.5 + JPA + SQLite (REST only, single-user, zero auth because it's one person's notebook) · React + Vite with three tabs (Log / History / Insights) · &lt;a href="https://github.com/ggml-org/llama.cpp" rel="noopener noreferrer"&gt;llama.cpp&lt;/a&gt; serving &lt;strong&gt;Ternary Bonsai 2 27B&lt;/strong&gt;, an open-weight model, on &lt;code&gt;127.0.0.1:8080&lt;/code&gt; behind an OpenAI-compatible API · Docker → GitHub Actions → Render.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  A[React UI :5173] --&amp;gt;|/api/v1| B[Spring Boot :8081]
  B --&amp;gt; S[(SQLite)]
  B --&amp;gt;|parse / restate| C[llama.cpp :8080
Ternary Bonsai 2 27B]
  C --&amp;gt;|out of reach| D[FallbackTokenizer +
deterministic template]
  B --&amp;gt; E[LanguageGuard
accept or reject, never rewrite]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Where the model is allowed to work&lt;/strong&gt; — three narrow jobs, all of them language, never maths:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Model returns&lt;/th&gt;
&lt;th&gt;Fallback if it can't&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A free-text meal&lt;/td&gt;
&lt;td&gt;JSON: title, ingredients, category, amount&lt;/td&gt;
&lt;td&gt;fixed vocabulary tokenizer (~100 foods, plurals folded)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A free-text symptom&lt;/td&gt;
&lt;td&gt;canonical name + severity&lt;/td&gt;
&lt;td&gt;symptom vocabulary, severity 5 flagged &lt;code&gt;estimated&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java's computed facts&lt;/td&gt;
&lt;td&gt;2–4 neutral sentences restating them&lt;/td&gt;
&lt;td&gt;template built from the same facts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Four bugs worth writing down&lt;/strong&gt;, because they were the actual work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The reasoning model ate its own answer.&lt;/strong&gt; Parsing worked but summaries came back empty. &lt;code&gt;finish_reason: "length"&lt;/code&gt;, &lt;code&gt;content: ""&lt;/code&gt;, and a full &lt;code&gt;reasoning_content&lt;/code&gt; — the model's chain-of-thought was burning the entire &lt;code&gt;max_tokens&lt;/code&gt; budget before the real answer started. It looked exactly like "the AI is broken"; it was configuration. Fixed by sending &lt;code&gt;chat_template_kwargs: {"enable_thinking": false}&lt;/code&gt; per request and raising the budget 512 → 1024.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The guard caught nothing in the present tense.&lt;/strong&gt; My pattern was &lt;code&gt;\bcaus(?:ed|ation|causative)s?\b&lt;/code&gt; — "caused", "causation", caught. "This &lt;strong&gt;causes&lt;/strong&gt; bloating"? Straight through the safety rail, and that's the most likely sentence a model would ever write. The test that caught it (&lt;code&gt;expected hits to contain 'causation'&lt;/code&gt;) is the one I trust most in the repo. Closed the siblings too: triggering, diagnose, treats, recommends, increases. The policy is &lt;em&gt;reject and retry once, then fall back to a template&lt;/em&gt; — the guard never rewrites text, because a rewriting guard is just a model pretending to be a rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. "No problem" was a symptom.&lt;/strong&gt; An entry literally saying &lt;em&gt;"no problem, fine"&lt;/em&gt; was counted as a symptom report, so &lt;code&gt;no problem ×1&lt;/code&gt; appeared in the insights. Real reports like that stay in the history — they're true entries — but are excluded from every statistic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. My denominator was wrong.&lt;/strong&gt; The insights ranked "ingredients to watch" by symptom rate across the whole window, so foods appearing once with a symptom (rate 1.0) crowded out rice (2 of 3, and she'd actually notice that). Fixed twice: denominator is now &lt;em&gt;meals containing that ingredient&lt;/em&gt;, ranked by number of reported problems first, with the associated symptom chips shown inline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt; 17 unit tests (&lt;code&gt;mvn verify&lt;/code&gt;) + a CI job that builds the Docker image, boots it and smoke-tests every endpoint. CI ran green on the first push; Render auto-deploys from &lt;code&gt;main&lt;/code&gt; via the &lt;code&gt;render.yaml&lt;/code&gt; blueprint.&lt;/p&gt;

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

&lt;p&gt;The honest version: &lt;strong&gt;I could not have built this part with a closed API.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The privacy story is real only if it's local.&lt;/strong&gt; A closed API means every meal she types is a request to someone else's servers. This one never leaves the laptop. The health-tech community argues the same point from the other side — &lt;a href="https://dev.to/aiexplore369zoho/open-weight-ai-in-healthcare-hipaa-compliant-llms-for-clinical-notes-day-2030-2pb8"&gt;open-weight AI in healthcare&lt;/a&gt; and &lt;a href="https://dev.to/suvranil_the_creator/privacy-first-offline-capable-trauma-informed-open-source-health-tools-should-be-the-default-2i7e"&gt;privacy-first offline health tools&lt;/a&gt; both make on-prem the default rather than the exception — while a good &lt;a href="https://dev.to/jfisher4002/your-local-llm-is-not-as-private-as-you-think-3ek7"&gt;counterpoint piece&lt;/a&gt; reminds us that "local" isn't a security guarantee by itself. Fair. Here, the useful property is narrower and honest: &lt;strong&gt;the data isn't sent anywhere&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open weights let me change the model's behaviour, not just call it.&lt;/strong&gt; &lt;code&gt;enable_thinking&lt;/code&gt; was a per-request template flag, not a support ticket. The &lt;code&gt;LanguageGuard&lt;/code&gt;, the &lt;code&gt;FallbackTokenizer&lt;/code&gt;, the deterministic summary template — I can read, audit and patch all of them. With a closed API, the two things that made this safe to hand my sister (no causal claims, no silent failure) would be someone else's policy page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The fallback exists because the source exists.&lt;/strong&gt; When the model is unreachable, a ~60-line tokenizer in the repo keeps the app &lt;em&gt;useful&lt;/em&gt;. No API key, no vendor outage, no notebook.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What open innovation made possible that a closed API wouldn't: an app whose worst case is "the AI is off and it still logs my meals", instead of "the API changed its pricing and my sister's food diary stopped working".&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="OpenCode"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building GutTracker: local LLM parsing, a guard that caught nothing, and a reasoning model that ate its own answer&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Build GutTracker: a privacy-first local food + symptom tracker for the Hacktoberfest Weekend Challenge. Java Spring Boot + SQLite backend, React/Vite UI with 3 tabs, local Ternary Bonsai 2 27B on llama.cpp for parsing, deterministic Java for all stats, and a LanguageGuard that rejects causal or diagnostic wording from the model.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Backend written but never compiled. Starting with the build and fixing what falls out.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;mvn -o package -DskipTests&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ mvn -o package -DskipTests&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;~68 compile errors: wrong imports, t.getName() → t.name(), new ObjectNode() → mapper.createObjectNode(), missing JPA annotations on all 5 entities, duplicate element in Set.of(STOPWORDS)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Smoke-test the API.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;curl -X POST /api/v1/meals -d '{"name":"Oatmeal"}'&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ curl -X POST /api/v1/meals -d '{"name":"Oatmeal"}'&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;500 Internal server error&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Not a crash in the parser: MealRequest requires rawText and my curl sent structured fields. The frontend already sends rawText correctly — the bug was in my test. But two genuine bugs fell out of the same pass: unknown routes returned 500 instead of 404, and bean-validation failures returned 500 instead of 400. Added handlers for NoResourceFoundException and MethodArgumentNotValidException.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;AI summary for /insights returns nothing while meal parsing works. Instrumenting the client rather than guessing.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;curl llama.cpp /v1/chat/completions&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ curl llama.cpp /v1/chat/completions&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"length"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning_content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"We need answer user's request..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Root cause: Bonsai is a reasoning model and the chain-of-thought consumed the entire max_tokens budget, so content came back empty. This looked like 'the AI is broken' but was pure config. Fix: chat_template_kwargs {"enable_thinking": false} per request, max_tokens 512 → 1024. Verified the JSON meal-parse path still works with thinking off.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;In Insights, can you add which potential ingredients cause problems?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Four issues behind what looks like one feature request:&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;GET /api/v1/insights&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ GET /api/v1/insights&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;topIngredients denominator was all meals in the window, so idli at 2 of 2 read as 25%&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;1) Denominator changed to meals containing that ingredient. 2) Each row now carries the symptoms reported alongside it with counts. 3) Ranking moved from raw rate to number of reported problems first — rate-only ranking let six 1-of-1 ingredients push out rice at 2 of 3, the most informative row in the data. 4) A test entry literally saying 'no problem' was being counted as a symptom report, so 'no problem ×1' appeared in rice's symptom chips. 'Nothing was wrong' reports stay in the log but are excluded from every statistic.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Writing tests for the guard. One failed, and the failure was the interesting part.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;mvn verify&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ mvn verify&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;LanguageGuardTest.reportsEveryMatchingLabel: expected hits to contain 'causation'&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The guard pattern was \bcaus(?:ed|ation|ative)s?\b — it caught 'caused' and 'causation' but not the present tense 'causes'. The one sentence most likely to appear in a model's output slipped straight through the safety rail. Closed that and the sibling gaps: triggering, diagnose, treats, recommends, increases.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Push to GitHub, set up CI/CD and give me a Render link.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;docker build -t guttracker .&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ docker build -t guttracker .&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;ERROR: release version 21 not supported&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Dockerfile used temurin-17 while the pom targets Java 21. CI had the same mistake waiting. Fixed both.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;docker run + smoke test&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ docker run + smoke test&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;health 200, UI served on the same origin, available:false inside the container&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Deployed via render.yaml blueprint. The container has no llama.cpp and the brief forbids cloud AI, so the hosted demo runs the deterministic fallback — which is exactly the path the fallback tests cover.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;GET /api/v1/health/ai on guttracker.onrender.com&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ GET /api/v1/health/ai on guttracker.onrender.com&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ternary-bonsai-2-27b"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        10 of 10 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The debugging beats, end to end: the reasoning-model token bug, the present-tense guard gap, the "no problem" statistics bug, and the Java 21 mismatch that broke the first Docker build.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Introduction</title>
      <dc:creator>Diwakar Arya</dc:creator>
      <pubDate>Thu, 01 Oct 2026 12:36:14 +0000</pubDate>
      <link>https://dev.to/diwakararya/introduction-15mo</link>
      <guid>https://dev.to/diwakararya/introduction-15mo</guid>
      <description>&lt;p&gt;Hey, this is my first post. &lt;br&gt;
Glad to be part of the community&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
